[Pkg-cli-libs-commits] [nunit] 01/08: Imported Upstream version 2.6.3+dfsg

Jo Shields directhex at moszumanska.debian.org
Tue Sep 16 15:22:49 UTC 2014


This is an automated email from the git hooks/post-receive script.

directhex pushed a commit to annotated tag debian/2.6.3+dfsg-1
in repository nunit.

commit c7bd1b5f728ad82de89d6b0c105d9d55592c389d
Author: Jo Shields <jo.shields at xamarin.com>
Date:   Tue Sep 16 11:47:12 2014 +0100

    Imported Upstream version 2.6.3+dfsg
---
 NUnitFitTests.html                                 |   554 +-
 NUnitTests.config                                  |    90 +-
 NUnitTests.nunit                                   |    50 +-
 NUnitTests.v1.nunit                                |    20 +-
 NUnitTests.v2.nunit                                |    28 +-
 build                                              |   127 +
 build.bat                                          |   126 +
 doc/actionAttributes.html                          |  1028 +-
 doc/addinsDialog.html                              |   225 +-
 doc/assemblyIsolation.html                         |   231 +-
 doc/assertions.html                                |   219 +-
 doc/attributes.html                                |   234 +-
 doc/category.html                                  |   586 +-
 doc/classicModel.html                              |   105 +
 doc/collectionAssert.html                          |   372 +-
 doc/collectionConstraints.html                     |   166 +-
 doc/combinatorial.html                             |   270 +-
 doc/comparisonAsserts.html                         |   558 +-
 doc/comparisonConstraints.html                     |   506 +-
 doc/compoundConstraints.html                       |   212 +-
 doc/conditionAsserts.html                          |   304 +-
 doc/conditionConstraints.html                      |   446 +-
 doc/configEditor.html                              |   213 +-
 doc/configFiles.html                               |   269 +-
 doc/consoleCommandLine.html                        |   797 +-
 doc/constraintModel.html                           |   354 +-
 doc/contextMenu.html                               |   213 +-
 doc/culture.html                                   |   566 +-
 doc/customConstraints.html                         |   277 +-
 doc/datapoint.html                                 |   304 +-
 doc/datapointProviders.html                        |   253 +-
 doc/delayedConstraint.html                         |   208 +-
 doc/description.html                               |   412 +-
 doc/directoryAssert.html                           |   356 +-
 doc/equalConstraint.html                           |   166 +-
 doc/equalityAsserts.html                           |   390 +-
 doc/eventListeners.html                            |   215 +-
 doc/exception.html                                 |   652 +-
 doc/exceptionAsserts.html                          |   488 +-
 doc/explicit.html                                  |   568 +-
 doc/extensibility.html                             |   161 +-
 doc/extensionTips.html                             |   195 +-
 doc/fileAssert.html                                |   244 +-
 doc/fixtureSetup.html                              |   496 +-
 doc/fixtureTeardown.html                           |   496 +-
 doc/getStarted.html                                |   165 +-
 doc/guiCommandLine.html                            |   393 +-
 doc/identityAsserts.html                           |   214 +-
 doc/ignore.html                                    |   554 +-
 doc/img/nunitTestAdapter.png                       |   Bin 101662 -> 84241 bytes
 doc/index.html                                     |   159 +-
 doc/installation.html                              |   215 +-
 doc/license.html                                   |   197 +-
 doc/listMapper.html                                |   218 +-
 doc/mainMenu.html                                  |   569 +-
 doc/maxtime.html                                   |   258 +-
 doc/multiAssembly.html                             |   277 +-
 doc/nunit-agent.html                               |   201 +-
 doc/nunit-console.html                             |   197 +-
 doc/nunit-gui.html                                 |   161 +-
 doc/nunit.css                                      |   253 +-
 doc/nunitAddins.html                               |   451 +-
 doc/pairwise.html                                  |   238 +-
 doc/parameterizedTests.html                        |   330 +-
 doc/pathConstraints.html                           |   406 +-
 doc/platform.html                                  |   681 +-
 doc/pnunit.html                                    |   207 +-
 doc/projectEditor.html                             |   467 +-
 doc/property.html                                  |   506 +-
 doc/propertyConstraint.html                        |   302 +-
 doc/quickStart.html                                |   648 +-
 doc/quickStartSource.html                          |   176 +
 doc/random.html                                    |   286 +-
 doc/range.html                                     |   308 +-
 doc/releaseBreakdown.html                          |   285 +-
 doc/releaseNotes.html                              |   772 +-
 doc/repeat.html                                    |   236 +-
 doc/requiredAddin.html                             |   316 +-
 doc/requiresMTA.html                               |   314 +-
 doc/requiresSTA.html                               |   316 +-
 doc/requiresThread.html                            |   316 +-
 doc/reusableConstraint.html                        |   342 +-
 doc/runningTests.html                              |   223 +-
 doc/runtimeSelection.html                          |   251 +-
 doc/sameasConstraint.html                          |   220 +-
 doc/samples.html                                   |   261 +-
 doc/sequential.html                                |   274 +-
 doc/setCulture.html                                |   402 +-
 doc/setUICulture.html                              |   402 +-
 doc/settingsDialog.html                            |   783 +-
 doc/setup.html                                     |   499 +-
 doc/setupFixture.html                              |   458 +-
 doc/stringAssert.html                              |   230 +-
 doc/stringConstraints.html                         |   506 +-
 doc/suite.html                                     |   496 +-
 doc/suiteBuilders.html                             |   207 +-
 doc/teardown.html                                  |   499 +-
 doc/test.html                                      |   456 +-
 doc/testCase.html                                  |   208 +-
 doc/testCaseSource.html                            |   229 +-
 doc/testContext.html                               |   130 +-
 doc/testDecorators.html                            |   229 +-
 doc/testFixture.html                               |   878 +-
 doc/testProperties.html                            |   179 +-
 doc/testcaseBuilders.html                          |   229 +-
 doc/testcaseProviders.html                         |   285 +-
 doc/theory.html                                    |   422 +-
 doc/throwsConstraint.html                          |   334 +-
 doc/timeout.html                                   |   266 +-
 doc/typeAsserts.html                               |   278 +-
 doc/typeConstraints.html                           |   224 +-
 doc/upgrade.html                                   |   183 +-
 doc/utilityAsserts.html                            |   270 +-
 doc/valueSource.html                               |   334 +-
 doc/values.html                                    |   282 +-
 doc/vsSupport.html                                 |   295 +-
 doc/vsTestAdapter.html                             |   253 +-
 doc/vsTestAdapterLicense.html                      |   175 +-
 doc/vsTestAdapterReleaseNotes.html                 |   171 +
 doc/writingTests.html                              |   154 +-
 install/NSubstitute.wxs                            |    16 +
 install/NUnit-net-1.1.wxs                          |   162 +
 install/NUnit.wxs                                  |   500 +-
 install/base-net-1.1.wxs                           |    90 +
 install/base.wxs                                   |   123 +
 install/doc.wxs                                    |   374 +-
 install/net45-tests.wxs                            |    17 +
 install/nunit-gui.wxs                              |   458 +-
 install/pnunit.wxs                                 |    47 +
 install/samples.wxs                                |   284 -
 install/tests.wxs                                  |    70 +-
 lib/3.5/NSubstitute.xml                            |   344 +-
 lib/Rhino.Mocks.xml                                | 10826 +++++++++---------
 license.rtf                                        |   Bin 1435 -> 1435 bytes
 license.txt                                        |    30 +-
 nant                                               |     3 +
 nant.bat                                           |     2 +
 nuget/nunit.editor.nuspec                          |    22 +
 nuget/nunit.mocks.nuspec                           |    25 +
 nuget/nunit.nuspec                                 |    24 +
 nuget/nunit.runners.nuspec                         |    56 +
 nuget/pnunit.nuspec                                |    22 +
 nunit.sln                                          |   533 +-
 nunit2012.sln                                      |   289 +
 package                                            |   111 +
 package.bat                                        |   125 +
 samples/Extensibility/Core/CoreExtensibility.sln   |    96 +-
 samples/Extensibility/Core/Minimal/Minimal.build   |    40 +-
 samples/Extensibility/Core/Minimal/Minimal.cs      |    73 +-
 samples/Extensibility/Core/Minimal/Minimal.csproj  |   210 +-
 samples/Extensibility/Core/Minimal/ReadMe.txt      |    54 +-
 .../Core/SampleFixtureExtension/AssemblyInfo.cs    |   116 +-
 .../Core/SampleFixtureExtension/ReadMe.txt         |    86 +-
 .../SampleFixtureExtension.build                   |    34 +-
 .../SampleFixtureExtension.cs                      |    88 +-
 .../SampleFixtureExtension.csproj                  |   243 +-
 .../SampleFixtureExtensionAttribute.cs             |    36 +-
 .../SampleFixtureExtensionBuilder.cs               |   107 +-
 .../SampleFixtureExtension/Tests/AssemblyInfo.cs   |   116 +-
 .../Tests/SampleFixtureExtensionTests.cs           |    96 +-
 .../Tests/SampleFixtureExtensionTests.csproj       |   220 +-
 .../Core/SampleSuiteExtension/Addin.cs             |    60 +-
 .../Core/SampleSuiteExtension/AssemblyInfo.cs      |   116 +-
 .../Core/SampleSuiteExtension/ReadMe.txt           |    86 +-
 .../SampleSuiteExtension.build                     |    34 +-
 .../SampleSuiteExtension/SampleSuiteExtension.cs   |    78 +-
 .../SampleSuiteExtension.csproj                    |   251 +-
 .../SampleSuiteExtensionAttribute.cs               |    36 +-
 .../SampleSuiteExtensionBuilder.cs                 |    82 +-
 .../Tests/SampleSuiteExtensionTests.cs             |    66 +-
 .../Tests/SampleSuiteExtensionTests.csproj         |   220 +-
 samples/ReadMe.txt                                 |   127 +-
 samples/cpp/cpp-cli.sln                            |    41 +
 samples/cpp/cpp-cli/cpp-cli.sln                    |    41 -
 samples/cpp/cpp-cli/failures/AssemblyInfo.cpp      |    56 -
 .../cpp/cpp-cli/failures/cpp-cli-failures.build    |    24 -
 .../cpp/cpp-cli/failures/cpp-cli-failures.vcproj   |   208 -
 samples/cpp/cpp-cli/failures/cppsample.cpp         |    48 -
 samples/cpp/cpp-cli/failures/cppsample.h           |    28 -
 samples/cpp/cpp-cli/syntax/AssemblyInfo.cpp        |    40 -
 samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build    |    11 -
 samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp      |   641 --
 samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj   |   200 -
 samples/cpp/failures/AssemblyInfo.cpp              |    56 +
 samples/cpp/failures/cpp-cli-failures.build        |    24 +
 samples/cpp/failures/cpp-cli-failures.vcxproj      |   109 +
 samples/cpp/failures/cppsample.cpp                 |    48 +
 samples/cpp/failures/cppsample.h                   |    28 +
 samples/cpp/managed/failures/AssemblyInfo.cpp      |    56 -
 .../managed/failures/cpp-managed-failures.build    |    31 -
 .../managed/failures/cpp-managed-failures.vcproj   |   139 -
 samples/cpp/managed/failures/cppsample.cpp         |    48 -
 samples/cpp/managed/failures/cppsample.h           |    28 -
 samples/cpp/managed/managed-cpp.sln                |    21 -
 samples/cpp/syntax/AssemblyInfo.cpp                |    40 +
 samples/cpp/syntax/cpp-cli-syntax.build            |    11 +
 samples/cpp/syntax/cpp-cli-syntax.cpp              |   651 ++
 samples/cpp/syntax/cpp-cli-syntax.vcxproj          |   102 +
 samples/csharp/CSharp.sln                          |    68 +-
 samples/csharp/failures/AssemblyInfo.cs            |   116 +-
 samples/csharp/failures/CSharpTest.cs              |   168 +-
 samples/csharp/failures/cs-failures.build          |    20 +-
 samples/csharp/failures/cs-failures.csproj         |   142 +-
 samples/csharp/money/AssemblyInfo.cs               |   116 +-
 samples/csharp/money/IMoney.cs                     |    73 +-
 samples/csharp/money/Money.cs                      |   206 +-
 samples/csharp/money/MoneyBag.cs                   |   348 +-
 samples/csharp/money/MoneyTest.cs                  |   640 +-
 samples/csharp/money/cs-money.build                |    26 +-
 samples/csharp/money/cs-money.csproj               |   154 +-
 samples/csharp/syntax/AssemblyInfo.cs              |   116 +-
 samples/csharp/syntax/AssertSyntaxTests.cs         |  1656 +--
 samples/csharp/syntax/cs-syntax.build              |    20 +-
 samples/csharp/syntax/cs-syntax.csproj             |   142 +-
 samples/fsharp/FSharp.sln                          |    32 +
 samples/fsharp/failures/SimpleFSharpTest.fs        |    42 +
 samples/fsharp/failures/fs-failures.build          |    10 +
 samples/fsharp/failures/fs-failures.fsproj         |    52 +
 samples/fsharp/money/Money.fs                      |   122 +
 samples/fsharp/money/MoneyBag.fs                   |    12 +
 samples/fsharp/money/MoneyTest.fs                  |   189 +
 samples/fsharp/money/fs-money.build                |    12 +
 samples/fsharp/money/fs-money.fsproj               |    53 +
 samples/fsharp/syntax/AssertSyntaxTests.fs         |   392 +
 samples/fsharp/syntax/fs-syntax.build              |    10 +
 samples/fsharp/syntax/fs-syntax.fsproj             |    52 +
 samples/jsharp/failures/AssemblyInfo.jsl           |    58 -
 samples/jsharp/failures/JSharpTest.jsl             |    65 -
 samples/jsharp/failures/jsharp-failures.build      |    11 -
 samples/jsharp/failures/jsharp-failures.vjsproj    |    21 -
 samples/jsharp/jsharp.sln                          |    21 -
 samples/samples.common                             |   572 +-
 samples/vb/failures/AssemblyInfo.vb                |    64 +-
 samples/vb/failures/SimpleVBTest.vb                |   118 +-
 samples/vb/failures/vb-failures.build              |    20 +-
 samples/vb/failures/vb-failures.vbproj             |   151 +-
 samples/vb/money/AssemblyInfo.vb                   |    64 +-
 samples/vb/money/IMoney.vb                         |    74 +-
 samples/vb/money/Money.vb                          |   218 +-
 samples/vb/money/MoneyBag.vb                       |   328 +-
 samples/vb/money/MoneyTest.vb                      |   432 +-
 samples/vb/money/vb-money.build                    |    26 +-
 samples/vb/money/vb-money.vbproj                   |   165 +-
 samples/vb/syntax/AssemblyInfo.vb                  |    64 +-
 samples/vb/syntax/AssertSyntaxTests.vb             |  1408 ++-
 samples/vb/syntax/vb-syntax.build                  |    20 +-
 samples/vb/syntax/vb-syntax.vbproj                 |   165 +-
 samples/vb/vb-samples.sln                          |    68 +-
 scripts/nunit.build.targets                        |   504 +
 scripts/nunit.common.targets                       |   440 +
 scripts/nunit.package.targets                      |   638 ++
 src/ClientUtilities/tests/AssemblyListTests.cs     |   238 +-
 src/ClientUtilities/tests/AssemblyWatcherTests.cs  |   266 +-
 src/ClientUtilities/tests/CategoryManagerTest.cs   |   160 +-
 src/ClientUtilities/tests/CategoryParseTests.cs    |   288 +-
 src/ClientUtilities/tests/DomainManagerTests.cs    |   192 +-
 src/ClientUtilities/tests/EventDispatcherTests.cs  |   478 +-
 src/ClientUtilities/tests/FileWatcherTests.cs      |   260 +-
 .../tests/MemorySettingsStorageTests.cs            |   208 +-
 src/ClientUtilities/tests/MockAssemblyWatcher.cs   |   138 +-
 src/ClientUtilities/tests/NUnitProjectLoad.cs      |   226 +-
 src/ClientUtilities/tests/NUnitProjectSave.cs      |   170 +-
 src/ClientUtilities/tests/NUnitProjectTests.cs     |   592 +-
 src/ClientUtilities/tests/NUnitProjectXml.cs       |    90 +-
 src/ClientUtilities/tests/NUnitRegistryTests.cs    |   150 +-
 src/ClientUtilities/tests/PathUtilTests.cs         |   524 +-
 src/ClientUtilities/tests/ProcessRunnerTests.cs    |   104 +-
 src/ClientUtilities/tests/ProjectConfigTests.cs    |   786 +-
 src/ClientUtilities/tests/RecentFileEntryTests.cs  |   164 +-
 src/ClientUtilities/tests/RecentFilesTests.cs      |   488 +-
 .../tests/RegistrySettingsStorageTests.cs          |   232 +-
 src/ClientUtilities/tests/RemoteTestResultTest.cs  |   152 +-
 .../tests/RuntimeFrameworkSelectorTests.cs         |   122 +-
 src/ClientUtilities/tests/ServerUtilityTests.cs    |   108 +-
 .../tests/ServiceManagerSetUpFixture.cs            |   124 +-
 src/ClientUtilities/tests/SettingsGroupTests.cs    |   200 +-
 src/ClientUtilities/tests/SummaryResultFixture.cs  |    96 +-
 src/ClientUtilities/tests/TestAgencyTests.cs       |   138 +-
 src/ClientUtilities/tests/TestAgentTests.cs        |    46 +-
 src/ClientUtilities/tests/TestDomainFixture.cs     |   460 +-
 .../tests/TestDomainTests_Multiple.cs              |   214 +-
 src/ClientUtilities/tests/TestEventCatcher.cs      |   160 +-
 .../tests/TestLoaderAssemblyTests.cs               |   384 +-
 .../tests/TestLoaderWatcherTests.cs                |   332 +-
 .../tests/TestRunnerFactoryTests.cs                |   106 +-
 src/ClientUtilities/tests/TestServerTests.cs       |   160 +-
 src/ClientUtilities/tests/VSProjectTests.cs        |   448 +-
 .../tests/VisualStudioConverterTests.cs            |   398 +-
 src/ClientUtilities/tests/XmlResultWriterTest.cs   |   400 +-
 src/ClientUtilities/tests/nunit.util.tests.build   |   178 +-
 src/ClientUtilities/tests/nunit.util.tests.csproj  |   438 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 6355 bytes
 .../nunit.util.tests.csproj.FileListAbsolute.txt   |     5 +
 ...util.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 43818 bytes
 .../tests/obj/Debug/nunit.util.tests.pdb           |   Bin 0 -> 257536 bytes
 .../tests/resources/CPPLibrary.vcproj              |   352 +-
 .../tests/resources/ClassLibrary1.csproj           |   186 +-
 .../tests/resources/DebugOnly.csproj               |   116 +-
 .../tests/resources/DisabledProject.csproj         |   116 +-
 .../tests/resources/DisabledProject.sln            |    50 +-
 .../tests/resources/HebrewFileProblem.csproj       |   250 +-
 .../tests/resources/MakeFileProject.vcproj         |   112 +-
 .../tests/resources/MissingOutputPath.csproj       |   100 +-
 .../tests/resources/MultiplePlatformProject.csproj |   180 +-
 src/ClientUtilities/tests/resources/Solution1.sln  |    58 +-
 .../tests/resources/TestResource.cs                |    34 +-
 .../tests/resources/Unmanaged.vcproj               |   262 +-
 .../tests/resources/WebApplication1.sln            |    54 +-
 .../tests/resources/XNAWindowsProject.csproj       |   160 +-
 .../resources/cpp-default-library_VS2005.vcproj    |   508 +-
 .../tests/resources/cpp-sample.vcproj              |   308 +-
 .../tests/resources/cpp-sample_VS2005.vcproj       |   458 +-
 .../tests/resources/csharp-sample.csproj           |   220 +-
 .../tests/resources/csharp-sample_VS2005.csproj    |   210 +-
 .../csharp-sample_VS2005_noplatform.csproj         |   210 +-
 src/ClientUtilities/tests/resources/jsharp.vjsproj |   202 +-
 .../tests/resources/jsharp_VS2005.vjsproj          |   184 +-
 src/ClientUtilities/tests/resources/samples.sln    |    90 +-
 .../tests/resources/samples_VS2005.sln             |   146 +-
 .../tests/resources/vb-sample.vbproj               |   214 +-
 .../tests/resources/vb-sample_VS2005.vbproj        |   208 +-
 src/ClientUtilities/util/AggregatingTestRunner.cs  |   902 +-
 src/ClientUtilities/util/AssemblyInfo.cs           |    22 +-
 src/ClientUtilities/util/AssemblyList.cs           |   180 +-
 src/ClientUtilities/util/AssemblyWatcher.cs        |   318 +-
 src/ClientUtilities/util/CategoryExpression.cs     |   314 +-
 src/ClientUtilities/util/CategoryManager.cs        |    96 +-
 src/ClientUtilities/util/CommandLineOptions.cs     |   632 +-
 src/ClientUtilities/util/ConsoleWriter.cs          |   146 +-
 .../util/DefaultTestRunnerFactory.cs               |   164 +-
 .../util/Extensibility/IProjectConverter.cs        |    64 +-
 .../Extensibility/ProjectConverterCollection.cs    |   168 +-
 src/ClientUtilities/util/FileWatcher.cs            |   160 +-
 src/ClientUtilities/util/Guard.cs                  |    98 +-
 src/ClientUtilities/util/IAssemblyWatcher.cs       |   124 +-
 .../util/InProcessTestRunnerFactory.cs             |   108 +-
 .../util/Interfaces/IRuntimeFrameworkSelector.cs   |    46 +-
 src/ClientUtilities/util/Interfaces/ISettings.cs   |   236 +-
 src/ClientUtilities/util/Interfaces/ITestEvents.cs |   134 +-
 src/ClientUtilities/util/Interfaces/ITestLoader.cs |   158 +-
 .../util/Interfaces/ITestRunnerFactory.cs          |    66 +-
 src/ClientUtilities/util/MemorySettingsStorage.cs  |   158 +-
 src/ClientUtilities/util/NUnitProject.cs           |  1018 +-
 src/ClientUtilities/util/NUnitRegistry.cs          |   266 +-
 src/ClientUtilities/util/PathUtils.cs              |   530 +-
 src/ClientUtilities/util/ProcessRunner.cs          |   239 +-
 src/ClientUtilities/util/ProjectConfig.cs          |   564 +-
 .../util/ProjectConfigCollection.cs                |   210 +-
 .../ProjectConverters/VisualStudioConverter.cs     |   308 +-
 src/ClientUtilities/util/ProjectFormatException.cs |   116 +-
 src/ClientUtilities/util/RecentFileEntry.cs        |   148 +-
 src/ClientUtilities/util/RecentFiles.cs            |   110 +-
 src/ClientUtilities/util/RecentFilesCollection.cs  |   114 +-
 .../util/RegistrySettingsStorage.cs                |   334 +-
 src/ClientUtilities/util/RemoteTestAgent.cs        |   256 +-
 src/ClientUtilities/util/ResultSummarizer.cs       |   381 +-
 .../util/RuntimeFrameworkSelector.cs               |   161 +-
 src/ClientUtilities/util/ServerBase.cs             |   238 +-
 src/ClientUtilities/util/ServerUtilities.cs        |   258 +-
 src/ClientUtilities/util/Services.cs               |   302 +-
 src/ClientUtilities/util/Services/AddinManager.cs  |   178 +-
 src/ClientUtilities/util/Services/AddinRegistry.cs |   162 +-
 src/ClientUtilities/util/Services/DomainManager.cs |   742 +-
 .../util/Services/ProjectService.cs                |   354 +-
 .../util/Services/RecentFilesService.cs            |   352 +-
 .../util/Services/ServiceManager.cs                |   206 +-
 .../util/Services/SettingsService.cs               |   300 +-
 src/ClientUtilities/util/Services/TestAgency.cs    |   945 +-
 src/ClientUtilities/util/SettingsGroup.cs          |   628 +-
 src/ClientUtilities/util/SettingsStorage.cs        |   124 +-
 src/ClientUtilities/util/StackTraceFilter.cs       |   126 +-
 src/ClientUtilities/util/TestDomain.cs             |   260 +-
 src/ClientUtilities/util/TestEventArgs.cs          |   468 +-
 src/ClientUtilities/util/TestEventDispatcher.cs    |   468 +-
 src/ClientUtilities/util/TestExceptionHandler.cs   |    92 +-
 src/ClientUtilities/util/TestLabelLevel.cs         |    30 +-
 src/ClientUtilities/util/TestLoader.cs             |  1642 +--
 src/ClientUtilities/util/TestObserver.cs           |    40 +-
 src/ClientUtilities/util/TestResultItem.cs         |   156 +-
 src/ClientUtilities/util/TestServer.cs             |    66 +-
 src/ClientUtilities/util/Transform.resx            |   360 +-
 src/ClientUtilities/util/VSProject.cs              |   704 +-
 src/ClientUtilities/util/VSProjectConfig.cs        |    78 +-
 .../util/VSProjectConfigCollection.cs              |    96 +-
 src/ClientUtilities/util/XmlResultTransform.cs     |   138 +-
 src/ClientUtilities/util/XmlResultWriter.cs        |   670 +-
 src/ClientUtilities/util/XmlSettingsStorage.cs     |   196 +-
 src/ClientUtilities/util/nunit.util.build          |   224 +-
 src/ClientUtilities/util/nunit.util.dll.csproj     |   386 +-
 src/CommonAssemblyInfo.cs                          |    68 +-
 src/ConsoleRunner/nunit-console-exe/App.config     |    55 +-
 src/ConsoleRunner/nunit-console-exe/App.v1.config  |   146 +-
 .../nunit-console-exe/AssemblyInfo.cs              |    20 +-
 src/ConsoleRunner/nunit-console-exe/Class1.cs      |    52 +-
 .../nunit-console-exe/nunit-console.exe.build      |   122 +-
 .../nunit-console-exe/nunit-console.exe.csproj     |   246 +-
 src/ConsoleRunner/nunit-console/AssemblyInfo.cs    |    22 +-
 src/ConsoleRunner/nunit-console/ConsoleOptions.cs  |   296 +-
 src/ConsoleRunner/nunit-console/ConsoleUi.cs       |   850 +-
 src/ConsoleRunner/nunit-console/EventCollector.cs  |   442 +-
 src/ConsoleRunner/nunit-console/Runner.cs          |   324 +-
 src/ConsoleRunner/nunit-console/TestNameParser.cs  |   184 +-
 .../nunit-console/nunit-console.build              |    86 +-
 .../nunit-console/nunit-console.csproj             |   258 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5460 bytes
 .../obj/Debug/nunit-console-runner.pdb             |   Bin 0 -> 44544 bytes
 .../nunit-console.csproj.FileListAbsolute.txt      |     5 +
 ...it-console.csprojResolveAssemblyReference.cache |   Bin 0 -> 14288 bytes
 src/ConsoleRunner/tests/CommandLineTests.cs        |   384 +-
 .../tests/CommandLineTests_MultipleAssemblies.cs   |   132 +-
 src/ConsoleRunner/tests/ConsoleRunnerTest.cs       |   477 +-
 src/ConsoleRunner/tests/TestNameParserTests.cs     |    86 +-
 src/ConsoleRunner/tests/nunit-console.tests.build  |    88 +-
 src/ConsoleRunner/tests/nunit-console.tests.csproj |   287 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5662 bytes
 ...nunit-console.tests.csproj.FileListAbsolute.txt |     5 +
 ...sole.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 28921 bytes
 .../tests/obj/Debug/nunit-console.tests.pdb        |   Bin 0 -> 40448 bytes
 src/GuiComponents/UiKit/AddConfigurationDialog.cs  |   460 +-
 .../UiKit/AddConfigurationDialog.resx              |   366 +-
 src/GuiComponents/UiKit/AddTabPageDialog.cs        |   282 +-
 src/GuiComponents/UiKit/AddTabPageDialog.resx      |   330 +-
 src/GuiComponents/UiKit/AppContainer.cs            |   140 +-
 src/GuiComponents/UiKit/AssemblyInfo.cs            |    22 +-
 src/GuiComponents/UiKit/ConfigurationEditor.cs     |   570 +-
 src/GuiComponents/UiKit/ConfigurationEditor.resx   |   428 +-
 src/GuiComponents/UiKit/EditTabPagesDialog.cs      |   450 +-
 src/GuiComponents/UiKit/EditTabPagesDialog.resx    |   366 +-
 src/GuiComponents/UiKit/ErrorDisplay.cs            |   950 +-
 src/GuiComponents/UiKit/ErrorDisplay.resx          |   244 +-
 src/GuiComponents/UiKit/ExpandingLabel.cs          |   418 +-
 src/GuiComponents/UiKit/ExpandingLabel.resx        |   216 +-
 src/GuiComponents/UiKit/ExpandingTextBox.cs        |   678 +-
 src/GuiComponents/UiKit/ExpandingTextBox.resx      |   216 +-
 src/GuiComponents/UiKit/GuiAttachedConsole.cs      |    64 +-
 src/GuiComponents/UiKit/GuiTestEventDispatcher.cs  |   122 +-
 src/GuiComponents/UiKit/IMessageDisplay.cs         |    60 +-
 .../UiKit/LongRunningOperationDisplay.cs           |   232 +-
 .../UiKit/LongRunningOperationDisplay.resx         |   276 +-
 src/GuiComponents/UiKit/MessageDisplay.cs          |   266 +-
 src/GuiComponents/UiKit/NUnitFormBase.cs           |    70 +-
 src/GuiComponents/UiKit/NotRunTree.cs              |   118 +-
 src/GuiComponents/UiKit/NotRunTree.resx            |    84 +-
 src/GuiComponents/UiKit/ProgressBar.cs             |   856 +-
 src/GuiComponents/UiKit/ProgressBar.resx           |    84 +-
 .../UiKit/RenameConfigurationDialog.cs             |   352 +-
 .../UiKit/RenameConfigurationDialog.resx           |   312 +-
 src/GuiComponents/UiKit/ResultTabs.cs              |   963 +-
 src/GuiComponents/UiKit/ResultTabs.resx            |   414 +-
 .../UiKit/ScrollingTextDisplayForm.cs              |   294 +-
 src/GuiComponents/UiKit/SettingsDialogBase.cs      |   410 +-
 src/GuiComponents/UiKit/SettingsDialogBase.resx    |   338 +-
 src/GuiComponents/UiKit/SettingsPage.cs            |   276 +-
 src/GuiComponents/UiKit/SettingsPage.resx          |   258 +-
 src/GuiComponents/UiKit/SimpleSettingsDialog.cs    |   228 +-
 src/GuiComponents/UiKit/SimpleSettingsDialog.resx  |   366 +-
 src/GuiComponents/UiKit/StatusBar.cs               |   522 +-
 src/GuiComponents/UiKit/StatusBar.resx             |   234 +-
 src/GuiComponents/UiKit/TabbedSettingsDialog.cs    |   222 +-
 src/GuiComponents/UiKit/TabbedSettingsDialog.resx  |   330 +-
 .../UiKit/TestPropertiesDialog.Designer.cs         |   756 +-
 src/GuiComponents/UiKit/TestPropertiesDialog.cs    |   664 +-
 src/GuiComponents/UiKit/TestPropertiesDialog.resx  |   412 +-
 src/GuiComponents/UiKit/TestSuiteTreeNode.cs       |   582 +-
 src/GuiComponents/UiKit/TestSuiteTreeView.cs       |  2799 ++---
 src/GuiComponents/UiKit/TestSuiteTreeView.resx     |   394 +-
 src/GuiComponents/UiKit/TestTree.cs                |  1647 +--
 src/GuiComponents/UiKit/TestTree.resx              |   762 +-
 src/GuiComponents/UiKit/TextBoxDisplay.cs          |   394 +-
 src/GuiComponents/UiKit/TextDisplay.cs             |    96 +-
 src/GuiComponents/UiKit/TextDisplayContent.cs      |   242 +-
 src/GuiComponents/UiKit/TextDisplayTabPage.cs      |    94 +-
 src/GuiComponents/UiKit/TextDisplayTabSettings.cs  |   324 +-
 src/GuiComponents/UiKit/TextDisplayWriter.cs       |   166 +-
 src/GuiComponents/UiKit/TextOutputSettingsPage.cs  |   850 +-
 .../UiKit/TextOutputSettingsPage.resx              |   250 +-
 src/GuiComponents/UiKit/TipWindow.cs               |   684 +-
 src/GuiComponents/UiKit/TipWindow.resx             |   258 +-
 src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs |   512 +-
 .../UiKit/TreeBasedSettingsDialog.resx             |   506 +-
 src/GuiComponents/UiKit/VisualState.cs             |   378 +-
 src/GuiComponents/UiKit/WaitCursor.cs              |   104 +-
 src/GuiComponents/UiKit/nunit.uikit.build          |   262 +-
 src/GuiComponents/UiKit/nunit.uikit.dll.csproj     |   770 +-
 .../tests/AddConfigurationDialogTests.cs           |   186 +-
 src/GuiComponents/tests/ErrorDisplayTests.cs       |    86 +-
 .../tests/LongRunningOperationDisplayTests.cs      |    78 +-
 src/GuiComponents/tests/ProgressBarTests.cs        |   130 +-
 src/GuiComponents/tests/StatusBarTests.cs          |   286 +-
 src/GuiComponents/tests/TestSuiteTreeNodeTests.cs  |   318 +-
 .../tests/TestSuiteTreeViewFixture.cs              |   904 +-
 src/GuiComponents/tests/TestTreeTests.cs           |    94 +-
 src/GuiComponents/tests/VisualStateTests.cs        |    88 +-
 src/GuiComponents/tests/nunit.uikit.tests.build    |   100 +-
 src/GuiComponents/tests/nunit.uikit.tests.csproj   |   308 +-
 src/GuiException/UiException/AssemblyInfo.cs       |    22 +-
 .../UiException/CSharpParser/CSCode.cs             |   708 +-
 .../UiException/CSharpParser/CSParser.cs           |   480 +-
 .../UiException/CSharpParser/CSToken.cs            |   260 +-
 .../UiException/CSharpParser/CSTokenCollection.cs  |   438 +-
 .../UiException/CSharpParser/LexToken.cs           |   296 +-
 src/GuiException/UiException/CSharpParser/Lexer.cs |   466 +-
 .../UiException/CSharpParser/TokenClassifier.cs    |   866 +-
 .../UiException/CSharpParser/TokenDictionary.cs    |   572 +-
 .../CodeFormatters/CodeFormatterCollection.cs      |   406 +-
 .../CodeFormatters/GeneralCodeFormatter.cs         |   336 +-
 .../UiException/CodeFormatters/ICodeFormatter.cs   |    66 +-
 .../CodeFormatters/IFormatterCatalog.cs            |    72 +-
 .../CodeFormatters/PlainTextCodeFormatter.cs       |   200 +-
 src/GuiException/UiException/Controls/CodeBox.cs   |   454 +-
 .../UiException/Controls/CodeRenderingContext.cs   |   452 +-
 .../UiException/Controls/DefaultCodeRenderer.cs    |   398 +-
 .../Controls/DefaultErrorListRenderer.cs           |   674 +-
 .../UiException/Controls/ErrorBrowser.cs           |   316 +-
 src/GuiException/UiException/Controls/ErrorList.cs |   526 +-
 .../UiException/Controls/ErrorPanelLayout.cs       |   444 +-
 .../UiException/Controls/ErrorToolbar.cs           |   464 +-
 .../UiException/Controls/ICodeRenderer.cs          |    96 +-
 src/GuiException/UiException/Controls/ICodeView.cs |    84 +-
 .../UiException/Controls/IErrorDisplay.cs          |   102 +-
 .../UiException/Controls/IErrorListRenderer.cs     |   128 +-
 .../UiException/Controls/IStackTraceView.cs        |    98 +-
 .../UiException/Controls/PaintLineLocation.cs      |   234 +-
 .../UiException/Controls/SourceCodeDisplay.cs      |   388 +-
 .../UiException/Controls/SplitterBox.cs            |  1034 +-
 .../UiException/Controls/StackTraceDisplay.cs      |   188 +-
 src/GuiException/UiException/DefaultTextManager.cs |   282 +-
 src/GuiException/UiException/ExceptionItem.cs      |   504 +-
 .../UiException/ExceptionItemCollection.cs         |   216 +-
 src/GuiException/UiException/ITextManager.cs       |    84 +-
 .../UiException/Properties/Resources.Designer.cs   |   224 +-
 .../UiException/Properties/Resources.resx          |   284 +-
 .../StackTraceAnalysers/FunctionParser.cs          |   184 +-
 .../StackTraceAnalysers/IErrorParser.cs            |   130 +-
 .../StackTraceAnalysers/LineNumberParser.cs        |   202 +-
 .../StackTraceAnalysers/PathCompositeParser.cs     |   204 +-
 .../StackTraceAnalysers/UnixPathParser.cs          |   158 +-
 .../StackTraceAnalysers/WindowsPathParser.cs       |   168 +-
 src/GuiException/UiException/StackTraceParser.cs   |   212 +-
 .../UiException/TraceExceptionHelper.cs            |   152 +-
 src/GuiException/UiException/data/Image.png        |   Bin 0 -> 1289 bytes
 src/GuiException/UiException/data/OneLine.txt      |     1 +
 src/GuiException/UiException/data/Resource.cs      |    38 +
 src/GuiException/UiException/data/TextCode.cs      |    59 +
 src/GuiException/UiException/data/test.txt         |     1 +
 .../UiException/nunit.uiexception.build            |   190 +-
 .../UiException/nunit.uiexception.dll.csproj       |   286 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5264 bytes
 ...Unit.UiException.Properties.Resources.resources |   Bin 0 -> 7402 bytes
 ...nit.uiexception.dll.csproj.FileListAbsolute.txt |     7 +
 ...t.uiexception.dll.csproj.GenerateResource.Cache |   Bin 0 -> 1431 bytes
 ...eption.dll.csprojResolveAssemblyReference.cache |   Bin 0 -> 1224 bytes
 .../UiException/obj/Debug/nunit.uiexception.pdb    |   Bin 0 -> 255488 bytes
 src/GuiException/tests/CSharpParser/TestCSCode.cs  |   492 +-
 .../tests/CSharpParser/TestCSParser.cs             |   350 +-
 src/GuiException/tests/CSharpParser/TestLexer.cs   |   786 +-
 src/GuiException/tests/CSharpParser/TestToken.cs   |    96 +-
 .../tests/CSharpParser/TestTokenClassifier.cs      |  1264 +--
 .../tests/CSharpParser/TestTokenDictionary.cs      |   580 +-
 .../CodeFormatters/TestCodeFormatterCollection.cs  |   384 +-
 .../CodeFormatters/TestGeneralCodeFormatter.cs     |   622 +-
 .../CodeFormatters/TestPlainTextCodeFormatter.cs   |   192 +-
 src/GuiException/tests/Controls/TestCodeBox.cs     |  1112 +-
 .../tests/Controls/TestCodeRenderingContext.cs     |   334 +-
 .../tests/Controls/TestDefaultCodeRenderer.cs      |   514 +-
 .../tests/Controls/TestDefaultErrorListRenderer.cs |   446 +-
 .../tests/Controls/TestErrorBrowser.cs             |   380 +-
 src/GuiException/tests/Controls/TestErrorList.cs   |   816 +-
 .../tests/Controls/TestErrorPanelLayout.cs         |   286 +-
 .../tests/Controls/TestErrorToolbar.cs             |   454 +-
 .../tests/Controls/TestSourceCodeDisplay.cs        |   368 +-
 src/GuiException/tests/Controls/TestSplitterBox.cs |   828 +-
 .../tests/Controls/TestStackTraceDisplay.cs        |   230 +-
 .../StackTraceAnalysers/TestFunctionParser.cs      |   160 +-
 .../tests/StackTraceAnalysers/TestIErrorParser.cs  |   220 +-
 .../StackTraceAnalysers/TestLineNumberParser.cs    |   154 +-
 .../tests/StackTraceAnalysers/TestPathParser.cs    |   102 +-
 .../StackTraceAnalysers/TestUnixPathParser.cs      |   188 +-
 .../StackTraceAnalysers/TestWindowsPathParser.cs   |   190 +-
 src/GuiException/tests/TestDefaultTextManager.cs   |   168 +-
 src/GuiException/tests/TestExceptionItem.cs        |   372 +-
 .../tests/TestExceptionItemCollection.cs           |   250 +-
 src/GuiException/tests/TestPaintLineLocation.cs    |   136 +-
 src/GuiException/tests/TestStackTraceParser.cs     |   522 +-
 src/GuiException/tests/data/Basic.cs               |     8 +-
 src/GuiException/tests/data/TestResource.cs        |    28 +-
 src/GuiException/tests/data/TextCode.txt           |   116 +-
 .../tests/nunit.uiexception.tests.build            |   162 +-
 .../tests/nunit.uiexception.tests.csproj           |   266 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 6071 bytes
 ...t.uiexception.tests.csproj.FileListAbsolute.txt |     5 +
 ...tion.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 30461 bytes
 .../tests/obj/Debug/nunit.uiexception.tests.pdb    |   Bin 0 -> 214528 bytes
 src/GuiRunner/nunit-gui-exe/App.config             |    53 +-
 src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs        |     8 +-
 src/GuiRunner/nunit-gui-exe/Class1.cs              |    48 +-
 src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build    |   114 +-
 src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj   |   296 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5455 bytes
 .../nunit-gui.exe.csproj.FileListAbsolute.txt      |     7 +
 ...it-gui.exe.csprojResolveAssemblyReference.cache |   Bin 0 -> 30610 bytes
 src/GuiRunner/nunit-gui-exe/obj/Debug/nunit.pdb    |   Bin 0 -> 13824 bytes
 src/GuiRunner/nunit-gui/AboutBox.cs                |   522 +-
 src/GuiRunner/nunit-gui/AboutBox.resx              |   284 +-
 src/GuiRunner/nunit-gui/AddinDialog.cs             |   452 +-
 src/GuiRunner/nunit-gui/AddinDialog.resx           |   434 +-
 src/GuiRunner/nunit-gui/AppEntry.cs                |   300 +-
 src/GuiRunner/nunit-gui/AssemblyInfo.cs            |    22 +-
 src/GuiRunner/nunit-gui/DetailResults.cs           |   152 +-
 src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs    |   348 +-
 src/GuiRunner/nunit-gui/ExceptionDetailsForm.resx  |   356 +-
 src/GuiRunner/nunit-gui/GuiOptions.cs              |   174 +-
 src/GuiRunner/nunit-gui/NUnitForm.cs               |  3772 +++----
 src/GuiRunner/nunit-gui/NUnitForm.resx             |   302 +-
 src/GuiRunner/nunit-gui/NUnitPresenter.cs          |  1100 +-
 src/GuiRunner/nunit-gui/OptionsDialog.cs           |   102 +-
 src/GuiRunner/nunit-gui/OptionsDialog.resx         |   536 +-
 src/GuiRunner/nunit-gui/RecentFileMenuHandler.cs   |   184 +-
 .../SettingsPages/AdvancedLoaderSettingsPage.cs    |   550 +-
 .../SettingsPages/AdvancedLoaderSettingsPage.resx  |   250 +-
 .../SettingsPages/AssemblyReloadSettingsPage.cs    |   322 +-
 .../SettingsPages/AssemblyReloadSettingsPage.resx  |   250 +-
 .../nunit-gui/SettingsPages/GuiSettingsPage.cs     |   560 +-
 .../nunit-gui/SettingsPages/GuiSettingsPage.resx   |   250 +-
 .../InternalTraceSettingsPage.Designer.cs          |   242 +-
 .../SettingsPages/InternalTraceSettingsPage.cs     |    66 +-
 .../SettingsPages/InternalTraceSettingsPage.resx   |   238 +-
 .../ProjectEditorSettingsPage.Designer.cs          |   252 +-
 .../SettingsPages/ProjectEditorSettingsPage.cs     |   144 +-
 .../SettingsPages/ProjectEditorSettingsPage.resx   |   254 +-
 .../RuntimeSelectionSettingsPage.Designer.cs       |   176 +-
 .../SettingsPages/RuntimeSelectionSettingsPage.cs  |    64 +-
 .../RuntimeSelectionSettingsPage.resx              |   244 +-
 .../SettingsPages/TestLoaderSettingsPage.cs        |   606 +-
 .../SettingsPages/TestLoaderSettingsPage.resx      |   244 +-
 .../SettingsPages/TestResultSettingsPage.cs        |   392 +-
 .../SettingsPages/TestResultSettingsPage.resx      |   244 +-
 .../nunit-gui/SettingsPages/TreeSettingsPage.cs    |   844 +-
 .../nunit-gui/SettingsPages/TreeSettingsPage.resx  |   426 +-
 .../SettingsPages/VisualStudioSettingsPage.cs      |   318 +-
 .../SettingsPages/VisualStudioSettingsPage.resx    |   250 +-
 src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs    |   288 +-
 src/GuiRunner/nunit-gui/nunit-gui.build            |   186 +-
 src/GuiRunner/nunit-gui/nunit-gui.csproj           |   518 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5651 bytes
 .../obj/Debug/NUnit.Gui.AboutBox.resources         |   Bin 0 -> 1644 bytes
 .../obj/Debug/NUnit.Gui.AddinDialog.resources      |   Bin 0 -> 8237 bytes
 .../Debug/NUnit.Gui.ExceptionDetailsForm.resources |   Bin 0 -> 5827 bytes
 .../obj/Debug/NUnit.Gui.NUnitForm.resources        |   Bin 0 -> 1644 bytes
 .../obj/Debug/NUnit.Gui.OptionsDialog.resources    |   Bin 0 -> 10334 bytes
 ...tingsPages.AdvancedLoaderSettingsPage.resources |   Bin 0 -> 496 bytes
 ...tingsPages.AssemblyReloadSettingsPage.resources |   Bin 0 -> 180 bytes
 ...nit.Gui.SettingsPages.GuiSettingsPage.resources |   Bin 0 -> 180 bytes
 ...ttingsPages.InternalTraceSettingsPage.resources |   Bin 0 -> 180 bytes
 ...ttingsPages.ProjectEditorSettingsPage.resources |   Bin 0 -> 648 bytes
 ...ngsPages.RuntimeSelectionSettingsPage.resources |   Bin 0 -> 180 bytes
 ....SettingsPages.TestLoaderSettingsPage.resources |   Bin 0 -> 180 bytes
 ....SettingsPages.TestResultSettingsPage.resources |   Bin 0 -> 180 bytes
 ...it.Gui.SettingsPages.TreeSettingsPage.resources |   Bin 0 -> 5192 bytes
 ...ettingsPages.VisualStudioSettingsPage.resources |   Bin 0 -> 438 bytes
 .../nunit-gui/obj/Debug/nunit-gui-runner.pdb       |   Bin 0 -> 183808 bytes
 .../Debug/nunit-gui.csproj.FileListAbsolute.txt    |    21 +
 .../Debug/nunit-gui.csproj.GenerateResource.Cache  |   Bin 0 -> 1941 bytes
 .../nunit-gui.csprojResolveAssemblyReference.cache |   Bin 0 -> 24936 bytes
 src/GuiRunner/tests/CommandLineTests.cs            |   168 +-
 src/GuiRunner/tests/ExceptionDetailsFormTests.cs   |    98 +-
 src/GuiRunner/tests/RecentFileMenuHandlerTests.cs  |   200 +-
 src/GuiRunner/tests/nunit-gui.tests.build          |    76 +-
 src/GuiRunner/tests/nunit-gui.tests.csproj         |   258 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5517 bytes
 .../nunit-gui.tests.csproj.FileListAbsolute.txt    |     5 +
 ...-gui.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 37830 bytes
 src/GuiRunner/tests/obj/Debug/nunit-gui.tests.pdb  |   Bin 0 -> 26112 bytes
 src/NUnitCore/core/AbstractTestCaseDecoration.cs   |    84 +-
 src/NUnitCore/core/ActionsHelper.cs                |   250 +-
 src/NUnitCore/core/AssemblyHelper.cs               |   168 +-
 src/NUnitCore/core/AssemblyInfo.cs                 |    26 +-
 src/NUnitCore/core/AssemblyReader.cs               |   372 +-
 src/NUnitCore/core/AssemblyResolver.cs             |   250 +-
 src/NUnitCore/core/AsyncInvocationRegion.cs        |   137 +
 src/NUnitCore/core/AsyncSynchronizationContext.cs  |    97 +
 .../core/Builders/CombinatorialStrategy.cs         |   120 +-
 .../core/Builders/CombinatorialTestCaseProvider.cs |   150 +-
 src/NUnitCore/core/Builders/CombiningStrategy.cs   |    98 +-
 src/NUnitCore/core/Builders/DatapointProvider.cs   |   308 +-
 .../core/Builders/InlineDataPointProvider.cs       |    84 +-
 src/NUnitCore/core/Builders/LegacySuiteBuilder.cs  |   242 +-
 .../core/Builders/NUnitTestCaseBuilder.cs          |   851 +-
 .../core/Builders/NUnitTestFixtureBuilder.cs       |   643 +-
 src/NUnitCore/core/Builders/PairwiseStrategy.cs    |  1390 +--
 src/NUnitCore/core/Builders/ProviderCache.cs       |   124 +-
 src/NUnitCore/core/Builders/ProviderInfo.cs        |   201 +-
 src/NUnitCore/core/Builders/SequentialStrategy.cs  |   110 +-
 src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs |   140 +-
 src/NUnitCore/core/Builders/TestAssemblyBuilder.cs |   468 +-
 .../core/Builders/TestCaseParameterProvider.cs     |   330 +-
 .../core/Builders/TestCaseSourceProvider.cs        |   316 +-
 src/NUnitCore/core/Builders/ValueSourceProvider.cs |   216 +-
 src/NUnitCore/core/ContextDictionary.cs            |   179 +-
 src/NUnitCore/core/CoreExtensions.cs               |   524 +-
 src/NUnitCore/core/CultureDetector.cs              |   254 +-
 src/NUnitCore/core/DirectorySwapper.cs             |    88 +-
 src/NUnitCore/core/DomainAgent.cs                  |   324 +-
 src/NUnitCore/core/EventListenerTextWriter.cs      |   228 +-
 src/NUnitCore/core/EventPump.cs                    |   442 +-
 src/NUnitCore/core/EventQueue.cs                   |   700 +-
 src/NUnitCore/core/ExpectedExceptionProcessor.cs   |   558 +-
 .../core/Extensibility/DataPointProviders.cs       |   232 +-
 .../core/Extensibility/EventListenerCollection.cs  |   172 +-
 .../core/Extensibility/FrameworkRegistry.cs        |   146 +-
 .../core/Extensibility/SuiteBuilderCollection.cs   |   136 +-
 .../Extensibility/TestCaseBuilderCollection.cs     |   228 +-
 .../core/Extensibility/TestCaseProviders.cs        |   266 +-
 .../core/Extensibility/TestDecoratorCollection.cs  |    88 +-
 src/NUnitCore/core/ExtensionHost.cs                |   108 +-
 src/NUnitCore/core/ExtensionPoint.cs               |   432 +-
 src/NUnitCore/core/IgnoreDecorator.cs              |    78 +-
 src/NUnitCore/core/InternalTrace.cs                |   258 +-
 src/NUnitCore/core/InternalTraceWriter.cs          |   144 +-
 src/NUnitCore/core/InvalidSuiteException.cs        |    86 +-
 src/NUnitCore/core/InvalidTestFixtureException.cs  |    66 +-
 src/NUnitCore/core/LegacySuite.cs                  |    52 +-
 src/NUnitCore/core/Log4NetCapture.cs               |   484 +-
 src/NUnitCore/core/Logger.cs                       |   186 +-
 src/NUnitCore/core/MethodHelper.cs                 |   382 +-
 src/NUnitCore/core/NUnitAsyncTestMethod.cs         |    30 +
 src/NUnitCore/core/NUnitConfiguration.cs           |   524 +-
 src/NUnitCore/core/NUnitException.cs               |   100 +-
 src/NUnitCore/core/NUnitFramework.cs               |   921 +-
 src/NUnitCore/core/NUnitTestFixture.cs             |   104 +-
 src/NUnitCore/core/NUnitTestMethod.cs              |    78 +-
 src/NUnitCore/core/NamespaceSuite.cs               |    76 +-
 src/NUnitCore/core/NamespaceTreeBuilder.cs         |   338 +-
 src/NUnitCore/core/NoTestFixturesException.cs      |    56 +-
 src/NUnitCore/core/NullListener.cs                 |    82 +-
 src/NUnitCore/core/ParameterizedFixtureSuite.cs    |   110 +-
 src/NUnitCore/core/ParameterizedTestMethodSuite.cs |   268 +-
 src/NUnitCore/core/PlatformHelper.cs               |   540 +-
 src/NUnitCore/core/ProjectRootSuite.cs             |    62 +-
 src/NUnitCore/core/ProxyTestRunner.cs              |   340 +-
 src/NUnitCore/core/QueuingEventListener.cs         |   220 +-
 src/NUnitCore/core/Reflect.cs                      |   894 +-
 src/NUnitCore/core/RemoteTestRunner.cs             |   312 +-
 src/NUnitCore/core/SetUpFixture.cs                 |   116 +-
 src/NUnitCore/core/SimpleTestRunner.cs             |   434 +-
 src/NUnitCore/core/StringTextWriter.cs             |   256 +-
 src/NUnitCore/core/SuiteBuilderAttribute.cs        |    36 +-
 src/NUnitCore/core/Summary.xslt                    |   116 +-
 src/NUnitCore/core/TestAction.cs                   |   190 +-
 src/NUnitCore/core/TestAssembly.cs                 |    74 +-
 src/NUnitCore/core/TestBuilderAttribute.cs         |    52 +-
 src/NUnitCore/core/TestCaseBuilderAttribute.cs     |    36 +-
 src/NUnitCore/core/TestDecoratorAttribute.cs       |    34 +-
 src/NUnitCore/core/TestExecutionContext.cs         |   891 +-
 src/NUnitCore/core/TestFixture.cs                  |    88 +-
 src/NUnitCore/core/TestFixtureBuilder.cs           |   138 +-
 src/NUnitCore/core/TestMethod.cs                   |  1030 +-
 src/NUnitCore/core/TestRunnerThread.cs             |   284 +-
 src/NUnitCore/core/TestSuite.cs                    |  1315 +--
 src/NUnitCore/core/TestSuiteBuilder.cs             |   264 +-
 src/NUnitCore/core/TestThread.cs                   |   404 +-
 src/NUnitCore/core/TextCapture.cs                  |    86 +-
 src/NUnitCore/core/ThreadUtility.cs                |   104 +-
 src/NUnitCore/core/ThreadedTestRunner.cs           |   156 +-
 src/NUnitCore/core/TypeHelper.cs                   |   420 +-
 src/NUnitCore/core/nunit.core.build                |   255 +-
 src/NUnitCore/core/nunit.core.dll.csproj           |   447 +-
 src/NUnitCore/interfaces/AssemblyInfo.cs           |    28 +-
 src/NUnitCore/interfaces/EventListener.cs          |   150 +-
 src/NUnitCore/interfaces/Extensibility/Addin.cs    |   266 +-
 .../interfaces/Extensibility/AddinStatus.cs        |    72 +-
 .../interfaces/Extensibility/ExtensionType.cs      |    70 +-
 src/NUnitCore/interfaces/Extensibility/IAddin.cs   |    58 +-
 .../interfaces/Extensibility/IAddinRegistry.cs     |    86 +-
 .../interfaces/Extensibility/IDataPointProvider.cs |   124 +-
 .../interfaces/Extensibility/IExtensionHost.cs     |    94 +-
 .../interfaces/Extensibility/IExtensionPoint.cs    |   130 +-
 .../interfaces/Extensibility/IFrameworkRegistry.cs |    46 +-
 .../interfaces/Extensibility/ISuiteBuilder.cs      |    74 +-
 .../interfaces/Extensibility/ITestCaseBuilder.cs   |   140 +-
 .../interfaces/Extensibility/ITestCaseProvider.cs  |   120 +-
 .../interfaces/Extensibility/ITestDecorator.cs     |   108 +-
 .../Extensibility/NUnitAddinAttribute.cs           |    80 +-
 .../interfaces/Extensibility/ParameterSet.cs       |   710 +-
 .../interfaces/Extensibility/TestFramework.cs      |    84 +-
 src/NUnitCore/interfaces/Filters/AndFilter.cs      |   202 +-
 src/NUnitCore/interfaces/Filters/CategoryFilter.cs |   204 +-
 src/NUnitCore/interfaces/Filters/NameFilter.cs     |   116 +-
 src/NUnitCore/interfaces/Filters/NotFilter.cs      |   184 +-
 src/NUnitCore/interfaces/Filters/OrFilter.cs       |   196 +-
 .../interfaces/Filters/SimpleNameFilter.cs         |   150 +-
 src/NUnitCore/interfaces/IAgency.cs                |    46 +-
 src/NUnitCore/interfaces/IService.cs               |    50 +-
 src/NUnitCore/interfaces/ITest.cs                  |   194 +-
 src/NUnitCore/interfaces/ITestFilter.cs            |    78 +-
 src/NUnitCore/interfaces/LoggingThreshold.cs       |    64 +-
 src/NUnitCore/interfaces/OSPlatform.cs             |   708 +-
 src/NUnitCore/interfaces/PropertyNames.cs          |   118 +-
 src/NUnitCore/interfaces/ResultState.cs            |   176 +-
 src/NUnitCore/interfaces/RunState.cs               |   106 +-
 src/NUnitCore/interfaces/RuntimeFramework.cs       |  1098 +-
 src/NUnitCore/interfaces/Test.cs                   |   753 +-
 src/NUnitCore/interfaces/TestAgent.cs              |   222 +-
 src/NUnitCore/interfaces/TestAssemblyInfo.cs       |   292 +-
 src/NUnitCore/interfaces/TestFilter.cs             |   204 +-
 src/NUnitCore/interfaces/TestID.cs                 |   288 +-
 src/NUnitCore/interfaces/TestInfo.cs               |   530 +-
 src/NUnitCore/interfaces/TestName.cs               |   408 +-
 src/NUnitCore/interfaces/TestNode.cs               |   176 +-
 src/NUnitCore/interfaces/TestOutput.cs             |   184 +-
 src/NUnitCore/interfaces/TestPackage.cs            |   578 +-
 src/NUnitCore/interfaces/TestResult.cs             |  1018 +-
 src/NUnitCore/interfaces/TestRunner.cs             |   316 +-
 .../interfaces/nunit.core.interfaces.build         |   156 +-
 .../interfaces/nunit.core.interfaces.dll.csproj    |   302 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5114 bytes
 ...core.interfaces.dll.csproj.FileListAbsolute.txt |     6 +
 ...rfaces.dll.csprojResolveAssemblyReference.cache |   Bin 0 -> 994 bytes
 .../interfaces/obj/Debug/nunit.core.interfaces.pdb |   Bin 0 -> 185856 bytes
 .../tests-net45/NUnitAsyncTestMethodTests.cs       |   111 +
 .../tests-net45/NUnitTestCaseBuilderTests.cs       |    93 +
 .../tests-net45/nunit.core.tests.net45.build       |    58 +
 .../tests-net45/nunit.core.tests.net45.csproj      |    84 +
 .../tests/ActionAttributeExceptionTests.cs         |   158 +-
 src/NUnitCore/tests/ActionAttributeTests.cs        |   378 +-
 src/NUnitCore/tests/AllTests.cs                    |    58 +-
 src/NUnitCore/tests/AssemblyHelperTests.cs         |   151 +-
 src/NUnitCore/tests/AssemblyReaderTests.cs         |   154 +-
 src/NUnitCore/tests/AssemblyResolverTests.cs       |   116 +-
 src/NUnitCore/tests/AssemblyTests.cs               |   182 +-
 src/NUnitCore/tests/AssemblyVersionFixture.cs      |   114 +-
 src/NUnitCore/tests/AssertPassFixture.cs           |    92 +-
 src/NUnitCore/tests/AttributeDescriptionFixture.cs |   200 +-
 src/NUnitCore/tests/AttributeInheritance.cs        |   110 +-
 src/NUnitCore/tests/BasicRunnerTests.cs            |   380 +-
 src/NUnitCore/tests/CallContextTests.cs            |   276 +-
 src/NUnitCore/tests/CategoryAttributeTests.cs      |   136 +-
 src/NUnitCore/tests/CombinatorialTests.cs          |   164 +-
 src/NUnitCore/tests/CoreExtensionsTests.cs         |   400 +-
 .../tests/CultureSettingAndDetectionTests.cs       |   326 +-
 src/NUnitCore/tests/DatapointTests.cs              |   160 +-
 src/NUnitCore/tests/DirectoryChangeTests.cs        |    52 +-
 src/NUnitCore/tests/DirectorySwapperTests.cs       |   116 +-
 src/NUnitCore/tests/EventQueueTests.cs             |  1252 +--
 src/NUnitCore/tests/EventTestFixture.cs            |   182 +-
 src/NUnitCore/tests/ExpectExceptionTest.cs         |   904 +-
 src/NUnitCore/tests/FailFixture.cs                 |   156 +-
 src/NUnitCore/tests/FixtureSetUpTearDownTest.cs    |   728 +-
 .../tests/Generic/DeduceTypeArgsFromArgs.cs        |    62 +-
 .../tests/Generic/SimpleGenericFixture.cs          |    64 +-
 .../tests/Generic/SimpleGenericMethods.cs          |   100 +-
 .../Generic/TypeParameterUsedWithTestMethod.cs     |    48 +-
 src/NUnitCore/tests/IgnoreFixture.cs               |   266 +-
 src/NUnitCore/tests/LegacySuiteTests.cs            |   284 +-
 src/NUnitCore/tests/MaxTimeTests.cs                |   140 +-
 src/NUnitCore/tests/NUnitTestCaseBuilderTests.cs   |    67 +
 src/NUnitCore/tests/NameFilterTest.cs              |   240 +-
 src/NUnitCore/tests/NamespaceAssemblyTests.cs      |   166 +-
 src/NUnitCore/tests/PairwiseTests.cs               |   244 +-
 .../tests/ParameterizedTestFixtureTests.cs         |   420 +-
 src/NUnitCore/tests/PlatformDetectionTests.cs      |   755 +-
 src/NUnitCore/tests/PropertyAttributeTests.cs      |   106 +-
 src/NUnitCore/tests/ReflectTests.cs                |   354 +-
 src/NUnitCore/tests/RemoteRunnerTests.cs           |    52 +-
 src/NUnitCore/tests/RepeatedTestFixture.cs         |   202 +-
 src/NUnitCore/tests/Results.xsd                    |   214 +-
 src/NUnitCore/tests/RuntimeFrameworkTests.cs       |   587 +-
 src/NUnitCore/tests/SerializationBug.cs            |   146 +-
 src/NUnitCore/tests/SetCultureAttributeTests.cs    |   206 +-
 src/NUnitCore/tests/SetUpFixtureTests.cs           |   360 +-
 src/NUnitCore/tests/SetUpTest.cs                   |   294 +-
 src/NUnitCore/tests/SimpleNameFilterTests.cs       |   242 +-
 src/NUnitCore/tests/SimpleTestRunnerTests.cs       |    72 +-
 src/NUnitCore/tests/StackOverflowTestFixture.cs    |    62 +-
 src/NUnitCore/tests/SuiteBuilderTests.cs           |   272 +-
 src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs  |   126 +-
 src/NUnitCore/tests/TestAssemblyBuilderTests.cs    |    92 +-
 src/NUnitCore/tests/TestCaseAttributeTests.cs      |   642 +-
 src/NUnitCore/tests/TestCaseResultFixture.cs       |   122 +-
 src/NUnitCore/tests/TestCaseSourceTests.cs         |   742 +-
 src/NUnitCore/tests/TestCaseTest.cs                |   114 +-
 src/NUnitCore/tests/TestConsole.cs                 |   138 +-
 src/NUnitCore/tests/TestContextTests.cs            |   358 +-
 src/NUnitCore/tests/TestDelegateFixture.cs         |    98 +-
 src/NUnitCore/tests/TestExecutionContextTests.cs   |   388 +-
 src/NUnitCore/tests/TestFixtureBuilderTests.cs     |    76 +-
 src/NUnitCore/tests/TestFixtureExtension.cs        |   148 +-
 src/NUnitCore/tests/TestFixtureTests.cs            |   810 +-
 src/NUnitCore/tests/TestFrameworkTests.cs          |    58 +-
 src/NUnitCore/tests/TestIDTests.cs                 |    90 +-
 src/NUnitCore/tests/TestInfoTests.cs               |   149 +-
 src/NUnitCore/tests/TestMethodSignatureTests.cs    |   424 +-
 src/NUnitCore/tests/TestNameTests.cs               |   280 +-
 src/NUnitCore/tests/TestNodeTests.cs               |   172 +-
 src/NUnitCore/tests/TestRunnerThreadTests.cs       |   130 +-
 src/NUnitCore/tests/TestSuiteTest.cs               |   670 +-
 src/NUnitCore/tests/TheoryTests.cs                 |   268 +-
 src/NUnitCore/tests/ThreadedTestRunnerTests.cs     |    50 +-
 src/NUnitCore/tests/ThreadingTests.cs              |   328 +-
 src/NUnitCore/tests/TypeHelperTests.cs             |    90 +-
 src/NUnitCore/tests/UnhandledExceptionTests.cs     |   152 +-
 src/NUnitCore/tests/ValueSourceTests.cs            |   322 +-
 src/NUnitCore/tests/XmlTest.cs                     |   400 +-
 src/NUnitCore/tests/nunit.core.tests.build         |   257 +-
 src/NUnitCore/tests/nunit.core.tests.csproj        |   497 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 6248 bytes
 .../nunit.core.tests.csproj.FileListAbsolute.txt   |     5 +
 ...core.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 34867 bytes
 src/NUnitCore/tests/obj/Debug/nunit.core.tests.pdb |   Bin 0 -> 554496 bytes
 src/NUnitFramework/framework/ActionTargets.cs      |    68 +-
 src/NUnitFramework/framework/AssemblyInfo.cs       |    32 +-
 src/NUnitFramework/framework/Assert.cs             |  7464 ++++++-------
 src/NUnitFramework/framework/AssertionHelper.cs    |   553 +-
 src/NUnitFramework/framework/Assume.cs             |   616 +-
 .../framework/AsyncInvocationRegion.cs             |   137 +
 .../framework/AsyncSynchronizationContext.cs       |    97 +
 .../framework/Attributes/CategoryAttribute.cs      |   114 +-
 .../framework/Attributes/DatapointAttributes.cs    |    58 +-
 .../framework/Attributes/DescriptionAttribute.cs   |    74 +-
 .../Attributes/ExpectedExceptionAttribute.cs       |   246 +-
 .../framework/Attributes/ExplicitAttribute.cs      |    94 +-
 .../framework/Attributes/IgnoreAttribute.cs        |    94 +-
 .../Attributes/IncludeExcludeAttributes.cs         |   212 +-
 .../framework/Attributes/JoinTypeAttributes.cs     |   116 +-
 .../framework/Attributes/MaxTimeAttribute.cs       |    46 +-
 .../framework/Attributes/PropertyAttribute.cs      |   162 +-
 .../framework/Attributes/RandomAttribute.cs        |   204 +-
 .../framework/Attributes/RangeAttribute.cs         |   174 +-
 .../framework/Attributes/RepeatAttribute.cs        |    86 +-
 .../framework/Attributes/RequiredAddinAttribute.cs |    80 +-
 .../framework/Attributes/SetCultureAttribute.cs    |    46 +-
 .../framework/Attributes/SetUICultureAttribute.cs  |    46 +-
 .../framework/Attributes/SetUpAttribute.cs         |    39 +-
 .../framework/Attributes/SetUpFixtureAttribute.cs  |    38 +-
 .../framework/Attributes/SuiteAttribute.cs         |    36 +-
 .../framework/Attributes/TearDownAttribute.cs      |    40 +-
 .../framework/Attributes/TestActionAttribute.cs    |    56 +-
 .../framework/Attributes/TestAttribute.cs          |    92 +-
 .../framework/Attributes/TestCaseAttribute.cs      |   532 +-
 .../Attributes/TestCaseSourceAttribute.cs          |   149 +-
 .../framework/Attributes/TestFixtureAttribute.cs   |   296 +-
 .../Attributes/TestFixtureSetUpAttribute.cs        |    38 +-
 .../Attributes/TestFixtureTearDownAttribute.cs     |    42 +-
 .../framework/Attributes/TheoryAttribute.cs        |    92 +-
 .../framework/Attributes/ThreadingAttributes.cs    |   176 +-
 .../framework/Attributes/ValueSourceAttribute.cs   |   118 +-
 .../framework/Attributes/ValuesAttribute.cs        |   260 +-
 src/NUnitFramework/framework/CollectionAssert.cs   |  1316 +--
 .../framework/Constraints/AllItemsConstraint.cs    |    58 +
 .../framework/Constraints/AndConstraint.cs         |    83 +
 .../Constraints/AssignableFromConstraint.cs        |    44 +
 .../Constraints/AssignableToConstraint.cs          |    44 +
 .../framework/Constraints/AttributeConstraint.cs   |    89 +
 .../framework/Constraints/AttributeConstraints.cs  |   138 -
 .../Constraints/AttributeExistsConstraint.cs       |    59 +
 .../framework/Constraints/BasicConstraint.cs       |    56 +
 .../framework/Constraints/BasicConstraints.cs      |   118 -
 .../framework/Constraints/BinaryConstraint.cs      |    36 +
 .../framework/Constraints/BinaryOperations.cs      |   148 -
 .../Constraints/BinarySerializableConstraint.cs    |    81 +
 .../framework/Constraints/CollectionConstraint.cs  |    72 +
 .../framework/Constraints/CollectionConstraints.cs |   547 -
 .../Constraints/CollectionContainsConstraint.cs    |    54 +
 .../Constraints/CollectionEquivalentConstraint.cs  |    56 +
 .../Constraints/CollectionItemsEqualConstraint.cs  |   131 +
 .../Constraints/CollectionOrderedConstraint.cs     |   168 +
 .../Constraints/CollectionSubsetConstraint.cs      |    50 +
 .../framework/Constraints/CollectionTally.cs       |   157 +-
 .../framework/Constraints/ComparisonAdapter.cs     |   311 +-
 .../framework/Constraints/ComparisonConstraint.cs  |    66 +
 .../framework/Constraints/ComparisonConstraints.cs |    66 -
 .../framework/Constraints/Constraint.cs            |   771 +-
 .../framework/Constraints/ConstraintBuilder.cs     |   538 +-
 .../framework/Constraints/ConstraintExpression.cs  |  1610 ++-
 .../Constraints/ConstraintExpressionBase.cs        |   196 +-
 .../framework/Constraints/ConstraintFactory.cs     |  1607 ++-
 .../framework/Constraints/ConstraintOperators.cs   |   508 -
 .../framework/Constraints/ContainsConstraint.cs    |   324 +-
 .../framework/Constraints/DelayedConstraint.cs     |   397 +-
 .../framework/Constraints/DirectoryConstraints.cs  |    68 -
 .../Constraints/EmptyCollectionConstraint.cs       |    35 +
 .../framework/Constraints/EmptyConstraint.cs       |   111 +-
 .../Constraints/EmptyDirectoryConstraint.cs        |    68 +
 .../framework/Constraints/EmptyStringConstraint.cs |    35 +
 .../framework/Constraints/EndsWithConstraint.cs    |    48 +
 .../framework/Constraints/EqualConstraint.cs       |  1113 +-
 .../framework/Constraints/EqualityAdapter.cs       |   456 +-
 .../framework/Constraints/ExactCountConstraint.cs  |    76 +
 .../framework/Constraints/ExactTypeConstraint.cs   |    47 +
 .../Constraints/ExceptionTypeConstraint.cs         |    41 +
 .../framework/Constraints/FailurePoint.cs          |    48 +
 .../framework/Constraints/FalseConstraint.cs       |    19 +
 .../framework/Constraints/FloatingPointNumerics.cs |   476 +-
 .../framework/Constraints/GreaterThanConstraint.cs |   110 +-
 .../Constraints/GreaterThanOrEqualConstraint.cs    |   110 +-
 .../framework/Constraints/IResolveConstraint.cs    |    42 +-
 .../Constraints/InstanceOfTypeConstraint.cs        |    48 +
 .../framework/Constraints/LessThanConstraint.cs    |   110 +-
 .../Constraints/LessThanOrEqualConstraint.cs       |   110 +-
 .../framework/Constraints/MessageWriter.cs         |   274 +-
 .../framework/Constraints/MsgUtils.cs              |   532 +-
 .../framework/Constraints/NUnitComparer.cs         |   195 +-
 .../framework/Constraints/NUnitEqualityComparer.cs |   891 +-
 .../framework/Constraints/NaNConstraint.cs         |    36 +
 .../framework/Constraints/NoItemConstraint.cs      |    58 +
 .../framework/Constraints/NotConstraint.cs         |    51 +
 .../framework/Constraints/NullConstraint.cs        |    19 +
 .../Constraints/NullOrEmptyStringConstraint.cs     |    55 +
 .../framework/Constraints/Numerics.cs              |   726 +-
 .../framework/Constraints/Operators/AllOperator.cs |    25 +
 .../framework/Constraints/Operators/AndOperator.cs |    30 +
 .../Constraints/Operators/AttributeOperator.cs     |    45 +
 .../Constraints/Operators/BinaryOperator.cs        |    59 +
 .../Constraints/Operators/CollectionOperator.cs    |    26 +
 .../Constraints/Operators/ConstraintOperator.cs    |    79 +
 .../Constraints/Operators/ExactCountOperator.cs    |    36 +
 .../Constraints/Operators/NoneOperator.cs          |    25 +
 .../framework/Constraints/Operators/NotOperator.cs |    32 +
 .../framework/Constraints/Operators/OrOperator.cs  |    30 +
 .../Constraints/Operators/PrefixOperator.cs        |    34 +
 .../Constraints/Operators/PropOperator.cs          |    52 +
 .../Constraints/Operators/SelfResolvingOperator.cs |    16 +
 .../Constraints/Operators/SomeOperator.cs          |    25 +
 .../Constraints/Operators/ThrowsOperator.cs        |    40 +
 .../Constraints/Operators/WithOperator.cs          |    34 +
 .../framework/Constraints/OrConstraint.cs          |    44 +
 .../framework/Constraints/PathConstraint.cs        |   163 +
 .../framework/Constraints/PathConstraints.cs       |   321 -
 .../framework/Constraints/PredicateConstraint.cs   |   110 +-
 .../framework/Constraints/PrefixConstraint.cs      |    29 +
 .../framework/Constraints/PrefixConstraints.cs     |   293 -
 .../framework/Constraints/PropertyConstraint.cs    |   260 +-
 .../Constraints/PropertyExistsConstraint.cs        |    85 +
 .../framework/Constraints/RangeConstraint.cs       |   215 +-
 .../framework/Constraints/RegexConstraint.cs       |    50 +
 .../Constraints/ResolvableConstraintExpression.cs  |   200 +-
 .../framework/Constraints/ReusableConstraint.cs    |   122 +-
 .../framework/Constraints/SameAsConstraint.cs      |   110 +-
 .../framework/Constraints/SamePathConstraint.cs    |    41 +
 .../Constraints/SamePathOrUnderConstraint.cs       |    43 +
 .../Constraints/SerializableConstraints.cs         |   170 -
 .../framework/Constraints/SomeItemsConstraint.cs   |    58 +
 .../framework/Constraints/StartsWithConstraint.cs  |    48 +
 .../framework/Constraints/StringConstraint.cs      |    64 +
 .../framework/Constraints/StringConstraints.cs     |   310 -
 .../framework/Constraints/SubPathConstraint.cs     |    43 +
 .../framework/Constraints/SubstringConstraint.cs   |    46 +
 .../framework/Constraints/ThrowsConstraint.cs      |   443 +-
 .../Constraints/ThrowsNothingConstraint.cs         |    64 +
 .../framework/Constraints/Tolerance.cs             |   439 +-
 .../framework/Constraints/ToleranceMode.cs         |    37 +
 .../framework/Constraints/TrueConstraint.cs        |    19 +
 .../framework/Constraints/TypeConstraint.cs        |    42 +
 .../framework/Constraints/TypeConstraints.cs       |   214 -
 .../framework/Constraints/UniqueItemsConstraint.cs |    46 +
 .../Constraints/XmlSerializableConstraint.cs       |    86 +
 src/NUnitFramework/framework/Contains.cs           |    83 +-
 src/NUnitFramework/framework/DirectoryAssert.cs    |  1104 +-
 .../framework/Exceptions/AssertionException.cs     |    78 +-
 .../framework/Exceptions/IgnoreException.cs        |    75 +-
 .../framework/Exceptions/InconclusiveException.cs  |    83 +-
 .../framework/Exceptions/SuccessException.cs       |    80 +-
 src/NUnitFramework/framework/FileAssert.cs         |   666 +-
 src/NUnitFramework/framework/GlobalSettings.cs     |    44 +-
 src/NUnitFramework/framework/Guard.cs              |    35 +
 src/NUnitFramework/framework/Has.cs                |   384 +-
 src/NUnitFramework/framework/IExpectException.cs   |    50 +-
 src/NUnitFramework/framework/ITestCaseData.cs      |   160 +-
 .../framework/Interfaces/INUnitEqualityComparer.cs |    86 +-
 .../framework/Interfaces/ITestAction.cs            |    76 +-
 src/NUnitFramework/framework/Is.cs                 |  1073 +-
 src/NUnitFramework/framework/Iz.cs                 |    34 +-
 src/NUnitFramework/framework/List.cs               |    60 +-
 src/NUnitFramework/framework/ListMapper.cs         |   104 +-
 src/NUnitFramework/framework/Randomizer.cs         |   234 +-
 src/NUnitFramework/framework/SpecialValue.cs       |    46 +-
 src/NUnitFramework/framework/StringAssert.cs       |   814 +-
 src/NUnitFramework/framework/TestCaseData.cs       |   800 +-
 src/NUnitFramework/framework/TestContext.cs        |   484 +-
 src/NUnitFramework/framework/TestDetails.cs        |   130 +-
 src/NUnitFramework/framework/TestState.cs          |   110 +-
 src/NUnitFramework/framework/TestStatus.cs         |    68 +-
 src/NUnitFramework/framework/Text.cs               |   292 +-
 src/NUnitFramework/framework/TextMessageWriter.cs  |   944 +-
 src/NUnitFramework/framework/Throws.cs             |   272 +-
 src/NUnitFramework/framework/nunit.framework.build |   266 +-
 .../framework/nunit.framework.dll.csproj           |   476 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5122 bytes
 ...nunit.framework.dll.csproj.FileListAbsolute.txt |     5 +
 .../framework/obj/Debug/nunit.framework.pdb        |   Bin 0 -> 710144 bytes
 .../tests-net45/AfterDelayedTests.cs               |    87 +
 .../tests-net45/AssertAssumeThatTests.cs           |    97 +
 src/NUnitFramework/tests-net45/ThrowsTests.cs      |   163 +
 .../tests-net45/nunit.framework.tests.net45.build  |    55 +
 .../tests-net45/nunit.framework.tests.net45.csproj |    69 +
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 6105 bytes
 ...tedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs |     0
 ...tedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs |     0
 ...tedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs |     0
 ...amework.tests.net45.csproj.FileListAbsolute.txt |     5 +
 ...ests.net45.csprojResolveAssemblyReference.cache |   Bin 0 -> 5568 bytes
 .../obj/Debug/nunit.framework.tests.net45.pdb      |   Bin 0 -> 83456 bytes
 .../tests/ArrayEqualsFailureMessageFixture.cs      |   480 +-
 src/NUnitFramework/tests/ArrayEqualsFixture.cs     |   404 +-
 src/NUnitFramework/tests/ArrayNotEqualFixture.cs   |   102 +-
 src/NUnitFramework/tests/AssertThrowsTests.cs      |   382 +-
 src/NUnitFramework/tests/AssumeThatTests.cs        |   353 +-
 src/NUnitFramework/tests/CollectionAdapter.cs      |   126 +-
 src/NUnitFramework/tests/CollectionAssertTest.cs   |  1524 +--
 src/NUnitFramework/tests/ConditionAssertTests.cs   |   410 +-
 .../tests/Constraints/AfterConstraintTests.cs      |   167 -
 src/NUnitFramework/tests/Constraints/AndTest.cs    |    32 -
 .../tests/Constraints/BasicConstraintTests.cs      |   174 +-
 .../tests/Constraints/CollectionConstraintTests.cs |   711 --
 .../tests/Constraints/ComparerTests.cs             |    73 -
 .../tests/Constraints/ComparisonConstraintTests.cs |   387 -
 .../tests/Constraints/ConstraintTestBase.cs        |   168 +-
 .../tests/Constraints/EmptyConstraintTest.cs       |   166 +-
 .../tests/Constraints/EqualConstraintTests.cs      |   976 +-
 src/NUnitFramework/tests/Constraints/EqualTest.cs  |   254 +-
 .../tests/Constraints/FloatingPointNumericsTest.cs |   214 +-
 .../tests/Constraints/MsgUtilTests.cs              |   226 +-
 .../Constraints/NUnitEqualityComparerTests.cs      |    75 +-
 src/NUnitFramework/tests/Constraints/NotTest.cs    |    52 -
 .../tests/Constraints/NumericsTest.cs              |   188 +-
 src/NUnitFramework/tests/Constraints/OrTest.cs     |    32 -
 .../tests/Constraints/PathConstraintTests.cs       |   570 +-
 .../tests/Constraints/PredicateConstraintTests.cs  |    39 +
 .../tests/Constraints/PropertyTests.cs             |   140 +-
 .../tests/Constraints/ReusableConstraintTests.cs   |    90 +-
 src/NUnitFramework/tests/Constraints/SameAsTest.cs |    56 +-
 .../Constraints/SerializableConstraintTest.cs      |    66 -
 .../tests/Constraints/StringConstraintTests.cs     |   142 -
 .../tests/Constraints/ThrowsConstraintTests.cs     |   218 +-
 .../tests/Constraints/ToStringTests.cs             |   138 +-
 .../tests/Constraints/TypeConstraintTests.cs       |   142 -
 src/NUnitFramework/tests/DirectoryAssertTests.cs   |   898 +-
 src/NUnitFramework/tests/EqualsFixture.cs          |  1154 +-
 src/NUnitFramework/tests/FileAssertTests.cs        |   882 +-
 src/NUnitFramework/tests/GreaterEqualFixture.cs    |   340 +-
 src/NUnitFramework/tests/GreaterFixture.cs         |   270 +-
 src/NUnitFramework/tests/LessEqualFixture.cs       |   328 +-
 src/NUnitFramework/tests/LessFixture.cs            |   312 +-
 src/NUnitFramework/tests/ListContentsTests.cs      |   164 +-
 src/NUnitFramework/tests/MessageChecker.cs         |   100 +-
 src/NUnitFramework/tests/NotEqualFixture.cs        |   232 +-
 src/NUnitFramework/tests/NotSameFixture.cs         |    64 +-
 src/NUnitFramework/tests/NullableTypesTests.cs     |   506 +-
 src/NUnitFramework/tests/RandomizerTests.cs        |   218 +-
 src/NUnitFramework/tests/RangeTests.cs             |   132 +-
 src/NUnitFramework/tests/SameFixture.cs            |    88 +-
 src/NUnitFramework/tests/StringAssertTests.cs      |   278 +-
 src/NUnitFramework/tests/Syntax/AfterTests.cs      |   360 +-
 .../tests/Syntax/ArbitraryConstraintMatching.cs    |   162 +-
 src/NUnitFramework/tests/Syntax/CollectionTests.cs |   518 +-
 src/NUnitFramework/tests/Syntax/ComparisonTests.cs |   164 +-
 src/NUnitFramework/tests/Syntax/EqualityTests.cs   |   282 +-
 .../tests/Syntax/InvalidCodeTests.cs               |   154 +-
 .../tests/Syntax/OperatorOverrides.cs              |   178 +-
 src/NUnitFramework/tests/Syntax/OperatorTests.cs   |   508 +-
 .../tests/Syntax/PathConstraintTests.cs            |   310 +-
 src/NUnitFramework/tests/Syntax/PropertyTests.cs   |   226 +-
 .../tests/Syntax/SerializableConstraints.cs        |    68 +-
 .../tests/Syntax/SimpleConstraints.cs              |   188 +-
 .../tests/Syntax/StringConstraints.cs              |   316 +-
 src/NUnitFramework/tests/Syntax/SyntaxTest.cs      |   106 +-
 src/NUnitFramework/tests/Syntax/TestCompiler.cs    |   114 +-
 src/NUnitFramework/tests/Syntax/ThrowsTests.cs     |   451 +-
 src/NUnitFramework/tests/Syntax/TypeConstraints.cs |   362 +-
 src/NUnitFramework/tests/TestDelegates.cs          |    80 +-
 .../tests/TestFixtureAttributeTests.cs             |   148 +-
 src/NUnitFramework/tests/TextMessageWriterTests.cs |   290 +-
 src/NUnitFramework/tests/TypeAssertTest.cs         |   236 +-
 src/NUnitFramework/tests/ValuesAttributeTests.cs   |   280 +-
 src/NUnitFramework/tests/data/TestText1.txt        |  1600 +--
 src/NUnitFramework/tests/data/TestText2.txt        |  1600 +--
 .../tests/nunit.framework.tests.build              |   237 +-
 .../tests/nunit.framework.tests.csproj             |   403 +-
 src/NUnitMocks/mocks/AssemblyInfo.cs               |    24 +-
 src/NUnitMocks/mocks/DynamicMock.cs                |    96 +-
 src/NUnitMocks/mocks/ICall.cs                      |    50 +-
 src/NUnitMocks/mocks/ICallHandler.cs               |    52 +-
 src/NUnitMocks/mocks/IMethod.cs                    |    58 +-
 src/NUnitMocks/mocks/IMock.cs                      |   134 +-
 src/NUnitMocks/mocks/IVerify.cs                    |    38 +-
 src/NUnitMocks/mocks/MethodSignature.cs            |   114 +-
 src/NUnitMocks/mocks/Mock.cs                       |   328 +-
 src/NUnitMocks/mocks/MockCall.cs                   |   110 +-
 src/NUnitMocks/mocks/MockInterfaceHandler.cs       |   146 +-
 src/NUnitMocks/mocks/MockMethod.cs                 |   240 +-
 src/NUnitMocks/mocks/nunit.mocks.build             |    90 +-
 src/NUnitMocks/mocks/nunit.mocks.csproj            |   242 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5175 bytes
 .../Debug/nunit.mocks.csproj.FileListAbsolute.txt  |     5 +
 ...unit.mocks.csprojResolveAssemblyReference.cache |   Bin 0 -> 5422 bytes
 src/NUnitMocks/mocks/obj/Debug/nunit.mocks.pdb     |   Bin 0 -> 30208 bytes
 src/NUnitMocks/tests/DynamicMockTests.cs           |   362 +-
 src/NUnitMocks/tests/MockTests.cs                  |   686 +-
 src/NUnitMocks/tests/nunit.mocks.tests.build       |    68 +-
 src/NUnitMocks/tests/nunit.mocks.tests.csproj      |   226 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5246 bytes
 .../nunit.mocks.tests.csproj.FileListAbsolute.txt  |     5 +
 ...ocks.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 7704 bytes
 .../tests/obj/Debug/nunit.mocks.tests.pdb          |   Bin 0 -> 32256 bytes
 src/NUnitTestServer/nunit-agent-exe/App.config     |    72 +-
 src/NUnitTestServer/nunit-agent-exe/App.v1.config  |   152 +-
 .../nunit-agent-exe/AssemblyInfo.cs                |    22 +-
 src/NUnitTestServer/nunit-agent-exe/Program.cs     |   244 +-
 .../nunit-agent-exe/nunit-agent.exe.build          |   130 +-
 .../nunit-agent-exe/nunit-agent.exe.csproj         |   260 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5628 bytes
 .../nunit-agent.exe.csproj.FileListAbsolute.txt    |     7 +
 ...-agent.exe.csprojResolveAssemblyReference.cache |   Bin 0 -> 14406 bytes
 .../nunit-agent-exe/obj/Debug/nunit-agent.pdb      |   Bin 0 -> 13824 bytes
 src/PNUnit/agent/AgentConfig.cs                    |    68 +-
 src/PNUnit/agent/App.config                        |   152 +-
 src/PNUnit/agent/AssemblyInfo.cs                   |   116 +-
 src/PNUnit/agent/PNUnitTestRunner.cs               |  1088 +-
 src/PNUnit/agent/Ship.config                       |   152 +-
 src/PNUnit/agent/agent.cs                          |   512 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5728 bytes
 .../Debug/pnunit-agent.csproj.FileListAbsolute.txt |     6 +
 ...unit-agent.csprojResolveAssemblyReference.cache |   Bin 0 -> 23414 bytes
 src/PNUnit/agent/obj/Debug/pnunit-agent.pdb        |   Bin 0 -> 40448 bytes
 src/PNUnit/agent/pnunit-agent.build                |    96 +-
 src/PNUnit/agent/pnunit-agent.csproj               |   288 +-
 src/PNUnit/launcher/App.config                     |   152 +-
 src/PNUnit/launcher/AssemblyInfo.cs                |   116 +-
 src/PNUnit/launcher/Barrier.cs                     |   118 +-
 src/PNUnit/launcher/MessageQueue.cs                |   370 +-
 src/PNUnit/launcher/Runner.cs                      |   722 +-
 src/PNUnit/launcher/Ship.config                    |   152 +-
 src/PNUnit/launcher/TestConf.cs                    |   414 +-
 src/PNUnit/launcher/launcher.cs                    |  1098 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5746 bytes
 .../pnunit-launcher.csproj.FileListAbsolute.txt    |     6 +
 ...t-launcher.csprojResolveAssemblyReference.cache |   Bin 0 -> 23436 bytes
 src/PNUnit/launcher/obj/Debug/pnunit-launcher.pdb  |   Bin 0 -> 62976 bytes
 src/PNUnit/launcher/pnunit-launcher.build          |    94 +-
 src/PNUnit/launcher/pnunit-launcher.csproj         |   292 +-
 src/PNUnit/pnunit.framework/AssemblyInfo.cs        |   116 +-
 src/PNUnit/pnunit.framework/Interfaces.cs          |   294 +-
 src/PNUnit/pnunit.framework/PNUnitServices.cs      |   360 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5184 bytes
 .../pnunit.framework.csproj.FileListAbsolute.txt   |     5 +
 ....framework.csprojResolveAssemblyReference.cache |   Bin 0 -> 4796 bytes
 .../obj/Debug/pnunit.framework.pdb                 |   Bin 0 -> 26112 bytes
 src/PNUnit/pnunit.framework/pnunit.framework.build |    80 +-
 .../pnunit.framework/pnunit.framework.csproj       |   244 +-
 src/PNUnit/tests/AssemblyInfo.cs                   |    38 +-
 src/PNUnit/tests/Cmp.cs                            |    30 +-
 src/PNUnit/tests/ParallelExamples.cs               |   286 +-
 src/PNUnit/tests/Testing.cs                        |    92 +-
 src/PNUnit/tests/agent.conf                        |     6 +-
 src/PNUnit/tests/agent.log.conf                    |    36 +-
 src/PNUnit/tests/launcher.log.conf                 |    36 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5613 bytes
 .../Debug/pnunit.tests.csproj.FileListAbsolute.txt |    10 +
 ...unit.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 9836 bytes
 src/PNUnit/tests/obj/Debug/pnunit.tests.pdb        |   Bin 0 -> 17920 bytes
 src/PNUnit/tests/pnunit.tests.build                |    88 +-
 src/PNUnit/tests/pnunit.tests.csproj               |   266 +-
 src/PNUnit/tests/runpnunit.bat                     |     6 +-
 src/PNUnit/tests/test.conf                         |   162 +-
 src/ProjectEditor/editor/AboutBox.Designer.cs      |   380 +-
 src/ProjectEditor/editor/AboutBox.cs               |   218 +-
 src/ProjectEditor/editor/AboutBox.resx             |  1218 +--
 .../AddConfigurationDialog.Designer.cs             |   256 +-
 .../ConfigurationEditor/AddConfigurationDialog.cs  |   198 +-
 .../AddConfigurationDialog.resx                    |   238 +-
 .../AddConfigurationPresenter.cs                   |   126 +-
 .../ConfigurationEditor/ConfigurationEditor.cs     |   264 +-
 .../ConfigurationEditorView.Designer.cs            |   278 +-
 .../ConfigurationEditor/ConfigurationEditorView.cs |   204 +-
 .../ConfigurationEditorView.resx                   |   290 +-
 .../IConfigurationEditorView.cs                    |    48 +-
 .../RenameConfigurationDialog.Designer.cs          |   168 +-
 .../RenameConfigurationDialog.cs                   |   150 +-
 .../RenameConfigurationDialog.resx                 |   312 +-
 .../RenameConfigurationPresenter.cs                |    98 +-
 src/ProjectEditor/editor/Delegates.cs              |    32 +-
 src/ProjectEditor/editor/IDialog.cs                |    42 +-
 src/ProjectEditor/editor/IView.cs                  |    58 +-
 src/ProjectEditor/editor/Main/IMainView.cs         |    96 +-
 src/ProjectEditor/editor/Main/IProjectDocument.cs  |   122 +-
 src/ProjectEditor/editor/Main/MainForm.Designer.cs |   578 +-
 src/ProjectEditor/editor/Main/MainForm.cs          |   292 +-
 src/ProjectEditor/editor/Main/MainForm.resx        |   338 +-
 src/ProjectEditor/editor/Main/MainPresenter.cs     |   420 +-
 src/ProjectEditor/editor/Main/ProjectDocument.cs   |   746 +-
 src/ProjectEditor/editor/PathUtils.cs              |   512 +-
 src/ProjectEditor/editor/Program.cs                |   126 +-
 .../editor/Properties/AssemblyInfo.cs              |    72 +-
 .../editor/PropertyEditor/AssemblyList.cs          |   190 +-
 .../editor/PropertyEditor/ConfigList.cs            |   248 +-
 .../editor/PropertyEditor/IProjectConfig.cs        |    62 +-
 .../editor/PropertyEditor/IProjectModel.cs         |    78 +-
 .../editor/PropertyEditor/IPropertyView.cs         |   122 +-
 .../editor/PropertyEditor/ProjectConfig.cs         |   370 +-
 .../editor/PropertyEditor/ProjectModel.cs          |   280 +-
 .../editor/PropertyEditor/PropertyPresenter.cs     |   981 +-
 .../editor/PropertyEditor/PropertyView.Designer.cs |  1126 +-
 .../editor/PropertyEditor/PropertyView.cs          |   472 +-
 .../editor/PropertyEditor/PropertyView.resx        |   288 +-
 .../editor/PropertyEditor/RuntimeFramework.cs      |   282 +-
 .../editor/PropertyEditor/VSProject.cs             |   656 +-
 .../editor/PropertyEditor/VSProjectConfig.cs       |    78 +-
 .../PropertyEditor/VSProjectConfigCollection.cs    |    96 +-
 .../editor/PropertyEditor/XmlHelper.cs             |   236 +-
 .../editor/ViewElements/ButtonElement.cs           |    62 +-
 .../editor/ViewElements/ComboBoxElement.cs         |   186 +-
 .../editor/ViewElements/ControlElement.cs          |   100 +-
 .../editor/ViewElements/DialogManager.cs           |   140 +-
 src/ProjectEditor/editor/ViewElements/IComboBox.cs |    66 +-
 src/ProjectEditor/editor/ViewElements/ICommand.cs  |    40 +-
 .../editor/ViewElements/IDialogManager.cs          |    38 +-
 .../editor/ViewElements/IMessageDisplay.cs         |    36 +-
 .../editor/ViewElements/ISelection.cs              |    46 +-
 .../editor/ViewElements/ISelectionList.cs          |    56 +-
 .../editor/ViewElements/ITextElement.cs            |    62 +-
 .../editor/ViewElements/IViewElement.cs            |    56 +-
 .../editor/ViewElements/ListBoxElement.cs          |   124 +-
 .../editor/ViewElements/MenuElement.cs             |    94 +-
 .../editor/ViewElements/MessageDisplay.cs          |    60 +-
 .../editor/ViewElements/RadioButtonGroup.cs        |   142 +-
 .../editor/ViewElements/TextElement.cs             |    94 +-
 src/ProjectEditor/editor/XmlEditor/IXmlView.cs     |    96 +-
 src/ProjectEditor/editor/XmlEditor/XmlPresenter.cs |   170 +-
 .../editor/XmlEditor/XmlView.Designer.cs           |   158 +-
 src/ProjectEditor/editor/XmlEditor/XmlView.cs      |   200 +-
 src/ProjectEditor/editor/XmlEditor/XmlView.resx    |   238 +-
 src/ProjectEditor/editor/nunit-editor.build        |   214 +-
 src/ProjectEditor/editor/nunit-editor.csproj       |   380 +-
 src/ProjectEditor/tests/Model/AssemblyListTests.cs |   272 +-
 src/ProjectEditor/tests/Model/NUnitProjectSave.cs  |   266 +-
 .../tests/Model/ProjectCreationTests.cs            |   306 +-
 .../tests/Model/ProjectDocumentTests.cs            |   144 +-
 .../tests/Model/ProjectModelChangeTests.cs         |   280 +-
 .../tests/Model/ProjectModelLoadtests.cs           |   386 +-
 src/ProjectEditor/tests/NUnitProjectXml.cs         |   116 +-
 .../Presenters/AddConfigurationPresenterTests.cs   |   170 +-
 .../tests/Presenters/ConfigurationEditorTests.cs   |   304 +-
 .../tests/Presenters/MainPresenterTests.cs         |   418 +-
 .../tests/Presenters/PropertyPresenterTests.cs     |   534 +-
 .../RenameConfigurationPresenterTests.cs           |   192 +-
 .../tests/Presenters/SelectionStub.cs              |   302 +-
 .../tests/Presenters/XmlPresenterTests.cs          |   128 +-
 src/ProjectEditor/tests/Properties/AssemblyInfo.cs |    72 +-
 .../tests/Views/AddConfigurationDialogTests.cs     |   178 +-
 .../tests/Views/ConfigurationEditorViewTests.cs    |    54 +-
 src/ProjectEditor/tests/Views/PropertyViewTests.cs |    60 +-
 src/ProjectEditor/tests/nunit-editor.tests.build   |   124 +-
 src/ProjectEditor/tests/nunit-editor.tests.csproj  |   228 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5989 bytes
 .../nunit-editor.tests.csproj.FileListAbsolute.txt |     5 +
 ...itor.tests.csprojResolveAssemblyReference.cache |   Bin 0 -> 30899 bytes
 .../tests/obj/Debug/nunit-editor.tests.pdb         |   Bin 0 -> 112128 bytes
 src/ProjectEditor/tests/resources/BadProject.nunit |    48 +-
 src/ProjectEditor/tests/resources/NUnitTests.nunit |    48 +-
 src/nunit20under21.config                          |    54 +-
 src/nunit20under22.config                          |    54 +-
 src/nunit21under22.config                          |    54 +-
 src/tests/mock-assembly/MockAssembly.cs            |   610 +-
 src/tests/mock-assembly/mock-assembly.build        |    58 +-
 src/tests/mock-assembly/mock-assembly.csproj       |   234 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5314 bytes
 .../mock-assembly.csproj.FileListAbsolute.txt      |     5 +
 ...k-assembly.csprojResolveAssemblyReference.cache |   Bin 0 -> 10641 bytes
 .../mock-assembly/obj/Debug/mock-assembly.pdb      |   Bin 0 -> 28160 bytes
 .../nonamespace-assembly/NoNamespaceTestFixture.cs |    60 +-
 .../nonamespace-assembly.build                     |    56 +-
 .../nonamespace-assembly.csproj                    |   224 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5262 bytes
 ...onamespace-assembly.csproj.FileListAbsolute.txt |     5 +
 ...e-assembly.csprojResolveAssemblyReference.cache |   Bin 0 -> 10548 bytes
 .../obj/Debug/nonamespace-assembly.pdb             |   Bin 0 -> 13824 bytes
 src/tests/test-assembly-net45/AsyncDummyFixture.cs |    90 +
 src/tests/test-assembly-net45/AsyncRealFixture.cs  |   298 +
 .../bin/Debug/nunit.framework.pdb                  |   Bin 0 -> 710144 bytes
 .../bin/Debug/nunit.framework.xml                  | 10960 +++++++++++++++++++
 .../bin/Debug/test-assembly-net45.pdb              |   Bin 0 -> 103936 bytes
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 6421 bytes
 ...tedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs |     0
 ...tedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs |     0
 ...tedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs |     0
 ...test-assembly-net45.csproj.FileListAbsolute.txt |     8 +
 ...mbly-net45.csprojResolveAssemblyReference.cache |   Bin 0 -> 6537 bytes
 .../obj/Debug/test-assembly-net45.pdb              |   Bin 0 -> 103936 bytes
 .../test-assembly-net45/test-assembly-net45.build  |    50 +
 .../test-assembly-net45/test-assembly-net45.csproj |    68 +
 .../ActionAttributeExceptionFixture.cs             |   170 +-
 src/tests/test-assembly/ActionAttributeFixture.cs  |   276 +-
 .../test-assembly/AttributeDescriptionTests.cs     |    56 +-
 src/tests/test-assembly/AttributeInheritance.cs    |   122 +-
 src/tests/test-assembly/CategoryAttributeTests.cs  |    64 +-
 src/tests/test-assembly/ConsoleRunnerTest.cs       |   134 +-
 src/tests/test-assembly/CultureAttributeTests.cs   |    60 +-
 src/tests/test-assembly/DatapointFixture.cs        |   218 +-
 src/tests/test-assembly/DirectoryChangeFixture.cs  |    44 +-
 src/tests/test-assembly/ExpectExceptionTest.cs     |   490 +-
 src/tests/test-assembly/FailFixtureTests.cs        |   162 +-
 .../test-assembly/FixtureSetUpTearDownTests.cs     |   686 +-
 src/tests/test-assembly/IgnoreFixtureTests.cs      |   134 +-
 src/tests/test-assembly/LegacySuiteData.cs         |   126 +-
 src/tests/test-assembly/MaxTimeFixture.cs          |    84 +-
 .../test-assembly/ParameterizedTestFixture.cs      |    72 +-
 src/tests/test-assembly/PropertyAttributeTests.cs  |    60 +-
 .../test-assembly/RepeatedTestFixtureTests.cs      |   234 +-
 src/tests/test-assembly/SetUpTest.cs               |   350 +-
 src/tests/test-assembly/SetupFixtureTests.cs       |  1020 +-
 .../test-assembly/TestCaseAttributeFixture.cs      |   168 +-
 src/tests/test-assembly/TestCaseBuilderFixture.cs  |    18 +
 .../TestCaseSourceAttributeFixture.cs              |   198 +-
 src/tests/test-assembly/TestCaseTest.cs            |    42 +-
 src/tests/test-assembly/TestContextData.cs         |   114 +-
 src/tests/test-assembly/TestData.cs                |    80 +-
 src/tests/test-assembly/TestFixtureBuilderTests.cs |   104 +-
 src/tests/test-assembly/TestFixtureData.cs         |   799 +-
 .../test-assembly/TestFixtureExtensionTests.cs     |   100 +-
 .../test-assembly/TestMethodSignatureFixture.cs    |   222 +-
 src/tests/test-assembly/TheoryFixture.cs           |   130 +-
 src/tests/test-assembly/ThreadingFixture.cs        |   106 +-
 src/tests/test-assembly/TypeHelperFixture.cs       |   184 +-
 src/tests/test-assembly/UnhandledExceptions.cs     |   138 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5452 bytes
 .../test-assembly.csproj.FileListAbsolute.txt      |     5 +
 ...t-assembly.csprojResolveAssemblyReference.cache |   Bin 0 -> 15520 bytes
 .../test-assembly/obj/Debug/test-assembly.pdb      |   Bin 0 -> 265728 bytes
 src/tests/test-assembly/test-assembly.build        |   141 +-
 src/tests/test-assembly/test-assembly.csproj       |   361 +-
 src/tests/test-utilities/FormTester.cs             |   668 +-
 src/tests/test-utilities/MockTestEventSource.cs    |   232 +-
 src/tests/test-utilities/TempResourceFile.cs       |   138 +-
 src/tests/test-utilities/TestAssert.cs             |   148 +-
 src/tests/test-utilities/TestBuilder.cs            |   136 +-
 src/tests/test-utilities/TestFinder.cs             |   122 +-
 .../DesignTimeResolveAssemblyReferencesInput.cache |   Bin 0 -> 5455 bytes
 .../test-utilities.csproj.FileListAbsolute.txt     |     5 +
 ...-utilities.csprojResolveAssemblyReference.cache |   Bin 0 -> 17599 bytes
 .../test-utilities/obj/Debug/test-utilities.pdb    |   Bin 0 -> 50688 bytes
 src/tests/test-utilities/test-utilities.build      |    80 +-
 src/tests/test-utilities/test-utilities.csproj     |   264 +-
 1442 files changed, 194244 insertions(+), 175233 deletions(-)

diff --git a/NUnitFitTests.html b/NUnitFitTests.html
index b7eb5c9..ca5cd4f 100644
--- a/NUnitFitTests.html
+++ b/NUnitFitTests.html
@@ -1,277 +1,277 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-	<body>
-		<h1>NUnit Acceptance Tests</h1>
-		<p>
-		Developers love self-referential programs! Hence, NUnit has always run all it's 
-		own tests, even those that are not really unit tests.
-		<p>Now, beginning with NUnit 2.4, NUnit has top-level tests using Ward Cunningham's 
-			FIT framework. At this time, the tests are pretty rudimentary, but it's a start 
-			and it's a framework for doing more.
-			<h2>Running the Tests</h2>
-		<p>Open a console or shell window and navigate to the NUnit bin directory, which 
-			contains this file. To run the test under Microsoft .Net, enter the command
-			<pre>    runFile NUnitFitTests.html TestResults.html .</pre>
-			To run it under Mono, enter
-			<pre>    mono runFile.exe NUnitFitTests.html TestResults.html .</pre>
-			Note the space and dot at the end of each command. The results of your test 
-			will be in TestResults.html in the same directory.
-			<h2>Platform and CLR Version</h2>
-			<table BORDER cellSpacing="0" cellPadding="5">
-				<tr>
-					<td colspan="2">NUnit.Fixtures.PlatformInfo</td>
-				</tr>
-			</table>
-			<h2>Verify Unit Tests</h2>
-		<p>
-		Load and run the NUnit unit tests, verifying that the results are as expected. 
-		When these tests are run on different platforms, different numbers of tests may 
-		be skipped, so the values for Skipped and Run tests are informational only.
-		<p>
-		The number of tests in each assembly should be constant across all platforms - 
-		any discrepancy usually means that one of the test source files was not 
-		compiled on the platform. There should be no failures and no tests ignored.
-		<p><b>Note:</b>
-		At the moment, the nunit.extensions.tests assembly is failing because the 
-		fixture doesn't initialize addins in the test domain.
-		<p>
-			<table BORDER cellSpacing="0" cellPadding="5">
-				<tr>
-					<td colspan="6">NUnit.Fixtures.AssemblyRunner</td>
-				</tr>
-				<tr>
-					<td>Assembly</td>
-					<td>Tests()</td>
-					<td>Run()</td>
-					<td>Skipped()</td>
-					<td>Ignored()</td>
-					<td>Failures()</td>
-				</tr>
-				<tr>
-					<td>nunit.framework.tests.dll</td>
-					<td>397</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit.core.tests.dll</td>
-					<td>355</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit.util.tests.dll</td>
-					<td>238</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit.mocks.tests.dll</td>
-					<td>43</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit.extensions.tests.dll</td>
-					<td>5</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit-console.tests.dll</td>
-					<td>40</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit.uikit.tests.dll</td>
-					<td>34</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit-gui.tests.dll</td>
-					<td>15</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td>nunit.fixtures.tests.dll</td>
-					<td>6</td>
-					<td> </td>
-					<td> </td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-			</table>
-			<h2>Code Snippet Tests</h2>
-		<p>
-		These tests create a test assembly from a snippet of code and then load and run 
-		the tests that it contains, verifying that the structure of the loaded tests is 
-		as expected and that the number of tests run, skipped, ignored or failed is 
-		correct.
-		<p>
-			<table BORDER cellSpacing="0" cellPadding="5">
-				<tr>
-					<td colspan="6">NUnit.Fixtures.SnippetRunner</td>
-				</tr>
-				<tr>
-					<td>Code</td>
-					<td>Tree()</td>
-					<td>Run()</td>
-					<td>Skipped()</td>
-					<td>Ignored()</td>
-					<td>Failures()</td>
-				</tr>
-				<tr>
-					<td><pre>public class TestClass
-{
-}</pre>
-					</td>
-					<td>EMPTY</td>
-					<td>0</td>
-					<td>0</td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td><pre>using NUnit.Framework;
-
-[TestFixture]
-public class TestClass
-{
-}</pre>
-					</td>
-					<td>TestClass</td>
-					<td>0</td>
-					<td>0</td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td><pre>using NUnit.Framework;
-
-[TestFixture]
-public class TestClass
-{
-    [Test]
-    public void T1() { }
-    [Test]
-    public void T2() { }
-    [Test]
-    public void T3() { }
-}</pre>
-					</td>
-					<td><pre>TestClass
->T1
->T2
->T3</pre>
-					</td>
-					<td>3</td>
-					<td>0</td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td><pre>using NUnit.Framework;
-
-[TestFixture]
-public class TestClass1
-{
-    [Test]
-    public void T1() { }
-}
-
-[TestFixture]
-public class TestClass2
-{
-    [Test]
-    public void T2() { }
-    [Test]
-    public void T3() { }
-}</pre>
-					</td>
-					<td><pre>TestClass1
->T1
-TestClass2
->T2
->T3</pre>
-					</td>
-					<td>3</td>
-					<td>0</td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td><pre>using NUnit.Framework;
-
-[TestFixture]
-public class TestClass
-{
-    [Test]
-    public void T1() { }
-    [Test, Ignore]
-    public void T2() { }
-    [Test]
-    public void T3() { }
-}</pre>
-					</td>
-					<td><pre>TestClass
->T1
->T2
->T3</pre>
-					</td>
-					<td>2</td>
-					<td>0</td>
-					<td>1</td>
-					<td>0</td>
-				</tr>
-				<tr>
-					<td><pre>using NUnit.Framework;
-
-[TestFixture]
-public class TestClass
-{
-    [Test]
-    public void T1() { }
-    [Test, Explicit]
-    public void T2() { }
-    [Test]
-    public void T3() { }
-}</pre>
-					</td>
-					<td><pre>TestClass
->T1
->T2
->T3</pre>
-					</td>
-					<td>2</td>
-					<td>1</td>
-					<td>0</td>
-					<td>0</td>
-				</tr>
-			</table>
-			<h2>Summary Information</h2>
-			<table BORDER cellSpacing="0" cellPadding="5">
-				<tr>
-					<td colspan="2">fit.Summary</td>
-				</tr>
-			</table>
-	</body>
-</html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+	<body>
+		<h1>NUnit Acceptance Tests</h1>
+		<p>
+		Developers love self-referential programs! Hence, NUnit has always run all it's 
+		own tests, even those that are not really unit tests.
+		<p>Now, beginning with NUnit 2.4, NUnit has top-level tests using Ward Cunningham's 
+			FIT framework. At this time, the tests are pretty rudimentary, but it's a start 
+			and it's a framework for doing more.
+			<h2>Running the Tests</h2>
+		<p>Open a console or shell window and navigate to the NUnit bin directory, which 
+			contains this file. To run the test under Microsoft .Net, enter the command
+			<pre>    runFile NUnitFitTests.html TestResults.html .</pre>
+			To run it under Mono, enter
+			<pre>    mono runFile.exe NUnitFitTests.html TestResults.html .</pre>
+			Note the space and dot at the end of each command. The results of your test 
+			will be in TestResults.html in the same directory.
+			<h2>Platform and CLR Version</h2>
+			<table BORDER cellSpacing="0" cellPadding="5">
+				<tr>
+					<td colspan="2">NUnit.Fixtures.PlatformInfo</td>
+				</tr>
+			</table>
+			<h2>Verify Unit Tests</h2>
+		<p>
+		Load and run the NUnit unit tests, verifying that the results are as expected. 
+		When these tests are run on different platforms, different numbers of tests may 
+		be skipped, so the values for Skipped and Run tests are informational only.
+		<p>
+		The number of tests in each assembly should be constant across all platforms - 
+		any discrepancy usually means that one of the test source files was not 
+		compiled on the platform. There should be no failures and no tests ignored.
+		<p><b>Note:</b>
+		At the moment, the nunit.extensions.tests assembly is failing because the 
+		fixture doesn't initialize addins in the test domain.
+		<p>
+			<table BORDER cellSpacing="0" cellPadding="5">
+				<tr>
+					<td colspan="6">NUnit.Fixtures.AssemblyRunner</td>
+				</tr>
+				<tr>
+					<td>Assembly</td>
+					<td>Tests()</td>
+					<td>Run()</td>
+					<td>Skipped()</td>
+					<td>Ignored()</td>
+					<td>Failures()</td>
+				</tr>
+				<tr>
+					<td>nunit.framework.tests.dll</td>
+					<td>397</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit.core.tests.dll</td>
+					<td>355</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit.util.tests.dll</td>
+					<td>238</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit.mocks.tests.dll</td>
+					<td>43</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit.extensions.tests.dll</td>
+					<td>5</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit-console.tests.dll</td>
+					<td>40</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit.uikit.tests.dll</td>
+					<td>34</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit-gui.tests.dll</td>
+					<td>15</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td>nunit.fixtures.tests.dll</td>
+					<td>6</td>
+					<td> </td>
+					<td> </td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+			</table>
+			<h2>Code Snippet Tests</h2>
+		<p>
+		These tests create a test assembly from a snippet of code and then load and run 
+		the tests that it contains, verifying that the structure of the loaded tests is 
+		as expected and that the number of tests run, skipped, ignored or failed is 
+		correct.
+		<p>
+			<table BORDER cellSpacing="0" cellPadding="5">
+				<tr>
+					<td colspan="6">NUnit.Fixtures.SnippetRunner</td>
+				</tr>
+				<tr>
+					<td>Code</td>
+					<td>Tree()</td>
+					<td>Run()</td>
+					<td>Skipped()</td>
+					<td>Ignored()</td>
+					<td>Failures()</td>
+				</tr>
+				<tr>
+					<td><pre>public class TestClass
+{
+}</pre>
+					</td>
+					<td>EMPTY</td>
+					<td>0</td>
+					<td>0</td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td><pre>using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+}</pre>
+					</td>
+					<td>TestClass</td>
+					<td>0</td>
+					<td>0</td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td><pre>using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}</pre>
+					</td>
+					<td><pre>TestClass
+>T1
+>T2
+>T3</pre>
+					</td>
+					<td>3</td>
+					<td>0</td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td><pre>using NUnit.Framework;
+
+[TestFixture]
+public class TestClass1
+{
+    [Test]
+    public void T1() { }
+}
+
+[TestFixture]
+public class TestClass2
+{
+    [Test]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}</pre>
+					</td>
+					<td><pre>TestClass1
+>T1
+TestClass2
+>T2
+>T3</pre>
+					</td>
+					<td>3</td>
+					<td>0</td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td><pre>using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Ignore]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}</pre>
+					</td>
+					<td><pre>TestClass
+>T1
+>T2
+>T3</pre>
+					</td>
+					<td>2</td>
+					<td>0</td>
+					<td>1</td>
+					<td>0</td>
+				</tr>
+				<tr>
+					<td><pre>using NUnit.Framework;
+
+[TestFixture]
+public class TestClass
+{
+    [Test]
+    public void T1() { }
+    [Test, Explicit]
+    public void T2() { }
+    [Test]
+    public void T3() { }
+}</pre>
+					</td>
+					<td><pre>TestClass
+>T1
+>T2
+>T3</pre>
+					</td>
+					<td>2</td>
+					<td>1</td>
+					<td>0</td>
+					<td>0</td>
+				</tr>
+			</table>
+			<h2>Summary Information</h2>
+			<table BORDER cellSpacing="0" cellPadding="5">
+				<tr>
+					<td colspan="2">fit.Summary</td>
+				</tr>
+			</table>
+	</body>
+</html>
diff --git a/NUnitTests.config b/NUnitTests.config
index 92f10d7..72ed67c 100644
--- a/NUnitTests.config
+++ b/NUnitTests.config
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<configuration>
-<!--
-	 This is the configuration file for the NUnitTests.nunit test project. You may
-	 need to create a similar configuration file for your own test project if your
-   application and tests require it.
- -->	 
-
-  <appSettings>
-		<!--   User application and configured property settings go here.-->
-		<!--   Example: <add key="settingName" value="settingValue"/> -->
-		<add key="test.setting" value="54321" />
-	</appSettings>
-
-   <!--
-    The following <runtime> section allows running nunit tests under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0.
-   --> 
-	<runtime>
-		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-				appliesTo="v1.0.3705">
-			<dependentAssembly>
-				<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Windows.Forms" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-			<dependentAssembly>
-				<assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="" />
-				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
-			</dependentAssembly>
-		</assemblyBinding>
-	</runtime>
-</configuration> 
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+<!--
+	 This is the configuration file for the NUnitTests.nunit test project. You may
+	 need to create a similar configuration file for your own test project if your
+   application and tests require it.
+ -->	 
+
+  <appSettings>
+		<!--   User application and configured property settings go here.-->
+		<!--   Example: <add key="settingName" value="settingValue"/> -->
+		<add key="test.setting" value="54321" />
+	</appSettings>
+
+   <!--
+    The following <runtime> section allows running nunit tests under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0.
+   --> 
+	<runtime>
+		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+				appliesTo="v1.0.3705">
+			<dependentAssembly>
+				<assemblyIdentity name="System" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Drawing" publicKeyToken="b03f5f7f11d50a3a" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Windows.Forms" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Xml" publicKeyToken="b77a5c561934e089" culture="" />
+				<bindingRedirect oldVersion="1.0.5000.0" newVersion="1.0.3300.0" />
+			</dependentAssembly>
+		</assemblyBinding>
+	</runtime>
+</configuration> 
diff --git a/NUnitTests.nunit b/NUnitTests.nunit
index a83d521..2fff379 100644
--- a/NUnitTests.nunit
+++ b/NUnitTests.nunit
@@ -1,25 +1,25 @@
-<NUnitProject>
-  <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" />
-    <assembly path="bin/Debug/tests/nunit.mocks.tests.dll" />
-    <assembly path="bin/Debug/tests/nunit-console.tests.dll" />
-    <assembly path="bin/Debug/tests/nunit.uikit.tests.dll" />
-    <assembly path="bin/Debug/tests/nunit.uiexception.tests.dll" />
-    <assembly path="bin/Debug/tests/nunit-gui.tests.dll" />
-    <assembly path="bin/Debug/tests/nunit-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" />
-    <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-editor.tests.dll" />
-  </Config>
-</NUnitProject>
+<NUnitProject>
+  <Settings autoconfig="true" processModel="Default" domainUsage="Default" />
+  <Config name="Debug" binpath="bin/Debug/lib;bin/Debug/tests;bin/Debug/framework" configfile="NUnitTests.config">
+    <assembly path="bin/Debug/tests/nunit.framework.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.core.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.util.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.mocks.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit-console.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.uikit.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit.uiexception.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit-gui.tests.dll" />
+    <assembly path="bin/Debug/tests/nunit-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" />
+    <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-editor.tests.dll" />
+  </Config>
+</NUnitProject>
\ No newline at end of file
diff --git a/NUnitTests.v1.nunit b/NUnitTests.v1.nunit
index 8dc4ad5..062b029 100644
--- a/NUnitTests.v1.nunit
+++ b/NUnitTests.v1.nunit
@@ -1,10 +1,10 @@
-<NUnitProject>
-  <Settings appbase="."/>
-  <Config name="Default" binpath="lib;tests;framework">
-    <assembly path="tests/nunit.framework.tests.dll" />
-    <assembly path="tests/nunit.core.tests.dll" />
-    <assembly path="tests/nunit.util.tests.dll" />
-    <assembly path="tests/nunit.mocks.tests.dll" />
-    <assembly path="tests/nunit-console.tests.dll" />
-  </Config>
-</NUnitProject>
+<NUnitProject>
+  <Settings appbase="."/>
+  <Config name="Default" binpath="lib;tests;framework">
+    <assembly path="tests/nunit.framework.tests.dll" />
+    <assembly path="tests/nunit.core.tests.dll" />
+    <assembly path="tests/nunit.util.tests.dll" />
+    <assembly path="tests/nunit.mocks.tests.dll" />
+    <assembly path="tests/nunit-console.tests.dll" />
+  </Config>
+</NUnitProject>
diff --git a/NUnitTests.v2.nunit b/NUnitTests.v2.nunit
index dac96e4..b34b8fb 100644
--- a/NUnitTests.v2.nunit
+++ b/NUnitTests.v2.nunit
@@ -1,14 +1,14 @@
-<NUnitProject>
-  <Settings appbase="."/>
-  <Config name="Default" binpath="lib;tests;framework" runtimeFramework="v${runtime.version}">
-    <assembly path="tests/nunit.framework.tests.dll" />
-    <assembly path="tests/nunit.core.tests.dll" />
-    <assembly path="tests/nunit.util.tests.dll" />
-    <assembly path="tests/nunit.mocks.tests.dll" />
-    <assembly path="tests/nunit-console.tests.dll" />
-    <assembly path="tests/nunit.uiexception.tests.dll" />
-    <assembly path="tests/nunit.uikit.tests.dll" />
-    <assembly path="tests/nunit-gui.tests.dll" />
-    <assembly path="tests/nunit-editor.tests.dll" />
-  </Config>
-</NUnitProject>
+<NUnitProject>
+  <Settings appbase="."/>
+  <Config name="Default" binpath="lib;tests;framework" runtimeFramework="v${runtime.version}">
+    <assembly path="tests/nunit.framework.tests.dll" />
+    <assembly path="tests/nunit.core.tests.dll" />
+    <assembly path="tests/nunit.util.tests.dll" />
+    <assembly path="tests/nunit.mocks.tests.dll" />
+    <assembly path="tests/nunit-console.tests.dll" />
+    <assembly path="tests/nunit.uiexception.tests.dll" />
+    <assembly path="tests/nunit.uikit.tests.dll" />
+    <assembly path="tests/nunit-gui.tests.dll" />
+    <assembly path="tests/nunit-editor.tests.dll" />
+  </Config>
+</NUnitProject>
diff --git a/build b/build
new file mode 100644
index 0000000..bcefb74
--- /dev/null
+++ b/build
@@ -0,0 +1,127 @@
+#!/bin/sh
+# build - Builds and tests NUnit
+
+NANT="tools/nant/bin/NAnt.exe"
+options="-f:scripts/nunit.build.targets"
+config=""
+runtime=""
+clean=""
+commands=""
+passthru=false
+
+for arg in $@
+do
+  if [ $passthru = true ]
+  then
+    commands="$commands $arg"
+    continue
+  fi
+
+  case "$arg" in
+    debug|release)
+      config="$arg"
+      ;;
+
+    mono-1.0|1.0)
+      runtime="mono-1.0"
+      ;;
+
+    mono-2.0|2.0)
+      runtime="mono-2.0"
+      ;;
+
+    mono-3.5|3.5)
+      runtime="mono-3.5"
+      ;;
+
+    mono-4.0|4.0)
+      runtime="mono-4.0"
+      ;;
+
+    clean)
+      clean="clean"
+      ;;
+
+    clean-all)
+      clean="clean-all"
+      ;;
+
+    samples|tools|all)
+      commands="$commands build-$arg"
+      ;;
+
+    test|test45|gui-test|gen-syntax)
+      commands="$commands $arg"
+      ;;
+
+    -h|--help)
+      echo "Builds and tests NUnit"
+      echo
+      echo "usage: BUILD [option [...] ]"
+      echo
+      echo "Options may be any of the following, in any order..."
+      echo
+      echo "  debug          Builds debug configuration (default)"
+      echo "  release        Builds release configuration"
+      echo
+      echo "  mono-4.0, 4.0  Builds using Mono 4.0 profile (future)"
+      echo "  mono-3.5, 3.5  Builds using Mono 3.5 profile (default)"
+      echo "  mono-2.0, 2.0  Builds using Mono 2.0 profile"
+      echo "  mono-1.0, 1.0  Builds using Mono 1.0 profile"
+      echo
+      echo "  clean          Cleans the output directory before building"
+      echo "  clean-all      Removes output directories for all runtimes"
+      echo
+      echo "  samples        Builds the NUnit samples"
+      echo "  tools          Builds the NUnit tools"
+      echo
+      echo "  test           Runs tests for a build using the console runner"
+      echo "  test45         Run the .NET 4.5 async test assembly tests"
+      echo "  gui-test       Runs tests for a build using the NUnit gui"
+      echo
+      echo "  -h, --help     Displays this help message"
+      echo
+      echo "Notes:"
+      echo
+      echo "  1. The default Mono profile to be used is selected automatically"
+      echo "     by the NAnt script based on the version of Mono installed"
+      echo
+      echo "  2. When building under the 3.5 or higher profile, the 2.0"
+      echo "     runtime version is targeted for NUnit itself. Tests use"
+      echo "     the specified higher level framework."
+      echo   
+      exit;
+      ;;
+
+    --)
+      passthru=true
+      ;;
+
+    *)
+      echo "Invalid argument: $arg"
+      echo
+      echo "Use $0 -h for more info"
+      echo
+      exit;
+      ;;
+  esac
+done
+
+if [ "$commands" = "" ]
+then
+  commands="build"
+fi
+
+if [ "$config" != "" ]
+then
+  options="$options -D:build.config=$config"
+fi
+
+if [ "$runtime" != "" ]
+then
+  options="$options -D:runtime.config=$runtime"
+fi
+
+exec mono "$NANT" $options $clean $commands
+
+
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..bfaa88c
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,126 @@
+ at echo off
+
+rem BUILD - Builds and tests NUnit
+
+setlocal
+
+set NANT=tools\nant\bin\nant.exe
+set OPTIONS=-f:scripts\nunit.build.targets
+set CONFIG=
+set RUNTIME=
+set CLEAN=
+set COMMANDS=
+set PASSTHRU=
+goto start
+
+:shift
+shift /1
+
+:start
+
+IF "%1" EQU "" goto execute
+
+IF "%PASSTHRU%" EQU "TRUE" set COMMANDS=%COMMANDS% %1&goto shift
+
+IF /I "%1" EQU "?"	goto usage
+IF /I "%1" EQU "/h"	goto usage
+IF /I "%1" EQU "/help"	goto usage
+
+IF /I "%1" EQU "debug" set CONFIG=debug&goto shift
+IF /I "%1" EQU "release" set CONFIG=release&goto shift
+
+IF /I "%1" EQU "net" set RUNTIME=net&goto shift
+IF /I "%1" EQU "net-1.0" set RUNTIME=net-1.0&goto shift
+IF /I "%1" EQU "net-1.1" set RUNTIME=net-1.1&goto shift
+IF /I "%1" EQU "net-2.0" set RUNTIME=net-2.0&goto shift
+IF /I "%1" EQU "net-3.0" set RUNTIME=net-3.0&goto shift
+IF /I "%1" EQU "net-3.5" set RUNTIME=net-3.5&goto shift
+IF /I "%1" EQU "net-4.0" set RUNTIME=net-4.0&goto shift
+IF /I "%1" EQU "net-4.5" set RUNTIME=net-4.5&goto shift
+
+IF /I "%1" EQU "mono" set RUNTIME=mono&goto shift
+IF /I "%1" EQU "mono-1.0" set RUNTIME=mono-1.0&goto shift
+IF /I "%1" EQU "mono-2.0" set RUNTIME=mono-2.0&goto shift
+IF /I "%1" EQU "mono-3.5" set RUNTIME=mono-3.5&goto shift
+IF /I "%1" EQU "mono-4.0" set RUNTIME=mono-4.0&goto shift
+
+if /I "%1" EQU "clean" set CLEAN=clean&goto shift
+if /I "%1" EQU "clean-all" set CLEAN=clean-all&goto shift
+IF /I "%1" EQU "samples" set COMMANDS=%COMMANDS% build-samples&goto shift
+IF /I "%1" EQU "tools" set COMMANDS=%COMMANDS% build-tools&goto shift
+IF /I "%1" EQU "test" set COMMANDS=%COMMANDS% test&goto shift
+IF /I "%1" EQU "test45" set COMMANDS=%COMMANDS% test45&goto shift
+IF /I "%1" EQU "gui-test" set COMMANDS=%COMMANDS% gui-test&goto shift
+IF /I "%1" EQU "gen-syntax" set COMMANDS=%COMMANDS% gen-syntax&goto shift
+
+IF "%1" EQU "--" set PASSTHRU=TRUE&goto shift
+
+echo Invalid option: %1
+echo.
+echo Use BUILD /help for more information.
+echo.
+
+goto done
+
+: execute
+
+if "%CONFIG%" NEQ "" set OPTIONS=%OPTIONS% -D:build.config=%CONFIG%
+if "%RUNTIME%" NEQ "" set OPTIONS=%OPTIONS% -D:runtime.config=%RUNTIME%
+
+if "%COMMANDS%" EQU "" set COMMANDS=build
+
+%NANT% %OPTIONS% %CLEAN% %COMMANDS%
+
+goto done
+
+: usage
+
+echo Builds and tests NUnit for various targets
+echo.
+echo usage: BUILD [option [...] ] [ -- nantoptions ]
+echo.
+echo Options may be any of the following, in any order...
+echo.
+echo   debug          Builds debug configuration (default)
+echo   release        Builds release configuration
+echo.
+echo   net-4.5        Builds using .NET 4.5 framework (future)
+echo   net-4.0        Builds using .NET 4.0 framework (future)
+echo   net-3.5        Builds using .NET 3.5 framework (default)
+echo   net-2.0        Builds using .NET 2.0 framework
+echo   net-1.1        Builds using .NET 1.1 framework
+echo   net-1.0        Builds using .NET 1.0 framework
+echo   mono-4.0       Builds using Mono 4.0 profile (future)
+echo   mono-3.5       Builds using Mono 3.5 profile (default)
+echo   mono-2.0       Builds using Mono 2.0 profile
+echo   mono-1.0       Builds using Mono 1.0 profile
+echo.
+echo   net            Builds using default .NET version
+echo   mono           Builds using default Mono profile
+echo.
+echo   clean          Cleans the output directory before building
+echo   clean-all      Removes output directories for all runtimes
+echo.
+echo   samples        Builds the NUnit samples
+echo   tools          Builds the NUnit tools
+echo.
+echo   test           Runs tests for a build using the console runner
+echo   test45         Runs the .NET 4.5 async tests using the console runner
+echo   gui-test       Runs tests for a build using the NUnit gui
+echo.
+echo   ?, /h, /help   Displays this help message
+echo.
+echo Notes:
+echo.
+echo   1. The default .NET or Mono version to be used is selected
+echo      automatically by the NAnt script from those installed.
+echo.
+echo   2. When building under a framework version of 3.5 or higher,
+echo      the 2.0 framework is targeted for NUnit itself. Tests use
+echo      the specified higher level framework.
+echo.
+echo   3. Any arguments following '--' on the command line are passed
+echo      directly to the NAnt script.
+echo.
+
+: done
diff --git a/doc/actionAttributes.html b/doc/actionAttributes.html
index db5ff2d..0ce041f 100644
--- a/doc/actionAttributes.html
+++ b/doc/actionAttributes.html
@@ -1,517 +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>
+<!-- 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 [...]
-
-<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 att [...]
-
-</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>
+  </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 [...]
+
+<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 att [...]
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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 9d1279a..1012f56 100644
--- a/doc/addinsDialog.html
+++ b/doc/addinsDialog.html
@@ -1,115 +1,116 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Addins Dialog</h2>
-
-<p>The Addins Dialog is displayed using the Tools | Addins menu item on the main
-menu. It lists all addins that have been found and loaded by NUnit.</p>
-
-<div class="screenshot-right">
-   <img src="img/addinsDialog.jpg"></div>
-
-<h3>Addin</h3>
-
-<p>This column lists the name of the addin, as defined by its author.
-
-<h3>Status</h3>
-
-<p>This column shows the status of each addin. Possible values are
-<ul>
-<li>Unknown
-<li>Enabled
-<li>Disabled
-<li>Loaded
-<li>Error
-</ul>
-
-<h3>Description</h3>
-
-<p>If the author of an addin has provided a description, it is
-shown here when the addin is selected.
-
-<h3>Message</h3>
-
-<p>If the addin failed to load, its status will be shown as Error
-and any error message displayed here when that addin is selected.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li id="current"><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Addins Dialog</h2>
+
+<p>The Addins Dialog is displayed using the Tools | Addins menu item on the main
+menu. It lists all addins that have been found and loaded by NUnit.</p>
+
+<div class="screenshot-right">
+   <img src="img/addinsDialog.jpg"></div>
+
+<h3>Addin</h3>
+
+<p>This column lists the name of the addin, as defined by its author.
+
+<h3>Status</h3>
+
+<p>This column shows the status of each addin. Possible values are
+<ul>
+<li>Unknown
+<li>Enabled
+<li>Disabled
+<li>Loaded
+<li>Error
+</ul>
+
+<h3>Description</h3>
+
+<p>If the author of an addin has provided a description, it is
+shown here when the addin is selected.
+
+<h3>Message</h3>
+
+<p>If the addin failed to load, its status will be shown as Error
+and any error message displayed here when that addin is selected.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li id="current"><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/assemblyIsolation.html b/doc/assemblyIsolation.html
index d99b8bd..a5e8d7b 100644
--- a/doc/assemblyIsolation.html
+++ b/doc/assemblyIsolation.html
@@ -1,118 +1,119 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - AssemblyIsolation</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - AssemblyIsolation</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>Assembly Isolation</h3>
-
-<p>NUnit isolates test assemblies from its own code and from one another
-   by use of separate AppDomains and/or Processes.
-   
-<p>By default, NUnit loads a test assembly into a separate <b>AppDomain</b>, 
-   while its own code runs in the primary <b>AppDomain</b>.
-   
-<p>When multiple assemblies are run at the same time, NUnit loads them differently 
-   depending on how they were specified. For assemblies that are part of an
-   NUnit project, then a single <b>AppDomain</b> is used. If the assemblies 
-   were specified on the console runner command line, then a separate 
-   <b>AppDomain</b> is used for each of them.
-   
-<p>If greater separation is desired, test assemblies may be loaded into
-   a separate <b>Process</b> or into multiple processes. This is done
-   automatically by NUnit in the case where the tests are to be run under
-   a different runtime from the one that NUnit is currently using. Tests
-   running in a separate process are executed under the control of the
-   <a href="nunit-agent.html">nunit-agent</a> program.
-   
-<h3>Controlling Isolation</h3>
-
-<p>Beyond the NUnit default behavior, the user may control the level of isolation
-   through the command line or through NUnit's general settings. Process and AppDomain
-   isolation may also be specified as part of the settings of an NUnit project.
-   
-<h4>Command Line</h4>
-
-<p>Assembly Isolation may be specified on the console runner commandline using
-   the <b>/process</b> and <b>/domain</b> options. See 
-   <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a>   for more information.
-   
-<h4>General Settings</h4>
-
-<p>The built-in NUnit defaults may be overridden using the <b>Assembly Isolation</b>
-   panel of the NUnit <b>Settings Dialog</b>. Settings made here are saved and become
-   the new default values for all executions of NUnit until changed. For more info,
-   see the <a href="settingsDialog.html">Settings Dialog</a> page.
-
-<h4>Project Settings</h4>
-
-<p>Isolation settings may be specified for an individual NUnit project using the
-   <a href="projectEditor.html">Project Editor</a>.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>Assembly Isolation</h3>
+
+<p>NUnit isolates test assemblies from its own code and from one another
+   by use of separate AppDomains and/or Processes.
+   
+<p>By default, NUnit loads a test assembly into a separate <b>AppDomain</b>, 
+   while its own code runs in the primary <b>AppDomain</b>.
+   
+<p>When multiple assemblies are run at the same time, NUnit loads them differently 
+   depending on how they were specified. For assemblies that are part of an
+   NUnit project, then a single <b>AppDomain</b> is used. If the assemblies 
+   were specified on the console runner command line, then a separate 
+   <b>AppDomain</b> is used for each of them.
+   
+<p>If greater separation is desired, test assemblies may be loaded into
+   a separate <b>Process</b> or into multiple processes. This is done
+   automatically by NUnit in the case where the tests are to be run under
+   a different runtime from the one that NUnit is currently using. Tests
+   running in a separate process are executed under the control of the
+   <a href="nunit-agent.html">nunit-agent</a> program.
+   
+<h3>Controlling Isolation</h3>
+
+<p>Beyond the NUnit default behavior, the user may control the level of isolation
+   through the command line or through NUnit's general settings. Process and AppDomain
+   isolation may also be specified as part of the settings of an NUnit project.
+   
+<h4>Command Line</h4>
+
+<p>Assembly Isolation may be specified on the console runner commandline using
+   the <b>/process</b> and <b>/domain</b> options. See 
+   <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a>   for more information.
+   
+<h4>General Settings</h4>
+
+<p>The built-in NUnit defaults may be overridden using the <b>Assembly Isolation</b>
+   panel of the NUnit <b>Settings Dialog</b>. Settings made here are saved and become
+   the new default values for all executions of NUnit until changed. For more info,
+   see the <a href="settingsDialog.html">Settings Dialog</a> page.
+
+<h4>Project Settings</h4>
+
+<p>Isolation settings may be specified for an individual NUnit project using the
+   <a href="projectEditor.html">Project Editor</a>.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/assertions.html b/doc/assertions.html
index 0065b49..549d3cd 100644
--- a/doc/assertions.html
+++ b/doc/assertions.html
@@ -1,116 +1,109 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Assertions</h2>
-
-<p>Assertions are central to unit testing in any of the xUnit frameworks, and NUnit 
-	is no exception. NUnit provides a rich set of assertions as static methods of 
-	the Assert class.</p>
-
-<p>If an assertion fails, the method call does not return and an error is reported. 
-	If a test contains multiple assertions, any that follow the one that failed 
-	will not be executed. For this reason, it's usually best to try for one 
-	assertion per test.</p>
-
-<p>Each method may be called without a message, with a simple text message or with 
-	a message and arguments. In the last case the message is formatted using the 
-	provided text and arguments.</p>
-	
-<h3>Two Models</h3>
-
-<p>Before NUnit 2.4, a separate method of the Assert class was used for each
-   different assertion. We call this the "Classic Model." It
-   continues to be supported in NUnit, since many people prefer it.</p>
-
-<p>Beginning with NUnit 2.4, a new "Constraint-based" model was 
-   introduced. This approach uses a single method of the Assert class
-   for all assertions, passing a <a href="constraintModel.html">Constraint</a>   object that specifies the test to be performed.
-
-<p>This constraint-based model is now used internally by NUnit
-   for all assertions. The methods of the classic approach have been 
-   re-implemented on top of this new model.
-   
-   <!--
-<h4>See Also...</h4>
-<ul>
-<li>
-</ul>
--->
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Assertions</h2>
+
+<p>Assertions are central to unit testing in any of the xUnit frameworks, and NUnit 
+	is no exception. NUnit provides a rich set of assertions as static methods of 
+	the Assert class.</p>
+
+<p>If an assertion fails, the method call does not return and an error is reported. 
+	If a test contains multiple assertions, any that follow the one that failed 
+	will not be executed. For this reason, it's usually best to try for one 
+	assertion per test.</p>
+
+<p>Each method may be called without a message, with a simple text message or with 
+	a message and arguments. In the last case the message is formatted using the 
+	provided text and arguments.</p>
+	
+<h3>Two Models</h3>
+
+<p>Before NUnit 2.4, a separate method of the Assert class was used for each
+   different assertion. We call this the 
+   <a href="classicModel.html">classic model</a>. 
+   It continues to be supported in NUnit, since many people prefer it.</p>
+
+<p>Beginning with NUnit 2.4, a new 
+   <a href="constraintModel.html">constraint-based model</a>   was introduced. This approach uses a single method of the Assert class
+   for all assertions, passing a <b>Constraint</b> object that specifies 
+   the test to be performed.
+
+<p>This constraint-based model is now used internally by NUnit
+   for all assertions. The methods of the classic approach have been 
+   re-implemented on top of this new model.
+   
+   <!--
+<h4>See Also...</h4>
+<ul>
+<li>
+</ul>
+-->
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+</ul>
+<li><a href="attributes.html">Attributes</a></li>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/attributes.html b/doc/attributes.html
index 3afbdb9..9889f1e 100644
--- a/doc/attributes.html
+++ b/doc/attributes.html
@@ -1,120 +1,120 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Attributes</h2>
-<p>Version 1 of NUnit used the classic approach to identifying tests based on 
-	inheritance and naming conventions. From version 2.0 on, NUnit has used custom 
-	attributes for this purpose.</p>
-<p>Because NUnit test fixtures do not inherit from a framework class, the developer 
-	is free to use inheritance in other ways. And because there is no arbitrary 
-	convention for naming tests, the choice of names can be entirely oriented 
-	toward communicating the purpose of the test.</p>
-<p>All NUnit attributes are contained in the NUnit.Framework namespace. Each source 
-	file that contains tests must include a using statement for that namespace and 
-	the project must reference the framework assembly, nunit.framework.dll.</p>
-<p>Beginning with NUnit 2.4.6, NUnit's attributes are no longer sealed and any
-    attributes that derive from them will be recognized by NUnit.
- 
-</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 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>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Attributes</h2>
+<p>Version 1 of NUnit used the classic approach to identifying tests based on 
+	inheritance and naming conventions. From version 2.0 on, NUnit has used custom 
+	attributes for this purpose.</p>
+<p>Because NUnit test fixtures do not inherit from a framework class, the developer 
+	is free to use inheritance in other ways. And because there is no arbitrary 
+	convention for naming tests, the choice of names can be entirely oriented 
+	toward communicating the purpose of the test.</p>
+<p>All NUnit attributes are contained in the NUnit.Framework namespace. Each source 
+	file that contains tests must include a using statement for that namespace and 
+	the project must reference the framework assembly, nunit.framework.dll.</p>
+<p>Beginning with NUnit 2.4.6, NUnit's attributes are no longer sealed and any
+    attributes that derive from them will be recognized by NUnit.
+ 
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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 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>
+<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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/category.html b/doc/category.html
index 4c8cc4f..12b2374 100644
--- a/doc/category.html
+++ b/doc/category.html
@@ -1,296 +1,296 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>CategoryAttribute (NUnit 2.2)</h3>
-<p>The Category attribute provides an alternative to suites for dealing with groups 
-	of tests. Either individual test cases or fixtures may be identified as 
-	belonging to a particular category. Both the gui and console test runners allow 
-	specifying a list of categories to be included in or excluded from the run. 
-	When categories are used, only the tests in the selected categories will be 
-	run. Those tests in categories that are not selected are not reported at all.</p>
-<p>This feature is accessible by use of the /include and /exclude arguments to the 
-	console runner and through a separate "Categories" tab in the gui. The gui 
-	provides a visual indication of which categories are selected at any time.</p>
-
-<h4>Test Fixture Syntax</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  [Category("LongRunning")]
-  public class LongRunningTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Category("LongRunning")>
-  Public Class LongRunningTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [Category("LongRunning")]
-  public __gc class LongRunningTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Category("LongRunning") */
-public class LongRunningTests
-{
-  // ...
-}
-</pre>
-</div>
-<h4>Test Syntax</h4>
-<div class="code">
-	
-<div class="langFilter">
-	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test]
-    [Category("Long")]
-    public void VeryLongTest()
-    { /* ... */ }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()>
-  Public Class SuccessTests
-    <Test(), Category("Long")> Public Sub VeryLongTest()
-      ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test][Category("Long")] void VeryLongTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Category("Long") */
-  public void VeryLongTest()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h3>Custom Category Attributes</h3>
-
-<p>Beginning with <b>NUnit 2.4</b>, it is possible to define custom
-attributes that derive from <b>CategoryAttribute</b> and have them
-recognized by NUnit. The default protected constructor of CategoryAttribute 
-sets the category name to the name of your class.
-
-<p>Here's an example that creates a category of Critical tests. It works
-just like any other category, but has a simpler syntax. A test reporting
-system might make use of the attribute to provide special reports.
-
-<div class=code><pre>
-[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-public class CriticalAttribute : CategoryAttribute { }
-
-...
-
-[Test, Critical]
-public void MyTest()
-{ /*...*/ }
-</pre></div>
-
-</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><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>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>CategoryAttribute (NUnit 2.2)</h3>
+<p>The Category attribute provides an alternative to suites for dealing with groups 
+	of tests. Either individual test cases or fixtures may be identified as 
+	belonging to a particular category. Both the gui and console test runners allow 
+	specifying a list of categories to be included in or excluded from the run. 
+	When categories are used, only the tests in the selected categories will be 
+	run. Those tests in categories that are not selected are not reported at all.</p>
+<p>This feature is accessible by use of the /include and /exclude arguments to the 
+	console runner and through a separate "Categories" tab in the gui. The gui 
+	provides a visual indication of which categories are selected at any time.</p>
+
+<h4>Test Fixture Syntax</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [Category("LongRunning")]
+  public class LongRunningTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Category("LongRunning")>
+  Public Class LongRunningTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [Category("LongRunning")]
+  public __gc class LongRunningTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Category("LongRunning") */
+public class LongRunningTests
+{
+  // ...
+}
+</pre>
+</div>
+<h4>Test Syntax</h4>
+<div class="code">
+	
+<div class="langFilter">
+	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test]
+    [Category("Long")]
+    public void VeryLongTest()
+    { /* ... */ }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()>
+  Public Class SuccessTests
+    <Test(), Category("Long")> Public Sub VeryLongTest()
+      ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test][Category("Long")] void VeryLongTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Category("Long") */
+  public void VeryLongTest()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h3>Custom Category Attributes</h3>
+
+<p>Beginning with <b>NUnit 2.4</b>, it is possible to define custom
+attributes that derive from <b>CategoryAttribute</b> and have them
+recognized by NUnit. The default protected constructor of CategoryAttribute 
+sets the category name to the name of your class.
+
+<p>Here's an example that creates a category of Critical tests. It works
+just like any other category, but has a simpler syntax. A test reporting
+system might make use of the attribute to provide special reports.
+
+<div class=code><pre>
+[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
+public class CriticalAttribute : CategoryAttribute { }
+
+...
+
+[Test, Critical]
+public void MyTest()
+{ /*...*/ }
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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>
+<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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/classicModel.html b/doc/classicModel.html
new file mode 100644
index 0000000..e27bec9
--- /dev/null
+++ b/doc/classicModel.html
@@ -0,0 +1,105 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ClassicModel</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>Classic Assert Model</h2>
+
+<p>The classic Assert model uses a separate method to express each 
+   individual assertion of which it is capable.
+   
+<p>Here's a simple assert using the classic model:
+<pre>      StringAssert.AreEqualIgnoringCase( "Hello", myString );</pre>
+   
+<p>The Assert class provides the most commonly used assertions.
+   For convenience of presentation, we group Assert methods as follows:
+   <ul>
+     <li><a href="equalityAsserts.html">Equality Asserts</a>     <li><a href="identityAsserts.html">Identity Asserts</a>     <li><a href="comparisonAsserts.html">Comparison Asserts</a>     <li><a href="typeAsserts.html">Type Asserts</a> 	 <li><a href="conditionAsserts.html">Condition tests</a> 	 <li><a href="assertThrows.html">Assert.Throws</a>	 <li><a href="utilityAsserts.html">Utility methods</a></ul></p>
+ 
+<p>Beyond the basic facilities of Assert, additional assertions are provided by 
+   the following classes:
+   <ul>
+     <li><a href="stringAssert.html">StringAssert</a>	 <li><a href="collectionAssert.html">CollectionAssert</a>	 <li><a href="fileAssert.html">FileAssert</a>	 <li><a href="directoryAssert.html">DirectoryAssert</a>   </ul></p>
+
+<p><b>See also:</b> the 
+<a href="constraintModel.html">constraint-based model</a> of assertions.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/collectionAssert.html b/doc/collectionAssert.html
index fee51e6..37b5cc3 100644
--- a/doc/collectionAssert.html
+++ b/doc/collectionAssert.html
@@ -1,187 +1,191 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>CollectionAssert (NUnit 2.4 / 2.5)</h2>
-<p>The CollectionAssert class provides a number of methods that are useful 
-when examining collections and their contents or for comparing two collections.</p>
-
-<p>The <b>AreEqual</b> overloads succeed if the corresponding elements of the two 
-collections are equal. <b>AreEquivalent</b> tests whether the collection contents
-are equal, but without regard to order. In both cases, elements are compared using 
-NUnit's default equality comparison.</p>
-
-<p>Beginning with NUnit 2.4.6, these methods may be used on any object that
-implements IEnumerable. Prior to 2.4.6, only true collections were supported.
-
-<div class="code" style="width: 38em">
-<pre>CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection,
-          Type expectedType );
-CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection,
-          Type expectedType, string message );
-CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection,
-          Type expectedType, string message, params object[] args );
-
-CollectionAssert.AllItemsAreNotNull( IEnumerable collection );
-CollectionAssert.AllItemsAreNotNull( IEnumerable collection,
-          string message );
-CollectionAssert.AllItemsAreNotNull( IEnumerable collection,
-          string message, params object[] args );
-
-CollectionAssert.AllItemsAreUnique( IEnumerable collection );
-CollectionAssert.AllItemsAreUnique( IEnumerable collection,
-          string message );
-CollectionAssert.AllItemsAreUnique( IEnumerable collection,
-          string message, params object[] args );
-
-CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual );
-CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual,
-          string message );
-CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual
-          string message, params object[] args );
-
-CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual);
-CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual,
-          string message );
-CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual
-          string message, params object[] args );
-
-CollectionAssert.AreNotEqual( IEnumerable expected, IEnumerable actual );
-CollectionAssert.AreNotEqual( IEnumerable expected, IEnumerable actual,
-          string message );
-CollectionAssert.AreNotEqual( IEnumerableon expected, IEnumerable actual
-          string message, params object[] args );
-
-CollectionAssert.AreNotEquivalent( IEnumerable expected,
-          IEnumerable actual );
-CollectionAssert.AreNotEquivalent( IEnumerable expected,
-          IEnumerable actual, string message );
-CollectionAssert.AreNotEquivalent( IEnumerable expected,
-          IEnumerable actual, string message, params object[] args );
-
-CollectionAssert.Contains( IEnumerable expected, object actual );
-CollectionAssert.Contains( IEnumerable expected, object actual,
-          string message );
-CollectionAssert.Contains( IEnumerable expected, object actual
-          string message, params object[] args );
-
-CollectionAssert.DoesNotContain( IEnumerable expected, object actual );
-CollectionAssert.DoesNotContain( IEnumerable expected, object actual,
-          string message );
-CollectionAssert.DoesNotContain( IEnumerable expected, object actual
-          string message, params object[] args );
-
-CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset );
-CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset,
-          string message );
-CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset,
-          string message, params object[] args );
-
-CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset);
-CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset,
-          string message );
-CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset,
-          string message, params object[] args );
-
-CollectionAssert.IsEmpty( IEnumerable collection );
-CollectionAssert.IsEmpty( IEnumerable collection, string message );
-CollectionAssert.IsEmpty( IEnumerable collection, string message,
-          params object[] args );
-
-CollectionAssert.IsNotEmpty( IEnumerable collection );
-CollectionAssert.IsNotEmpty( IEnumerable collection, string message );
-CollectionAssert.IsNotEmpty( IEnumerable collection, string message,
-          params object[] args );
-</pre></div>
-		 
-<p>The following methods are available beginning with NUnit 2.5
-
-<div class="code" style="width: 38em"><pre>
-CollectionAssert.IsOrdered( IEnumerable collection );
-CollectionAssert.IsOrdered( IEnumerable collection, string message );
-CollectionAssert.IsOrdered( IEnumerable collection, string message,
-          params object[] args );
-		  
-CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer );
-CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
-          string message );
-CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
-          string message, params object[] args );
-</pre></div>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li id="current"><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>CollectionAssert (NUnit 2.4 / 2.5)</h2>
+<p>The CollectionAssert class provides a number of methods that are useful 
+when examining collections and their contents or for comparing two collections.</p>
+
+<p>The <b>AreEqual</b> overloads succeed if the corresponding elements of the two 
+collections are equal. <b>AreEquivalent</b> tests whether the collection contents
+are equal, but without regard to order. In both cases, elements are compared using 
+NUnit's default equality comparison.</p>
+
+<p>Beginning with NUnit 2.4.6, these methods may be used on any object that
+implements IEnumerable. Prior to 2.4.6, only true collections were supported.
+
+<div class="code" style="width: 38em">
+<pre>CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection,
+          Type expectedType );
+CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection,
+          Type expectedType, string message );
+CollectionAssert.AllItemsAreInstancesOfType( IEnumerable collection,
+          Type expectedType, string message, params object[] args );
+
+CollectionAssert.AllItemsAreNotNull( IEnumerable collection );
+CollectionAssert.AllItemsAreNotNull( IEnumerable collection,
+          string message );
+CollectionAssert.AllItemsAreNotNull( IEnumerable collection,
+          string message, params object[] args );
+
+CollectionAssert.AllItemsAreUnique( IEnumerable collection );
+CollectionAssert.AllItemsAreUnique( IEnumerable collection,
+          string message );
+CollectionAssert.AllItemsAreUnique( IEnumerable collection,
+          string message, params object[] args );
+
+CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual );
+CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual,
+          string message );
+CollectionAssert.AreEqual( IEnumerable expected, IEnumerable actual
+          string message, params object[] args );
+
+CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual);
+CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual,
+          string message );
+CollectionAssert.AreEquivalent( IEnumerable expected, IEnumerable actual
+          string message, params object[] args );
+
+CollectionAssert.AreNotEqual( IEnumerable expected, IEnumerable actual );
+CollectionAssert.AreNotEqual( IEnumerable expected, IEnumerable actual,
+          string message );
+CollectionAssert.AreNotEqual( IEnumerableon expected, IEnumerable actual
+          string message, params object[] args );
+
+CollectionAssert.AreNotEquivalent( IEnumerable expected,
+          IEnumerable actual );
+CollectionAssert.AreNotEquivalent( IEnumerable expected,
+          IEnumerable actual, string message );
+CollectionAssert.AreNotEquivalent( IEnumerable expected,
+          IEnumerable actual, string message, params object[] args );
+
+CollectionAssert.Contains( IEnumerable expected, object actual );
+CollectionAssert.Contains( IEnumerable expected, object actual,
+          string message );
+CollectionAssert.Contains( IEnumerable expected, object actual
+          string message, params object[] args );
+
+CollectionAssert.DoesNotContain( IEnumerable expected, object actual );
+CollectionAssert.DoesNotContain( IEnumerable expected, object actual,
+          string message );
+CollectionAssert.DoesNotContain( IEnumerable expected, object actual
+          string message, params object[] args );
+
+CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset );
+CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset,
+          string message );
+CollectionAssert.IsSubsetOf( IEnumerable subset, IEnumerable superset,
+          string message, params object[] args );
+
+CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset);
+CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset,
+          string message );
+CollectionAssert.IsNotSubsetOf( IEnumerable subset, IEnumerable superset,
+          string message, params object[] args );
+
+CollectionAssert.IsEmpty( IEnumerable collection );
+CollectionAssert.IsEmpty( IEnumerable collection, string message );
+CollectionAssert.IsEmpty( IEnumerable collection, string message,
+          params object[] args );
+
+CollectionAssert.IsNotEmpty( IEnumerable collection );
+CollectionAssert.IsNotEmpty( IEnumerable collection, string message );
+CollectionAssert.IsNotEmpty( IEnumerable collection, string message,
+          params object[] args );
+</pre></div>
+		 
+<p>The following methods are available beginning with NUnit 2.5
+
+<div class="code" style="width: 38em"><pre>
+CollectionAssert.IsOrdered( IEnumerable collection );
+CollectionAssert.IsOrdered( IEnumerable collection, string message );
+CollectionAssert.IsOrdered( IEnumerable collection, string message,
+          params object[] args );
+		  
+CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer );
+CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
+          string message );
+CollectionAssert.IsOrdered( IEnumerable collection, IComparer comparer,
+          string message, params object[] args );
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li id="current"><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/collectionConstraints.html b/doc/collectionConstraints.html
index 9473a0a..3d149f9 100644
--- a/doc/collectionConstraints.html
+++ b/doc/collectionConstraints.html
@@ -1,30 +1,30 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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">
-
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
 <h2>Collection Constraints (NUnit 2.4 / 2.5)</h2>
 
 <p>Collection constraints perform tests that are specific to collections.
@@ -309,60 +309,64 @@ Assert.That( sarray2, Is.Ordered.By("Length");
 same modifier is used more than once, the result is undefined.
 <li>The syntax of Is.Ordered has changed from earlier betas.
 </ol>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li id="current"><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li id="current"><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/combinatorial.html b/doc/combinatorial.html
index e6f3f3b..560a65a 100644
--- a/doc/combinatorial.html
+++ b/doc/combinatorial.html
@@ -1,138 +1,138 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Combinatorial</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Combinatorial</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>CombinatorialAttribute (NUnit 2.5)</h3>
-
-<p>The <b>CombinatorialAttribute</b> is used on a test to specify that NUnit should
-   generate test cases for all possible combinations of the individual
-   data items provided for the parameters of a test. Since this is the
-   default, use of this attribute is optional.
-   
-<h4>Example</h4>
-
-<p>The following test will be executed six times, as follows:
-<pre>
-	MyTest(1, "A")
-	MyTest(1, "B")
-	MyTest(2, "A")
-	MyTest(2, "B")
-	MyTest(3, "A")
-	MyTest(3, "B")
-</pre>
-<div class="code"><pre>
-[Test, Combinatorial]
-public void MyTest(
-    [Values(1,2,3)] int x,
-    [Values("A","B")] string s)
-{
-    ...
-}
-</pre></div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="sequential.html">SequentialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>CombinatorialAttribute (NUnit 2.5)</h3>
+
+<p>The <b>CombinatorialAttribute</b> is used on a test to specify that NUnit should
+   generate test cases for all possible combinations of the individual
+   data items provided for the parameters of a test. Since this is the
+   default, use of this attribute is optional.
+   
+<h4>Example</h4>
+
+<p>The following test will be executed six times, as follows:
+<pre>
+	MyTest(1, "A")
+	MyTest(1, "B")
+	MyTest(2, "A")
+	MyTest(2, "B")
+	MyTest(3, "A")
+	MyTest(3, "B")
+</pre>
+<div class="code"><pre>
+[Test, Combinatorial]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Values("A","B")] string s)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="sequential.html">SequentialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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>
+<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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/comparisonAsserts.html b/doc/comparisonAsserts.html
index f12bd1f..0554c21 100644
--- a/doc/comparisonAsserts.html
+++ b/doc/comparisonAsserts.html
@@ -1,280 +1,284 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Comparisons (NUnit 2.2.4)</h2>
-
-<p>The following methods test whether one object is greater than than another.
-   Contrary to the normal order of Asserts, these methods are designed to be
-   read in the "natural" English-language or mathematical order. Thus 
-   <b>Assert.Greater( x, y )</b> asserts that x is greater than y ( x > y ). </p>
-   
-<div class="code" style="width: 36em" >
-<pre>Assert.Greater( int arg1, int arg2 );
-Assert.Greater( int arg1, int arg2, string message );
-Assert.Greater( int arg1, int arg2, string message, 
-                object[] parms );
-
-Assert.Greater( uint arg1, uint arg2 );
-Assert.Greater( uint arg1, uint arg2, string message );
-Assert.Greater( uint arg1, uint arg2, string message, 
-                object[] parms );
-
-Assert.Greater( long arg1, long arg2 );
-Assert.Greater( long arg1, long arg2, string message );
-Assert.Greater( long arg1, long arg2, string message, 
-                object[] parms );
-
-Assert.Greater( ulong arg1, ulong arg2 );
-Assert.Greater( ulong arg1, ulong arg2, string message );
-Assert.Greater( ulong arg1, ulong arg2, string message, 
-                object[] parms );
-
-Assert.Greater( decimal arg1, decimal arg2 );
-Assert.Greater( decimal arg1, decimal arg2, string message );
-Assert.Greater( decimal arg1, decimal arg2, string message, 
-                object[] parms );
-
-Assert.Greater( double arg1, double arg2 );
-Assert.Greater( double arg1, double arg2, string message );
-Assert.Greater( double arg1, double arg2, string message, 
-                object[] parms );
-
-Assert.Greater( double arg1, double arg2 );
-Assert.Greater( double arg1, double arg2, string message );
-Assert.Greater( double arg1, double arg2, string message, 
-                object[] parms );
-
-Assert.Greater( float arg1, float arg2 );
-Assert.Greater( float arg1, float arg2, string message );
-Assert.Greater( float arg1, float arg2, string message, 
-                object[] parms );
-
-Assert.Greater( IComparable arg1, IComparable arg2 );
-Assert.Greater( IComparable arg1, IComparable arg2, string message );
-Assert.Greater( IComparable arg1, IComparable arg2, string message, 
-                object[] parms );</pre>
-</div>
-				
-<p>The following methods test whether one object is greater than or equal to another.
-   Contrary to the normal order of Asserts, these methods are designed to be
-   read in the "natural" English-language or mathematical order. Thus 
-   <b>Assert.GreaterOrEqual( x, y )</b> asserts that x is greater than or equal to y ( x >= y ). </p>
-   
-<div class="code" style="width: 36em" >
-<pre>Assert.GreaterOrEqual( int arg1, int arg2 );
-Assert.GreaterOrEqual( int arg1, int arg2, string message );
-Assert.GreaterOrEqual( int arg1, int arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( uint arg1, uint arg2 );
-Assert.GreaterOrEqual( uint arg1, uint arg2, string message );
-Assert.GreaterOrEqual( uint arg1, uint arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( long arg1, long arg2 );
-Assert.GreaterOrEqual( long arg1, long arg2, string message );
-Assert.GreaterOrEqual( long arg1, long arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( ulong arg1, ulong arg2 );
-Assert.GreaterOrEqual( ulong arg1, ulong arg2, string message );
-Assert.GreaterOrEqual( ulong arg1, ulong arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( decimal arg1, decimal arg2 );
-Assert.GreaterOrEqual( decimal arg1, decimal arg2, string message );
-Assert.GreaterOrEqual( decimal arg1, decimal arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( double arg1, double arg2 );
-Assert.GreaterOrEqual( double arg1, double arg2, string message );
-Assert.GreaterOrEqual( double arg1, double arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( double arg1, double arg2 );
-Assert.GreaterOrEqual( double arg1, double arg2, string message );
-Assert.GreaterOrEqual( double arg1, double arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( float arg1, float arg2 );
-Assert.GreaterOrEqual( float arg1, float arg2, string message );
-Assert.GreaterOrEqual( float arg1, float arg2, string message, 
-                object[] parms );
-
-Assert.GreaterOrEqual( IComparable arg1, IComparable arg2 );
-Assert.GreaterOrEqual( IComparable arg1, IComparable arg2, string message );
-Assert.GreaterOrEqual( IComparable arg1, IComparable arg2, string message, 
-                object[] parms );</pre>
-</div>
-				
-<p>The following methods test whether one object is less than than another.
-   Contrary to the normal order of Asserts, these methods are designed to be
-   read in the "natural" English-language or mathematical order. Thus 
-   <b>Assert.Less( x, y )</b> asserts that x is less than y ( x < y ). </p>
-   
-<div class="code" style="width: 36em" >
-<pre>Assert.Less( int arg1, int arg2 );
-Assert.Less( int arg1, int arg2, string message );
-Assert.Less( int arg1, int arg2, string message, 
-                object[] parms );
-				
-Assert.Less( uint arg1, uint arg2 );
-Assert.Less( uint arg1, uint arg2, string message );
-Assert.Less( uint arg1, uint arg2, string message, 
-                object[] parms );
-				
-Assert.Less( long arg1, long arg2 );
-Assert.Less( long arg1, long arg2, string message );
-Assert.Less( long arg1, long arg2, string message, 
-                object[] parms );
-
-Assert.Less( ulong arg1, ulong arg2 );
-Assert.Less( ulong arg1, ulong arg2, string message );
-Assert.Less( ulong arg1, ulong arg2, string message, 
-                object[] parms );
-
-Assert.Less( decimal arg1, decimal arg2 );
-Assert.Less( decimal arg1, decimal arg2, string message );
-Assert.Less( decimal arg1, decimal arg2, string message, 
-                object[] parms );
-				
-Assert.Less( double arg1, double arg2 );
-Assert.Less( double arg1, double arg2, string message );
-Assert.Less( double arg1, double arg2, string message, 
-                object[] parms );
-				
-Assert.Less( float arg1, float arg2 );
-Assert.Less( float arg1, float arg2, string message );
-Assert.Less( float arg1, float arg2, string message, 
-                object[] parms );
-				
-Assert.Less( IComparable arg1, IComparable arg2 );
-Assert.Less( IComparable arg1, IComparable arg2, string message );
-Assert.Less( IComparable arg1, IComparable arg2, string message, 
-                object[] parms );</pre>
-</div>
-
-<p>The following methods test whether one object is less than or equal to another.
-   Contrary to the normal order of Asserts, these methods are designed to be
-   read in the "natural" English-language or mathematical order. Thus 
-   <b>Assert.LessOrEqual( x, y )</b> asserts that x is less than or equal to y ( x <= y ). </p>
-   
-<div class="code" style="width: 36em" >
-<pre>Assert.LessOrEqual( int arg1, int arg2 );
-Assert.LessOrEqual( int arg1, int arg2, string message );
-Assert.LessOrEqual( int arg1, int arg2, string message, 
-                object[] parms );
-				
-Assert.LessOrEqual( uint arg1, uint arg2 );
-Assert.LessOrEqual( uint arg1, uint arg2, string message );
-Assert.LessOrEqual( uint arg1, uint arg2, string message, 
-                object[] parms );
-				
-Assert.LessOrEqual( long arg1, long arg2 );
-Assert.LessOrEqual( long arg1, long arg2, string message );
-Assert.LessOrEqual( long arg1, long arg2, string message, 
-                object[] parms );
-
-Assert.LessOrEqual( ulong arg1, ulong arg2 );
-Assert.LessOrEqual( ulong arg1, ulong arg2, string message );
-Assert.LessOrEqual( ulong arg1, ulong arg2, string message, 
-                object[] parms );
-
-Assert.LessOrEqual( decimal arg1, decimal arg2 );
-Assert.LessOrEqual( decimal arg1, decimal arg2, string message );
-Assert.LessOrEqual( decimal arg1, decimal arg2, string message, 
-                object[] parms );
-				
-Assert.LessOrEqual( double arg1, double arg2 );
-Assert.LessOrEqual( double arg1, double arg2, string message );
-Assert.LessOrEqual( double arg1, double arg2, string message, 
-                object[] parms );
-				
-Assert.LessOrEqual( float arg1, float arg2 );
-Assert.LessOrEqual( float arg1, float arg2, string message );
-Assert.LessOrEqual( float arg1, float arg2, string message, 
-                object[] parms );
-				
-Assert.LessOrEqual( IComparable arg1, IComparable arg2 );
-Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message );
-Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message, 
-                object[] parms );</pre>
-</div>
-
-</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>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li id="current"><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Comparisons (NUnit 2.2.4)</h2>
+
+<p>The following methods test whether one object is greater than than another.
+   Contrary to the normal order of Asserts, these methods are designed to be
+   read in the "natural" English-language or mathematical order. Thus 
+   <b>Assert.Greater( x, y )</b> asserts that x is greater than y ( x > y ). </p>
+   
+<div class="code" style="width: 36em" >
+<pre>Assert.Greater( int arg1, int arg2 );
+Assert.Greater( int arg1, int arg2, string message );
+Assert.Greater( int arg1, int arg2, string message, 
+                object[] parms );
+
+Assert.Greater( uint arg1, uint arg2 );
+Assert.Greater( uint arg1, uint arg2, string message );
+Assert.Greater( uint arg1, uint arg2, string message, 
+                object[] parms );
+
+Assert.Greater( long arg1, long arg2 );
+Assert.Greater( long arg1, long arg2, string message );
+Assert.Greater( long arg1, long arg2, string message, 
+                object[] parms );
+
+Assert.Greater( ulong arg1, ulong arg2 );
+Assert.Greater( ulong arg1, ulong arg2, string message );
+Assert.Greater( ulong arg1, ulong arg2, string message, 
+                object[] parms );
+
+Assert.Greater( decimal arg1, decimal arg2 );
+Assert.Greater( decimal arg1, decimal arg2, string message );
+Assert.Greater( decimal arg1, decimal arg2, string message, 
+                object[] parms );
+
+Assert.Greater( double arg1, double arg2 );
+Assert.Greater( double arg1, double arg2, string message );
+Assert.Greater( double arg1, double arg2, string message, 
+                object[] parms );
+
+Assert.Greater( double arg1, double arg2 );
+Assert.Greater( double arg1, double arg2, string message );
+Assert.Greater( double arg1, double arg2, string message, 
+                object[] parms );
+
+Assert.Greater( float arg1, float arg2 );
+Assert.Greater( float arg1, float arg2, string message );
+Assert.Greater( float arg1, float arg2, string message, 
+                object[] parms );
+
+Assert.Greater( IComparable arg1, IComparable arg2 );
+Assert.Greater( IComparable arg1, IComparable arg2, string message );
+Assert.Greater( IComparable arg1, IComparable arg2, string message, 
+                object[] parms );</pre>
+</div>
+				
+<p>The following methods test whether one object is greater than or equal to another.
+   Contrary to the normal order of Asserts, these methods are designed to be
+   read in the "natural" English-language or mathematical order. Thus 
+   <b>Assert.GreaterOrEqual( x, y )</b> asserts that x is greater than or equal to y ( x >= y ). </p>
+   
+<div class="code" style="width: 36em" >
+<pre>Assert.GreaterOrEqual( int arg1, int arg2 );
+Assert.GreaterOrEqual( int arg1, int arg2, string message );
+Assert.GreaterOrEqual( int arg1, int arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( uint arg1, uint arg2 );
+Assert.GreaterOrEqual( uint arg1, uint arg2, string message );
+Assert.GreaterOrEqual( uint arg1, uint arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( long arg1, long arg2 );
+Assert.GreaterOrEqual( long arg1, long arg2, string message );
+Assert.GreaterOrEqual( long arg1, long arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( ulong arg1, ulong arg2 );
+Assert.GreaterOrEqual( ulong arg1, ulong arg2, string message );
+Assert.GreaterOrEqual( ulong arg1, ulong arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( decimal arg1, decimal arg2 );
+Assert.GreaterOrEqual( decimal arg1, decimal arg2, string message );
+Assert.GreaterOrEqual( decimal arg1, decimal arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( double arg1, double arg2 );
+Assert.GreaterOrEqual( double arg1, double arg2, string message );
+Assert.GreaterOrEqual( double arg1, double arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( double arg1, double arg2 );
+Assert.GreaterOrEqual( double arg1, double arg2, string message );
+Assert.GreaterOrEqual( double arg1, double arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( float arg1, float arg2 );
+Assert.GreaterOrEqual( float arg1, float arg2, string message );
+Assert.GreaterOrEqual( float arg1, float arg2, string message, 
+                object[] parms );
+
+Assert.GreaterOrEqual( IComparable arg1, IComparable arg2 );
+Assert.GreaterOrEqual( IComparable arg1, IComparable arg2, string message );
+Assert.GreaterOrEqual( IComparable arg1, IComparable arg2, string message, 
+                object[] parms );</pre>
+</div>
+				
+<p>The following methods test whether one object is less than than another.
+   Contrary to the normal order of Asserts, these methods are designed to be
+   read in the "natural" English-language or mathematical order. Thus 
+   <b>Assert.Less( x, y )</b> asserts that x is less than y ( x < y ). </p>
+   
+<div class="code" style="width: 36em" >
+<pre>Assert.Less( int arg1, int arg2 );
+Assert.Less( int arg1, int arg2, string message );
+Assert.Less( int arg1, int arg2, string message, 
+                object[] parms );
+				
+Assert.Less( uint arg1, uint arg2 );
+Assert.Less( uint arg1, uint arg2, string message );
+Assert.Less( uint arg1, uint arg2, string message, 
+                object[] parms );
+				
+Assert.Less( long arg1, long arg2 );
+Assert.Less( long arg1, long arg2, string message );
+Assert.Less( long arg1, long arg2, string message, 
+                object[] parms );
+
+Assert.Less( ulong arg1, ulong arg2 );
+Assert.Less( ulong arg1, ulong arg2, string message );
+Assert.Less( ulong arg1, ulong arg2, string message, 
+                object[] parms );
+
+Assert.Less( decimal arg1, decimal arg2 );
+Assert.Less( decimal arg1, decimal arg2, string message );
+Assert.Less( decimal arg1, decimal arg2, string message, 
+                object[] parms );
+				
+Assert.Less( double arg1, double arg2 );
+Assert.Less( double arg1, double arg2, string message );
+Assert.Less( double arg1, double arg2, string message, 
+                object[] parms );
+				
+Assert.Less( float arg1, float arg2 );
+Assert.Less( float arg1, float arg2, string message );
+Assert.Less( float arg1, float arg2, string message, 
+                object[] parms );
+				
+Assert.Less( IComparable arg1, IComparable arg2 );
+Assert.Less( IComparable arg1, IComparable arg2, string message );
+Assert.Less( IComparable arg1, IComparable arg2, string message, 
+                object[] parms );</pre>
+</div>
+
+<p>The following methods test whether one object is less than or equal to another.
+   Contrary to the normal order of Asserts, these methods are designed to be
+   read in the "natural" English-language or mathematical order. Thus 
+   <b>Assert.LessOrEqual( x, y )</b> asserts that x is less than or equal to y ( x <= y ). </p>
+   
+<div class="code" style="width: 36em" >
+<pre>Assert.LessOrEqual( int arg1, int arg2 );
+Assert.LessOrEqual( int arg1, int arg2, string message );
+Assert.LessOrEqual( int arg1, int arg2, string message, 
+                object[] parms );
+				
+Assert.LessOrEqual( uint arg1, uint arg2 );
+Assert.LessOrEqual( uint arg1, uint arg2, string message );
+Assert.LessOrEqual( uint arg1, uint arg2, string message, 
+                object[] parms );
+				
+Assert.LessOrEqual( long arg1, long arg2 );
+Assert.LessOrEqual( long arg1, long arg2, string message );
+Assert.LessOrEqual( long arg1, long arg2, string message, 
+                object[] parms );
+
+Assert.LessOrEqual( ulong arg1, ulong arg2 );
+Assert.LessOrEqual( ulong arg1, ulong arg2, string message );
+Assert.LessOrEqual( ulong arg1, ulong arg2, string message, 
+                object[] parms );
+
+Assert.LessOrEqual( decimal arg1, decimal arg2 );
+Assert.LessOrEqual( decimal arg1, decimal arg2, string message );
+Assert.LessOrEqual( decimal arg1, decimal arg2, string message, 
+                object[] parms );
+				
+Assert.LessOrEqual( double arg1, double arg2 );
+Assert.LessOrEqual( double arg1, double arg2, string message );
+Assert.LessOrEqual( double arg1, double arg2, string message, 
+                object[] parms );
+				
+Assert.LessOrEqual( float arg1, float arg2 );
+Assert.LessOrEqual( float arg1, float arg2, string message );
+Assert.LessOrEqual( float arg1, float arg2, string message, 
+                object[] parms );
+				
+Assert.LessOrEqual( IComparable arg1, IComparable arg2 );
+Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message );
+Assert.LessOrEqual( IComparable arg1, IComparable arg2, string message, 
+                object[] parms );</pre>
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li id="current"><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/comparisonConstraints.html b/doc/comparisonConstraints.html
index 7e12583..ae79860 100644
--- a/doc/comparisonConstraints.html
+++ b/doc/comparisonConstraints.html
@@ -1,254 +1,258 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Comparison Constraints (NUnit 2.4 / 2.5)</h2>
-
-<p>Comparison constraints are able to test whether one value
-is greater or less than another. Comparison constraints work
-on numeric values, as well as other objects that implement the
-<b>IComparable</b> interface or - beginning with NUnit 2.5 - 
-<b>IComparable<T></b>.
-
-<p>Beginning with NUnit 2.5, you may supply your own comparison
-algorithm through the <b>Using</b> modifier.
-
-<h3>GreaterThanConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that one value is greater than another.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-GreaterThanConstraint(object expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.GreaterThan(object expected)
-Is.Positive // Equivalent to Is.GreaterThan(0)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...Using(IComparer comparer)
-...Using<T>(IComparer<T> comparer)
-...Using<T>(Comparison<T> comparer)
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That(7, Is.GreaterThan(3));
-Assert.That(myOwnObject, 
-    Is.GreaterThan(theExpected).Using(myComparer));
-Assert.That(42, Is.Positive);
-</pre></div>
-
-<h3>GreaterThanOrEqualConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that one value is greater than or equal to another.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-GreaterThanOrEqualConstraint(object expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.GreaterThanOrEqualTo(object expected)
-Is.AtLeast(object expected)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...Using(IComparer comparer)
-...Using<T>(IComparer<T> comparer)
-...Using<T>(Comparison<T> comparer)
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That(7, Is.GreaterThanOrEqualTo(3));
-Assert.That(7, Is.AtLeast(3));
-Assert.That(7, Is.GreaterThanOrEqualTo(7));
-Assert.That(7, Is.AtLeast(7));
-Assert.That(myOwnObject, 
-    Is.GreaterThanOrEqualTo(theExpected).Using(myComparer));
-</pre></div>
-
-<h3>LessThanConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that one value is less than another.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-LessThanConstraint(object expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.LessThan(object expected)
-Is.Negative // Equivalent to Is.LessThan(0)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...Using(IComparer comparer)
-...Using<T>(IComparer<T> comparer)
-...Using<T>(Comparison<T> comparer)
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That(3, Is.LessThan(7));
-Assert.That(myOwnObject, 
-    Is.LessThan(theExpected).Using(myComparer));
-Assert.That(-5, Is.Negative);
-</pre></div>
-
-<h3>LessThanOrEqualConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that one value is less than or equal to another.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-LessThanOrEqualConstraint(object expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.LessThanOrEqualTo(object expected)
-Is.AtMost(object expected)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...Using(IComparer comparer)
-...Using<T>(IComparer<T> comparer)
-...Using<T>(Comparison<T> comparer)
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That(3, Is.LessThanOrEqualTo(7));
-Assert.That(3, Is.AtMost(7));
-Assert.That(3, Is.LessThanOrEqualTo(3));
-Assert.That(3, Is.AtMost(3));
-Assert.That(myOwnObject, 
-    Is.LessThanOrEqualTo(theExpected).Using(myComparer));
-</pre></div>
-
-<h3>RangeConstraint</h3>
-
-<h4>Action</h4>
-<p>
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-RangeConstraint(IComparable from, IComparable to)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.InRange(IComparable from, IComparable to)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...Using(IComparer comparer)
-...Using<T>(IComparer<T> comparer)
-...Using<T>(Comparison<T> comparer)
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-int[] iarray = new int[] { 1, 2, 3 }
-
-Assert.That( 42, Is.InRange(1, 100) );
-Assert.That( iarray, Is.All.InRange(1, 3) );
-Assert.That(myOwnObject, 
-    Is.InRange(lowExpected, highExpected).Using(myComparer));
-</pre></div>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li id="current"><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Comparison Constraints (NUnit 2.4 / 2.5)</h2>
+
+<p>Comparison constraints are able to test whether one value
+is greater or less than another. Comparison constraints work
+on numeric values, as well as other objects that implement the
+<b>IComparable</b> interface or - beginning with NUnit 2.5 - 
+<b>IComparable<T></b>.
+
+<p>Beginning with NUnit 2.5, you may supply your own comparison
+algorithm through the <b>Using</b> modifier.
+
+<h3>GreaterThanConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is greater than another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+GreaterThanConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.GreaterThan(object expected)
+Is.Positive // Equivalent to Is.GreaterThan(0)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That(7, Is.GreaterThan(3));
+Assert.That(myOwnObject, 
+    Is.GreaterThan(theExpected).Using(myComparer));
+Assert.That(42, Is.Positive);
+</pre></div>
+
+<h3>GreaterThanOrEqualConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is greater than or equal to another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+GreaterThanOrEqualConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.GreaterThanOrEqualTo(object expected)
+Is.AtLeast(object expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That(7, Is.GreaterThanOrEqualTo(3));
+Assert.That(7, Is.AtLeast(3));
+Assert.That(7, Is.GreaterThanOrEqualTo(7));
+Assert.That(7, Is.AtLeast(7));
+Assert.That(myOwnObject, 
+    Is.GreaterThanOrEqualTo(theExpected).Using(myComparer));
+</pre></div>
+
+<h3>LessThanConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is less than another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+LessThanConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.LessThan(object expected)
+Is.Negative // Equivalent to Is.LessThan(0)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That(3, Is.LessThan(7));
+Assert.That(myOwnObject, 
+    Is.LessThan(theExpected).Using(myComparer));
+Assert.That(-5, Is.Negative);
+</pre></div>
+
+<h3>LessThanOrEqualConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one value is less than or equal to another.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+LessThanOrEqualConstraint(object expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.LessThanOrEqualTo(object expected)
+Is.AtMost(object expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That(3, Is.LessThanOrEqualTo(7));
+Assert.That(3, Is.AtMost(7));
+Assert.That(3, Is.LessThanOrEqualTo(3));
+Assert.That(3, Is.AtMost(3));
+Assert.That(myOwnObject, 
+    Is.LessThanOrEqualTo(theExpected).Using(myComparer));
+</pre></div>
+
+<h3>RangeConstraint</h3>
+
+<h4>Action</h4>
+<p>
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+RangeConstraint(IComparable from, IComparable to)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.InRange(IComparable from, IComparable to)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...Using(IComparer comparer)
+...Using<T>(IComparer<T> comparer)
+...Using<T>(Comparison<T> comparer)
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+int[] iarray = new int[] { 1, 2, 3 }
+
+Assert.That( 42, Is.InRange(1, 100) );
+Assert.That( iarray, Is.All.InRange(1, 3) );
+Assert.That(myOwnObject, 
+    Is.InRange(lowExpected, highExpected).Using(myComparer));
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li id="current"><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/compoundConstraints.html b/doc/compoundConstraints.html
index 523af9a..ee574c7 100644
--- a/doc/compoundConstraints.html
+++ b/doc/compoundConstraints.html
@@ -1,107 +1,111 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Compound Constraints (NUnit 2.4)</h2>
-
-<p>Compound constraints are used to combine other constraints in various ways.
-
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.Not...</td><td>NotConstraint( Constraint )</td><td>Negates or reverses the effect of a constraint</td></tr>
-<tr><td>Is.All...</td><td>AllItemsConstraint( Constraint )</td><td>Tests that all members of a collection match the constraint</td></tr>
-<tr><td>Constraint & Constraint</td><td>AndConstraint( Constraint, Constraint )</td><td>Tests that both of the constraints are met</td></tr>
-<tr><td>Constraint | Constraint</td><td>OrConstraint( Constraint, Constraint )</td><td>Tests that at least one of the constraints is met</td></tr>
-</table>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Assert.That( 2 + 2, Is.Not.EqualTo( 5 );
-Assert.That( new int[] { 1, 2, 3 }, Is.All.GreaterThan( 0 ) );
-Assert.That( 2.3, Is.GreaterThan( 2.0 ) & Is.LessThan( 3.0 ) );
-Assert.That( 3, Is.LessThan( 5 ) | Is.GreaterThan( 10 ) ); 
-
-// Using inheritance
-Expect( 2 + 2, Not.EqualTo( 5 ) );
-Expect( 2.3, GreaterThan( 2.0 ) & LessThan( 3.0 ) );
-</pre></div>
-</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>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li id="current"><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Compound Constraints (NUnit 2.4)</h2>
+
+<p>Compound constraints are used to combine other constraints in various ways.
+
+<table class="constraints">
+<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
+<tr><td>Is.Not...</td><td>NotConstraint( Constraint )</td><td>Negates or reverses the effect of a constraint</td></tr>
+<tr><td>Is.All...</td><td>AllItemsConstraint( Constraint )</td><td>Tests that all members of a collection match the constraint</td></tr>
+<tr><td>Constraint & Constraint</td><td>AndConstraint( Constraint, Constraint )</td><td>Tests that both of the constraints are met</td></tr>
+<tr><td>Constraint | Constraint</td><td>OrConstraint( Constraint, Constraint )</td><td>Tests that at least one of the constraints is met</td></tr>
+</table>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( 2 + 2, Is.Not.EqualTo( 5 );
+Assert.That( new int[] { 1, 2, 3 }, Is.All.GreaterThan( 0 ) );
+Assert.That( 2.3, Is.GreaterThan( 2.0 ) & Is.LessThan( 3.0 ) );
+Assert.That( 3, Is.LessThan( 5 ) | Is.GreaterThan( 10 ) ); 
+
+// Using inheritance
+Expect( 2 + 2, Not.EqualTo( 5 ) );
+Expect( 2.3, GreaterThan( 2.0 ) & LessThan( 3.0 ) );
+</pre></div>
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li id="current"><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/conditionAsserts.html b/doc/conditionAsserts.html
index a81d1c5..e23e5c1 100644
--- a/doc/conditionAsserts.html
+++ b/doc/conditionAsserts.html
@@ -1,153 +1,157 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Condition Asserts</h2>
-
-<p>Methods that test a specific condition are named for the condition they test and 
-	take the value tested as their first argument and, optionally a message as the 
-	second. The following methods are provided:</p>
-<div class="code" style="width: 36em">
-<pre>Assert.IsTrue( bool condition );
-Assert.IsTrue( bool condition, string message );
-Assert.IsTrue( bool condition, string message, object[] parms );
-
-Assert.True( bool condition );
-Assert.True( bool condition, string message );
-Assert.True( bool condition, string message, object[] parms );
-
-Assert.IsFalse( bool condition);
-Assert.IsFalse( bool condition, string message );
-Assert.IsFalse( bool condition, string message, object[] parms );
-
-Assert.False( bool condition);
-Assert.False( bool condition, string message );
-Assert.False( bool condition, string message, object[] parms );
-
-Assert.IsNull( object anObject );
-Assert.IsNull( object anObject, string message );
-Assert.IsNull( object anObject, string message, object[] parms );
-
-Assert.Null( object anObject );
-Assert.Null( object anObject, string message );
-Assert.Null( object anObject, string message, object[] parms );
-
-Assert.IsNotNull( object anObject );
-Assert.IsNotNull( object anObject, string message );
-Assert.IsNotNull( object anObject, string message, object[] parms );
-
-Assert.NotNull( object anObject );
-Assert.NotNull( object anObject, string message );
-Assert.NotNull( object anObject, string message, object[] parms );
-
-Assert.IsNaN( double aDouble );
-Assert.IsNaN( double aDouble, string message );
-Assert.IsNaN( double aDouble, string message, object[] parms );
-
-Assert.IsEmpty( string aString );
-Assert.IsEmpty( string aString, string message );
-Assert.IsEmpty( string aString, string message,
-          params object[] args );
-
-Assert.IsNotEmpty( string aString );
-Assert.IsNotEmpty( string aString, string message );
-Assert.IsNotEmpty( string aString, string message,
-          params object[] args );
-
-Assert.IsEmpty( ICollection collection );
-Assert.IsEmpty( ICollection collection, string message );
-Assert.IsEmpty( ICollection collection, string message,
-          params object[] args );
-
-Assert.IsNotEmpty( ICollection collection );
-Assert.IsNotEmpty( ICollection collection, string message );
-Assert.IsNotEmpty( ICollection collection, string message,
-          params object[] args );</pre>
-</div>
-
-<p>Two forms are provided for the True, False, Null and NotNull
-conditions. The "Is" forms are compatible with earlier versions
-of the NUnit framework, while those without "Is" are provided
-for compatibility with NUnitLite.
-
-<p>Assert.IsEmpty and Assert.IsNotEmpty may be used to test either a string
-or a collection.</p>
-
-
-
-</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>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li id="current"><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Condition Asserts</h2>
+
+<p>Methods that test a specific condition are named for the condition they test and 
+	take the value tested as their first argument and, optionally a message as the 
+	second. The following methods are provided:</p>
+<div class="code" style="width: 36em">
+<pre>Assert.IsTrue( bool condition );
+Assert.IsTrue( bool condition, string message );
+Assert.IsTrue( bool condition, string message, object[] parms );
+
+Assert.True( bool condition );
+Assert.True( bool condition, string message );
+Assert.True( bool condition, string message, object[] parms );
+
+Assert.IsFalse( bool condition);
+Assert.IsFalse( bool condition, string message );
+Assert.IsFalse( bool condition, string message, object[] parms );
+
+Assert.False( bool condition);
+Assert.False( bool condition, string message );
+Assert.False( bool condition, string message, object[] parms );
+
+Assert.IsNull( object anObject );
+Assert.IsNull( object anObject, string message );
+Assert.IsNull( object anObject, string message, object[] parms );
+
+Assert.Null( object anObject );
+Assert.Null( object anObject, string message );
+Assert.Null( object anObject, string message, object[] parms );
+
+Assert.IsNotNull( object anObject );
+Assert.IsNotNull( object anObject, string message );
+Assert.IsNotNull( object anObject, string message, object[] parms );
+
+Assert.NotNull( object anObject );
+Assert.NotNull( object anObject, string message );
+Assert.NotNull( object anObject, string message, object[] parms );
+
+Assert.IsNaN( double aDouble );
+Assert.IsNaN( double aDouble, string message );
+Assert.IsNaN( double aDouble, string message, object[] parms );
+
+Assert.IsEmpty( string aString );
+Assert.IsEmpty( string aString, string message );
+Assert.IsEmpty( string aString, string message,
+          params object[] args );
+
+Assert.IsNotEmpty( string aString );
+Assert.IsNotEmpty( string aString, string message );
+Assert.IsNotEmpty( string aString, string message,
+          params object[] args );
+
+Assert.IsEmpty( ICollection collection );
+Assert.IsEmpty( ICollection collection, string message );
+Assert.IsEmpty( ICollection collection, string message,
+          params object[] args );
+
+Assert.IsNotEmpty( ICollection collection );
+Assert.IsNotEmpty( ICollection collection, string message );
+Assert.IsNotEmpty( ICollection collection, string message,
+          params object[] args );</pre>
+</div>
+
+<p>Two forms are provided for the True, False, Null and NotNull
+conditions. The "Is" forms are compatible with earlier versions
+of the NUnit framework, while those without "Is" are provided
+for compatibility with NUnitLite.
+
+<p>Assert.IsEmpty and Assert.IsNotEmpty may be used to test either a string
+or a collection.</p>
+
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li id="current"><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/conditionConstraints.html b/doc/conditionConstraints.html
index 9d745f8..4607581 100644
--- a/doc/conditionConstraints.html
+++ b/doc/conditionConstraints.html
@@ -1,224 +1,228 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Condition Constraints (NUnit 2.4)</h2>
-
-<p>ConditionConstraints test a specific condition and are named for the condition 
-   they test. They verify that the actual value satisfies the condition. The
-   following condition helpers are provided.
-   
-<h3>NullConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that a value is Null.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-NullConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.Null
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That( anObject, Is.Null );
-Assert.That( anObject, Is.Not.Null );
-</pre></div>
-
-<h3>TrueConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that a value is true.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-TrueConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.True
-</pre></div>
-
-<h4>Example of Use</h4>
-<div class="code"><pre>
-Assert.That( condition, Is.True );
-</pre></div>
-
-<h3>FalseConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that a value is false.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-FalseConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.False
-</pre></div>
-
-<h4>Example of Use</h4>
-<div class="code"><pre>
-Assert.That( condition, Is.False );
-</pre></div>
-
-<h3>NaNConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that a value is floating-point NaN.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-NaNConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.NaN
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That( aDouble, Is.NaN );
-Assert.That( aDouble, Is.Not.NaN );
-</pre></div>
-
-<h3>EmptyConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that an object is an empty string, directory or collection.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-EmptyConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.Empty
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That( aString, Is.Empty );
-Assert.Thst( dirInfo, Is.Empty );
-Assert.That( collection, Is.Empty );
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li><b>EmptyConstraint</b> creates and uses either an <b>EmptyStringConstraint</b>,
-<b>EmptyDirectoryConstraint</b> or <b>EmptyCollectionConstraint</b> depending on 
-the argument tested.
-<li>A <b>DirectoryInfo</b> argument is required in order to test for an empty directory.
-To test whether a string represents a directory path, you must first construct
-a <b>DirectoryInfo</b>.
-</ol>
-
-<h3>UniqueItemsConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that an array, collection or other IEnumerable is composed
-of unique items with no duplicates.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-UniqueItemsConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.Unique
-</pre></div>
-
-<h4>Example of Use</h4>
-
-<div class="code"><pre>
-Assert.That( collection, Is.Unique );
-</pre></div>
-</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>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li id="current"><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Condition Constraints (NUnit 2.4)</h2>
+
+<p>ConditionConstraints test a specific condition and are named for the condition 
+   they test. They verify that the actual value satisfies the condition. The
+   following condition helpers are provided.
+   
+<h3>NullConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is Null.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+NullConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Null
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That( anObject, Is.Null );
+Assert.That( anObject, Is.Not.Null );
+</pre></div>
+
+<h3>TrueConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is true.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+TrueConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.True
+</pre></div>
+
+<h4>Example of Use</h4>
+<div class="code"><pre>
+Assert.That( condition, Is.True );
+</pre></div>
+
+<h3>FalseConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is false.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+FalseConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.False
+</pre></div>
+
+<h4>Example of Use</h4>
+<div class="code"><pre>
+Assert.That( condition, Is.False );
+</pre></div>
+
+<h3>NaNConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a value is floating-point NaN.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+NaNConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.NaN
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That( aDouble, Is.NaN );
+Assert.That( aDouble, Is.Not.NaN );
+</pre></div>
+
+<h3>EmptyConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that an object is an empty string, directory or collection.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+EmptyConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Empty
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That( aString, Is.Empty );
+Assert.Thst( dirInfo, Is.Empty );
+Assert.That( collection, Is.Empty );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>EmptyConstraint</b> creates and uses either an <b>EmptyStringConstraint</b>,
+<b>EmptyDirectoryConstraint</b> or <b>EmptyCollectionConstraint</b> depending on 
+the argument tested.
+<li>A <b>DirectoryInfo</b> argument is required in order to test for an empty directory.
+To test whether a string represents a directory path, you must first construct
+a <b>DirectoryInfo</b>.
+</ol>
+
+<h3>UniqueItemsConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that an array, collection or other IEnumerable is composed
+of unique items with no duplicates.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+UniqueItemsConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.Unique
+</pre></div>
+
+<h4>Example of Use</h4>
+
+<div class="code"><pre>
+Assert.That( collection, Is.Unique );
+</pre></div>
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li id="current"><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/configEditor.html b/doc/configEditor.html
index a4992ce..088fef6 100644
--- a/doc/configEditor.html
+++ b/doc/configEditor.html
@@ -1,109 +1,110 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Configuration Editor</h2>
-
-<p>The Configuration Editor is displayed using the Project | Configuration | Edit� menu item and
-supports the following operations:</p>
-
-<div class="screenshot-right">
-   <img src="img/configEditor.jpg"></div>
-
-<h3>Remove</h3>
-<p>Remove the selected configuration. If it was
-the active config, then the next one in the list
-is made active.</p>
-
-<h3>Rename</h3>
-<p>Rename the selected configuration.</p>
-
-<h3>Add�</h3>
-<p>Add a new configuration. The Add
-Configuration dialog allows specifying an
-existing configuration to use as a template.</p>
-
-<h3>Make Active</h3>
-<p>Makes the selected configuration active.</p>
-
-<h3>Close</h3>
-<p>Exits the configuration editor</p>
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li id="current"><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Configuration Editor</h2>
+
+<p>The Configuration Editor is displayed using the Project | Configuration | Edit� menu item and
+supports the following operations:</p>
+
+<div class="screenshot-right">
+   <img src="img/configEditor.jpg"></div>
+
+<h3>Remove</h3>
+<p>Remove the selected configuration. If it was
+the active config, then the next one in the list
+is made active.</p>
+
+<h3>Rename</h3>
+<p>Rename the selected configuration.</p>
+
+<h3>Add�</h3>
+<p>Add a new configuration. The Add
+Configuration dialog allows specifying an
+existing configuration to use as a template.</p>
+
+<h3>Make Active</h3>
+<p>Makes the selected configuration active.</p>
+
+<h3>Close</h3>
+<p>Exits the configuration editor</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li id="current"><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/configFiles.html b/doc/configFiles.html
index 63b8021..9e31668 100644
--- a/doc/configFiles.html
+++ b/doc/configFiles.html
@@ -1,137 +1,138 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Configuration Files</h2>
-
-<p>NUnit uses configuration files for the test runner executable � either nunit-console.exe or
-nunitgui.exe � as well as for the tests being run. Only settings that pertain to NUnit itself should be in
-the nunit-console.exe.config and nunit-gui.exe.config, while those that pertain to your own
-application and tests should be in a separate configuration file.</p>
-
-<h3>NUnit Configuration Files</h3>
-
-<p>One main purpose of the nunit-console and nunit-gui config files is to allow 
-NUnit to run with various versions of the .NET framework. NUnit is built using
-versions 1.1 and 2.0 of the framework. The two builds are provided as separate
-downloads and either build can be made to run against other versions of the CLR.</p>
- 
-<p>As delivered, the <startup> section of each config file is commented out,
-causing NUnit to run with the version of .NET used to build it. If you uncomment 
-the <startup> section, the entries there control the order in which alternate 
-framework versions are selected.</p>
-
-<h3>Test Configuration File</h3>
-
-<p>When a configuration file is used to provide settings or to control the environment in which a test
-is run, specific naming conventions must be followed.</p>
-
-<p>If a single assembly is being loaded, then the configuration file is given the name of the assembly
-file with the config extension. For example, the configuration file used to run nunit.tests.dll must
-be named nunit.tests.dll.config and located in the same directory as the dll.</p>
-
-<p>If an NUnit project is being loaded into a single AppDomain, the configuration file uses the 
-name of the project file with the extension <i>changed</i> to config. For example, the project 
-AllTests.nunit would require a configuration file named AllTests.config, located in the same 
-directory as AllTests.nunit. The same rule is followed when loading Visual Studio projects or solutions.</p>
-
-<blockquote>
-<p><b>Note:</b> The above only applies if a single AppDomain is being used. If an NUnit 
-project is loaded using a separate AppDomain for each assembly, then the individual
-configuration files for each of the assemblies are used.
-</blockquote>
-
-<p>Generally, you should be able to simply copy your application config file and rename it as
-described above.</p>
-
-<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 following recommendations are provided in the case of each of the settings
-that are no longer available:
-
-<h4>OldStyleTestCases</h4>
-<p>NUnit no longer recognizes test methods without attributes.Use <b>TestAttribute</b>.
-
-<h4>ApartmentState</h4>
-<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>This is no longer supported.
-
-<h4>DefaultLogThreshold</h4>
-<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.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>
-<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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Configuration Files</h2>
+
+<p>NUnit uses configuration files for the test runner executable � either nunit-console.exe or
+nunitgui.exe � as well as for the tests being run. Only settings that pertain to NUnit itself should be in
+the nunit-console.exe.config and nunit-gui.exe.config, while those that pertain to your own
+application and tests should be in a separate configuration file.</p>
+
+<h3>NUnit Configuration Files</h3>
+
+<p>One main purpose of the nunit-console and nunit-gui config files is to allow 
+NUnit to run with various versions of the .NET framework. NUnit is built using
+versions 1.1 and 2.0 of the framework. The two builds are provided as separate
+downloads and either build can be made to run against other versions of the CLR.</p>
+ 
+<p>As delivered, the <startup> section of each config file is commented out,
+causing NUnit to run with the version of .NET used to build it. If you uncomment 
+the <startup> section, the entries there control the order in which alternate 
+framework versions are selected.</p>
+
+<h3>Test Configuration File</h3>
+
+<p>When a configuration file is used to provide settings or to control the environment in which a test
+is run, specific naming conventions must be followed.</p>
+
+<p>If a single assembly is being loaded, then the configuration file is given the name of the assembly
+file with the config extension. For example, the configuration file used to run nunit.tests.dll must
+be named nunit.tests.dll.config and located in the same directory as the dll.</p>
+
+<p>If an NUnit project is being loaded into a single AppDomain, the configuration file uses the 
+name of the project file with the extension <i>changed</i> to config. For example, the project 
+AllTests.nunit would require a configuration file named AllTests.config, located in the same 
+directory as AllTests.nunit. The same rule is followed when loading Visual Studio projects or solutions.</p>
+
+<blockquote>
+<p><b>Note:</b> The above only applies if a single AppDomain is being used. If an NUnit 
+project is loaded using a separate AppDomain for each assembly, then the individual
+configuration files for each of the assemblies are used.
+</blockquote>
+
+<p>Generally, you should be able to simply copy your application config file and rename it as
+described above.</p>
+
+<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 following recommendations are provided in the case of each of the settings
+that are no longer available:
+
+<h4>OldStyleTestCases</h4>
+<p>NUnit no longer recognizes test methods without attributes.Use <b>TestAttribute</b>.
+
+<h4>ApartmentState</h4>
+<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>This is no longer supported.
+
+<h4>DefaultLogThreshold</h4>
+<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.6.3</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>
+<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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/consoleCommandLine.html b/doc/consoleCommandLine.html
index cffe19a..5d7d4e5 100644
--- a/doc/consoleCommandLine.html
+++ b/doc/consoleCommandLine.html
@@ -1,399 +1,404 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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">
-
-<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 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 
-	must do this manually if this is the desired behavior.</p>
-<p><b>Note:</b> Under the Windows operating system, options may be prefixed by either
-    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>
-
-<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>
-
-<p>To run the tests in nunit.tests.dll through the Visual Studio project, use:</p>
-	<pre class="programtext">        nunit-console nunit.tests.csproj</pre>
-
-<p>To run the same tests through an NUnit test project you have defined, use:</p>
-	<pre class="programtext">        nunit-console nunit.tests.nunit</pre>
-
-<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 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 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.
-
-<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 
-	command:
-	<pre class="programtext">        nunit-console /fixture:NUnit.Tests.AssertionTests nunit.tests.dll</pre>
-</p>
-<p>The name specified after the <b>/fixture</b> option may be that of a TestFixture 
-	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>/test</b> option.
-	
-<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>
-
-<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><b>Note:</b> This option has no effect when loading an assembly directly.</p>
-
-<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 
-	runs only the tests in the BaseLine category:
-	<pre class="programtext">        nunit-console myassembly.dll /include:BaseLine</pre>
-</p>
-<p>The following command runs all tests <b>except</b> those in the Database 
-	category:
-	<pre class="programtext">        nunit-console myassembly.dll /exclude:Database</pre>
-</p>
-<p>
-Multiple categories may be specified on either option, by using commas to 
-separate them.
-<p><b>Notes:</b> Beginning with NUnit 2.4, the /include and /exclude options may
-   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
-<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>
-</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 (,)
-<li>Intersection and set subtraction operators (+ and binary -)
-<li>Low-precedence union operator (|)
-</ol>
-
-<p><b>Note:</b> Because the operator characters have special meaning,
-you should avoid creating a category that uses any of them in it's name.
-For example, the category "db-tests" could not be used on the command
-line, since it appears to means "run category db, except for category tests."
-The same limitation applies to characters that have special meaning for
-the shell you are using.
-   
-<p>For a clear understanding of how category 
-	selection works, review the documentation for both the 
-	<a href="category.html">Category Attribute</a> and the 
-	<a href="explicit.html">Explicit Attribute</a>.</p>
-
-<h2>Controlling How Tests Are Run</h2>
-
-<h3>Specifying the .NET Framework Version</h3>
-
-<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>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">
-   <dt><b>Single</b>
-   <dd>All the tests are run in the nunit-console process. This is the default.
-   <dt><b>Separate</b>
-   <dd>A separate process is created to run the tests.
-   <dt><b>Multiple</b>
-   <dd>A separate process is created for each test assembly, whether specified
-   on the command line or listed in an NUnit project file.
-   </dl>
-<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">
-	<dt><b>None</b>
-	<dd>No domain is created - the tests are run in the primary domain. This normally
-	requires copying the <b>NUnit</b> assemblies into the same directory as your tests.
-	<dt><b>Single</b>
-	<dd>A test domain is created - this is how NUnit worked prior to version 2.4
-	<dt><b>Multiple</b>
-	<dd>A separate test domain is created for each assembly
-	</dl>
-<p>The default is to use multiple domains if multiple assemblies are listed on 
-	the command line. Otherwise a single domain is used.</p>
-	
-<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
-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.
-
-<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.
-<p>The <b>/noshadow</b> option disables shadow copying of the assembly in order to 
-	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>
-
-<!-- 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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<ul>
-<li id="current"><a href="consoleCommandLine.html">Command-Line</a></li>
-</ul>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="pnunit.html">PNUnit Runner</a></li>
-<li><a href="nunit-agent.html">NUnit Agent</a></li>
-<li><a href="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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<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 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 
+	must do this manually if this is the desired behavior.</p>
+<p><b>Note:</b> Under the Windows operating system, options may be prefixed by either
+    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>
+
+<hr>
+<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>
+
+<p>To run the tests in nunit.tests.dll through the Visual Studio project, use:</p>
+	<pre class="programtext">        nunit-console nunit.tests.csproj</pre>
+
+<p>To run the same tests through an NUnit test project you have defined, use:</p>
+	<pre class="programtext">        nunit-console nunit.tests.nunit</pre>
+
+<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 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 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 almost every case.
+
+<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 
+	command:
+	<pre class="programtext">        nunit-console /fixture:NUnit.Tests.AssertionTests nunit.tests.dll</pre>
+</p>
+<p>The name specified after the <b>/fixture</b> option may be that of a TestFixture 
+	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.
+	
+<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>
+
+<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><b>Note:</b> This option has no effect when loading an assembly directly.</p>
+
+<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 
+	runs only the tests in the BaseLine category:
+	<pre class="programtext">        nunit-console myassembly.dll /include:BaseLine</pre>
+</p>
+<p>The following command runs all tests <b>except</b> those in the Database 
+	category:
+	<pre class="programtext">        nunit-console myassembly.dll /exclude:Database</pre>
+</p>
+<p>
+Multiple categories may be specified on either option, by using commas to 
+separate them.
+<p><b>Notes:</b> Beginning with NUnit 2.4, the /include and /exclude options may
+   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
+<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>
+</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 (,)
+<li>Intersection and set subtraction operators (+ and binary -)
+<li>Low-precedence union operator (|)
+</ol>
+
+<p><b>Note:</b> Because the operator characters have special meaning,
+you should avoid creating a category that uses any of them in it's name.
+For example, the category "db-tests" could not be used on the command
+line, since it appears to means "run category db, except for category tests."
+The same limitation applies to characters that have special meaning for
+the shell you are using.
+   
+<p>For a clear understanding of how category 
+	selection works, review the documentation for both the 
+	<a href="category.html">Category Attribute</a> and the 
+	<a href="explicit.html">Explicit Attribute</a>.</p>
+
+<hr>
+<h2>Controlling How Tests Are Run</h2>
+
+<h3>Specifying the .NET Framework Version</h3>
+
+<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>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">
+   <dt><b>Single</b>
+   <dd>All the tests are run in the nunit-console process. This is the default.
+   <dt><b>Separate</b>
+   <dd>A separate process is created to run the tests.
+   <dt><b>Multiple</b>
+   <dd>A separate process is created for each test assembly, whether specified
+   on the command line or listed in an NUnit project file.
+   </dl>
+<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">
+	<dt><b>None</b>
+	<dd>No domain is created - the tests are run in the primary domain. This normally
+	requires copying the <b>NUnit</b> assemblies into the same directory as your tests.
+	<dt><b>Single</b>
+	<dd>A test domain is created - this is how NUnit worked prior to version 2.4
+	<dt><b>Multiple</b>
+	<dd>A separate test domain is created for each assembly
+	</dl>
+<p>The default is to use multiple domains if multiple assemblies are listed on 
+	the command line. Otherwise a single domain is used.</p>
+	
+<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
+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.
+
+<hr>
+<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>
+
+<hr>
+<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.
+<p>The <b>/noshadow</b> option disables shadow copying of the assembly in order to 
+	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>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<ul>
+<li id="current"><a href="consoleCommandLine.html">Command-Line</a></li>
+</ul>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/constraintModel.html b/doc/constraintModel.html
index 4bfc770..a0f42ae 100644
--- a/doc/constraintModel.html
+++ b/doc/constraintModel.html
@@ -1,178 +1,182 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Constraint-Based Assert Model (NUnit 2.4)</h2>
-
-<p>The constraint-based Assert model uses a single method of the Assert class
-   for all assertions. The logic necessary to carry out each assertion is
-   embedded in the constraint object passed as the second parameter to that
-   method.
-   
-<p>Here's a very simple assert using the constraint model:
-<pre>      Assert.That( myString, Is.EqualTo("Hello") );</pre>
-
-<p>The second argument in this assertion uses one of NUnit's <b>syntax helpers</b>
-to create an <b>EqualConstraint</b>. The same assertion could also be made in this form:
-<pre>      Assert.That( myString, new EqualConstraint("Hello") );</pre>
-
-<p>Using this model, all assertions are made using one of the forms of the
-   Assert.That() method, which has a number of overloads...
-   
-<div class="code" style="width: 36em">
-<pre>
-Assert.That( object actual, IResolveConstraint constraint )
-Assert.That( object actual, IResolveConstraint constraint, 
-             string message )
-Assert.That( object actual, IResolveConstraint constraint,
-             string message, object[] parms )
-			 
-Assert.That( ActualValueDelegate del, IResolveConstraint constraint )
-Assert.That( ActualValueDelegate del, IResolveConstraint constraint, 
-             string message )
-Assert.That( ActualValueDelegate del, IResolveConstraint constraint,
-             string message, object[] parms )
-			 
-Assert.That<T>( ref T actual, IResolveConstraint constraint )
-Assert.That<T>( ref T actual, IResolveConstraint constraint, 
-             string message )
-Assert.That<T>( ref T actual, IResolveConstraint constraint,
-             string message, object[] parms )
-			 
-Assert.That( bool condition );
-Assert.That( bool condition, string message );
-Assert.That( bool condition, string message, object[] parms );
-
-Assert.That( TestDelegate del, IResolveConstraint constraint );
-</pre>
-</div>
-
-<p>If you derive your test fixture class from <b>AssertionHelper</b>, the
-Expect() method may be used in place of Assert.That()...
-
-<div class="code" style="width: 36em">
-<pre>
-Expect( object actual, IResolveConstraint constraint )
-Expect( object actual, IResolveConstraint constraint, 
-             string message )
-Expect( object actual, IResolveConstraint constraint, 
-             string message, object[] parms )
-			 
-Expect( ActualValueDelegate del, IResolveConstraint constraint )
-Expect( ActualValueDelegate del, IResolveConstraint constraint, 
-             string message )
-Expect( ActualValueDelegate del, IResolveConstraint constraint,
-             string message, object[] parms )
-			 
-Expect<T>( ref T actual, IResolveConstraint constraint )
-Expect<T>( ref T actual, IResolveConstraint constraint, 
-             string message )
-Expect<T>( ref T actual, IResolveConstraint constraint,
-             string message, object[] parms )
-			 
-Expect( bool condition );
-Expect( bool condition, string message );
-Expect( bool condition, string message, object[] parms );
-
-Expect( TestDelegate del, IResolveConstraint constraint );
-</pre>
-</div>
-
-<p>The overloads that take a bool work exactly like Assert.IsTrue.
-   
-<p>For overloads taking a constraint, the argument must be a object implementing 
-  the <b>IConstraint</b> interface, which supports performing a test
-   on an actual value and generating appropriate messages. This interface
-   is described in more detail under 
-   <a href="customConstraints.html">Custom Constraints</a>.
-   
-<p>NUnit provides a number of constraint classes similar to the <b>EqualConstraint</b>
-   used in the example above. Generally, these classes may be used directly or
-   through a syntax helper. Test fixture classes inheriting from <b>AssertionHelper</b>
-   are able to use shorter forms. The valid forms are described on the pages related to
-   each constraint. Note that the menu items listed to the right generally reflect the
-   names of the syntax helpers.
-   
-<p><b>See also:</b> the 
-<a href="classicModel.html">classic model</a> of assertions.
-   
-
-</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 id="current"><a href="constraintModel.html">Constraints</a></li>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Constraint-Based Assert Model (NUnit 2.4)</h2>
+
+<p>The constraint-based Assert model uses a single method of the Assert class
+   for all assertions. The logic necessary to carry out each assertion is
+   embedded in the constraint object passed as the second parameter to that
+   method.
+   
+<p>Here's a very simple assert using the constraint model:
+<pre>      Assert.That( myString, Is.EqualTo("Hello") );</pre>
+
+<p>The second argument in this assertion uses one of NUnit's <b>syntax helpers</b>
+to create an <b>EqualConstraint</b>. The same assertion could also be made in this form:
+<pre>      Assert.That( myString, new EqualConstraint("Hello") );</pre>
+
+<p>Using this model, all assertions are made using one of the forms of the
+   Assert.That() method, which has a number of overloads...
+   
+<div class="code" style="width: 36em">
+<pre>
+Assert.That( object actual, IResolveConstraint constraint )
+Assert.That( object actual, IResolveConstraint constraint, 
+             string message )
+Assert.That( object actual, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Assert.That( ActualValueDelegate del, IResolveConstraint constraint )
+Assert.That( ActualValueDelegate del, IResolveConstraint constraint, 
+             string message )
+Assert.That( ActualValueDelegate del, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Assert.That<T>( ref T actual, IResolveConstraint constraint )
+Assert.That<T>( ref T actual, IResolveConstraint constraint, 
+             string message )
+Assert.That<T>( ref T actual, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Assert.That( bool condition );
+Assert.That( bool condition, string message );
+Assert.That( bool condition, string message, object[] parms );
+
+Assert.That( TestDelegate del, IResolveConstraint constraint );
+</pre>
+</div>
+
+<p>If you derive your test fixture class from <b>AssertionHelper</b>, the
+Expect() method may be used in place of Assert.That()...
+
+<div class="code" style="width: 36em">
+<pre>
+Expect( object actual, IResolveConstraint constraint )
+Expect( object actual, IResolveConstraint constraint, 
+             string message )
+Expect( object actual, IResolveConstraint constraint, 
+             string message, object[] parms )
+			 
+Expect( ActualValueDelegate del, IResolveConstraint constraint )
+Expect( ActualValueDelegate del, IResolveConstraint constraint, 
+             string message )
+Expect( ActualValueDelegate del, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Expect<T>( ref T actual, IResolveConstraint constraint )
+Expect<T>( ref T actual, IResolveConstraint constraint, 
+             string message )
+Expect<T>( ref T actual, IResolveConstraint constraint,
+             string message, object[] parms )
+			 
+Expect( bool condition );
+Expect( bool condition, string message );
+Expect( bool condition, string message, object[] parms );
+
+Expect( TestDelegate del, IResolveConstraint constraint );
+</pre>
+</div>
+
+<p>The overloads that take a bool work exactly like Assert.IsTrue.
+   
+<p>For overloads taking a constraint, the argument must be a object implementing 
+  the <b>IConstraint</b> interface, which supports performing a test
+   on an actual value and generating appropriate messages. This interface
+   is described in more detail under 
+   <a href="customConstraints.html">Custom Constraints</a>.
+   
+<p>NUnit provides a number of constraint classes similar to the <b>EqualConstraint</b>
+   used in the example above. Generally, these classes may be used directly or
+   through a syntax helper. Test fixture classes inheriting from <b>AssertionHelper</b>
+   are able to use shorter forms. The valid forms are described on the pages related to
+   each constraint. Note that the menu items listed to the right generally reflect the
+   names of the syntax helpers.
+   
+<p><b>See also:</b> the 
+<a href="classicModel.html">classic model</a> of assertions.
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li id="current"><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/contextMenu.html b/doc/contextMenu.html
index 2edd807..1d4a827 100644
--- a/doc/contextMenu.html
+++ b/doc/contextMenu.html
@@ -1,109 +1,110 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Context Menu</h2>
-
-<p>The context menu is displayed when one of the tree nodes is right-clicked.</p>
-
-<h4>Run</h4>
-<p>Runs the selected test - disabled if a test is running.</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>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
-results in substantial reduction in load time.</p>
-
-<h4>Clear Fixture</h4>
-<p>Reloads all the tests, clearing the currently loaded fixture.</p>
-
-<h4>Properties</h4>
-<p>Displays the <a href="testProperties.html">Test Properties</a> for the selected test node.</p>
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li id="current"><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Context Menu</h2>
+
+<p>The context menu is displayed when one of the tree nodes is right-clicked.</p>
+
+<h4>Run</h4>
+<p>Runs the selected test - disabled if a test is running.</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>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
+results in substantial reduction in load time.</p>
+
+<h4>Clear Fixture</h4>
+<p>Reloads all the tests, clearing the currently loaded fixture.</p>
+
+<h4>Properties</h4>
+<p>Displays the <a href="testProperties.html">Test Properties</a> for the selected test node.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li id="current"><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/culture.html b/doc/culture.html
index 36fe3a7..a6c6697 100644
--- a/doc/culture.html
+++ b/doc/culture.html
@@ -1,286 +1,286 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<style><!--
-div.code { width: 34em }
---></style>
-
-<h3>CultureAttribute (NUnit 2.4.2)</h3> 
-<p>The Culture attribute is used to specify cultures for which a test or fixture
-	should be run. It does not affect the culture setting, but merely uses it to 
-	determine whether to run the test. If you wish to change the culture when
-	running a test, use the SetCulture attribute instead.</p>
-	
-<p>If the specified culture requirements for a test are not met it is skipped.
-   In the gui, the tree node for the test remains gray and the status bar color is 
-   not affected.</p>
-
-<p>One use of the Culture attribute is to provide alternative tests under different
-cultures. You may specify either specific cultures, like "en-GB" or neutral
-cultures like "de".</p>
-
-<h4>Test Fixture Syntax</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  [Culture("fr-FR")]
-  public class FrenchCultureTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Culture("fr-FR")>
-  Public Class FrenchCultureTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [Culture("fr-FR")]
-  public __gc class FrenchCultureTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Culture("fr-FR") */
-public class FrenchCultureTests
-{
-  // ...
-}
-</pre>
-</div>
-<h4>Test Syntax</h4>
-<div class="code">
-	
-<div class="langFilter">
-	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test]
-    [Culture(Exclude="en,de")]
-    public void SomeTest()
-    { /* ... */ }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()>
-  Public Class SuccessTests
-    <Test(), Culture(Exclude="en,de")> Public Sub SomeTest()
-      ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test][Culture(Exclude="en,de")] void SomeTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Culture(Exclude=en,de") */
-  public void SomeTest()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="setCulture.html">SetCultureAttribute</a></ul>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<style><!--
+div.code { width: 34em }
+--></style>
+
+<h3>CultureAttribute (NUnit 2.4.2)</h3> 
+<p>The Culture attribute is used to specify cultures for which a test or fixture
+	should be run. It does not affect the culture setting, but merely uses it to 
+	determine whether to run the test. If you wish to change the culture when
+	running a test, use the SetCulture attribute instead.</p>
+	
+<p>If the specified culture requirements for a test are not met it is skipped.
+   In the gui, the tree node for the test remains gray and the status bar color is 
+   not affected.</p>
+
+<p>One use of the Culture attribute is to provide alternative tests under different
+cultures. You may specify either specific cultures, like "en-GB" or neutral
+cultures like "de".</p>
+
+<h4>Test Fixture Syntax</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [Culture("fr-FR")]
+  public class FrenchCultureTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Culture("fr-FR")>
+  Public Class FrenchCultureTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [Culture("fr-FR")]
+  public __gc class FrenchCultureTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Culture("fr-FR") */
+public class FrenchCultureTests
+{
+  // ...
+}
+</pre>
+</div>
+<h4>Test Syntax</h4>
+<div class="code">
+	
+<div class="langFilter">
+	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test]
+    [Culture(Exclude="en,de")]
+    public void SomeTest()
+    { /* ... */ }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()>
+  Public Class SuccessTests
+    <Test(), Culture(Exclude="en,de")> Public Sub SomeTest()
+      ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test][Culture(Exclude="en,de")] void SomeTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Culture(Exclude=en,de") */
+  public void SomeTest()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setCulture.html">SetCultureAttribute</a></ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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>
+<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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/customConstraints.html b/doc/customConstraints.html
index 794249f..3f5dd64 100644
--- a/doc/customConstraints.html
+++ b/doc/customConstraints.html
@@ -1,141 +1,142 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<h2>Custom Constraints (NUnit 2.4 / 2.5)</h2>
-
-<p>You can implement your own custom constraints by creating a class that 
-inherits from the <b>Constraint</b> abstract class, which supports performing a 
-test on an actual value and generating appropriate messages. The class includes
-two abstract methods, which you must override and four virtual methods with
-default implementation that may be overridden as needed:
-   
-<div class="code" style="width: 36em">
-<pre>public abstract class Constraint
-{
- 	...
-    public abstract bool Matches( object actual );
-    public virtual bool Matches( ActualValueDelegate del );
-    public virtual bool Matches<T>( ref T actual );
-    public abstract void WriteDescriptionTo( MessageWriter writer );
-    public virtual void WriteMessageTo( MessageWriter writer );
-    public virtual void WriteActualValueTo( MessageWriter writer );
-	...
-}</pre>
-</div>   
-
-<p>Your derived class should save the actual argument to Matches in the protected
-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
-should give you a good idea of how to use it if you have special formatting
-requirements for error messages.
-
-<h3>Custom Constraint Syntax</h3>
-
-<p>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>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>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>
-
-<!-- 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>
-<ul>
-<li id="current"><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Custom Constraints (NUnit 2.4 / 2.5)</h2>
+
+<p>You can implement your own custom constraints by creating a class that 
+inherits from the <b>Constraint</b> abstract class, which supports performing a 
+test on an actual value and generating appropriate messages. The class includes
+two abstract methods, which you must override and four virtual methods with
+default implementation that may be overridden as needed:
+   
+<div class="code" style="width: 36em">
+<pre>public abstract class Constraint
+{
+ 	...
+    public abstract bool Matches( object actual );
+    public virtual bool Matches( ActualValueDelegate del );
+    public virtual bool Matches<T>( ref T actual );
+    public abstract void WriteDescriptionTo( MessageWriter writer );
+    public virtual void WriteMessageTo( MessageWriter writer );
+    public virtual void WriteActualValueTo( MessageWriter writer );
+	...
+}</pre>
+</div>   
+
+<p>Your derived class should save the actual argument to Matches in the protected
+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
+should give you a good idea of how to use it if you have special formatting
+requirements for error messages.
+
+<h3>Custom Constraint Syntax</h3>
+
+<p>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>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>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>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li id="current"><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/datapoint.html b/doc/datapoint.html
index 5d8c373..98a32e3 100644
--- a/doc/datapoint.html
+++ b/doc/datapoint.html
@@ -1,155 +1,155 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Datapoint</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Datapoint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>DatapointAttribute / DatapointsAttribute (NUnit 2.5) (Experimental)</h3>
-
-<p>The <b>Datapoint</b> and <b>Datapoints</b> attributes are used
-   to provide data for <b>Theories</b> and are ignored for ordinary
-   tests - including tests with parameters.
-   
-<h4>DataPointAttribute</h4>
-   
-<p>When a Theory is loaded, NUnit creates arguments for each
-   of its parameters by using any fields of the same type
-   as the parameter annotated with the <b>DatapointAttribute</b>.
-   Fields must be members of the class containing the Theory
-   and their Type must exactly match the argument for which
-   data is being supplied.
-   
-<h4>DataPointsAttribute</h4>
-   
-<p>In addition to specifying individual datapoints, collections of
-   datapoints may be provided by use of the <b>DatapointsAttribute</b>
-   - note the spelling. This attribute may be placed on methods or
-   properties in addition to fields. The returned value must be
-   either an array of the required type or (beginning with NUnit
-   2.5.5) an <b>IEnumerable<T></b> returning an enumeration
-   of the required type. The data Type must exactly match the argument 
-   for which data is being supplied.
-   
-<h4>Automatically Supplied Datapoints</h4>
-
-<p>It is normally not necessary to specify datapoints for 
-   <b>boolean</b> or <b>enum</b> arguments. Beginning with
-   version 2.5.4, NUnit automatically supplies values of <b>true</b> 
-   and <b>false</b> for <b>boolean</b> arguments and will supply all 
-   defined values of any enumeration.
-   
-<p>If for some reason you don't wish to use all possible values, you
-   can override this behavior by supplying your own datapoints. If you
-   supply any datapoints for an argument, automatic datapoint generation 
-   is suppressed.
-   
-<h4>Example</h4>
-
-<p>For an example of use, see <a href="theory.html">TheoryAttribute</a>.
-   
-<h4>See also...</h4>
-
-<ul>
-<li><a href="theory.html">TheoryAttribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul>
-   
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="datapoint.html">Datapoint(s)</a></li>
-<li><a href="description.html">Description</a></li>
-<li><a href="exception.html">Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="maxtime.html">Maxtime</a></li>
-<li><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>DatapointAttribute / DatapointsAttribute (NUnit 2.5) (Experimental)</h3>
+
+<p>The <b>Datapoint</b> and <b>Datapoints</b> attributes are used
+   to provide data for <b>Theories</b> and are ignored for ordinary
+   tests - including tests with parameters.
+   
+<h4>DataPointAttribute</h4>
+   
+<p>When a Theory is loaded, NUnit creates arguments for each
+   of its parameters by using any fields of the same type
+   as the parameter annotated with the <b>DatapointAttribute</b>.
+   Fields must be members of the class containing the Theory
+   and their Type must exactly match the argument for which
+   data is being supplied.
+   
+<h4>DataPointsAttribute</h4>
+   
+<p>In addition to specifying individual datapoints, collections of
+   datapoints may be provided by use of the <b>DatapointsAttribute</b>
+   - note the spelling. This attribute may be placed on methods or
+   properties in addition to fields. The returned value must be
+   either an array of the required type or (beginning with NUnit
+   2.5.5) an <b>IEnumerable<T></b> returning an enumeration
+   of the required type. The data Type must exactly match the argument 
+   for which data is being supplied.
+   
+<h4>Automatically Supplied Datapoints</h4>
+
+<p>It is normally not necessary to specify datapoints for 
+   <b>boolean</b> or <b>enum</b> arguments. Beginning with
+   version 2.5.4, NUnit automatically supplies values of <b>true</b> 
+   and <b>false</b> for <b>boolean</b> arguments and will supply all 
+   defined values of any enumeration.
+   
+<p>If for some reason you don't wish to use all possible values, you
+   can override this behavior by supplying your own datapoints. If you
+   supply any datapoints for an argument, automatic datapoint generation 
+   is suppressed.
+   
+<h4>Example</h4>
+
+<p>For an example of use, see <a href="theory.html">TheoryAttribute</a>.
+   
+<h4>See also...</h4>
+
+<ul>
+<li><a href="theory.html">TheoryAttribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="datapoint.html">Datapoint(s)</a></li>
+<li><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/datapointProviders.html b/doc/datapointProviders.html
index 49b7bf9..93ef52c 100644
--- a/doc/datapointProviders.html
+++ b/doc/datapointProviders.html
@@ -1,129 +1,130 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - DatapointProviders</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - DatapointProviders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>DataPointProviders (NUnit 2.5)</h3>
-
-<h4>Purpose</h4>
-<p>DataPointProviders are used to supply data for an individual parameter
-of a parameterized test method.
-
-<h4>Extension Point</h4>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint listeners = host.GetExtensionPoint( "DataPointProviders" );</pre>
-
-<h4>Interface</h4>
-<p>The extension object passed to Install must implement either the
-   <b>IDataPointProvider</b> or the <b>IDataPointProvider2</b> interface:
-
-<pre>
-	public interface IDataPointProvider
-	{
-		bool HasDataFor( ParameterInfo parameter );
-		IEnumerable GetDataFor( ParameterInfo parameter );
-	}
-	
-	public interface IDataPointProvider2 : IDatapointProvider
-	{
-		bool HasDataFor( ParameterInfo parameter, Test parentSuite );
-		IEnumerable GetDataFor( ParameterInfo parameter, Test parentSuite );
-	}
-</pre>
-
-<p>NUnit will call <b>IDataPointProvider2</b> if it is available. Otherwise
-   <b>IDataPointProvider</b> will be used.
-
-<p>The <b>HasDataFor</b> method should return true if the provider is able to
-   supply data for the specified parameter. If a provider only wants to be used 
-   on certain types of tests, it can examine the supplied ParameterInfo and
-   its associated MethodInfo and Type and/or the parent test suite.
-
-<p>The <b>GetDataFor</b> method should return a list of individual values to
-   use for the supplied parameter in running the test.
-   
-<h4>Notes:</h4>
-
-<ol>
-<li>Most providers will delegate one of the interface implementations
-    to the other if they implement both.
-<li>DataPointProviders that use data from the fixture class should use 
-    <b>IDataPointProvider2</b> interface so that they are able to access any 
-	arguments supplied for constructing the fixture object.
-<li>Providers that acquire data from outside the fixture will usually
-    be able to work with <b>IDataPointProvider</b> alone.
-<li>The <b>IDataPointProvider2</b> interface was added in the NUnit 2.5.1 release.
-</ol>
-   
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li><a href="testDecorators.html">TestDecorators</a></li>
-<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li id="current"><a href="datapointProviders.html">DatapointProviders</a></li>
-<li><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>DataPointProviders (NUnit 2.5)</h3>
+
+<h4>Purpose</h4>
+<p>DataPointProviders are used to supply data for an individual parameter
+of a parameterized test method.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint listeners = host.GetExtensionPoint( "DataPointProviders" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement either the
+   <b>IDataPointProvider</b> or the <b>IDataPointProvider2</b> interface:
+
+<pre>
+	public interface IDataPointProvider
+	{
+		bool HasDataFor( ParameterInfo parameter );
+		IEnumerable GetDataFor( ParameterInfo parameter );
+	}
+	
+	public interface IDataPointProvider2 : IDatapointProvider
+	{
+		bool HasDataFor( ParameterInfo parameter, Test parentSuite );
+		IEnumerable GetDataFor( ParameterInfo parameter, Test parentSuite );
+	}
+</pre>
+
+<p>NUnit will call <b>IDataPointProvider2</b> if it is available. Otherwise
+   <b>IDataPointProvider</b> will be used.
+
+<p>The <b>HasDataFor</b> method should return true if the provider is able to
+   supply data for the specified parameter. If a provider only wants to be used 
+   on certain types of tests, it can examine the supplied ParameterInfo and
+   its associated MethodInfo and Type and/or the parent test suite.
+
+<p>The <b>GetDataFor</b> method should return a list of individual values to
+   use for the supplied parameter in running the test.
+   
+<h4>Notes:</h4>
+
+<ol>
+<li>Most providers will delegate one of the interface implementations
+    to the other if they implement both.
+<li>DataPointProviders that use data from the fixture class should use 
+    <b>IDataPointProvider2</b> interface so that they are able to access any 
+	arguments supplied for constructing the fixture object.
+<li>Providers that acquire data from outside the fixture will usually
+    be able to work with <b>IDataPointProvider</b> alone.
+<li>The <b>IDataPointProvider2</b> interface was added in the NUnit 2.5.1 release.
+</ol>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li id="current"><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/delayedConstraint.html b/doc/delayedConstraint.html
index 6fae97f..ea08c5f 100644
--- a/doc/delayedConstraint.html
+++ b/doc/delayedConstraint.html
@@ -1,105 +1,109 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - DelayedConstraint</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - DelayedConstraint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Delayed Constraint (NUnit 2.5)</h2>
-
-<p><b>DelayedConstraint</b> delays the application of another constraint until a certain
-   amount of time has passed. In it's simplest form, it replaces use of a Sleep 
-   in the code but it also supports polling, which may allow use of a longer 
-   maximum time while still keeping the tests as fast as possible. 
-   
-<p>The <b>After</b> modifier is permitted on any constraint, and the delay applies to 
-   the entire expression up to the point where <b>After</b> appears. 
-
-<p>Use of a <b>DelayedConstraint</b> with a value argument makes no sense, since 
-   the value will be extracted at the point of call. It's intended use is with 
-   delegates and references. If a delegate is used with polling, it may be called 
-   multiple times so only methods without side effects should be used in this way. 
-
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>After(int)</td><td>DelayedConstraint(Constraint, int)</td></td><td>tests that a constraint is satisfied after a delay.</tr>
-<tr><td>After(int, int)</td><td>DelayedConstraint(Constraint, int, int)</td></td><td>tests that a constraint is satisfied after a delay using polling.</tr>
-</table>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li id="current"><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Delayed Constraint (NUnit 2.5)</h2>
+
+<p><b>DelayedConstraint</b> delays the application of another constraint until a certain
+   amount of time has passed. In it's simplest form, it replaces use of a Sleep 
+   in the code but it also supports polling, which may allow use of a longer 
+   maximum time while still keeping the tests as fast as possible. 
+   
+<p>The <b>After</b> modifier is permitted on any constraint, and the delay applies to 
+   the entire expression up to the point where <b>After</b> appears. 
+
+<p>Use of a <b>DelayedConstraint</b> with a value argument makes no sense, since 
+   the value will be extracted at the point of call. It's intended use is with 
+   delegates and references. If a delegate is used with polling, it may be called 
+   multiple times so only methods without side effects should be used in this way. 
+
+<table class="constraints">
+<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
+<tr><td>After(int)</td><td>DelayedConstraint(Constraint, int)</td></td><td>tests that a constraint is satisfied after a delay.</tr>
+<tr><td>After(int, int)</td><td>DelayedConstraint(Constraint, int, int)</td></td><td>tests that a constraint is satisfied after a delay using polling.</tr>
+</table>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li id="current"><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/description.html b/doc/description.html
index 542f5ea..587fffc 100644
--- a/doc/description.html
+++ b/doc/description.html
@@ -1,209 +1,209 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>Description (NUnit 2.4)</h3>
-
-<p>The Description attribute is used to apply descriptive text to a Test,
-TestFixture or Assembly. The text appears in the XML output file and is 
-shown in the Test Properties dialog.</p>
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">[assembly: Description("Assembly description here")]
-
-namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture, Description("Fixture description here")]
-  public class SomeTests
-  {
-    [Test, Description("Test description here")] 
-    public void OneTest()
-    { /* ... */ }
-  }
-}
-</pre>
-<pre class="vb"><assembly: Description("Assembly description here")>
-
-Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Description("Fixture description here")>_
-  Public Class SomeTests
-    <Test(), Description("Test description here")>_
-    Public Sub OneTest()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-<pre class="mc">[assembly:Description("Assembly description here")]
-
-#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture, Description("Fixture description here")]
-  public __gc class SomeTests
-  {
-    [Test, Description("Test description here")]
-    void OneTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">/** @assembly NUnit.Framework.Description("Assembly description here") */
-
-package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Description("Fixture description here") */
-public class SomeTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Description("Test description here") */
-  public void OneTest()
-  { /* ... */ }
-}
-</pre>
-</div>
-
-<p><b>Note:</b> The Test and TestFixture attributes continue to support an 
-optional Description property. The Description attribute should be used for 
-new applciations. If both are used, the Description attribute takes precedence.</p>
-	
-
-
-</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><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 id="current"><a href="description.html">Description</a></li>
-<li><a href="exception.html">Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="maxtime.html">Maxtime</a></li>
-<li><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>Description (NUnit 2.4)</h3>
+
+<p>The Description attribute is used to apply descriptive text to a Test,
+TestFixture or Assembly. The text appears in the XML output file and is 
+shown in the Test Properties dialog.</p>
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">[assembly: Description("Assembly description here")]
+
+namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture, Description("Fixture description here")]
+  public class SomeTests
+  {
+    [Test, Description("Test description here")] 
+    public void OneTest()
+    { /* ... */ }
+  }
+}
+</pre>
+<pre class="vb"><assembly: Description("Assembly description here")>
+
+Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Description("Fixture description here")>_
+  Public Class SomeTests
+    <Test(), Description("Test description here")>_
+    Public Sub OneTest()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+<pre class="mc">[assembly:Description("Assembly description here")]
+
+#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture, Description("Fixture description here")]
+  public __gc class SomeTests
+  {
+    [Test, Description("Test description here")]
+    void OneTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">/** @assembly NUnit.Framework.Description("Assembly description here") */
+
+package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Description("Fixture description here") */
+public class SomeTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Description("Test description here") */
+  public void OneTest()
+  { /* ... */ }
+}
+</pre>
+</div>
+
+<p><b>Note:</b> The Test and TestFixture attributes continue to support an 
+optional Description property. The Description attribute should be used for 
+new applciations. If both are used, the Description attribute takes precedence.</p>
+	
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="description.html">Description</a></li>
+<li><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/directoryAssert.html b/doc/directoryAssert.html
index ad262af..6d4a485 100644
--- a/doc/directoryAssert.html
+++ b/doc/directoryAssert.html
@@ -1,179 +1,183 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - DirectoryAssert</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - DirectoryAssert</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>DirectoryAssert (NUnit 2.5)</h2>
-<p>The DirectoryAssert class provides methods for making asserts about
-file system directories, which may be provided as DirectoryInfos or as strings 
-giving the path to each directory.</p>
-
-<p> <b>DirectoryAssert.AreEqual()</b> and <b>DirectoryAssert.AreNotEqual()</b>
-compare two directories for equality. Directories are considered equal if
-they have the same FullName, Attributes, CreationTime and LastAccessTime.
-
-<p><b>Note:</b> Two different directories containing the same files are not
-considered to be equal.
-
-<div class="code" style="width: 40em"><pre>
-
-DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual );
-DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual, 
-                string message );
-DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual,
-                string message, params object[] args );
-
-DirectoryAssert.AreEqual( string expected, string actual );
-DirectoryAssert.AreEqual( string expected, string actual, 
-                string message );
-DirectoryAssert.AreEqual( string expected, string actual,
-                string message, params object[] args );
-
-DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual );
-DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual, 
-                string message );
-DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual,
-                string message, params object[] args );
-
-DirectoryAssert.AreNotEqual( string expected, string actual );
-DirectoryAssert.AreNotEqual( string expected, string actual, 
-                string message );
-DirectoryAssert.AreNotEqual( string expected, string actual,
-                string message, params object[] args );
-
-</pre></div>
-
-<p><b>DirectoryAssert.IsEmpty()</b> and <b>DirectoryAssert.IsNotEmpty()</b>
-test whether the specified directory is empty.
-
-<div class="code" style="width: 40em"><pre>
-
-DirectoryAssert.IsEmpty( DirectoryInfo directory );
-DirectoryAssert.IsEmpty( DirectoryInfo directory, string message );
-DirectoryAssert.IsEmpty( DirectoryInfo directory,
-                string message, params object[] args );
-
-DirectoryAssert.IsEmpty( string directory );
-DirectoryAssert.IsEmpty( string directory, string message );
-DirectoryAssert.IsEmpty( string directory,
-                string message, params object[] args );
-
-DirectoryAssert.IsNotEmpty( DirectoryInfo directory );
-DirectoryAssert.IsNotEmpty( DirectoryInfo directory, string message );
-DirectoryAssert.IsNotEmpty( DirectoryInfo directory,
-                string message, params object[] args );
-
-DirectoryAssert.IsNotEmpty( string directory );
-DirectoryAssert.IsNotEmpty( string directory, string message );
-DirectoryAssert.IsNotEmpty( string directory,
-                string message, params object[] args );
-
-</pre></div>
-
-<p><b>DirectoryAssert.IsWithin()</b> and <b>DirectoryAssert.IsNotWithin()</b>
-test whether the second directory is a direct or indirect subdirectory
-of the first directory.
-
-<div class="code" style="width: 40em"><pre>
-
-DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual );
-DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual,
-                string message );
-DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual,
-                string message, params object[] args );
-
-DirectoryAssert.IsWithin( string expected, string actual );
-DirectoryAssert.IsWithin( string expected, string actual,
-                string message );
-DirectoryAssert.IsWithin( string expected, string actual,
-                string message, params object[] args );
-
-DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual );
-DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual,
-                string message );
-DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual,
-                string message, params object[] args );
-
-DirectoryAssert.IsNotWithin( string expected, string actual );
-DirectoryAssert.IsNotWithin( string expected, string actual,
-                string message );
-DirectoryAssert.IsNotWithin( string expected, string actual,
-                string message, params object[] args );
-
-</pre></div>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li id="current"><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>DirectoryAssert (NUnit 2.5)</h2>
+<p>The DirectoryAssert class provides methods for making asserts about
+file system directories, which may be provided as DirectoryInfos or as strings 
+giving the path to each directory.</p>
+
+<p> <b>DirectoryAssert.AreEqual()</b> and <b>DirectoryAssert.AreNotEqual()</b>
+compare two directories for equality. Directories are considered equal if
+they have the same FullName, Attributes, CreationTime and LastAccessTime.
+
+<p><b>Note:</b> Two different directories containing the same files are not
+considered to be equal.
+
+<div class="code" style="width: 40em"><pre>
+
+DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual, 
+                string message );
+DirectoryAssert.AreEqual( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.AreEqual( string expected, string actual );
+DirectoryAssert.AreEqual( string expected, string actual, 
+                string message );
+DirectoryAssert.AreEqual( string expected, string actual,
+                string message, params object[] args );
+
+DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual, 
+                string message );
+DirectoryAssert.AreNotEqual( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.AreNotEqual( string expected, string actual );
+DirectoryAssert.AreNotEqual( string expected, string actual, 
+                string message );
+DirectoryAssert.AreNotEqual( string expected, string actual,
+                string message, params object[] args );
+
+</pre></div>
+
+<p><b>DirectoryAssert.IsEmpty()</b> and <b>DirectoryAssert.IsNotEmpty()</b>
+test whether the specified directory is empty.
+
+<div class="code" style="width: 40em"><pre>
+
+DirectoryAssert.IsEmpty( DirectoryInfo directory );
+DirectoryAssert.IsEmpty( DirectoryInfo directory, string message );
+DirectoryAssert.IsEmpty( DirectoryInfo directory,
+                string message, params object[] args );
+
+DirectoryAssert.IsEmpty( string directory );
+DirectoryAssert.IsEmpty( string directory, string message );
+DirectoryAssert.IsEmpty( string directory,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotEmpty( DirectoryInfo directory );
+DirectoryAssert.IsNotEmpty( DirectoryInfo directory, string message );
+DirectoryAssert.IsNotEmpty( DirectoryInfo directory,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotEmpty( string directory );
+DirectoryAssert.IsNotEmpty( string directory, string message );
+DirectoryAssert.IsNotEmpty( string directory,
+                string message, params object[] args );
+
+</pre></div>
+
+<p><b>DirectoryAssert.IsWithin()</b> and <b>DirectoryAssert.IsNotWithin()</b>
+test whether the second directory is a direct or indirect subdirectory
+of the first directory.
+
+<div class="code" style="width: 40em"><pre>
+
+DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message );
+DirectoryAssert.IsWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.IsWithin( string expected, string actual );
+DirectoryAssert.IsWithin( string expected, string actual,
+                string message );
+DirectoryAssert.IsWithin( string expected, string actual,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual );
+DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message );
+DirectoryAssert.IsNotWithin( DirectoryInfo expected, DirectoryInfo actual,
+                string message, params object[] args );
+
+DirectoryAssert.IsNotWithin( string expected, string actual );
+DirectoryAssert.IsNotWithin( string expected, string actual,
+                string message );
+DirectoryAssert.IsNotWithin( string expected, string actual,
+                string message, params object[] args );
+
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li id="current"><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/equalConstraint.html b/doc/equalConstraint.html
index e841a19..db32194 100644
--- a/doc/equalConstraint.html
+++ b/doc/equalConstraint.html
@@ -1,30 +1,30 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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">
-
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
 <h2>Equal Constraint (NUnit 2.4 / 2.5)</h2>
 
 <p>An EqualConstraint is used to test whether an actual value
@@ -248,60 +248,64 @@ or implementing the interface has no effect.
 <b>DirectoryInfos</b>. For a <b>Stream</b>, the contents are compared.
 For a <b>DirectoryInfo</b>, the first-level directory contents are compared.
 </ol>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li id="current"><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/equalityAsserts.html b/doc/equalityAsserts.html
index 27fd530..f301661 100644
--- a/doc/equalityAsserts.html
+++ b/doc/equalityAsserts.html
@@ -1,196 +1,200 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Equality Asserts</h2>
-
-<p>These methods test whether the two arguments are equal. Overloaded
-methods are provided for common value types so that languages that don't
-automatically box values can use them directly.</p>
-
-<div class="code" style="width: 36em" >
-	<pre>Assert.AreEqual( int expected, int actual );
-Assert.AreEqual( int expected, int actual, string message );
-Assert.AreEqual( int expected, int actual, string message, 
-                 params object[] parms );
-				 
-Assert.AreEqual( uint expected, uint actual );
-Assert.AreEqual( uint expected, uint actual, string message );
-Assert.AreEqual( uint expected, uint actual, string message, 
-                 params object[] parms );
-
-Assert.AreEqual( decimal expected, decimal actual );
-Assert.AreEqual( decimal expected, decimal actual, string message );
-Assert.AreEqual( decimal expected, decimal actual, string message, 
-                 params object[] parms );
-
-Assert.AreEqual( float expected, float actual, float tolerance );
-Assert.AreEqual( float expected, float actual, float tolerance,
-                 string message );
-Assert.AreEqual( float expected, float actual, float tolerance,
-                 string message, params object[] parms );
-
-Assert.AreEqual( double expected, double actual, double tolerance );
-Assert.AreEqual( double expected, double actual, double tolerance,
-                 string message );
-Assert.AreEqual( double expected, double actual, double tolerance,
-                 string message, params object[] parms );
-
-Assert.AreEqual( object expected, object actual );
-Assert.AreEqual( object expected, object actual, string message );
-Assert.AreEqual( object expected, object actual, string message, 
-                 params object[] parms );
-
-Assert.AreNotEqual( int expected, int actual );
-Assert.AreNotEqual( int expected, int actual, string message );
-Assert.AreNotEqual( int expected, int actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( long expected, long actual );
-Assert.AreNotEqual( long expected, long actual, string message );
-Assert.AreNotEqual( long expected, long actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( uint expected, uint actual );
-Assert.AreNotEqual( uint expected, uint actual, string message );
-Assert.AreNotEqual( uint expected, uint actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( ulong expected, ulong actual );
-Assert.AreNotEqual( ulong expected, ulong actual, string message );
-Assert.AreNotEqual( ulong expected, ulong actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( decimal expected, decimal actual );
-Assert.AreNotEqual( decimal expected, decimal actual, string message );
-Assert.AreNotEqual( decimal expected, decimal actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( float expected, float actual );
-Assert.AreNotEqual( float expected, float actual, string message );
-Assert.AreNotEqual( float expected, float actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( double expected, double actual );
-Assert.AreNotEqual( double expected, double actual, string message );
-Assert.AreNotEqual( double expected, double actual, string message,
-                 params object[] parms );
-
-Assert.AreNotEqual( object expected, object actual );
-Assert.AreNotEqual( object expected, object actual, string message );
-Assert.AreNotEqual( object expected, object actual, string message,
-                 params object[] parms );</pre>
-</div>
-
-<h4>Comparing Numerics of Different Types</h4>
-
-<p>The method overloads that compare two objects make special provision so that numeric 
-	values of different types compare as expected. This assert succeeds:
-	<pre>        Assert.AreEqual( 5, 5.0 );</pre>
-</p>
-
-<h4>Comparing Floating Point Values</h4>
-
-<p>Values of type float and double are normally compared using an additional
-argument that indicates a tolerance within which they will be considered 
-as equal. Beginning with NUnit 2.4.4, the value of
-<b>GlobalSettings.DefaultFloatingPointTolerance</b> is used if a third argument
-is not provided. In earlier versions, or if the default has not been set,
-values are tested for exact equality.
-
-<p>Special values are handled so that the following Asserts succeed:</p>
-
-<pre>        Assert.AreEqual( double.PositiveInfinity, double.PositiveInfinity );
-        Assert.AreEqual( double.NegativeInfinity, double.NegativeInfinity );
-        Assert.AreEqual( double.NaN, double.NaN );</pre>
-
-<blockquote><i><b>Note:</b> The last example above represents a change with NUnit 2.2.3.
-      In earlier releases, the test would fail. We have made this change
-      because the new behavior seems to be more useful in tests. To avoid confusion,
-      we suggest using the new Assert.IsNaN method where appropriate.</i></blockquote>
-
-<h4>Comparing Arrays and Collections</h4>
-
-<p>Since version 2.2, NUnit has been able to compare two single-dimensioned arrays.
-    Beginning with version 2.4, multi-dimensioned arrays, nested arrays (arrays of arrays)
-	and collections may be compared. Two arrays or collections will be treated as equal 
-	by Assert.AreEqual if they have the same dimensions and if each of the corresponding 
-	elements is equal.</p>
-	
-</div>
-</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>
-<ul>
-<li id="current"><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Equality Asserts</h2>
+
+<p>These methods test whether the two arguments are equal. Overloaded
+methods are provided for common value types so that languages that don't
+automatically box values can use them directly.</p>
+
+<div class="code" style="width: 36em" >
+	<pre>Assert.AreEqual( int expected, int actual );
+Assert.AreEqual( int expected, int actual, string message );
+Assert.AreEqual( int expected, int actual, string message, 
+                 params object[] parms );
+				 
+Assert.AreEqual( uint expected, uint actual );
+Assert.AreEqual( uint expected, uint actual, string message );
+Assert.AreEqual( uint expected, uint actual, string message, 
+                 params object[] parms );
+
+Assert.AreEqual( decimal expected, decimal actual );
+Assert.AreEqual( decimal expected, decimal actual, string message );
+Assert.AreEqual( decimal expected, decimal actual, string message, 
+                 params object[] parms );
+
+Assert.AreEqual( float expected, float actual, float tolerance );
+Assert.AreEqual( float expected, float actual, float tolerance,
+                 string message );
+Assert.AreEqual( float expected, float actual, float tolerance,
+                 string message, params object[] parms );
+
+Assert.AreEqual( double expected, double actual, double tolerance );
+Assert.AreEqual( double expected, double actual, double tolerance,
+                 string message );
+Assert.AreEqual( double expected, double actual, double tolerance,
+                 string message, params object[] parms );
+
+Assert.AreEqual( object expected, object actual );
+Assert.AreEqual( object expected, object actual, string message );
+Assert.AreEqual( object expected, object actual, string message, 
+                 params object[] parms );
+
+Assert.AreNotEqual( int expected, int actual );
+Assert.AreNotEqual( int expected, int actual, string message );
+Assert.AreNotEqual( int expected, int actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( long expected, long actual );
+Assert.AreNotEqual( long expected, long actual, string message );
+Assert.AreNotEqual( long expected, long actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( uint expected, uint actual );
+Assert.AreNotEqual( uint expected, uint actual, string message );
+Assert.AreNotEqual( uint expected, uint actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( ulong expected, ulong actual );
+Assert.AreNotEqual( ulong expected, ulong actual, string message );
+Assert.AreNotEqual( ulong expected, ulong actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( decimal expected, decimal actual );
+Assert.AreNotEqual( decimal expected, decimal actual, string message );
+Assert.AreNotEqual( decimal expected, decimal actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( float expected, float actual );
+Assert.AreNotEqual( float expected, float actual, string message );
+Assert.AreNotEqual( float expected, float actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( double expected, double actual );
+Assert.AreNotEqual( double expected, double actual, string message );
+Assert.AreNotEqual( double expected, double actual, string message,
+                 params object[] parms );
+
+Assert.AreNotEqual( object expected, object actual );
+Assert.AreNotEqual( object expected, object actual, string message );
+Assert.AreNotEqual( object expected, object actual, string message,
+                 params object[] parms );</pre>
+</div>
+
+<h4>Comparing Numerics of Different Types</h4>
+
+<p>The method overloads that compare two objects make special provision so that numeric 
+	values of different types compare as expected. This assert succeeds:
+	<pre>        Assert.AreEqual( 5, 5.0 );</pre>
+</p>
+
+<h4>Comparing Floating Point Values</h4>
+
+<p>Values of type float and double are normally compared using an additional
+argument that indicates a tolerance within which they will be considered 
+as equal. Beginning with NUnit 2.4.4, the value of
+<b>GlobalSettings.DefaultFloatingPointTolerance</b> is used if a third argument
+is not provided. In earlier versions, or if the default has not been set,
+values are tested for exact equality.
+
+<p>Special values are handled so that the following Asserts succeed:</p>
+
+<pre>        Assert.AreEqual( double.PositiveInfinity, double.PositiveInfinity );
+        Assert.AreEqual( double.NegativeInfinity, double.NegativeInfinity );
+        Assert.AreEqual( double.NaN, double.NaN );</pre>
+
+<blockquote><i><b>Note:</b> The last example above represents a change with NUnit 2.2.3.
+      In earlier releases, the test would fail. We have made this change
+      because the new behavior seems to be more useful in tests. To avoid confusion,
+      we suggest using the new Assert.IsNaN method where appropriate.</i></blockquote>
+
+<h4>Comparing Arrays and Collections</h4>
+
+<p>Since version 2.2, NUnit has been able to compare two single-dimensioned arrays.
+    Beginning with version 2.4, multi-dimensioned arrays, nested arrays (arrays of arrays)
+	and collections may be compared. Two arrays or collections will be treated as equal 
+	by Assert.AreEqual if they have the same dimensions and if each of the corresponding 
+	elements is equal.</p>
+	
+</div>
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li id="current"><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/eventListeners.html b/doc/eventListeners.html
index 87c5047..2908e31 100644
--- a/doc/eventListeners.html
+++ b/doc/eventListeners.html
@@ -1,110 +1,111 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - EventListeners</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - EventListeners</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>EventListeners (NUnit 2.4.4)</h3>
-
-<h4>Purpose</h4>
-<p>EventListeners are able to respond to events that occur in the course
-of a test run, usually by recording information of some kind. Note that
-EventListeners called asynchronously with respect to test execution and
-are not able to affect the actual execution of the test.
-
-<h4>Extension Point</h4>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint listeners = host.GetExtensionPoint( "EventListeners" );</pre>
-
-<h4>Interface</h4>
-<p>The extension object passed to Install must implement the EventListener interface:
-
-<pre>
-	public interface EventListener
-	{
-		void RunStarted( string name, int testCount );
-		void RunFinished( TestResult result );
-		void RunFinished( Exception exception );
-		void TestStarted(TestName testName);
-		void TestFinished(TestResult result);
-		void SuiteStarted(TestName testName);
-		void SuiteFinished(TestResult result);
-		void UnhandledException( Exception exception );
-		void TestOutput(TestOutput testOutput);
-	}
-</pre>
-
-<p>You must provide all the methods, but the body may be empty for any
-that you have no need of.
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li><a href="testDecorators.html">TestDecorators</a></li>
-<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li><a href="datapointProviders.html">DatapointProviders</a></li>
-<li id="current"><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>EventListeners (NUnit 2.4.4)</h3>
+
+<h4>Purpose</h4>
+<p>EventListeners are able to respond to events that occur in the course
+of a test run, usually by recording information of some kind. Note that
+EventListeners called asynchronously with respect to test execution and
+are not able to affect the actual execution of the test.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint listeners = host.GetExtensionPoint( "EventListeners" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement the EventListener interface:
+
+<pre>
+	public interface EventListener
+	{
+		void RunStarted( string name, int testCount );
+		void RunFinished( TestResult result );
+		void RunFinished( Exception exception );
+		void TestStarted(TestName testName);
+		void TestFinished(TestResult result);
+		void SuiteStarted(TestName testName);
+		void SuiteFinished(TestResult result);
+		void UnhandledException( Exception exception );
+		void TestOutput(TestOutput testOutput);
+	}
+</pre>
+
+<p>You must provide all the methods, but the body may be empty for any
+that you have no need of.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li id="current"><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/exception.html b/doc/exception.html
index a6ea9b0..37b732e 100644
--- a/doc/exception.html
+++ b/doc/exception.html
@@ -1,329 +1,329 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>ExpectedExceptionAttribute (NUnit 2.0 plus Updates)</h3>
-
-<p>This is the way to specify that the execution of a test will throw an 
-	exception. This attribute has a number of positional and
-	named parameters, which we will discuss in separate sections
-	according to the purpose they serve.</p>
-	
-<h4>Specifying the Expected Exception Type</h4>
-
-<p>The original attribute, introduced with NUnit 2.0 took a single
-argument giving the exact type of the expected exception. For example...</p>
-
-
-<div class="code"><pre>[ExpectedException( typeof( ArgumentException ) )]
-public void TestMethod()
-{
-...</pre></div>
-
-<p>Beginning with NUnit 2.2.4, it became possible to specify the type
-of exception as a string, avoiding the need for a reference to the
-defining assembly...</p>
-
-<div class="code"><pre>[ExpectedException( "System.ArgumentException" ) )]
-public void TestMethod()
-{
-...</pre></div>
-
-<p>The above two examples function identically: the test only succeeds if a
-System.Argument exception is thrown.</p>
-
-<h4>Specifying the Expected Message</h4>
-
-<p>NUnit 2.1 introduced a constructor with a second argument, specifying the
-exact text of the message property of the exception. After NUnit 2.2.4, the
-same extension was made to the constructor taking a string argument. With
-NUnit 2.4, these arguments are marked obsolete, and a named parameter
-is provided instead...</p>
-
-<div class="code" style="width: 44em"><pre>// Obsolete form:
-[ExpectedException( typeof( ArgumentException ), "expected message" )]
-[ExpectedException( "System.ArgumentException", "expected message" )]
-
-// Prefered form:
-[ExpectedException( typeof( ArgumentException ), ExpectedMessage="expected message" )]
-[ExpectedException( "System.ArgumentException", ExpectedMessage="expected message" )]</pre></div>
-
-<p>With NUnit 2.4, it is possible to specify additional tests on the
-exception message, beyond a simple exact match. This is done using the 
-MatchType named parameter, whose argument is an enumeration, defined as
-follows:</p>
-   
-<div class="code">
-<pre>public enum MessageMatch
-{
-    /// Expect an exact match
-    Exact,	
-    /// Expect a message containing the parameter string
-    Contains,
-    /// Match the regular expression provided as a parameter
-    Regex,
-    /// Expect a message starting with the parameter string
-    StartsWith
-}</pre></div>
-
-<p>The following example is for a test that passes only if an ArgumentException
-with a message containing "unspecified" is received.</p>
-
-<div class="code" style="width: 57em">
-<pre>[ExpectedException( typeof( ArgumentException), ExpectedMessage="unspecified", MatchType=MessageMatch.Contains )]
-public void TestMethod()
-{
-...</pre></div>
-
-<p>If MatchType is not specified, an exact match is used as before.</p>
-
-<h4>Specifying a Custom Error Message</h4>
-
-<p>With NUnit 2.4, it is possible to specify a custom message to be
-displayed if the ExpectedException attribute is not satisfied. This
-is done through the UserMessage named parameter...</p>
-
-<div class="code" style="width: 41em">
-<pre>[ExpectedException( typeof( ArgumentException ), UserMessage="Custom message" )]
-public void TestMethod()
-{
-...</pre>
-</div>
-
-<h4>Handling the Exception in Code</h4>
-
-<p>If the processing required for an exception is too complex to express
-in the attribute declaration, the normal practice is to process it in the
-test code using a try/catch block. As an alternative, NUnit 2.4 allows
-designating a method that will be called to process the exception. This
-is particularly useful when multiple exceptions need to be processed
-in the same way.</p>
-
-<p>An common exception handler may be designated by implementing the
-<b>IExpectExceptionInterface</b>, which is defined as follows...</p>
-
-<div class="code">
-<pre>public interface IExpectException
-{
-    void HandleException( System.Exception ex );
-}</pre>
-</div>
-
-<p>The exception handler is only called for methods marked with
-the <b>ExpectedException</b> attribute. If all checks - including
-the type of the exception - are to be performed in code, the
-attribute may be specified without any arguments in order to
-indicate that an exception is expected.</p>
-
-<p>An handler may be designated for a particular method
-using the <b>Handler</b> named parameter.</p>
-
-<div class="code"><pre>[ExpectedException( Handler="HandlerMethod" )]
-public void TestMethod()
-{
-...
-}
-
-public void HandlerMethod( System.Exception ex )
-{
-...
-}</pre></div>
-
-<p>This technique may be
-used without implementing <b>IExpectException</b> or in
-combination with it. In the latter case, the designated handler
-applies to any method that specifies it, while the normal
-exception handler applies to any other methods that specify
-an <b>ExpectedException</b>.</p>
-
-<p>However it is specified, the handler method should examine the exception and 
-<b>Assert</b> on whatever properties are relevant. Any resulting failure message 
-will then be consistent in format with other assertions performed in the tests.</p>
-
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test]
-    [ExpectedException(typeof(InvalidOperationException))]
-    public void ExpectAnExceptionByType()
-    { /* ... */ }
-
-    [Test]
-    [ExpectedException("System.InvalidOperationException")]
-    public void ExpectAnExceptionByName()
-    { /* ... */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    <Test(), ExpectedException(GetType(Exception))>
-      Public Sub ExpectAnExceptionByType()
-    ' ...
-    End Sub
-
-  <TestFixture()> Public Class SuccessTests
-    <Test(), ExpectedException("System.Exception")>
-      Public Sub ExpectAnExceptionByName()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test]
-    [ExpectedException(__typeof(InvalidOperationException))]
-    void ExpectAnExceptionByType();
-
-    [Test]
-    [ExpectedException(S"SystemInvalidOperationException")]
-    void ExpectAnExceptionByName();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-</div>
-
-</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><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 id="current"><a href="exception.html">Exception</a></li>
-<li><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="maxtime.html">Maxtime</a></li>
-<li><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>ExpectedExceptionAttribute (NUnit 2.0 plus Updates)</h3>
+
+<p>This is the way to specify that the execution of a test will throw an 
+	exception. This attribute has a number of positional and
+	named parameters, which we will discuss in separate sections
+	according to the purpose they serve.</p>
+	
+<h4>Specifying the Expected Exception Type</h4>
+
+<p>The original attribute, introduced with NUnit 2.0 took a single
+argument giving the exact type of the expected exception. For example...</p>
+
+
+<div class="code"><pre>[ExpectedException( typeof( ArgumentException ) )]
+public void TestMethod()
+{
+...</pre></div>
+
+<p>Beginning with NUnit 2.2.4, it became possible to specify the type
+of exception as a string, avoiding the need for a reference to the
+defining assembly...</p>
+
+<div class="code"><pre>[ExpectedException( "System.ArgumentException" ) )]
+public void TestMethod()
+{
+...</pre></div>
+
+<p>The above two examples function identically: the test only succeeds if a
+System.Argument exception is thrown.</p>
+
+<h4>Specifying the Expected Message</h4>
+
+<p>NUnit 2.1 introduced a constructor with a second argument, specifying the
+exact text of the message property of the exception. After NUnit 2.2.4, the
+same extension was made to the constructor taking a string argument. With
+NUnit 2.4, these arguments are marked obsolete, and a named parameter
+is provided instead...</p>
+
+<div class="code" style="width: 44em"><pre>// Obsolete form:
+[ExpectedException( typeof( ArgumentException ), "expected message" )]
+[ExpectedException( "System.ArgumentException", "expected message" )]
+
+// Prefered form:
+[ExpectedException( typeof( ArgumentException ), ExpectedMessage="expected message" )]
+[ExpectedException( "System.ArgumentException", ExpectedMessage="expected message" )]</pre></div>
+
+<p>With NUnit 2.4, it is possible to specify additional tests on the
+exception message, beyond a simple exact match. This is done using the 
+MatchType named parameter, whose argument is an enumeration, defined as
+follows:</p>
+   
+<div class="code">
+<pre>public enum MessageMatch
+{
+    /// Expect an exact match
+    Exact,	
+    /// Expect a message containing the parameter string
+    Contains,
+    /// Match the regular expression provided as a parameter
+    Regex,
+    /// Expect a message starting with the parameter string
+    StartsWith
+}</pre></div>
+
+<p>The following example is for a test that passes only if an ArgumentException
+with a message containing "unspecified" is received.</p>
+
+<div class="code" style="width: 57em">
+<pre>[ExpectedException( typeof( ArgumentException), ExpectedMessage="unspecified", MatchType=MessageMatch.Contains )]
+public void TestMethod()
+{
+...</pre></div>
+
+<p>If MatchType is not specified, an exact match is used as before.</p>
+
+<h4>Specifying a Custom Error Message</h4>
+
+<p>With NUnit 2.4, it is possible to specify a custom message to be
+displayed if the ExpectedException attribute is not satisfied. This
+is done through the UserMessage named parameter...</p>
+
+<div class="code" style="width: 41em">
+<pre>[ExpectedException( typeof( ArgumentException ), UserMessage="Custom message" )]
+public void TestMethod()
+{
+...</pre>
+</div>
+
+<h4>Handling the Exception in Code</h4>
+
+<p>If the processing required for an exception is too complex to express
+in the attribute declaration, the normal practice is to process it in the
+test code using a try/catch block. As an alternative, NUnit 2.4 allows
+designating a method that will be called to process the exception. This
+is particularly useful when multiple exceptions need to be processed
+in the same way.</p>
+
+<p>An common exception handler may be designated by implementing the
+<b>IExpectExceptionInterface</b>, which is defined as follows...</p>
+
+<div class="code">
+<pre>public interface IExpectException
+{
+    void HandleException( System.Exception ex );
+}</pre>
+</div>
+
+<p>The exception handler is only called for methods marked with
+the <b>ExpectedException</b> attribute. If all checks - including
+the type of the exception - are to be performed in code, the
+attribute may be specified without any arguments in order to
+indicate that an exception is expected.</p>
+
+<p>An handler may be designated for a particular method
+using the <b>Handler</b> named parameter.</p>
+
+<div class="code"><pre>[ExpectedException( Handler="HandlerMethod" )]
+public void TestMethod()
+{
+...
+}
+
+public void HandlerMethod( System.Exception ex )
+{
+...
+}</pre></div>
+
+<p>This technique may be
+used without implementing <b>IExpectException</b> or in
+combination with it. In the latter case, the designated handler
+applies to any method that specifies it, while the normal
+exception handler applies to any other methods that specify
+an <b>ExpectedException</b>.</p>
+
+<p>However it is specified, the handler method should examine the exception and 
+<b>Assert</b> on whatever properties are relevant. Any resulting failure message 
+will then be consistent in format with other assertions performed in the tests.</p>
+
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test]
+    [ExpectedException(typeof(InvalidOperationException))]
+    public void ExpectAnExceptionByType()
+    { /* ... */ }
+
+    [Test]
+    [ExpectedException("System.InvalidOperationException")]
+    public void ExpectAnExceptionByName()
+    { /* ... */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    <Test(), ExpectedException(GetType(Exception))>
+      Public Sub ExpectAnExceptionByType()
+    ' ...
+    End Sub
+
+  <TestFixture()> Public Class SuccessTests
+    <Test(), ExpectedException("System.Exception")>
+      Public Sub ExpectAnExceptionByName()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test]
+    [ExpectedException(__typeof(InvalidOperationException))]
+    void ExpectAnExceptionByType();
+
+    [Test]
+    [ExpectedException(S"SystemInvalidOperationException")]
+    void ExpectAnExceptionByName();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="exception.html">Exception</a></li>
+<li><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/exceptionAsserts.html b/doc/exceptionAsserts.html
index 1b7967d..63d981c 100644
--- a/doc/exceptionAsserts.html
+++ b/doc/exceptionAsserts.html
@@ -1,245 +1,249 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ExceptionAsserts</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ExceptionAsserts</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Exception Asserts (NUnit 2.5)</h2>
-
-<p>The <b>Assert.Throws</b> method is pretty much in a class by itself. Rather than
-   comparing values, it attempts to invoke a code snippet, represented as
-   a delegate, in order to verify that it throws a particular exception.
-   
-<p>It's also in a class by itself in that it returns an Exception, rather
-    than void, if the Assert is successful. See the example below for
-	a few ways to use this.
-   
-<p><b>Assert.Throws</b> may be used with a constraint argument, which is applied
-   to the actual exception thrown, or with the Type of exception expected.
-   The Type format is available in both both a non-generic and (in the .NET 2.0 version)
-   generic form.
-   
-<p><b>Assert.DoesNotThrow</b> simply verifies that the delegate does not throw
-   an exception.
-   
-<p><b>Assert.Catch</b> is similar to <b>Assert.Throws</b> but will pass for an exception
-   that is derived from the one specified.
-   
-<div class="code" style="width: 40em"><pre>
-Exception Assert.Throws( Type expectedExceptionType, TestDelegate code );
-Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
-		string message );
-Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
-		string message, params object[] parms);
-
-Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code );
-Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
-		string message );
-Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
-		string message, params object[] parms);
-
-T Assert.Throws<T>( TestDelegate code );
-T Assert.Throws<T>( TestDelegate code, string message );
-T Assert.Throws<T>( TestDelegate code, string message, 
-		params object[] parms);
-		
-void Assert.DoesNotThrow( TestDelegate code );
-void Assert.DoesNotThrow( TestDelegate code, string message );
-void Assert.DoesNotThrow( TestDelegate code, string message, 
-        params object[] parms);
-
-Exception Assert.Catch( TestDelegate code );
-Exception Assert.Catch( TestDelegate code, string message );
-Exception Assert.Catch( TestDelegate code, string message, 
-        params object[] parms);
-
-Exception Assert.Catch( Type expectedExceptionType, TestDelegate code );
-Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
-		string message );
-Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
-		string message, params object[] parms);
-
-T Assert.Catch<T>( TestDelegate code );
-T Assert.Catch<T>( TestDelegate code, string message );
-T Assert.Catch<T>( TestDelegate code, string message, 
-		params object[] parms);
-</pre></div>
-
-<p>In the above code <b>TestDelegate</b> is a delegate of the form
-<b>void TestDelegate()</b>, which is used to execute the code
-in question. Under .NET 2.0, this may be an anonymous delegate.
-If compiling under C# 3.0, it may be a lambda expression.
-
-<p>The following example shows different ways of writing the
-same test.
-
-<div class="code"><pre>
-[TestFixture]
-public class AssertThrowsTests
-{
-  [Test]
-  public void Tests()
-  {
-    // .NET 1.x
-    Assert.Throws( typeof(ArgumentException),
-      new TestDelegate(MethodThatThrows) );
-	  
-    // .NET 2.0
-    Assert.Throws<ArgumentException>( MethodThatThrows() );
-
-    Assert.Throws<ArgumentException>(
-	  delegate { throw new ArgumentException(); } );
-
-    // Using C# 3.0	  
-    Assert.Throws<ArgumentException>(
-      () => throw new ArgumentException(); } );
-  }
-  
-  void MethodThatThrows()
-  {
-    throw new ArgumentException();
-  }
-
-</pre></div>
-
-<p>This example shows use of the return value to perform
-additional verification of the exception.
-
-<div class="code"><pre>
-[TestFixture]
-public class UsingReturnValue
-{
-  [Test]
-  public void TestException()
-  {
-    MyException ex = Assert.Throws<MyException>(
-      delegate { throw new MyException( "message", 42 ); } );
-    Assert.That( ex.Message, Is.EqualTo( "message" ) );
-    Assert.That( ex.MyParam, Is.EqualTo( 42 ) ); 
-  }
-</pre></div>
-
-<p>This example does the same thing
-using the overload that includes a constraint.
-
-<div class="code"><pre>
-[TestFixture]
-public class UsingConstraint
-{
-  [Test]
-  public void TestException()
-  {
-    Assert.Throws( Is.Typeof<MyException>()
-                 .And.Message.EqualTo( "message" )
-                 .And.Property( "MyParam" ).EqualTo( 42 ),
-      delegate { throw new MyException( "message", 42 ); } );
-  }
-</pre></div>
-
-<p>Use the form that matches your style of coding.
-
-<h3>Exact Versus Derived Types</h3>
-
-<p>When used with a Type argument, <b>Assert.Throws</b> requires
-that exact type to be thrown. If you want to test for any
-derived Type, use one of the forms that allows specifying
-a constraint. Alternatively, you may use <b>Assert.Catch</b>,
-which differs from <b>Assert.Throws</b> in allowing derived
-types. See the following code for examples:
-
-<div class="code">
-<pre>
-// Require an ApplicationException - derived types fail!
-Assert.Throws( typeof(ApplicationException), code );
-Assert.Throws<ApplicationException>()( code );
-
-// Allow both ApplicationException and any derived type
-Assert.Throws( Is.InstanceOf( typeof(ApplicationException), code );
-Assert.Throws( Is.InstanceOf<ApplicationException>(), code );
-
-// Allow both ApplicationException and any derived type
-Assert.Catch<ApplicationException>( code );
-
-// Allow any kind of exception
-Assert.Catch( code );
-</pre>
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="throwsConstraint.html">ThrowsConstraint</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li id="current"><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Exception Asserts (NUnit 2.5)</h2>
+
+<p>The <b>Assert.Throws</b> method is pretty much in a class by itself. Rather than
+   comparing values, it attempts to invoke a code snippet, represented as
+   a delegate, in order to verify that it throws a particular exception.
+   
+<p>It's also in a class by itself in that it returns an Exception, rather
+    than void, if the Assert is successful. See the example below for
+	a few ways to use this.
+   
+<p><b>Assert.Throws</b> may be used with a constraint argument, which is applied
+   to the actual exception thrown, or with the Type of exception expected.
+   The Type format is available in both both a non-generic and (in the .NET 2.0 version)
+   generic form.
+   
+<p><b>Assert.DoesNotThrow</b> simply verifies that the delegate does not throw
+   an exception.
+   
+<p><b>Assert.Catch</b> is similar to <b>Assert.Throws</b> but will pass for an exception
+   that is derived from the one specified.
+   
+<div class="code" style="width: 40em"><pre>
+Exception Assert.Throws( Type expectedExceptionType, TestDelegate code );
+Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
+		string message );
+Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
+		string message, params object[] parms);
+
+Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code );
+Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
+		string message );
+Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
+		string message, params object[] parms);
+
+T Assert.Throws<T>( TestDelegate code );
+T Assert.Throws<T>( TestDelegate code, string message );
+T Assert.Throws<T>( TestDelegate code, string message, 
+		params object[] parms);
+		
+void Assert.DoesNotThrow( TestDelegate code );
+void Assert.DoesNotThrow( TestDelegate code, string message );
+void Assert.DoesNotThrow( TestDelegate code, string message, 
+        params object[] parms);
+
+Exception Assert.Catch( TestDelegate code );
+Exception Assert.Catch( TestDelegate code, string message );
+Exception Assert.Catch( TestDelegate code, string message, 
+        params object[] parms);
+
+Exception Assert.Catch( Type expectedExceptionType, TestDelegate code );
+Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
+		string message );
+Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
+		string message, params object[] parms);
+
+T Assert.Catch<T>( TestDelegate code );
+T Assert.Catch<T>( TestDelegate code, string message );
+T Assert.Catch<T>( TestDelegate code, string message, 
+		params object[] parms);
+</pre></div>
+
+<p>In the above code <b>TestDelegate</b> is a delegate of the form
+<b>void TestDelegate()</b>, which is used to execute the code
+in question. Under .NET 2.0, this may be an anonymous delegate.
+If compiling under C# 3.0, it may be a lambda expression.
+
+<p>The following example shows different ways of writing the
+same test.
+
+<div class="code"><pre>
+[TestFixture]
+public class AssertThrowsTests
+{
+  [Test]
+  public void Tests()
+  {
+    // .NET 1.x
+    Assert.Throws( typeof(ArgumentException),
+      new TestDelegate(MethodThatThrows) );
+	  
+    // .NET 2.0
+    Assert.Throws<ArgumentException>( MethodThatThrows() );
+
+    Assert.Throws<ArgumentException>(
+	  delegate { throw new ArgumentException(); } );
+
+    // Using C# 3.0	  
+    Assert.Throws<ArgumentException>(
+      () => throw new ArgumentException(); } );
+  }
+  
+  void MethodThatThrows()
+  {
+    throw new ArgumentException();
+  }
+
+</pre></div>
+
+<p>This example shows use of the return value to perform
+additional verification of the exception.
+
+<div class="code"><pre>
+[TestFixture]
+public class UsingReturnValue
+{
+  [Test]
+  public void TestException()
+  {
+    MyException ex = Assert.Throws<MyException>(
+      delegate { throw new MyException( "message", 42 ); } );
+    Assert.That( ex.Message, Is.EqualTo( "message" ) );
+    Assert.That( ex.MyParam, Is.EqualTo( 42 ) ); 
+  }
+</pre></div>
+
+<p>This example does the same thing
+using the overload that includes a constraint.
+
+<div class="code"><pre>
+[TestFixture]
+public class UsingConstraint
+{
+  [Test]
+  public void TestException()
+  {
+    Assert.Throws( Is.Typeof<MyException>()
+                 .And.Message.EqualTo( "message" )
+                 .And.Property( "MyParam" ).EqualTo( 42 ),
+      delegate { throw new MyException( "message", 42 ); } );
+  }
+</pre></div>
+
+<p>Use the form that matches your style of coding.
+
+<h3>Exact Versus Derived Types</h3>
+
+<p>When used with a Type argument, <b>Assert.Throws</b> requires
+that exact type to be thrown. If you want to test for any
+derived Type, use one of the forms that allows specifying
+a constraint. Alternatively, you may use <b>Assert.Catch</b>,
+which differs from <b>Assert.Throws</b> in allowing derived
+types. See the following code for examples:
+
+<div class="code">
+<pre>
+// Require an ApplicationException - derived types fail!
+Assert.Throws( typeof(ApplicationException), code );
+Assert.Throws<ApplicationException>()( code );
+
+// Allow both ApplicationException and any derived type
+Assert.Throws( Is.InstanceOf( typeof(ApplicationException), code );
+Assert.Throws( Is.InstanceOf<ApplicationException>(), code );
+
+// Allow both ApplicationException and any derived type
+Assert.Catch<ApplicationException>( code );
+
+// Allow any kind of exception
+Assert.Catch( code );
+</pre>
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="throwsConstraint.html">ThrowsConstraint</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li id="current"><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/explicit.html b/doc/explicit.html
index 4b7cc1d..3be5fa1 100644
--- a/doc/explicit.html
+++ b/doc/explicit.html
@@ -1,287 +1,287 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>ExplicitAttribute (NUnit 2.2)</h3>
-
-<p>The Explicit attribute causes a test or test fixture to be ignored unless it is 
-	explicitly selected for running. The test or fixture will be run if it is 
-	selected in the gui, if its name is specified on the console runner command 
-	line as the fixture to run or if it is included by use of a Category filter.</p>
-
-<p>An optional string argument may be used to give the reason for marking
-   the test Explicit.</p>
-
-<p>If a test or fixture with the Explicit attribute is encountered in the course of 
-	running tests, it is skipped unless it has been specifically selected by one
-	of the above means. The test does not affect the outcome of the run at all:
-	it is not considered as ignored and is not even counted in the total number
-	of tests. In the gui, the tree node for the test remains gray and the
-	status bar color is not affected.</p>
-	
-<blockquote><i><b>Note:</b> In versions of NUnit prior to 2.4, these tests were
-    shown as ignored.</i></blockquote>
-
-<h4>Test Fixture Syntax</h4>
-
-<div id="trace">
-</div>
-
-<div class="code cs">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture, Explicit]
-  public class ExplicitTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Explicit()>
-  Public Class ExplicitTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [Explicit]
-  public __gc class ExplicitTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Explicit() */
-public class ExplicitTests
-{
-  // ...
-}
-</pre>
-
-</div>
-
-<h4>Test Syntax</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test, Explicit]
-    public void ExplicitTest()
-    { /* ... */ }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()>
-  Public Class SuccessTests
-    <Test(), Explicit()> Public Sub ExplicitTest()
-      ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test][Explicit] void ExplicitTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Explicit() */
-  public void ExplicitTest()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-</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><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 id="current"><a href="explicit.html">Explicit</a></li>
-<li><a href="ignore.html">Ignore</a></li>
-<li><a href="maxtime.html">Maxtime</a></li>
-<li><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>ExplicitAttribute (NUnit 2.2)</h3>
+
+<p>The Explicit attribute causes a test or test fixture to be ignored unless it is 
+	explicitly selected for running. The test or fixture will be run if it is 
+	selected in the gui, if its name is specified on the console runner command 
+	line as the fixture to run or if it is included by use of a Category filter.</p>
+
+<p>An optional string argument may be used to give the reason for marking
+   the test Explicit.</p>
+
+<p>If a test or fixture with the Explicit attribute is encountered in the course of 
+	running tests, it is skipped unless it has been specifically selected by one
+	of the above means. The test does not affect the outcome of the run at all:
+	it is not considered as ignored and is not even counted in the total number
+	of tests. In the gui, the tree node for the test remains gray and the
+	status bar color is not affected.</p>
+	
+<blockquote><i><b>Note:</b> In versions of NUnit prior to 2.4, these tests were
+    shown as ignored.</i></blockquote>
+
+<h4>Test Fixture Syntax</h4>
+
+<div id="trace">
+</div>
+
+<div class="code cs">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture, Explicit]
+  public class ExplicitTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Explicit()>
+  Public Class ExplicitTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [Explicit]
+  public __gc class ExplicitTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Explicit() */
+public class ExplicitTests
+{
+  // ...
+}
+</pre>
+
+</div>
+
+<h4>Test Syntax</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test, Explicit]
+    public void ExplicitTest()
+    { /* ... */ }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()>
+  Public Class SuccessTests
+    <Test(), Explicit()> Public Sub ExplicitTest()
+      ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test][Explicit] void ExplicitTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Explicit() */
+  public void ExplicitTest()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="explicit.html">Explicit</a></li>
+<li><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/extensibility.html b/doc/extensibility.html
index a5d7de0..25b204c 100644
--- a/doc/extensibility.html
+++ b/doc/extensibility.html
@@ -1,83 +1,84 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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 Extensibility</h2>
-
-<p>NUnit is designed to be extended in a number of ways.</p>
-
-<p>Extensions to the NUnit framework - the part of NUnit that is referenced
-by tests - usually take the form of 
-<a href="customConstraints.html">Custom Constraints</a>, written by users to 
-encapsulate tests that pertain to their specific projects.</p>
-
-<p>Extending the features found within NUnit itself depends on the use of
-<a href="nunitAddins.html">NUnit Addins</a>. 
-Currently, The Addin mechanism only supports extensions to the NUnit core -
-the part of NUnit that builds and executes test suites. However, the API that
-is used provides for the future ability to extend the client side of NUnit, 
-including the GUI.</p>
-
-
-</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 id="current"><a href="extensibility.html">Extensibility</a></li>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit Extensibility</h2>
+
+<p>NUnit is designed to be extended in a number of ways.</p>
+
+<p>Extensions to the NUnit framework - the part of NUnit that is referenced
+by tests - usually take the form of 
+<a href="customConstraints.html">Custom Constraints</a>, written by users to 
+encapsulate tests that pertain to their specific projects.</p>
+
+<p>Extending the features found within NUnit itself depends on the use of
+<a href="nunitAddins.html">NUnit Addins</a>. 
+Currently, The Addin mechanism only supports extensions to the NUnit core -
+the part of NUnit that builds and executes test suites. However, the API that
+is used provides for the future ability to extend the client side of NUnit, 
+including the GUI.</p>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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 id="current"><a href="extensibility.html">Extensibility</a></li>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/extensionTips.html b/doc/extensionTips.html
index 4ca6192..42d2a6b 100644
--- a/doc/extensionTips.html
+++ b/doc/extensionTips.html
@@ -1,100 +1,101 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ExtensionTips</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ExtensionTips</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>Tips for Writing Extensions</h3>
-
-<p>An Extenders Guide will be published in the future. At the moment, writing an
-extension is a bit of an adventure. Extension authors are advised to join the 
-nunit-developer list and post questions and comments there.
-
-<p>For the moment, the following tips may be of assistance.
-<ul>
-<li>The <b>nunit.core.interfaces</b> assembly is intended to be stable in the future
-while the <b>nunit.core</b> assembly will change from release to release. Right now,
-both assemblies are still in flux, but extensions that depend solely on the interfaces
-assembly will have a much better chance of surviving NUnit version changes. Unfortunately,
-this is rather difficult to do without duplicating a great deal of NUnit code. Most
-of the add-in samples provided with NUnit are currently version dependent.
-
-<li>If you place the definition of a custom attribute in the same assembly as your
-add-in, then user tests are dependent on the add-in assembly. If the add-in is 
-version-dependent, then the user tests will also be version-dependent. We suggest
-placing any types referenced by user tests in a separate assembly, particularly if
-your extension relies on nunit.core.
-
-<li>If using Visual Studio, set Copy Local to false for any references to nunit.core
-or nunit.core.interfaces. This is especially important if you are also building
-NUnit itself.
-
-<li>There is currently no mechanism to allow decorators to apply in a particular order.
-NUnit applies decorators in the order in which they are returned through reflection,
-which may vary among different runtimes.
-
-<li>Avoid trying to "stretch" the existing extension points to do more than they were
-intended to do. Rather, let us know what further extension points you would like to see!
-</ul>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<li id="current"><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>Tips for Writing Extensions</h3>
+
+<p>An Extenders Guide will be published in the future. At the moment, writing an
+extension is a bit of an adventure. Extension authors are advised to join the 
+nunit-developer list and post questions and comments there.
+
+<p>For the moment, the following tips may be of assistance.
+<ul>
+<li>The <b>nunit.core.interfaces</b> assembly is intended to be stable in the future
+while the <b>nunit.core</b> assembly will change from release to release. Right now,
+both assemblies are still in flux, but extensions that depend solely on the interfaces
+assembly will have a much better chance of surviving NUnit version changes. Unfortunately,
+this is rather difficult to do without duplicating a great deal of NUnit code. Most
+of the add-in samples provided with NUnit are currently version dependent.
+
+<li>If you place the definition of a custom attribute in the same assembly as your
+add-in, then user tests are dependent on the add-in assembly. If the add-in is 
+version-dependent, then the user tests will also be version-dependent. We suggest
+placing any types referenced by user tests in a separate assembly, particularly if
+your extension relies on nunit.core.
+
+<li>If using Visual Studio, set Copy Local to false for any references to nunit.core
+or nunit.core.interfaces. This is especially important if you are also building
+NUnit itself.
+
+<li>There is currently no mechanism to allow decorators to apply in a particular order.
+NUnit applies decorators in the order in which they are returned through reflection,
+which may vary among different runtimes.
+
+<li>Avoid trying to "stretch" the existing extension points to do more than they were
+intended to do. Rather, let us know what further extension points you would like to see!
+</ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<li id="current"><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/fileAssert.html b/doc/fileAssert.html
index b9b7567..679a035 100644
--- a/doc/fileAssert.html
+++ b/doc/fileAssert.html
@@ -1,123 +1,127 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>FileAssert (NUnit 2.4)</h2>
-<p>The FileAssert class provides methods for comparing two files,
-which may be provided as Streams, as FileInfos or as strings 
-giving the path to each file.</p>
-
-<div class="code" style="width: 36em">
-<pre>FileAssert.AreEqual( Stream expected, Stream actual );
-FileAssert.AreEqual( Stream expected, Stream actual, 
-                string message );
-FileAssert.AreEqual( Stream expected, Stream actual,
-                string message, params object[] args );
-
-FileAssert.AreEqual( FileInfo expected, FileInfo actual );
-FileAssert.AreEqual( FileInfo expected, FileInfo actual, 
-                string message );
-FileAssert.AreEqual( FileInfo expected, FileInfo actual,
-                string message, params object[] args );
-
-FileAssert.AreEqual( string expected, string actual );
-FileAssert.AreEqual( string expected, string actual, 
-                string message );
-FileAssert.AreEqual( string expected, string actual,
-                string message, params object[] args );
-
-FileAssert.AreNotEqual( Stream expected, Stream actual );
-FileAssert.AreNotEqual( Stream expected, Stream actual, 
-                string message );
-FileAssert.AreNotEqual( Stream expected, Stream actual,
-                string message, params object[] args );
-
-FileAssert.AreNotEqual( FileInfo expected, FileInfo actual );
-FileAssert.AreNotEqual( FileInfo expected, FileInfo actual, 
-                string message );
-FileAssert.AreNotEqual( FileInfo expected, FileInfo actual,
-                string message, params object[] args );
-
-FileAssert.AreNotEqual( string expected, string actual );
-FileAssert.AreNotEqual( string expected, string actual, 
-                string message );
-FileAssert.AreNotEqual( string expected, string actual,
-                string message, params object[] args );</pre>
-</div>
-
-</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>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li id="current"><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>FileAssert (NUnit 2.4)</h2>
+<p>The FileAssert class provides methods for comparing two files,
+which may be provided as Streams, as FileInfos or as strings 
+giving the path to each file.</p>
+
+<div class="code" style="width: 36em">
+<pre>FileAssert.AreEqual( Stream expected, Stream actual );
+FileAssert.AreEqual( Stream expected, Stream actual, 
+                string message );
+FileAssert.AreEqual( Stream expected, Stream actual,
+                string message, params object[] args );
+
+FileAssert.AreEqual( FileInfo expected, FileInfo actual );
+FileAssert.AreEqual( FileInfo expected, FileInfo actual, 
+                string message );
+FileAssert.AreEqual( FileInfo expected, FileInfo actual,
+                string message, params object[] args );
+
+FileAssert.AreEqual( string expected, string actual );
+FileAssert.AreEqual( string expected, string actual, 
+                string message );
+FileAssert.AreEqual( string expected, string actual,
+                string message, params object[] args );
+
+FileAssert.AreNotEqual( Stream expected, Stream actual );
+FileAssert.AreNotEqual( Stream expected, Stream actual, 
+                string message );
+FileAssert.AreNotEqual( Stream expected, Stream actual,
+                string message, params object[] args );
+
+FileAssert.AreNotEqual( FileInfo expected, FileInfo actual );
+FileAssert.AreNotEqual( FileInfo expected, FileInfo actual, 
+                string message );
+FileAssert.AreNotEqual( FileInfo expected, FileInfo actual,
+                string message, params object[] args );
+
+FileAssert.AreNotEqual( string expected, string actual );
+FileAssert.AreNotEqual( string expected, string actual, 
+                string message );
+FileAssert.AreNotEqual( string expected, string actual,
+                string message, params object[] args );</pre>
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li id="current"><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/fixtureSetup.html b/doc/fixtureSetup.html
index 2eb6de1..ecf9b2a 100644
--- a/doc/fixtureSetup.html
+++ b/doc/fixtureSetup.html
@@ -1,251 +1,251 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>TestFixtureSetUpAttribute (NUnit 2.1 / 2.5)</h3>
-
-<p>This attribute is used inside a TestFixture to provide a single set of 
-	functions that are performed once prior to executing any of the tests
-	in the fixture. 
-	
-<p><b>Before NUnit 2.5</b>, a TestFixture could have only one TestFixtureSetUp method
-	and it was required to be an instance method. 
-
-<p><b>Beginning with NUnit 2.5</b>, TestFixtureSetUp methods may be either static or
-   instance methods and you may define more than one of them in a fixture.
-   Normally, multiple TestFixtureSetUp methods are only defined at different levels
-   of an inheritance hierarchy, as explained below.
-
-<p>If a TestFixtueSetUp method fails or throws an exception, none of the tests
-   in the fixure are executed and a failure or error is reported.
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [TestFixtureSetUp] public void Init()
-    { /* ... */ }
-
-    [TestFixtureTearDown] public void Cleanup()
-    { /* ... */ }
-
-    [Test] public void Add()
-    { /* ... */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    <TestFixtureSetUp()> Public Sub Init()
-    ' ...
-    End Sub
-
-    <TestFixtureTearDown()> Public Sub Cleanup()
-    ' ...
-    End Sub
-
-    <Test()> Public Sub Add()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [TestFixtureSetUp] void Init();
-    [TestFixtureTearDown] void Cleanup();
-
-    [Test] void Add();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.TestFixtureSetUp() */
-  public void Init()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.TestFixtureTearDown() */
-  public void Cleanup()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.Test() */
-  public void Add()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h3>Inheritance</h3>
-
-<p>The TestFixtureSetUp attribute is inherited from any base class. Therefore, if a base 
-	class has defined a SetFixtureSetUp method, that method will be called 
-	after each test method in the derived class. 
-	
-<p>Before NUnit 2.5, you were permitted only one TestFixtureSetUp method. If you wanted to 
-   have some TestFixtureSetUp functionality in the base class and add more in the derived 
-   class you needed to call the base class method yourself.
-
-<p>With NUnit 2.5, you can achieve the same result by defining a TestFixtureSetUp method
-   in the base class and another in the derived class. NUnit will call base
-   class TestFixtureSetUp methods before those in the derived classes.
-   
-<p><b>Note:</b> Although it is possible to define multiple TestFixtureSetUp methods
-   in the same class, you should rarely do so. Unlike methods defined in
-   separate classes in the inheritance hierarchy, the order in which they
-   are executed is not guaranteed.
-
-<h4>See also...</h4>
-<ul>
-<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TestFixtureSetUpAttribute (NUnit 2.1 / 2.5)</h3>
+
+<p>This attribute is used inside a TestFixture to provide a single set of 
+	functions that are performed once prior to executing any of the tests
+	in the fixture. 
+	
+<p><b>Before NUnit 2.5</b>, a TestFixture could have only one TestFixtureSetUp method
+	and it was required to be an instance method. 
+
+<p><b>Beginning with NUnit 2.5</b>, TestFixtureSetUp methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple TestFixtureSetUp methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+
+<p>If a TestFixtueSetUp method fails or throws an exception, none of the tests
+   in the fixure are executed and a failure or error is reported.
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [TestFixtureSetUp] public void Init()
+    { /* ... */ }
+
+    [TestFixtureTearDown] public void Cleanup()
+    { /* ... */ }
+
+    [Test] public void Add()
+    { /* ... */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    <TestFixtureSetUp()> Public Sub Init()
+    ' ...
+    End Sub
+
+    <TestFixtureTearDown()> Public Sub Cleanup()
+    ' ...
+    End Sub
+
+    <Test()> Public Sub Add()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [TestFixtureSetUp] void Init();
+    [TestFixtureTearDown] void Cleanup();
+
+    [Test] void Add();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.TestFixtureSetUp() */
+  public void Init()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.TestFixtureTearDown() */
+  public void Cleanup()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.Test() */
+  public void Add()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h3>Inheritance</h3>
+
+<p>The TestFixtureSetUp attribute is inherited from any base class. Therefore, if a base 
+	class has defined a SetFixtureSetUp method, that method will be called 
+	after each test method in the derived class. 
+	
+<p>Before NUnit 2.5, you were permitted only one TestFixtureSetUp method. If you wanted to 
+   have some TestFixtureSetUp functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+
+<p>With NUnit 2.5, you can achieve the same result by defining a TestFixtureSetUp method
+   in the base class and another in the derived class. NUnit will call base
+   class TestFixtureSetUp methods before those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple TestFixtureSetUp methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a><li><a href="setupFixture.html">SetUpFixtureAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/fixtureTeardown.html b/doc/fixtureTeardown.html
index e684a98..9cd1d7c 100644
--- a/doc/fixtureTeardown.html
+++ b/doc/fixtureTeardown.html
@@ -1,251 +1,251 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>TestFixtureTearDownAttribute (NUnit 2.1 / 2.5)</h3>
-
-<p>This attribute is used inside a TestFixture to provide a single set of 
-	functions that are performed once after all tests are completed. 
-	
-<p><b>Before NUnit 2.5</b>, a TestFixture could have only one SetUp method
-	and it was required to be an instance method. 
-
-<p><b>Beginning with NUnit 2.5</b>, TestFixtureTearDown methods may be either static or
-   instance methods and you may define more than one of them in a fixture.
-   Normally, multiple TestFixtureTearDown methods are only defined at different levels
-   of an inheritance hierarchy, as explained below.
-
-<p>So long as any TestFixtureSetUp method runs without error, the TestFixtureTearDown method is 
-   guaranteed to run. It will not run if a TestFixtureSetUp method fails or throws an 
-   exception.</p>
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [TestFixtureSetUp] public void Init()
-    { /* ... */ }
-
-    [TestFixtureTearDown] public void Cleanup()
-    { /* ... */ }
-
-    [Test] public void Add()
-    { /* ... */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    <TestFixtureSetUp()> Public Sub Init()
-    ' ...
-    End Sub
-
-    <TestFixtureTearDown()> Public Sub Cleanup()
-    ' ...
-    End Sub
-
-    <Test()> Public Sub Add()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [TestFixtureSetUp] void Init();
-    [TestFixtureTearDown] void Cleanup();
-
-    [Test] void Add();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.TestFixtureSetUp() */
-  public void Init()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.TestFixtureTearDown() */
-  public void Cleanup()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.Test() */
-  public void Add()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h3>Inheritance</h3>
-
-<p>The TestFixtureTearDown attribute is inherited from any base class. Therefore, if a base 
-	class has defined a TestFixtureTearDown method, that method will be called 
-	after each test method in the derived class. 
-	
-<p>Before NUnit 2.5, you were permitted only one TestFixtureTearDown method. If you wanted to 
-   have some TestFixtureTearDown functionality in the base class and add more in the derived 
-   class you needed to call the base class method yourself.
-   
-<p>With NUnit 2.5, you can achieve the same result by defining a TestFixtureTearDown method
-   in the base class and another in the derived class. NUnit will call base
-   class TestFixtureTearDown methods after those in the derived classes.
-   
-<p><b>Note:</b> Although it is possible to define multiple TestFixtureTearDown methods
-   in the same class, you should rarely do so. Unlike methods defined in
-   separate classes in the inheritance hierarchy, the order in which they
-   are executed is not guaranteed.
-
-<h4>See also...</h4>
-<ul>
-<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TestFixtureTearDownAttribute (NUnit 2.1 / 2.5)</h3>
+
+<p>This attribute is used inside a TestFixture to provide a single set of 
+	functions that are performed once after all tests are completed. 
+	
+<p><b>Before NUnit 2.5</b>, a TestFixture could have only one SetUp method
+	and it was required to be an instance method. 
+
+<p><b>Beginning with NUnit 2.5</b>, TestFixtureTearDown methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple TestFixtureTearDown methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+
+<p>So long as any TestFixtureSetUp method runs without error, the TestFixtureTearDown method is 
+   guaranteed to run. It will not run if a TestFixtureSetUp method fails or throws an 
+   exception.</p>
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [TestFixtureSetUp] public void Init()
+    { /* ... */ }
+
+    [TestFixtureTearDown] public void Cleanup()
+    { /* ... */ }
+
+    [Test] public void Add()
+    { /* ... */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    <TestFixtureSetUp()> Public Sub Init()
+    ' ...
+    End Sub
+
+    <TestFixtureTearDown()> Public Sub Cleanup()
+    ' ...
+    End Sub
+
+    <Test()> Public Sub Add()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [TestFixtureSetUp] void Init();
+    [TestFixtureTearDown] void Cleanup();
+
+    [Test] void Add();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.TestFixtureSetUp() */
+  public void Init()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.TestFixtureTearDown() */
+  public void Cleanup()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.Test() */
+  public void Add()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h3>Inheritance</h3>
+
+<p>The TestFixtureTearDown attribute is inherited from any base class. Therefore, if a base 
+	class has defined a TestFixtureTearDown method, that method will be called 
+	after each test method in the derived class. 
+	
+<p>Before NUnit 2.5, you were permitted only one TestFixtureTearDown method. If you wanted to 
+   have some TestFixtureTearDown functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+   
+<p>With NUnit 2.5, you can achieve the same result by defining a TestFixtureTearDown method
+   in the base class and another in the derived class. NUnit will call base
+   class TestFixtureTearDown methods after those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple TestFixtureTearDown methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="setupFixture.html">SetUpFixtureAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/getStarted.html b/doc/getStarted.html
index adfd918..84fbbe4 100644
--- a/doc/getStarted.html
+++ b/doc/getStarted.html
@@ -1,85 +1,86 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Getting Started with NUnit</h2>
-
-<p>If you haven't already done so, go to our <a href="http://www.nunit.org/download.html">Download</a>	page, select a version of NUnit and download it. The 
-	<a href="installation.html">Installation</a> page 
-	contains instructions for installing on your system.</p>
-
-<p>To get started using NUnit, read the <a href="quickStart.html">Quick Start</a>	page. This article demonstrates the development process with NUnit in the 
-	context of a C# banking application. Check the 
-	<a href="samples.html">Samples</a> page for additional examples, 
-	including some in VB.Net, J# and managed C++.</p>
-
-<h3>Which Test Runner to use?</h3>
-
-<p>NUnit has two different ways to run your tests. The 
-	<a href="nunit-console.html">console runner</a>, nunit-console.exe, 
-	is the fastest to launch, but is not interactive. 
- 	The <a href="nunit-gui.html">gui runner</a>, 
-	nunit.exe, is a Windows Forms application that allows you to work 
-	selectively with your tests and provides graphical feedback.</p>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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="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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Getting Started with NUnit</h2>
+
+<p>If you haven't already done so, go to our <a href="http://www.nunit.org/download.html">Download</a>	page, select a version of NUnit and download it. The 
+	<a href="installation.html">Installation</a> page 
+	contains instructions for installing on your system.</p>
+
+<p>To get started using NUnit, read the <a href="quickStart.html">Quick Start</a>	page. This article demonstrates the development process with NUnit in the 
+	context of a C# banking application. Check the 
+	<a href="samples.html">Samples</a> page for additional examples, 
+	including some in VB.Net, J# and managed C++.</p>
+
+<h3>Which Test Runner to use?</h3>
+
+<p>NUnit has two different ways to run your tests. The 
+	<a href="nunit-console.html">console runner</a>, nunit-console.exe, 
+	is the fastest to launch, but is not interactive. 
+ 	The <a href="nunit-gui.html">gui runner</a>, 
+	nunit.exe, is a Windows Forms application that allows you to work 
+	selectively with your tests and provides graphical feedback.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/guiCommandLine.html b/doc/guiCommandLine.html
index 10909f4..6c4bbb1 100644
--- a/doc/guiCommandLine.html
+++ b/doc/guiCommandLine.html
@@ -1,199 +1,200 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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 Command Line Options</h2>
-<p>The forms interface may be run with or without the name of a file containing 
-	tests on the command line. If the program is started without any file 
-	specified, it automatically loads the most recently loaded assembly.</p>
-<p><b>Note:</b> Options that take values may use an equal sign, a colon or a space 
-	to separate the option from its value.</p>
-<p><b>Note:</b> Under the Windows operating system, options may be prefixed by either
-    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>Run without loading an Assembly</h4>
-<p>To suppress loading of the most recent assembly, use the <b>/noload</b> switch:
-	<pre class="programtext">        nunit /noload</pre>
-</p>
-<h4>Specifying an Assembly</h4>
-<p>The other option is to specify an assembly or project file name on the command 
-	line. The following will start the forms interface with the assembly 
-	nunit.tests.dll:
-	<pre class="programtext">        nunit nunit.tests.dll</pre>
-</p>
-<p>The following will start the forms interface loading the same assembly through 
-	its Visual Studio project definition:
-	<pre class="programtext">        nunit nunit.tests.csproj</pre>
-</p>
-<p>Assuming an NUnit test project has been created containing the assembly, the 
-	following will again load nunit.tests.dll:
-	<pre class="programtext">        nunit nunit.tests.nunit</pre>
-</p>
-<h4>Specifying an Assembly and a Fixture</h4>
-<p>
-	When specifying a a fixture, you must give the full name of the test fixture 
-	along with the containing assembly. For example, to load only the 
-	NUnit.Tests.AssertionTests in the nunit.tests.dll assembly use the following 
-	command:
-	<pre class="programtext">        nunit /fixture:NUnit.Tests.AssertionTests nunit.tests.dll</pre>
-</p>
-<p>The name specified after the <b>/fixture</b> option may be that of a TestFixture 
-	class, or a namespace. If a namespace is given, then all fixtures under that 
-	namespace are loaded. This option may be used with Visual Studio or NUnit 
-	projects as well.</p>
-
-<h4>Specifying Test Categories to Include or Exclude</h4>
-<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> or <b>/exclude</b> options. The following command 
-	starts the gui with only the tests in the BaseLine category selected:
-	<pre class="programtext">        nunit myassembly.dll /include:BaseLine</pre>
-</p>
-<p>The following command selects all tests <b>except</b> those in the Database 
-	category:
-	<pre class="programtext">        nunit myassembly.dll /exclude:Database</pre>
-</p>
-<p>
-Multiple categories may be specified on either option, by using commas to 
-separate them.
-<p><b>Note:</b> At this time, the /include and /exclude options may not be
-combined on the command line.</p>
-<!--   
-<h4>Specifying the Version of the CLR</h4>
-
-<p>Most applications are written to run under a specific version of the CLR.
-A few are designed to operate correctly under multiple versions. In either case,
-it is important to be able to specify the CLR version to be used for testing.</p>
-
-<p>When only one version of the CLR is used, the config files for nunit and
-nunit-console may be set up to specify that version. As a more convenient
-alternative when switching CLRs, you may use the provided <b>clr.bat</b>
-command to specify the version under which NUnit should run.</p>
-
-<p>For example, to run the gui under the RTM version of 
-the .Net 2.0 framework, use:</p>
-
-<pre class="programtext">       clr net-2.0 nunit</pre>
-
-<p>The <b>clr.bat</b> file is located in the NUnit <b>bin</b> directory. You may
-put this on your path, or copy it to a convenient location. Enter <b>clr /?</b> 
-for a list of options.</p>
-	
-<p><b>Note:</b> If you use a <startup> section in the config file, it takes
-precedence over this option.</p>
-
-<p><b>Note:</b> This command is specific to the Microsoft .Net 
-framework. The Mono framework provides other means to specify the version
-to be used when running a command and the NUnit Windows interface does
-not currently run under Mono.</p>
--->
-
-<h4>Load and Run All Tests</h4>
-Normally, nunit only loads an assembly and then waits for the user to click 
-on the Run button. If you wish to have the tests run immediately, use the <b>/run</b>
-option:
-<pre class="programtext">        nunit nunit.tests.dll /run</pre>
-</p>
-<h4>Load and Run Selected Tests</h4>
-To load and immediately rerun the last selected tests, use the <b>/runselected</b>
-option:
-<pre class="programtext">        nunit nunit.tests.dll /runselected</pre>
-</p>
-<p><b>Note:</b> If no selection has been saved, this option works just like <b>/run</b>.
-<h4>Specifying which Configuration to Load</h4>
-<p>When loading a Visual Studio project or an NUnit project, the first 
-	configuration found will be loaded by default. Usually this is Debug. The 
-	configuration loaded may be controlled using the <b>/config</b> switch. The 
-	following will load the Release configuration of the nunit.tests.dll:
-	<pre class="programtext">        nunit 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>The forms interface does <b>not</b> currently provide for specifying more than 
-	one assembly on the command line. Multiple-assembly projects must be loaded by 
-	specifying the name of a Visual Studio solution file or an NUnit test project.</p>
-<h4>Clearing the ShadowCopy Cache</h4>
-<p>The <b>/cleanup</b> option erases the shadow copy cache and exits.
-<h4>Displaying Help</h4>
-<p>The <b>/help</b> or <b>/?</b> option displays a message box containing a brief 
-	help message.</p>
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li id="current"><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit Command Line Options</h2>
+<p>The forms interface may be run with or without the name of a file containing 
+	tests on the command line. If the program is started without any file 
+	specified, it automatically loads the most recently loaded assembly.</p>
+<p><b>Note:</b> Options that take values may use an equal sign, a colon or a space 
+	to separate the option from its value.</p>
+<p><b>Note:</b> Under the Windows operating system, options may be prefixed by either
+    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>Run without loading an Assembly</h4>
+<p>To suppress loading of the most recent assembly, use the <b>/noload</b> switch:
+	<pre class="programtext">        nunit /noload</pre>
+</p>
+<h4>Specifying an Assembly</h4>
+<p>The other option is to specify an assembly or project file name on the command 
+	line. The following will start the forms interface with the assembly 
+	nunit.tests.dll:
+	<pre class="programtext">        nunit nunit.tests.dll</pre>
+</p>
+<p>The following will start the forms interface loading the same assembly through 
+	its Visual Studio project definition:
+	<pre class="programtext">        nunit nunit.tests.csproj</pre>
+</p>
+<p>Assuming an NUnit test project has been created containing the assembly, the 
+	following will again load nunit.tests.dll:
+	<pre class="programtext">        nunit nunit.tests.nunit</pre>
+</p>
+<h4>Specifying an Assembly and a Fixture</h4>
+<p>
+	When specifying a a fixture, you must give the full name of the test fixture 
+	along with the containing assembly. For example, to load only the 
+	NUnit.Tests.AssertionTests in the nunit.tests.dll assembly use the following 
+	command:
+	<pre class="programtext">        nunit /fixture:NUnit.Tests.AssertionTests nunit.tests.dll</pre>
+</p>
+<p>The name specified after the <b>/fixture</b> option may be that of a TestFixture 
+	class, or a namespace. If a namespace is given, then all fixtures under that 
+	namespace are loaded. This option may be used with Visual Studio or NUnit 
+	projects as well.</p>
+
+<h4>Specifying Test Categories to Include or Exclude</h4>
+<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> or <b>/exclude</b> options. The following command 
+	starts the gui with only the tests in the BaseLine category selected:
+	<pre class="programtext">        nunit myassembly.dll /include:BaseLine</pre>
+</p>
+<p>The following command selects all tests <b>except</b> those in the Database 
+	category:
+	<pre class="programtext">        nunit myassembly.dll /exclude:Database</pre>
+</p>
+<p>
+Multiple categories may be specified on either option, by using commas to 
+separate them.
+<p><b>Note:</b> At this time, the /include and /exclude options may not be
+combined on the command line.</p>
+<!--   
+<h4>Specifying the Version of the CLR</h4>
+
+<p>Most applications are written to run under a specific version of the CLR.
+A few are designed to operate correctly under multiple versions. In either case,
+it is important to be able to specify the CLR version to be used for testing.</p>
+
+<p>When only one version of the CLR is used, the config files for nunit and
+nunit-console may be set up to specify that version. As a more convenient
+alternative when switching CLRs, you may use the provided <b>clr.bat</b>
+command to specify the version under which NUnit should run.</p>
+
+<p>For example, to run the gui under the RTM version of 
+the .Net 2.0 framework, use:</p>
+
+<pre class="programtext">       clr net-2.0 nunit</pre>
+
+<p>The <b>clr.bat</b> file is located in the NUnit <b>bin</b> directory. You may
+put this on your path, or copy it to a convenient location. Enter <b>clr /?</b> 
+for a list of options.</p>
+	
+<p><b>Note:</b> If you use a <startup> section in the config file, it takes
+precedence over this option.</p>
+
+<p><b>Note:</b> This command is specific to the Microsoft .Net 
+framework. The Mono framework provides other means to specify the version
+to be used when running a command and the NUnit Windows interface does
+not currently run under Mono.</p>
+-->
+
+<h4>Load and Run All Tests</h4>
+Normally, nunit only loads an assembly and then waits for the user to click 
+on the Run button. If you wish to have the tests run immediately, use the <b>/run</b>
+option:
+<pre class="programtext">        nunit nunit.tests.dll /run</pre>
+</p>
+<h4>Load and Run Selected Tests</h4>
+To load and immediately rerun the last selected tests, use the <b>/runselected</b>
+option:
+<pre class="programtext">        nunit nunit.tests.dll /runselected</pre>
+</p>
+<p><b>Note:</b> If no selection has been saved, this option works just like <b>/run</b>.
+<h4>Specifying which Configuration to Load</h4>
+<p>When loading a Visual Studio project or an NUnit project, the first 
+	configuration found will be loaded by default. Usually this is Debug. The 
+	configuration loaded may be controlled using the <b>/config</b> switch. The 
+	following will load the Release configuration of the nunit.tests.dll:
+	<pre class="programtext">        nunit 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>The forms interface does <b>not</b> currently provide for specifying more than 
+	one assembly on the command line. Multiple-assembly projects must be loaded by 
+	specifying the name of a Visual Studio solution file or an NUnit test project.</p>
+<h4>Clearing the ShadowCopy Cache</h4>
+<p>The <b>/cleanup</b> option erases the shadow copy cache and exits.
+<h4>Displaying Help</h4>
+<p>The <b>/help</b> or <b>/?</b> option displays a message box containing a brief 
+	help message.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li id="current"><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/identityAsserts.html b/doc/identityAsserts.html
index 2544729..3e33590 100644
--- a/doc/identityAsserts.html
+++ b/doc/identityAsserts.html
@@ -1,108 +1,112 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Identity Asserts</h2>
-
-<p><b>Assert.AreSame</b> and <b>Assert.AreNotSame</b> test whether the same objects are 
-referenced by the two arguments.</p> 
-
-<div class="code" style="width: 36em" >
-<pre>Assert.AreSame( object expected, object actual );
-Assert.AreSame( object expected, object actual, string message );
-Assert.AreSame( object expected, object actual, string message, 
-                params object[] parms );
-
-Assert.AreNotSame( object expected, object actual );
-Assert.AreNotSame( object expected, object actual, string message );
-Assert.AreNotSame( object expected, object actual, string message, 
-                params object[] parms );</pre>
-</div>
-
-<p><b>Assert.Contains</b> is used to test whether an object is contained in an array 
-or list.</p>
-
-<div class="code" width="36em">
-<pre>Assert.Contains( object anObject, IList collection );
-Assert.Contains( object anObject, IList collection, 
-                string message );
-Assert.Contains( object anObject, IList collection,
-                string message, params object[] parms );</pre>
-</div>
-
-</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>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li id="current"><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Identity Asserts</h2>
+
+<p><b>Assert.AreSame</b> and <b>Assert.AreNotSame</b> test whether the same objects are 
+referenced by the two arguments.</p> 
+
+<div class="code" style="width: 36em" >
+<pre>Assert.AreSame( object expected, object actual );
+Assert.AreSame( object expected, object actual, string message );
+Assert.AreSame( object expected, object actual, string message, 
+                params object[] parms );
+
+Assert.AreNotSame( object expected, object actual );
+Assert.AreNotSame( object expected, object actual, string message );
+Assert.AreNotSame( object expected, object actual, string message, 
+                params object[] parms );</pre>
+</div>
+
+<p><b>Assert.Contains</b> is used to test whether an object is contained in an array 
+or list.</p>
+
+<div class="code" width="36em">
+<pre>Assert.Contains( object anObject, IList collection );
+Assert.Contains( object anObject, IList collection, 
+                string message );
+Assert.Contains( object anObject, IList collection,
+                string message, params object[] parms );</pre>
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li id="current"><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/ignore.html b/doc/ignore.html
index 8f24845..2e06f56 100644
--- a/doc/ignore.html
+++ b/doc/ignore.html
@@ -1,280 +1,280 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>IgnoreAttribute (NUnit 2.0)</h3>
-
-<p>The ignore attribute is an attribute to not run a test or test fixture for a 
-	period of time. The person marks either a Test or a TestFixture with the Ignore 
-	Attribute. The running program sees the attribute and does not run the test or 
-	tests. The progress bar will turn yellow if a test is not run and the test will 
-	be mentioned in the reports that it was not run.</p>
-
-<p>This feature should be used to temporarily not run a test or fixture. This is a 
-	better mechanism than commenting out the test or renaming methods, since the 
-	tests will be compiled with the rest of the code and there is an indication at 
-	run time that a test is not being run. This insures that tests will not be 
-	forgotten.</p>
-
-<h4>Test Fixture Syntax</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  [Ignore("Ignore a fixture")]
-  public class SuccessTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Ignore("Ignore a fixture")>
-  Public Class SuccessTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [Ignore("Ignore a fixture")]
-  public __gc class SuccessTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Ignore("Ignore a fixture") */
-public class SuccessTests
-{
-  // ...
-}
-</pre>
-	
-</div>
-
-<h4>Test Syntax</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test]
-    [Ignore("Ignore a test")]
-    public void IgnoredTest()
-    { /* ... */ }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()>
-  Public Class SuccessTests
-    <Test(), Ignore("Ignore a test")> Public Sub Ignored()
-      ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test][Ignore("Ignore a test")] void IgnoredTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Ignore("ignored test") */
-  public void IgnoredTest()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-</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><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 id="current"><a href="ignore.html">Ignore</a></li>
-<li><a href="maxtime.html">Maxtime</a></li>
-<li><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>IgnoreAttribute (NUnit 2.0)</h3>
+
+<p>The ignore attribute is an attribute to not run a test or test fixture for a 
+	period of time. The person marks either a Test or a TestFixture with the Ignore 
+	Attribute. The running program sees the attribute and does not run the test or 
+	tests. The progress bar will turn yellow if a test is not run and the test will 
+	be mentioned in the reports that it was not run.</p>
+
+<p>This feature should be used to temporarily not run a test or fixture. This is a 
+	better mechanism than commenting out the test or renaming methods, since the 
+	tests will be compiled with the rest of the code and there is an indication at 
+	run time that a test is not being run. This insures that tests will not be 
+	forgotten.</p>
+
+<h4>Test Fixture Syntax</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [Ignore("Ignore a fixture")]
+  public class SuccessTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Ignore("Ignore a fixture")>
+  Public Class SuccessTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [Ignore("Ignore a fixture")]
+  public __gc class SuccessTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Ignore("Ignore a fixture") */
+public class SuccessTests
+{
+  // ...
+}
+</pre>
+	
+</div>
+
+<h4>Test Syntax</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test]
+    [Ignore("Ignore a test")]
+    public void IgnoredTest()
+    { /* ... */ }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()>
+  Public Class SuccessTests
+    <Test(), Ignore("Ignore a test")> Public Sub Ignored()
+      ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test][Ignore("Ignore a test")] void IgnoredTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Ignore("ignored test") */
+  public void IgnoredTest()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="ignore.html">Ignore</a></li>
+<li><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/img/nunitTestAdapter.png b/doc/img/nunitTestAdapter.png
index 121e244..3b98b0f 100644
Binary files a/doc/img/nunitTestAdapter.png and b/doc/img/nunitTestAdapter.png differ
diff --git a/doc/index.html b/doc/index.html
index c2b6223..c0cddd0 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -1,82 +1,83 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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 2.6</h2>
-	
-<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.
-
-<p>Where applicable, we have marked sections with the version in which a feature 
-   first appeared.</p>
-
-<p>If you are new to NUnit, we suggest you begin by reading the 
-	<a href="getStarted.html">Getting Started</a> section of this site.
-	 Those who have used earlier releases may want to begin with the 
-	<a href="upgrade.html">Upgrading</a> section.</p>
-
-<p>See the 
-   <a href="releaseNotes.html">Release Notes</a>   for more information on this release.</p>
-
-<p>All documentation is included in the release packages of NUnit. Beginning with NUnit 
-2.4.2, you may choose to <a href="http://www.nunit.org/download.html">download</a> the documentation
-separately.</p>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<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="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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit 2.6.3</h2>
+	
+<p>This documentation covers the NUnit 2.6.3 release, 
+   introducing a large set of new features to NUnit, particularly in
+   the area of parameterized or data-driven testing.
+
+<p>Where applicable, we have marked sections with the version in which a feature 
+   first appeared.</p>
+
+<p>If you are new to NUnit, we suggest you begin by reading the 
+	<a href="getStarted.html">Getting Started</a> section of this site.
+	 Those who have used earlier releases may want to begin with the 
+	<a href="upgrade.html">Upgrading</a> section.</p>
+
+<p>See the 
+   <a href="releaseNotes.html">Release Notes</a>   for more information on this release.</p>
+
+<p>All documentation is included in the release packages of NUnit. Beginning with NUnit 
+2.4.2, you may choose to <a href="http://www.nunit.org/download.html">download</a> the documentation
+separately.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li id="current"><a href="index.html">NUnit 2.6.3</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/installation.html b/doc/installation.html
index 0bc7adc..5dfeefb 100644
--- a/doc/installation.html
+++ b/doc/installation.html
@@ -1,110 +1,111 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Installation</h2>
-<p>By default the <b>NUnit</b> installation program places all of the files into the 
-   <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.
-
-<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.
-
-<div class="screenshot-left">
-    <img src="img/gui-verify.jpg"></div>
-<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>
-
-<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.
-
-<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.6</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</a></li>
-<ul>
-<li><a href="quickStart.html">Quick Start</a></li>
-<li id="current"><a href="installation.html">Installation</a></li>
-<ul>
-<li><a href="upgrade.html">Upgrading</a></li>
-</ul>
-</ul>
-<li><a href="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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<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.6.3</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.
+
+<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.
+
+<div class="screenshot-left">
+    <img src="img/gui-verify.jpg"></div>
+<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>
+
+<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.
+
+<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.6.3</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li><a href="quickStart.html">Quick Start</a></li>
+<li id="current"><a href="installation.html">Installation</a></li>
+<ul>
+<li><a href="upgrade.html">Upgrading</a></li>
+</ul>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/license.html b/doc/license.html
index c6184e9..8cceb70 100644
--- a/doc/license.html
+++ b/doc/license.html
@@ -1,101 +1,102 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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 License</h2>
-
-<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</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:
-
-<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</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">
-the open source zlib/libpng license</A>. The idea was to keep the license 
-as simple as possible to encourage use of NUnit in free and commercial 
-applications and libraries, but to keep the source code together and to give 
-credit to the NUnit contributors for their efforts. While this license allows 
-shipping NUnit in source and binary form, if shipping a NUnit variant is the 
-sole purpose of your product, please <a href="mailto:cpoole at pooleconsulting.com">let 
-us know</a>.</p>
-
-</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 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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit License</h2>
+
+<p><b>
+Copyright © 2002-2013 Charlie Poole<br>
+Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov<br>
+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:
+
+<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</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">
+the open source zlib/libpng license</A>. The idea was to keep the license 
+as simple as possible to encourage use of NUnit in free and commercial 
+applications and libraries, but to keep the source code together and to give 
+credit to the NUnit contributors for their efforts. While this license allows 
+shipping NUnit in source and binary form, if shipping a NUnit variant is the 
+sole purpose of your product, please <a href="mailto:cpoole at pooleconsulting.com">let 
+us know</a>.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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 id="current"><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/listMapper.html b/doc/listMapper.html
index 0a80d70..71899d7 100644
--- a/doc/listMapper.html
+++ b/doc/listMapper.html
@@ -1,110 +1,114 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>List Mapper (NUnit 2.4.2)</h2>
-
-<p>Unlike Constraint classes, <b>ListMapper</b> is used to modify the actual
-value argument to Assert.That(). It transforms the actual value, which
-must be a collection, creating a new collection to be tested against the
-supplied constraint. Currently, ListMapper supports one transformation: creating
-a collection of property values.
-
-<p>Normally, ListMapper will be used through the <b>List.Map()</b> syntax helper
-or the inherited syntax equivalent, <b>Map()</b>. The following example
-shows three forms of the same assert:
-
-<div class="code"><pre>
-string[] strings = new string[] { "a", "ab", "abc" };
-int[] lengths = new int[] { 1, 2, 3 };
-
-Assert.That(List.Map(strings).Property("Length"), 
-       Is.EqualTo(lengths));
-	   
-Assert.That(new ListMapper(strings).Property("Length"),
-       Is.EqualTo(lengths));
-
-// Assuming inheritance from AssertionHelper
-Expect(Map(strings).Property("Length"), EqualTo(lengths));
-</pre></div>
-
-
-</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>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li id="current"><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>List Mapper (NUnit 2.4.2)</h2>
+
+<p>Unlike Constraint classes, <b>ListMapper</b> is used to modify the actual
+value argument to Assert.That(). It transforms the actual value, which
+must be a collection, creating a new collection to be tested against the
+supplied constraint. Currently, ListMapper supports one transformation: creating
+a collection of property values.
+
+<p>Normally, ListMapper will be used through the <b>List.Map()</b> syntax helper
+or the inherited syntax equivalent, <b>Map()</b>. The following example
+shows three forms of the same assert:
+
+<div class="code"><pre>
+string[] strings = new string[] { "a", "ab", "abc" };
+int[] lengths = new int[] { 1, 2, 3 };
+
+Assert.That(List.Map(strings).Property("Length"), 
+       Is.EqualTo(lengths));
+	   
+Assert.That(new ListMapper(strings).Property("Length"),
+       Is.EqualTo(lengths));
+
+// Assuming inheritance from AssertionHelper
+Expect(Map(strings).Property("Length"), EqualTo(lengths));
+</pre></div>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li id="current"><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/mainMenu.html b/doc/mainMenu.html
index 8f5950d..08d7271 100644
--- a/doc/mainMenu.html
+++ b/doc/mainMenu.html
@@ -1,287 +1,288 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Main Menu</h2>
-
-<hr><h3>File Menu</h3><hr>
-
-<h4>New Project�</h4>
-<p>Closes any open project, prompting the user to save it if it has been changed and then opens a
-FileSave dialog to allow selecting the name and location of the new project.</p>
-
-<h4>Open Project�</h4>
-<p>Closes any open project, prompting the user to save it if it has been changed and then opens a
-FileOpen dialog to allow selecting the name and location of an assembly, a test project or (if
-Visual Studio support is enabled) a Visual Studio project.</p>
-
-<h4>Close</h4>
-<p>Closes any open project, prompting the user to save it if it has been changed.</p>
-
-
-<h4>Save</h4>
-<p>Saves the currently open project. Opens the Save As dialog if this is the first time the project
-is being saved.</p>
-
-<h4>Save As�</h4>
-<p>Opens a FileSave dialog to allow specifying the name and location to which the project
-should be saved.</p>
-
-<h4>Reload Project</h4>
-<p>Completely reloads the current project by closing and re-opening it.</p>
-
-<h4>Reload Tests</h4>
-<p>Reloads the tests, merging any changes into the tree.</p>
-
-<h4>Select Runtime</h4>
-<p>Displays a list of runtime versions you may select in order to reload
-the tests using that runtime. This submenu is only present if you have
-more than one runtime version available. Any framework versions not supported
-by your NUnit installation will be disabled until you install the
-necessary NUnit components.
-
-<h4>Recent Projects�</h4>
-<p>Displays a list of recently opened projects and assemblies from which the user is able to select one for opening.</p>
-
-<h4>Exit</h4>
-<p>Closes and exits the application. If a test is running, the user is given the opportunity to
-cancel it and or to allow it to continue. If the open project has any pending changes, the user
-is given the opportunity to save it.</p>
-
-<hr><h3>View Menu</h3><hr>
-
-<h4>Full Gui</h4>
-<p>Displays the complete gui - as in prior versions of NUnit. This includes the
-   errors and failures and other tabs and the progress bar.</p>
-   
-<h4>Mini Gui</h4>
-<p>Switches the display to the mini-gui, which consists of the tree display 
-   only.</p>
-
-<h4>Result Tabs</h4>
-<p>Displays a submenu that allows showing or hiding the tabs on the right
-   hand side of the display.</p>
-
-<blockquote>
-<h5>Errors & Failures, Tests Not Run, etc.</h5>
-<p>Selects the individual tabs to display.</p>
-</blockquote>
-
-<h4>Tree</h4>
-<p>Displays the Tree submenu.</p>
-
-<blockquote>
-<h5>Show Checkboxes</h5>
-<p>Turns the display of checkboxes in the tree on or off. The checkboxes may
-   be used to select multiple tests for running.</p>
-   
-<h5>Expand</h5>
-<p>Expands the currently selected tree node.</p>
-
-<h5>Collapse</h5>
-<p>Collapses the currently selected tree node.</p>
-
-<h5>Expand All</h5>
-<p>Expands all nodes of the tree.</p>
-
-<h5>Collapse All</h5>
-<p>Collapses all nodes in the tree to the root.</p>
-
-<h5>Hide Tests</h5>
-<p>Collapses all fixture nodes, hiding the test cases.</p>
-
-<h5>Properties�</h5>
-<p>Displays the Properties Dialog for the currently selected test.</p>
-</blockquote>
-
-<h4>GUI Font</h4>
-<p>Displays a submenu that allows changing the general font used by NUnit.</p>
-
-<blockquote>
-<h5>Increase</h5>
-<p>Increases the size of the font.</p>
-
-<h5>Decrease</h5>
-<p>Decreases the size of the font.</p>
-
-<h5>Change...</h5>
-<p>Displays the Font Change dialog.</p>
-
-<h5>Restore</h5>
-<p>Restores the default font.</p>
-</blockquote>
-
-<h4>Fixed Font</h4>
-<p>Displays a submenu that allows changing the fixed font used to display
-console output from the tests.</p>
-
-<blockquote>
-<h5>Increase</h5>
-<p>Increases the size of the fixed font.</p>
-
-<h5>Decrease</h5>
-<p>Decreases the size of the fixed font.</p>
-
-<h5>Restore</h5>
-<p>Restores the default fixed font.</p>
-</blockquote>
-
-<h4>Assembly Details...</h4>
-<p>Displays information about loaded test assemblies.</p>
-
-<h4>Status Bar</h4>
-<p>Displays or hides the status bar.</p>
-
-<hr><h3>Project Menu</h3><hr>
-
-<h4>Configurations</h4>
-<p>Displays a submenu allowing selecting, adding or editing a configuration.
-
-<blockquote>
-<h5>Debug, Release, etc.</h5>
-<p>Loads the specified configuration for testing.</p>
-
-<h5>Add�</h5>
-<p>Opens the Add Configuration Dialog, which allows entry of the name of the new
-configuration and specifying an existing configuration to use as a template.</p>
-
-<h5>Edit�</h5>
-<p>Opens the <a href="configEditor.html">Configuration Editor</a>.</p>
-</blockquote>
-
-<h4>Add Assembly�</h4>
-<p>Displays a FileOpen dialog to allow selecting an assembly to be added to the active
-configuration of the currently open project.</p>
-
-<h4>Add VS Project�</h4>
-<p>Only available if Visual Studio Support is enabled. Displays a FileOpen dialog to allows
-selecting a Visual Studio project to be added to the currently open project. Entries are added
-for each configuration specified in the VS project, creating new configurations in the test
-project if necessary.</p>
-
-<h4>Edit�</h4>
-<p>Opens the <a href="projectEditor.html">Project Editor</a>.</p>
-
-<hr><h3>Test Menu</h3><hr>
-
-<h4>Run All</h4>
-<p>Runs all the tests.</p>
-
-<h4>Run Selected</h4>
-<p>Runs the test or tests that are selected in the tree. If checkboxes are visible,
-any checked tests are run by preference. This is the same function provided by
-the Run button.</p>
-
-<h4>Run Failed</h4>
-<p>Runs only the tests that failed on the previous run.</p>
-
-<h4>Stop Run</h4>
-<p>Stops the test run. This is the same function provided by the Stop 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>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>
-
-<hr><h3>Help Menu</h3><hr>
-
-<h4>NUnit Help</h4>
-<p>Displays the NUnit documentation, if installed. Otherwise, attempts to 
-connect to the NUnit web site.</p>
-
-<h4>About NUnit�</h4>
-<p>Displays info about your version of NUnit and a link to the nunit.org site.</p>
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li id="current"><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Main Menu</h2>
+
+<hr><h3>File Menu</h3><hr>
+
+<h4>New Project�</h4>
+<p>Closes any open project, prompting the user to save it if it has been changed and then opens a
+FileSave dialog to allow selecting the name and location of the new project.</p>
+
+<h4>Open Project�</h4>
+<p>Closes any open project, prompting the user to save it if it has been changed and then opens a
+FileOpen dialog to allow selecting the name and location of an assembly, a test project or (if
+Visual Studio support is enabled) a Visual Studio project.</p>
+
+<h4>Close</h4>
+<p>Closes any open project, prompting the user to save it if it has been changed.</p>
+
+
+<h4>Save</h4>
+<p>Saves the currently open project. Opens the Save As dialog if this is the first time the project
+is being saved.</p>
+
+<h4>Save As�</h4>
+<p>Opens a FileSave dialog to allow specifying the name and location to which the project
+should be saved.</p>
+
+<h4>Reload Project</h4>
+<p>Completely reloads the current project by closing and re-opening it.</p>
+
+<h4>Reload Tests</h4>
+<p>Reloads the tests, merging any changes into the tree.</p>
+
+<h4>Select Runtime</h4>
+<p>Displays a list of runtime versions you may select in order to reload
+the tests using that runtime. This submenu is only present if you have
+more than one runtime version available. Any framework versions not supported
+by your NUnit installation will be disabled until you install the
+necessary NUnit components.
+
+<h4>Recent Projects�</h4>
+<p>Displays a list of recently opened projects and assemblies from which the user is able to select one for opening.</p>
+
+<h4>Exit</h4>
+<p>Closes and exits the application. If a test is running, the user is given the opportunity to
+cancel it and or to allow it to continue. If the open project has any pending changes, the user
+is given the opportunity to save it.</p>
+
+<hr><h3>View Menu</h3><hr>
+
+<h4>Full Gui</h4>
+<p>Displays the complete gui - as in prior versions of NUnit. This includes the
+   errors and failures and other tabs and the progress bar.</p>
+   
+<h4>Mini Gui</h4>
+<p>Switches the display to the mini-gui, which consists of the tree display 
+   only.</p>
+
+<h4>Result Tabs</h4>
+<p>Displays a submenu that allows showing or hiding the tabs on the right
+   hand side of the display.</p>
+
+<blockquote>
+<h5>Errors & Failures, Tests Not Run, etc.</h5>
+<p>Selects the individual tabs to display.</p>
+</blockquote>
+
+<h4>Tree</h4>
+<p>Displays the Tree submenu.</p>
+
+<blockquote>
+<h5>Show Checkboxes</h5>
+<p>Turns the display of checkboxes in the tree on or off. The checkboxes may
+   be used to select multiple tests for running.</p>
+   
+<h5>Expand</h5>
+<p>Expands the currently selected tree node.</p>
+
+<h5>Collapse</h5>
+<p>Collapses the currently selected tree node.</p>
+
+<h5>Expand All</h5>
+<p>Expands all nodes of the tree.</p>
+
+<h5>Collapse All</h5>
+<p>Collapses all nodes in the tree to the root.</p>
+
+<h5>Hide Tests</h5>
+<p>Collapses all fixture nodes, hiding the test cases.</p>
+
+<h5>Properties�</h5>
+<p>Displays the Properties Dialog for the currently selected test.</p>
+</blockquote>
+
+<h4>GUI Font</h4>
+<p>Displays a submenu that allows changing the general font used by NUnit.</p>
+
+<blockquote>
+<h5>Increase</h5>
+<p>Increases the size of the font.</p>
+
+<h5>Decrease</h5>
+<p>Decreases the size of the font.</p>
+
+<h5>Change...</h5>
+<p>Displays the Font Change dialog.</p>
+
+<h5>Restore</h5>
+<p>Restores the default font.</p>
+</blockquote>
+
+<h4>Fixed Font</h4>
+<p>Displays a submenu that allows changing the fixed font used to display
+console output from the tests.</p>
+
+<blockquote>
+<h5>Increase</h5>
+<p>Increases the size of the fixed font.</p>
+
+<h5>Decrease</h5>
+<p>Decreases the size of the fixed font.</p>
+
+<h5>Restore</h5>
+<p>Restores the default fixed font.</p>
+</blockquote>
+
+<h4>Assembly Details...</h4>
+<p>Displays information about loaded test assemblies.</p>
+
+<h4>Status Bar</h4>
+<p>Displays or hides the status bar.</p>
+
+<hr><h3>Project Menu</h3><hr>
+
+<h4>Configurations</h4>
+<p>Displays a submenu allowing selecting, adding or editing a configuration.
+
+<blockquote>
+<h5>Debug, Release, etc.</h5>
+<p>Loads the specified configuration for testing.</p>
+
+<h5>Add�</h5>
+<p>Opens the Add Configuration Dialog, which allows entry of the name of the new
+configuration and specifying an existing configuration to use as a template.</p>
+
+<h5>Edit�</h5>
+<p>Opens the <a href="configEditor.html">Configuration Editor</a>.</p>
+</blockquote>
+
+<h4>Add Assembly�</h4>
+<p>Displays a FileOpen dialog to allow selecting an assembly to be added to the active
+configuration of the currently open project.</p>
+
+<h4>Add VS Project�</h4>
+<p>Only available if Visual Studio Support is enabled. Displays a FileOpen dialog to allows
+selecting a Visual Studio project to be added to the currently open project. Entries are added
+for each configuration specified in the VS project, creating new configurations in the test
+project if necessary.</p>
+
+<h4>Edit�</h4>
+<p>Opens the <a href="projectEditor.html">Project Editor</a>.</p>
+
+<hr><h3>Test Menu</h3><hr>
+
+<h4>Run All</h4>
+<p>Runs all the tests.</p>
+
+<h4>Run Selected</h4>
+<p>Runs the test or tests that are selected in the tree. If checkboxes are visible,
+any checked tests are run by preference. This is the same function provided by
+the Run button.</p>
+
+<h4>Run Failed</h4>
+<p>Runs only the tests that failed on the previous run.</p>
+
+<h4>Stop Run</h4>
+<p>Stops the test run. This is the same function provided by the Stop 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>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>
+
+<hr><h3>Help Menu</h3><hr>
+
+<h4>NUnit Help</h4>
+<p>Displays the NUnit documentation, if installed. Otherwise, attempts to 
+connect to the NUnit web site.</p>
+
+<h4>About NUnit�</h4>
+<p>Displays info about your version of NUnit and a link to the nunit.org site.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li id="current"><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/maxtime.html b/doc/maxtime.html
index 69057ef..3b4715f 100644
--- a/doc/maxtime.html
+++ b/doc/maxtime.html
@@ -1,132 +1,132 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Maxtime</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Maxtime</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>MaxtimeAttribute (NUnit 2.5)</h3>
-
-<p>The <b>MaxtimeAttribute</b> is used on test methods to specify a maximum time 
-   in milliseconds for a test case. If the test case takes longer than the 
-   specified time to complete, it is reported as a failure.
-   
-<h4>Example</h4>
-
-<div class="code"><pre>
-[Test, Maxtime(2000)]
-public void TimedTest()
-{
-    ...
-}
-</pre></div>
-
-<h4>Notes:</h4>
-
-<ol>
-<li>Any assertion failures take precedence over the elapsed time check.
-<li>This attribute does not cancel the test if the time
-is exceeded. It merely waits for the test to complete and then
-compares the elapsed time to the specified maximum. If you want to
-cancel long-running tests, see <a href="timeout.html">TimeoutAttribute</a>.
-</ol>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="maxtime.html">Maxtime</a></li>
-<li><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>MaxtimeAttribute (NUnit 2.5)</h3>
+
+<p>The <b>MaxtimeAttribute</b> is used on test methods to specify a maximum time 
+   in milliseconds for a test case. If the test case takes longer than the 
+   specified time to complete, it is reported as a failure.
+   
+<h4>Example</h4>
+
+<div class="code"><pre>
+[Test, Maxtime(2000)]
+public void TimedTest()
+{
+    ...
+}
+</pre></div>
+
+<h4>Notes:</h4>
+
+<ol>
+<li>Any assertion failures take precedence over the elapsed time check.
+<li>This attribute does not cancel the test if the time
+is exceeded. It merely waits for the test to complete and then
+compares the elapsed time to the specified maximum. If you want to
+cancel long-running tests, see <a href="timeout.html">TimeoutAttribute</a>.
+</ol>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="maxtime.html">Maxtime</a></li>
+<li><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/multiAssembly.html b/doc/multiAssembly.html
index 87dc0b3..4066380 100644
--- a/doc/multiAssembly.html
+++ b/doc/multiAssembly.html
@@ -1,141 +1,142 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Multiple-Assembly Support</h2>
-
-<p>Since version 2.1, NUnit has allowed loading suites of tests from multiple assemblies in both
-the console and GUI runners. This may be done on an adhoc basis or by creating NUnit test projects
-saved as files of type '.nunit'. In either case, a top-level suite is constructed, which contains
-the root suite for each assembly. Tests are run and reported just as for a single assembly.</p>
-
-<h3>Adhoc Usage</h3>
-
-<p>Using the console runner, multiple assemblies may be run simply by specifying their names on the 
-command line. See <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a> for
-an example of this usage.</p>
-
-<p>The gui runner does not support specifying multiple assemblies on the command-line.
-However, you can load a single assembly and then use the Project menu to add additional 
-assemblies. Additionally, you can drag multiple assemblies to the tree view pane, in which 
-case they will replace any assemblies already loaded.</p>
-
-<h3>NUnit Test Projects</h3>
-
-<p>Running tests from multiple assemblies is facilitated by the use of NUnit test projects. These are
-files with the extension .nunit containing information about the assemblies to be loaded. The
-following is an example of a hypothetical test project file:</p>
-
-<div class="code">
-<pre><NUnitProject>
-  <Settings activeconfig="Debug"/>
-  <Config name="Debug">
-    <assembly path="LibraryCore\bin\Debug\Library.dll"/>
-    <assembly path="LibraryUI\bin\Debug\LibraryUI.dll"/>
-  </Config>
-  <Config name="Release">
-    <assembly path="LibraryCore\bin\Release\Library.dll"/>
-    <assembly path="LibraryUI\bin\Release\LibraryUI.dll"/>
-  </Config>
-</NUnitProject></pre>
-</div>
-
-<p>This project contains two configurations, each of which contains two assemblies. The Debug
-configuration is currently active. By default, the assemblies will be loaded using the directory
-containing this file as the ApplicationBase. The PrivateBinPath will be set automatically to
-<code>LibraryCore\bin\Debug;LibraryUI\bin\Debug</code> or to the corresonding release path.
-XML attributes are used to specify non-default values for the ApplicationBase, Configuration
-File and PrivateBinPath. The <a href="projectEditor.html">Project Editor</a> may
-be used to create or modify NUnit projects.</p>
-
-<p>Even when you are running a single test assembly, NUnit creates an internal project
-to contain that assembly. If you are using the gui, you can save this project, edit it,
-add additional assemblies, etc. Note that the gui does not display the internal project
-unless you add assemblies or modify it in some other way.
-
-<p>If you use <a href="vsSupport.html">Visual Studio Support</a> to load Visual
-Studio .Net project or solution files, NUnit converts them to Test projects internally.
-As with other internal projects, these test projects are not saved automatically but may
-be saved by use of the File menu.</p>
-
-<h3>Loading and Running</h3>
-
-<p>In the past, test writers have been able to rely on the current directory being set to the 
-directory containing the single loaded assembly. For the purpose of compatibility, NUnit continues
-to set the current directory to the directory containing each assembly whenever any test from that 
-assembly is run.</p>
-
-<p>Additionally, because some assemblies may rely on unmanaged dlls in the same directory, the 
-current directory is also set to that of the assembly at the time the assembly is loaded. However, 
-in cases where multiple assemblies reference the same unmanaged assembly, this may not be sufficient 
-and the user may need to place the directory containing the unmanaged dll on the path.</p>
-
-</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>
-<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>
-<li id="current"><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Multiple-Assembly Support</h2>
+
+<p>Since version 2.1, NUnit has allowed loading suites of tests from multiple assemblies in both
+the console and GUI runners. This may be done on an adhoc basis or by creating NUnit test projects
+saved as files of type '.nunit'. In either case, a top-level suite is constructed, which contains
+the root suite for each assembly. Tests are run and reported just as for a single assembly.</p>
+
+<h3>Adhoc Usage</h3>
+
+<p>Using the console runner, multiple assemblies may be run simply by specifying their names on the 
+command line. See <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a> for
+an example of this usage.</p>
+
+<p>The gui runner does not support specifying multiple assemblies on the command-line.
+However, you can load a single assembly and then use the Project menu to add additional 
+assemblies. Additionally, you can drag multiple assemblies to the tree view pane, in which 
+case they will replace any assemblies already loaded.</p>
+
+<h3>NUnit Test Projects</h3>
+
+<p>Running tests from multiple assemblies is facilitated by the use of NUnit test projects. These are
+files with the extension .nunit containing information about the assemblies to be loaded. The
+following is an example of a hypothetical test project file:</p>
+
+<div class="code">
+<pre><NUnitProject>
+  <Settings activeconfig="Debug"/>
+  <Config name="Debug">
+    <assembly path="LibraryCore\bin\Debug\Library.dll"/>
+    <assembly path="LibraryUI\bin\Debug\LibraryUI.dll"/>
+  </Config>
+  <Config name="Release">
+    <assembly path="LibraryCore\bin\Release\Library.dll"/>
+    <assembly path="LibraryUI\bin\Release\LibraryUI.dll"/>
+  </Config>
+</NUnitProject></pre>
+</div>
+
+<p>This project contains two configurations, each of which contains two assemblies. The Debug
+configuration is currently active. By default, the assemblies will be loaded using the directory
+containing this file as the ApplicationBase. The PrivateBinPath will be set automatically to
+<code>LibraryCore\bin\Debug;LibraryUI\bin\Debug</code> or to the corresonding release path.
+XML attributes are used to specify non-default values for the ApplicationBase, Configuration
+File and PrivateBinPath. The <a href="projectEditor.html">Project Editor</a> may
+be used to create or modify NUnit projects.</p>
+
+<p>Even when you are running a single test assembly, NUnit creates an internal project
+to contain that assembly. If you are using the gui, you can save this project, edit it,
+add additional assemblies, etc. Note that the gui does not display the internal project
+unless you add assemblies or modify it in some other way.
+
+<p>If you use <a href="vsSupport.html">Visual Studio Support</a> to load Visual
+Studio .Net project or solution files, NUnit converts them to Test projects internally.
+As with other internal projects, these test projects are not saved automatically but may
+be saved by use of the File menu.</p>
+
+<h3>Loading and Running</h3>
+
+<p>In the past, test writers have been able to rely on the current directory being set to the 
+directory containing the single loaded assembly. For the purpose of compatibility, NUnit continues
+to set the current directory to the directory containing each assembly whenever any test from that 
+assembly is run.</p>
+
+<p>Additionally, because some assemblies may rely on unmanaged dlls in the same directory, the 
+current directory is also set to that of the assembly at the time the assembly is loaded. However, 
+in cases where multiple assemblies reference the same unmanaged assembly, this may not be sufficient 
+and the user may need to place the directory containing the unmanaged dll on the path.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<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>
+<li id="current"><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/nunit-agent.html b/doc/nunit-agent.html
index 7220894..9295019 100644
--- a/doc/nunit-agent.html
+++ b/doc/nunit-agent.html
@@ -1,103 +1,104 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Nunit-agent</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Nunit-agent</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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-Agent</h2>
-
-<p>The nunit-agent.exe program is used by other runners when the tests are being
-   run in a separate process. It is not intended for direct execution by users.
-
-<p>NUnit runs tests in a separate process in several situations:
-
-<ol>
-<li>When the program needs to be run under a different framework or version
-from the one being used by NUnit itself.
-<li>When the user requests process-level isolation through the command line
-or the NUnit settings.
-</ol>
-
-<h3>Debugging</h3>
-
-<p>When debugging tests that are run in a separate process, it is 
-   not possible to do so by simply running the console or gui runner
-   under the debugger. Rather, it is necessary to attach the debugger
-   to the nunit-agent process after the tests have been loaded. 
-
-<p>When running under the Gui, NUnit will continue to use the same 
-   process to reload tests so that it is not normally necessary to 
-   re-attach to a new process. However, if the settings are changed
-   in a way that requires a differnt process - for example, by changing 
-   the version of the runtime that is being used - the old process will
-   be terminated and a new one created. In that case, it's necessary
-   to re-attach to the new process.
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit-Agent</h2>
+
+<p>The nunit-agent.exe program is used by other runners when the tests are being
+   run in a separate process. It is not intended for direct execution by users.
+
+<p>NUnit runs tests in a separate process in several situations:
+
+<ol>
+<li>When the program needs to be run under a different framework or version
+from the one being used by NUnit itself.
+<li>When the user requests process-level isolation through the command line
+or the NUnit settings.
+</ol>
+
+<h3>Debugging</h3>
+
+<p>When debugging tests that are run in a separate process, it is 
+   not possible to do so by simply running the console or gui runner
+   under the debugger. Rather, it is necessary to attach the debugger
+   to the nunit-agent process after the tests have been loaded. 
+
+<p>When running under the Gui, NUnit will continue to use the same 
+   process to reload tests so that it is not normally necessary to 
+   re-attach to a new process. However, if the settings are changed
+   in a way that requires a differnt process - for example, by changing 
+   the version of the runtime that is being used - the old process will
+   be terminated and a new one created. In that case, it's necessary
+   to re-attach to the new process.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/nunit-console.html b/doc/nunit-console.html
index 4c03045..5e4ee55 100644
--- a/doc/nunit-console.html
+++ b/doc/nunit-console.html
@@ -1,101 +1,102 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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-Console</h2>
-<p>The nunit-console.exe program is a text-based runner and can be used when you 
-	want to run all your tests and don’t need a red/yellow/green indication of 
-	success or failure.</p>
-<p>It is useful for automation of tests and integration into other systems. It 
-	automatically saves its results in XML format, allowing you to produce reports 
-	or otherwise process the results. The following is a screenshot of the console 
-	program.</p>
-
-<div class="screenshot-left">
-      <img src="img/console-mock.jpg"></div>
-<p>
-<p>In this example, nunit-console has just run the tests in the mock-assembly.dll 
-	that is part of the NUnit distribution. This assembly contains a number of tests, some
-	of which are either ignored or marked explicit. The summary line shows the
-	result of the test run. Click <a href="files/TestResult.xml">here</a> 
-	to see the XML produced for this test run.</p>
-	
-<p>The .NET 2.0 version of the nunit-console program is built using /platform:anycpu,
-which causes it to be jit-compiled to 32-bit code on a 32-bit system and 64-bit code 
-on a 64 bit system. This causes an exception when NUnit is used to test a 32-bit
-application on a 64-bit system. To avoid this problem, use the nunit-console-x86 
-program, which is built using /platform:x86, when testing 32-bit code on a 
-64-bit system.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li id="current"><a href="nunit-console.html">Console Runner</a></li>
-<ul>
-<li><a href="consoleCommandLine.html">Command-Line</a></li>
-</ul>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="pnunit.html">PNUnit Runner</a></li>
-<li><a href="nunit-agent.html">NUnit Agent</a></li>
-<li><a href="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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit-Console</h2>
+<p>The nunit-console.exe program is a text-based runner and can be used when you 
+	want to run all your tests and don’t need a red/yellow/green indication of 
+	success or failure.</p>
+<p>It is useful for automation of tests and integration into other systems. It 
+	automatically saves its results in XML format, allowing you to produce reports 
+	or otherwise process the results. The following is a screenshot of the console 
+	program.</p>
+
+<div class="screenshot-left">
+      <img src="img/console-mock.jpg"></div>
+<p>
+<p>In this example, nunit-console has just run the tests in the mock-assembly.dll 
+	that is part of the NUnit distribution. This assembly contains a number of tests, some
+	of which are either ignored or marked explicit. The summary line shows the
+	result of the test run. Click <a href="files/TestResult.xml">here</a> 
+	to see the XML produced for this test run.</p>
+	
+<p>The .NET 2.0 version of the nunit-console program is built using /platform:anycpu,
+which causes it to be jit-compiled to 32-bit code on a 32-bit system and 64-bit code 
+on a 64 bit system. This causes an exception when NUnit is used to test a 32-bit
+application on a 64-bit system. To avoid this problem, use the nunit-console-x86 
+program, which is built using /platform:x86, when testing 32-bit code on a 
+64-bit system.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li id="current"><a href="nunit-console.html">Console Runner</a></li>
+<ul>
+<li><a href="consoleCommandLine.html">Command-Line</a></li>
+</ul>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li><a href="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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/nunit-gui.html b/doc/nunit-gui.html
index a0f0741..7a94bd0 100644
--- a/doc/nunit-gui.html
+++ b/doc/nunit-gui.html
@@ -1,30 +1,30 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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">
-
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
 <h2>NUnit Gui Runner</h2>
 <p>The nunit.exe program is a graphical runner. It shows the tests in an 
 	explorer-like browser window and provides a visual indication of the success or 
@@ -93,59 +93,60 @@ see the documentation for the
    
 <div class="screenshot-left">
      <img src="img/miniGui.jpg"></div>
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li id="current"><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li id="current"><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/nunit.css b/doc/nunit.css
index 174dbbe..7d9568e 100644
--- a/doc/nunit.css
+++ b/doc/nunit.css
@@ -1,126 +1,127 @@
-/* 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; }
+#nav a.disabled, a:hover.disabled { color: #CCC; background: white; border: 1px solid #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 fe3dffe..cefec89 100644
--- a/doc/nunitAddins.html
+++ b/doc/nunitAddins.html
@@ -1,228 +1,229 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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 Addins</h2>
-
-<p>NUnit originally identified tests in the time-honored way used in many xUnit
-test frameworks. Test classes inherited from the framework's 
-TestCase class. Individual test case methods were identified by having names
-starting with "test..."</p>
-
-<p>With NUnit 2.0, we introduced the use of attributes to identify both fixtures
-and test cases. Use of attributes in this way was a natural outcome of their 
-presence in .NET and gave us a way of identifying tests that was completely
-independent of both inheritance and naming conventions.</p>
-
-<p>However, by moving away from an inheritance-based mechanism we no longer
-had an easy way for others to extend NUnit's internal behavior. NUnit Addins are 
-intended to fill that gap, providing an mechanism to introduce new or changed 
-behavior without modifying NUnit itself.</p>
-
-<h3>Extension Points, Extensions and Addins</h3>
-
-<p>NUnit provides a number of <b>Extension Points</b>, places where it is
-possible to extend its behavior. Because NUnit works with various hosts
-and uses separate AppDomains to run tests, <b>Extension Points</b> are 
-categorized into three types: Core, Client and Gui. Each of these types is
-supported by a different <b>Extension Host</b>.
-
-<p>An NUnit <b>Addin</b> provides enhanced functionality through one or more 
-extensions, which it installs at identified <b>Extension Points</b>. Each
-<b>Addin</b> is characterized by the types of extensions it supplies, so that
-an <b>Extension Host</b> knows whether to invoke it.</p>
-
-<blockquote>
-<p><b>Note:</b> In the current release, only Core extensions are actually
-supported. An Addin may characterize itself as a Client or Gui extension and
-will be listed as such in the <a href="addinsDialog.html">Addins Dialog</a>, 
-but no other action is taken.</p>
-</blockquote> 
-
-<h3>Addin Identification, Loading and Installation</h3>
-
-<p>NUnit examines all assemblies in the <b>bin/addins</b> directory, looking
-for public classes with the <b>NUnitAddinAttribute</b> and implementing the
-<b>IAddin</b> interface. It loads all those it finds as Addins.</p>
-
-<p><b>NUnitAddinAttribute</b> supports three optional named parameters: Type,
-Name and Description. Name and Description are strings representing the name
-of the extension and a description of what it does. If no name is provided,
-the name of the class is used. Type may be any one or a combination of the 
-ExtensionType enum members:
-
-<pre>
-	[Flags]
-	public enum ExtensionType
-	{
-		Core=1,
-		Client=2,
-		Gui=4
-	}
-</pre>
-
-The values may be or'ed together, allowing for future Addins that require
-extensions at multiple levels of the application. If not provided, Type
-defaults to ExtensionType.Core.</p>
-
-<p>The <b>IAddin</b> interface, which must be implemented by each Addin,
-is defined as follows:</p>
-
-<pre>
-	public interface IAddin
-	{
-		bool Install( IExtensionHost host );
-	}
-</pre>
-
-<p> The <b>Install</b> method is called by each host for which the addin has
-specified an ExtensionType. The addin should check that the necessary extension
-points are available and install itself, returning true for success or false
-for failure to install. The method will be called once for each extension
-host and - for Core extensions - each time a new test domain is loaded.</p>
-
-<p>The Install method uses the <b>IExtensionHost</b> interface to locate
-extension points. It is defined as follows:</p>
-
-<pre>
-	public interface IExtensionHost
-	{
-	 	IExtensionPoint[] ExtensionPoints { get; }
-		IExtensionPoint GetExtensionPoint( string name );
-		ExtensionType ExtensionTypes { get; }
-	}
-</pre>
-
-<p>The <b>ExtensionPoints</b> property returns an array of all extension points
-for those extensions that need the information. The <b>ExtensionTypes</b>
-property returns the flags for the type of extension supported by this host,
-allowing, for example, Gui extensions to only load in a Gui host.</p>
-
-<p>Most addins will only need to use the <b>GetExtensionPoint</b> method to
-get the interface to a particular extension point. The <b>IExtensionPoint</b>
-interface is defined as follows:</p>
-
-<pre>
-	public interface IExtensionPoint
-	{
-		string Name { get; }
-		IExtensionHost Host { get; }
-		void Install( object extension );
-		void Remove( object extension );
-	}
-</pre>
-
-<p>Once again, most addins will only need to use one method - the
-<b>Install</b> method in this case. This method passes an extension object
-to the <b>Extension Point</b> where it is installed. Generally, extensions
-do not need to remove themselves once installed, but the method is
-provided in any case.</p>
-
-<p>With NUnit 2.5, an additional interface, <b>IExtensionPoint2</b> is
-available. It derives from <b>IExtensionPoint</b> and also allows setting
-the priority order in which the extension will be called in comparison to 
-other extensions on the same extension point. The interface is defined
-as follows:
-
-<pre>
-	public interface IExtensionPoint2 : IExtensionPoint
-	{
-		void Install( object extension, int priority );
-	}
-</pre>
-
-<p>Only extension points that use a priority scheme implement this interface.
-In general, extension points with a priority scheme will use a default value
-for priority if the Install method without a priority is called. 
-
-<p>In the NUnit 2.5 release, only the <b>TestDecorators</b> extension point implements
-<b>IExtensionPoint2</b>.
-
-<h3>Extension Point Details</h3>
-
-<p>Depending on the particular extension point, the object passed will
-need to implement one or more interfaces. The following <b>ExtensionPoints</b>
-are implemented in this release of NUnit:
-
-<ul>
-	<li><a href="suiteBuilders.html">SuiteBuilders</a>	<li><a href="testcaseBuilders.html">TestCaseBuilders</a>	<li><a href="testDecorators.html">TestDecorators</a>	<li><a href="testcaseProviders.html">TestCaseProviders</a>	<li><a href="datapointProviders.html">DataPointProviders</a>	<li><a href="eventListeners.html">EventListeners</a></ul></p>
-
-<p>For examples of implementing each type of extension, see the Extensibility
-samples provided with NUnit. More complete examples are available in the
-code of NUnit itself, since NUnit uses the same mechanism internally.</p>
-
-<h4>See also...</h4>
-
-<ul>
-<li><a href="extensionTips.html">Tips for Writing Extensions</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li id="current"><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li><a href="testDecorators.html">TestDecorators</a></li>
-<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li><a href="datapointProviders.html">DatapointProviders</a></li>
-<li><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>NUnit Addins</h2>
+
+<p>NUnit originally identified tests in the time-honored way used in many xUnit
+test frameworks. Test classes inherited from the framework's 
+TestCase class. Individual test case methods were identified by having names
+starting with "test..."</p>
+
+<p>With NUnit 2.0, we introduced the use of attributes to identify both fixtures
+and test cases. Use of attributes in this way was a natural outcome of their 
+presence in .NET and gave us a way of identifying tests that was completely
+independent of both inheritance and naming conventions.</p>
+
+<p>However, by moving away from an inheritance-based mechanism we no longer
+had an easy way for others to extend NUnit's internal behavior. NUnit Addins are 
+intended to fill that gap, providing an mechanism to introduce new or changed 
+behavior without modifying NUnit itself.</p>
+
+<h3>Extension Points, Extensions and Addins</h3>
+
+<p>NUnit provides a number of <b>Extension Points</b>, places where it is
+possible to extend its behavior. Because NUnit works with various hosts
+and uses separate AppDomains to run tests, <b>Extension Points</b> are 
+categorized into three types: Core, Client and Gui. Each of these types is
+supported by a different <b>Extension Host</b>.
+
+<p>An NUnit <b>Addin</b> provides enhanced functionality through one or more 
+extensions, which it installs at identified <b>Extension Points</b>. Each
+<b>Addin</b> is characterized by the types of extensions it supplies, so that
+an <b>Extension Host</b> knows whether to invoke it.</p>
+
+<blockquote>
+<p><b>Note:</b> In the current release, only Core extensions are actually
+supported. An Addin may characterize itself as a Client or Gui extension and
+will be listed as such in the <a href="addinsDialog.html">Addins Dialog</a>, 
+but no other action is taken.</p>
+</blockquote> 
+
+<h3>Addin Identification, Loading and Installation</h3>
+
+<p>NUnit examines all assemblies in the <b>bin/addins</b> directory, looking
+for public classes with the <b>NUnitAddinAttribute</b> and implementing the
+<b>IAddin</b> interface. It loads all those it finds as Addins.</p>
+
+<p><b>NUnitAddinAttribute</b> supports three optional named parameters: Type,
+Name and Description. Name and Description are strings representing the name
+of the extension and a description of what it does. If no name is provided,
+the name of the class is used. Type may be any one or a combination of the 
+ExtensionType enum members:
+
+<pre>
+	[Flags]
+	public enum ExtensionType
+	{
+		Core=1,
+		Client=2,
+		Gui=4
+	}
+</pre>
+
+The values may be or'ed together, allowing for future Addins that require
+extensions at multiple levels of the application. If not provided, Type
+defaults to ExtensionType.Core.</p>
+
+<p>The <b>IAddin</b> interface, which must be implemented by each Addin,
+is defined as follows:</p>
+
+<pre>
+	public interface IAddin
+	{
+		bool Install( IExtensionHost host );
+	}
+</pre>
+
+<p> The <b>Install</b> method is called by each host for which the addin has
+specified an ExtensionType. The addin should check that the necessary extension
+points are available and install itself, returning true for success or false
+for failure to install. The method will be called once for each extension
+host and - for Core extensions - each time a new test domain is loaded.</p>
+
+<p>The Install method uses the <b>IExtensionHost</b> interface to locate
+extension points. It is defined as follows:</p>
+
+<pre>
+	public interface IExtensionHost
+	{
+	 	IExtensionPoint[] ExtensionPoints { get; }
+		IExtensionPoint GetExtensionPoint( string name );
+		ExtensionType ExtensionTypes { get; }
+	}
+</pre>
+
+<p>The <b>ExtensionPoints</b> property returns an array of all extension points
+for those extensions that need the information. The <b>ExtensionTypes</b>
+property returns the flags for the type of extension supported by this host,
+allowing, for example, Gui extensions to only load in a Gui host.</p>
+
+<p>Most addins will only need to use the <b>GetExtensionPoint</b> method to
+get the interface to a particular extension point. The <b>IExtensionPoint</b>
+interface is defined as follows:</p>
+
+<pre>
+	public interface IExtensionPoint
+	{
+		string Name { get; }
+		IExtensionHost Host { get; }
+		void Install( object extension );
+		void Remove( object extension );
+	}
+</pre>
+
+<p>Once again, most addins will only need to use one method - the
+<b>Install</b> method in this case. This method passes an extension object
+to the <b>Extension Point</b> where it is installed. Generally, extensions
+do not need to remove themselves once installed, but the method is
+provided in any case.</p>
+
+<p>With NUnit 2.5, an additional interface, <b>IExtensionPoint2</b> is
+available. It derives from <b>IExtensionPoint</b> and also allows setting
+the priority order in which the extension will be called in comparison to 
+other extensions on the same extension point. The interface is defined
+as follows:
+
+<pre>
+	public interface IExtensionPoint2 : IExtensionPoint
+	{
+		void Install( object extension, int priority );
+	}
+</pre>
+
+<p>Only extension points that use a priority scheme implement this interface.
+In general, extension points with a priority scheme will use a default value
+for priority if the Install method without a priority is called. 
+
+<p>In the NUnit 2.5 release, only the <b>TestDecorators</b> extension point implements
+<b>IExtensionPoint2</b>.
+
+<h3>Extension Point Details</h3>
+
+<p>Depending on the particular extension point, the object passed will
+need to implement one or more interfaces. The following <b>ExtensionPoints</b>
+are implemented in this release of NUnit:
+
+<ul>
+	<li><a href="suiteBuilders.html">SuiteBuilders</a>	<li><a href="testcaseBuilders.html">TestCaseBuilders</a>	<li><a href="testDecorators.html">TestDecorators</a>	<li><a href="testcaseProviders.html">TestCaseProviders</a>	<li><a href="datapointProviders.html">DataPointProviders</a>	<li><a href="eventListeners.html">EventListeners</a></ul></p>
+
+<p>For examples of implementing each type of extension, see the Extensibility
+samples provided with NUnit. More complete examples are available in the
+code of NUnit itself, since NUnit uses the same mechanism internally.</p>
+
+<h4>See also...</h4>
+
+<ul>
+<li><a href="extensionTips.html">Tips for Writing Extensions</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li id="current"><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/pairwise.html b/doc/pairwise.html
index b3fa744..31fbf27 100644
--- a/doc/pairwise.html
+++ b/doc/pairwise.html
@@ -1,122 +1,122 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Pairwise</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Pairwise</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>PairwiseAttribute (NUnit 2.5)</h3>
-
-<p>The <b>PairwiseAttribute</b> is used on a test to specify that NUnit should
-   generate test cases in such a way that all possible pairs of
-   values are used. This is a well-known approach for combatting
-   the combinatorial explosion of test cases when more than
-   two features (parameters) are involved.
-   
-<p><b>Note:</b> In the current Alpha release, this attribute is 
-accepted but ignored and data items are combined usin the default
-combinatorial approach.
-   
-<h4>See also...</h4>
-<ul>
-<li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="pairwise.html">Pairwise</a></li>
-<li><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>PairwiseAttribute (NUnit 2.5)</h3>
+
+<p>The <b>PairwiseAttribute</b> is used on a test to specify that NUnit should
+   generate test cases in such a way that all possible pairs of
+   values are used. This is a well-known approach for combatting
+   the combinatorial explosion of test cases when more than
+   two features (parameters) are involved.
+   
+<p><b>Note:</b> In the current Alpha release, this attribute is 
+accepted but ignored and data items are combined usin the default
+combinatorial approach.
+   
+<h4>See also...</h4>
+<ul>
+<li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="pairwise.html">Pairwise</a></li>
+<li><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/parameterizedTests.html b/doc/parameterizedTests.html
index 80142a1..a360192 100644
--- a/doc/parameterizedTests.html
+++ b/doc/parameterizedTests.html
@@ -1,168 +1,168 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ParameterizedTests</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ParameterizedTests</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Parameterized Tests</h2>
-
-<p>NUnit 2.5 supports parameterized tests. Test methods
-may have parameters and various attributes are available
-to indicate what arguments should be supplied by NUnit.
-
-<p>Multiple sets of arguments cause the creation of multiple
-tests. All arguments are created at the point of loading the
-tests, so the individual test cases are available for 
-display and selection in the Gui, if desired.
-
-<p>Some attributes allow you to specify arguments inline - directly on
-   the attribute - while others use a separate method, property or field
-   to hold the arguments. In addition, some attributes identify complete test cases,
-   including all the necessary arguments, while others only provide data
-   for a single argument. This gives rise to four groups of attributes,
-   as shown in the following table.
-   
-<table class="nunit">
-<tr><th></th><th>Complete Test Cases</th><th>Data for One Argument</th></tr>
-<tr><th>Inline</th>
-    <td><a href="testCase.html">TestCaseAttribute</a></td>
-    <td><a href="random.html">RandomAttribute</a><br>
-	    <a href="range.html">RangeAttribute</a><br>
-		<a href="values.html">ValuesAttribute</a></td></tr>
-<tr><th>Separate</th>
-	<td><a href="testCaseSource.html">TestCaseSourceAttribute</a></td>
-	<td><a href="valueSource.html">ValueSourceAttribute</a></td></tr>
-</table>
-
-<p>In addition, when data is specified for individual arguments, special attributes
-may be added to the test method itself in order to tell NUnit how
-to go about combining the arguments. Currently, the following attributes
-are provided:
-
-<ul>
-<li><a href="combinatorial.html">CombinatorialAttribute</a> (default)
-<li><a href="pairwise.html">PairwiseAttribute</a><li><a href="sequential.html">SequentialAttribute</a></ul>
-
-<h3>Order of Execution</h3>
-
-<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
-   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
-   executed in the order in which NUnit discovers them. This order does <b>not</b>
-   follow the lexical order of the attributes and will often vary between different
-   compilers or different versions of the CLR.
-   
-<p>The following specific rules for ordering apply:
-<ol>
-<li>If all arguments are specified in a <b>single TestCaseSource</b> attribute,
-    the ordering of the cases provided will be maintained.
-<li>If each parameter has a <b>single Values</b>, <b>ValueSource</b> or
-    <b>Range</b> attribute and the <b>Sequential</b> combining strategy
-	is used - or there is only one argument - the ordering will be maintained.
-<li>In all other cases, including using multiple <b>TestCase</b> attributes
-    or a combination of different types of attributes, the ordering of the
-	test cases is undefined.
-</ol>   
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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>
-<ul>
-<li id="current"><a href="parameterizedTests.html">Parameterized Tests</a></li>
-</ul>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Parameterized Tests</h2>
+
+<p>NUnit 2.5 supports parameterized tests. Test methods
+may have parameters and various attributes are available
+to indicate what arguments should be supplied by NUnit.
+
+<p>Multiple sets of arguments cause the creation of multiple
+tests. All arguments are created at the point of loading the
+tests, so the individual test cases are available for 
+display and selection in the Gui, if desired.
+
+<p>Some attributes allow you to specify arguments inline - directly on
+   the attribute - while others use a separate method, property or field
+   to hold the arguments. In addition, some attributes identify complete test cases,
+   including all the necessary arguments, while others only provide data
+   for a single argument. This gives rise to four groups of attributes,
+   as shown in the following table.
+   
+<table class="nunit">
+<tr><th></th><th>Complete Test Cases</th><th>Data for One Argument</th></tr>
+<tr><th>Inline</th>
+    <td><a href="testCase.html">TestCaseAttribute</a></td>
+    <td><a href="random.html">RandomAttribute</a><br>
+	    <a href="range.html">RangeAttribute</a><br>
+		<a href="values.html">ValuesAttribute</a></td></tr>
+<tr><th>Separate</th>
+	<td><a href="testCaseSource.html">TestCaseSourceAttribute</a></td>
+	<td><a href="valueSource.html">ValueSourceAttribute</a></td></tr>
+</table>
+
+<p>In addition, when data is specified for individual arguments, special attributes
+may be added to the test method itself in order to tell NUnit how
+to go about combining the arguments. Currently, the following attributes
+are provided:
+
+<ul>
+<li><a href="combinatorial.html">CombinatorialAttribute</a> (default)
+<li><a href="pairwise.html">PairwiseAttribute</a><li><a href="sequential.html">SequentialAttribute</a></ul>
+
+<h3>Order of Execution</h3>
+
+<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
+   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
+   executed in the order in which NUnit discovers them. This order does <b>not</b>
+   follow the lexical order of the attributes and will often vary between different
+   compilers or different versions of the CLR.
+   
+<p>The following specific rules for ordering apply:
+<ol>
+<li>If all arguments are specified in a <b>single TestCaseSource</b> attribute,
+    the ordering of the cases provided will be maintained.
+<li>If each parameter has a <b>single Values</b>, <b>ValueSource</b> or
+    <b>Range</b> attribute and the <b>Sequential</b> combining strategy
+	is used - or there is only one argument - the ordering will be maintained.
+<li>In all other cases, including using multiple <b>TestCase</b> attributes
+    or a combination of different types of attributes, the ordering of the
+	test cases is undefined.
+</ol>   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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>
+<ul>
+<li id="current"><a href="parameterizedTests.html">Parameterized Tests</a></li>
+</ul>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/pathConstraints.html b/doc/pathConstraints.html
index f9ef55f..78d9b99 100644
--- a/doc/pathConstraints.html
+++ b/doc/pathConstraints.html
@@ -1,204 +1,208 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - PathConstraints</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - PathConstraints</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Path Constraints (NUnit 2.5)</h2>
-
-<p>Path constraints perform tests on paths, without reference to any
-   actual files or directories. This allows testing paths that are
-   created by an application for reference or later use, without 
-   any effect on the environment.
-   
-<p>Path constraints are intended to work across multiple file systems,
-   and convert paths to a canonical form before comparing them. 
-
-<p>It is usually not necessary to know the file system of the paths
-   in order to compare them. Where necessary, the programmer may
-   use the <b>IgnoreCase</b> and <b>RespectCase</b> modifiers to provide 
-   behavior other than the system default.
-      
-<h3>SamePathConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that two paths are equivalent.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-SamePathConstraint( string expectedPath )
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.SamePath( string expectedPath )
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-...RespectCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-Assert.That( "/folder1/./junk/../folder2", 
-	Is.SamePath( "/folder1/folder2" ) );
-Assert.That( "/folder1/./junk/../folder2/x", 
-	Is.Not.SamePath( "/folder1/folder2" ) );
-
-Assert.That( @"C:\folder1\folder2",
-	Is.SamePath( @"C:\Folder1\Folder2" ).IgnoreCase );
-Assert.That( "/folder1/folder2",
-	Is.Not.SamePath( "/Folder1/Folder2" ).RespectCase );
-</pre></div>
-
-<h3>SubPathConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that one path is under another path.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-SubPathConstraint( string expectedPath )
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.SubPath( string expectedPath )
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-...RespectCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Assert.That( "/folder1/./junk/../folder2", 
-	Is.SubPath( "/folder1/folder2" ) );
-Assert.That( "/folder1/junk/folder2",
-	Is.Not.SubPath( "/folder1/folder2" ) );
-
-Assert.That( @"C:\folder1\folder2\folder3",
-	Is.SubPath( @"C:\Folder1\Folder2/Folder3" ).IgnoreCase );
-Assert.That( "/folder1/folder2/folder3",
-	Is.Not.SubPath( "/Folder1/Folder2/Folder3" ).RespectCase );
-</pre></div>
-
-<h3>SamePathOrUnderConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that one path is equivalent another path or that it is under it.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-SamePathOrUnderConstraint( string expectedPath )
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.SamePathOrUnder( string expectedPath )
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-...RespectCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Assert.That( "/folder1/./junk/../folder2", 
-	Is.SamePathOrUnder( "/folder1/folder2" ) );
-Assert.That( "/folder1/junk/../folder2/./folder3",
-	Is.SamePathOrUnder( "/folder1/folder2" ) );
-Assert.That( "/folder1/junk/folder2/folder3",
-	Is.Not.SamePathOrUnder( "/folder1/folder2" ) );
-
-Assert.That( @"C:\folder1\folder2\folder3",
-	Is.SamePathOrUnder( @"C:\Folder1\Folder2" ).IgnoreCase );
-Assert.That( "/folder1/folder2/folder3",
-	Is.Not.SamePathOrUnder( "/Folder1/Folder2" ).RespectCase );
-</pre></div>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li id="current"><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Path Constraints (NUnit 2.5)</h2>
+
+<p>Path constraints perform tests on paths, without reference to any
+   actual files or directories. This allows testing paths that are
+   created by an application for reference or later use, without 
+   any effect on the environment.
+   
+<p>Path constraints are intended to work across multiple file systems,
+   and convert paths to a canonical form before comparing them. 
+
+<p>It is usually not necessary to know the file system of the paths
+   in order to compare them. Where necessary, the programmer may
+   use the <b>IgnoreCase</b> and <b>RespectCase</b> modifiers to provide 
+   behavior other than the system default.
+      
+<h3>SamePathConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that two paths are equivalent.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SamePathConstraint( string expectedPath )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SamePath( string expectedPath )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...RespectCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+Assert.That( "/folder1/./junk/../folder2", 
+	Is.SamePath( "/folder1/folder2" ) );
+Assert.That( "/folder1/./junk/../folder2/x", 
+	Is.Not.SamePath( "/folder1/folder2" ) );
+
+Assert.That( @"C:\folder1\folder2",
+	Is.SamePath( @"C:\Folder1\Folder2" ).IgnoreCase );
+Assert.That( "/folder1/folder2",
+	Is.Not.SamePath( "/Folder1/Folder2" ).RespectCase );
+</pre></div>
+
+<h3>SubPathConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one path is under another path.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SubPathConstraint( string expectedPath )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SubPath( string expectedPath )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...RespectCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( "/folder1/./junk/../folder2", 
+	Is.SubPath( "/folder1/folder2" ) );
+Assert.That( "/folder1/junk/folder2",
+	Is.Not.SubPath( "/folder1/folder2" ) );
+
+Assert.That( @"C:\folder1\folder2\folder3",
+	Is.SubPath( @"C:\Folder1\Folder2/Folder3" ).IgnoreCase );
+Assert.That( "/folder1/folder2/folder3",
+	Is.Not.SubPath( "/Folder1/Folder2/Folder3" ).RespectCase );
+</pre></div>
+
+<h3>SamePathOrUnderConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that one path is equivalent another path or that it is under it.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SamePathOrUnderConstraint( string expectedPath )
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.SamePathOrUnder( string expectedPath )
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+...RespectCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( "/folder1/./junk/../folder2", 
+	Is.SamePathOrUnder( "/folder1/folder2" ) );
+Assert.That( "/folder1/junk/../folder2/./folder3",
+	Is.SamePathOrUnder( "/folder1/folder2" ) );
+Assert.That( "/folder1/junk/folder2/folder3",
+	Is.Not.SamePathOrUnder( "/folder1/folder2" ) );
+
+Assert.That( @"C:\folder1\folder2\folder3",
+	Is.SamePathOrUnder( @"C:\Folder1\Folder2" ).IgnoreCase );
+Assert.That( "/folder1/folder2/folder3",
+	Is.Not.SamePathOrUnder( "/Folder1/Folder2" ).RespectCase );
+</pre></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li id="current"><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/platform.html b/doc/platform.html
index 9f19740..301336a 100644
--- a/doc/platform.html
+++ b/doc/platform.html
@@ -1,341 +1,346 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<style><!--
-div.code { width: 34em }
---></style>
-
-<h3>PlatformAttribute (NUnit 2.2.2)</h3> 
-<p>The Platform attribute is used to specify platforms for which a test or fixture
-	should be run. Platforms are specified using case-insensitive string values
-	and may be either included or excluded from the run by use of the Include or 
-	Exclude properties respectively. Platforms to be included may alternatively
-	be specified as an argument to the PlatformAttribute constructor. In either
-	case, multiple comma-separated values may be specified.
-
-<p>If a test or fixture with the Platform attribute does not satisfy the specified
-   platform requirements it is skipped. The test does not affect the outcome of 
-   the run at all: it is not considered as ignored and is not even counted in 
-   the total number of tests. In the gui, the tree node for the test remains 
-   gray and the	status bar color is not affected.</p>
-
-<blockquote><i><b>Note:</b> In versions of NUnit prior to 2.4, these tests were
-    shown as ignored.</i></blockquote>
-
-<h4>Test Fixture Syntax</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  [Platform("NET-2.0")]
-  public class DotNetTwoTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Platform("NET-2.0")>
-  Public Class DotNetTwoTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [Platform("NET-2.0")]
-  public __gc class DotNetTwoTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Platform("NET-2.0") */
-public class DotNetTwoTests
-{
-  // ...
-}
-</pre>
-</div>
-<h4>Test Syntax</h4>
-<div class="code">
-	
-<div class="langFilter">
-	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test]
-    [Platform(Exclude="Win98,WinME")]
-    public void SomeTest()
-    { /* ... */ }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()>
-  Public Class SuccessTests
-    <Test(), Platform(Exclude="Win98,WinME")> Public Sub SomeTest()
-      ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test][Platform(Exclude="Win98,WinME")] void SomeTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Platform(Exclude="Win98,WinME") */
-  public void SomeTest()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h3>Platform Specifiers</h3>
-<p>The following values are recognized as platform specifiers.
-   They may be expressed in upper, lower or mixed case.</p>
-
-<ul class="across">
-<li>Win</li>
-<li>Win32</li>
-<li>Win32S</li>
-<li>Win32Windows</li>
-<li>Win32NT</li>
-<li>WinCE</li>
-<li>Win95</li>
-<li>Win98</li>
-<li>WinMe</li>
-<li>NT3</li>
-<li>NT4</li>
-<li>NT5</li>
-<li>NT6</li>
-<li>Win2K</li>
-<li>WinXP</li>
-<li>Win2003Server</li>
-<li>Vista</li>
-<li>Win2008Server</li>
-<li>Win2008ServerR2</li>
-<li>Windows7</li>
-<li>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>
-<li>Rotor</li>
-<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.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><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 id="current"><a href="platform.html">Platform</a></li>
-<li><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<style><!--
+div.code { width: 34em }
+--></style>
+
+<h3>PlatformAttribute (NUnit 2.2.2)</h3> 
+<p>The Platform attribute is used to specify platforms for which a test or fixture
+	should be run. Platforms are specified using case-insensitive string values
+	and may be either included or excluded from the run by use of the Include or 
+	Exclude properties respectively. Platforms to be included may alternatively
+	be specified as an argument to the PlatformAttribute constructor. In either
+	case, multiple comma-separated values may be specified.
+
+<p>If a test or fixture with the Platform attribute does not satisfy the specified
+   platform requirements it is skipped. The test does not affect the outcome of 
+   the run at all: it is not considered as ignored and is not even counted in 
+   the total number of tests. In the gui, the tree node for the test remains 
+   gray and the	status bar color is not affected.</p>
+
+<blockquote><i><b>Note:</b> In versions of NUnit prior to 2.4, these tests were
+    shown as ignored.</i></blockquote>
+
+<h4>Test Fixture Syntax</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [Platform("NET-2.0")]
+  public class DotNetTwoTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Platform("NET-2.0")>
+  Public Class DotNetTwoTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [Platform("NET-2.0")]
+  public __gc class DotNetTwoTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Platform("NET-2.0") */
+public class DotNetTwoTests
+{
+  // ...
+}
+</pre>
+</div>
+<h4>Test Syntax</h4>
+<div class="code">
+	
+<div class="langFilter">
+	<a href="javascript:Show('DD2')" onmouseover="Show('DD2')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD2" class="dropdown" style="display: none;" onclick="Hide('DD2')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test]
+    [Platform(Exclude="Win98,WinME")]
+    public void SomeTest()
+    { /* ... */ }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()>
+  Public Class SuccessTests
+    <Test(), Platform(Exclude="Win98,WinME")> Public Sub SomeTest()
+      ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test][Platform(Exclude="Win98,WinME")] void SomeTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Platform(Exclude="Win98,WinME") */
+  public void SomeTest()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h3>Platform Specifiers</h3>
+<p>The following values are recognized as platform specifiers.
+   They may be expressed in upper, lower or mixed case.</p>
+
+<ul class="across">
+<li>Win</li>
+<li>Win32</li>
+<li>Win32S</li>
+<li>Win32Windows</li>
+<li>Win32NT</li>
+<li>WinCE</li>
+<li>Win95</li>
+<li>Win98</li>
+<li>WinMe</li>
+<li>NT3</li>
+<li>NT4</li>
+<li>NT5</li>
+<li>NT6</li>
+<li>Win2K</li>
+<li>WinXP</li>
+<li>Win2003Server</li>
+<li>Vista</li>
+<li>Win2008Server</li>
+<li>Win2008ServerR2</li>
+<li>Windows7</li>
+<li>Win2012Server</li>
+<li>Windows8</li>
+<li>Unix</li>
+<li>Linux</li>
+<li>MacOsX</li>
+<li>XBox</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>Net-4.5 (3)</li>
+<li>NetCF</li>
+<li>SSCLI</li>
+<li>Rotor</li>
+<li>Mono</li>
+<li>Mono-1.0</li>
+<li>Mono-2.0</li>
+<li>Mono-3.0 (4)</li>
+<li>Mono-3.5 (5)</li>
+<li>Mono-4.0</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 Net-4.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.6.3</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><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 id="current"><a href="platform.html">Platform</a></li>
+<li><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/pnunit.html b/doc/pnunit.html
index 924e35b..24f6164 100644
--- a/doc/pnunit.html
+++ b/doc/pnunit.html
@@ -1,106 +1,107 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Pnunit</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Pnunit</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>PNUnit</h2>
-
-<p><b>PNUnit</b> stands for "Parallel NUnit." It is an extension of NUNit
-developed by Pablo Santos Luaces and his team at Codice Software for
-their internal use in testing the Plastic (TM) Software Configuration
-Management System. Codice released PNUnit to the community in 2007.
-
-<p>As part of the NUnit 2.5 release, we worked with the NUnit and PNUnit
-teams worked together to make PNUnit work with NUnit without any modifications.
-PNUnit is now included in the NUnit distribution.
-
-<h3>How it Works</h3>
-
-<p><b>PNUnit</b> is not intended for "casual" parallelism merely to
-make the tests run faster. Rather, it's intended as a way to test
-applications composed of distributed, communicating components. Tests
-of each component run in parallel and use memory barriers to synchronize
-their operation. 
-
-<p>PNUnit uses a special executable to launch its tests. 
-The launcher reads an xml file that specifies the tests to be 
-executed and where they should run, whether on the same machine or
-on another machine on the network.
-
-<p>For more information about using PNUnit, consult the
-<a href="http://www.codicesoftware.com/infocenter/technical-articles/pnunit.aspx">documentation</a>
-at <a href="http://www.codicesoftware.com">www.codicesoftware.com</a>
-
-<h3>Future Plans</h3>
-
-<p>PNUnit will be integrated with NUnit so that parallel, distributed tests
-may be used through the normal NUnit console or gui runners.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>PNUnit</h2>
+
+<p><b>PNUnit</b> stands for "Parallel NUnit." It is an extension of NUNit
+developed by Pablo Santos Luaces and his team at Codice Software for
+their internal use in testing the Plastic (TM) Software Configuration
+Management System. Codice released PNUnit to the community in 2007.
+
+<p>As part of the NUnit 2.5 release, we worked with the NUnit and PNUnit
+teams worked together to make PNUnit work with NUnit without any modifications.
+PNUnit is now included in the NUnit distribution.
+
+<h3>How it Works</h3>
+
+<p><b>PNUnit</b> is not intended for "casual" parallelism merely to
+make the tests run faster. Rather, it's intended as a way to test
+applications composed of distributed, communicating components. Tests
+of each component run in parallel and use memory barriers to synchronize
+their operation. 
+
+<p>PNUnit uses a special executable to launch its tests. 
+The launcher reads an xml file that specifies the tests to be 
+executed and where they should run, whether on the same machine or
+on another machine on the network.
+
+<p>For more information about using PNUnit, consult the
+<a href="http://www.codicesoftware.com/infocenter/technical-articles/pnunit.aspx">documentation</a>
+at <a href="http://www.codicesoftware.com">www.codicesoftware.com</a>
+
+<h3>Future Plans</h3>
+
+<p>PNUnit will be integrated with NUnit so that parallel, distributed tests
+may be used through the normal NUnit console or gui runners.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/projectEditor.html b/doc/projectEditor.html
index a79f355..ffad93e 100644
--- a/doc/projectEditor.html
+++ b/doc/projectEditor.html
@@ -1,236 +1,237 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Project Editor</h2>
-
-<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>
-
-<p>The common area of the Project Editor contains information pertaining to
-   the project as a whole. Information that applies to a particular configuration
-   is displayed in the General and Assemblies tabs.
-   
-<h4>Project Path</h4>
-<p>This label shows the full path to the project file. In the case of a 
-   wrapper project, the path is set to the same directory as the assembly
-   that was initially opened.
-   
-<h4>Application Base</h4> 
-<p>This TextBox allows the user to change the project AppBase, which defaults to 
-   the directory of the project file. The button to the right of the TextBox
-   allows the user to browse and select a directory.
-   
-<h4>Process Model</h4>
-<p>This dropdown list allows you to specify how operating system processes are
-   used in loading and running the tests in this project. Four settings are
-   defined:
-   <ul>
-   <li>The <b>Default</b> setting refers to the option selected by the user
-       on the Assembly Isolation page of the NUnit Settings Dialog.
-   <li><b>Single</b> means that tests are run in a test domain in the
-   	   same process as NUnit. This is the way previous versions of NUnit
-	   ran tests.
-   <li><b>Separate</b> means that all the tests are run in a separate process 
-       that NUnit creates.
-   <li><b>Multiple</b> means that NUnit will create a separate process for
-       each test assembly in the project and run its tests there.
-   </ul>
-   
-<h4>Domain Usage</h4>
-<p>This dropdown list allows you to specify how tests are loaded into
-   AppDomains by NUnit. Three settings are defined:
-   <ul>
-   <li>The <b>Default</b> setting refers to the option selected by the user
-       on the Assembly Isolation page of the NUnit Settings Dialog.
-   <li><b>Single</b> means that all tests will run in a single test domain
-       created by NUnit. This was the way versions of NUnit prior to 2.4
-	   ran tests.
-   <li><b>Multiple</b> means that each test assembly is loaded into a
-       separate AppDomain. This setting is not available when Multiple
-	   processes are selected in the Process Model dropown.
-   </ul>
-   
-<h4>Configuration</h4>
-<p>This dropdown list allows you to select the particular configuration
-   within a project that is displayed in the bottom part of the dialog.
-   
-<h4>Edit Configs...</h4>
-<p>This button opens the  
-   <a href="configEditor.html">Configuration Editor</a>,
-   which allows you to add, delete or rename configs and set the
-   active configuration.
-
-<h3>General Tab</h3>
-
-<p>The General tab allows setting a number of options pertaining to the selected configuration, all of
-which will be stored in the NUnit project file as attributes of the <config> xml node.</p>
-
-<h4>Runtime</h4>
-<p>This dropdown allows you to select a particular runtime framework to be used
-   for loading and running tests under the current configuration. Currently,
-   only Microsoft .NET and Mono are supported. If <b>Any</b> is selected, the 
-   tests will be run under the same runtime that NUnit itself is currently using.
-
-<h4>Version</h4>
-<p>This ComboBox allows you to select the particular version of the runtime framework
-   to be used for loading and running tests under the current configuration. The
-   dropdown list contains entries for
-   <ul>
-   <li>Default
-   <li>1.0
-   <li>1.1
-   <li>2.0
-   <li>4.0
-   </ul>
-   
-<p>If you select "Default" the assemblies in the project are examined to determine  
-   the version that is required.
-   See <a href="runtimeSelection.html">Runtime Selection</a> for 
-   more information on how NUnit selects the version to be used.
-
-<p>In special cases, you may wish to enter a version number that is not listed
-   in the list box. You may specify the version using two, three or four
-   components. The version you provide will be saved as you enter it. Leaving
-   the text box blank is equivalent to selecting "Default." 
-   
-<p><b>Note:</b> Running tests under a different runtime or version from the one that NUnit
-   is currently using will force them to run in a separate process.
-   
-<p><b>Note:</b> To conform with normal usage, specifying Mono as the runtime
-   with "1.0" as the version results in use of the Mono 1.0 profile, equating
-   to version 1.1.4322.
-   
-<h4>ApplicationBase</h4>
-<p>The ApplicationBase defaults to the directory containing the project file. Beginning
-with NUnit 2.2.3, it may be set to any location that is desired.</p>
-
-<h4>Configuration File Name</h4>
-<p>The configuration file defaults to the name of the test project with the extension changed
-from .nunit to .config. The user may substitute another name.</p>
-
-<h4>PrivateBinPath</h4>
-<p>By default, the PrivateBinPath is generated from the assembly locations specified on the
-Assemblies Tab. For those applications requiring a different level of control, it may be
-specified manually or using this editor or placed in the configuration file.</p>
-
-<h3>Assemblies Tab</h3>
-
-<p>The assemblies tab contains the list of assemblies that form part of this test project.</p>
-
-<p>Note: Although the dialog shows the location of assemblies as absolute paths, they are always
-persisted in the NUnit project file as paths relative to the application base. This allows moving
-projects as a whole to a different directory location.</p>
-
-<div class="screenshot-left">
-<img src="img/assembliesTab.jpg"></div>
-
-<h4>Add...</h4>
-<p>Opens a dialog allowing adding an assembly to this configuration. If Visual
-Stuio support is enabled, you may also select and add a VS project.</p>
-
-<h4>Remove</h4>
-<p>After confirmation, removes the selected assembly from this configuration.</p>
-
-<h4>Assembly Path</h4>
-<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.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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<li><a href="pnunit.html">PNUnit Runner</a></li>
-<li><a href="nunit-agent.html">NUnit Agent</a></li>
-<li id="current"><a href="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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Project Editor</h2>
+
+<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>
+
+<p>The common area of the Project Editor contains information pertaining to
+   the project as a whole. Information that applies to a particular configuration
+   is displayed in the General and Assemblies tabs.
+   
+<h4>Project Path</h4>
+<p>This label shows the full path to the project file. In the case of a 
+   wrapper project, the path is set to the same directory as the assembly
+   that was initially opened.
+   
+<h4>Application Base</h4> 
+<p>This TextBox allows the user to change the project AppBase, which defaults to 
+   the directory of the project file. The button to the right of the TextBox
+   allows the user to browse and select a directory.
+   
+<h4>Process Model</h4>
+<p>This dropdown list allows you to specify how operating system processes are
+   used in loading and running the tests in this project. Four settings are
+   defined:
+   <ul>
+   <li>The <b>Default</b> setting refers to the option selected by the user
+       on the Assembly Isolation page of the NUnit Settings Dialog.
+   <li><b>Single</b> means that tests are run in a test domain in the
+   	   same process as NUnit. This is the way previous versions of NUnit
+	   ran tests.
+   <li><b>Separate</b> means that all the tests are run in a separate process 
+       that NUnit creates.
+   <li><b>Multiple</b> means that NUnit will create a separate process for
+       each test assembly in the project and run its tests there.
+   </ul>
+   
+<h4>Domain Usage</h4>
+<p>This dropdown list allows you to specify how tests are loaded into
+   AppDomains by NUnit. Three settings are defined:
+   <ul>
+   <li>The <b>Default</b> setting refers to the option selected by the user
+       on the Assembly Isolation page of the NUnit Settings Dialog.
+   <li><b>Single</b> means that all tests will run in a single test domain
+       created by NUnit. This was the way versions of NUnit prior to 2.4
+	   ran tests.
+   <li><b>Multiple</b> means that each test assembly is loaded into a
+       separate AppDomain. This setting is not available when Multiple
+	   processes are selected in the Process Model dropown.
+   </ul>
+   
+<h4>Configuration</h4>
+<p>This dropdown list allows you to select the particular configuration
+   within a project that is displayed in the bottom part of the dialog.
+   
+<h4>Edit Configs...</h4>
+<p>This button opens the  
+   <a href="configEditor.html">Configuration Editor</a>,
+   which allows you to add, delete or rename configs and set the
+   active configuration.
+
+<h3>General Tab</h3>
+
+<p>The General tab allows setting a number of options pertaining to the selected configuration, all of
+which will be stored in the NUnit project file as attributes of the <config> xml node.</p>
+
+<h4>Runtime</h4>
+<p>This dropdown allows you to select a particular runtime framework to be used
+   for loading and running tests under the current configuration. Currently,
+   only Microsoft .NET and Mono are supported. If <b>Any</b> is selected, the 
+   tests will be run under the same runtime that NUnit itself is currently using.
+
+<h4>Version</h4>
+<p>This ComboBox allows you to select the particular version of the runtime framework
+   to be used for loading and running tests under the current configuration. The
+   dropdown list contains entries for
+   <ul>
+   <li>Default
+   <li>1.0
+   <li>1.1
+   <li>2.0
+   <li>4.0
+   </ul>
+   
+<p>If you select "Default" the assemblies in the project are examined to determine  
+   the version that is required.
+   See <a href="runtimeSelection.html">Runtime Selection</a> for 
+   more information on how NUnit selects the version to be used.
+
+<p>In special cases, you may wish to enter a version number that is not listed
+   in the list box. You may specify the version using two, three or four
+   components. The version you provide will be saved as you enter it. Leaving
+   the text box blank is equivalent to selecting "Default." 
+   
+<p><b>Note:</b> Running tests under a different runtime or version from the one that NUnit
+   is currently using will force them to run in a separate process.
+   
+<p><b>Note:</b> To conform with normal usage, specifying Mono as the runtime
+   with "1.0" as the version results in use of the Mono 1.0 profile, equating
+   to version 1.1.4322.
+   
+<h4>ApplicationBase</h4>
+<p>The ApplicationBase defaults to the directory containing the project file. Beginning
+with NUnit 2.2.3, it may be set to any location that is desired.</p>
+
+<h4>Configuration File Name</h4>
+<p>The configuration file defaults to the name of the test project with the extension changed
+from .nunit to .config. The user may substitute another name.</p>
+
+<h4>PrivateBinPath</h4>
+<p>By default, the PrivateBinPath is generated from the assembly locations specified on the
+Assemblies Tab. For those applications requiring a different level of control, it may be
+specified manually or using this editor or placed in the configuration file.</p>
+
+<h3>Assemblies Tab</h3>
+
+<p>The assemblies tab contains the list of assemblies that form part of this test project.</p>
+
+<p>Note: Although the dialog shows the location of assemblies as absolute paths, they are always
+persisted in the NUnit project file as paths relative to the application base. This allows moving
+projects as a whole to a different directory location.</p>
+
+<div class="screenshot-left">
+<img src="img/assembliesTab.jpg"></div>
+
+<h4>Add...</h4>
+<p>Opens a dialog allowing adding an assembly to this configuration. If Visual
+Stuio support is enabled, you may also select and add a VS project.</p>
+
+<h4>Remove</h4>
+<p>After confirmation, removes the selected assembly from this configuration.</p>
+
+<h4>Assembly Path</h4>
+<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.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<li><a href="pnunit.html">PNUnit Runner</a></li>
+<li><a href="nunit-agent.html">NUnit Agent</a></li>
+<li id="current"><a href="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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/property.html b/doc/property.html
index 9d38995..300162a 100644
--- a/doc/property.html
+++ b/doc/property.html
@@ -1,256 +1,256 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>PropertyAttribute (NUnit 2.4)</h3>
-
-<p>The Property attribute provides a generalized approach to setting named
-   properties on any test case or fixture, using a name/value pair.</p>
-   
-<p>In the example below, the fixture class MathTests is given a Location
-   value of 723 while the test case AdditionTest is given a Severity
-   of "Critical"</p>
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture, Property("Location",723)]
-  public class MathTests
-  {
-    [Test, Property("Severity", "Critical")]
-	public void AdditionTest()
-    { /* ... */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), Property("Location",723)>
-    Public Class MathTests
-	
-    <Test(), Property("Severity","Critical")>
-	  Public Sub AdditionTest()
-    ' ...
-    End Sub
-	
-  End Class
-  
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture, Property("Location",723)]
-  public __gc class MathTests
-  {
-    [Test, Property("Severity","Critical")] void AdditionTest();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.Property("Location",723) */
-public class MathTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  /** @attribute NUnit.Framework.Property("Severity","Critical") */
-  public void AdditionTest()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h4>Usage Note</h4>
-
-<p>The PropertyAttribute is not used for any purpose by NUnit itself, but
-it does display them in the XML output file and in the Test Properties
-dialog of the gui.</p>
-
-<p>It is
-   possible to write extensions that access the value of specific properties.
-   It is also possible to access the value of properties from within a test
-   using reflection.</p>
-   
-<h3>Custom Property Attributes</h3>
-
-<p>Users can define custom
-attributes that derive from <b>PropertyAttribute</b> and have them
-recognized by NUnit. PropertyAttribute provides a protected constructor
-that takes the value of the property and sets the property name to the
-name of the derived class. NUnit itself uses this facility: some of
-it's specialized attributes are actually specializations of <b>PropertyAttribute</b>.
-
-<p>Here's an example that creates a Severity property. It works
-just like any other property, but has a simpler syntax and is type-safe.
-A test reporting system might make use of the property to provide special reports.
-
-<div class=code><pre>
-public enum SeverityLevel
-{
-    Critical,
-    Major,
-    Normal,
-    Minor
-}
-
-[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-public class SeverityAttribute : PropertyAttribute
-{
-    public SeverityAttribute( SeverityLevel level )
-	    : base( level ); 
-}
-
-...
-
-[Test, Severity( SeverityLevel.Critical)]
-public void MyTest()
-{ /*...*/ }
-</pre></div>
-
-<p>Beginning with NUnit 2.5, a property attribute is able to contain
-multiple name/value pairs. This capability is not exposed publicly
-but may be used by derived property classes. NUnit uses this
-feature itself for certain attributes. See, for example, 
-<a href="requiresThread.html">RequiresThreadAttribute</a>.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="property.html">Property</a></li>
-<li><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>PropertyAttribute (NUnit 2.4)</h3>
+
+<p>The Property attribute provides a generalized approach to setting named
+   properties on any test case or fixture, using a name/value pair.</p>
+   
+<p>In the example below, the fixture class MathTests is given a Location
+   value of 723 while the test case AdditionTest is given a Severity
+   of "Critical"</p>
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture, Property("Location",723)]
+  public class MathTests
+  {
+    [Test, Property("Severity", "Critical")]
+	public void AdditionTest()
+    { /* ... */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), Property("Location",723)>
+    Public Class MathTests
+	
+    <Test(), Property("Severity","Critical")>
+	  Public Sub AdditionTest()
+    ' ...
+    End Sub
+	
+  End Class
+  
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture, Property("Location",723)]
+  public __gc class MathTests
+  {
+    [Test, Property("Severity","Critical")] void AdditionTest();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.Property("Location",723) */
+public class MathTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  /** @attribute NUnit.Framework.Property("Severity","Critical") */
+  public void AdditionTest()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h4>Usage Note</h4>
+
+<p>The PropertyAttribute is not used for any purpose by NUnit itself, but
+it does display them in the XML output file and in the Test Properties
+dialog of the gui.</p>
+
+<p>It is
+   possible to write extensions that access the value of specific properties.
+   It is also possible to access the value of properties from within a test
+   using reflection.</p>
+   
+<h3>Custom Property Attributes</h3>
+
+<p>Users can define custom
+attributes that derive from <b>PropertyAttribute</b> and have them
+recognized by NUnit. PropertyAttribute provides a protected constructor
+that takes the value of the property and sets the property name to the
+name of the derived class. NUnit itself uses this facility: some of
+it's specialized attributes are actually specializations of <b>PropertyAttribute</b>.
+
+<p>Here's an example that creates a Severity property. It works
+just like any other property, but has a simpler syntax and is type-safe.
+A test reporting system might make use of the property to provide special reports.
+
+<div class=code><pre>
+public enum SeverityLevel
+{
+    Critical,
+    Major,
+    Normal,
+    Minor
+}
+
+[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
+public class SeverityAttribute : PropertyAttribute
+{
+    public SeverityAttribute( SeverityLevel level )
+	    : base( level ); 
+}
+
+...
+
+[Test, Severity( SeverityLevel.Critical)]
+public void MyTest()
+{ /*...*/ }
+</pre></div>
+
+<p>Beginning with NUnit 2.5, a property attribute is able to contain
+multiple name/value pairs. This capability is not exposed publicly
+but may be used by derived property classes. NUnit uses this
+feature itself for certain attributes. See, for example, 
+<a href="requiresThread.html">RequiresThreadAttribute</a>.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="property.html">Property</a></li>
+<li><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/propertyConstraint.html b/doc/propertyConstraint.html
index 49cceea..c8fe1a1 100644
--- a/doc/propertyConstraint.html
+++ b/doc/propertyConstraint.html
@@ -1,152 +1,156 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Property Constraints (NUnit 2.4.2)</h2>
-
-<p>Property constraints are used to test for the existence of a named property and
-optionally to test its value. It may also be used as a prefix for other constraints
-to be applied to the property.
-
-<h3>PropertyExistsConstraint</h3>
-
-<h4>Action</h4>
-
-<p>Tests for the existence of a named property on an object.
-
-<h4>Constructor</h4>
-
-<div class="code"><pre>
-PropertyExistsConstraint(string name)
-</pre></div>
-
-<h4>Syntax</h4>
-
-<div class="code"><pre>
-Has.Property( string )
-</pre></div>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Assert.That( someObject, Has.Property( "Version" ) );
-</pre></div>
-
-<h3>PropertyConstraint</h3>
-
-<h4>Action</h4>
-
-<p>Tests for the existence of a named property on an object and causes subsequent
-allows tests to be made on the property value.
-
-<h4>Constructor</h4>
-
-<div class="code"><pre>
-PropertyConstraint(string name)
-</pre></div>
-
-<h4>Syntax</h4>
-
-<div class="code"><pre>
-Has.Property(string)...
-</pre></div>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Assert.That(someObject, Has.Property("Version").EqualTo("2.0"));
-Assert.That(collection, Has.Property("Count").GreaterThan(10));
-</pre></div>
-
-<h3>Special Properties</h3>
-
-<p>Certain common properties are known to NUnit and 
-may be tested using the following syntax...
-
-<div class="code"><pre>
-Has.Length...
-Has.Count...
-Has.Message...
-Has.InnerException...
-</pre></div>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li id="current"><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Property Constraints (NUnit 2.4.2)</h2>
+
+<p>Property constraints are used to test for the existence of a named property and
+optionally to test its value. It may also be used as a prefix for other constraints
+to be applied to the property.
+
+<h3>PropertyExistsConstraint</h3>
+
+<h4>Action</h4>
+
+<p>Tests for the existence of a named property on an object.
+
+<h4>Constructor</h4>
+
+<div class="code"><pre>
+PropertyExistsConstraint(string name)
+</pre></div>
+
+<h4>Syntax</h4>
+
+<div class="code"><pre>
+Has.Property( string )
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That( someObject, Has.Property( "Version" ) );
+</pre></div>
+
+<h3>PropertyConstraint</h3>
+
+<h4>Action</h4>
+
+<p>Tests for the existence of a named property on an object and causes subsequent
+allows tests to be made on the property value.
+
+<h4>Constructor</h4>
+
+<div class="code"><pre>
+PropertyConstraint(string name)
+</pre></div>
+
+<h4>Syntax</h4>
+
+<div class="code"><pre>
+Has.Property(string)...
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That(someObject, Has.Property("Version").EqualTo("2.0"));
+Assert.That(collection, Has.Property("Count").GreaterThan(10));
+</pre></div>
+
+<h3>Special Properties</h3>
+
+<p>Certain common properties are known to NUnit and 
+may be tested using the following syntax...
+
+<div class="code"><pre>
+Has.Length...
+Has.Count...
+Has.Message...
+Has.InnerException...
+</pre></div>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li id="current"><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/quickStart.html b/doc/quickStart.html
index ac5820a..aafb538 100644
--- a/doc/quickStart.html
+++ b/doc/quickStart.html
@@ -1,319 +1,335 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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><!--
-  div.code { width: 34em }
---></style>
-
-<h2>NUnit Quick Start</h2>
-
-<p><b>Note:</b> This page is based on the original QuickStart.doc, found in
-earlier releases of NUnit. It has been pointed out that it isn't a good 
-example of Test-Driven Development. However, we're keeping it in the docs
-because it does illustrate the basics of using NUnit. We'll revise or replace
-it in a future release.</p>
-
-<p>Let�s start with a simple example. Suppose we are writing a bank application and we have a basic domain class � Account. Account supports operations to deposit, withdraw, and transfer funds. The Account class may look like this:</p>
-
-<div class="code">
-<pre>namespace bank
-{
-  public class Account
-  {
-    private float balance;
-    public void Deposit(float amount)
-    {
-      balance+=amount;
-    }
-
-    public void Withdraw(float amount)
-    {
-      balance-=amount;
-    }
-
-    public void TransferFunds(Account destination, float amount)
-    {
-    }
-
-    public float Balance
-    {
-      get{ return balance;}
-    }
-  }
-}</pre>
-</div>
-
-<p>Now let�s write a test for this class � AccountTest. The first method we will test is TransferFunds.</p>
-
-<div class="code">
-<pre>namespace bank
-{
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class AccountTest
-  {
-    [Test]
-    public void TransferFunds()
-    {
-      Account source = new Account();
-      source.Deposit(200.00F);
-      Account destination = new Account();
-      destination.Deposit(150.00F);
-
-      source.TransferFunds(destination, 100.00F);
-      Assert.AreEqual(250.00F, destination.Balance);
-      Assert.AreEqual(100.00F, source.Balance);
-	
-    }
-  }
-}</pre>
-</div>
-
-<p>The first thing to notice about this class is that it has a [TestFixture] attribute associated with it � this is the way to indicate that the class contains test code (this attribute can be inherited). The class has to be public and there are no restrictions on its superclass. The class also has to have a default constructor.</p>
-
-<p>The only method in the class � TransferFunds, has a [Test] attribute associated with it � this is an indication that it is a test method. Test methods have to return void and take no parameters. In our test method we do the usual initialization of the required test objects, execute the tested business method and check the state of the business objects. The Assert class defines a collection of methods used to check the post-conditions and in our example we use the AreEqual method to ma [...]
-
-<p>Compile and run this example. Assume that you have compiled your test code into a bank.dll. Start the NUnit Gui (the installer will have created a shortcut on your desktop and in the �Program Files� folder), after the GUI starts, select the File->Open menu item, navigate to the location of your bank.dll and select it in the �Open� dialog box. When the bank.dll is loaded you will see a test tree structure in the left panel and a collection of status panels on the right. Click the Run b [...]
-
-<pre>    TransferFunds : expected <250> but was <150></pre>
-
-and the stack trace panel right below it reported where in the test code the failure has occurred � 
-
-<pre>    at bank.AccountTest.TransferFunds() in C:\nunit\BankSampleTests\AccountTest.cs:line 17</pre></p>
-
-<p>That is expected behavior; the test has failed because we have not implemented the TransferFunds method yet. Now let�s get it to work. Don�t close the GUI and go back to your IDE and fix the code, make your TransferFunds method look like this:</p>
-
-<div class="code">
-<pre>public void TransferFunds(Account destination, float amount)
-{
-	destination.Deposit(amount);
-	Withdraw(amount);
-}</pre>
-</div>
-
-
-<p>Now recompile your code and click the run button in GUI again � the status bar and the test tree turn green. (Note how the GUI has reloaded the assembly automatically for you; we will keep the GUI open all the time and continue working with our code in IDE and write more tests).</p>
-
-<p>Let�s add some error checking to our Account code. We are adding the minimum balance requirement for the account to make sure that banks continue to make their money by charging your minimal overdraft protection fee. Let�s add the minimum balance property to our Account class:</p>
-
-<div class="code">
-<pre>private float minimumBalance = 10.00F;
-public float MinimumBalance
-{
-	get{ return minimumBalance;}
-}</pre>
-</div>
-
-<p>We will use an exception to indicate an overdraft:</p>
-
-<div class="code">
-<pre>namespace bank
-{
-  using System;
-  public class InsufficientFundsException : ApplicationException
-  {
-  }
-}</pre>
-</div>
-
-<p>Add a new test method to our AccountTest class:</p>
-
-<div class="code">
-<pre>[Test]
-[ExpectedException(typeof(InsufficientFundsException))]
-public void TransferWithInsufficientFunds()
-{
-	Account source = new Account();
-	source.Deposit(200.00F);
-	Account destination = new Account();
-	destination.Deposit(150.00F);
-	source.TransferFunds(destination, 300.00F);
-}</pre>
-</div>
-
-<p>This test method in addition to [Test] attribute has an [ExpectedException] attribute associated with it � this is the way to indicate that the test code is expecting an exception of a certain type; if such an exception is not thrown during the execution � the test will fail. Compile your code and go back to the GUI. As you compiled your test code, the GUI has grayed out and collapsed the test tree as if the tests were not run yet (GUI watches for the changes made to the test assembli [...]
-
-<pre>    TransferWithInsufficentFunds : InsufficientFundsException was expected</pre>
-
-Let�s fix our Account code again, modify the TransferFunds method this way:</p>
-
-<div class="code">
-<pre>public void TransferFunds(Account destination, float amount)
-{
-	destination.Deposit(amount);
-	if(balance-amount<minimumBalance)
-		throw new InsufficientFundsException();
-	Withdraw(amount);
-}</pre>
-</div>
-
-<p>Compile and run the tests � green bar. Success! But wait, looking at the code we�ve just written we can see that the bank may be loosing money on every unsuccessful funds Transfer operation. Let�s write a test to confirm our suspicions. Add this test method:</p>
-	
-<div class="code">
-<pre>[Test]
-public void TransferWithInsufficientFundsAtomicity()
-{
-	Account source = new Account();
-	source.Deposit(200.00F);
-	Account destination = new Account();
-	destination.Deposit(150.00F);
-	try
-	{
-		source.TransferFunds(destination, 300.00F);
-	}
-	catch(InsufficientFundsException expected)
-	{
-	}
-
-	Assert.AreEqual(200.00F,source.Balance);
-	Assert.AreEqual(150.00F,destination.Balance);
-}</pre>
-</div>
-
-<p>We are testing the transactional property of our business method � all operations are successful or none. Compile and run � red bar. OK, we�ve made $300.00 out of a thin air (1999.com d�j� vu?) � the source account has the correct balance of 200.00 but the destination account shows : $450.00. How do we fix this? Can we just move the minimum balance check call in front of the updates:</p>
-
-<div class="code">
-<pre>public void TransferFunds(Account destination, float amount)
-{
-	if(balance-amount<minimumBalance) 
-		throw new InsufficientFundsException();
-	destination.Deposit(amount);
-	Withdraw(amount);
-}</pre>
-</div>
-
-<p>What if the Withdraw() method throws another exception? Should we execute a compensating transaction in the catch block or rely on our transaction manager to restore the state of the objects? We need to answer those questions at some point, but not now; but what do we do with the failing test in the meantime � remove it? A better way is to temporarily ignore it, add the following attribute to your test method</p>
-	
-<div class="code">
-<pre>[Test]
-[Ignore("Decide how to implement transaction management")]
-public void TransferWithInsufficientFundsAtomicity()
-{
-	// code is the same
-}</pre>
-</div>
-
-<p>Compile and run � yellow bar. Click on �Tests Not Run� tab and you will see bank.AccountTest.TransferWithInsufficientFundsAtomicity() in the list along with the Reason this test is ignored.</p>
-
-<p>Looking at our test code we can see that some refactoring is in order. All test methods share a common set of test objects. Let�s extract this initialization code into a setup method and reuse it in all of our tests. The refactored version of our test class looks like this:</p>
-
-<div class="code">
-<pre>namespace bank
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class AccountTest
-  {
-    Account source;
-    Account destination;
-
-    [SetUp]
-    public void Init()
-    {
-      source = new Account();
-      source.Deposit(200.00F);
-      destination = new Account();
-      destination.Deposit(150.00F);
-    }
-
-    [Test]
-    public void TransferFunds()
-    {
-      source.TransferFunds(destination, 100.00f);
-      Assert.AreEqual(250.00F, destination.Balance);
-      Assert.AreEqual(100.00F, source.Balance);
-    }
-
-    [Test]
-    [ExpectedException(typeof(InsufficientFundsException))]
-    public void TransferWithInsufficientFunds()
-    {
-      source.TransferFunds(destination, 300.00F);
-    }
-
-    [Test]
-    [Ignore("Decide how to implement transaction management")]
-    public void TransferWithInsufficientFundsAtomicity()
-    {
-      try
-      {
-        source.TransferFunds(destination, 300.00F);
-      }
-      catch(InsufficientFundsException expected)
-      {
-      }
-
-      Assert.AreEqual(200.00F,source.Balance);
-      Assert.AreEqual(150.00F,destination.Balance);
-    }
-  }
-}</pre>
-</div>
-
-<p>Note that Init method has the common initialization code, it has void return type, no parameters, and it is marked with [SetUp] attribute. Compile and run � same yellow bar!</p>
-
-</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>
-<ul>
-<li id="current"><a href="quickStart.html">Quick Start</a></li>
-<li><a href="installation.html">Installation</a></li>
-</ul>
-<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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<style><!--
+  div.code { width: 34em }
+--></style>
+
+<h2>NUnit Quick Start</h2>
+
+<p><b>Note:</b> This page is based on the original QuickStart.doc, found in
+earlier releases of NUnit. It has been pointed out that it isn't a good 
+example of Test-Driven Development. However, we're keeping it in the docs
+because it does illustrate the basics of using NUnit. We'll revise or replace
+it in a future release.</p>
+
+<p>Let�s start with a simple example, whose full source code is available <a href="quickStartSource.html">here</a>. Suppose we are writing a bank application and we have a basic domain class � Account. Account supports operations to deposit, withdraw, and transfer funds. The Account class may look like this:</p>
+
+<div class="code">
+<pre>namespace Bank
+{
+  public class Account
+  {
+    private decimal balance;
+	
+    public void Deposit(decimal amount)
+    {
+      balance += amount;
+    }
+
+    public void Withdraw(decimal amount)
+    {
+      balance -= amount;
+    }
+
+    public void TransferFunds(Account destination, decimal amount)
+    {
+    }
+
+    public decimal Balance
+    {
+      get { return balance; }
+    }
+  }
+}</pre>
+</div>
+
+<p>Now let�s write a test for this class � AccountTest. The first method we will test is TransferFunds.</p>
+
+<div class="code">
+<pre>namespace Bank
+{
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class AccountTest
+  {
+    [Test]
+    public void TransferFunds()
+    {
+      Account source = new Account();
+      source.Deposit(200m);
+      
+      Account destination = new Account();
+      destination.Deposit(150m);
+
+      source.TransferFunds(destination, 100m);
+	  
+      Assert.AreEqual(250m, destination.Balance);
+      Assert.AreEqual(100m, source.Balance);
+    }
+  }
+}</pre>
+</div>
+
+<p>The first thing to notice about this class is that it has a [TestFixture] attribute associated with it � this is the way to indicate that the class contains test code (this attribute can be inherited). The class has to be public and there are no restrictions on its superclass. The class also has to have a default constructor.</p>
+
+<p>The only method in the class � TransferFunds, has a [Test] attribute associated with it � this is an indication that it is a test method. Test methods have to return void and take no parameters. In our test method we do the usual initialization of the required test objects, execute the tested business method and check the state of the business objects. The Assert class defines a collection of methods used to check the post-conditions and in our example we use the AreEqual method to ma [...]
+
+<p>Compile and run this example. Assume that you have compiled your test code into a bank.dll. Start the NUnit Gui (the installer will have created a shortcut on your desktop and in the �Program Files� folder), after the GUI starts, select the File->Open menu item, navigate to the location of your bank.dll and select it in the �Open� dialog box. When the bank.dll is loaded you will see a test tree structure in the left panel and a collection of status panels on the right. Click the Run b [...]
+
+<pre>    TransferFunds : expected <250> but was <150></pre>
+
+and the stack trace panel right below it reported where in the test code the failure has occurred � 
+
+<pre>    at bank.AccountTest.TransferFunds() in C:\nunit\BankSampleTests\AccountTest.cs:line 19</pre></p>
+
+<p>That is expected behavior; the test has failed because we have not implemented the TransferFunds method yet. Now let�s get it to work. Don�t close the GUI and go back to your IDE and fix the code, make your TransferFunds method look like this:</p>
+
+<div class="code">
+<pre>public void TransferFunds(Account destination, decimal amount)
+{
+  destination.Deposit(amount);
+  Withdraw(amount);
+}</pre>
+</div>
+
+<p>Now recompile your code and click the run button in GUI again � the status bar and the test tree turn green. (Note how the GUI has reloaded the assembly automatically for you; we will keep the GUI open all the time and continue working with our code in IDE and write more tests).</p>
+
+<p>Let�s add some error checking to our Account code. We are adding the minimum balance requirement for the account to make sure that banks continue to make their money by charging your minimal overdraft protection fee. Let�s add the minimum balance property to our Account class:</p>
+
+<div class="code">
+<pre>private decimal minimumBalance = 10m;
+
+public decimal MinimumBalance
+{
+  get{ return minimumBalance; }
+}</pre>
+</div>
+
+<p>We will use an exception to indicate an overdraft:</p>
+
+<div class="code">
+<pre>namespace Bank
+{
+  using System;
+  
+  public class InsufficientFundsException : ApplicationException
+  {
+  }
+}</pre>
+</div>
+
+<p>Add a new test method to our AccountTest class:</p>
+
+<div class="code">
+<pre>[Test]
+[ExpectedException(typeof(InsufficientFundsException))]
+public void TransferWithInsufficientFunds()
+{
+  Account source = new Account();
+  source.Deposit(200m);
+	
+  Account destination = new Account();
+  destination.Deposit(150m);
+	
+  source.TransferFunds(destination, 300m);
+}</pre>
+</div>
+
+<p>This test method in addition to [Test] attribute has an [ExpectedException] attribute associated with it � this is the way to indicate that the test code is expecting an exception of a certain type; if such an exception is not thrown during the execution � the test will fail. Compile your code and go back to the GUI. As you compiled your test code, the GUI has grayed out and collapsed the test tree as if the tests were not run yet (GUI watches for the changes made to the test assembli [...]
+
+<pre>    TransferWithInsufficentFunds : InsufficientFundsException was expected</pre>
+
+Let�s fix our Account code again, modify the TransferFunds method this way:</p>
+
+<div class="code">
+<pre>public void TransferFunds(Account destination, decimal amount)
+{
+  destination.Deposit(amount);
+	
+  if(balance-amount < minimumBalance)
+    throw new InsufficientFundsException();
+		
+  Withdraw(amount);
+}</pre>
+</div>
+
+<p>Compile and run the tests � green bar. Success! But wait, looking at the code we�ve just written we can see that the bank may be loosing money on every unsuccessful funds Transfer operation. Let�s write a test to confirm our suspicions. Add this test method:</p>
+	
+<div class="code">
+<pre>[Test]
+public void TransferWithInsufficientFundsAtomicity()
+{
+  Account source = new Account();
+  source.Deposit(200m);
+
+  Account destination = new Account();
+  destination.Deposit(150m);
+	
+  try
+  {
+  	source.TransferFunds(destination, 300m);
+  }
+  catch(InsufficientFundsException expected)
+  {
+  }
+
+  Assert.AreEqual(200m, source.Balance);
+  Assert.AreEqual(150m, destination.Balance);
+}</pre>
+</div>
+
+<p>We are testing the transactional property of our business method � all operations are successful or none. Compile and run � red bar. OK, we�ve made $300.00 out of a thin air (1999 .com d�j� vu?) � the source account has the correct balance of 200.00 but the destination account shows : $450.00. How do we fix this? Can we just move the minimum balance check call in front of the updates:</p>
+
+<div class="code">
+<pre>public void TransferFunds(Account destination, decimal amount)
+{
+  if(balance-amount < minimumBalance) 
+    throw new InsufficientFundsException();
+	
+  destination.Deposit(amount);
+
+  Withdraw(amount);
+}</pre>
+</div>
+
+<p>What if the Withdraw() method throws another exception? Should we execute a compensating transaction in the catch block or rely on our transaction manager to restore the state of the objects? We need to answer those questions at some point, but not now; but what do we do with the failing test in the meantime � remove it? A better way is to temporarily ignore it, add the following attribute to your test method</p>
+	
+<div class="code">
+<pre>[Test]
+[Ignore("Decide how to implement transaction management")]
+public void TransferWithInsufficientFundsAtomicity()
+{
+  // code is the same
+}</pre>
+</div>
+
+<p>Compile and run � yellow bar. Click on �Tests Not Run� tab and you will see bank.AccountTest.TransferWithInsufficientFundsAtomicity() in the list along with the Reason this test is ignored.</p>
+
+<p>Looking at our test code we can see that some refactoring is in order. All test methods share a common set of test objects. Let�s extract this initialization code into a setup method and reuse it in all of our tests. The refactored version of our test class looks like this:</p>
+
+<div class="code">
+<pre>namespace Bank
+{
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class AccountTest
+  {
+    Account source;
+    Account destination;
+
+    [SetUp]
+    public void Init()
+    {
+      source = new Account();
+      source.Deposit(200m);
+	  
+      destination = new Account();
+      destination.Deposit(150m);
+    }
+
+    [Test]
+    public void TransferFunds()
+    {
+      source.TransferFunds(destination, 100m);
+	  
+      Assert.AreEqual(250m, destination.Balance);
+      Assert.AreEqual(100m, source.Balance);
+    }
+
+    [Test]
+    [ExpectedException(typeof(InsufficientFundsException))]
+    public void TransferWithInsufficientFunds()
+    {
+      source.TransferFunds(destination, 300m);
+    }
+
+    [Test]
+    [Ignore("Decide how to implement transaction management")]
+    public void TransferWithInsufficientFundsAtomicity()
+    {
+      try
+      {
+        source.TransferFunds(destination, 300m);
+      }
+      catch(InsufficientFundsException expected)
+      {
+      }
+
+      Assert.AreEqual(200m, source.Balance);
+      Assert.AreEqual(150m, destination.Balance);
+    }
+  }
+}</pre>
+</div>
+
+<p>Note that Init method has the common initialization code, it has void return type, no parameters, and it is marked with [SetUp] attribute. Compile and run � same yellow bar!</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li id="current"><a href="quickStart.html">Quick Start</a></li>
+<ul>
+<li><a href="quickStartSource.html">Source Listing</a></li>
+</ul>
+<li><a href="installation.html">Installation</a></li>
+</ul>
+<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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/quickStartSource.html b/doc/quickStartSource.html
new file mode 100644
index 0000000..ddfcec9
--- /dev/null
+++ b/doc/quickStartSource.html
@@ -0,0 +1,176 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - QuickStartSource</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><!--
+  div.code { width: 34em }
+--></style>
+
+<h2>NUnit Quick Start</h2>
+
+<div class="code">
+<pre>using System;
+using NUnit.Framework;
+
+namespace Bank
+{
+  public class Account
+  {
+    private decimal balance;
+    private decimal minimumBalance = 10m;
+
+    public void Deposit(decimal amount)
+    {
+      balance += amount;
+    }
+
+    public void Withdraw(decimal amount)
+    {
+      balance -= amount;
+    }
+
+    public void TransferFunds(Account destination, decimal amount)
+    {
+      if (balance - amount < minimumBalance)
+        throw new InsufficientFundsException();
+
+      destination.Deposit(amount);
+
+      Withdraw(amount);
+    }
+
+    public decimal Balance
+    {
+      get { return balance; }
+    }
+
+    public decimal MinimumBalance
+    {
+      get { return minimumBalance; }
+    }
+  }
+
+  public class InsufficientFundsException : ApplicationException
+  {
+  }
+
+  [TestFixture]
+  public class AccountTest
+  {
+    Account source;
+    Account destination;
+
+    [SetUp]
+    public void Init()
+    {
+      source = new Account();
+      source.Deposit(200m);
+
+      destination = new Account();
+      destination.Deposit(150m);
+    }
+
+    [Test]
+    public void TransferFunds()
+    {
+      source.TransferFunds(destination, 100m);
+
+      Assert.AreEqual(250m, destination.Balance);
+      Assert.AreEqual(100m, source.Balance);
+    }
+
+    [Test]
+    [ExpectedException(typeof(InsufficientFundsException))]
+    public void TransferWithInsufficientFunds()
+    {
+      source.TransferFunds(destination, 300m);
+    }
+
+    [Test]
+    [Ignore("Decide how to implement transaction management")]
+    public void TransferWithInsufficientFundsAtomicity()
+    {
+      try
+      {
+        source.TransferFunds(destination, 300m);
+      }
+      catch (InsufficientFundsException expected)
+      {
+      }
+
+      Assert.AreEqual(200m, source.Balance);
+      Assert.AreEqual(150m, destination.Balance);
+    }
+  }
+}</pre>
+</div>
+<div style="width: 34em; text-align:center;">
+<b>Listing - QuickStart Example</b>
+</div>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li><a href="quickStart.html">Quick Start</a></li>
+<ul>
+<li id="current"><a href="quickStartSource.html">Source Listing</a></li>
+</ul>
+<li><a href="installation.html">Installation</a></li>
+</ul>
+<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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/random.html b/doc/random.html
index 00e1188..9e21c5a 100644
--- a/doc/random.html
+++ b/doc/random.html
@@ -1,146 +1,146 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Random</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Random</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RandomAttribute (NUnit 2.5)</h3>
-
-<p>The <b>RandomAttribute</b> is used to specify a set of random values to be provided
-   for an individual parameter of a parameterized test method. Since
-   NUnit combines the data provided for each parameter into a set of
-   test cases, data must be provided for all parameters if it is
-   provided for any of them.
-   
-<p>By default, NUnit creates test cases from all possible combinations
-   of the datapoints provided on parameters - the combinatorial approach.
-   This default may be modified by use of specific attributes on the
-   test method itself.
-   
-<p>RandomAttribute supports the following constructors:
-
-<div class="code"><pre>
-public Random( int count );
-public Random( double min, double max, int count );
-public Random( int min, int max, int count );
-</pre></div>
-   
-<h4>Example</h4>
-
-<p>The following test will be executed fifteen times, three times
-for each value of x, each combined with 5 random doubles from -1.0 to +1.0.
-
-<div class="code"><pre>
-[Test]
-public void MyTest(
-    [Values(1,2,3)] int x,
-    [Random(-1.0, 1.0, 5)] double d)
-{
-    ...
-}
-</pre></div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="values.html">ValuesAttribute</a><li><a href="range.html">RangeAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="random.html">Random</a></li>
-<li><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RandomAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RandomAttribute</b> is used to specify a set of random values to be provided
+   for an individual parameter of a parameterized test method. Since
+   NUnit combines the data provided for each parameter into a set of
+   test cases, data must be provided for all parameters if it is
+   provided for any of them.
+   
+<p>By default, NUnit creates test cases from all possible combinations
+   of the datapoints provided on parameters - the combinatorial approach.
+   This default may be modified by use of specific attributes on the
+   test method itself.
+   
+<p>RandomAttribute supports the following constructors:
+
+<div class="code"><pre>
+public Random( int count );
+public Random( double min, double max, int count );
+public Random( int min, int max, int count );
+</pre></div>
+   
+<h4>Example</h4>
+
+<p>The following test will be executed fifteen times, three times
+for each value of x, each combined with 5 random doubles from -1.0 to +1.0.
+
+<div class="code"><pre>
+[Test]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Random(-1.0, 1.0, 5)] double d)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="values.html">ValuesAttribute</a><li><a href="range.html">RangeAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="random.html">Random</a></li>
+<li><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/range.html b/doc/range.html
index c3c2cb0..b490857 100644
--- a/doc/range.html
+++ b/doc/range.html
@@ -1,157 +1,157 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Range</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Range</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RangeAttribute (NUnit 2.5)</h3>
-
-<p>The <b>RangeAttribute</b> is used to specify a range of values to be provided
-   for an individual parameter of a parameterized test method. Since
-   NUnit combines the data provided for each parameter into a set of
-   test cases, data must be provided for all parameters if it is
-   provided for any of them.
-   
-<p>By default, NUnit creates test cases from all possible combinations
-   of the datapoints provided on parameters - the combinatorial approach.
-   This default may be modified by use of specific attributes on the
-   test method itself.
-   
-<p>RangeAttribute supports the following constructors:
-
-<div class="code"><pre>
-public RangeAttribute( int from, int to );
-public RangeAttribute( int from, int to, int step );
-public RangeAttribute( long from, long to, long step );
-public RangeAttribute( float from, float to, float step );
-public RangeAttribute( double from, double to, double step );
-</pre></div>
-   
-<h4>Example</h4>
-
-<p>The following test will be executed nine times, as follows:
-<pre>
-	MyTest(1, 0.2)
-	MyTest(1, 0.4)
-	MyTest(1, 0.6)
-	MyTest(2, 0.2)
-	MyTest(2, 0.4)
-	MyTest(2, 0.6)
-	MyTest(3, 0.2)
-	MyTest(3, 0.4)
-	MyTest(3, 0.6)
-</pre>
-<div class="code"><pre>
-[Test]
-public void MyTest(
-    [Values(1,2,3) int x,
-    [Range(0.2,0.6,0.2] double d)
-{
-    ...
-}
-</pre></div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="values.html">ValuesAttribute</a><li><a href="random.html">RandomAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="range.html">Range</a></li>
-<li><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RangeAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RangeAttribute</b> is used to specify a range of values to be provided
+   for an individual parameter of a parameterized test method. Since
+   NUnit combines the data provided for each parameter into a set of
+   test cases, data must be provided for all parameters if it is
+   provided for any of them.
+   
+<p>By default, NUnit creates test cases from all possible combinations
+   of the datapoints provided on parameters - the combinatorial approach.
+   This default may be modified by use of specific attributes on the
+   test method itself.
+   
+<p>RangeAttribute supports the following constructors:
+
+<div class="code"><pre>
+public RangeAttribute( int from, int to );
+public RangeAttribute( int from, int to, int step );
+public RangeAttribute( long from, long to, long step );
+public RangeAttribute( float from, float to, float step );
+public RangeAttribute( double from, double to, double step );
+</pre></div>
+   
+<h4>Example</h4>
+
+<p>The following test will be executed nine times, as follows:
+<pre>
+	MyTest(1, 0.2)
+	MyTest(1, 0.4)
+	MyTest(1, 0.6)
+	MyTest(2, 0.2)
+	MyTest(2, 0.4)
+	MyTest(2, 0.6)
+	MyTest(3, 0.2)
+	MyTest(3, 0.4)
+	MyTest(3, 0.6)
+</pre>
+<div class="code"><pre>
+[Test]
+public void MyTest(
+    [Values(1,2,3) int x,
+    [Range(0.2,0.6,0.2] double d)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="values.html">ValuesAttribute</a><li><a href="random.html">RandomAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="range.html">Range</a></li>
+<li><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/releaseBreakdown.html b/doc/releaseBreakdown.html
index 0dd7da6..e19a9f9 100644
--- a/doc/releaseBreakdown.html
+++ b/doc/releaseBreakdown.html
@@ -1,29 +1,145 @@
-<!-- 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>
+<!-- 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>
+</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 changes for each NUnit version</a>
+</div>
+
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.6.3 - Version 2.6.3.13283 - October 10, 2013</h3>
+
+<h4>Framework</h4>
+<ul>
+<li>When running under .NET 4.5, <b>async</b> methods may now be used as the target of a <b>ThrowsConstraint</b>.
+<li>When running under .NET 4.5, <b>async</b> methods may now be used as an <b>ActualValueDelegate</b> passed to <b>Assert.That()</b> or <b>Assume.That()</b>.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>1071164 	Support async methods in usage scenarios of Throws constraints
+<li>1071714 	TestContext is broken when a previous version of the runner is used alongside a new version of the framework
+<li>1071861 	Error in Path Constraints
+<li>1072379 	Report test execution time at a higher resolution
+<li>1074568 	Assert/Assume should support an async method for the ActualValueDelegate
+<li>1079296 	NUnit 2.6.2 Failure on Mono
+<li>1082330 	Better Exception if SetCulture attribute is applied multiple times
+<li>1084181   TestExecutionContext SerializationException
+<li>1086975 	Security Exception After Upgrading to 2.6.2
+<li>1096902 	Trace output is disabled by default in version 2.6.2.12296
+<li>1097854 	Incorrect documentation for console runner /test option
+<li>1107746 	Add nunit tags to nuget packages
+<li>1130239 	classicModel.html is linked in local help, but doesn't exist
+<li>1167638 	Incorrectly detected recursion with types implementing IEnumerable and overriding Equals/operators/value types
+<li>1167805 	cross-domain problems with XmlSchema and call context
+<li>1222148 	/framework switch does not recognize net-4.5
+<li>1235891 	Proposed 2.6.3 release: ArgumentNullException in NUnit.Framework.AsyncInvocationRegion..cctor
+</ul>
+
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.6.2 - Version 2.6.2.12296 - October 22, 2012</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>Tests may now be loaded and run from a shared directory specified as a UNC path.
+<li>Tests may now be run under .NET 4.5.
+<li>When running under a debugger, any nunit-agent process launched will break and allow the option to continue debugging the agent process as well.
+<li>J# and old-style managed C++ samples have been removed. F# samples are now included. Code samples are no longer included in the standard installs but are available as a separate download. All samples now use VS2010 projects.
+</ul>
+
+<h4>Development</h4>
+<ul>
+<li>The source code now includes solutions for VS2010 and VS2012. The VS2008 solution has been removed.
+<li>The NAnt build now uses NAnt 0.92.
+<li>NSubstitute has been upgraded to version 1.4.3.
+</ul>
+
+<h4>Framework</h4>
+<ul>
+<li>When running under .NET 4.5, <b>async</b> test methods are now supported. For test cases returning a value, the method must return <b>Task<T></b>, where <b>T</b> is the type of the returned value. For single tests and test cases not returning a value, the method may return either <b>void</b> or <b>Task</b>.
+<li>The <b>Platform</b> attribute has been upgraded to recognize .NET 4.5, MaxOsX and XBox.
+<li><b>TestCaseSource</b> may now specify a class that implements <b>IEnumerable</b> without specifying the name of a method.
+</ul>
+
+<h4>Console</h4>
+<ul>
+<li>New options <b>/basepath</b> and <b>/privatebinpath</b> allow specifying the ApplicationBase and probing path on the command line.
+</ul>
 
-<div id="content">
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>1029785 	Test loaded from remote folder failed to run with exception System.IODirectory Not Found
+<li>1029941 	Missing basepath and privatebinpath arguments in nunit-console
+<li>1033537 	Spurious behaviour using keyboard menu key
+<li>1034242 	Update VS Solution to VS2010
+<li>1036699 	Documentation is missing info about the /test command line option
+<li>1037130 	Update NSubstitute to 1.4.3
+<li>1041365 	Add MaxOsX and Xbox support to platform attribute
+<li>1042385 	Convert all sample projects to VS2010
+<li>1043641 	New text output tab doesn't display anything until NUnit is closed and re-opened
+<li>1047272 	TestContext.CurrentContext.Result throws NullReferenceException
+<li>1048920 	Attach debugger to nunit-agent automatically
+<li>1052298 	Allow TestCaseSource to be an instance of IEnumerable
+<li>1053727 	Project Editor Unhandled Exception when setting ApplicationBase
+<li>1055701 	Upgrade NAnt to 0.92
+<li>1057911 	Trap incorrect input for nunit-console.exe options
+<li>1057912 	Clarify /runlist help message for nunit-console.exe
+<li>1057913 	Unhandled exception for /trace option in nunit-console.exe
+<li>1057981 	C#5 async tests are not supported
+<li>1060482 	Documentation: Minor Typo
+<li>1061956 	Recognize .NET 4.5 when it is running
+<li>1061957 	Packaging problems
+<li>1064014 	Simple async tests should not return Task<T>
+<li>1064100 	Void testcase with expected result should be non-runnable
+<li>1066386 	Improve support for C# async void tests
+<li>1066393 	Unable to display source for testcases with an alternate name set
+<li>1069499 	Exception thrown when trying to load an assembly not built for .NET
+<li>1069569 	Remove samples from base NUnit distribution
+</ul>
 
 <style><!--
 li { padding-bottom: .5em; }
@@ -31,11 +147,51 @@ ul ul li { padding-bottom: 0; }
 dt { font-weight: bold }
 --></style>
 
-<h2>Release Notes</h2>
+<h3>NUnit 2.6.1 Final Release - Version 2.6.1.12217 - August 4, 2012</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>This is a rebuild of RC2 without change.
+<li>NuGet packages are now provided.
+</ul>
+
+<h3>NUnit 2.6.1 Release Candidate 2 - Version 2.6.1.12208 - July 26, 2012</h3>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>942164 NUnit 2.6 GUI does not generate TestResult.xml
+<li>1025218 Using Open Generic Types In TestFixture Attribute Causes Exception When Loading Test DLL
+<li>1027227 QuickStart document needs to be updated
+<li>1027269 Problem with "Exclude these categories"
+</ul>
+
+<h3>NUnit 2.6.1 Release Candidate 1 - Version 2.6.1.12192 - July 10, 2012</h3>
+
+<h4>General</h4>
+
+<ul>
+<li>The build number (fourth component) is no longer part of the package name. For example, packages for this release use NUnit-2.6.1-rc as their base name.
+</ul>
 
-<div style="max-width:660px;text-align:right">
-<a href="releaseNotes.html">View Combined 2.6 Changes</a>
-</div>
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>957899 	Feature: Assert.DoesNotThrow() needs exception details
+<li>959576 	NUnit-console executes in STA mode
+<li>973248 	Nunit 2.6 Gui Showing wrong result state
+<li>984040 	Has.Attribute error
+<li>992792 	Documentation bug in NoItemConstraint
+<li>992799 	SetUpFixture and SetUp doc inconsistency
+<li>993247 	Tests fail with IOException: Too many open files
+<li>994691 	Update nSubstitute to 1.4.2
+<li>997871 	Console test runner does not return non-zero exit code when there are invalid tests
+<li>1000181 	Parameterized TestFixture with System.Type as constructor arguments fails
+<li>1006604 	Explicit test runs if /exclude parameter is used
+<li>1012128 	Not all tests are carried out in Windows 7 x64
+<li>1023058   Remove limitations on location of ConfigurationFile in project editor
+</ul>
 
 <style><!--
 li { padding-bottom: .5em; }
@@ -397,41 +553,42 @@ as greater than zero, and <b>Is.Negative</b>, which is interpreted as less than
 <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>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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 954e81a..0107752 100644
--- a/doc/releaseNotes.html
+++ b/doc/releaseNotes.html
@@ -1,43 +1,77 @@
-<!-- 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>
+<!-- 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">
-
+  </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 Pre-Release</a>
+</div>
+
 <style><!--
 li { padding-bottom: .5em; }
 ul ul li { padding-bottom: 0; }
 dt { font-weight: bold }
 --></style>
 
-<h2>Release Notes</h2>
+<h3>NUnit 2.6.3 - Version 2.6.3.13283 - October 10, 2013</h3>
 
+<h4>Framework</h4>
+<ul>
+<li>When running under .NET 4.5, <b>async</b> methods may now be used as the target of a <b>ThrowsConstraint</b>.
+<li>When running under .NET 4.5, <b>async</b> methods may now be used as an <b>ActualValueDelegate</b> passed to <b>Assert.That()</b> or <b>Assume.That()</b>.
+</ul>
 
-<div style="max-width:660px;text-align:right">
-<a href="releaseBreakdown.html">View Changes Separately for Each 2.6 Pre-Release</a>
-</div>
+<h4>Bug Fixes</h4>
 
+<ul>
+<li>1071164 	Support async methods in usage scenarios of Throws constraints
+<li>1071714 	TestContext is broken when a previous version of the runner is used alongside a new version of the framework
+<li>1071861 	Error in Path Constraints
+<li>1072379 	Report test execution time at a higher resolution
+<li>1074568 	Assert/Assume should support an async method for the ActualValueDelegate
+<li>1079296 	NUnit 2.6.2 Failure on Mono
+<li>1082330 	Better Exception if SetCulture attribute is applied multiple times
+<li>1084181   TestExecutionContext SerializationException
+<li>1086975 	Security Exception After Upgrading to 2.6.2
+<li>1096902 	Trace output is disabled by default in version 2.6.2.12296
+<li>1097854 	Incorrect documentation for console runner /test option
+<li>1107746 	Add nunit tags to nuget packages
+<li>1130239 	classicModel.html is linked in local help, but doesn't exist
+<li>1167638 	Incorrectly detected recursion with types implementing IEnumerable and overriding Equals/operators/value types
+<li>1167805 	cross-domain problems with XmlSchema and call context
+<li>1222148 	/framework switch does not recognize net-4.5
+<li>1235891 	Proposed 2.6.3 release: ArgumentNullException in NUnit.Framework.AsyncInvocationRegion..cctor
+</ul>
 
 <style><!--
 li { padding-bottom: .5em; }
@@ -45,323 +79,429 @@ 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>
+<h3>NUnit 2.6.2 - Version 2.6.2.12296 - October 22, 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.
+<li>Tests may now be loaded and run from a shared directory specified as a UNC path.
+<li>Tests may now be run under .NET 4.5.
+<li>When running under a debugger, any nunit-agent process launched will break and allow the option to continue debugging the agent process as well.
+<li>J# and old-style managed C++ samples have been removed. F# samples are now included. Code samples are no longer included in the standard installs but are available as a separate download. All samples now use VS2010 projects.
 </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.
+<li>The source code now includes solutions for VS2010 and VS2012. The VS2008 solution has been removed.
+<li>The NAnt build now uses NAnt 0.92.
+<li>NSubstitute has been upgraded to version 1.4.3.
 </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.
+<li>When running under .NET 4.5, <b>async</b> test methods are now supported. For test cases returning a value, the method must return <b>Task<T></b>, where <b>T</b> is the type of the returned value. For single tests and test cases not returning a value, the method may return either <b>void</b> or <b>Task</b>.
+<li>The <b>Platform</b> attribute has been upgraded to recognize .NET 4.5, MaxOsX and XBox.
+<li><b>TestCaseSource</b> may now specify a class that implements <b>IEnumerable</b> without specifying the name of a method.
 </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.
+<li>New options <b>/basepath</b> and <b>/privatebinpath</b> allow specifying the ApplicationBase and probing path on the command line.
 </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
+<li>1029785 	Test loaded from remote folder failed to run with exception System.IODirectory Not Found
+<li>1029941 	Missing basepath and privatebinpath arguments in nunit-console
+<li>1033537 	Spurious behaviour using keyboard menu key
+<li>1034242 	Update VS Solution to VS2010
+<li>1036699 	Documentation is missing info about the /test command line option
+<li>1037130 	Update NSubstitute to 1.4.3
+<li>1041365 	Add MaxOsX and Xbox support to platform attribute
+<li>1042385 	Convert all sample projects to VS2010
+<li>1043641 	New text output tab doesn't display anything until NUnit is closed and re-opened
+<li>1047272 	TestContext.CurrentContext.Result throws NullReferenceException
+<li>1048920 	Attach debugger to nunit-agent automatically
+<li>1052298 	Allow TestCaseSource to be an instance of IEnumerable
+<li>1053727 	Project Editor Unhandled Exception when setting ApplicationBase
+<li>1055701 	Upgrade NAnt to 0.92
+<li>1057911 	Trap incorrect input for nunit-console.exe options
+<li>1057912 	Clarify /runlist help message for nunit-console.exe
+<li>1057913 	Unhandled exception for /trace option in nunit-console.exe
+<li>1057981 	C#5 async tests are not supported
+<li>1060482 	Documentation: Minor Typo
+<li>1061956 	Recognize .NET 4.5 when it is running
+<li>1061957 	Packaging problems
+<li>1064014 	Simple async tests should not return Task<T>
+<li>1064100 	Void testcase with expected result should be non-runnable
+<li>1066386 	Improve support for C# async void tests
+<li>1066393 	Unable to display source for testcases with an alternate name set
+<li>1069499 	Exception thrown when trying to load an assembly not built for .NET
+<li>1069569 	Remove samples from base NUnit distribution
 </ul>
 
+<style><!--
+li { padding-bottom: .5em; }
+ul ul li { padding-bottom: 0; }
+dt { font-weight: bold }
+--></style>
+
+<h3>NUnit 2.6.1 Final Release - Version 2.6.1.12217 - August 4, 2012</h3>
 
-<h3>Earlier Releases</h3>
+<h4>General</h4>
 
 <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>
+<li>The build number (fourth component) is no longer part of the package name. For example, packages for this release use NUnit-2.6.1-rc as their base name.
+<li>NuGet packages are now provided.
 </ul>
 
+<h4>Bug Fixes</h4>
 
-</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>
+<li>942164  NUnit 2.6 GUI does not generate TestResult.xml
+<li>957899 	Feature: Assert.DoesNotThrow() needs exception details
+<li>959576 	NUnit-console executes in STA mode
+<li>973248 	Nunit 2.6 Gui Showing wrong result state
+<li>984040 	Has.Attribute error
+<li>992792 	Documentation bug in NoItemConstraint
+<li>992799 	SetUpFixture and SetUp doc inconsistency
+<li>993247 	Tests fail with IOException: Too many open files
+<li>994691 	Update nSubstitute to 1.4.2
+<li>997871 	Console test runner does not return non-zero exit code when there are invalid tests
+<li>1000181 	Parameterized TestFixture with System.Type as constructor arguments fails
+<li>1006604 	Explicit test runs if /exclude parameter is used
+<li>1012128 	Not all tests are carried out in Windows 7 x64
+<li>1023058   Remove limitations on location of ConfigurationFile in project editor
+<li>1025218   Using Open Generic Types In TestFixture Attribute Causes Exception When Loading Test DLL
+<li>1027227   QuickStart document needs to be updated
+<li>1027269   Problem with "Exclude these categories"
 </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>
+<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.3</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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 731b406..c81e425 100644
--- a/doc/repeat.html
+++ b/doc/repeat.html
@@ -1,121 +1,121 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Repeat</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Repeat</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RepeatAttribute (NUnit 2.5)</h3>
-
-<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.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><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 id="current"><a href="repeat.html">Repeat</a></li>
-<li><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RepeatAttribute (NUnit 2.5)</h3>
+
+<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.6.3</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><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 id="current"><a href="repeat.html">Repeat</a></li>
+<li><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/requiredAddin.html b/doc/requiredAddin.html
index 0b4d9a5..d7c2d82 100644
--- a/doc/requiredAddin.html
+++ b/doc/requiredAddin.html
@@ -1,161 +1,161 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - RequiredAddin</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiredAddin</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RequiredAddinAttribute (NUnit 2.5)</h3>
-
-<p>The RequiredAddin attribute is used to indicate that an
-   assembly requires a particular addin in order to function correctly. If
-   that addin is not installed, the entire assembly is marked as non-runnable.
-   
-<p><b>Note:</b> In the Alpha-3 release, this attribute may be applied to
-classes or methods as well. This is of limited utility, for two reasons:
-<ol>
-<li>If the method or class is not recognized as a test, due to the addin
-being missing, then NUnit will never process it.
-<li>If the method or class is handled by some a different addin, that
-addin may not recognize the attribute.
-</ol>
-<p>The attribute will be limited to assemblies only in the next release.
-   
-<h4>Example</h4>
-
-<In the 
-
-<div class="code"><pre>
-[assembly: RequiredAddin("MyTestFixtureAddin")]
-[assembly: RequiredAddin("MyTestAddin")]
-[assembly: RequiredAddin("MyDecoratorAddin")]
-
-...
-
-namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [MyTestFixture]
-  public class MyTests
-  {
-    [MyTest]
-	public void SomeTest()
-	{
-	  ...
-	}
-  }
-  
-  [TestFixture, MyDecorator]
-  public class MoreTests
-  {
-    [Test, MyDecorator]
-	public void AnotherTest()
-	{
-	  ...
-	}
-  }
-}
-</pre>
-</div>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="requiredAddin.html">RequiredAddin</a></li>
-<li><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiredAddinAttribute (NUnit 2.5)</h3>
+
+<p>The RequiredAddin attribute is used to indicate that an
+   assembly requires a particular addin in order to function correctly. If
+   that addin is not installed, the entire assembly is marked as non-runnable.
+   
+<p><b>Note:</b> In the Alpha-3 release, this attribute may be applied to
+classes or methods as well. This is of limited utility, for two reasons:
+<ol>
+<li>If the method or class is not recognized as a test, due to the addin
+being missing, then NUnit will never process it.
+<li>If the method or class is handled by some a different addin, that
+addin may not recognize the attribute.
+</ol>
+<p>The attribute will be limited to assemblies only in the next release.
+   
+<h4>Example</h4>
+
+<In the 
+
+<div class="code"><pre>
+[assembly: RequiredAddin("MyTestFixtureAddin")]
+[assembly: RequiredAddin("MyTestAddin")]
+[assembly: RequiredAddin("MyDecoratorAddin")]
+
+...
+
+namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [MyTestFixture]
+  public class MyTests
+  {
+    [MyTest]
+	public void SomeTest()
+	{
+	  ...
+	}
+  }
+  
+  [TestFixture, MyDecorator]
+  public class MoreTests
+  {
+    [Test, MyDecorator]
+	public void AnotherTest()
+	{
+	  ...
+	}
+  }
+}
+</pre>
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="requiredAddin.html">RequiredAddin</a></li>
+<li><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/requiresMTA.html b/doc/requiresMTA.html
index fa4d7e7..af676f5 100644
--- a/doc/requiresMTA.html
+++ b/doc/requiresMTA.html
@@ -1,160 +1,160 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - RequiresMTA</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiresMTA</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RequiresMTAAttribute (NUnit 2.5)</h3>
-
-<p>The <b>RequiresMTAAttribute</b> is used on a test method, class or assembly
-   to specify that the tests should be run in the multi-threaded apartment.
-   It causes creation of a new thread if the parent test is not already running
-   in the MTA.
-   
-<p><b>Note:</b> On test methods, you may also use the <b>MTAThreadAttribute</b>.
-   Although the runtime only recognizes this attribute on the entrypoint of 
-   an executable assembly, many users have expected it to work on tests, so
-   we treat it as a synonym.
-
-<h4>Examples</h4>
-   
-<div class="code">
-
-<pre>
-
-// An MTA thread will be created and used to run
-// all the tests in the assembly
-[assembly:RequiresMTA]
-
-...
-
-// TestFixture requiring a separate thread
-[TestFixture, RequiresMTA]
-public class FixtureRequiringMTA
-{
-  // An MTA thread will be created and all
-  // tests in the fixture will run on it
-  // unless the containing assembly is
-  // already running on an MTA Thread
-}
-
-[TestFixture]
-public class AnotherFixture
-{
-  [Test, RequiresMTA]
-  public void TestRequiringMTA()
-  {
-    // A separate thread will be created for this test
-	// unless the containing fixture is already running 
-	// in the MTA.
-  }
-}
-
-</pre>
-
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="requiresThread.html">RequiresThreadAttribute</a><li><a href="requiresSTA.html">RequiresSTAAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="requiresMTA.html">Requires MTA</a></li>
-<li><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiresMTAAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RequiresMTAAttribute</b> is used on a test method, class or assembly
+   to specify that the tests should be run in the multi-threaded apartment.
+   It causes creation of a new thread if the parent test is not already running
+   in the MTA.
+   
+<p><b>Note:</b> On test methods, you may also use the <b>MTAThreadAttribute</b>.
+   Although the runtime only recognizes this attribute on the entrypoint of 
+   an executable assembly, many users have expected it to work on tests, so
+   we treat it as a synonym.
+
+<h4>Examples</h4>
+   
+<div class="code">
+
+<pre>
+
+// An MTA thread will be created and used to run
+// all the tests in the assembly
+[assembly:RequiresMTA]
+
+...
+
+// TestFixture requiring a separate thread
+[TestFixture, RequiresMTA]
+public class FixtureRequiringMTA
+{
+  // An MTA thread will be created and all
+  // tests in the fixture will run on it
+  // unless the containing assembly is
+  // already running on an MTA Thread
+}
+
+[TestFixture]
+public class AnotherFixture
+{
+  [Test, RequiresMTA]
+  public void TestRequiringMTA()
+  {
+    // A separate thread will be created for this test
+	// unless the containing fixture is already running 
+	// in the MTA.
+  }
+}
+
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="requiresThread.html">RequiresThreadAttribute</a><li><a href="requiresSTA.html">RequiresSTAAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="requiresMTA.html">Requires MTA</a></li>
+<li><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/requiresSTA.html b/doc/requiresSTA.html
index 36ba9e1..41b72fb 100644
--- a/doc/requiresSTA.html
+++ b/doc/requiresSTA.html
@@ -1,161 +1,161 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - RequiresSTA</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiresSTA</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RequiresSTAAttribute (NUnit 2.5)</h3>
-
-<p>The <b>RequiresSTAAttribute</b> is used on a test method, class or assembly
-   to specify that the tests should be run in the Single-threaded apartment.
-   It causes creation of a new thread if the parent test is not already running
-   in the STA.
-   
-<p><b>Note:</b> On test methods, you may also use the <b>STAThreadAttribute</b>.
-   Although the runtime only recognizes this attribute on the entrypoint of 
-   an executable assembly, many users have expected it to work on tests, so
-   we treat it as a synonym.
-
-<h4>Examples</h4>
-   
-<div class="code">
-
-<pre>
-
-// An STA thread will be created and used to run
-// all the tests in the assembly
-[assembly:RequiresSTA]
-
-...
-
-// TestFixture requiring a separate thread
-[TestFixture, RequiresSTA]
-public class FixtureRequiringSTA
-{
-  // An STA thread will be created and all
-  // tests in the fixture will run on it
-  // unless the containing assembly is
-  // already running on an STA Thread
-}
-
-[TestFixture]
-public class AnotherFixture
-{
-  [Test, RequiresSTA]
-  public void TestRequiringSTA()
-  {
-    // A separate thread will be created for this test
-	// unless the containing fixture is already running 
-	// in the STA.
-  }
-}
-
-</pre>
-
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="requiresThread.html">RequiresThreadAttribute</a><li><a href="requiresMTA.html">RequiresMTAAttribute</a></ul>
-   
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="requiresSTA.html">Requires STA</a></li>
-<li><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiresSTAAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RequiresSTAAttribute</b> is used on a test method, class or assembly
+   to specify that the tests should be run in the Single-threaded apartment.
+   It causes creation of a new thread if the parent test is not already running
+   in the STA.
+   
+<p><b>Note:</b> On test methods, you may also use the <b>STAThreadAttribute</b>.
+   Although the runtime only recognizes this attribute on the entrypoint of 
+   an executable assembly, many users have expected it to work on tests, so
+   we treat it as a synonym.
+
+<h4>Examples</h4>
+   
+<div class="code">
+
+<pre>
+
+// An STA thread will be created and used to run
+// all the tests in the assembly
+[assembly:RequiresSTA]
+
+...
+
+// TestFixture requiring a separate thread
+[TestFixture, RequiresSTA]
+public class FixtureRequiringSTA
+{
+  // An STA thread will be created and all
+  // tests in the fixture will run on it
+  // unless the containing assembly is
+  // already running on an STA Thread
+}
+
+[TestFixture]
+public class AnotherFixture
+{
+  [Test, RequiresSTA]
+  public void TestRequiringSTA()
+  {
+    // A separate thread will be created for this test
+	// unless the containing fixture is already running 
+	// in the STA.
+  }
+}
+
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="requiresThread.html">RequiresThreadAttribute</a><li><a href="requiresMTA.html">RequiresMTAAttribute</a></ul>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="requiresSTA.html">Requires STA</a></li>
+<li><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/requiresThread.html b/doc/requiresThread.html
index 4704049..13a71ab 100644
--- a/doc/requiresThread.html
+++ b/doc/requiresThread.html
@@ -1,161 +1,161 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - RequiresThread</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RequiresThread</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>RequiresThreadAttribute (NUnit 2.5)</h3>
-
-<p>The <b>RequiresThreadAttribute</b> is used to indicate that a test method, 
-   class or assembly should be run on a separate thread. Optionally, the 
-   desired apartment for the thread may be specified in the constructor.
-   
-<p><b>Note:</b> This attribute, used with or without an ApartmentState
-   argument will <b>always</b> result in creation of a new thread. To
-   create a thread only if the current ApartmentState is not appropriate,
-   use <b>RequiresSTAAttribute</b> or <b>RequiresMTAAttribute</b>.
-   
-<h4>Examples</h4>
-   
-<div class="code">
-
-<pre>
-
-// A thread will be created and used to run
-// all the tests in the assembly
-[assembly:RequiresThread]
-
-...
-
-// TestFixture requiring a separate thread
-[TestFixture, RequiresThread]
-public class FixtureOnThread
-{
-  // A separate thread will be created and all
-  // tests in the fixture will run on it.
-}
-
-[TestFixture]
-public class AnotherFixture
-{
-  [Test, RequiresThread]
-  public void TestRequiringThread()
-  {
-    // A separate thread will be created for this test
-  }
-  
-  [Test, RequiresThread(ApartmentState.STA)]
-  public void TestRequiringSTAThread()
-  {
-    // A separate STA thread will be created for tnis test.
-  }
-}
-
-</pre>
-
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="requiresSTA.html">RequiresSTAAttribute</a><li><a href="requiresMTA.html">RequiresMTAAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="requiresThread.html">Requires Thread</a></li>
-<li><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>RequiresThreadAttribute (NUnit 2.5)</h3>
+
+<p>The <b>RequiresThreadAttribute</b> is used to indicate that a test method, 
+   class or assembly should be run on a separate thread. Optionally, the 
+   desired apartment for the thread may be specified in the constructor.
+   
+<p><b>Note:</b> This attribute, used with or without an ApartmentState
+   argument will <b>always</b> result in creation of a new thread. To
+   create a thread only if the current ApartmentState is not appropriate,
+   use <b>RequiresSTAAttribute</b> or <b>RequiresMTAAttribute</b>.
+   
+<h4>Examples</h4>
+   
+<div class="code">
+
+<pre>
+
+// A thread will be created and used to run
+// all the tests in the assembly
+[assembly:RequiresThread]
+
+...
+
+// TestFixture requiring a separate thread
+[TestFixture, RequiresThread]
+public class FixtureOnThread
+{
+  // A separate thread will be created and all
+  // tests in the fixture will run on it.
+}
+
+[TestFixture]
+public class AnotherFixture
+{
+  [Test, RequiresThread]
+  public void TestRequiringThread()
+  {
+    // A separate thread will be created for this test
+  }
+  
+  [Test, RequiresThread(ApartmentState.STA)]
+  public void TestRequiringSTAThread()
+  {
+    // A separate STA thread will be created for tnis test.
+  }
+}
+
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="requiresSTA.html">RequiresSTAAttribute</a><li><a href="requiresMTA.html">RequiresMTAAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="requiresThread.html">Requires Thread</a></li>
+<li><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/reusableConstraint.html b/doc/reusableConstraint.html
index 62a3610..ce69241 100644
--- a/doc/reusableConstraint.html
+++ b/doc/reusableConstraint.html
@@ -1,172 +1,176 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ReusableConstraint</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ReusableConstraint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>ReusableConstraint (NUnit 2.5.6)</h2>
-
-<p>Normally constraints just work. However, attempting to reuse the 
-same constraint in several places can lead to unexpected results.
-
-<p>Consider the following code as an example:
-
-<code><pre>
-    Constraint myConstraint = Is.Not.Null;
-    Assert.That("not a null", myConstraint); // Passes, of course
-    Assert.That("not a null", myConstraint); // Fails! What's that about?
-</pre></code>
-
-<p>We'll save the technical explanation for later and show the
-solution first:
-
-<code><pre>
-    ReusableConstraint myConstraint = Is.Not.Null;
-    Assert.That("not a null", myConstraint); // Passes
-    Assert.That("not a null", myConstraint); // Passes
-</pre></code>
-
-Or alternatively..
-
-<code><pre>
-    var myConstraint = new ReusableConstraint(Is.Not.Null);
-    Assert.That("not a null", myConstraint); // Passes
-    Assert.That("not a null", myConstraint); // Passes
-</pre></code>
-
-<h3>Technical Explanation</h3>
-
-<p>In the original example, the value assigned to myConstraint is
-known as an <b>unresolved</b> constraint. In fact, it's an
-unresolved NullConstraint, because that was the last constraint 
-encountered in the expression. It's associated with a <b>Not</b>
-operator that has not yet been applied.
-
-<p>That's OK for use with Assert.That(), because the method
-knows how to resolve a constraint before using it. Assert.That()
-resolves this constraint to a NotConstraint referencing the
-original NullConstraint.
-
-<p>Of course, the original reference in myConstraint is left
-unchanged in all of this. But the EqualConstraint it points
-to has now been resolved. It is now a <b>resolved</b> constraint
-and can't be resolved again by the second Assert.That(), which
-only sees the NullConstraint and not the NotConstraint.
-
-<p>So, for reusability, what we want to save is the result
-of resolving the constraint, in this case
-
-<pre>    NotConstraint => NullConstraint</pre>
-
-That's what <b>ReusableConstraint</b> does for us. It resolves
-the full expression and saves the result. Then it passes all
-operations on to that saved result.
-
-<h3>When to Use It</h3>
-
-<p>Use this constraint any time you want to reuse a constraint
-expression and you'll be safe.
-
-<p>If you like to take chances, you'll find that you can
-avoid using it in the following cases...
-
-<ol>
-<li> With a simple constraint involving no operators, like...
-
-<pre>
-    Constraint myConstraint = Is.Null;
-    Constraint myConstraint = Is.EqualTo(42);
-</pre>
-
-<li> With any constraint you construct using new, without
-using the "dotted" constraint syntax...
-
-<pre>
-    Constraint myConstraint = new NotConstraint(new NullConstraint());
-    Constraint myConstraint = new AndConstraint(
-        new GreaterThanConstraint(0), 
-        new LessThanConstraint(100));
-</pre>
-
-<p>However, there is no significant penalty to using <b>ReusableConstraint</b>.
-It makes your intent much clearer and the exceptions listed are accidents of
-the internal implementation and could disappear in future releases.
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li id="current"><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>ReusableConstraint (NUnit 2.5.6)</h2>
+
+<p>Normally constraints just work. However, attempting to reuse the 
+same constraint in several places can lead to unexpected results.
+
+<p>Consider the following code as an example:
+
+<code><pre>
+    Constraint myConstraint = Is.Not.Null;
+    Assert.That("not a null", myConstraint); // Passes, of course
+    Assert.That("not a null", myConstraint); // Fails! What's that about?
+</pre></code>
+
+<p>We'll save the technical explanation for later and show the
+solution first:
+
+<code><pre>
+    ReusableConstraint myConstraint = Is.Not.Null;
+    Assert.That("not a null", myConstraint); // Passes
+    Assert.That("not a null", myConstraint); // Passes
+</pre></code>
+
+Or alternatively..
+
+<code><pre>
+    var myConstraint = new ReusableConstraint(Is.Not.Null);
+    Assert.That("not a null", myConstraint); // Passes
+    Assert.That("not a null", myConstraint); // Passes
+</pre></code>
+
+<h3>Technical Explanation</h3>
+
+<p>In the original example, the value assigned to myConstraint is
+known as an <b>unresolved</b> constraint. In fact, it's an
+unresolved NullConstraint, because that was the last constraint 
+encountered in the expression. It's associated with a <b>Not</b>
+operator that has not yet been applied.
+
+<p>That's OK for use with Assert.That(), because the method
+knows how to resolve a constraint before using it. Assert.That()
+resolves this constraint to a NotConstraint referencing the
+original NullConstraint.
+
+<p>Of course, the original reference in myConstraint is left
+unchanged in all of this. But the EqualConstraint it points
+to has now been resolved. It is now a <b>resolved</b> constraint
+and can't be resolved again by the second Assert.That(), which
+only sees the NullConstraint and not the NotConstraint.
+
+<p>So, for reusability, what we want to save is the result
+of resolving the constraint, in this case
+
+<pre>    NotConstraint => NullConstraint</pre>
+
+That's what <b>ReusableConstraint</b> does for us. It resolves
+the full expression and saves the result. Then it passes all
+operations on to that saved result.
+
+<h3>When to Use It</h3>
+
+<p>Use this constraint any time you want to reuse a constraint
+expression and you'll be safe.
+
+<p>If you like to take chances, you'll find that you can
+avoid using it in the following cases...
+
+<ol>
+<li> With a simple constraint involving no operators, like...
+
+<pre>
+    Constraint myConstraint = Is.Null;
+    Constraint myConstraint = Is.EqualTo(42);
+</pre>
+
+<li> With any constraint you construct using new, without
+using the "dotted" constraint syntax...
+
+<pre>
+    Constraint myConstraint = new NotConstraint(new NullConstraint());
+    Constraint myConstraint = new AndConstraint(
+        new GreaterThanConstraint(0), 
+        new LessThanConstraint(100));
+</pre>
+
+<p>However, there is no significant penalty to using <b>ReusableConstraint</b>.
+It makes your intent much clearer and the exceptions listed are accidents of
+the internal implementation and could disappear in future releases.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li id="current"><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/runningTests.html b/doc/runningTests.html
index 49e8004..b4b1484 100644
--- a/doc/runningTests.html
+++ b/doc/runningTests.html
@@ -1,114 +1,115 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - RunningTests</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RunningTests</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Running Tests</h2>
-
-<p>Nunit provides three different runners, which may be used to load and
-run your tests.
-
-<ul>
-<li>The <a href="nunit-console.html">console runner</a>, 
-    nunit-console.exe, is used for batch execution.
-<li>The <a href="nunit-gui.html">gui runner</a>, nunit.exe,
-    provides interactive loading and running of tests.
-<li>The <a href="pnunit.html">pNUnit runner</a>, 
-    pnunit-launcher.exe, is used to run parallel, distributed tests under the
-	control of pNUnit.
-</ul>
-
-<h3>NUnit Agent</h3>
-
-<p>When running tests in a separate process, the console and gui runners
-   make use of the <a href="nunit-agent.html">nunit-agent</a>   program, nunit-agent.exe. Although not directly run by users, nunit-agent
-   does load and execute tests and users need to be aware of it, especially
-   when debugging is involved.
-
-<h3>Third-Party Runners</h3>
-
-<p>Various third-party applications are available for loading and running
-   NUnit tests. Some of these actually use NUnit to load the tests, while
-   others provide their own emulation and may not work in the same way 
-   that NUnit does.
-   
-<p>Because the status of such projects may change from time to time, we don't
-   discuss them individually here. For the latest information, consult the 
-   manufacturer of any third-party software or ask other users on our
-   <a href="http://groups.google.com/group/nunit-discuss">discussion list</a>.
-   
-<h3>Additional Information</h3>
-
-<p>For additional general information on how tests are loaded and run, see
-
-<ul>
-<li><a href="runtimeSelection.html">Runtime Selection</a><li><a href="assemblyIsolation.html">Assembly Isolation</a><li><a href="configFiles.html">Configuration Files</a><li><a href="multiAssembly.html">Multiple Assemblies</a><li><a href="vsSupport.html">Visual Studio Support</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.6</a></li>
-<ul>
-<li><a href="getStarted.html">Getting Started</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Running Tests</h2>
+
+<p>Nunit provides three different runners, which may be used to load and
+run your tests.
+
+<ul>
+<li>The <a href="nunit-console.html">console runner</a>, 
+    nunit-console.exe, is used for batch execution.
+<li>The <a href="nunit-gui.html">gui runner</a>, nunit.exe,
+    provides interactive loading and running of tests.
+<li>The <a href="pnunit.html">pNUnit runner</a>, 
+    pnunit-launcher.exe, is used to run parallel, distributed tests under the
+	control of pNUnit.
+</ul>
+
+<h3>NUnit Agent</h3>
+
+<p>When running tests in a separate process, the console and gui runners
+   make use of the <a href="nunit-agent.html">nunit-agent</a>   program, nunit-agent.exe. Although not directly run by users, nunit-agent
+   does load and execute tests and users need to be aware of it, especially
+   when debugging is involved.
+
+<h3>Third-Party Runners</h3>
+
+<p>Various third-party applications are available for loading and running
+   NUnit tests. Some of these actually use NUnit to load the tests, while
+   others provide their own emulation and may not work in the same way 
+   that NUnit does.
+   
+<p>Because the status of such projects may change from time to time, we don't
+   discuss them individually here. For the latest information, consult the 
+   manufacturer of any third-party software or ask other users on our
+   <a href="http://groups.google.com/group/nunit-discuss">discussion list</a>.
+   
+<h3>Additional Information</h3>
+
+<p>For additional general information on how tests are loaded and run, see
+
+<ul>
+<li><a href="runtimeSelection.html">Runtime Selection</a><li><a href="assemblyIsolation.html">Assembly Isolation</a><li><a href="configFiles.html">Configuration Files</a><li><a href="multiAssembly.html">Multiple Assemblies</a><li><a href="vsSupport.html">Visual Studio Support</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/runtimeSelection.html b/doc/runtimeSelection.html
index fb09414..2149c79 100644
--- a/doc/runtimeSelection.html
+++ b/doc/runtimeSelection.html
@@ -1,128 +1,129 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - RuntimeSelection</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - RuntimeSelection</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>Runtime Selection</h3>
-
-<p>Before loading an assembly, NUnit must determine what runtime to use. By default
-(see below for exceptions) the following rules are used:
-
-<ol>
-<li><p>If the assembly was built for the same runtime under which NUnit is currently 
-running, then that runtime is used.
-
-<li><p>If the assembly was built for a different runtime version and that version 
-is available, NUnit uses it, running out of process if necessary. 
-
-<li><p>If the assembly was built for a different runtime version, which is not
-available, then the result depends on whether the build version is earlier or
-later than the current version. If earlier, the test will be run using the
-same runtime version under which NUnit is running. If later, then it is not
-possible to load the test and NUnit gives an error message.
-
-<li><p>If multiple assemblies are being run at the same time, NUnit first
-determines the runtime under which each assembly was built. The highest version 
-is then selected for the entire group, and rules 1 through 3 are applied.
-</ol>
-
-<p><b>Note:</b> For versions 2.5.4 and 2.5.5, automatic runtime selection only
-works in the Gui runner. Use the /framework option to select the appropriate
-runtime under the Console runner.
-
-<h3>Overriding the Defaults</h3>
-
-<p>The default runtime framework may be overridden using command line arguments, 
-   menu items in the Gui or settings in an NUnit project file. Provided that the 
-   requested framework is available, it will be used. If it isn't available, 
-   NUnit will issue an error message.
-   
-<p><b>Note:</b> To use version 1.x runtimes, you must have NUnit's support 
-   for those runtimes installed, in addition to the runtime itself. This
-   support is an option of the NUnit installation.
-
-<h4>Command Line Options</h4>
-
-<p>The <b>/framework</b> option of console runner allows you to specify
-   the framework type and version to be used for a test run. See
-   <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a>   for more information.
-   
-<h4>Gui Menu Selection</h4>
-
-<p>The main menu provides <b>File | Select Runtime</b> sub-items allowing you
-   to reload the tests under a specific runtime. See 
-   <a href="mainMenu.html">Main Menu</a> for more info.
-   
-<h4>Project Settings</h4>
-
-<p>The NUnit project format supports specification of a specific runtime to
-   be used with a project at the configuration level. See
-   <a href="projectEditor.html">Project Editor</a>   for more information.
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>Runtime Selection</h3>
+
+<p>Before loading an assembly, NUnit must determine what runtime to use. By default
+(see below for exceptions) the following rules are used:
+
+<ol>
+<li><p>If the assembly was built for the same runtime under which NUnit is currently 
+running, then that runtime is used.
+
+<li><p>If the assembly was built for a different runtime version and that version 
+is available, NUnit uses it, running out of process if necessary. 
+
+<li><p>If the assembly was built for a different runtime version, which is not
+available, then the result depends on whether the build version is earlier or
+later than the current version. If earlier, the test will be run using the
+same runtime version under which NUnit is running. If later, then it is not
+possible to load the test and NUnit gives an error message.
+
+<li><p>If multiple assemblies are being run at the same time, NUnit first
+determines the runtime under which each assembly was built. The highest version 
+is then selected for the entire group, and rules 1 through 3 are applied.
+</ol>
+
+<p><b>Note:</b> For versions 2.5.4 and 2.5.5, automatic runtime selection only
+works in the Gui runner. Use the /framework option to select the appropriate
+runtime under the Console runner.
+
+<h3>Overriding the Defaults</h3>
+
+<p>The default runtime framework may be overridden using command line arguments, 
+   menu items in the Gui or settings in an NUnit project file. Provided that the 
+   requested framework is available, it will be used. If it isn't available, 
+   NUnit will issue an error message.
+   
+<p><b>Note:</b> To use version 1.x runtimes, you must have NUnit's support 
+   for those runtimes installed, in addition to the runtime itself. This
+   support is an option of the NUnit installation.
+
+<h4>Command Line Options</h4>
+
+<p>The <b>/framework</b> option of console runner allows you to specify
+   the framework type and version to be used for a test run. See
+   <a href="consoleCommandLine.html">NUnit-Console Command Line Options</a>   for more information.
+   
+<h4>Gui Menu Selection</h4>
+
+<p>The main menu provides <b>File | Select Runtime</b> sub-items allowing you
+   to reload the tests under a specific runtime. See 
+   <a href="mainMenu.html">Main Menu</a> for more info.
+   
+<h4>Project Settings</h4>
+
+<p>The NUnit project format supports specification of a specific runtime to
+   be used with a project at the configuration level. See
+   <a href="projectEditor.html">Project Editor</a>   for more information.
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/sameasConstraint.html b/doc/sameasConstraint.html
index 4d5e0b9..0c3557c 100644
--- a/doc/sameasConstraint.html
+++ b/doc/sameasConstraint.html
@@ -1,111 +1,115 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Same As Constraint (NUnit 2.4)</h2>
-
-<p>A SameAsConstraint is used to test whether the object passed
-   as an actual value has the same identity as the object supplied
-   in its constructor.
-
-<h4>Constructor</h4>
-
-<div class="code"><pre>
-SameAsConstraint( object expected )
-</pre></div>
-
-<h4>Syntax</h4>
-
-<div class="code"><pre>
-Is.SameAs( object expected )
-</pre></div>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Exception ex1 = new Exception();
-Exception ex2 = ex1;
-Assert.That( ex2, Is.SameAs( ex1 ) );
-
-Exception ex3 = new Exception();
-Assert.That( ex3, Is.Not.SameAs( ex1 ) );
-</pre></div>
-</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>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li id="current"><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Same As Constraint (NUnit 2.4)</h2>
+
+<p>A SameAsConstraint is used to test whether the object passed
+   as an actual value has the same identity as the object supplied
+   in its constructor.
+
+<h4>Constructor</h4>
+
+<div class="code"><pre>
+SameAsConstraint( object expected )
+</pre></div>
+
+<h4>Syntax</h4>
+
+<div class="code"><pre>
+Is.SameAs( object expected )
+</pre></div>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Exception ex1 = new Exception();
+Exception ex2 = ex1;
+Assert.That( ex2, Is.SameAs( ex1 ) );
+
+Exception ex3 = new Exception();
+Assert.That( ex3, Is.Not.SameAs( ex1 ) );
+</pre></div>
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li id="current"><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/samples.html b/doc/samples.html
index fd7b9d4..1820c93 100644
--- a/doc/samples.html
+++ b/doc/samples.html
@@ -1,129 +1,138 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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><!--
-dt { font-weight: bold; }
---></style>
-<h2>Samples</h2>
-
-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 as of NUnit 2.5.
-
-<h3>C# Samples</h3>
-<dl>
-	<dt>Failures
-	<dd>This sample written in C# demonstrates 4 failing unit tests and one test 
-		that is not run.
-	<dt>Money
-	<dd>This is a C# version of the money example which is found in most xUnit 
-		implementations. Thanks to Kent Beck.
-</dl>
-
-<h3>J# Samples</h3>
-<dl>
-	<dt>Failures
-	<dd>This has three failing tests and one ignored test written in J#.
-</dl>
-
-<h3>VB.NET Samples</h3>
-<dl>
-	<dt>Failures
-	<dd>This sample written in VB.NET demonstrates 4 failing unit tests and 
-		one test that is not run.
-	<dt>Money
-	<dd>This is a VB.NET version of the money example which is found in most xUnit 
-		implementations. Thanks to Kent Beck.
-</dl>
-
-<h3>Managed C++ Samples</h3>
-<dl>
-	<dt>Failures
-	<dd>This is the same example as the others with four failing unit 
-		tests and one ignored test. NOTE:  The results are as expected when 
-		compiled in Debug mode. In Release mode the divide by zero test succeeds.
-</dl>
-
-<h3>C++/CLI Samples</h3>
-<dl>
-	<dt>Failures
-	<dd>This is the same example as the others with four failing unit 
-		tests and one ignored test.
-</dl>
-
-<h3>Extensibility Examples</h3>
-<dl>
-	<dt>Minimal
-	<dd>The smallest possible Addin: it does nothing but is
-		recognized by NUnit and listed in the Addins dialog.
-	<dt>SampleSuiteExtension
-	<dd>A "toy" SuiteBuilder. It recognizes a special attribute
-	and identifies tests right in the suite extension. This example
-	uses separate objects for the addin and the suite builder.
-	<dt>SampleFixtureExtension
-	<dd>A slightly more involved SuiteBuilder. It recognizes
-	a special attribute and registers a test case builder to
-	identify its tests. It inherits from NUnitTestFixture and
-	so gets all the features of that class as well for free.
-	This example uses the same object to implement both the
-	addin and the suite builder.
-</dl>
-
-</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 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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<style><!--
+dt { font-weight: bold; }
+--></style>
+<h2>Samples</h2>
+
+The samples installed with NUnit continue to be organized by language, with an additional 
+folder for Extensibility examples
+
+<h3>C# Samples</h3>
+<dl>
+	<dt>Failures
+	<dd>This sample written in C# demonstrates 4 failing unit tests and one test 
+		that is not run.
+	<dt>Money
+	<dd>This is a C# version of the money example which is found in most xUnit 
+		implementations. Thanks to Kent Beck.
+	<dt>Syntax
+	<dd>Illustrates use of most Assert methods using both the classic and 
+	  constraint-based syntax in C#.
+</dl>
+
+<h3>F# Samples</h3>
+<dl>
+	<dt>Failures
+	<dd>This sample written in F# demonstrates 4 failing unit tests and one test 
+		that is not run.
+	<dt>Money
+	<dd>This is a F# version of the money example which is found in most xUnit 
+		implementations. Thanks to Kent Beck.
+	<dt>Syntax
+	<dd>Illustrates use of most Assert methods using both the classic and 
+	  constraint-based syntax in F#.
+
+</dl>
+
+<h3>VB.NET Samples</h3>
+<dl>
+	<dt>Failures
+	<dd>This sample written in VB.NET demonstrates 4 failing unit tests and 
+		one test that is not run.
+	<dt>Money
+	<dd>This is a VB.NET version of the money example which is found in most xUnit 
+		implementations. Thanks to Kent Beck.
+	<dt>Syntax
+	<dd>Illustrates use of most Assert methods using both the classic and 
+	  constraint-based syntax in VB.NET.
+</dl>
+
+<h3>C++ Samples</h3>
+<dl>
+	<dt>Failures
+	<dd>This is the same example as the others with four failing unit 
+		tests and one ignored test.
+	<dt>Syntax
+	<dd>Illustrates use of most Assert methods using both the classic and 
+	  constraint-based syntax in C++.
+</dl>
+
+<h3>Extensibility Examples</h3>
+<dl>
+	<dt>Minimal
+	<dd>The smallest possible Addin: it does nothing but is
+		recognized by NUnit and listed in the Addins dialog.
+	<dt>SampleSuiteExtension
+	<dd>A "toy" SuiteBuilder. It recognizes a special attribute
+	and identifies tests right in the suite extension. This example
+	uses separate objects for the addin and the suite builder.
+	<dt>SampleFixtureExtension
+	<dd>A slightly more involved SuiteBuilder. It recognizes
+	a special attribute and registers a test case builder to
+	identify its tests. It inherits from NUnitTestFixture and
+	so gets all the features of that class as well for free.
+	This example uses the same object to implement both the
+	addin and the suite builder.
+</dl>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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 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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/sequential.html b/doc/sequential.html
index b18b5cd..f822813 100644
--- a/doc/sequential.html
+++ b/doc/sequential.html
@@ -1,140 +1,140 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Sequential</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Sequential</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>SequentialAttribute (NUnit 2.5)</h3>
-
-<p>The <b>SequentialAttribute</b> is used on a test to specify that NUnit should
-   generate test cases by selecting individual data items provided
-   for the parameters of the test, without generating additional
-   combinations.
-   
-<p><b>Note:</b> If parameter data is provided by multiple attributes,
-the order in which NUnit uses the data items is not guaranteed. However,
-it can be expected to remain constant for a given runtime and operating
-system.
-   
-<h4>Example</h4>
-
-<p>The following test will be executed three times, as follows:
-<pre>
-	MyTest(1, "A")
-	MyTest(2, "B")
-	MyTest(3, null)
-</pre>
-<div class="code"><pre>
-[Test, Sequential]
-public void MyTest(
-    [Values(1,2,3)] int x,
-    [Values("A","B")] string s)
-{
-    ...
-}
-</pre></div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="sequential.html">Sequential</a></li>
-<li><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>SequentialAttribute (NUnit 2.5)</h3>
+
+<p>The <b>SequentialAttribute</b> is used on a test to specify that NUnit should
+   generate test cases by selecting individual data items provided
+   for the parameters of the test, without generating additional
+   combinations.
+   
+<p><b>Note:</b> If parameter data is provided by multiple attributes,
+the order in which NUnit uses the data items is not guaranteed. However,
+it can be expected to remain constant for a given runtime and operating
+system.
+   
+<h4>Example</h4>
+
+<p>The following test will be executed three times, as follows:
+<pre>
+	MyTest(1, "A")
+	MyTest(2, "B")
+	MyTest(3, null)
+</pre>
+<div class="code"><pre>
+[Test, Sequential]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Values("A","B")] string s)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="sequential.html">Sequential</a></li>
+<li><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/setCulture.html b/doc/setCulture.html
index 26b637d..8e9ce7b 100644
--- a/doc/setCulture.html
+++ b/doc/setCulture.html
@@ -1,204 +1,204 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<style><!--
-div.code { width: 34em }
---></style>
-
-<h3>SetCultureAttribute (NUnit 2.4.2)</h3> 
-<p>The SetCulture attribute is used to set the current Culture for the duration
-of a test. It may be specified at the level of a test or a fixture. The culture
-remains set until the test or fixture completes and is then reset to its original
-value. If you wish to use the current culture setting to decide whether to run
-a test, use the Culture attribute instead of this one.</p>
-	
-<p>Only one culture may be specified. Running a test under
-multiple cultures is a planned future enhancement. At this time, you can 
-achieve the same result by factoring out your test code into a private method 
-that is called by each individual test method.</p>
-
-<h4>Examples:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  [SetCulture("fr-FR")]
-  public class FrenchCultureTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), SetCulture("fr-FR")>
-  Public Class FrenchCultureTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [SetCulture("fr-FR")]
-  public __gc class FrenchCultureTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.SetCulture("fr-FR") */
-public class FrenchCultureTests
-{
-  // ...
-}
-</pre>
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="culture.html">CultureAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="setCulture.html">SetCulture</a></li>
-<li><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<style><!--
+div.code { width: 34em }
+--></style>
+
+<h3>SetCultureAttribute (NUnit 2.4.2)</h3> 
+<p>The SetCulture attribute is used to set the current Culture for the duration
+of a test. It may be specified at the level of a test or a fixture. The culture
+remains set until the test or fixture completes and is then reset to its original
+value. If you wish to use the current culture setting to decide whether to run
+a test, use the Culture attribute instead of this one.</p>
+	
+<p>Only one culture may be specified. Running a test under
+multiple cultures is a planned future enhancement. At this time, you can 
+achieve the same result by factoring out your test code into a private method 
+that is called by each individual test method.</p>
+
+<h4>Examples:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [SetCulture("fr-FR")]
+  public class FrenchCultureTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), SetCulture("fr-FR")>
+  Public Class FrenchCultureTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [SetCulture("fr-FR")]
+  public __gc class FrenchCultureTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.SetCulture("fr-FR") */
+public class FrenchCultureTests
+{
+  // ...
+}
+</pre>
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="culture.html">CultureAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="setCulture.html">SetCulture</a></li>
+<li><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/setUICulture.html b/doc/setUICulture.html
index 564c7a1..55e19f3 100644
--- a/doc/setUICulture.html
+++ b/doc/setUICulture.html
@@ -1,204 +1,204 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - SetUICulture</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - SetUICulture</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<style><!--
-div.code { width: 34em }
---></style>
-
-<h3>SetUICultureAttribute (NUnit 2.5.2)</h3> 
-<p>The SetUICulture attribute is used to set the current UI Culture for the duration
-of a test. It may be specified at the level of a test or a fixture. The UI culture
-remains set until the test or fixture completes and is then reset to its original
-value. If you wish to use the current culture setting to decide whether to run
-a test, use the Culture attribute instead of this one.</p>
-	
-<p>Only one culture may be specified. Running a test under
-multiple cultures is a planned future enhancement. At this time, you can 
-achieve the same result by factoring out your test code into a private method 
-that is called by each individual test method.</p>
-
-<h4>Examples:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  [SetUICulture("fr-FR")]
-  public class FrenchCultureTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture(), SetUICulture("fr-FR")>
-  Public Class FrenchCultureTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  [SetUICulture("fr-FR")]
-  public __gc class FrenchCultureTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-/** @attribute NUnit.Framework.SetUICulture("fr-FR") */
-public class FrenchCultureTests
-{
-  // ...
-}
-</pre>
-</div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="culture.html">CultureAttribute</a><li><a href="setCulture.html">SetCultureAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="setUICulture.html">SetUICulture</a></li>
-<li><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<style><!--
+div.code { width: 34em }
+--></style>
+
+<h3>SetUICultureAttribute (NUnit 2.5.2)</h3> 
+<p>The SetUICulture attribute is used to set the current UI Culture for the duration
+of a test. It may be specified at the level of a test or a fixture. The UI culture
+remains set until the test or fixture completes and is then reset to its original
+value. If you wish to use the current culture setting to decide whether to run
+a test, use the Culture attribute instead of this one.</p>
+	
+<p>Only one culture may be specified. Running a test under
+multiple cultures is a planned future enhancement. At this time, you can 
+achieve the same result by factoring out your test code into a private method 
+that is called by each individual test method.</p>
+
+<h4>Examples:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  [SetUICulture("fr-FR")]
+  public class FrenchCultureTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture(), SetUICulture("fr-FR")>
+  Public Class FrenchCultureTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  [SetUICulture("fr-FR")]
+  public __gc class FrenchCultureTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+/** @attribute NUnit.Framework.SetUICulture("fr-FR") */
+public class FrenchCultureTests
+{
+  // ...
+}
+</pre>
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="culture.html">CultureAttribute</a><li><a href="setCulture.html">SetCultureAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="setUICulture.html">SetUICulture</a></li>
+<li><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/settingsDialog.html b/doc/settingsDialog.html
index ca92c21..d87ac5d 100644
--- a/doc/settingsDialog.html
+++ b/doc/settingsDialog.html
@@ -1,394 +1,395 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - SettingsDialog</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - SettingsDialog</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Settings Dialog</h2>
-
-<p>The Settings Dialog is displayed using the Tools | Settings menu item and allows the user to
-control some aspects of NUnit�s operation. Beginning with NUnit 2.4.4, a tree-based dialog
-replaced the older tabbed format.</p>
-
-<!-- Gui Settings - General -->
-
-<hr><h3>Gui Settings - General</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/generalSettings.jpg"></div>
-
-<h3>Gui Display</h3>
-
-<h4>Full Gui</h4>
-<p>Displays the complete gui - as in prior versions of NUnit. This includes the
-   test result tabs and the progress bar.</p>
-   
-<h4>Mini Gui</h4>
-<p>Switches the display to the mini-gui, which consists of the tree display 
-   only.</p>
-<h3>Recent Files</h3>
-
-<p>The <b>Display ... files in list</b> TextBox allows the user to choose the number 
-of entries to display in the recent files list.
-
-<p>Normally, NUnit checks that project files still exist before
-displaying them in the recent files list. This can cause long delays if the
-file is on a network connection that is no longer available. Unchecking 
-<b>Check that files exist before listing</b> will avoid this delay, so 
-long as the missing file is not actually selected.
-
-<p>If <b>Load most recent project at startup</b> is checked, the GUI will load the 
-last file opened unless it is run with a specific filename or with the 
-<code>/noload</code> parameter.</p>
-
-<!-- Gui Settings - Tree Display -->
-
-<hr style="clear: both"><h3>Gui Settings - Tree Display</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/treeDisplaySettings.jpg"></div>
-
-<h3>Tree View</h3>
-
-<p>The <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>
-<p><b>Collapse</b> � collapses all tests</p>
-<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>
-
-<p>If <b>Save visual state of each project</b> is checked, NUnit saves the state of the tree
-and restores it when the project is next opened. The information saved includes which
-branches of the tree are expanded, the selected node, any checked nodes and any
-category selection.
-
-<p>If <b>Show Checkboxes</b> is checked, the tree includes checkboxes, which may
-   be used to select multiple tests for running. This setting is also available
-   in the <b>View | Tree</b> menu.</p>
-
-<h3>Test Structure</h3>
-
-<p>If <b>Automatic Namespace suites</b> is selected, tests will be
-   shown in a hierarchical listing based on namespaces. This is the
-   standard display as used in versions prior to NUnit 2.4.
-
-<p>If <b>Flat list of TestFixtures</b> is selected, tests will be
-   shown as a sequential list of fixtures.
-
-<!-- Gui Settings - Test Results -->
-
-<hr style="clear: both"><h3>Gui Settings - Test Results</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/testResultSettings.jpg"></div>
-
-<h3>Errors Tab</h3>
-
-<p>Check <b>Display Errors and Failures Tab</b> to display the 
-<b>Errors and Failures</b> tab, which shows information about failing tests.
-
-<p>Check <b>Enable Failure ToolTips</b> to display the tip window over the
-Errors and Failures display and the stack trace. Clear it if you prefer not
-to see the tip window.</p>
-
-<p>Check <b>Enable Word Wrap</b> to turn on word wrapping
-in the Errors and Failures display. While you can select this item and the
-preceding one at the same time, they do not interact well, so you will 
-normally choose one or the other.</p>
-
-<h3>Not Run Tab</h3>
-
-<p>Check <b>Display Tests Not Run Tab</b> to display the 
-<b>Tests Not Run</b> tab, which shows information about tests that were
-skipped or ignored.
-
-<!-- Gui Settings - Text Output -->
-
-<hr style="clear: both"><h3>Gui Settings - Text Output</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/textOutputSettings.jpg"></div>
-
-<h3>Select Tab</h3>
-
-<p>The <b>Select Tab</b> dropdown list is used to select one of the output tabs, for which
-settings are to be viewed or changed. It also contains entries that allow
-you to add a new tab or edit the list of tabs.
-
-<p>The <b>Restore Defaults</b> button is used to restore the default
-setting, which is a single tab labeled "Text Output." The default tab
-displays all types of output and includes a label for each test that 
-displays text.
-
-<p>The <b>Title</b> text box is used to modify the title displayed
-for the selected output tab.
-
-<p><b>Enabled</b> is checked by default. If you uncheck it,
-the selected tab will be removed from the tab control. This allows you to temporarily
-suppress output to a tab without actually removing its definition.
-
-<h3>Content</h3>
-
-<p>The 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>When checked, NUnit captures all output written to Console.Out.
-
-<h4>Error Output</h4>
-<p>When checked, NUnit captures all output written to Console.Error.
-
-<h4>Trace Output</h4>
-<p>When checked, NUnit captures all output written to Trace or Debug.
-
-<h4>Log Output</h4>
-<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 -->
-
-<hr style="clear: both"><h3>Gui Settings - Project Editor</h3><hr>
-
-<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>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>
-
-<div class="screenshot-right">
-   <img src="img/testLoadSettings.jpg"></div>
-
-<h3>Default Process Model</h3>
-
-<p>These settings determine NUnit's default use of operating system
-processes and may be overridden by settings in the NUnit project.
-
-<p>If <b>Run tests directly in the NUnit process</b> is selected,
-all tests are run in a test domain in the same process as NUnit.
-This is the way previous versions of NUnit ran tests and is the
-default setting.
-
-<p>If <b>Run tests in a single separate process</b> is selected,
-a separate process is used for all tests.
-
-<p>If <b>Run tests in a separate process per Assembly </b> is selected,
-a separate process is used for each test assembly.
-
-<h3>Default Domain Usage</h3>
-
-<p>If <b>Use a separate AppDomain per Assembly</b> is selected, each assembly
-   in a multiple-assembly test run will be loaded in a separate AppDomain.
-   This setting is not available when <b>Run tests in a separate process
-   per Assembly</b> is selected above.
-
-<p>If <b>Use a single AppDomain for all tests</b> is selected, all assemblies in
-   a multiple-assembly test run will use the same AppDomain. This was
-   the standard behavior of NUnit prior to version 2.4 and is the
-   default setting.
-
-<p>If <b>Merge tests across assemblies</b> is checked, the display of tests
-   will not be divided across assemblies. If automatic namespace suites are
-   used, they will be merged across all assemblies. This option is only
-   available when tests are run in the same appdomain.
-
-<!-- Test Loader Settings - Assembly Reload -->
-
-<hr style="clear: both"><h3>Test Loader Settings - Assembly Reload</h3><hr>
-
-<div class="screenshot-right">
-   <img src="img/assemblyReloadSettings.jpg"></div>
-
-<h3>Assembly Reload</h3>
-
-<p>If <b>Reload before each test run</b> is checked, a reload will occur whenever the run button is
-pressed whether the assemblies appear to have changed or not.</p>
-
-<p>If <b>Reload when test assembly changes</b> is checked, assemblies are watched for any change and
-an automatic reload is initiated. This item is disabled on Windows 98 or ME.</p>
-
-<p>If <b>Re-run last tests run</b> is checked, tests are re-run whenever a Reload
-   takes place.</p>
- 
-<!-- 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">
-   <img src="img/advancedSettings.jpg"></div>
-
-<h3>Shadow Copy</h3>
-
-<p>NUnit normally uses .Net shadow-copying in order to allow you to edit
-and recompile assemblies while it is running. Uncheck this box to disable
-shadow-copy only if you have a particular problem that requires it.</p>
-
-<p><b>Note:</b> If you are tempted to disable shadow copy in order to access
-files in the same directory as your assembly, you should be aware that there
-are alternatives. Consider using the Assembly.Codebase property rather than
-Assembly.Location.
-
-<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>
-
-<div class="screenshot-right">
-   <img src="img/visualStudioSettings.jpg"></div>
-
-<h3>Visual Studio</h3>
-
-<p>If <b>Enable Visual Studio Support</b> is checked, the user will be able to open Visual Studio projects
-and solutions and add Visual Studio projects to existing test projects.</p>
-
-<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">
-   <img src="img/internalTraceSettings.jpg"></div>
-
-<h3>Internal Trace</h3>
-
-<p>The <b>Trace Level</b> dropdown controls the level of internal trace output.</p>
-
-<p><b>Log Directory</b> displays the path of the directory to which all internal
-   trace log files are saved.
-
-
-
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li id="current"><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Settings Dialog</h2>
+
+<p>The Settings Dialog is displayed using the Tools | Settings menu item and allows the user to
+control some aspects of NUnit�s operation. Beginning with NUnit 2.4.4, a tree-based dialog
+replaced the older tabbed format.</p>
+
+<!-- Gui Settings - General -->
+
+<hr><h3>Gui Settings - General</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/generalSettings.jpg"></div>
+
+<h3>Gui Display</h3>
+
+<h4>Full Gui</h4>
+<p>Displays the complete gui - as in prior versions of NUnit. This includes the
+   test result tabs and the progress bar.</p>
+   
+<h4>Mini Gui</h4>
+<p>Switches the display to the mini-gui, which consists of the tree display 
+   only.</p>
+<h3>Recent Files</h3>
+
+<p>The <b>Display ... files in list</b> TextBox allows the user to choose the number 
+of entries to display in the recent files list.
+
+<p>Normally, NUnit checks that project files still exist before
+displaying them in the recent files list. This can cause long delays if the
+file is on a network connection that is no longer available. Unchecking 
+<b>Check that files exist before listing</b> will avoid this delay, so 
+long as the missing file is not actually selected.
+
+<p>If <b>Load most recent project at startup</b> is checked, the GUI will load the 
+last file opened unless it is run with a specific filename or with the 
+<code>/noload</code> parameter.</p>
+
+<!-- Gui Settings - Tree Display -->
+
+<hr style="clear: both"><h3>Gui Settings - Tree Display</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/treeDisplaySettings.jpg"></div>
+
+<h3>Tree View</h3>
+
+<p>The <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>
+<p><b>Collapse</b> � collapses all tests</p>
+<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>
+
+<p>If <b>Save visual state of each project</b> is checked, NUnit saves the state of the tree
+and restores it when the project is next opened. The information saved includes which
+branches of the tree are expanded, the selected node, any checked nodes and any
+category selection.
+
+<p>If <b>Show Checkboxes</b> is checked, the tree includes checkboxes, which may
+   be used to select multiple tests for running. This setting is also available
+   in the <b>View | Tree</b> menu.</p>
+
+<h3>Test Structure</h3>
+
+<p>If <b>Automatic Namespace suites</b> is selected, tests will be
+   shown in a hierarchical listing based on namespaces. This is the
+   standard display as used in versions prior to NUnit 2.4.
+
+<p>If <b>Flat list of TestFixtures</b> is selected, tests will be
+   shown as a sequential list of fixtures.
+
+<!-- Gui Settings - Test Results -->
+
+<hr style="clear: both"><h3>Gui Settings - Test Results</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/testResultSettings.jpg"></div>
+
+<h3>Errors Tab</h3>
+
+<p>Check <b>Display Errors and Failures Tab</b> to display the 
+<b>Errors and Failures</b> tab, which shows information about failing tests.
+
+<p>Check <b>Enable Failure ToolTips</b> to display the tip window over the
+Errors and Failures display and the stack trace. Clear it if you prefer not
+to see the tip window.</p>
+
+<p>Check <b>Enable Word Wrap</b> to turn on word wrapping
+in the Errors and Failures display. While you can select this item and the
+preceding one at the same time, they do not interact well, so you will 
+normally choose one or the other.</p>
+
+<h3>Not Run Tab</h3>
+
+<p>Check <b>Display Tests Not Run Tab</b> to display the 
+<b>Tests Not Run</b> tab, which shows information about tests that were
+skipped or ignored.
+
+<!-- Gui Settings - Text Output -->
+
+<hr style="clear: both"><h3>Gui Settings - Text Output</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/textOutputSettings.jpg"></div>
+
+<h3>Select Tab</h3>
+
+<p>The <b>Select Tab</b> dropdown list is used to select one of the output tabs, for which
+settings are to be viewed or changed. It also contains entries that allow
+you to add a new tab or edit the list of tabs.
+
+<p>The <b>Restore Defaults</b> button is used to restore the default
+setting, which is a single tab labeled "Text Output." The default tab
+displays all types of output and includes a label for each test that 
+displays text.
+
+<p>The <b>Title</b> text box is used to modify the title displayed
+for the selected output tab.
+
+<p><b>Enabled</b> is checked by default. If you uncheck it,
+the selected tab will be removed from the tab control. This allows you to temporarily
+suppress output to a tab without actually removing its definition.
+
+<h3>Content</h3>
+
+<p>The 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>When checked, NUnit captures all output written to Console.Out.
+
+<h4>Error Output</h4>
+<p>When checked, NUnit captures all output written to Console.Error.
+
+<h4>Trace Output</h4>
+<p>When checked, NUnit captures all output written to Trace or Debug.
+
+<h4>Log Output</h4>
+<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 -->
+
+<hr style="clear: both"><h3>Gui Settings - Project Editor</h3><hr>
+
+<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>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>
+
+<div class="screenshot-right">
+   <img src="img/testLoadSettings.jpg"></div>
+
+<h3>Default Process Model</h3>
+
+<p>These settings determine NUnit's default use of operating system
+processes and may be overridden by settings in the NUnit project.
+
+<p>If <b>Run tests directly in the NUnit process</b> is selected,
+all tests are run in a test domain in the same process as NUnit.
+This is the way previous versions of NUnit ran tests and is the
+default setting.
+
+<p>If <b>Run tests in a single separate process</b> is selected,
+a separate process is used for all tests.
+
+<p>If <b>Run tests in a separate process per Assembly </b> is selected,
+a separate process is used for each test assembly.
+
+<h3>Default Domain Usage</h3>
+
+<p>If <b>Use a separate AppDomain per Assembly</b> is selected, each assembly
+   in a multiple-assembly test run will be loaded in a separate AppDomain.
+   This setting is not available when <b>Run tests in a separate process
+   per Assembly</b> is selected above.
+
+<p>If <b>Use a single AppDomain for all tests</b> is selected, all assemblies in
+   a multiple-assembly test run will use the same AppDomain. This was
+   the standard behavior of NUnit prior to version 2.4 and is the
+   default setting.
+
+<p>If <b>Merge tests across assemblies</b> is checked, the display of tests
+   will not be divided across assemblies. If automatic namespace suites are
+   used, they will be merged across all assemblies. This option is only
+   available when tests are run in the same appdomain.
+
+<!-- Test Loader Settings - Assembly Reload -->
+
+<hr style="clear: both"><h3>Test Loader Settings - Assembly Reload</h3><hr>
+
+<div class="screenshot-right">
+   <img src="img/assemblyReloadSettings.jpg"></div>
+
+<h3>Assembly Reload</h3>
+
+<p>If <b>Reload before each test run</b> is checked, a reload will occur whenever the run button is
+pressed whether the assemblies appear to have changed or not.</p>
+
+<p>If <b>Reload when test assembly changes</b> is checked, assemblies are watched for any change and
+an automatic reload is initiated. This item is disabled on Windows 98 or ME.</p>
+
+<p>If <b>Re-run last tests run</b> is checked, tests are re-run whenever a Reload
+   takes place.</p>
+ 
+<!-- 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">
+   <img src="img/advancedSettings.jpg"></div>
+
+<h3>Shadow Copy</h3>
+
+<p>NUnit normally uses .Net shadow-copying in order to allow you to edit
+and recompile assemblies while it is running. Uncheck this box to disable
+shadow-copy only if you have a particular problem that requires it.</p>
+
+<p><b>Note:</b> If you are tempted to disable shadow copy in order to access
+files in the same directory as your assembly, you should be aware that there
+are alternatives. Consider using the Assembly.Codebase property rather than
+Assembly.Location.
+
+<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>
+
+<div class="screenshot-right">
+   <img src="img/visualStudioSettings.jpg"></div>
+
+<h3>Visual Studio</h3>
+
+<p>If <b>Enable Visual Studio Support</b> is checked, the user will be able to open Visual Studio projects
+and solutions and add Visual Studio projects to existing test projects.</p>
+
+<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">
+   <img src="img/internalTraceSettings.jpg"></div>
+
+<h3>Internal Trace</h3>
+
+<p>The <b>Trace Level</b> dropdown controls the level of internal trace output.</p>
+
+<p><b>Log Directory</b> displays the path of the directory to which all internal
+   trace log files are saved.
+
+
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li id="current"><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/setup.html b/doc/setup.html
index b324455..34a519c 100644
--- a/doc/setup.html
+++ b/doc/setup.html
@@ -1,252 +1,253 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>SetUpAttribute (NUnit 2.0 / 2.5)</h3>
-
-<p>This attribute is used inside a TestFixture to provide a common set of 
-	functions that are performed just before each test method is called.  
-    
-<p><b>Before NUnit 2.5</b>, a TestFixture could have only one SetUp method
-	and it was required to be an instance method. 
-
-<p><b>Beginning with NUnit 2.5</b>, SetUp methods may be either static or
-   instance methods and you may define more than one of them in a fixture.
-   Normally, multiple SetUp methods are only defined at different levels
-   of an inheritance hierarchy, as explained below.
-   
-<p>If a SetUp method fails or throws an exception, the test is not executed
-   and a failure or error is reported.
-   
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [SetUp] public void Init()
-    { /* ... */ }
-
-    [TearDown] public void Cleanup()
-    { /* ... */ }
-
-    [Test] public void Add()
-    { /* ... */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    <SetUp()> Public Sub Init()
-    ' ...
-    End Sub
-
-    <TearDown()> Public Sub Cleanup()
-    ' ...
-    End Sub
-
-    <Test()> Public Sub Add()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [SetUp] void Init();
-    [TearDown] void Cleanup();
-
-    [Test] void Add();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.SetUp() */
-  public void Init()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.TearDown() */
-  public void Cleanup()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.Test() */
-  public void Add()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h3>Inheritance</h3>
-
-<p>The SetUp attribute is inherited from any base class. Therefore, if a base 
-	class has defined a SetUp method, that method will be called 
-	before each test method in the derived class.
-	
-<p>Before NUnit 2.5, you were permitted only one SetUp method. If you wanted to 
-   have some SetUp functionality in the base class and add more in the derived 
-   class you needed to call the base class method yourself.
- 
-<p>With NUnit 2.5, you can achieve the same result by defining a SetUp method
-   in the base class and another in the derived class. NUnit will call base
-   class SetUp methods before those in the derived classes.
-   
-<p><b>Note:</b> Although it is possible to define multiple SetUp methods
-   in the same class, you should rarely do so. Unlike methods defined in
-   separate classes in the inheritance hierarchy, the order in which they
-   are executed is not guaranteed.
-
-<h4>See also...</h4>
-<ul>
-<li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
-	
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="setup.html">Setup</a></li>
-<li><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>SetUpAttribute (NUnit 2.0 / 2.5)</h3>
+
+<p>This attribute is used inside a <a href="testFixture.html">TestFixture</a>  to provide a common set of functions that are performed just before each test method is called. 
+  It is	also used inside a <a href="setupFixture.html">SetUpFixture</a></b>,
+  where it provides the same functionality at the level of a namespace or assembly.
+    
+<p><b>Before NUnit 2.5</b>, a class could have only one SetUp method
+	and it was required to be an instance method. 
+
+<p><b>Beginning with NUnit 2.5</b>, SetUp methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple SetUp methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+   
+<p>If a SetUp method fails or throws an exception, the test is not executed
+   and a failure or error is reported.
+   
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [SetUp] public void Init()
+    { /* ... */ }
+
+    [TearDown] public void Cleanup()
+    { /* ... */ }
+
+    [Test] public void Add()
+    { /* ... */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    <SetUp()> Public Sub Init()
+    ' ...
+    End Sub
+
+    <TearDown()> Public Sub Cleanup()
+    ' ...
+    End Sub
+
+    <Test()> Public Sub Add()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [SetUp] void Init();
+    [TearDown] void Cleanup();
+
+    [Test] void Add();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.SetUp() */
+  public void Init()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.TearDown() */
+  public void Cleanup()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.Test() */
+  public void Add()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h3>Inheritance</h3>
+
+<p>The SetUp attribute is inherited from any base class. Therefore, if a base 
+	class has defined a SetUp method, that method will be called 
+	before each test method in the derived class.
+	
+<p>Before NUnit 2.5, you were permitted only one SetUp method. If you wanted to 
+   have some SetUp functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+ 
+<p>With NUnit 2.5, you can achieve the same result by defining a SetUp method
+   in the base class and another in the derived class. NUnit will call base
+   class SetUp methods before those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple SetUp methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a><li><a href="setupFixture.html">SetUpFixtureAttribute</a></ul>
+	
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="setup.html">Setup</a></li>
+<li><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/setupFixture.html b/doc/setupFixture.html
index 24cac24..3a902e1 100644
--- a/doc/setupFixture.html
+++ b/doc/setupFixture.html
@@ -1,229 +1,235 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>SetUpFixtureAttribute (NUnit 2.4)</h3>
-
-<p>This is the attribute that marks a class that contains the one-time
-	setup or teardown methods for all the test fixtures under a given
-	namespace. The class may contain at most one method marked with the
-	SetUpAttribute and one method marked with the TearDownAttribute.</p>
-	
-<p>There are a few restrictions on a class that is used as a setup fixture.
-	<ul>
-		<li>
-			It must be a publicly exported type or NUnit will not see it.</li>
-		<li>
-			It must have a default constructor or NUnit will not be able to construct it.</li>
-	</ul>
-</p>
-
-<p>The SetUp method in a SetUpFixture is executed once before any of the fixtures
-contained in its namespace. The TearDown method is executed once after all the 
-fixtures have completed execution. In the examples below, the method RunBeforeAnyTests()
-is called before any tests or setup methods in the NUnit.Tests namespace. The method
-RunAfterAnyTests() is called after all the tests in the namespace as well as their
-individual or fixture teardowns have completed exection.</p>
-
-<p>Only one SetUpFixture should be created in a given namespace. A SetUpFixture
-outside of any namespace provides SetUp and TearDown for the entire assembly.
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [SetUpFixture]
-  public class MySetUpClass
-  {
-    [SetUp]
-	RunBeforeAnyTests()
-	{
-	  // ...
-	}
-
-    [TearDown]
-	RunAfterAnyTests()
-	{
-	  // ...
-	}
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class MySetUpClass
-    <SetUp()> Public Sub RunBeforeAnyTests()
-	  ' ...
-	End Sub
-	
-	<TearDown()> Public Sub RunAfterAnyTests()
-	  ' ...
-	End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class MySetUpClass
-  {
-    [SetUp] public void RunBeforeAnyTests();
-	[TearDown] public void RunAfterAnyTests();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class MySetUpClass
-{
-  /** @attribute NUnit.Framework.SetUp() */
-  public void RunBeforeAnyTests()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.TearDown() */
-  public void RunAfterAnyTests()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-</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><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 id="current"><a href="setupFixture.html">SetupFixture</a></li>
-<li><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>SetUpFixtureAttribute (NUnit 2.4)</h3>
+
+<p>This is the attribute that marks a class that contains the one-time
+	setup or teardown methods for all the test fixtures under a given
+	namespace. The class may contain at most one method marked with the
+	SetUpAttribute and one method marked with the TearDownAttribute.</p>
+	
+<p>There are a few restrictions on a class that is used as a setup fixture.
+	<ul>
+		<li>
+			It must be a publicly exported type or NUnit will not see it.</li>
+		<li>
+			It must have a default constructor or NUnit will not be able to construct it.</li>
+	</ul>
+</p>
+
+<p>The SetUp method in a SetUpFixture is executed once before any of the fixtures
+contained in its namespace. The TearDown method is executed once after all the 
+fixtures have completed execution. In the examples below, the method RunBeforeAnyTests()
+is called before any tests or setup methods in the NUnit.Tests namespace. The method
+RunAfterAnyTests() is called after all the tests in the namespace as well as their
+individual or fixture teardowns have completed exection.</p>
+
+<p>Only one SetUpFixture should be created in a given namespace. A SetUpFixture
+outside of any namespace provides SetUp and TearDown for the entire assembly.
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [SetUpFixture]
+  public class MySetUpClass
+  {
+    [SetUp]
+	RunBeforeAnyTests()
+	{
+	  // ...
+	}
+
+    [TearDown]
+	RunAfterAnyTests()
+	{
+	  // ...
+	}
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class MySetUpClass
+    <SetUp()> Public Sub RunBeforeAnyTests()
+	  ' ...
+	End Sub
+	
+	<TearDown()> Public Sub RunAfterAnyTests()
+	  ' ...
+	End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class MySetUpClass
+  {
+    [SetUp] public void RunBeforeAnyTests();
+	[TearDown] public void RunAfterAnyTests();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class MySetUpClass
+{
+  /** @attribute NUnit.Framework.SetUp() */
+  public void RunBeforeAnyTests()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.TearDown() */
+  public void RunAfterAnyTests()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="teardown.html">TearDownAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="setupFixture.html">SetupFixture</a></li>
+<li><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/stringAssert.html b/doc/stringAssert.html
index 383450c..471dae2 100644
--- a/doc/stringAssert.html
+++ b/doc/stringAssert.html
@@ -1,116 +1,120 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>StringAssert (NUnit 2.2.3)</h2>
-<p>The StringAssert class provides a number of methods that are useful 
-when examining string values.</p>
-
-<div class="code" style="width: 36em">
-<pre>StringAssert.Contains( string expected, string actual );
-StringAssert.Contains( string expected, string actual, 
-                string message );
-StringAssert.Contains( string expected, string actual,
-                string message, params object[] args );
-
-StringAssert.StartsWith( string expected, string actual );
-StringAssert.StartsWith( string expected, string actual, 
-                string message );
-StringAssert.StartsWith( string expected, string actual,
-                string message, params object[] args );
-
-StringAssert.EndsWith( string expected, string actual );
-StringAssert.EndsWith( string expected, string actual, 
-                string message );
-StringAssert.EndsWith( string expected, string actual,
-                string message, params object[] args );
-
-StringAssert.AreEqualIgnoringCase( string expected, string actual );
-StringAssert.AreEqualIgnoringCase( string expected, string actual, 
-                string message );
-StringAssert.AreEqualIgnoringCase( string expected, string actual,
-                string message params object[] args );
-				
-StringAssert.IsMatch( string regexPattern, string actual );
-StringAssert.IsMatch( string regexPattern, string actual, 
-                string message );
-StringAssert.IsMatch( string regexPattern, string actual,
-                string message, params object[] args );</pre>
-</div>
-
-</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>
-<ul>
-<li><a href="equalityAsserts.html">Equality Asserts</a></li>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li id="current"><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>StringAssert (NUnit 2.2.3)</h2>
+<p>The StringAssert class provides a number of methods that are useful 
+when examining string values.</p>
+
+<div class="code" style="width: 36em">
+<pre>StringAssert.Contains( string expected, string actual );
+StringAssert.Contains( string expected, string actual, 
+                string message );
+StringAssert.Contains( string expected, string actual,
+                string message, params object[] args );
+
+StringAssert.StartsWith( string expected, string actual );
+StringAssert.StartsWith( string expected, string actual, 
+                string message );
+StringAssert.StartsWith( string expected, string actual,
+                string message, params object[] args );
+
+StringAssert.EndsWith( string expected, string actual );
+StringAssert.EndsWith( string expected, string actual, 
+                string message );
+StringAssert.EndsWith( string expected, string actual,
+                string message, params object[] args );
+
+StringAssert.AreEqualIgnoringCase( string expected, string actual );
+StringAssert.AreEqualIgnoringCase( string expected, string actual, 
+                string message );
+StringAssert.AreEqualIgnoringCase( string expected, string actual,
+                string message params object[] args );
+				
+StringAssert.IsMatch( string regexPattern, string actual );
+StringAssert.IsMatch( string regexPattern, string actual, 
+                string message );
+StringAssert.IsMatch( string regexPattern, string actual,
+                string message, params object[] args );</pre>
+</div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li id="current"><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/stringConstraints.html b/doc/stringConstraints.html
index 666be89..893f92f 100644
--- a/doc/stringConstraints.html
+++ b/doc/stringConstraints.html
@@ -1,254 +1,258 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>String Constraints (NUnit 2.4)</h2>
-
-<p>String constraints perform tests that are specific to strings.
-   Attempting to test a non-string value with a string constraint
-   is an error and gives an exception.
-   
-<p>The <b>Text</b> prefix is deprecated beginning with NUnit 2.5.1
-   and will be removed in NUnit 3.0.
- 
-<h3>SubstringConstraint</h3>  
-
-<h4>Action</h4>
-<p>Tests for a substring.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-SubstringConstraint(string expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.StringContaining(string expected)
-Contains.Substring(string expected)
-ContainsSubstring(string expected)
-Contains(string expected)
-[Obsolete] Text.Contains(string expected)
-[Obsolete] Text.DoesNotContain(string expected)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-string phrase = "Make your tests fail before passing!"
-
-Assert.That( phrase, Is.StringContaining( "tests fail" ) );
-Assert.That( phrase, Contains.Substring( "tests fail" ) );
-Assert.That( phrase, Is.Not.StringContaining( "tests pass" ) );
-Assert.That( phrase, Is.StringContaining( "make" ).IgnoreCase );
-Expect (phrase, Contains.Substring( "make" ).IgnoreCase );
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li><b>ContainsSubstring</b> and <b>Contains</b> may appear only in the 
-    body of a constraint expression or when the inherited syntax is used.
-<li><b>Contains</b> is not actually a string constraint but is converted
-    to one when a string is being tested.
-</ol>
-
-<h3>StartsWithConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests for an initial string.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-StartsWithConstraint(string expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.StringStarting(string expected)
-StartsWith(string expected)
-[Obsolete] Text.StartsWith(string expected)
-[Obsolete] Text.DoesNotStartWith(string expected)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-string phrase = "Make your tests fail before passing!"
-
-Assert.That( phrase, Is.StringStarting( "Make" ) );
-Assert.That( phrase, Is.Not.StringStarting( "Break" ) );
-Assert.That( phrase, Has.Length.GreaterThan(10)
-                .And.Not.StartsWith( "Break" ) );
-Expect( phrase, StartsWith( "Make" ) );
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li><b>StartsWith</b> may appear only in the body of a constraint 
-    expression or when the inherited syntax is used.
-</ol>
-
-<h3>EndsWithConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests for an ending string.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-EndsWithConstraint(string expected)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.StringEnding(string expected)
-EndsWith(string expected)
-[Obsolete] Text.EndsWith(string expected)
-[Obsolete] Text.DoesNotEndWith(string expected)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-string phrase = "Make your tests fail before passing!"
-
-Assert.That( phrase, Is.StringEnding( "!" ) );
-Assert.That( phrase, Is.StringEnding( "PASSING!" ).IgnoreCase );
-Expect( phrase, EndsWith( "!" ) );
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li><b>EndsWith</b> may appear only in the body of a constraint 
-    expression or when the inherited syntax is used.
-</ol>
-
-<h3>RegexConstraint</h3>
-
-<h4>Action</h4>
-<p>Tests that a pattern is matched.
-
-<h4>Constructor</h4>
-<div class="code"><pre>
-RegexConstraint(string pattern)
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Is.StringMatching(string pattern)
-Matches(string pattern)
-[Obsolete] Text.Matches(string pattern)
-[Obsolete] Text.DoesNotMatch(string pattern)
-</pre></div>
-
-<h4>Modifiers</h4>
-<div class="code"><pre>
-...IgnoreCase
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-string phrase = "Make your tests fail before passing!"
-
-Assert.That( phrase, Is.StringMatching( "Make.*tests.*pass" ) );
-Assert.That( phrase, Is.Not.StringMatching( "your.*passing.*tests" ) );
-Assert.That( phrase, Has.Length.GreaterThan(10)
-                .And.Not.Matches( "your.*passing.*tests" ) );
-Expect( phrase, Matches( "Make.*pass" ) );
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li><b>Matches</b> may appear only in the body of a constraint 
-    expression or when the inherited syntax is used.
-</ol>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li id="current"><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>String Constraints (NUnit 2.4)</h2>
+
+<p>String constraints perform tests that are specific to strings.
+   Attempting to test a non-string value with a string constraint
+   is an error and gives an exception.
+   
+<p>The <b>Text</b> prefix is deprecated beginning with NUnit 2.5.1
+   and will be removed in NUnit 3.0.
+ 
+<h3>SubstringConstraint</h3>  
+
+<h4>Action</h4>
+<p>Tests for a substring.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+SubstringConstraint(string expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringContaining(string expected)
+Contains.Substring(string expected)
+ContainsSubstring(string expected)
+Contains(string expected)
+[Obsolete] Text.Contains(string expected)
+[Obsolete] Text.DoesNotContain(string expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringContaining( "tests fail" ) );
+Assert.That( phrase, Contains.Substring( "tests fail" ) );
+Assert.That( phrase, Is.Not.StringContaining( "tests pass" ) );
+Assert.That( phrase, Is.StringContaining( "make" ).IgnoreCase );
+Expect (phrase, Contains.Substring( "make" ).IgnoreCase );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>ContainsSubstring</b> and <b>Contains</b> may appear only in the 
+    body of a constraint expression or when the inherited syntax is used.
+<li><b>Contains</b> is not actually a string constraint but is converted
+    to one when a string is being tested.
+</ol>
+
+<h3>StartsWithConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests for an initial string.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+StartsWithConstraint(string expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringStarting(string expected)
+StartsWith(string expected)
+[Obsolete] Text.StartsWith(string expected)
+[Obsolete] Text.DoesNotStartWith(string expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringStarting( "Make" ) );
+Assert.That( phrase, Is.Not.StringStarting( "Break" ) );
+Assert.That( phrase, Has.Length.GreaterThan(10)
+                .And.Not.StartsWith( "Break" ) );
+Expect( phrase, StartsWith( "Make" ) );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>StartsWith</b> may appear only in the body of a constraint 
+    expression or when the inherited syntax is used.
+</ol>
+
+<h3>EndsWithConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests for an ending string.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+EndsWithConstraint(string expected)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringEnding(string expected)
+EndsWith(string expected)
+[Obsolete] Text.EndsWith(string expected)
+[Obsolete] Text.DoesNotEndWith(string expected)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringEnding( "!" ) );
+Assert.That( phrase, Is.StringEnding( "PASSING!" ).IgnoreCase );
+Expect( phrase, EndsWith( "!" ) );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>EndsWith</b> may appear only in the body of a constraint 
+    expression or when the inherited syntax is used.
+</ol>
+
+<h3>RegexConstraint</h3>
+
+<h4>Action</h4>
+<p>Tests that a pattern is matched.
+
+<h4>Constructor</h4>
+<div class="code"><pre>
+RegexConstraint(string pattern)
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Is.StringMatching(string pattern)
+Matches(string pattern)
+[Obsolete] Text.Matches(string pattern)
+[Obsolete] Text.DoesNotMatch(string pattern)
+</pre></div>
+
+<h4>Modifiers</h4>
+<div class="code"><pre>
+...IgnoreCase
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+string phrase = "Make your tests fail before passing!"
+
+Assert.That( phrase, Is.StringMatching( "Make.*tests.*pass" ) );
+Assert.That( phrase, Is.Not.StringMatching( "your.*passing.*tests" ) );
+Assert.That( phrase, Has.Length.GreaterThan(10)
+                .And.Not.Matches( "your.*passing.*tests" ) );
+Expect( phrase, Matches( "Make.*pass" ) );
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>Matches</b> may appear only in the body of a constraint 
+    expression or when the inherited syntax is used.
+</ol>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li id="current"><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/suite.html b/doc/suite.html
index b2eb80e..4a12553 100644
--- a/doc/suite.html
+++ b/doc/suite.html
@@ -1,251 +1,251 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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">
-
-<div style="float:right"><b>Update: August 22, 2007</b></div>
-<h3>SuiteAttribute (NUnit 2.0/2.4.4)</h3>
-	
-<p>The Suite Attribute is used to define subsets of test to be run from the
-	command-line, using the <b>/fixture</b> option. It was introduced in NUnit 
-	2.0 to replace the older approach of inheriting from the TestSuite class.</p>
-	
-<p>Originally, the NUnit developers believed that the need for the Suite
-    mechanism would diminish because of the dynamic creation of suites based
-	on namespaces. It was provided for backwards compatibility.</p>
-	
-<p>That has not proven to be true. Suites are still used today by many people,
-    so we are making an effort to revive them in terms of usability. 
-	
-<p>The Suite mechanism depends on a static property marked with the </b>SuiteAttribute</b>.
-	In the clasic implementation, supported by all releases since 2.0, that property
-	returns a TestSuite, populated with the tests that are to be executed.
-	
-<h4>Old Approach</h4>
-
-<div class="code">
-
-<pre>namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-  using NUnit.Core;
-
-  public class AllTests
-  {
-    [Suite]
-    public static TestSuite Suite
-    {
-      get
-      {
-        TestSuite suite = new TestSuite("All Tests");
-        suite.Add(new OneTestCase());
-        suite.Add(new Assemblies.AssemblyTests());
-        suite.Add(new AssertionTest());
-        return suite;
-      }
-    }
-  }
-}
-</pre>
-
-</div>
-
-<p>This approach has a serious problem: it requires a reference to the nunit.core assembly,
-	which is not normally referenced by user tests. This means that the tests
-	cannot be ported across versions of NUnit without recompilation. In some cases,
-	introducing more than one version of the core assembly can prevent NUnit
-	from running correctly.
-	
-<p>Beginning with NUnit 2.4.4, a new approach is available. The property marked
-	with the <b>SuiteAttribute</b> may simply return a collection containing test 
-	fixture objects or Types.
-	If a Type is provided, NUnit creates an object of that type for use
-	as a fixture. Any other object is assumed to be a pre-created fixture object.
-	This allows objects with parameterized constructors or settable
-	properties to be used as fixtures.
-
-<p>Test suites created through use of the <b>SuiteAttribute</b> may contain <b>TestFixtureSetUp</b> and 
-	<b>TestFixtureTearDown</b> methods, to perform one-time setup and teardown
-	for the tests included in the suite.
-	
-<h4>New Approach - Fixture Objects</h4>
-
-<div class="code">
-
-<pre>namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  private class AllTests
-  {
-    [Suite]
-    public static IEnumerable Suite
-    {
-      get
-      {
-        ArrayList suite = new ArrayList();
-        suite.Add(new OneTestCase());
-        suite.Add(new AssemblyTests());
-        suite.Add(new NoNamespaceTestFixture());
-        return suite;
-      }
-    }
-  }
-}
-</pre>
-
-</div>
-
-<h4>New Approach - Fixture Types</h4>
-
-<div class="code">
-
-<pre>namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  private class AllTests
-  {
-    [Suite]
-    public static IEnumerable Suite
-    {
-      get
-      {
-        ArrayList suite = new ArrayList();
-        suite.Add(typeof(OneTestCase));
-        suite.Add(typeof(AssemblyTests));
-        suite.Add(typeof(NoNamespaceTestFixture));
-        return suite;
-      }
-    }
-  }
-}
-</pre>
-
-</div>
-
-<h4>Limitations</h4>
-
-NUnit support for user-defined Suites currently has two limitations:
-
-<ol>
-	<li>It is not possible to include individual test cases directly
-	in a Suite using the new approach. Anyone wanting to do so will 
-	need to use the old approach and create an object derive from
-	NUnit.Core.TestCase. This is not recommended, since it requires
-	a reference to the core assembly.
-	
-	<li>Suites are currently not displayed in the Gui or run automatically
-	by either runner when they are encountered. The historical purpose of 
-	the Suite mechanism was to provide a way of aggregating tests at the
-	top level of each run. Hence, they are only supported when used with 
-	the /fixture option on the console or gui command line.
-</ol>
-
-Approaches to removing these limitations are being investigated as part
-of the planning for future NUnit releases.
-
-</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><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 id="current"><a href="suite.html">Suite</a></li>
-<li><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<div style="float:right"><b>Update: August 22, 2007</b></div>
+<h3>SuiteAttribute (NUnit 2.0/2.4.4)</h3>
+	
+<p>The Suite Attribute is used to define subsets of test to be run from the
+	command-line, using the <b>/fixture</b> option. It was introduced in NUnit 
+	2.0 to replace the older approach of inheriting from the TestSuite class.</p>
+	
+<p>Originally, the NUnit developers believed that the need for the Suite
+    mechanism would diminish because of the dynamic creation of suites based
+	on namespaces. It was provided for backwards compatibility.</p>
+	
+<p>That has not proven to be true. Suites are still used today by many people,
+    so we are making an effort to revive them in terms of usability. 
+	
+<p>The Suite mechanism depends on a static property marked with the </b>SuiteAttribute</b>.
+	In the clasic implementation, supported by all releases since 2.0, that property
+	returns a TestSuite, populated with the tests that are to be executed.
+	
+<h4>Old Approach</h4>
+
+<div class="code">
+
+<pre>namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+  using NUnit.Core;
+
+  public class AllTests
+  {
+    [Suite]
+    public static TestSuite Suite
+    {
+      get
+      {
+        TestSuite suite = new TestSuite("All Tests");
+        suite.Add(new OneTestCase());
+        suite.Add(new Assemblies.AssemblyTests());
+        suite.Add(new AssertionTest());
+        return suite;
+      }
+    }
+  }
+}
+</pre>
+
+</div>
+
+<p>This approach has a serious problem: it requires a reference to the nunit.core assembly,
+	which is not normally referenced by user tests. This means that the tests
+	cannot be ported across versions of NUnit without recompilation. In some cases,
+	introducing more than one version of the core assembly can prevent NUnit
+	from running correctly.
+	
+<p>Beginning with NUnit 2.4.4, a new approach is available. The property marked
+	with the <b>SuiteAttribute</b> may simply return a collection containing test 
+	fixture objects or Types.
+	If a Type is provided, NUnit creates an object of that type for use
+	as a fixture. Any other object is assumed to be a pre-created fixture object.
+	This allows objects with parameterized constructors or settable
+	properties to be used as fixtures.
+
+<p>Test suites created through use of the <b>SuiteAttribute</b> may contain <b>TestFixtureSetUp</b> and 
+	<b>TestFixtureTearDown</b> methods, to perform one-time setup and teardown
+	for the tests included in the suite.
+	
+<h4>New Approach - Fixture Objects</h4>
+
+<div class="code">
+
+<pre>namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  private class AllTests
+  {
+    [Suite]
+    public static IEnumerable Suite
+    {
+      get
+      {
+        ArrayList suite = new ArrayList();
+        suite.Add(new OneTestCase());
+        suite.Add(new AssemblyTests());
+        suite.Add(new NoNamespaceTestFixture());
+        return suite;
+      }
+    }
+  }
+}
+</pre>
+
+</div>
+
+<h4>New Approach - Fixture Types</h4>
+
+<div class="code">
+
+<pre>namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  private class AllTests
+  {
+    [Suite]
+    public static IEnumerable Suite
+    {
+      get
+      {
+        ArrayList suite = new ArrayList();
+        suite.Add(typeof(OneTestCase));
+        suite.Add(typeof(AssemblyTests));
+        suite.Add(typeof(NoNamespaceTestFixture));
+        return suite;
+      }
+    }
+  }
+}
+</pre>
+
+</div>
+
+<h4>Limitations</h4>
+
+NUnit support for user-defined Suites currently has two limitations:
+
+<ol>
+	<li>It is not possible to include individual test cases directly
+	in a Suite using the new approach. Anyone wanting to do so will 
+	need to use the old approach and create an object derive from
+	NUnit.Core.TestCase. This is not recommended, since it requires
+	a reference to the core assembly.
+	
+	<li>Suites are currently not displayed in the Gui or run automatically
+	by either runner when they are encountered. The historical purpose of 
+	the Suite mechanism was to provide a way of aggregating tests at the
+	top level of each run. Hence, they are only supported when used with 
+	the /fixture option on the console or gui command line.
+</ol>
+
+Approaches to removing these limitations are being investigated as part
+of the planning for future NUnit releases.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="suite.html">Suite</a></li>
+<li><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/suiteBuilders.html b/doc/suiteBuilders.html
index 3796fab..af14ea5 100644
--- a/doc/suiteBuilders.html
+++ b/doc/suiteBuilders.html
@@ -1,106 +1,107 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - SuiteBuilders</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - SuiteBuilders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>SuiteBuilders (NUnit 2.4)</h3>
-
-<h4>Purpose</h4>
-<p>A SuiteBuilder is an addin used to build a test fixture from a type. NUnit itself
-uses a SuiteBuilder to recognize and build TestFixtures. 
-
-<h4>Extension Point</h4>
-<p>An addin may use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint suiteBuilders = host.GetExtensionPoint( "SuiteBuilders" );</pre>
-
-<h4>Interface</h4>
-<p>The extension object passed to Install must implement the ISuiteBuilder interface:
-
-<pre>
-	public interface ISuiteBuilder
-	{
-		bool CanBuildFrom( Type type );
-		Test BuildFrom( Type type );
-	}
-</pre>
-
-<p>CanBuildFrom should return true if the specified Type is one from which
-the builder is able to create a fixture. This usually involve examining
-the Type and its attriutes.
-
-<p>The BuildFrom method should return a test fixture completely populated
-with its contained test cases. Return null if it is not possible to 
-build a fixture using the provided Type.
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li id="current"><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li><a href="testDecorators.html">TestDecorators</a></li>
-<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li><a href="datapointProviders.html">DatapointProviders</a></li>
-<li><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>SuiteBuilders (NUnit 2.4)</h3>
+
+<h4>Purpose</h4>
+<p>A SuiteBuilder is an addin used to build a test fixture from a type. NUnit itself
+uses a SuiteBuilder to recognize and build TestFixtures. 
+
+<h4>Extension Point</h4>
+<p>An addin may use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint suiteBuilders = host.GetExtensionPoint( "SuiteBuilders" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement the ISuiteBuilder interface:
+
+<pre>
+	public interface ISuiteBuilder
+	{
+		bool CanBuildFrom( Type type );
+		Test BuildFrom( Type type );
+	}
+</pre>
+
+<p>CanBuildFrom should return true if the specified Type is one from which
+the builder is able to create a fixture. This usually involve examining
+the Type and its attriutes.
+
+<p>The BuildFrom method should return a test fixture completely populated
+with its contained test cases. Return null if it is not possible to 
+build a fixture using the provided Type.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li id="current"><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/teardown.html b/doc/teardown.html
index 6c04b53..25898fd 100644
--- a/doc/teardown.html
+++ b/doc/teardown.html
@@ -1,252 +1,253 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>TearDownAttribute (NUnit 2.0 / 2.5)</h3>
-
-<p>This attribute is used inside a TestFixture to provide a common set of 
-	functions that are performed after each test method is run.  
-    
-<p><b>Before NUnit 2.5</b>, a TestFixture could have only one TearDown method
-	and it was required to be an instance method. 
-	
-<p><b>Beginning with NUnit 2.5</b>, TearDown methods may be either static or
-   instance methods and you may define more than one of them in a fixture.
-   Normally, multiple TearDown methods are only defined at different levels
-   of an inheritance hierarchy, as explained below.
-
-<p>So long as any SetUp method runs without error, the TearDown method is 
-   guaranteed to run. It will not run if a SetUp method fails or throws an 
-   exception.</p>
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [SetUp] public void Init()
-    { /* ... */ }
-
-    [TearDown] public void Cleanup()
-    { /* ... */ }
-
-    [Test] public void Add()
-    { /* ... */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    <SetUp()> Public Sub Init()
-    ' ...
-    End Sub
-
-    <TearDown()> Public Sub Cleanup()
-    ' ...
-    End Sub
-
-    <Test()> Public Sub Add()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [SetUp] void Init();
-    [TearDown] void Cleanup();
-
-    [Test] void Add();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.SetUp() */
-  public void Init()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.TearDown() */
-  public void Cleanup()
-  { /* ... */ }
-
-  /** @attribute NUnit.Framework.Test() */
-  public void Add()
-  { /* ... */ }
-}
-</pre>
-
-</div>
-
-<h3>Inheritance</h3>
-
-<p>The TearDown attribute is inherited from any base class. Therefore, if a base 
-	class has defined a TearDown method, that method will be called 
-	after each test method in the derived class. 
-	
-<p>Before NUnit 2.5, you were permitted only one TearDown method. If you wanted to 
-   have some TearDown functionality in the base class and add more in the derived 
-   class you needed to call the base class method yourself.
-	
-<p>With NUnit 2.5, you can achieve the same result by defining a TearDown method
-   in the base class and another in the derived class. NUnit will call base
-   class TearDown methods after those in the derived classes.
-   
-<p><b>Note:</b> Although it is possible to define multiple TearDown methods
-   in the same class, you should rarely do so. Unlike methods defined in
-   separate classes in the inheritance hierarchy, the order in which they
-   are executed is not guaranteed.
-
-<h4>See also...</h4>
-<ul>
-<li><a href="setup.html">SetUpAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a></ul>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="teardown.html">Teardown</a></li>
-<li><a href="test.html">Test</a></li>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TearDownAttribute (NUnit 2.0 / 2.5)</h3>
+
+<p>This attribute is used inside a <a href="testFixture.html">TestFixture</a>  to provide a common set of functions that are performed after each test method. 
+  It is	also used inside a <a href="setupFixture.html">SetUpFixture</a></b>,
+  where it provides the same functionality at the level of a namespace or assembly.
+    
+<p><b>Before NUnit 2.5</b>, a class could have only one TearDown method
+	and it was required to be an instance method. 
+	
+<p><b>Beginning with NUnit 2.5</b>, TearDown methods may be either static or
+   instance methods and you may define more than one of them in a fixture.
+   Normally, multiple TearDown methods are only defined at different levels
+   of an inheritance hierarchy, as explained below.
+
+<p>So long as any SetUp method runs without error, the TearDown method is 
+   guaranteed to run. It will not run if a SetUp method fails or throws an 
+   exception.</p>
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [SetUp] public void Init()
+    { /* ... */ }
+
+    [TearDown] public void Cleanup()
+    { /* ... */ }
+
+    [Test] public void Add()
+    { /* ... */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    <SetUp()> Public Sub Init()
+    ' ...
+    End Sub
+
+    <TearDown()> Public Sub Cleanup()
+    ' ...
+    End Sub
+
+    <Test()> Public Sub Add()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [SetUp] void Init();
+    [TearDown] void Cleanup();
+
+    [Test] void Add();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.SetUp() */
+  public void Init()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.TearDown() */
+  public void Cleanup()
+  { /* ... */ }
+
+  /** @attribute NUnit.Framework.Test() */
+  public void Add()
+  { /* ... */ }
+}
+</pre>
+
+</div>
+
+<h3>Inheritance</h3>
+
+<p>The TearDown attribute is inherited from any base class. Therefore, if a base 
+	class has defined a TearDown method, that method will be called 
+	after each test method in the derived class. 
+	
+<p>Before NUnit 2.5, you were permitted only one TearDown method. If you wanted to 
+   have some TearDown functionality in the base class and add more in the derived 
+   class you needed to call the base class method yourself.
+	
+<p>With NUnit 2.5, you can achieve the same result by defining a TearDown method
+   in the base class and another in the derived class. NUnit will call base
+   class TearDown methods after those in the derived classes.
+   
+<p><b>Note:</b> Although it is possible to define multiple TearDown methods
+   in the same class, you should rarely do so. Unlike methods defined in
+   separate classes in the inheritance hierarchy, the order in which they
+   are executed is not guaranteed.
+
+<h4>See also...</h4>
+<ul>
+<li><a href="setup.html">SetUpAttribute</a><li><a href="fixtureSetup.html">TestFixtureSetUpAttribute</a><li><a href="fixtureTeardown.html">TestFixtureTearDownAttribute</a><li><a href="setupFixture.html">SetUpFixtureAttribute</a></ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="teardown.html">Teardown</a></li>
+<li><a href="test.html">Test</a></li>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/test.html b/doc/test.html
index 8e26276..4810316 100644
--- a/doc/test.html
+++ b/doc/test.html
@@ -1,228 +1,234 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>TestAttribute (NUnit 2.0 / 2.5)</h3>
-
-<p>The Test attribute is one way of marking a method inside a TestFixture class
-    as a test. For backwards compatibility with previous versions of Nunit a 
-	test method may also be found if the first 4 letters are "test" 
-	regardless of case. This option is available by setting a value in
-	the config file for the test.</p>
-	
-<p>Prior to NUnit 2.5, the signature for a test method was:
-	<pre>        public void MethodName()</pre></p>
-	
-<p>Beginning with NUnit 2.5, static methods may be used as tests:
-	<pre>        public static void MethodName()</pre></p>
-	
-<p>In addition, with 2.5, test methods may have arguments and return
-   values, provided that NUnit is told what values to use for the
-   arguments and how to handle the return value. For more information
-   on these capabilities, see 
-   <a href="parameterizedTests.html">Parameterized Tests</a>   as well as some of the related attributes
-   listed at the end of this page.
-   
-<p>Parameterized test methods may also be generic, provided that 
-   NUnit is able to deduce the proper argument types from the
-   types of the data arguments supplied.
-	
-<p>If the programmer marks a test method that does not have the correct signature 
-   it will be considered as not runnable and be indicated as such by the console
-   or gui runner. In the Gui, such tests are marked in red.</p> 
-
-<p>In the examples on this page, NUnit would have no way of knowing what values 
-   to supply as arguments, so methods without parameters are used.
-   
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    [Test] public void Add()
-    { /* ... */ }
-
-    public void TestSubtract()
-    { /* backwards compatibility */ }
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    <Test()> Public Sub Add()
-    ' ...
-    End Sub
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    [Test] void Add();
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  /** @attribute NUnit.Framework.Test() */
-  public void Add()
-  { /* ... */ }
-}
-</pre>
-</div>
-
-<h4>See also...</h4>
-
-<ul>
-<li><a href="parameterizedTests.html">Parameterized Tests</a><li><a href="testCase.html">TestCaseAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="test.html">Test</a></li>
-<ul>
-<li><a href="parameterizedTests.html">Parameterized Tests</a></li>
-</ul>
-<li><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TestAttribute (NUnit 2.0 / 2.5 / 2.6)</h3>
+
+<p>The Test attribute is one way of marking a method inside a TestFixture class
+    as a test. For backwards compatibility with previous versions of Nunit a 
+	test method may also be found if the first 4 letters are "test" 
+	regardless of case. This option is available by setting a value in
+	the config file for the test.</p>
+	
+<p>Prior to NUnit 2.5, the signature for a test method was:
+	<pre>        public void MethodName()</pre></p>
+	
+<p>Beginning with NUnit 2.5, static methods may be used as tests:
+	<pre>        public static void MethodName()</pre></p>
+	
+<p>In addition, with 2.5, test methods may have arguments and return
+   values, provided that NUnit is told what values to use for the
+   arguments and how to handle the return value. For more information
+   on these capabilities, see 
+   <a href="parameterizedTests.html">Parameterized Tests</a>   as well as some of the related attributes
+   listed at the end of this page.
+   
+<p>Parameterized test methods may also be generic, provided that 
+   NUnit is able to deduce the proper argument types from the
+   types of the data arguments supplied.
+   
+<p>Beginning with NUnit 2.6.2, test methods targetting .Net 4.5 may be 
+   marked as <b>async</b> and NUnit will wait for the method to complete 
+   before recording the result and moving on to the next test.<b>Async</b> 
+   test methods may return <b>void</b> or <b>Task</b> if no value is returned,
+   or <b>Task<T></b> if a value of type <b>T</b> is returned.
+	
+<p>If the programmer marks a test method that does not have the correct signature 
+   it will be considered as not runnable and be indicated as such by the console
+   or gui runner. In the Gui, such tests are marked in red.</p> 
+
+<p>In the examples on this page, NUnit would have no way of knowing what values 
+   to supply as arguments, so methods without parameters are used.
+   
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    [Test] public void Add()
+    { /* ... */ }
+
+    public void TestSubtract()
+    { /* backwards compatibility */ }
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    <Test()> Public Sub Add()
+    ' ...
+    End Sub
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    [Test] void Add();
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  /** @attribute NUnit.Framework.Test() */
+  public void Add()
+  { /* ... */ }
+}
+</pre>
+</div>
+
+<h4>See also...</h4>
+
+<ul>
+<li><a href="parameterizedTests.html">Parameterized Tests</a><li><a href="testCase.html">TestCaseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="test.html">Test</a></li>
+<ul>
+<li><a href="parameterizedTests.html">Parameterized Tests</a></li>
+</ul>
+<li><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testCase.html b/doc/testCase.html
index a2811e6..5e3cc3b 100644
--- a/doc/testCase.html
+++ b/doc/testCase.html
@@ -1,30 +1,30 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - TestCase</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestCase</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
 <h3>TestCaseAttribute (NUnit 2.5)</h3>
@@ -113,83 +113,83 @@ the method name and the arguments provided.
 <p>As a result, when <b>TestCaseAttribute</b> appears multiple times on a method
    or when other data-providing attributes are used in combination with 
    <b>TestCaseAttribute</b>, the order of the test cases is undefined.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="testCase.html">TestCase</a></li>
-<li><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="testCase.html">TestCase</a></li>
+<li><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testCaseSource.html b/doc/testCaseSource.html
index 11d7532..34f8f52 100644
--- a/doc/testCaseSource.html
+++ b/doc/testCaseSource.html
@@ -1,37 +1,51 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - TestCaseSource</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestCaseSource</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
 <script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
 
 <h3>TestCaseSourceAttribute (NUnit 2.5)</h3>
 
 <p><b>TestCaseSourceAttribute</b> is used on a parameterized test method to
 identify the property, method or field that will provide the required 
-arguments. The attribute has two public constructors.
+arguments. The attribute has three public constructors.
+
+<div class="code">
+<pre>
+TestCaseSourceAttribute(Type sourceType);
+</pre>
+</div>
+
+<p>The <b>sourceType</b> argument represents the class that provides test cases.
+It must implement <b>IEnumerable</b> and return test case data appropriate for
+the test method on which the attribute appears.
+
+<p>This is a new form of the attribute in NUnit 2.6.2 and is recommended for
+use in preference to other forms because it doesn't use a string to specify
+the data source and is therefore more easily refactored.
 
 <div class="code">
 <pre>
@@ -40,7 +54,8 @@ TestCaseSourceAttribute(string sourceName);
 </pre>
 </div>
 
-<p>If <b>sourceType</b> is specified, it represents the class that provides
+<p>These older constructors are no longer recommended. If a <b>sourceType</b>
+is specified, it represents the class that provides
 the test cases. It must have a default constructor.
 
 <p>If <b>sourceType</b> is not specified, the class containing the test
@@ -73,7 +88,7 @@ the enumerator as follows:
 <ol>
 
 <li><p>If it is an object implementing <b>NUnit.Framework.ITestCaseData</b>, 
-its properties are used to provide the test case. In NUnit 2.5, this is
+its properties are used to provide the test case. In NUnit 2.5 and later, this is
 done using reflection to allow compatibility with earlier versions that
 did not implement <b>ITestCaseData</b>.
 
@@ -267,83 +282,83 @@ these two phases - or between different runs - except through the parameters
 themselves.
 
    
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="testCaseSource.html">TestCaseSource</a></li>
-<li><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="testCaseSource.html">TestCaseSource</a></li>
+<li><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testContext.html b/doc/testContext.html
index c6c3e65..96726aa 100644
--- a/doc/testContext.html
+++ b/doc/testContext.html
@@ -1,30 +1,30 @@
-<!-- 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>
+<!-- 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">
-
+  </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.
@@ -89,44 +89,44 @@ is created separately for each test before it begins execution.
 <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>
+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.3</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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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 d124c72..501c472 100644
--- a/doc/testDecorators.html
+++ b/doc/testDecorators.html
@@ -1,117 +1,118 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - TestDecorators</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestDecorators</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>TestDecorators (NUnit 2.4)</h3>
-
-<h4>Purpose</h4>
-<p>TestDecorators are able to modify a test after it has been constructed.
-
-<h4>Extension Point</h4>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );</pre>
-
-<h4>Interface</h4>
-<p>The extension object passed to Install must implement the ITestDecorator interface:
-
-<pre>
-	public interface ITestDecorator
-	{
-		Test Decorate( Test test, MemberInfo member );
-	}
-</pre>
-
-<p>The Decorate method may do several things, depending on what it needs
-to accomplish:
-<ol>
-  <li>Return test unmodified
-  <li>Modify properties of the test object and return it
-  <li>Replace test with another object, either discarding the
-  original or aggregating it in the new test.
-</ol>
-
-<p>Depending on what the decorator does, it may need to run
-ahead of other decorators or after them. Decorators should
-be installed using the Install method overload that takes
-a priority. The priorities range from 1 to 9 and decorators
-with lower priority values are installed first. The following
-standard values are defined for use if desired:
-<ul>
-<li>DecoratorPriority.Default = 0
-<li>DecoratorPriority.First = 1
-<li>DecoratorPriority.Normal = 5
-<li>DecoratorPriority.Last = 9
-</ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li id="current"><a href="testDecorators.html">TestDecorators</a></li>
-<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li><a href="datapointProviders.html">DatapointProviders</a></li>
-<li><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TestDecorators (NUnit 2.4)</h3>
+
+<h4>Purpose</h4>
+<p>TestDecorators are able to modify a test after it has been constructed.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint testDecorators = host.GetExtensionPoint( "TestDecorators" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement the ITestDecorator interface:
+
+<pre>
+	public interface ITestDecorator
+	{
+		Test Decorate( Test test, MemberInfo member );
+	}
+</pre>
+
+<p>The Decorate method may do several things, depending on what it needs
+to accomplish:
+<ol>
+  <li>Return test unmodified
+  <li>Modify properties of the test object and return it
+  <li>Replace test with another object, either discarding the
+  original or aggregating it in the new test.
+</ol>
+
+<p>Depending on what the decorator does, it may need to run
+ahead of other decorators or after them. Decorators should
+be installed using the Install method overload that takes
+a priority. The priorities range from 1 to 9 and decorators
+with lower priority values are installed first. The following
+standard values are defined for use if desired:
+<ul>
+<li>DecoratorPriority.Default = 0
+<li>DecoratorPriority.First = 1
+<li>DecoratorPriority.Normal = 5
+<li>DecoratorPriority.Last = 9
+</ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li id="current"><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testFixture.html b/doc/testFixture.html
index c52d0d9..cff5a9a 100644
--- a/doc/testFixture.html
+++ b/doc/testFixture.html
@@ -1,442 +1,442 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- End Standard Head Part -->
+
+<body>
+
+<!-- Standard Header for NUnit.org -->
+<div id="header">
+  <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a>
   <div id="nav">
     <a href="http://www.nunit.org">NUnit</a>
     <a class="active" href="index.html">Documentation</a>
-  </div>
-</div>
-<!-- End of Header -->
-
-<div id="content">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>TestFixtureAttribute (NUnit 2.0 / 2.5)</h3>
-
-<p>This is the attribute that marks a class that contains tests and, optionally, 
-	setup or teardown methods. NUnit 2.5 introduces parameterized and generic
-	test fixtures - see below.</p>
-	
-<p>Most restrictions on a class that is used as a test fixture have now been
-   eliminated. As of NUnit 2.5.3, a test fixture class:
-	<ul>
-		<li>May be public, protected, private or internal.
-		<li>May be a static class in .NET 2.0 or later.
-		<li>May be generic, so long as any type parameters are provided or
-		    can be inferred from the actual arguments.
-		<li>May not be abstract - although the attribute may be applied to an
-		    abstract class intended to serve as a base class for test fixtures.
-		<li>If no arguments are provided with the TestFixtureAttribute, the class
-		     must have a default constructor. 
-		<li>If arguments are provided, they must match one of the constructors.
-	</ul>
-</p>
-
-<p>If any of these restrictions are violated, the class is not runnable
-   as a test and will display as an error.</p>
-
-<p>It is advisable that the constructor not have any side effects, 
-   since NUnit may construct the object multiple times in the course of a session.</li>
-
-<p>Beginning with NUnit 2.5, the <b>TestFixture</b> attribute is optional
-   for non-parameterized, non-generic fixtures. So long as the class contains
-   at least one method marked with the <b>Test</b>, <b>TestCase</b> or 
-   <b>TestCaseSource</b> attribute, it will be treated as a test fixture.
-
-<h4>Example:</h4>
-
-<div class="code">
-
-<div class="langFilter">
-	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
-	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
-		<a href="javascript:ShowCS()">C#</a><br>
-		<a href="javascript:ShowVB()">VB</a><br>
-		<a href="javascript:ShowMC()">C++</a><br>
-		<a href="javascript:ShowJS()">J#</a><br>
-	</div>
-</div>
-
-<pre class="cs">namespace NUnit.Tests
-{
-  using System;
-  using NUnit.Framework;
-
-  [TestFixture]
-  public class SuccessTests
-  {
-    // ...
-  }
-}
-</pre>
-
-<pre class="vb">Imports System
-Imports Nunit.Framework
-
-Namespace Nunit.Tests
-
-  <TestFixture()> Public Class SuccessTests
-    ' ...
-  End Class
-End Namespace
-</pre>
-
-<pre class="mc">#using <Nunit.Framework.dll>
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitTests
-{
-  [TestFixture]
-  public __gc class SuccessTests
-  {
-    // ...
-  };
-}
-
-#include "cppsample.h"
-
-namespace NUnitTests {
-  // ...
-}
-</pre>
-
-<pre class="js">package NUnit.Tests;
-
-import System.*;
-import NUnit.Framework.TestFixture;
-
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SuccessTests
-{
-  // ...
-}
-</pre>
-
-</div>
-
-<h3>Inheritance</h3>
-
-<p>The <b>TestFixtureAttribute</b> may be applied to a base class and is
-inherited by any derived classes. This includes any abstract base class,
-so the well-known Abstract Fixture pattern may be implemented if desired.
-
-<p>In order to facilitate use of generic and/or parameterized classes,
-where the derived class may require a different number of arguments (or
-type arguments) from the base class, superfluous <b>TestFixture</b> 
-attributes are ignored, using the following rules:
-
-<ol>
-<li>If all TestFixture attributes provide constructor or type arguments, 
-then all of them are used.
-<li>If some of the attributes provide arguments and others do not, then
-only those with arguments are used and those without arguments are ignored.
-<li>If none of the attributes provide arguments, one of them is selected
-for use by NUnit. It is not possible to predict which will be used, so
-this situation should generally be avoided.
-</ol>
-
-This permits code like the following, which would cause an error if the
-attribute on the base class were not ignored.
-
-<div class="code">
-<pre>[TestFixture]
-public class AbstractFixtureBase
-{
-    ...
-}
-
-[TestFixture(typeof(string))]
-public class DerivedFixture<T> : AbstractFixtureBase
-{
-    ...
-}
-</pre>
-</div>
-
-<h3>Parameterized Test Fixtures (NUnit 2.5)</h3>
-
-<p>Beginning with NUnit 2.5, test fixtures may take constructor arguments.
-   Argument values are specified as arguments to the <b>TestFixture</b>
-   attribute. NUnit will construct a separate instance of the fixture
-   for each set of arguments.
-   
-<p>Individual fixture instances in a set of parameterized fixtures may be ignored. 
-   Set the <b>Ignore</b> named parameter of the attribute to true or set 
-   <b>IgnoreReason</b> to a non-empty string.
-
-<p>Individual fixture instances may be given categories as well. Set the <b>Category</b>
-   named parameter of the attribute to the name of the category or to a comma-separated
-   list of categories.
-   
-<h4>Example</h4>
-
-<p>The following test fixture would be instantiated by NUnit three times,
-   passing in each set of arguments to the appropriate constructor. Note
-   that there are three different constructors, matching the data types
-   provided as arguments.
-   
-<div class="code"><pre>
-[TestFixture("hello", "hello", "goodbye")]
-[TestFixture("zip", "zip")]
-[TestFixture(42, 42, 99)]
-public class ParameterizedTestFixture
-{
-    private string eq1;
-    private string eq2;
-    private string neq;
-    
-    public ParameterizedTestFixture(string eq1, string eq2, string neq)
-    {
-        this.eq1 = eq1;
-        this.eq2 = eq2;
-        this.neq = neq;
-    }
-
-    public ParameterizedTestFixture(string eq1, string eq2)
-        : this(eq1, eq2, null) { }
-
-    public ParameterizedTestFixture(int eq1, int eq2, int neq)
-    {
-        this.eq1 = eq1.ToString();
-        this.eq2 = eq2.ToString();
-        this.neq = neq.ToString();
-    }
-
-    [Test]
-    public void TestEquality()
-    {
-        Assert.AreEqual(eq1, eq2);
-        if (eq1 != null && eq2 != null)
-            Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
-    }
-
-    [Test]
-    public void TestInequality()
-    {
-        Assert.AreNotEqual(eq1, neq);
-        if (eq1 != null && neq != null)
-            Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
-    }
-}
-</pre></div>
-
-<h3>Generic Test Fixtures (NUnit 2.5)</h3>
-
-<p>Beginning with NUnit 2.5, you may also use a generic class as a test fixture.
-   In order for NUnit to instantiate the fixture, you must either specify the 
-   types to be used as arguments to <b>TestFixtureAttribute</b> or use the
-   named parameter <b>TypeArgs=</b> to specify them. NUnit will construct a
-   separate instance of the fixture for each <b>TestFixtureAttribute</b> 
-   you provide.
-   
-<h4>Example</h4>
-
-<p>The following test fixture would be instantiated by NUnit twice,
-   once using an ArrayList and once using a List<int>.
-   
-<div class="code"><pre>
-[TestFixture(typeof(ArrayList))]
-[TestFixture(typeof(List<int>))]
-public class IList_Tests<TList> where TList : IList, new()
-{
-  private IList list;
-
-  [SetUp]
-  public void CreateList()
-  {
-    this.list = new TList();
-  }
-
-  [Test]
-  public void CanAddToList()
-  {
-    list.Add(1); list.Add(2); list.Add(3);
-    Assert.AreEqual(3, list.Count);
-  }
-}</pre></div>
-
-<h3>Generic Test Fixtures with Parameters (NUnit 2.5)</h3>
-
-<p>If a Generic fixture, uses constructor arguments, there are three
-   approaches to telling NUnit which arguments are type parameters 
-   and which are normal constructor parameters.
-   <ol>
-   <li>Specify both sets of parameters as arguments to the <b>TestFixtureAttribute</b>.
-       Leading <b>System.Type</b> arguments are used as type parameters, while
-	   any remaining arguments are used to construct the instance. In the
-	   following example, this leads to some obvious duplication...
-
-<div class="code"><pre>
-[TestFixture(typeof(double), typeof(int), 100.0, 42)]
-[TestFixture(typeof(int) typeof(double), 42, 100.0)]
-public class SpecifyBothSetsOfArgs<T1, T2>
-{
-    T1 t1;
-    T2 t2;
-
-    public SpecifyBothSetsOfArgs(T1 t1, T2 t2)
-    {
-        this.t1 = t1;
-        this.t2 = t2;
-    }
-
-    [TestCase(5, 7)]
-    public void TestMyArgTypes(T1 t1, T2 t2)
-    {
-        Assert.That(t1, Is.TypeOf<T1>());
-        Assert.That(t2, Is.TypeOf<T2>());
-    }
-}</pre></div>
-
-   <li>Specify normal parameters as arguments to <b>TestFixtureAttribute</b>
-       and use the named parameter <b>TypeArgs=</b> to specify the type
-	   arguments. Again, for this example, the type info is duplicated, but
-	   it is at least more cleanly separated from the normal arguments...
-
-<div class="code" style="width: 40em"><pre>
-[TestFixture(100.0, 42, TypeArgs=new Type[] {typeof(double), typeof(int) } )]
-[TestFixture(42, 100.0, TypeArgs=new Type[] {typeof(int), typeof(double) } )]
-public class SpecifyTypeArgsSeparately<T1, T2>
-{
-    T1 t1;
-    T2 t2;
-
-    public SpecifyTypeArgsSeparately(T1 t1, T2 t2)
-    {
-        this.t1 = t1;
-        this.t2 = t2;
-    }
-
-    [TestCase(5, 7)]
-    public void TestMyArgTypes(T1 t1, T2 t2)
-    {
-        Assert.That(t1, Is.TypeOf<T1>());
-        Assert.That(t2, Is.TypeOf<T2>());
-    }
-}</pre></div>
-
-   <li>In some cases, when the constructor makes use of all the type parameters 
-       NUnit may simply be able to deduce them from the arguments provided. 
-	   That's the case here and the following is the preferred way to
-	   write this example...
-   
-<div class="code"><pre>
-[TestFixture(100.0, 42)]
-[TestFixture(42, 100.0)]
-public class DeduceTypeArgsFromArgs<T1, T2>
-{
-    T1 t1;
-    T2 t2;
-
-    public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
-    {
-        this.t1 = t1;
-        this.t2 = t2;
-    }
-
-    [TestCase(5, 7)]
-    public void TestMyArgTypes(T1 t1, T2 t2)
-    {
-        Assert.That(t1, Is.TypeOf<T1>());
-        Assert.That(t2, Is.TypeOf<T2>());
-    }
-}</pre></div>
-   </ol> 
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="testFixture.html">TestFixture</a></li>
-<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
-<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
-<li><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>TestFixtureAttribute (NUnit 2.0 / 2.5)</h3>
+
+<p>This is the attribute that marks a class that contains tests and, optionally, 
+	setup or teardown methods. NUnit 2.5 introduces parameterized and generic
+	test fixtures - see below.</p>
+	
+<p>Most restrictions on a class that is used as a test fixture have now been
+   eliminated. As of NUnit 2.5.3, a test fixture class:
+	<ul>
+		<li>May be public, protected, private or internal.
+		<li>May be a static class in .NET 2.0 or later.
+		<li>May be generic, so long as any type parameters are provided or
+		    can be inferred from the actual arguments.
+		<li>May not be abstract - although the attribute may be applied to an
+		    abstract class intended to serve as a base class for test fixtures.
+		<li>If no arguments are provided with the TestFixtureAttribute, the class
+		     must have a default constructor. 
+		<li>If arguments are provided, they must match one of the constructors.
+	</ul>
+</p>
+
+<p>If any of these restrictions are violated, the class is not runnable
+   as a test and will display as an error.</p>
+
+<p>It is advisable that the constructor not have any side effects, 
+   since NUnit may construct the object multiple times in the course of a session.</li>
+
+<p>Beginning with NUnit 2.5, the <b>TestFixture</b> attribute is optional
+   for non-parameterized, non-generic fixtures. So long as the class contains
+   at least one method marked with the <b>Test</b>, <b>TestCase</b> or 
+   <b>TestCaseSource</b> attribute, it will be treated as a test fixture.
+
+<h4>Example:</h4>
+
+<div class="code">
+
+<div class="langFilter">
+	<a href="javascript:Show('DD1')" onmouseover="Show('DD1')"><img src="img/langFilter.gif" width="14" height="14" alt="Language Filter"></a>
+	<div id="DD1" class="dropdown" style="display: none;" onclick="Hide('DD1')">
+		<a href="javascript:ShowCS()">C#</a><br>
+		<a href="javascript:ShowVB()">VB</a><br>
+		<a href="javascript:ShowMC()">C++</a><br>
+		<a href="javascript:ShowJS()">J#</a><br>
+	</div>
+</div>
+
+<pre class="cs">namespace NUnit.Tests
+{
+  using System;
+  using NUnit.Framework;
+
+  [TestFixture]
+  public class SuccessTests
+  {
+    // ...
+  }
+}
+</pre>
+
+<pre class="vb">Imports System
+Imports Nunit.Framework
+
+Namespace Nunit.Tests
+
+  <TestFixture()> Public Class SuccessTests
+    ' ...
+  End Class
+End Namespace
+</pre>
+
+<pre class="mc">#using <Nunit.Framework.dll>
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitTests
+{
+  [TestFixture]
+  public __gc class SuccessTests
+  {
+    // ...
+  };
+}
+
+#include "cppsample.h"
+
+namespace NUnitTests {
+  // ...
+}
+</pre>
+
+<pre class="js">package NUnit.Tests;
+
+import System.*;
+import NUnit.Framework.TestFixture;
+
+
+/** @attribute NUnit.Framework.TestFixture() */
+public class SuccessTests
+{
+  // ...
+}
+</pre>
+
+</div>
+
+<h3>Inheritance</h3>
+
+<p>The <b>TestFixtureAttribute</b> may be applied to a base class and is
+inherited by any derived classes. This includes any abstract base class,
+so the well-known Abstract Fixture pattern may be implemented if desired.
+
+<p>In order to facilitate use of generic and/or parameterized classes,
+where the derived class may require a different number of arguments (or
+type arguments) from the base class, superfluous <b>TestFixture</b> 
+attributes are ignored, using the following rules:
+
+<ol>
+<li>If all TestFixture attributes provide constructor or type arguments, 
+then all of them are used.
+<li>If some of the attributes provide arguments and others do not, then
+only those with arguments are used and those without arguments are ignored.
+<li>If none of the attributes provide arguments, one of them is selected
+for use by NUnit. It is not possible to predict which will be used, so
+this situation should generally be avoided.
+</ol>
+
+This permits code like the following, which would cause an error if the
+attribute on the base class were not ignored.
+
+<div class="code">
+<pre>[TestFixture]
+public class AbstractFixtureBase
+{
+    ...
+}
+
+[TestFixture(typeof(string))]
+public class DerivedFixture<T> : AbstractFixtureBase
+{
+    ...
+}
+</pre>
+</div>
+
+<h3>Parameterized Test Fixtures (NUnit 2.5)</h3>
+
+<p>Beginning with NUnit 2.5, test fixtures may take constructor arguments.
+   Argument values are specified as arguments to the <b>TestFixture</b>
+   attribute. NUnit will construct a separate instance of the fixture
+   for each set of arguments.
+   
+<p>Individual fixture instances in a set of parameterized fixtures may be ignored. 
+   Set the <b>Ignore</b> named parameter of the attribute to true or set 
+   <b>IgnoreReason</b> to a non-empty string.
+
+<p>Individual fixture instances may be given categories as well. Set the <b>Category</b>
+   named parameter of the attribute to the name of the category or to a comma-separated
+   list of categories.
+   
+<h4>Example</h4>
+
+<p>The following test fixture would be instantiated by NUnit three times,
+   passing in each set of arguments to the appropriate constructor. Note
+   that there are three different constructors, matching the data types
+   provided as arguments.
+   
+<div class="code"><pre>
+[TestFixture("hello", "hello", "goodbye")]
+[TestFixture("zip", "zip")]
+[TestFixture(42, 42, 99)]
+public class ParameterizedTestFixture
+{
+    private string eq1;
+    private string eq2;
+    private string neq;
+    
+    public ParameterizedTestFixture(string eq1, string eq2, string neq)
+    {
+        this.eq1 = eq1;
+        this.eq2 = eq2;
+        this.neq = neq;
+    }
+
+    public ParameterizedTestFixture(string eq1, string eq2)
+        : this(eq1, eq2, null) { }
+
+    public ParameterizedTestFixture(int eq1, int eq2, int neq)
+    {
+        this.eq1 = eq1.ToString();
+        this.eq2 = eq2.ToString();
+        this.neq = neq.ToString();
+    }
+
+    [Test]
+    public void TestEquality()
+    {
+        Assert.AreEqual(eq1, eq2);
+        if (eq1 != null && eq2 != null)
+            Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
+    }
+
+    [Test]
+    public void TestInequality()
+    {
+        Assert.AreNotEqual(eq1, neq);
+        if (eq1 != null && neq != null)
+            Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
+    }
+}
+</pre></div>
+
+<h3>Generic Test Fixtures (NUnit 2.5)</h3>
+
+<p>Beginning with NUnit 2.5, you may also use a generic class as a test fixture.
+   In order for NUnit to instantiate the fixture, you must either specify the 
+   types to be used as arguments to <b>TestFixtureAttribute</b> or use the
+   named parameter <b>TypeArgs=</b> to specify them. NUnit will construct a
+   separate instance of the fixture for each <b>TestFixtureAttribute</b> 
+   you provide.
+   
+<h4>Example</h4>
+
+<p>The following test fixture would be instantiated by NUnit twice,
+   once using an ArrayList and once using a List<int>.
+   
+<div class="code"><pre>
+[TestFixture(typeof(ArrayList))]
+[TestFixture(typeof(List<int>))]
+public class IList_Tests<TList> where TList : IList, new()
+{
+  private IList list;
+
+  [SetUp]
+  public void CreateList()
+  {
+    this.list = new TList();
+  }
+
+  [Test]
+  public void CanAddToList()
+  {
+    list.Add(1); list.Add(2); list.Add(3);
+    Assert.AreEqual(3, list.Count);
+  }
+}</pre></div>
+
+<h3>Generic Test Fixtures with Parameters (NUnit 2.5)</h3>
+
+<p>If a Generic fixture, uses constructor arguments, there are three
+   approaches to telling NUnit which arguments are type parameters 
+   and which are normal constructor parameters.
+   <ol>
+   <li>Specify both sets of parameters as arguments to the <b>TestFixtureAttribute</b>.
+       Leading <b>System.Type</b> arguments are used as type parameters, while
+	   any remaining arguments are used to construct the instance. In the
+	   following example, this leads to some obvious duplication...
+
+<div class="code"><pre>
+[TestFixture(typeof(double), typeof(int), 100.0, 42)]
+[TestFixture(typeof(int) typeof(double), 42, 100.0)]
+public class SpecifyBothSetsOfArgs<T1, T2>
+{
+    T1 t1;
+    T2 t2;
+
+    public SpecifyBothSetsOfArgs(T1 t1, T2 t2)
+    {
+        this.t1 = t1;
+        this.t2 = t2;
+    }
+
+    [TestCase(5, 7)]
+    public void TestMyArgTypes(T1 t1, T2 t2)
+    {
+        Assert.That(t1, Is.TypeOf<T1>());
+        Assert.That(t2, Is.TypeOf<T2>());
+    }
+}</pre></div>
+
+   <li>Specify normal parameters as arguments to <b>TestFixtureAttribute</b>
+       and use the named parameter <b>TypeArgs=</b> to specify the type
+	   arguments. Again, for this example, the type info is duplicated, but
+	   it is at least more cleanly separated from the normal arguments...
+
+<div class="code" style="width: 40em"><pre>
+[TestFixture(100.0, 42, TypeArgs=new Type[] {typeof(double), typeof(int) } )]
+[TestFixture(42, 100.0, TypeArgs=new Type[] {typeof(int), typeof(double) } )]
+public class SpecifyTypeArgsSeparately<T1, T2>
+{
+    T1 t1;
+    T2 t2;
+
+    public SpecifyTypeArgsSeparately(T1 t1, T2 t2)
+    {
+        this.t1 = t1;
+        this.t2 = t2;
+    }
+
+    [TestCase(5, 7)]
+    public void TestMyArgTypes(T1 t1, T2 t2)
+    {
+        Assert.That(t1, Is.TypeOf<T1>());
+        Assert.That(t2, Is.TypeOf<T2>());
+    }
+}</pre></div>
+
+   <li>In some cases, when the constructor makes use of all the type parameters 
+       NUnit may simply be able to deduce them from the arguments provided. 
+	   That's the case here and the following is the preferred way to
+	   write this example...
+   
+<div class="code"><pre>
+[TestFixture(100.0, 42)]
+[TestFixture(42, 100.0)]
+public class DeduceTypeArgsFromArgs<T1, T2>
+{
+    T1 t1;
+    T2 t2;
+
+    public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
+    {
+        this.t1 = t1;
+        this.t2 = t2;
+    }
+
+    [TestCase(5, 7)]
+    public void TestMyArgTypes(T1 t1, T2 t2)
+    {
+        Assert.That(t1, Is.TypeOf<T1>());
+        Assert.That(t2, Is.TypeOf<T2>());
+    }
+}</pre></div>
+   </ol> 
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="testFixture.html">TestFixture</a></li>
+<li><a href="fixtureSetup.html">TestFixtureSetUp</a></li>
+<li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li>
+<li><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testProperties.html b/doc/testProperties.html
index ef1b8bb..107e629 100644
--- a/doc/testProperties.html
+++ b/doc/testProperties.html
@@ -1,92 +1,93 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Test Properties Dialog</h2>
-
-<p>The test properties dialog is displayed using either the View | Properties menu item on the main
-menu or the Properties item on the context menu. It shows information about the test and � if it
-has been run � about the results. The dialog contains a �pin� button in the upper right corner,
-which causes it to remain open as the user clicks on different tests.</p>
-
-<div class="screenshot-left">
-   <img src="img/testProperties.jpg"></div>
-
-</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>
-<ul>
-<li><a href="nunit-console.html">Console Runner</a></li>
-<li><a href="nunit-gui.html">Gui Runner</a></li>
-<ul>
-<li><a href="guiCommandLine.html">Command-Line</a></li>
-<li><a href="mainMenu.html">Main Menu</a></li>
-<li><a href="contextMenu.html">Context Menu</a></li>
-<li><a href="settingsDialog.html">Settings Dialog</a></li>
-<li><a href="addinsDialog.html">Addins Dialog</a></li>
-<li id="current"><a href="testProperties.html">Test Properties</a></li>
-<li><a href="configEditor.html">Configuration Editor</a></li>
-</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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Test Properties Dialog</h2>
+
+<p>The test properties dialog is displayed using either the View | Properties menu item on the main
+menu or the Properties item on the context menu. It shows information about the test and � if it
+has been run � about the results. The dialog contains a �pin� button in the upper right corner,
+which causes it to remain open as the user clicks on different tests.</p>
+
+<div class="screenshot-left">
+   <img src="img/testProperties.jpg"></div>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="nunit-console.html">Console Runner</a></li>
+<li><a href="nunit-gui.html">Gui Runner</a></li>
+<ul>
+<li><a href="guiCommandLine.html">Command-Line</a></li>
+<li><a href="mainMenu.html">Main Menu</a></li>
+<li><a href="contextMenu.html">Context Menu</a></li>
+<li><a href="settingsDialog.html">Settings Dialog</a></li>
+<li><a href="addinsDialog.html">Addins Dialog</a></li>
+<li id="current"><a href="testProperties.html">Test Properties</a></li>
+<li><a href="configEditor.html">Configuration Editor</a></li>
+</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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testcaseBuilders.html b/doc/testcaseBuilders.html
index 34986d2..58c08ff 100644
--- a/doc/testcaseBuilders.html
+++ b/doc/testcaseBuilders.html
@@ -1,117 +1,118 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - TestcaseBuilders</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestcaseBuilders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>TestCaseBuilders (NUnit 2.4)</h3>
-
-<h4>Purpose</h4>
-<p>TestCaseBuilders create Tests based on a MethodInfo. NUnit uses several
-TestCaseBuilders internally to create various kinds of TestMethods.
-
-<h4>Extension Point</h4>
-Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint testCaseBuilders = host.GetExtensionPoint( "TestCaseBuilders" );</pre>
-
-<h4>Interfaces</h4>
-<p>The extension object passed to Install must implement either the ITestCaseBuilder 
-or the ITestCaseBuilder2 interface:
-
-<pre>
-	public interface ITestCaseBuilder
-	{
-		bool CanBuildFrom( MethodInfo method );
-		Test BuildFrom( MethodInfo method );
-	}
-
-	public interface ITestCaseBuilder2 : ITestCaseBuilder
-	{
-		bool CanBuildFrom( MethodInfo method, Test suite );
-		Test BuildFrom( MethodInfo method, Test suite );
-	}
-</pre>
-
-<p>NUnit will call ITestCaseBuilder2 if it is available. Otherwise
-ITestCaseBuilder will be used.
-
-<p>The CanBuildFrom method should return true if the addin can build
-a test from the MethodInfo provided. Some TestCaseBuilder addins are only 
-intended to apply to methods within a specific type of fixture. The
-suite argument of the ITestCaseBuilder2 interface may be used to make
-this determination.
-
-<p>The BuildFrom method should return a test constructed over the MethodInfo
-provided as an argument or null if the method cannot be used.
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li id="current"><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li><a href="testDecorators.html">TestDecorators</a></li>
-<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li><a href="datapointProviders.html">DatapointProviders</a></li>
-<li><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TestCaseBuilders (NUnit 2.4)</h3>
+
+<h4>Purpose</h4>
+<p>TestCaseBuilders create Tests based on a MethodInfo. NUnit uses several
+TestCaseBuilders internally to create various kinds of TestMethods.
+
+<h4>Extension Point</h4>
+Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint testCaseBuilders = host.GetExtensionPoint( "TestCaseBuilders" );</pre>
+
+<h4>Interfaces</h4>
+<p>The extension object passed to Install must implement either the ITestCaseBuilder 
+or the ITestCaseBuilder2 interface:
+
+<pre>
+	public interface ITestCaseBuilder
+	{
+		bool CanBuildFrom( MethodInfo method );
+		Test BuildFrom( MethodInfo method );
+	}
+
+	public interface ITestCaseBuilder2 : ITestCaseBuilder
+	{
+		bool CanBuildFrom( MethodInfo method, Test suite );
+		Test BuildFrom( MethodInfo method, Test suite );
+	}
+</pre>
+
+<p>NUnit will call ITestCaseBuilder2 if it is available. Otherwise
+ITestCaseBuilder will be used.
+
+<p>The CanBuildFrom method should return true if the addin can build
+a test from the MethodInfo provided. Some TestCaseBuilder addins are only 
+intended to apply to methods within a specific type of fixture. The
+suite argument of the ITestCaseBuilder2 interface may be used to make
+this determination.
+
+<p>The BuildFrom method should return a test constructed over the MethodInfo
+provided as an argument or null if the method cannot be used.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li id="current"><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/testcaseProviders.html b/doc/testcaseProviders.html
index aed3f96..823a844 100644
--- a/doc/testcaseProviders.html
+++ b/doc/testcaseProviders.html
@@ -1,145 +1,146 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - TestcaseProviders</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - TestcaseProviders</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>TestCaseProviders (NUnit 2.5)</h3>
-
-<h4>Purpose</h4>
-<p>TestCaseProviders are used with parameterized tests to provide the
-specific test cases that will be used in calling the test.
-
-<h4>Extension Point</h4>
-<p>Addins use the host to access this extension point by name:
-
-<pre>
-	IExtensionPoint listeners = host.GetExtensionPoint( "ParameterProviders" );</pre>
-
-<h4>Interface</h4>
-<p>The extension object passed to Install must implement either the 
-   <b>ITestCaseProvider</b> or the <b>ITestCaseProvider2</b> interface:
-
-<pre>
-	public interface ITestCaseProvider
-	{
-		bool HasTestCasesFor( MethodInfo method );
-		IEnumerable GetTestCasesFor( MethodInfo method );
-	}
-	
-	public interface ITestCaseProvider2 : ITestCaseProvider
-	{
-		bool HasTestCasesFor( MethodInfo method, Test suite );
-		IEnumerable GetTestCasesFor( MethodInfo method, Test suite );
-	}
-</pre>
-
-<p>NUnit will call <b>ITestCaseProvider2</b> if it is available. Otherwise
-   <b>ITestCaseProvider</b> will be used.
-
-<p><b>HasTestCasesFor</b> should return true if the provider is able to supply test cases
-   for the specified method. If a provider only wants to be used on certain types 
-   of tests, it can examine the provided MethodInfo and the suite for which the
-   test is being constructed and return true or false based on what it finds.
-
-<p>The GetParametersFor method should return a list of individual test cases.
-   Each test case may be expressed as a ParameterSet, as an array of arguments
-   or as a custom object containing one or more of the following properties:
-   
-   <ul>
-   <li>Arguments
-   <li>RunState
-   <li>NotRunReason
-   <li>ExpectedExceptionType
-   <li>ExpectedExceptionName
-   <li>ExpectedExceptionMessage
-   <li>Result
-   <li>Description
-   <li>TestName
-   </ul>
-
-<p>The ParameterSet class provides all these properties and may be used
-to avoid the overhead of reflecting on the properties.
-
-<h4>Notes:</h4>
-
-<ol>
-<li>Most providers will delegate one of the interface implementations
-    to the other if they implement both.
-<li>TestCaseProviders that use data from the fixture class should use 
-    <b>ITestCaseProvider2</b> interface so that they are able to access any 
-	arguments supplied for constructing the fixture object.
-<li>Providers that acquire data from outside the fixture will usually
-    be able to work with <b>ITestCaseProvider</b> alone.
-<li>The <b>ITestCaseProvider2</b> interface was added in the NUnit 2.5.1 release.
-</ol>
-   
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<ul>
-<li><a href="customConstraints.html">Custom Constraints</a></li>
-<li><a href="nunitAddins.html">NUnit Addins</a></li>
-<ul>
-<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
-<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
-<li><a href="testDecorators.html">TestDecorators</a></li>
-<li id="current"><a href="testcaseProviders.html">TestcaseProviders</a></li>
-<li><a href="datapointProviders.html">DatapointProviders</a></li>
-<li><a href="eventListeners.html">EventListeners</a></li>
-</ul>
-<li><a href="extensionTips.html">Tips for Extenders</a></li>
-</ul>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TestCaseProviders (NUnit 2.5)</h3>
+
+<h4>Purpose</h4>
+<p>TestCaseProviders are used with parameterized tests to provide the
+specific test cases that will be used in calling the test.
+
+<h4>Extension Point</h4>
+<p>Addins use the host to access this extension point by name:
+
+<pre>
+	IExtensionPoint listeners = host.GetExtensionPoint( "ParameterProviders" );</pre>
+
+<h4>Interface</h4>
+<p>The extension object passed to Install must implement either the 
+   <b>ITestCaseProvider</b> or the <b>ITestCaseProvider2</b> interface:
+
+<pre>
+	public interface ITestCaseProvider
+	{
+		bool HasTestCasesFor( MethodInfo method );
+		IEnumerable GetTestCasesFor( MethodInfo method );
+	}
+	
+	public interface ITestCaseProvider2 : ITestCaseProvider
+	{
+		bool HasTestCasesFor( MethodInfo method, Test suite );
+		IEnumerable GetTestCasesFor( MethodInfo method, Test suite );
+	}
+</pre>
+
+<p>NUnit will call <b>ITestCaseProvider2</b> if it is available. Otherwise
+   <b>ITestCaseProvider</b> will be used.
+
+<p><b>HasTestCasesFor</b> should return true if the provider is able to supply test cases
+   for the specified method. If a provider only wants to be used on certain types 
+   of tests, it can examine the provided MethodInfo and the suite for which the
+   test is being constructed and return true or false based on what it finds.
+
+<p>The GetParametersFor method should return a list of individual test cases.
+   Each test case may be expressed as a ParameterSet, as an array of arguments
+   or as a custom object containing one or more of the following properties:
+   
+   <ul>
+   <li>Arguments
+   <li>RunState
+   <li>NotRunReason
+   <li>ExpectedExceptionType
+   <li>ExpectedExceptionName
+   <li>ExpectedExceptionMessage
+   <li>Result
+   <li>Description
+   <li>TestName
+   </ul>
+
+<p>The ParameterSet class provides all these properties and may be used
+to avoid the overhead of reflecting on the properties.
+
+<h4>Notes:</h4>
+
+<ol>
+<li>Most providers will delegate one of the interface implementations
+    to the other if they implement both.
+<li>TestCaseProviders that use data from the fixture class should use 
+    <b>ITestCaseProvider2</b> interface so that they are able to access any 
+	arguments supplied for constructing the fixture object.
+<li>Providers that acquire data from outside the fixture will usually
+    be able to work with <b>ITestCaseProvider</b> alone.
+<li>The <b>ITestCaseProvider2</b> interface was added in the NUnit 2.5.1 release.
+</ol>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<ul>
+<li><a href="customConstraints.html">Custom Constraints</a></li>
+<li><a href="nunitAddins.html">NUnit Addins</a></li>
+<ul>
+<li><a href="suiteBuilders.html">SuiteBuilders</a></li>
+<li><a href="testcaseBuilders.html">TestcaseBuilders</a></li>
+<li><a href="testDecorators.html">TestDecorators</a></li>
+<li id="current"><a href="testcaseProviders.html">TestcaseProviders</a></li>
+<li><a href="datapointProviders.html">DatapointProviders</a></li>
+<li><a href="eventListeners.html">EventListeners</a></li>
+</ul>
+<li><a href="extensionTips.html">Tips for Extenders</a></li>
+</ul>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/theory.html b/doc/theory.html
index 3844842..2e9afdf 100644
--- a/doc/theory.html
+++ b/doc/theory.html
@@ -1,214 +1,214 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Theory</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Theory</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<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
-   <em>example-based</em>. That is, the developer supplies one or
-   more examples of inputs and expected outputs either within the
-   code of the test or - in the case of
-   <a href="parameterizedTests.html">Parameterized Tests</a> 
-   - as arguments to the test method. A theory, on the other hand,
-   makes a general statement that all of its assertions will pass
-   for all arguments satisfying certain assumptions.
-   
-<p>Theories are implemented in NUnit
-   as methods within a <b>TestFixture</b>, which are annotated
-   with the <b>TheoryAttribute</b>. Theory methods must always have 
-   arguments and therefore appears quite similar to 
-   <a href="parameterizedTests.html">Parameterized Tests</a>   at first glance. However, a Theory incorporates additional data sources 
-   for its arguments and allows special processing for assumptions
-   about that data. The key difference, though, is that theories
-   make general statements and are more than just a set of examples.
-   
-<h4>Data for Theories</h4>
-
-<p>The primary source of data for a <b>Theory</b> is the
-   <a href="datapoint.html"><b>Datapoint</b> or <b>Datapoints</b> attribute</a>. 
-   NUnit will use any fields of the required types, which are annotated
-   with one of these attributes, to provide data for each parameter
-   of the Theory. NUnit assembles the values for individual arguments 
-   combinatorially to provide test cases for the theory.
-   
-<p>In addition to the Datapoint and Datapoints attributes, it
-   is possible to use any of the approaches for supplying data
-   that are recognized on normal parameterized tests. We suggest
-   that this capability not be overused, since it runs counter
-   to the distinction between a test based on examples and a
-   theory. However, it may be useful in order to guarantee that
-   a specific test case is included.
-
-<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>
-
-<p>The theory itself is responsible for ensuring that all data supplied
-   meets its assumptions. It does this by use of the
-   <b>Assume.That(...)</b> construct, which works just like
-   <b>Assert.That(...)</b> but does not cause a failure. If
-   the assumption is not satisfied for a particular test case, that case
-   returns an Inconclusive result, rather than a Success or Failure. 
-   
-<p>The overall result of executing a Theory over a set of test cases is 
-   determined as follows:
-   
-   <ul>
-   <li>If the assumptions are violated for <b>all</b> test cases, then the
-       Theory itself is marked as a failure.
-   
-   <li>If any Assertion fails, the Theory itself fails.
-   
-   <li>If at least <b>some</b> cases pass the stated assumptions, and 
-       there are <b>no</b> assertion failures or exceptions, then the
-	   Theory passes.
-   </ul>
-
-<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>
-
-<p>In the following example, the theory SquareRootDefinition
-   verifies that the implementation of square root satisies
-   the following definition:
-   
-<p style="margin: 2em"><i>
-"Given a non-negative number, the square root of that number
- is always non-negative and, when multiplied by itself, gives 
- the original number."</i>
-
-<div class="code" style="width: 36em">
-<pre>
-public class SqrtTests
-{
-    [Datapoints]
-    public double[] values = new double[] { 0.0, 1.0, -1.0, 42.0 };
-
-    [Theory]
-    public void SquareRootDefinition(double num)
-    {
-        Assume.That(num >= 0.0);
-
-        double sqrt = Math.Sqrt(num);
-
-        Assert.That(sqrt >= 0.0);
-        Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
-    }
-}
-</pre>
-</div>
-   
-<h4>See also...</h4>
-
-<ul>
-<li><a href="datapoint.html">Datapoint(s)Attribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="theory.html">Theory</a></li>
-<li><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<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
+   <em>example-based</em>. That is, the developer supplies one or
+   more examples of inputs and expected outputs either within the
+   code of the test or - in the case of
+   <a href="parameterizedTests.html">Parameterized Tests</a> 
+   - as arguments to the test method. A theory, on the other hand,
+   makes a general statement that all of its assertions will pass
+   for all arguments satisfying certain assumptions.
+   
+<p>Theories are implemented in NUnit
+   as methods within a <b>TestFixture</b>, which are annotated
+   with the <b>TheoryAttribute</b>. Theory methods must always have 
+   arguments and therefore appears quite similar to 
+   <a href="parameterizedTests.html">Parameterized Tests</a>   at first glance. However, a Theory incorporates additional data sources 
+   for its arguments and allows special processing for assumptions
+   about that data. The key difference, though, is that theories
+   make general statements and are more than just a set of examples.
+   
+<h4>Data for Theories</h4>
+
+<p>The primary source of data for a <b>Theory</b> is the
+   <a href="datapoint.html"><b>Datapoint</b> or <b>Datapoints</b> attribute</a>. 
+   NUnit will use any fields of the required types, which are annotated
+   with one of these attributes, to provide data for each parameter
+   of the Theory. NUnit assembles the values for individual arguments 
+   combinatorially to provide test cases for the theory.
+   
+<p>In addition to the Datapoint and Datapoints attributes, it
+   is possible to use any of the approaches for supplying data
+   that are recognized on normal parameterized tests. We suggest
+   that this capability not be overused, since it runs counter
+   to the distinction between a test based on examples and a
+   theory. However, it may be useful in order to guarantee that
+   a specific test case is included.
+
+<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>
+
+<p>The theory itself is responsible for ensuring that all data supplied
+   meets its assumptions. It does this by use of the
+   <b>Assume.That(...)</b> construct, which works just like
+   <b>Assert.That(...)</b> but does not cause a failure. If
+   the assumption is not satisfied for a particular test case, that case
+   returns an Inconclusive result, rather than a Success or Failure. 
+   
+<p>The overall result of executing a Theory over a set of test cases is 
+   determined as follows:
+   
+   <ul>
+   <li>If the assumptions are violated for <b>all</b> test cases, then the
+       Theory itself is marked as a failure.
+   
+   <li>If any Assertion fails, the Theory itself fails.
+   
+   <li>If at least <b>some</b> cases pass the stated assumptions, and 
+       there are <b>no</b> assertion failures or exceptions, then the
+	   Theory passes.
+   </ul>
+
+<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>
+
+<p>In the following example, the theory SquareRootDefinition
+   verifies that the implementation of square root satisies
+   the following definition:
+   
+<p style="margin: 2em"><i>
+"Given a non-negative number, the square root of that number
+ is always non-negative and, when multiplied by itself, gives 
+ the original number."</i>
+
+<div class="code" style="width: 36em">
+<pre>
+public class SqrtTests
+{
+    [Datapoints]
+    public double[] values = new double[] { 0.0, 1.0, -1.0, 42.0 };
+
+    [Theory]
+    public void SquareRootDefinition(double num)
+    {
+        Assume.That(num >= 0.0);
+
+        double sqrt = Math.Sqrt(num);
+
+        Assert.That(sqrt >= 0.0);
+        Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
+    }
+}
+</pre>
+</div>
+   
+<h4>See also...</h4>
+
+<ul>
+<li><a href="datapoint.html">Datapoint(s)Attribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="theory.html">Theory</a></li>
+<li><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/throwsConstraint.html b/doc/throwsConstraint.html
index 905e80b..37fd91f 100644
--- a/doc/throwsConstraint.html
+++ b/doc/throwsConstraint.html
@@ -1,168 +1,172 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ThrowsConstraint</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ThrowsConstraint</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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>Throws Constraint (NUnit 2.5)</h2>
-
-<p><b>ThrowsConstraint</b> is used to test that some code, represented as a delegate,
-throws a particular exception. It may be used alone, to merely test the type
-of constraint, or with an additional constraint to be applied to the exception
-specified as an argument.
-
-p>The related <b>ThrowsNothingConstraint</b> simply asserts that the delegate
-does not throw an exception.
-
-<h4>Constructors</h4>
-<div class="code"><pre>
-ThrowsConstraint(Type expectedType)
-ThrowsConstraint<T>()
-ThrowsConstraint(Type expectedType, Constraint constraint)
-ThrowsConstraint<T>(Constraint constraint)
-ThrowsNothingConstraint()
-</pre></div>
-
-<h4>Syntax</h4>
-<div class="code"><pre>
-Throws.Exception
-Throws.TargetInvocationException
-Throws.ArgumentException
-Throws.InvalidOperationException
-Throws.TypeOf(Type expectedType)
-Throws.TypeOf<T>()
-Throws.InstanceOf(Type expectedType)
-Throws.InstanceOf<T>()
-Throws.Nothing
-Throws.InnerException
-</pre></div>
-
-<h4>Examples of Use</h4>
-<div class="code"><pre>
-// .NET 1.1
-Assert.That( new TestDelegate(SomeMethod),
-  Throws.TypeOf(typeof(ArgumentException)));
-Assert.That( new TestDelegate(SomeMethod),
-  Throws.Exception.TypeOf(typeof(ArgumentException)));
-Assert.That( new TestDelegate(SomeMethod),
-  Throws.TypeOf(typeof(ArgumentException))
-    .With.Property("Parameter").EqualTo("myParam"));
-Assert.That( new TestDelegate(SomeMethod),
-  Throws.ArgumentException );
-Assert.That( new TestDelegate(SomeMethod), 
-  Throws.TargetInvocationException
-    .With.InnerException.TypeOf(ArgumentException));
-	
-// .NET 2.0
-Assert.That( SomeMethod, 
-  Throws.TypeOf<ArgumentException>());
-Assert.That( SomeMethod, 
-  Throws.Exception.TypeOf<ArgumentException>());
-Assert.That( SomeMethod, 
-  Throws.TypeOf<ArgumentException>()
-    .With.Property("Parameter").EqualTo("myParam"));
-Assert.That( SomeMethod, Throws.ArgumentException );
-Assert.That( SomeMethod, 
-  Throws.TargetInvocationException
-    .With.InnerException.TypeOf<ArgumentException>());
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li><b>Throws.Exception</b> may be followed by further constraints,
-    which are applied to the exception itself as shown in the last two
-	examples above. It may also be used alone to verify that some
-	exception has been thrown, without regard to type. This is
-	not a recommended practice since you should normally know
-	what exception you are expecting.
-<li><b>Throws.TypeOf</b> and <b>Throws.InstanceOf</b> are provided
-    as a shorter syntax for this common test. They work exactly like
-	the corresponding forms following <b>Throws.Exception</b>.
-<li><b>Throws.TargetInvocationException/b>, <b>Throws.ArgumentException</b>
-    and <b>Throws.InvalidOperationException</b> provide a shortened form
-	for some common exceptions.
-<li>Used alone, <b>Throws.InnerException</b> simply tests the InnerException
-    value of the thrown exception. More commonly, it will be used in 
-	combination with a test for the type of the outer exception as shown
-	in the examples above.
-</ol>
-
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li id="current"><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Throws Constraint (NUnit 2.5)</h2>
+
+<p><b>ThrowsConstraint</b> is used to test that some code, represented as a delegate,
+throws a particular exception. It may be used alone, to merely test the type
+of constraint, or with an additional constraint to be applied to the exception
+specified as an argument.
+
+p>The related <b>ThrowsNothingConstraint</b> simply asserts that the delegate
+does not throw an exception.
+
+<h4>Constructors</h4>
+<div class="code"><pre>
+ThrowsConstraint(Type expectedType)
+ThrowsConstraint<T>()
+ThrowsConstraint(Type expectedType, Constraint constraint)
+ThrowsConstraint<T>(Constraint constraint)
+ThrowsNothingConstraint()
+</pre></div>
+
+<h4>Syntax</h4>
+<div class="code"><pre>
+Throws.Exception
+Throws.TargetInvocationException
+Throws.ArgumentException
+Throws.InvalidOperationException
+Throws.TypeOf(Type expectedType)
+Throws.TypeOf<T>()
+Throws.InstanceOf(Type expectedType)
+Throws.InstanceOf<T>()
+Throws.Nothing
+Throws.InnerException
+</pre></div>
+
+<h4>Examples of Use</h4>
+<div class="code"><pre>
+// .NET 1.1
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.TypeOf(typeof(ArgumentException)));
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.Exception.TypeOf(typeof(ArgumentException)));
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.TypeOf(typeof(ArgumentException))
+    .With.Property("Parameter").EqualTo("myParam"));
+Assert.That( new TestDelegate(SomeMethod),
+  Throws.ArgumentException );
+Assert.That( new TestDelegate(SomeMethod), 
+  Throws.TargetInvocationException
+    .With.InnerException.TypeOf(ArgumentException));
+	
+// .NET 2.0
+Assert.That( SomeMethod, 
+  Throws.TypeOf<ArgumentException>());
+Assert.That( SomeMethod, 
+  Throws.Exception.TypeOf<ArgumentException>());
+Assert.That( SomeMethod, 
+  Throws.TypeOf<ArgumentException>()
+    .With.Property("Parameter").EqualTo("myParam"));
+Assert.That( SomeMethod, Throws.ArgumentException );
+Assert.That( SomeMethod, 
+  Throws.TargetInvocationException
+    .With.InnerException.TypeOf<ArgumentException>());
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li><b>Throws.Exception</b> may be followed by further constraints,
+    which are applied to the exception itself as shown in the last two
+	examples above. It may also be used alone to verify that some
+	exception has been thrown, without regard to type. This is
+	not a recommended practice since you should normally know
+	what exception you are expecting.
+<li><b>Throws.TypeOf</b> and <b>Throws.InstanceOf</b> are provided
+    as a shorter syntax for this common test. They work exactly like
+	the corresponding forms following <b>Throws.Exception</b>.
+<li><b>Throws.TargetInvocationException</b>, <b>Throws.ArgumentException</b>
+    and <b>Throws.InvalidOperationException</b> provide a shortened form
+	for some common exceptions.
+<li>Used alone, <b>Throws.InnerException</b> simply tests the InnerException
+    value of the thrown exception. More commonly, it will be used in 
+	combination with a test for the type of the outer exception as shown
+	in the examples above.
+</ol>
+
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li id="current"><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/timeout.html b/doc/timeout.html
index bf66147..254d436 100644
--- a/doc/timeout.html
+++ b/doc/timeout.html
@@ -1,136 +1,136 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Timeout</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Timeout</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>TimeoutAttribute (NUnit 2.5)</h3>
-
-<p>The <b>TimeoutAttribute</b> is used to specify a timeout value in milliseconds
-   for a test case. If the test case runs longer than the time specified it
-   is immediately cancelled and reported as a failure, with a message 
-   indicating that the timeout was exceeded.
-   
-<p>The attribute may also be specified on a fixture or assembly, in which
-   case it indicates the default timeout for any subordinate test cases.
-   
-<h4>Example</h4>
-
-<div class="code"><pre>
-[Test, Timeout(2000)]
-public void PotentiallyLongRunningTest()
-{
-    ...
-}
-</pre></div>
-
-<h4>Notes</h4>
-<ol>
-<li>Beginning with NUnit 2.5.5, timeouts are suppressed when running under a debugger.</li>
-</ol>
-
-<h4>See Also...</h4>
-<ul>
-<li><a href="maxtime.html">MaxtimeAttribute</a></ul>
-   
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 id="current"><a href="timeout.html">Timeout</a></li>
-<li><a href="values.html">Values</a></li>
-<li><a href="valueSource.html">ValueSource</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>TimeoutAttribute (NUnit 2.5)</h3>
+
+<p>The <b>TimeoutAttribute</b> is used to specify a timeout value in milliseconds
+   for a test case. If the test case runs longer than the time specified it
+   is immediately cancelled and reported as a failure, with a message 
+   indicating that the timeout was exceeded.
+   
+<p>The attribute may also be specified on a fixture or assembly, in which
+   case it indicates the default timeout for any subordinate test cases.
+   
+<h4>Example</h4>
+
+<div class="code"><pre>
+[Test, Timeout(2000)]
+public void PotentiallyLongRunningTest()
+{
+    ...
+}
+</pre></div>
+
+<h4>Notes</h4>
+<ol>
+<li>Beginning with NUnit 2.5.5, timeouts are suppressed when running under a debugger.</li>
+</ol>
+
+<h4>See Also...</h4>
+<ul>
+<li><a href="maxtime.html">MaxtimeAttribute</a></ul>
+   
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="timeout.html">Timeout</a></li>
+<li><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/typeAsserts.html b/doc/typeAsserts.html
index 4e5e376..c0b81fe 100644
--- a/doc/typeAsserts.html
+++ b/doc/typeAsserts.html
@@ -1,140 +1,144 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Type Asserts (NUnit 2.2.3 / 2.5)</h2>
-
-<p>These methods allow us to make assertions about the type of an object.</p>
-
-<div class="code" style="width: 36em" ><pre>
-
-Assert.IsInstanceOfType( Type expected, object actual );
-Assert.IsInstanceOfType( Type expected, object actual, 
-                string message );
-Assert.IsInstanceOfType( Type expected, object actual, 
-                string message, params object[] parms );
-				
-Assert.IsNotInstanceOfType( Type expected, object actual );
-Assert.IsNotInstanceOfType( Type expected, object actual, 
-                string message );
-Assert.IsNotInstanceOfType( Type expected, object actual, 
-                string message, params object[] parms );
-			
-Assert.IsAssignableFrom( Type expected, object actual );
-Assert.IsAssignableFrom( Type expected, object actual, 
-                string message );
-Assert.IsAssignableFrom( Type expected, object actual, 
-                string message, params object[] parms );
-				
-Assert.IsNotAssignableFrom( Type expected, object actual );
-Assert.IsNotAssignableFrom( Type expected, object actual, 
-                string message );
-Assert.IsNotAssignableFrom( Type expected, object actual, 
-                string message, params object[] parms );
-				
-</pre></div>
-
-Beginning with NUnit 2.5, generic equivalents are available 
-in .NET 2.0 NUnit packages.
-
-<div class="code" style="width: 36em" ><pre>
-
-Assert.IsInstanceOf<T>( object actual );
-Assert.IsInstanceOf<T>( object actual, string message );
-Assert.IsInstanceOf<T>( object actual, 
-                string message, params object[] parms );
-				
-Assert.IsNotInstanceOf<T>( object actual );
-Assert.IsNotInstanceOf<T>( object actual, string message ); 
-Assert.IsNotInstanceOf<T>( object actual, 
-                string message, params object[] parms );
-			
-Assert.IsAssignableFrom<T>( object actual );
-Assert.IsAssignableFrom<T>( object actual, string message );
-Assert.IsAssignableFrom<T>( object actual, 
-                string message, params object[] parms );
-				
-Assert.IsNotAssignableFrom<T>( object actual );
-Assert.IsNotAssignableFrom<T>( object actual, string message );
-Assert.IsNotAssignableFrom<T>( object actual, 
-                string message, params object[] parms );
-				
-</pre></div>
-
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li id="current"><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Type Asserts (NUnit 2.2.3 / 2.5)</h2>
+
+<p>These methods allow us to make assertions about the type of an object.</p>
+
+<div class="code" style="width: 36em" ><pre>
+
+Assert.IsInstanceOfType( Type expected, object actual );
+Assert.IsInstanceOfType( Type expected, object actual, 
+                string message );
+Assert.IsInstanceOfType( Type expected, object actual, 
+                string message, params object[] parms );
+				
+Assert.IsNotInstanceOfType( Type expected, object actual );
+Assert.IsNotInstanceOfType( Type expected, object actual, 
+                string message );
+Assert.IsNotInstanceOfType( Type expected, object actual, 
+                string message, params object[] parms );
+			
+Assert.IsAssignableFrom( Type expected, object actual );
+Assert.IsAssignableFrom( Type expected, object actual, 
+                string message );
+Assert.IsAssignableFrom( Type expected, object actual, 
+                string message, params object[] parms );
+				
+Assert.IsNotAssignableFrom( Type expected, object actual );
+Assert.IsNotAssignableFrom( Type expected, object actual, 
+                string message );
+Assert.IsNotAssignableFrom( Type expected, object actual, 
+                string message, params object[] parms );
+				
+</pre></div>
+
+Beginning with NUnit 2.5, generic equivalents are available 
+in .NET 2.0 NUnit packages.
+
+<div class="code" style="width: 36em" ><pre>
+
+Assert.IsInstanceOf<T>( object actual );
+Assert.IsInstanceOf<T>( object actual, string message );
+Assert.IsInstanceOf<T>( object actual, 
+                string message, params object[] parms );
+				
+Assert.IsNotInstanceOf<T>( object actual );
+Assert.IsNotInstanceOf<T>( object actual, string message ); 
+Assert.IsNotInstanceOf<T>( object actual, 
+                string message, params object[] parms );
+			
+Assert.IsAssignableFrom<T>( object actual );
+Assert.IsAssignableFrom<T>( object actual, string message );
+Assert.IsAssignableFrom<T>( object actual, 
+                string message, params object[] parms );
+				
+Assert.IsNotAssignableFrom<T>( object actual );
+Assert.IsNotAssignableFrom<T>( object actual, string message );
+Assert.IsNotAssignableFrom<T>( object actual, 
+                string message, params object[] parms );
+				
+</pre></div>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li id="current"><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/typeConstraints.html b/doc/typeConstraints.html
index dbf3c89..dcff779 100644
--- a/doc/typeConstraints.html
+++ b/doc/typeConstraints.html
@@ -1,113 +1,117 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Type Constraints (NUnit 2.4)</h2>
-
-<p>Type constraints perform tests that are specific to Types.
-The following type constraints are provided:
-
-<table class="constraints">
-<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
-<tr><td>Is.TypeOf( Type )</td><td>ExactTypeConstraint( Type )</td></td><td>tests that an object is an exact Type</td></tr>
-<tr><td>Is.InstanceOfType( Type )</td><td>InstanceOfTypeConstraint( Type )</td></td><td>tests that an object is an instance of a Type</td></tr>
-<tr><td>Is.AssignableFrom( Type )</td><td>AssignableFromConstraint( Type )</td></td><td>tests that one type is assignable from another</td></tr>
-</table>
-
-<h4>Examples of Use</h4>
-
-<div class="code"><pre>
-Assert.That("Hello", Is.TypeOf(typeof(string)));
-Assert.That("Hello", Is.Not.TypeOf(typeof(int)));
-
-Assert.That("Hello", Is.InstanceOfType(typeof(string)));
-Assert.That(5, Is.Not.InstanceOfType(typeof(string)));
-
-Assert.That( "Hello", Is.AssignableFrom(typeof(string)));
-Assert.That( 5, Is.Not.AssignableFrom(typeof(string)));
-
-// Using inheritance
-Expect( 5, Not.InstanceOfType(typeof(string)));
-Expect( "Hello", AssignableFrom(typeOf(string)));
-</pre></div>
-
-
-</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>
-<ul>
-<li><a href="equalConstraint.html">Equal Constraint</a></li>
-<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
-<li><a href="conditionConstraints.html">Condition Constraints</a></li>
-<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
-<li><a href="pathConstraints.html">Path Constraints</a></li>
-<li id="current"><a href="typeConstraints.html">Type Constraints</a></li>
-<li><a href="stringConstraints.html">String Constraints</a></li>
-<li><a href="collectionConstraints.html">Collection Constraints</a></li>
-<li><a href="propertyConstraint.html">Property Constraint</a></li>
-<li><a href="throwsConstraint.html">Throws Constraint</a></li>
-<li><a href="compoundConstraints.html">Compound Constraints</a></li>
-<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
-<li><a href="listMapper.html">List Mapper</a></li>
-<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Type Constraints (NUnit 2.4)</h2>
+
+<p>Type constraints perform tests that are specific to Types.
+The following type constraints are provided:
+
+<table class="constraints">
+<tr><th>Syntax Helper</th><th>Constructor</th><th>Operation</th></tr>
+<tr><td>Is.TypeOf( Type )</td><td>ExactTypeConstraint( Type )</td></td><td>tests that an object is an exact Type</td></tr>
+<tr><td>Is.InstanceOfType( Type )</td><td>InstanceOfTypeConstraint( Type )</td></td><td>tests that an object is an instance of a Type</td></tr>
+<tr><td>Is.AssignableFrom( Type )</td><td>AssignableFromConstraint( Type )</td></td><td>tests that one type is assignable from another</td></tr>
+</table>
+
+<h4>Examples of Use</h4>
+
+<div class="code"><pre>
+Assert.That("Hello", Is.TypeOf(typeof(string)));
+Assert.That("Hello", Is.Not.TypeOf(typeof(int)));
+
+Assert.That("Hello", Is.InstanceOfType(typeof(string)));
+Assert.That(5, Is.Not.InstanceOfType(typeof(string)));
+
+Assert.That( "Hello", Is.AssignableFrom(typeof(string)));
+Assert.That( 5, Is.Not.AssignableFrom(typeof(string)));
+
+// Using inheritance
+Expect( 5, Not.InstanceOfType(typeof(string)));
+Expect( "Hello", AssignableFrom(typeOf(string)));
+</pre></div>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<li><a href="constraintModel.html">Constraint Model</a></li>
+<ul>
+<li><a href="equalConstraint.html">Equal Constraint</a></li>
+<li><a href="sameasConstraint.html">SameAs Constraint</a></li>
+<li><a href="conditionConstraints.html">Condition Constraints</a></li>
+<li><a href="comparisonConstraints.html">Comparison Constrants</a></li>
+<li><a href="pathConstraints.html">Path Constraints</a></li>
+<li id="current"><a href="typeConstraints.html">Type Constraints</a></li>
+<li><a href="stringConstraints.html">String Constraints</a></li>
+<li><a href="collectionConstraints.html">Collection Constraints</a></li>
+<li><a href="propertyConstraint.html">Property Constraint</a></li>
+<li><a href="throwsConstraint.html">Throws Constraint</a></li>
+<li><a href="compoundConstraints.html">Compound Constraints</a></li>
+<li><a href="delayedConstraint.html">Delayed Constraint</a></li>
+<li><a href="listMapper.html">List Mapper</a></li>
+<li><a href="reusableConstraint.html">Reusable Constraint</a></li>
+</ul>
+</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/upgrade.html b/doc/upgrade.html
index ef61a1c..3b8668d 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -1,94 +1,95 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>From NUnit 2.x</h2>
-
-<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:
-
-<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>
-
-<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.
-
-<h2>From NUnit 1.x</h2>
-
-<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>
-
-<!-- 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>
-<ul>
-<li><a href="quickStart.html">Quick Start</a></li>
-<li><a href="installation.html">Installation</a></li>
-<ul>
-<li id="current"><a href="upgrade.html">Upgrading</a></li>
-</ul>
-</ul>
-<li><a href="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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>From NUnit 2.x</h2>
+
+<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:
+
+<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>
+
+<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.
+
+<h2>From NUnit 1.x</h2>
+
+<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>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</a></li>
+<ul>
+<li><a href="getStarted.html">Getting Started</a></li>
+<ul>
+<li><a href="quickStart.html">Quick Start</a></li>
+<li><a href="installation.html">Installation</a></li>
+<ul>
+<li id="current"><a href="upgrade.html">Upgrading</a></li>
+</ul>
+</ul>
+<li><a href="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/utilityAsserts.html b/doc/utilityAsserts.html
index 39d3a0a..91b6633 100644
--- a/doc/utilityAsserts.html
+++ b/doc/utilityAsserts.html
@@ -1,136 +1,140 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Utility Methods</h2>
-<p>Four utility methods, <b>Pass()</b>, <b>Fail()</b>, <b>Ignore()</b> and <b>Inconclusive()</b> are provided 
-   in order to allow more direct control of the test process:</p>
-<div class="code" style="width: 36em"><pre>
-Assert.Pass();
-Assert.Pass( string message );
-Assert.Pass( string message, object[] parms );
-
-Assert.Fail();
-Assert.Fail( string message );
-Assert.Fail( string message, object[] parms );
-
-Assert.Ignore();
-Assert.Ignore( string message );
-Assert.Ignore( string message, object[] parms );
-
-Assert.Inconclusive();
-Assert.Inconclusive( string message );
-Assert.Inconclusive( string message, object[] parms );</pre>
-</div>
-<p>The <b>Assert.Pass</b> method allows you to immediately end the test, recording
-	it as successful. Since it causes an exception to be thrown, it is more
-	efficient to simply allow the test to return. However, Assert.Pass allows 
-	you to record a message in the test result and may also make the test
-	easier to read in some situations. Additionally, like the other methods
-	on this page, it can be invoked from a nested method call with the
-	result of immediately terminating test execution.</p>
-<p>The <b>Assert.Fail</b> method provides you with the ability to generate a failure based 
-	on tests that are not encapsulated by the other methods. It is also useful in 
-	developing your own project-specific assertions.</p>
-<p>Here's an example of its use to create a private assertion that tests whether a 
-	string contains an expected value.</p>
-<div class="code" style="width: 36em">
-	<pre>public void AssertStringContains( string expected, string actual )
-{
-    AssertStringContains( expected, actual, string.Empty );
-}
-
-public void AssertStringContains( string expected, string actual,
-    string message )
-{
-    if ( actual.IndexOf( expected ) < 0 )
-        Assert.Fail( message );
-}</pre>
-</div>
-<p>The <b>Assert.Ignore</b> method provides you with the ability to dynamically cause a 
-	test or suite to be ignored at runtime. It may be called in a test, setup or 
-	fixture setup method. We recommend that you use this only in isolated cases. 
-	The category facility is provided for more extensive inclusion or exclusion of 
-	tests or you may elect to simply divide tests run on different occasions into 
-	different assemblies.</p>
-<p>The <b>Assert.Inconclusive</b> method indicates that the test could not be
-   completed with the data available. It should be used in situations where 
-   another run with different data might run to completion, with either a
-   success or failure outcome.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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>
-<li><a href="identityAsserts.html">Identity Asserts</a></li>
-<li><a href="conditionAsserts.html">Condition Asserts</a></li>
-<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
-<li><a href="typeAsserts.html">Type Asserts</a></li>
-<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
-<li id="current"><a href="utilityAsserts.html">Utility Methods</a></li>
-<li><a href="stringAssert.html">String Assert</a></li>
-<li><a href="collectionAssert.html">Collection Assert</a></li>
-<li><a href="fileAssert.html">File Assert</a></li>
-<li><a href="directoryAssert.html">Directory Assert</a></li>
-</ul>
-<li><a href="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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Utility Methods</h2>
+<p>Four utility methods, <b>Pass()</b>, <b>Fail()</b>, <b>Ignore()</b> and <b>Inconclusive()</b> are provided 
+   in order to allow more direct control of the test process:</p>
+<div class="code" style="width: 36em"><pre>
+Assert.Pass();
+Assert.Pass( string message );
+Assert.Pass( string message, object[] parms );
+
+Assert.Fail();
+Assert.Fail( string message );
+Assert.Fail( string message, object[] parms );
+
+Assert.Ignore();
+Assert.Ignore( string message );
+Assert.Ignore( string message, object[] parms );
+
+Assert.Inconclusive();
+Assert.Inconclusive( string message );
+Assert.Inconclusive( string message, object[] parms );</pre>
+</div>
+<p>The <b>Assert.Pass</b> method allows you to immediately end the test, recording
+	it as successful. Since it causes an exception to be thrown, it is more
+	efficient to simply allow the test to return. However, Assert.Pass allows 
+	you to record a message in the test result and may also make the test
+	easier to read in some situations. Additionally, like the other methods
+	on this page, it can be invoked from a nested method call with the
+	result of immediately terminating test execution.</p>
+<p>The <b>Assert.Fail</b> method provides you with the ability to generate a failure based 
+	on tests that are not encapsulated by the other methods. It is also useful in 
+	developing your own project-specific assertions.</p>
+<p>Here's an example of its use to create a private assertion that tests whether a 
+	string contains an expected value.</p>
+<div class="code" style="width: 36em">
+	<pre>public void AssertStringContains( string expected, string actual )
+{
+    AssertStringContains( expected, actual, string.Empty );
+}
+
+public void AssertStringContains( string expected, string actual,
+    string message )
+{
+    if ( actual.IndexOf( expected ) < 0 )
+        Assert.Fail( message );
+}</pre>
+</div>
+<p>The <b>Assert.Ignore</b> method provides you with the ability to dynamically cause a 
+	test or suite to be ignored at runtime. It may be called in a test, setup or 
+	fixture setup method. We recommend that you use this only in isolated cases. 
+	The category facility is provided for more extensive inclusion or exclusion of 
+	tests or you may elect to simply divide tests run on different occasions into 
+	different assemblies.</p>
+<p>The <b>Assert.Inconclusive</b> method indicates that the test could not be
+   completed with the data available. It should be used in situations where 
+   another run with different data might run to completion, with either a
+   success or failure outcome.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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="classicModel.html">Classic Model</a></li>
+<ul>
+<li><a href="equalityAsserts.html">Equality Asserts</a></li>
+<li><a href="identityAsserts.html">Identity Asserts</a></li>
+<li><a href="conditionAsserts.html">Condition Asserts</a></li>
+<li><a href="comparisonAsserts.html">Comparison Asserts</a></li>
+<li><a href="typeAsserts.html">Type Asserts</a></li>
+<li><a href="exceptionAsserts.html">Exception Asserts</a></li>
+<li id="current"><a href="utilityAsserts.html">Utility Methods</a></li>
+<li><a href="stringAssert.html">String Assert</a></li>
+<li><a href="collectionAssert.html">Collection Assert</a></li>
+<li><a href="fileAssert.html">File Assert</a></li>
+<li><a href="directoryAssert.html">Directory Assert</a></li>
+</ul>
+<li><a href="constraintModel.html">Constraint Model</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/valueSource.html b/doc/valueSource.html
index 59754b0..da879f1 100644
--- a/doc/valueSource.html
+++ b/doc/valueSource.html
@@ -1,170 +1,170 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - ValueSource</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - ValueSource</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
-
-<h3>ValueSourceAttribute (NUnit 2.5)</h3>
-
-<p><b>ValueSourceAttribute</b> is used on individual parameters of a test method to
-identify a named source for the argument values to be supplied. The attribute has 
-two public constructors.
-
-<div class="code">
-<pre>
-ValueSourceAttribute(Type sourceType, string sourceName);
-ValueSourceAttribute(string sourceName);
-</pre>
-</div>
-
-<p>If <b>sourceType</b> is specified, it represents the class that provides
-the data. It must have a default constructor.
-
-<p>If <b>sourceType</b> is not specified, the class containing the test
-method is used. NUnit will construct it using either the default constructor
-or - if arguments are provided - the appropriate constructor for those 
-arguments.
-
-<p>The <b>sourceName</b>, represents the name of the source that will 
-provide the arguments. It should have the following characteristics:
-<ul>
-<li>It may be a field, a non-indexed property or a method taking no arguments.
-<li>It may be either an instance or a static member.
-<li>It must return an IEnumerable or a type that implements IEnumerable.
-<li>The individual items returned from the enumerator must be compatible
-    with the type of the parameter on which the attribute appears.
-</ul>
-
-<h3>Order of Execution</h3>
-
-<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
-   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
-   executed in the order in which NUnit discovers them. This order does <b>not</b>
-   follow the lexical order of the attributes and will often vary between different
-   compilers or different versions of the CLR.
-   
-<p>As a result, when <b>ValueSourceAttribute</b> appears multiple times on a 
-   parameter or when other data-providing attributes are used in combination with 
-   <b>ValueSourceAttribute</b>, the order of the arguments is undefined.
-
-<p>However, when a single <b>ValueSourceAttribute</b> is used by itself, 
-   the order of the arguments follows exactly the order in which the data 
-   is returned from the source.
-   
-<h3>Note on Object Construction</h3>
-
-<p>NUnit locates the test cases at the time the tests are loaded, creates
-instances of each class with non-static sources and builds a list of 
-tests to be executed. Each source object is only created once at this
-time and is destroyed after all tests are loaded. 
-
-<p>If the data source is in the test fixture itself, the object is created
-using the appropriate constructor for the fixture parameters provided on
-the <b>TestFixtureAttribute</b>, or
-the default constructor if no parameters were specified. Since this object
-is destroyed before the tests are run, no communication is possible between
-these two phases - or between different runs - except through the parameters
-themselves.
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<script language="JavaScript" src="codeFuncs.js" ></script> <!-- Do it this way for IE -->
+
+<h3>ValueSourceAttribute (NUnit 2.5)</h3>
+
+<p><b>ValueSourceAttribute</b> is used on individual parameters of a test method to
+identify a named source for the argument values to be supplied. The attribute has 
+two public constructors.
+
+<div class="code">
+<pre>
+ValueSourceAttribute(Type sourceType, string sourceName);
+ValueSourceAttribute(string sourceName);
+</pre>
+</div>
+
+<p>If <b>sourceType</b> is specified, it represents the class that provides
+the data. It must have a default constructor.
+
+<p>If <b>sourceType</b> is not specified, the class containing the test
+method is used. NUnit will construct it using either the default constructor
+or - if arguments are provided - the appropriate constructor for those 
+arguments.
+
+<p>The <b>sourceName</b>, represents the name of the source that will 
+provide the arguments. It should have the following characteristics:
+<ul>
+<li>It may be a field, a non-indexed property or a method taking no arguments.
+<li>It may be either an instance or a static member.
+<li>It must return an IEnumerable or a type that implements IEnumerable.
+<li>The individual items returned from the enumerator must be compatible
+    with the type of the parameter on which the attribute appears.
+</ul>
+
+<h3>Order of Execution</h3>
+
+<p>In NUnit 2.5, individual test cases are sorted alphabetically and executed in
+   that order. With NUnit 2.5.1, the individual cases are not sorted, but are
+   executed in the order in which NUnit discovers them. This order does <b>not</b>
+   follow the lexical order of the attributes and will often vary between different
+   compilers or different versions of the CLR.
+   
+<p>As a result, when <b>ValueSourceAttribute</b> appears multiple times on a 
+   parameter or when other data-providing attributes are used in combination with 
+   <b>ValueSourceAttribute</b>, the order of the arguments is undefined.
+
+<p>However, when a single <b>ValueSourceAttribute</b> is used by itself, 
+   the order of the arguments follows exactly the order in which the data 
+   is returned from the source.
+   
+<h3>Note on Object Construction</h3>
+
+<p>NUnit locates the test cases at the time the tests are loaded, creates
+instances of each class with non-static sources and builds a list of 
+tests to be executed. Each source object is only created once at this
+time and is destroyed after all tests are loaded. 
+
+<p>If the data source is in the test fixture itself, the object is created
+using the appropriate constructor for the fixture parameters provided on
+the <b>TestFixtureAttribute</b>, or
+the default constructor if no parameters were specified. Since this object
+is destroyed before the tests are run, no communication is possible between
+these two phases - or between different runs - except through the parameters
+themselves.
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/values.html b/doc/values.html
index 10cdf09..f7b7ab2 100644
--- a/doc/values.html
+++ b/doc/values.html
@@ -1,144 +1,144 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<title>NUnit - Values</title>
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<meta http-equiv="Content-Language" content="en-US">
-<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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - Values</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<meta http-equiv="Content-Language" content="en-US">
+<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">
-
-<h3>ValuesAttribute (NUnit 2.5)</h3>
-
-<p>The <b>ValuesAttribute</b> is used to specify a set of values to be provided
-   for an individual parameter of a parameterized test method. Since
-   NUnit combines the data provided for each parameter into a set of
-   test cases, data must be provided for all parameters if it is
-   provided for any of them.
-   
-<p>By default, NUnit creates test cases from all possible combinations
-   of the datapoints provided on parameters - the combinatorial approach.
-   This default may be modified by use of specific attributes on the
-   test method itself.
-   
-<h4>Example</h4>
-
-<p>The following test will be executed six times, as follows:
-<pre>
-	MyTest(1, "A")
-	MyTest(1, "B")
-	MyTest(2, "A")
-	MyTest(2, "B")
-	MyTest(3, "A")
-	MyTest(3, "B")
-</pre>
-<div class="code"><pre>
-[Test]
-public void MyTest(
-    [Values(1,2,3)] int x,
-    [Values("A","B")] string s)
-{
-    ...
-}
-</pre></div>
-
-<h4>See also...</h4>
-<ul>
-<li><a href="range.html">RangeAttribute</a><li><a href="random.html">RandomAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
-
-</div>
-
-<!-- Submenu -->
-<div id="subnav">
-<ul>
-<li><a href="index.html">NUnit 2.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><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 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 -->
-
-
-<!-- Standard Footer for NUnit.org -->
-<div id="footer">
-  Copyright © 2012 Charlie Poole. All Rights Reserved.
-</div>
-<!-- End of Footer -->
-
-</body>
-</html>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h3>ValuesAttribute (NUnit 2.5)</h3>
+
+<p>The <b>ValuesAttribute</b> is used to specify a set of values to be provided
+   for an individual parameter of a parameterized test method. Since
+   NUnit combines the data provided for each parameter into a set of
+   test cases, data must be provided for all parameters if it is
+   provided for any of them.
+   
+<p>By default, NUnit creates test cases from all possible combinations
+   of the datapoints provided on parameters - the combinatorial approach.
+   This default may be modified by use of specific attributes on the
+   test method itself.
+   
+<h4>Example</h4>
+
+<p>The following test will be executed six times, as follows:
+<pre>
+	MyTest(1, "A")
+	MyTest(1, "B")
+	MyTest(2, "A")
+	MyTest(2, "B")
+	MyTest(3, "A")
+	MyTest(3, "B")
+</pre>
+<div class="code"><pre>
+[Test]
+public void MyTest(
+    [Values(1,2,3)] int x,
+    [Values("A","B")] string s)
+{
+    ...
+}
+</pre></div>
+
+<h4>See also...</h4>
+<ul>
+<li><a href="range.html">RangeAttribute</a><li><a href="random.html">RandomAttribute</a><li><a href="sequential.html">SequentialAttribute</a><li><a href="combinatorial.html">CombinatorialAttribute</a><li><a href="pairwise.html">PairwiseAttribute</a></ul>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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><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 id="current"><a href="values.html">Values</a></li>
+<li><a href="valueSource.html">ValueSource</a></li>
+</ul>
+<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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/vsSupport.html b/doc/vsSupport.html
index dbde671..ff000dc 100644
--- a/doc/vsSupport.html
+++ b/doc/vsSupport.html
@@ -1,150 +1,151 @@
-<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!-- Standard Head Part -->
-<head>
-<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>
-<!-- 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>
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<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>
+<!-- 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>Visual Studio Support</h2>
-
-<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 
-NUnit as the command. For a VS2003 C# project, you can use $(TargetPath) for the arguments and
-$(TargetDir) for the initial directory. 
-
-<p>With Visual Studio VS2005 this becomes a bit harder, because that release changed the
-meaning of the 'Target' macros so they now point to the intermediate 'obj' directories rather
-than the final output in one of the 'bin' directories. Here are some alternatives that
-work in both versions:
-
-<ul>
-<li><b>$(ProjectDir)$(ProjectFileName)</b> to open the VS Project rather than the assembly.
-    If you use this approach, be sure to rename your config file accordingly and put it
-	in the same directory as the VS project file.
-<li><b>$(ProjectDir)bin/Debug/$(TargetName)$(TargetExt)</b> to run the assembly directly.
-    Note that this requires hard-coding part of the path, including the configuration.
-</ul>
-
-<p>If you would like to debug your tests, use the Visual Studio
-Debug | Processes� menu item to attach to NUnit after starting it and set breakpoints in
-your test code as desired before running the tests.</p>
-
-<h3>Using Console Interface to Debug Applications</h3>
-
-<p>When the nunit-console program is run in debug mode under Visual Studio, it detects that it is
-running in this mode and sends output to the Visual Studio output window. Output is formatted so
-that double clicking any error or failure entries opens the appropriate test file at the location
-where the failure was detected.</p>
-
-<h3>Opening Visual Studio Projects</h3>
-
-<p>When Visual Studio support is enabled, the File Open dialog displays the following supported
-Visual Studio project types: C#, VB.Net, J# and C++. The project file is read and the
-configurations and output assembly locations are identified. Since the project files do not contain
-information about the most recently opened configuration, the output assembly for the first
-configuration found (usually Debug) is loaded in the GUI. The tree shows the project as the toplevel
-node with the assembly shown as its descendant.</p>
-
-<p>Beginning with NUnit 2.2.2, you may also open a Visual Studio project by dragging it to the gui tree control.</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.
-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>
-On the other hand, the following command would load the tests using the configuration file
-nunit.tests.config located in the same directory as the csproj file.
-      <pre class="programtext">        nunit.exe nunit.tests.csproj</pre>
-The same consideration applies to running tests using the console runner.</p>
-
-<h3>Opening Visual Studio Solutions</h3>
-
-<p>When Visual Studio support is enabled, solution files may be opened as well. All the output
-assemblies from contained projects of the types supported will be loaded in the tree. In the case
-where all contained projects are located in the subdirectories beneath the solution, it will be
-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
-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>
-
-<h3>Adding Visual Studio Projects to the Open Test Project</h3>
-
-<p>When Visual Studio support is enabled, the Project menu contains an active entry to add a VS
-project to the loaded project. The output assembly will be added for each of the configurations
-specified in the VS project.</p>
-
-</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>
-<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>
-<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
-<li id="current"><a href="vsSupport.html">Visual Studio Support</a></li>
-</ul>
-<li><a href="extensibility.html">Extensibility</a></li>
-<li><a href="releaseNotes.html">Release Notes</a></li>
-<li><a href="samples.html">Samples</a></li>
-<li><a href="license.html">License</a></li>
-</ul>
-<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>
+  </div>
+</div>
+<!-- End of Header -->
+
+<div id="content">
+
+<h2>Visual Studio Support</h2>
+
+<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 
+NUnit as the command. For a VS2003 C# project, you can use $(TargetPath) for the arguments and
+$(TargetDir) for the initial directory. 
+
+<p>With Visual Studio VS2005 this becomes a bit harder, because that release changed the
+meaning of the 'Target' macros so they now point to the intermediate 'obj' directories rather
+than the final output in one of the 'bin' directories. Here are some alternatives that
+work in both versions:
+
+<ul>
+<li><b>$(ProjectDir)$(ProjectFileName)</b> to open the VS Project rather than the assembly.
+    If you use this approach, be sure to rename your config file accordingly and put it
+	in the same directory as the VS project file.
+<li><b>$(ProjectDir)bin/Debug/$(TargetName)$(TargetExt)</b> to run the assembly directly.
+    Note that this requires hard-coding part of the path, including the configuration.
+</ul>
+
+<p>If you would like to debug your tests, use the Visual Studio
+Debug | Processes� menu item to attach to NUnit after starting it and set breakpoints in
+your test code as desired before running the tests.</p>
+
+<h3>Using Console Interface to Debug Applications</h3>
+
+<p>When the nunit-console program is run in debug mode under Visual Studio, it detects that it is
+running in this mode and sends output to the Visual Studio output window. Output is formatted so
+that double clicking any error or failure entries opens the appropriate test file at the location
+where the failure was detected.</p>
+
+<h3>Opening Visual Studio Projects</h3>
+
+<p>When Visual Studio support is enabled, the File Open dialog displays the following supported
+Visual Studio project types: C#, VB.Net, J# and C++. The project file is read and the
+configurations and output assembly locations are identified. Since the project files do not contain
+information about the most recently opened configuration, the output assembly for the first
+configuration found (usually Debug) is loaded in the GUI. The tree shows the project as the toplevel
+node with the assembly shown as its descendant.</p>
+
+<p>Beginning with NUnit 2.2.2, you may also open a Visual Studio project by dragging it to the gui tree control.</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.
+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>
+On the other hand, the following command would load the tests using the configuration file
+nunit.tests.config located in the same directory as the csproj file.
+      <pre class="programtext">        nunit.exe nunit.tests.csproj</pre>
+The same consideration applies to running tests using the console runner.</p>
+
+<h3>Opening Visual Studio Solutions</h3>
+
+<p>When Visual Studio support is enabled, solution files may be opened as well. All the output
+assemblies from contained projects of the types supported will be loaded in the tree. In the case
+where all contained projects are located in the subdirectories beneath the solution, it will be
+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
+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>
+
+<h3>Adding Visual Studio Projects to the Open Test Project</h3>
+
+<p>When Visual Studio support is enabled, the Project menu contains an active entry to add a VS
+project to the loaded project. The output assembly will be added for each of the configurations
+specified in the VS project.</p>
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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>
+<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>
+<li><a href="multiAssembly.html">Multiple Assemblies</a></li>
+<li id="current"><a href="vsSupport.html">Visual Studio Support</a></li>
+</ul>
+<li><a href="extensibility.html">Extensibility</a></li>
+<li><a href="releaseNotes.html">Release Notes</a></li>
+<li><a href="samples.html">Samples</a></li>
+<li><a href="license.html">License</a></li>
+</ul>
+<li><a href="vsTestAdapter.html">NUnit Test Adapter</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/vsTestAdapter.html b/doc/vsTestAdapter.html
index ed82533..ef31cf1 100644
--- a/doc/vsTestAdapter.html
+++ b/doc/vsTestAdapter.html
@@ -1,123 +1,136 @@
-<!-- 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>
+<!-- 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>
+  </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.94, is designed to work
+   with Studio 2012 RTM or Update 1. Some features are not available under
+   the RTM.
+   
+<p>Note that Releases of Visual Studio prior to VS 2012 did not have the 
+   ability to directly run 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 2012, 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
+   the menu ( <b>Test | Windows | Test Explorer</b> ) 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 Test Explorer.
+
+<p>Click on <b>Run All</b> in the 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. The context menu 
+   also contains entries for debugging tests and for navigating to the source 
+   code of a test.
+   
+<p>Tests may be grouped by Duration and Outcome under VS2012 RTM and also
+   by Traits and Project using Update 1. NUnit translates any Categories
+   and Properties used on your tests to Visual Studio as Traits.
+   
+<p>Tests may be filtered under Update 1 by Trait, Project, Error Message,
+   File Path, Fully Qualified Name, Output and Outcome. Use the search
+   edit box at the top of the list of tests to specify a filter.
+
+<h3>Known Problems</h3>
+
+<ol>
+<li><p>There is no test status in Visual Studio corresponding to NUnit's 
+    <b>Inconclusive</b> result, so tests with this result are reported as 
+    <b>Not Run</b>. Click on the individual test to see the result.
+
+<li><p>Grouping by fixture is not yet available.in Visual Studio.
+
+<li><p>Theories are reported as individual cases, rather as a single unit.
+
+<li><p>Startup performance is substantially improved but is still slower
+    than using NUnit directly.
+</ol>
+
+<h3>Reporting Problems</h3>
+
+<p>Bugs should be reported using the separate test adapter
+<a href="http://bugs.launchpad.net/nunit-vs-adapter">bug tracker</a> on Launchpad.
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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
index 178314d..81122a6 100644
--- a/doc/vsTestAdapterLicense.html
+++ b/doc/vsTestAdapterLicense.html
@@ -1,90 +1,91 @@
-<!-- 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>
+<!-- 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>
+  </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.3</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</a></li>
+<ul>
+<li id="current"><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/vsTestAdapterReleaseNotes.html b/doc/vsTestAdapterReleaseNotes.html
new file mode 100644
index 0000000..14dc14d
--- /dev/null
+++ b/doc/vsTestAdapterReleaseNotes.html
@@ -0,0 +1,171 @@
+<!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<!-- Standard Head Part -->
+<head>
+<title>NUnit - VsTestAdapterReleaseNotes</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>
+
+<h3>NUnit Test Adapter for Visual Studio (Beta 4) - Version 0.94 - December 22, 2012</h3>
+
+<h4>Features</h4>
+
+<ul>
+<li>Works with Visual Studio 2012 Update 1 as well as the RTM.
+<li>Supports filtering and sorting tests by Traits under Update 1.
+<li>Supports use of standard filter expressions when running under TFS Update 1.
+<li>NUnit Categories specified on the fixture class are now recognized and honored.
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>1074891 	Can't test multiple assemblies referencing different NUnit versions
+<li>1075893 	Test execution fails if solution contains native C++ project
+<li>1076012 	No source information found for async test methods
+<li>1087629 	TestFixture Category not being recognised as traits in VS2012 update 1
+<li>1091020 	Adapter doesnt support TFS Build traits/test case filtering
+</ul>
+
+<h3>NUnit Test Adapter for Visual Studio (Beta 3-2) - Version 0.93.2 - November 2, 2012</h3>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>1074544   Failures in Test Discovery not reporting sufficient information
+</ul>
+
+<h3>NUnit Test Adapter for Visual Studio (Beta 3-1) - Version 0.93.1 - October 26, 2012</h3>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>1072150 	NUnit adapter 0.93 won't run selected tests
+</ul>
+
+<h3>NUnit Test Adapter for Visual Studio (Beta 3) - Version 0.93 - October 24, 2012</h3>
+
+<h4>Features</h4>
+
+<ul>
+<li>Works with Visual Studio 2012 RTM. Some features require the November CTP update.
+<li>The adapter now uses NUnit 2.6.2. Among other things, this allows us to support async test methods. See the NUnit <a href="releaseNotes.html">Release Notes</a> for more info.
+<li>Source file and line number can now be found for test cases that have an alternate name set.
+<li>Console output from tests is now displayed in the Visual Studio Output window.
+<li>TestFixtureSetUp and TestFixtureTearDown errors are now displayed in the Output window.
+<li>The caret line (------^) is no longer displayed in the IDE since it depends on use of a fixed font.
+<li>Tests may now be grouped and filtered by Category (only under the November CTP update for VS2012).
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>1021144 	Text output from tests not displayed in Visual Studio IDE
+<li>1033623 	Not possible to include or exclude tests based on [Category] attribute Released
+<li>1040779 	Null reference exception on generic test fixtures
+<li>1064620 	Support async test methods
+<li>1065209 	Should call both RecordEnd and RecordResult at end of a test
+<li>1065212 	Upgrade NUnit to 2.6.2
+<li>1065223 	Error messages assume a fixed font, but don't get one
+<li>1065225 	No display for TestFixtureSetUp/TearDown or SetUpFixture errors
+<li>1065254 	Cannot open test from Test Explorer for tests in a Parameterized Test Fixture
+<li>1065306 	Generic Fixtures aren't discovered.
+<li>1066393 	Unable to display source for testcases with an alternate name set
+<li>1066518 	Executed fast test appears in Not Run category in Test Explorer
+</ul>
+
+<h3>NUnit Test Adapter for Visual Studio (Beta 2) - Version 0.92 - May 3, 2012
+
+<h4>Features</h4>
+
+<ul>
+<li>Works with Visual Studio 2012 Release Candidate
+<li>Uses NUnit 2.6
+</ul>
+
+<h4>Bug Fixes</h4>
+
+<ul>
+<li>992837 Unable to Debug using VS Test Adapter
+<li>994146 Can't run tests under .NET 2.0/3.5
+</ul>
+
+<h3>NUnit Test Adapter for Visual Studio (Beta 1) - Version 0.91 - February 29, 2012
+
+<h4>Features</h4>
+
+<ul>
+<li>Built against Visual Studio 11 Beta 1
+<li>Uses NUnit 2.6
+</ul>
+
+<h3>NUnit Test Adapter for Visual Studio (Alpha) - Version 0.90 - February 21, 2012
+
+<h4>Features</h4>
+
+<ul>
+<li>First release of the test adapter. Compatible with the Visual Studio 11 Developer Preview.
+<li>Uses NUnit 2.6.
+</ul>
+
+
+</div>
+
+<!-- Submenu -->
+<div id="subnav">
+<ul>
+<li><a href="index.html">NUnit 2.6.3</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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li id="current"><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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
index 178a764..dcb4ee5 100644
--- a/doc/writingTests.html
+++ b/doc/writingTests.html
@@ -1,80 +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>
+<!-- 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>
+  </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.3</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="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</a></li>
+<ul>
+<li><a href="vsTestAdapterLicense.html">License</a></li>
+<li><a href="vsTestAdapterReleaseNotes.html">Release Notes</a></li>
+</ul>
+<li><a href="&r=2.6.3.html"></a></li>
+<li><a href="&r=2.6.3.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/NSubstitute.wxs b/install/NSubstitute.wxs
new file mode 100644
index 0000000..fef7288
--- /dev/null
+++ b/install/NSubstitute.wxs
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Fragment>
+
+    <DirectoryRef Id="lib" FileSource="bin\lib">
+
+      <Component Id="NSubstitute">
+        <File Id="NSubstitute.dll" Name="NSubstitute.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+  </Fragment>
+
+</Wix>
diff --git a/install/NUnit-net-1.1.wxs b/install/NUnit-net-1.1.wxs
new file mode 100644
index 0000000..b283c9c
--- /dev/null
+++ b/install/NUnit-net-1.1.wxs
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Product
+    UpgradeCode="EE7297AC-EF4E-4415-8621-0066AA2D57D4"
+    Name="NUnit $(var.NominalVersion) (.NET 1.1 Support)"
+    Id="87C7C49D-9F6E-490E-96DD-285D4B23D979"
+    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 Install Conditions             ********** -->
+    <!-- ***************************************************************** -->
+
+    <Condition Message="NUnit (.NET 1.1 Support) requires .NET 1.0, .NET 1.1 or Mono to be installed as a prerequisite.">
+      FRAMEWORK10 OR FRAMEWORK11 OR MONODIRECTORY
+    </Condition>
+
+    <!-- ***************************************************************** -->
+    <!-- **********  Define Properties used in the install      ********** -->
+    <!-- ***************************************************************** -->
+
+    <Property Id="FRAMEWORK10">
+      <RegistrySearch Id="Framework10Registry" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework\policy\v1.0" Name="3705" />
+    </Property>
+
+    <Property Id="FRAMEWORK11">
+      <RegistrySearch Id="Framework11Registry" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework\policy\v1.1" Name="4322" />
+    </Property>
+
+    <Property Id="MONODEFAULTCLR">
+      <RegistrySearch Id="MonoDefaultClr" Type="raw" Root="HKLM" Key="Software\Novell\Mono" Name="DefaultCLR" />
+    </Property>
+
+    <Property Id="MONODIRECTORY">
+      <RegistrySearch Id="MonoDirectory" Type="directory" Root="HKLM" Key="Software\Novell\Mono\[MONODEFAULTCLR]" Name="SDKInstallRoot" />
+    </Property>
+
+    <Property Id="CMD_EXE" Value="[!SystemFolder]cmd.exe" />
+
+    <!-- ***************************************************************** -->
+    <!-- *********  Properties for the Add Remove Programs list  ********* -->
+    <!-- ***************************************************************** -->
+
+    <Property Id="ARPCONTACT" Value="Charlie Poole" />
+    <Property Id="ARPPRODUCTICON" Value="nunit_icon.exe" />
+    <Property Id="ARPHELPLINK" Value="http://lists.sourceforge.net/lists/listinfo/nunit-users" />
+    <Property Id="ARPREADME" Value="http://nunit.org/?p=releaseNotes&r=2.6" />
+    <Property Id="ARPURLINFOABOUT" Value="NUnit is a testing framework for all .NET languages" />
+    <Property Id="ARPURLUPDATEINFO" Value="http://nunit.org?p=download" />
+
+
+    <!-- ***************************************************************** -->
+    <!-- **********       Define Directory Structure            ********** -->
+    <!-- ***************************************************************** -->
+
+    <Directory Id="TARGETDIR" Name="SourceDir">
+
+      <Directory Id="ProgramFilesFolder" Name="PFiles">
+
+        <!-- Target locations for NUnit Files -->
+        <Directory Id="INSTALLDIR" Name="NUnit $(var.NominalVersion)">
+
+          <Directory Id="parent" Name="bin">
+
+            <Directory Id="bin" Name="net-1.1">
+
+              <Directory Id="lib" Name="lib" />
+              <Directory Id="addins" Name="addins" />
+              <Directory Id="tests" Name="tests" />
+              <Directory Id="framework" Name="framework" />
+
+            </Directory>
+
+          </Directory>
+
+        </Directory>
+
+      </Directory>
+
+      <!-- Desktop Folder Directory for our Desktop Shortcut -->
+      <Directory Id="DesktopFolder" Name="." SourceName="User's Desktop" />
+
+      <!-- Program Menu Folder and our subfolders for Shortcuts -->
+      <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)"
+               Type="integer" Name="NUnitMenu" Value="1" />
+          </Component>
+        </Directory>
+      </Directory>
+
+    </Directory>
+
+
+    <!-- ***************************************************************** -->
+    <!-- **********      Define the NUnit feature tree          ********** -->
+    <!-- ***************************************************************** -->
+
+    <Feature Id="BaseFeature" ConfigurableDirectory="INSTALLDIR" Level="1" Title="NUnit $(var.NominalVersion)" Display="expand" Description="Installs the NUnit console runner for .NET 1.1 and supporting assemblies required to write and run tests.">
+
+      <!-- Defined in this file -->
+      <ComponentRef Id="NUnitMenu" />
+
+      <!-- Defined in base-net-1.1.wxs -->
+      <ComponentRef Id="license.txt" />
+      <ComponentRef Id="Logo.ico" />
+      <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="console.dll" />
+      <ComponentRef Id="nunit_agent" />
+
+      <Feature Id="PNUnitRunner" Level="10" Title="PNUnit Runner" Display="expand" Description="Installs the PNUnit runner for parallel distributed tests.">
+
+        <!-- Defined in pnunit.wxs -->
+        <ComponentRef Id="pnunit_agent" />
+        <ComponentRef Id="pnunit_launcher" />
+        <ComponentRef Id="pnunit_framework" />
+        <ComponentRef Id="log4net" />
+
+      </Feature>
+
+      <Feature Id="TestsFeature" Level="10" Title="Unit Tests" Display="expand" Description="Installs the unit tests for NUnit itself">
+
+        <!-- Defined in tests.wxs -->
+        <ComponentRef Id="NUnitTestProject" />
+        <ComponentRef Id="framework_copy_for_tests" />
+        <ComponentRef Id="base_tests" />
+
+        <!-- Defined in pnunit.wxs -->
+        <ComponentRef Id="pnunit_tests" />
+
+      </Feature>
+
+    </Feature>
+
+    <!-- The NUnit files are all in a single cab file that is embedded in the MSI -->
+    <Media Id="1" EmbedCab="yes" Cabinet="nunit.cab" />
+
+    <!-- ***************************************************************** -->
+    <!-- **********  Define our GUI using standard WiX UI       ********** -->
+    <!-- ***************************************************************** -->
+
+    <UIRef Id="WixUI_Mondo" />
+    <!--<UIRef Id="WixUI_FeatureTree" />-->
+    <UIRef Id="WixUI_ErrorProgressText" />
+
+    <Icon Id="nunit_icon.exe" SourceFile="Logo.ico" />
+
+  </Product>
+</Wix>
\ No newline at end of file
diff --git a/install/NUnit.wxs b/install/NUnit.wxs
index c18f2a8..c5f5d18 100644
--- a/install/NUnit.wxs
+++ b/install/NUnit.wxs
@@ -1,278 +1,224 @@
-<?xml version="1.0" encoding="utf-8"?>
-<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 Install Conditions             ********** -->
-    <!-- ***************************************************************** -->
-
-    <Condition Message="NUnit requires .NET 2.0, .NET 4.0 or Mono to be installed as a prerequisite.">
-      FRAMEWORK20 OR FRAMEWORK40 OR MONODIRECTORY
-    </Condition>
-
-    <!-- ***************************************************************** -->
-    <!-- **********  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" />
-    </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" />
-    </Property>
-
-    <Property Id="MONODIRECTORY">
-      <RegistrySearch Id="MonoDirectory" Type="directory" Root="HKLM" Key="Software\Novell\Mono\[MONODEFAULTCLR]" Name="SDKInstallRoot" />
-    </Property>
-
-    <Property Id="CMD_EXE" Value="[!SystemFolder]cmd.exe" />
-
-    <!-- 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="ARPHELPLINK" Value="http://lists.sourceforge.net/lists/listinfo/nunit-users" />
-    <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" />
-
-
-    <!-- ***************************************************************** -->
-    <!-- **********       Define Directory Structure            ********** -->
-    <!-- ***************************************************************** -->
-
-    <Directory Id="TARGETDIR" Name="SourceDir">
-
-      <Directory Id="ProgramFilesFolder" Name="PFiles">
-
-        <!-- Target locations for NUnit Files -->
-        <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>
-
-          <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>
-
-      </Directory>
-
-      <!-- Desktop Folder Directory for our Desktop Shortcut -->
-      <Directory Id="DesktopFolder" Name="." SourceName="User's Desktop" />
-
-      <!-- Program Menu Folder and our subfolders for Shortcuts -->
-      <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>
-
-    </Directory>
-
-
-    <!-- ***************************************************************** -->
-    <!-- **********      Define the NUnit feature tree          ********** -->
-    <!-- ***************************************************************** -->
-
-    <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" />
-
-      </Feature>
-
-      <!-- Defined in pnunit.wxs -->
-      <Feature Id="PNunitRunner" Level="10" Title="PNUnit Runner" Display="expand" Description="Installs the PNUnit runner for parallel distributed tests.">
-
-        <!-- Defined in pnunit.wxs -->
-        <ComponentRef Id="pnunit_agent" />
-        <ComponentRef Id="pnunit_launcher" />
-        <ComponentRef Id="pnunit_framework" />
-        <ComponentRef Id="log4net" />
-
-      </Feature>
-
-      <Feature Id="TestsFeature" Level="10" Title="Unit Tests" Display="expand" Description="Installs the unit tests for NUnit itself.">
-
-        <!-- Defined in tests.wxs -->
-        <ComponentRef Id="NUnitTestProject" />
-        <ComponentRef Id="framework_copy_for_tests" />
-        <ComponentRef Id="base_tests" />
-
-        <!-- Defined in NSubstitute.wxs -->
-        <ComponentRef Id="NSubstitute" />
-
-        <!-- Defined in pnunit.wxs -->
-        <ComponentRef Id="pnunit_tests" />
-
-        <!-- Defined in nunit-gui.wxs -->
-        <ComponentRef Id="gui_tests" />
-
-      </Feature>
-
-      <Feature Id="DocumentationFeature" Level="1" Title="Documentation" Display="expand" Description="Installs the NUnit documentation.">
-
-        <!-- Defined in doc.wxs -->
-        <ComponentRef Id="HtmlDocs" />
-        <ComponentRef Id="DocFiles" />
-        <ComponentRef Id="DocImages" />
-        <ComponentRef Id="MenuShortcut_NUnitHelp"/>
-
-      </Feature>
-
-      <!-- Defined in samples.wxs -->
-      <Feature Id="SamplesFeature" Level="1" Title="Samples" Display="collapse" Description="Installs sample code showing the use of NUnit.">
-
-        <ComponentRef Id="C__SamplesCommon" />
-        <ComponentRef Id="C__SampleShortcuts" />
-
-        <Feature Id="CSharpSamples" Level="1" Title="C# Samples" Display="expand" Description="Installs C# samples.">
-
-          <ComponentRef Id="C__CSharp_Samples" />
-          <ComponentRef Id="C__CSharp_Failures" />
-          <ComponentRef Id="C__CSharp_Money" />
-          <ComponentRef Id="C__CSharp_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" />
-
-        </Feature>
-
-        <Feature Id="VBSamples" Level="1" Title="Visual Basic Samples" Display="expand" Description="Installs Visual Basic samples.">
-
-          <ComponentRef Id="C__VB_Samples" />
-          <ComponentRef Id="C__VB_Failures" />
-          <ComponentRef Id="C__VB_Money" />
-          <ComponentRef Id="C__VB_Syntax" />
-
-        </Feature>
-
-        <Feature Id="JSharpSamples" Level="1" Title="J# Samples" Display="expand" Description="Installs J# samples.">
-
-          <ComponentRef Id="C__JSharp_Samples" />
-          <ComponentRef Id="C__JSharp_Failures" />
-
-        </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" />
-
-          <!-- C++/CLI Samples -->
-          <ComponentRef Id="C__CPP_CLI_Samples" />
-          <ComponentRef Id="C__CPP_CLI_Failures" />
-          <ComponentRef Id="C__CPP_CLI_Syntax" />
-
-        </Feature>
-
-      </Feature>
-
-    </Feature>
-
-    <!-- The NUnit files are all in a single cab file that is embedded in the MSI -->
-    <Media Id="1" EmbedCab="yes" Cabinet="nunit.cab" />
-
-    <!-- ***************************************************************** -->
-    <!-- **********  Define our GUI using standard WiX UI       ********** -->
-    <!-- ***************************************************************** -->
-
-    <UIRef Id="WixUI_Mondo" />
-    <!--<UIRef Id="WixUI_FeatureTree" />-->
-    <UIRef Id="WixUI_ErrorProgressText" />
-
-    <Icon Id="nunit_icon.exe" SourceFile="Logo.ico" />
-
-  </Product>
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Product 
+    UpgradeCode="009074FF-2CEC-4b0c-9951-B07186F9ED3A" 
+    Name="NUnit $(var.NominalVersion)"
+    Id="002B407D-DE66-4601-A10C-45941586C767"
+    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 Install Conditions             ********** -->
+    <!-- ***************************************************************** -->
+
+    <Condition Message="NUnit requires .NET 2.0, .NET 4.0 or Mono to be installed as a prerequisite.">
+      FRAMEWORK20 OR FRAMEWORK40 OR MONODIRECTORY
+    </Condition>
+
+    <!-- ***************************************************************** -->
+    <!-- **********  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" />
+    </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" />
+    </Property>
+
+    <Property Id="MONODIRECTORY">
+      <RegistrySearch Id="MonoDirectory" Type="directory" Root="HKLM" Key="Software\Novell\Mono\[MONODEFAULTCLR]" Name="SDKInstallRoot" />
+    </Property>
+
+    <Property Id="CMD_EXE" Value="[!SystemFolder]cmd.exe" />
+
+    <!-- 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="ARPHELPLINK" Value="http://lists.sourceforge.net/lists/listinfo/nunit-users" />
+    <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" />
+
+
+    <!-- ***************************************************************** -->
+    <!-- **********       Define Directory Structure            ********** -->
+    <!-- ***************************************************************** -->
+
+    <Directory Id="TARGETDIR" Name="SourceDir">
+
+      <Directory Id="ProgramFilesFolder" Name="PFiles">
+
+        <!-- Target locations for NUnit Files -->
+        <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>
+
+        </Directory>
+
+      </Directory>
+
+      <!-- Desktop Folder Directory for our Desktop Shortcut -->
+      <Directory Id="DesktopFolder" Name="." SourceName="User's Desktop" />
+
+      <!-- Program Menu Folder and our subfolders for Shortcuts -->
+      <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>
+      </Directory>
+
+    </Directory>
+
+
+    <!-- ***************************************************************** -->
+    <!-- **********      Define the NUnit feature tree          ********** -->
+    <!-- ***************************************************************** -->
+
+    <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" />
+
+      </Feature>
+
+      <!-- Defined in pnunit.wxs -->
+      <Feature Id="PNunitRunner" Level="10" Title="PNUnit Runner" Display="expand" Description="Installs the PNUnit runner for parallel distributed tests.">
+
+        <!-- Defined in pnunit.wxs -->
+        <ComponentRef Id="pnunit_agent" />
+        <ComponentRef Id="pnunit_launcher" />
+        <ComponentRef Id="pnunit_framework" />
+        <ComponentRef Id="log4net" />
+
+      </Feature>
+
+      <Feature Id="TestsFeature" Level="10" Title="Unit Tests" Display="expand" Description="Installs the unit tests for NUnit itself.">
+
+        <!-- Defined in tests.wxs -->
+        <ComponentRef Id="NUnitTestProject" />
+        <ComponentRef Id="framework_copy_for_tests" />
+        <ComponentRef Id="base_tests" />
+
+        <!-- Defined in NSubstitute.wxs -->
+        <ComponentRef Id="NSubstitute" />
+
+        <!-- Defined in pnunit.wxs -->
+        <ComponentRef Id="pnunit_tests" />
+
+        <!-- Defined in net45-tests.wxs -->
+        <ComponentRef Id="net45_tests" />
+
+        <!-- Defined in nunit-gui.wxs -->
+        <ComponentRef Id="gui_tests" />
+
+      </Feature>
+
+      <Feature Id="DocumentationFeature" Level="1" Title="Documentation" Display="expand" Description="Installs the NUnit documentation.">
+
+        <!-- Defined in doc.wxs -->
+        <ComponentRef Id="HtmlDocs" />
+        <ComponentRef Id="DocFiles" />
+        <ComponentRef Id="DocImages" />
+        <ComponentRef Id="MenuShortcut_NUnitHelp"/>
+
+      </Feature>
+
+    </Feature>
+
+    <!-- The NUnit files are all in a single cab file that is embedded in the MSI -->
+    <Media Id="1" EmbedCab="yes" Cabinet="nunit.cab" />
+
+    <!-- ***************************************************************** -->
+    <!-- **********  Define our GUI using standard WiX UI       ********** -->
+    <!-- ***************************************************************** -->
+
+    <UIRef Id="WixUI_Mondo" />
+    <!--<UIRef Id="WixUI_FeatureTree" />-->
+    <UIRef Id="WixUI_ErrorProgressText" />
+
+    <Icon Id="nunit_icon.exe" SourceFile="Logo.ico" />
+
+  </Product>
 </Wix>
\ No newline at end of file
diff --git a/install/base-net-1.1.wxs b/install/base-net-1.1.wxs
new file mode 100644
index 0000000..faa7d74
--- /dev/null
+++ b/install/base-net-1.1.wxs
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+  <Fragment>
+
+    <DirectoryRef Id="INSTALLDIR">
+
+      <Component Id="Logo.ico">
+        <File Id="Logo.ico" Name="Logo.ico" Source="Logo.ico" KeyPath="yes" />
+        <RemoveFile Id="RemoveThumbnails" Name="*" On="uninstall" />
+      </Component>
+
+      <Component Id="license.txt">
+        <File Id="license.txt" Source="license.txt" KeyPath="yes" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="bin" FileSource="bin">
+
+      <Component Id="nunit_console" Guid="F446D836-1FCE-4ef7-B290-E0F3B0EFBD40">
+        <File Id="console.exe" Name="nunit-console.exe" />
+        <File Id="console.config" Name="nunit-console.exe.config" />
+        <RemoveFolder Id="RemoveBinFolder" On="uninstall" />
+      </Component>
+
+      <Component Id="nunit_agent" Guid="D8D73966-60FF-467d-AD71-47388F66E4C0">
+        <File Id="nunit_agent.exe" Name="nunit-agent.exe" />
+        <File Id="nunit_agent.config" Name="nunit-agent.exe.config" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib" FileSource="bin\lib">
+
+      <Component Id="nunit.core">
+        <File Id="nunit.core.dll" Name="nunit.core.dll" />
+      </Component>
+
+      <Component Id="nunit.core.interfaces">
+        <File Id="nunit.core.interfaces.dll"
+              Name="nunit.core.interfaces.dll" />
+      </Component>
+
+      <Component Id="nunit.util">
+        <File Id="nunit.util.dll" Name="nunit.util.dll" />
+      </Component>
+
+      <Component Id="console.dll">
+        <File Id="console.dll.dll" Name="nunit-console-runner.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="addins">
+
+      <Component Id="AddinsFolder" Guid="D7905B7E-A9E8-42f6-B074-6A93A8FF4DE8">
+
+        <CreateFolder />
+        <RemoveFile Id="RemoveAddins" Name="*.*" On="uninstall" />
+        <RemoveFolder Id="RemoveAddinFolder" On="uninstall" />
+
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="framework" FileSource="bin\framework">
+
+      <Component Id="nunit.framework" Guid="352BE076-B7B8-4a0f-B953-F626B5D91144">
+        <File Id="nunit.framework.dll" Name="nunit.framework.dll" />
+        <File Id="nunit.framework.xml" Name="nunit.framework.xml" />
+      </Component>
+
+      <Component Id="nunit.mocks">
+        <File Id="nunit.mocks.dll" Name="nunit.mocks.dll" />
+      </Component>
+
+      <Component Id="AssemblyReferenceFolder">
+
+        <RegistryKey Root="HKMU"
+  Key="Software\Microsoft\.NETFramework\AssemblyFolder\NUnit [ProductVersion]"
+                     Action="createAndRemoveOnUninstall">
+          <RegistryValue Action="write" Type="string" Value="[framework]" />
+        </RegistryKey>
+
+      </Component>
+
+    </DirectoryRef>
+
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/install/base.wxs b/install/base.wxs
new file mode 100644
index 0000000..9f2b747
--- /dev/null
+++ b/install/base.wxs
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+  <Fragment>
+
+    <DirectoryRef Id="INSTALLDIR">
+
+      <Component Id="Logo.ico">
+        <File Id="Logo.ico"
+              Source="Logo.ico"
+              KeyPath="yes" />
+        <RemoveFile Id="RemoveThumbnails"
+                    Name="*"
+                    On="uninstall" />
+      </Component>
+
+      <Component Id="license.txt">
+        <File Id="license.txt" Source="license.txt" />
+      </Component>
+
+      <Component Id="InstallationRegistryEntry">
+        <RegistryKey Root="HKMU"
+                     Key="SOFTWARE\[Manufacturer]\NUnit\$(var.NominalVersion)"                      Action="createAndRemoveOnUninstall">
+          <RegistryValue Name="InstallDir"
+                         Action="write"
+                         Type="string"
+                         Value="[INSTALLDIR]" />
+          <RegistryValue Name="ProductVersion"
+                         Action="write"
+                         Type="string"
+                         Value="[ProductVersion]" />
+        </RegistryKey>
+        <RemoveFolder Id="RemoveInstallDir" On="uninstall"/>
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="bin" FileSource="bin">
+
+      <Component Id="nunit_console"
+                 Guid="6B31CFF2-575A-4dae-80AC-CF4AD3E46F7D">
+        <File Id="console.exe" Name="nunit-console.exe" />
+        <File Id="console.config" Name="nunit-console.exe.config" />
+        <RemoveFolder Id="RemoveBinFolder" On="uninstall"/>
+      </Component>
+
+      <Component Id="nunit_console_x86"
+                 Guid="A409E3D7-535F-4ad7-BC4A-534CFACCABC9">
+        <File Id="console_x86.exe" Name="nunit-console-x86.exe" />
+        <File Id="console_x86.config" Name="nunit-console-x86.exe.config" />
+      </Component>
+
+      <Component Id="nunit_agent"
+                 Guid="148230B8-4F7E-4a86-B2A9-51FCDCC218CF">
+        <File Id="nunit_agent.exe" Name="nunit-agent.exe" />
+        <File Id="nunit_agent.config" Name="nunit-agent.exe.config" />
+      </Component>
+
+      <Component Id="nunit_agent_x86"
+                 Guid="47AB79E2-38AD-49ca-9CDC-9B5A6B105097">
+        <File Id="nunit_agent_x86.exe" Name="nunit-agent-x86.exe" />
+        <File Id="nunit_agent_x86.config" Name="nunit-agent-x86.exe.config" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib" FileSource="bin\lib">
+
+      <Component Id="nunit.core">
+        <File Id="nunit.core.dll" Name="nunit.core.dll" />
+      </Component>
+
+      <Component Id="nunit.core.interfaces">
+        <File Id="nunit.core.interfaces.dll"
+              Name="nunit.core.interfaces.dll" />
+      </Component>
+
+      <Component Id="nunit.util">
+        <File Id="nunit.util.dll" Name="nunit.util.dll" />
+      </Component>
+
+      <Component Id="console.dll">
+        <File Id="console.dll.dll" Name="nunit-console-runner.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="addins">
+
+      <Component Id="AddinsFolder" Guid="2DD8DD2D-E3A7-49d7-BB93-1F55B568BCBB">
+        <CreateFolder />
+        <RemoveFile Id="RemoveAddins" Name="*.*" On="uninstall" />
+        <RemoveFolder Id="RemoveAddinFolder" On="uninstall" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="framework" FileSource="bin\framework">
+
+      <Component Id="nunit.framework"
+                 Guid="FB56F875-B4DD-4f35-A681-A160958DC54D">
+        <File Id="nunit.framework.dll" Name="nunit.framework.dll" />
+        <File Id="nunit.framework.xml" Name="nunit.framework.xml" />
+      </Component>
+
+      <Component Id="nunit.mocks">
+        <File Id="nunit.mocks.dll" Name="nunit.mocks.dll" />
+      </Component>
+
+      <Component Id="AssemblyReferenceFolder">
+        <RegistryKey Root="HKMU"
+                     Key="Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\NUnit [ProductVersion]"
+                     Action="createAndRemoveOnUninstall">
+          <RegistryValue Action="write" 
+                         Type="string"
+                         Value="[framework]" />
+        </RegistryKey>
+
+      </Component>
+
+    </DirectoryRef>
+
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/install/doc.wxs b/install/doc.wxs
index e03c80b..e01125e 100644
--- a/install/doc.wxs
+++ b/install/doc.wxs
@@ -1,187 +1,187 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-  <Fragment>
-
-    <DirectoryRef Id="doc" FileSource="doc">
-
-      <Component Id="HtmlDocs" Guid="B94DA2CD-CB19-43b6-8DE4-E588C7EA8A49">
-
-        <File Id="nunit.css" Name="nunit.css" />
-        <File Id="codeFuncs.js" Name="codeFuncs.js" />
-        <File Id="favicon.ico" Name="favicon.ico" />
-        <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" 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="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" 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="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="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>
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+  <Fragment>
+
+    <DirectoryRef Id="doc" FileSource="doc">
+
+      <Component Id="HtmlDocs" Guid="B94DA2CD-CB19-43b6-8DE4-E588C7EA8A49">
+
+        <File Id="nunit.css" Name="nunit.css" />
+        <File Id="codeFuncs.js" Name="codeFuncs.js" />
+        <File Id="favicon.ico" Name="favicon.ico" />
+        <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" 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="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" 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="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="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/net45-tests.wxs b/install/net45-tests.wxs
new file mode 100644
index 0000000..1808be7
--- /dev/null
+++ b/install/net45-tests.wxs
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Fragment>
+
+    <DirectoryRef Id="tests" FileSource="bin\tests">
+
+      <Component Id="net45_tests" Guid="2A57CB85-59B5-49B4-8C90-6A41A35D4C88">
+        <File Id="nunit.core.tests.net45" Name="nunit.core.tests.net45.dll" />
+        <File Id="test_assembly_net45" Name="test-assembly-net45.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+  </Fragment>
+
+</Wix>
diff --git a/install/nunit-gui.wxs b/install/nunit-gui.wxs
index 77baae0..ff89e60 100644
--- a/install/nunit-gui.wxs
+++ b/install/nunit-gui.wxs
@@ -1,230 +1,230 @@
-<?xml version="1.0" encoding="utf-8"?>
-<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" FileSource="bin\lib">
-
-      <Component Id="nunit_gui_runner">
-        <File Id="nunit_gui_runner" Name="nunit-gui-runner.dll" />
-      </Component>
-
-      <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">
-        <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>
-
-  </Fragment>
+<?xml version="1.0" encoding="utf-8"?>
+<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" FileSource="bin\lib">
+
+      <Component Id="nunit_gui_runner">
+        <File Id="nunit_gui_runner" Name="nunit-gui-runner.dll" />
+      </Component>
+
+      <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">
+        <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>
+
+  </Fragment>
 </Wix>
\ No newline at end of file
diff --git a/install/pnunit.wxs b/install/pnunit.wxs
new file mode 100644
index 0000000..f2c342a
--- /dev/null
+++ b/install/pnunit.wxs
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+  <Fragment>
+
+    <DirectoryRef Id="bin" FileSource="bin">
+
+      <Component Id="pnunit_agent" Guid="CB4CF43B-1D4B-40a7-859B-8B48802B3C07">
+        <File Id="pnunit_agent" Name="pnunit-agent.exe" />
+        <File Id="pnunit_agent_config" Name="pnunit-agent.exe.config" />
+        <File Id="agent_conf" Name="agent.conf" />
+        <File Id="agent_log_conf" Name="agent.log.conf" />
+      </Component>
+
+      <Component Id="pnunit_launcher" Guid="63A18689-3885-4429-8492-61FF79A21AE0">
+        <File Id="pnunit_launcher" Name="pnunit-launcher.exe" />
+        <File Id="pnunit_launcher_config" Name="pnunit-launcher.exe.config" />
+        <File Id="test_conf" Name="test.conf" />
+        <File Id="launcher_log_conf" Name="launcher.log.conf" />
+      </Component>
+
+      <Component Id="pnunit_tests" Guid="9A5B261D-43A1-475c-A4F0-721759E12A4F">
+        <File Id="pnunit_tests" Name="pnunit.tests.dll" />
+        <File Id="runpnunit_bat" Name="runpnunit.bat" />
+        <File Id="pnunit.framework.pnunit.copy" Name="pnunit.framework.dll" />
+        <File Id="nunit.framework.pnunit.copy" Name="nunit.framework.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="lib" FileSource="bin\lib">
+
+      <Component Id="log4net">
+        <File Id="log4net.dll" Name="log4net.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+    <DirectoryRef Id="framework" FileSource="bin\framework">
+
+      <Component Id="pnunit_framework">
+        <File Id="pnunit_framework" Name="pnunit.framework.dll" />
+      </Component>
+
+    </DirectoryRef>
+
+  </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/install/samples.wxs b/install/samples.wxs
deleted file mode 100644
index 2ecb2a7..0000000
--- a/install/samples.wxs
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-  <Fragment>
-
-    <!-- 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">
-        <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>
-
-      <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">
-
-      <Component Id="C__JSharp_Samples">
-        <File Id="jsharp.sln" Name="jsharp.sln" />
-      </Component>
-
-      <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">
-          <File Id="managed_cpp.sln" Name="managed-cpp.sln" />
-        </Component>
-
-        <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>
-
-      <!-- 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="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">
-
-      <Directory Id="core_extensibility" Name="Core">
-
-        <Component Id="C__CoreExtensibility">
-          <File Id="CoreExtensibility.sln" Name="CoreExtensibility.sln" />
-        </Component>
-
-        <Directory Id="Minimal" Name="Minimal">
-          <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="SampleSuiteExtension">
-          <Component Id="C__SampleSuiteExtension"
-                     Guid="2EDC393E-B725-406f-A9BC-824E3B72EE84">
-            <File Id="SSX_Addin.cs" Name="Addin.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"
-                       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="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>
-        </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 8270e3e..c649f42 100644
--- a/install/tests.wxs
+++ b/install/tests.wxs
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-  <Fragment>
-
-    <DirectoryRef Id="bin" FileSource="bin">
-
-      <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="tests" FileSource="bin\tests">
-
-      <Component Id="framework_copy_for_tests">
-        <File Id="nunit.framework.copy" Name="nunit.framework.dll" />
-      </Component>
-
-      <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>
-
-    </DirectoryRef>
-
-  </Fragment>
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+  <Fragment>
+
+    <DirectoryRef Id="bin" FileSource="bin">
+
+      <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="tests" FileSource="bin\tests">
+
+      <Component Id="framework_copy_for_tests">
+        <File Id="nunit.framework.copy" Name="nunit.framework.dll" />
+      </Component>
+
+      <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>
+
+    </DirectoryRef>
+
+  </Fragment>
 </Wix>
\ No newline at end of file
diff --git a/lib/3.5/NSubstitute.xml b/lib/3.5/NSubstitute.xml
index ca1bd9d..4bd55c1 100644
--- a/lib/3.5/NSubstitute.xml
+++ b/lib/3.5/NSubstitute.xml
@@ -1,85 +1,259 @@
-<?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>
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>NSubstitute</name>
+    </assembly>
+    <members>
+        <member name="T:NSubstitute.Arg">
+            <summary>
+            Argument matchers used for specifying calls to substitutes.
+            </summary>
+        </member>
+        <member name="M:NSubstitute.Arg.Any``1">
+            <summary>
+            Match any argument value compatible with type <typeparamref name="T"/>.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Is``1(``0)">
+            <summary>
+            Match argument that is equal to <paramref name="value"/>.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="value"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Is``1(System.Linq.Expressions.Expression{System.Predicate{``0}})">
+            <summary>
+            Match argument that satisfies <paramref name="predicate"/>. 
+            If the <paramref name="predicate"/> throws an exception for an argument it will be treated as non-matching.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="predicate"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Invoke">
+            <summary>
+            Invoke any <see cref="T:System.Action"/> argument as soon as a matching call is made to the substitute.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Invoke``1(``0)">
+            <summary>
+            Invoke any <see cref="T:System.Action`1"/> argument with specified argument as soon as a matching call is made to the substitute.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="arg"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Invoke``2(``0,``1)">
+            <summary>
+            Invoke any <see cref="T:System.Action`2"/> argument with specified arguments as soon as a matching call is made to the substitute.
+            </summary>
+            <typeparam name="T1"></typeparam>
+            <typeparam name="T2"></typeparam>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Invoke``3(``0,``1,``2)">
+            <summary>
+            Invoke any <see cref="T:System.Action`3"/> argument with specified arguments as soon as a matching call is made to the substitute.
+            </summary>
+            <typeparam name="T1"></typeparam>
+            <typeparam name="T2"></typeparam>
+            <typeparam name="T3"></typeparam>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <param name="arg3"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Invoke``4(``0,``1,``2,``3)">
+            <summary>
+            Invoke any <see cref="T:System.Action`4"/> argument with specified arguments as soon as a matching call is made to the substitute.
+            </summary>
+            <typeparam name="T1"></typeparam>
+            <typeparam name="T2"></typeparam>
+            <typeparam name="T3"></typeparam>
+            <typeparam name="T4"></typeparam>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <param name="arg3"></param>
+            <param name="arg4"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.InvokeDelegate``1(System.Object[])">
+            <summary>
+            Invoke any <typeparamref name="TDelegate"/> argument with specified arguments as soon as a matching call is made to the substitute.
+            </summary>
+            <typeparam name="TDelegate"></typeparam>
+            <param name="arguments">Arguments to pass to delegate.</param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Arg.Do``1(System.Action{``0})">
+            <summary>
+            Capture any argument compatible with type <typeparamref name="T"/> and use it to call the <paramref name="useArgument"/> function 
+            as soon as a matching call is made to the substitute.
+            </summary>
+            <typeparam name="T"></typeparam>
+            <param name="useArgument"></param>
+            <returns></returns>
+        </member>
+        <member name="T:NSubstitute.IArgumentMatcher">
+            <summary>
+            Provides a specification for arguments for use with <see ctype="Arg.Matches (IArgumentMatcher)" />.
+            Can additionally implement <see ctype="IDescribeNonMatches" /> to give descriptions when arguments do not match.
+            </summary>
+        </member>
+        <member name="M:NSubstitute.IArgumentMatcher.IsSatisfiedBy(System.Object)">
+            <summary>
+            Checks whether the <paramref name="argument"/> satisfies the condition of the matcher.
+            If this throws an exception the argument will be treated as non-matching.
+            </summary>
+            <param name="argument"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.IDescribeNonMatches.DescribeFor(System.Object)">
+            <summary>
+            Describes how the <paramref name="argument"/> does not match the condition specified by this class, or <see cref="F:System.String.Empty"/>
+            if a detailed description can not be provided for the argument.
+            </summary>
+            <param name="argument"></param>
+            <returns>Description of the non-match, or <see cref="F:System.String.Empty"/> if no description can be provided.</returns>
+        </member>
+        <member name="M:NSubstitute.Core.Extensions.Zip``3(System.Collections.Generic.IEnumerable{``0},System.Collections.Generic.IEnumerable{``1},System.Func{``0,``1,``2})">
+            <summary>
+            Combines two enumerables into a new enumerable using the given selector.
+            </summary>
+            <typeparam name="TFirst"></typeparam>
+            <typeparam name="TSecond"></typeparam>
+            <typeparam name="TResult"></typeparam>
+            <param name="first"></param>
+            <param name="second"></param>
+            <param name="selector"></param>
+            <returns></returns>
+            <remarks>
+            This implementation was sanity-checked against the 
+            <a href="http://msmvps.com/blogs/jon_skeet/archive/2011/01/14/reimplementing-linq-to-objects-part-35-zip.aspx">Edulinq implementation</a> and
+            <a href="http://blogs.msdn.com/b/ericlippert/archive/2009/05/07/zip-me-up.aspx">Eric Lippert's implementation</a>.
+            </remarks>
+        </member>
+        <member name="M:NSubstitute.Core.Extensions.IsCompatibleWith(System.Object,System.Type)">
+            <summary>
+            Checks if the instance can be used when a <paramref name="type"/> is expected.
+            </summary>
+            <param name="instance"></param>
+            <param name="type"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NSubstitute.Core.Extensions.Join(System.Collections.Generic.IEnumerable{System.String},System.String)">
+            <summary>
+            Join the <paramref name="strings"/> using <paramref name="seperator"/>.
+            </summary>
+            <param name="strings"></param>
+            <param name="seperator"></param>
+            <returns></returns>
+        </member>
+        <member name="T:NSubstitute.Core.RobustThreadLocal`1">
+            <summary>
+            Delegates to ThreadLocal<T>, but wraps Value property access in try/catch to swallow ObjectDisposedExceptions.
+            These can occur if the Value property is accessed from the finalizer thread. Because we can't detect this, we'll
+            just swallow the exception (the finalizer thread won't be using any of the values from thread local storage anyway).
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:NSubstitute.IArgumentMatcher`1">
+            <summary>
+            Provides a specification for arguments for use with <see ctype="Arg.Matches < T >(IArgumentMatcher)" />.
+            Can additionally implement <see ctype="IDescribeNonMatches" /> to give descriptions when arguments do not match.
+            </summary>
+            <typeparam name="T">Matches arguments of type <typeparamref name="T"/> or compatible type.</typeparam>
+        </member>
+        <member name="M:NSubstitute.IArgumentMatcher`1.IsSatisfiedBy(`0)">
+            <summary>
+            Checks whether the <paramref name="argument"/> satisfies the condition of the matcher.
+            If this throws an exception the argument will be treated as non-matching.
+            </summary>
+            <param name="argument"></param>
+            <returns></returns>
+        </member>
+        <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: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
index 5d9370d..f9b8912 100644
--- a/lib/Rhino.Mocks.xml
+++ b/lib/Rhino.Mocks.xml
@@ -1,5413 +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>
+<?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 1a5b516..a057374 100644
Binary files a/license.rtf and b/license.rtf differ
diff --git a/license.txt b/license.txt
index 724e465..b12903a 100644
--- a/license.txt
+++ b/license.txt
@@ -1,15 +1,15 @@
-Copyright � 2002-2012 Charlie Poole
-Copyright � 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
-Copyright � 2000-2002 Philip A. Craig
-
-This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
-
-Portions Copyright � 2002-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.
-
-3. This notice may not be removed or altered from any source distribution.
+Copyright � 2002-2013 Charlie Poole
+Copyright � 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+Copyright � 2000-2002 Philip A. Craig
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
+
+Portions Copyright � 2002-2013 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.
+
+3. This notice may not be removed or altered from any source distribution.
diff --git a/nant b/nant
new file mode 100644
index 0000000..2b1113f
--- /dev/null
+++ b/nant
@@ -0,0 +1,3 @@
+#!/bin/sh
+exec mono tools/nant/bin/NAnt.exe $@
+
diff --git a/nant.bat b/nant.bat
new file mode 100644
index 0000000..a32134a
--- /dev/null
+++ b/nant.bat
@@ -0,0 +1,2 @@
+tools\nant\bin\nant.exe %*
+
diff --git a/nuget/nunit.editor.nuspec b/nuget/nunit.editor.nuspec
new file mode 100644
index 0000000..122417d
--- /dev/null
+++ b/nuget/nunit.editor.nuspec
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+		<id>NUnit.Editor</id>
+		<version>${package.version}</version>
+		<title>NUnit.Editor</title>
+		<authors>Charlie Poole</authors>
+		<owners>Charlie Poole</owners>
+		<licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+		<projectUrl>http://nunit.org</projectUrl>
+		<iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<summary>NUnit.Editor is a standalone gui editor for nunit projects.</summary>
+		<description>The NUnit project editor allows easy editing of NUnit projects. It supports a form-based interface for editing properties as well as a rudimentary XML editor.

This package includes only the editor, which is also available as a part of the NUnit.Runners package.</description>
+		<language>en-US</language>
+		<tags>nunit test testing framework project editor</tags>
+	</metadata>
+	<files>
+		<file src="${project.base.dir}\license.txt" />
+		<file src="${current.build.dir}\nunit-editor.exe" target="tools" />
+	</files>
+</package>
\ No newline at end of file
diff --git a/nuget/nunit.mocks.nuspec b/nuget/nunit.mocks.nuspec
new file mode 100644
index 0000000..9e91bed
--- /dev/null
+++ b/nuget/nunit.mocks.nuspec
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+		<id>NUnit.Mocks</id>
+		<version>${package.version}</version>
+		<title>NUnit.Mocks</title>
+		<authors>Charlie Poole</authors>
+		<owners>Charlie Poole</owners>
+		<licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+		<projectUrl>http://nunit.org</projectUrl>
+		<iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<summary>NUnit.Mocks is a very simple mock object framework for use with NUnit.</summary>
+		<description>NUnit.Mocks was originally developed for internal use in NUnit's own tests, although we no longer use it for that purpose.

In addition, it has been useful as a teaching tool, allowing users to gain familiarity with mocking techniques before moving on to more serious frameworks.

For production use, we recommend you install a full-featured mock object framework.

The NUnit project now uses NSubstitute and NUnit.Mocks is no longer being developed.</d [...]
+		<language>en-US</language>
+		<dependencies>
+			<dependency id="NUnit" />
+		</dependencies>
+		<tags>nunit test testing tdd mock framework</tags>
+	</metadata>
+	<files>
+		<file src="${project.base.dir}\license.txt" />
+		<file src="${current.build.dir}\framework\nunit.mocks.dll" target="lib" />
+	</files>
+</package>
\ No newline at end of file
diff --git a/nuget/nunit.nuspec b/nuget/nunit.nuspec
new file mode 100644
index 0000000..3b9e97f
--- /dev/null
+++ b/nuget/nunit.nuspec
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+		<id>NUnit</id>
+		<version>${package.version}</version>
+		<title>NUnit</title>
+		<authors>Charlie Poole</authors>
+		<owners>Charlie Poole</owners>
+		<licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+		<projectUrl>http://nunit.org</projectUrl>
+		<iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<summary>NUnit is a unit-testing framework for all .Net languages with a strong TDD focus.</summary>
+		<description>NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. A number of runners, both from the NUnit project and by third parties, are able to execute NUnit tests.

Version 2.6 is the seventh major release of this well-known and well-tested programming tool.

This package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner.</description>
+		<releaseNotes>Version 2.6 is the seventh major release of NUnit.

Unlike earlier versions, this package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner.

The nunit.mocks assembly is now provided by the NUnit.Mocks package. The pnunit.framework assembly is provided by the pNUnit package.</releaseNotes>
+		<language>en-US</language>
+		<tags>nunit test testing tdd framework fluent assert theory plugin addin</tags>
+	</metadata>
+	<files>
+		<file src="${project.base.dir}\license.txt" />
+		<file src="${current.build.dir}\framework\nunit.framework.dll" target="lib" />
+		<file src="${current.build.dir}\framework\nunit.framework.xml" target="lib" />
+	</files>
+</package>
\ No newline at end of file
diff --git a/nuget/nunit.runners.nuspec b/nuget/nunit.runners.nuspec
new file mode 100644
index 0000000..47a3889
--- /dev/null
+++ b/nuget/nunit.runners.nuspec
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+		<id>NUnit.Runners</id>
+		<version>${package.version}</version>
+		<title>NUnit.Runners</title>
+		<authors>Charlie Poole</authors>
+		<owners>Charlie Poole</owners>
+		<licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+		<projectUrl>http://nunit.org</projectUrl>
+		<iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<summary>NUnit is a unit-testing framework for all .Net languages with a strong TDD focus.</summary>
+		<description>NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. A number of runners, both from the NUnit project and by third parties, are able to execute NUnit tests.

Version 2.6 is the seventh major release of this well-known and well-tested programming tool.

This package includes the NUnit console, gui and pnunit runners and is compatible with all NUnit framework versions 2.0 through 2.6. The NUnit project editor  [...]
+		<language>en-US</language>
+		<tags>nunit test testing tdd runner</tags>
+	</metadata>
+	<files>
+		<file src="${project.base.dir}\license.txt" />
+		<file src="${current.build.dir}\agent.conf" target="tools" />
+		<file src="${current.build.dir}\agent.log.conf" target="tools" />
+		<file src="${current.build.dir}\launcher.log.conf" target="tools" />
+		<file src="${current.build.dir}\nunit.exe" target="tools" />
+		<file src="${current.build.dir}\nunit.exe.config" target="tools" />
+		<file src="${current.build.dir}\nunit.framework.dll" target="tools" />
+		<file src="${current.build.dir}\nunit-agent.exe" target="tools" />
+		<file src="${current.build.dir}\nunit-agent.exe.config" target="tools" />
+		<file src="${current.build.dir}\nunit-agent-x86.exe" target="tools" />
+		<file src="${current.build.dir}\nunit-agent-x86.exe.config" target="tools" />
+		<file src="${current.build.dir}\nunit-console.exe" target="tools" />
+		<file src="${current.build.dir}\nunit-console.exe.config" target="tools" />
+		<file src="${current.build.dir}\nunit-console-x86.exe" target="tools" />
+		<file src="${current.build.dir}\nunit-console-x86.exe.config" target="tools" />
+		<file src="${current.build.dir}\nunit-editor.exe" target="tools" />
+		<file src="${current.build.dir}\nunit-x86.exe" target="tools" />
+		<file src="${current.build.dir}\nunit-x86.exe.config" target="tools" />
+		<file src="${current.build.dir}\pnunit.framework.dll" target="tools" />
+		<file src="${current.build.dir}\pnunit.tests.dll" target="tools" />
+		<file src="${current.build.dir}\pnunit-agent.exe" target="tools" />
+		<file src="${current.build.dir}\pnunit-agent.exe.config" target="tools" />
+		<file src="${current.build.dir}\pnunit-launcher.exe" target="tools" />
+		<file src="${current.build.dir}\pnunit-launcher.exe.config" target="tools" />
+		<file src="${current.build.dir}\runpnunit.bat" target="tools" />
+		<file src="${current.build.dir}\test.conf" target="tools" />
+		<file src="${current.build.dir}\lib\log4net.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit.core.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit.core.interfaces.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit.uiexception.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit.uikit.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit.util.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit-console-runner.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\nunit-gui-runner.dll" target="tools\lib" />
+		<file src="${current.build.dir}\lib\Images\**\*.jpg" target="tools\lib\Images" />
+		<file src="${current.build.dir}\lib\Images\**\*.png" target="tools\lib\Images" />
+	</files>
+</package>
\ No newline at end of file
diff --git a/nuget/pnunit.nuspec b/nuget/pnunit.nuspec
new file mode 100644
index 0000000..4866f58
--- /dev/null
+++ b/nuget/pnunit.nuspec
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+		<id>pNUnit</id>
+		<version>${package.version}</version>
+		<title>pNUnit</title>
+		<authors>Charlie Poole</authors>
+		<owners>Charlie Poole</owners>
+		<licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+		<projectUrl>http://nunit.org</projectUrl>
+		<iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<summary>PNUnit extends NUnit to support parallel distributed testing.</summary>
+		<description>PNUnit provides a way to test applications composed of distributed, communicating components. It was developed by the folks at Codice Software for their internal use and contributed to NUnit.

Note that pNUnit is not intended for running tests in parallel simply to make them run faster. It requires careful setup of each parallel test using an XML description of the individual cooperating tests.

This package includes only the pNUnit framework assembly, whic [...]
+		<language>en-US</language>
+		<tags>nunit test testing tdd framework parallel distributed</tags>
+	</metadata>
+	<files>
+		<file src="${project.base.dir}\license.txt" />
+		<file src="${current.build.dir}\framework\pnunit.framework.dll" target="lib" />
+	</files>
+</package>
\ No newline at end of file
diff --git a/nunit.sln b/nunit.sln
index 2966d68..c208994 100644
--- a/nunit.sln
+++ b/nunit.sln
@@ -1,267 +1,266 @@
-
-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
-		src\nunit.snk = src\nunit.snk
-		NUnitTests.config = NUnitTests.config
-		NUnitTests.nunit = NUnitTests.nunit
-	EndProjectSection
-EndProject
-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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitFramework", "NUnitFramework", "{A2FF9F1B-1854-479A-859C-6ECEBF045E4C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests", "src\NUnitFramework\tests\nunit.framework.tests.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConsoleRunner", "ConsoleRunner", "{1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}"
-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-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("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiRunner", "GuiRunner", "{77D10207-CB02-4C3A-8734-5A5173E3C506}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "src\GuiRunner\nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.tests", "src\GuiRunner\tests\nunit-gui.tests.csproj", "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.exe", "src\GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj", "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
-EndProject
-Project("{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}") = "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}") = "test-assembly", "src\tests\test-assembly\test-assembly.csproj", "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
-EndProject
-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.mocks", "src\NUnitMocks\mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PNUnit", "PNUnit", "{979724B8-6FAA-400F-B40D-EB653A815C87}"
-EndProject
-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}") = "pnunit-launcher", "src\PNUnit\launcher\pnunit-launcher.csproj", "{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.tests", "src\PNUnit\tests\pnunit.tests.csproj", "{319B9238-76BE-4335-9B4D-F8E43C4B124F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.framework", "src\PNUnit\pnunit.framework\pnunit.framework.csproj", "{5261ABA1-98E6-4603-A4F0-59CAC307AC68}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitTestServer", "NUnitTestServer", "{D029F8FD-84E3-4AD3-8F1B-CCA0C856E659}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-agent.exe", "src\NUnitTestServer\nunit-agent-exe\nunit-agent.exe.csproj", "{3E469CD9-FED2-4955-AE4C-669A74CA6767}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProjectEditor", "ProjectEditor", "{992367F7-9154-4424-B55E-3EF8673A2A36}"
-EndProject
-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
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{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
-		{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
-		{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
-		{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\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj
-	EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2010
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A65042E1-D8BC-48DD-8DE1-F0991F07EA77}"
+	ProjectSection(SolutionItems) = preProject
+		src\nunit.snk = src\nunit.snk
+	EndProjectSection
+EndProject
+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
+		scripts\nunit.package.targets = scripts\nunit.package.targets
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitFramework", "NUnitFramework", "{A2FF9F1B-1854-479A-859C-6ECEBF045E4C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClientUtilities", "ClientUtilities", "{D448BA20-BA70-4F70-AF53-4C0E6C1E97E7}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConsoleRunner", "ConsoleRunner", "{1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiRunner", "GuiRunner", "{77D10207-CB02-4C3A-8734-5A5173E3C506}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitCore", "NUnitCore", "{AEAED2BD-F22D-42C8-9047-F293BEF70EAB}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiComponents", "GuiComponents", "{168F8C38-129C-454A-B112-F456BC7F4FE4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiException", "GuiException", "{35A92AA3-A1E6-426E-8D96-322F3EBF1C8D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6142B985-EA14-4DE0-884F-E62D89949E1D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitMocks", "NUnitMocks", "{7740410A-54B5-4334-8DE3-6D6F616BD6A5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PNUnit", "PNUnit", "{979724B8-6FAA-400F-B40D-EB653A815C87}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitTestServer", "NUnitTestServer", "{D029F8FD-84E3-4AD3-8F1B-CCA0C856E659}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProjectEditor", "ProjectEditor", "{992367F7-9154-4424-B55E-3EF8673A2A36}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests", "src\NUnitFramework\tests\nunit.framework.tests.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "src\NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
+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-console.tests", "src\ConsoleRunner\tests\nunit-console.tests.csproj", "{8597D2C6-804D-48CB-BFC7-ED2404D389B0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console", "src\ConsoleRunner\nunit-console\nunit-console.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.exe", "src\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj", "{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "src\GuiRunner\nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.tests", "src\GuiRunner\tests\nunit-gui.tests.csproj", "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.exe", "src\GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj", "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.tests", "src\NUnitCore\tests\nunit.core.tests.csproj", "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
+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("{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("{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("{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}") = "test-assembly", "src\tests\test-assembly\test-assembly.csproj", "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
+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.mocks", "src\NUnitMocks\mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
+EndProject
+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}") = "pnunit-launcher", "src\PNUnit\launcher\pnunit-launcher.csproj", "{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.tests", "src\PNUnit\tests\pnunit.tests.csproj", "{319B9238-76BE-4335-9B4D-F8E43C4B124F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.framework", "src\PNUnit\pnunit.framework\pnunit.framework.csproj", "{5261ABA1-98E6-4603-A4F0-59CAC307AC68}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-agent.exe", "src\NUnitTestServer\nunit-agent-exe\nunit-agent.exe.csproj", "{3E469CD9-FED2-4955-AE4C-669A74CA6767}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "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
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{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
+		{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
+		{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
+		{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\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj
+	EndGlobalSection
+EndGlobal
diff --git a/nunit2012.sln b/nunit2012.sln
new file mode 100644
index 0000000..867d446
--- /dev/null
+++ b/nunit2012.sln
@@ -0,0 +1,289 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A65042E1-D8BC-48DD-8DE1-F0991F07EA77}"
+	ProjectSection(SolutionItems) = preProject
+		src\nunit.snk = src\nunit.snk
+		NUnitTests.v1.nunit = NUnitTests.v1.nunit
+		NUnitTests.v2.nunit = NUnitTests.v2.nunit
+	EndProjectSection
+EndProject
+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
+		scripts\nunit.package.targets = scripts\nunit.package.targets
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitFramework", "NUnitFramework", "{A2FF9F1B-1854-479A-859C-6ECEBF045E4C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClientUtilities", "ClientUtilities", "{D448BA20-BA70-4F70-AF53-4C0E6C1E97E7}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConsoleRunner", "ConsoleRunner", "{1DBAF726-8009-41CC-B82A-4EFE94CBEEFC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiRunner", "GuiRunner", "{77D10207-CB02-4C3A-8734-5A5173E3C506}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitCore", "NUnitCore", "{AEAED2BD-F22D-42C8-9047-F293BEF70EAB}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiComponents", "GuiComponents", "{168F8C38-129C-454A-B112-F456BC7F4FE4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GuiException", "GuiException", "{35A92AA3-A1E6-426E-8D96-322F3EBF1C8D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{6142B985-EA14-4DE0-884F-E62D89949E1D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitMocks", "NUnitMocks", "{7740410A-54B5-4334-8DE3-6D6F616BD6A5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PNUnit", "PNUnit", "{979724B8-6FAA-400F-B40D-EB653A815C87}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NUnitTestServer", "NUnitTestServer", "{D029F8FD-84E3-4AD3-8F1B-CCA0C856E659}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProjectEditor", "ProjectEditor", "{992367F7-9154-4424-B55E-3EF8673A2A36}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests", "src\NUnitFramework\tests\nunit.framework.tests.csproj", "{8C326431-AE57-4645-ACC1-A90A0B425129}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "src\NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}"
+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-console.tests", "src\ConsoleRunner\tests\nunit-console.tests.csproj", "{8597D2C6-804D-48CB-BFC7-ED2404D389B0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console", "src\ConsoleRunner\nunit-console\nunit-console.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console.exe", "src\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj", "{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "src\GuiRunner\nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.tests", "src\GuiRunner\tests\nunit-gui.tests.csproj", "{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui.exe", "src\GuiRunner\nunit-gui-exe\nunit-gui.exe.csproj", "{AAB186A4-FA3D-404D-AD78-7EB5BB861655}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.tests", "src\NUnitCore\tests\nunit.core.tests.csproj", "{DD758D21-E5D5-4D40-9450-5F65A32F359C}"
+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("{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("{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("{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}") = "test-assembly", "src\tests\test-assembly\test-assembly.csproj", "{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}"
+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.mocks", "src\NUnitMocks\mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}"
+EndProject
+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}") = "pnunit-launcher", "src\PNUnit\launcher\pnunit-launcher.csproj", "{91FC5C92-E801-4446-B4D6-EAC5B56A4DB2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.tests", "src\PNUnit\tests\pnunit.tests.csproj", "{319B9238-76BE-4335-9B4D-F8E43C4B124F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pnunit.framework", "src\PNUnit\pnunit.framework\pnunit.framework.csproj", "{5261ABA1-98E6-4603-A4F0-59CAC307AC68}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-agent.exe", "src\NUnitTestServer\nunit-agent-exe\nunit-agent.exe.csproj", "{3E469CD9-FED2-4955-AE4C-669A74CA6767}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "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
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.tests.net45", "src\NUnitCore\tests-net45\nunit.core.tests.net45.csproj", "{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test-assembly-net45", "src\tests\test-assembly-net45\test-assembly-net45.csproj", "{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.tests.net45", "src\NUnitFramework\tests-net45\nunit.framework.tests.net45.csproj", "{4E9322CE-CED7-42B4-B5DA-7837D9224EE6}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{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
+		{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
+		{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
+		{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
+		{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4E9322CE-CED7-42B4-B5DA-7837D9224EE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4E9322CE-CED7-42B4-B5DA-7837D9224EE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4E9322CE-CED7-42B4-B5DA-7837D9224EE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4E9322CE-CED7-42B4-B5DA-7837D9224EE6}.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}
+		{4E9322CE-CED7-42B4-B5DA-7837D9224EE6} = {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}
+		{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1} = {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}
+		{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9} = {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\ConsoleRunner\nunit-console-exe\nunit-console.exe.csproj
+	EndGlobalSection
+EndGlobal
diff --git a/package b/package
new file mode 100644
index 0000000..2d263b1
--- /dev/null
+++ b/package
@@ -0,0 +1,111 @@
+#!/bin/sh
+# PACKAGE - Packages NUnit
+
+NANT="tools/nant/bin/NAnt.exe"
+options="-f:scripts/nunit.package.targets"
+config=""
+runtime=""
+commands=""
+passthru=false
+
+for arg in $@
+do
+  if [ $passthru = true ]
+  then
+    commands="$commands $arg"
+    continue
+  fi
+
+  case "$arg" in
+    debug|release)
+      config="$arg"
+      ;;
+
+    mono-1.0|1.0)
+      runtime="mono-1.0"
+      ;;
+
+    mono-2.0|2.0)
+      runtime="mono-2.0"
+      ;;
+
+    mono-3.5|3.5)
+      runtime="mono-3.5"
+      ;;
+
+    mono-4.0|4.0)
+      runtime="mono-4.0"
+      ;;
+
+    src|docs|samples|zip|all)
+      commands="$commands package-$arg"
+      ;;
+
+    source)
+      commands="$commands package-src"
+      ;;
+
+    -h|--help)
+      echo "Builds one or more NUnit packages for distribution"
+      echo
+      echo "usage: PACKAGE [option [...] ] [ -- nantoptions ]"
+      echo
+      echo "Options may be any of the following, in any order..."
+      echo
+      echo "  debug          Builds debug packages (default)"
+      echo "  release        Builds release packages"
+      echo
+      echo "  mono-4.0, 4.0  Builds package using Mono 4.0 profile (future)"
+      echo "  mono-3.5, 3.5  Builds package using Mono 3.5 profile (default)"
+      echo "  mono-2.0, 2.0  Builds package using Mono 2.0 profile"
+      echo "  mono-1.0, 1.0  Builds package using Mono 1.0 profile"
+      echo
+      echo "  src, source    Builds the source package"
+      echo "  docs           Builds the documentation package"
+      echo "  samples        Builds the nunit samples package"
+      echo "  zip            Builds a binary package in zipped form"
+      echo "  all            Builds source, documentation, 3.5 and 1.0 packages"
+      echo
+      echo "  -h, --help     Displays this help message"
+      echo
+      echo "In addition, any valid target in the NAnt script may"
+      echo "be supplied as an argument. This requires some degree"
+      echo "of familiarity with the script, in order to avoid"
+      echo "use of incompatible options."
+      echo   
+      exit;
+      ;;
+
+    --)
+      passthru=true;
+      ;;
+
+    *)
+      echo "Invalid argument: $arg"
+      echo
+      echo "Use $0 -h for more info"
+      echo
+      exit;
+      ;;
+  esac
+done
+
+if [ "$commands" = "" ]
+then
+  commands="package"
+fi
+
+
+if [ "$config" != "" ]
+then
+  options="$options -D:build.config=$config"
+fi
+
+if [ "$runtime" != "" ]
+then
+  options="$options -D:runtime.config=$runtime"
+fi
+
+exec mono $NANT $options $clean $commands
+
+
diff --git a/package.bat b/package.bat
new file mode 100644
index 0000000..4e6e7cc
--- /dev/null
+++ b/package.bat
@@ -0,0 +1,125 @@
+ at echo off
+
+rem PACKAGE - Packages NUnit
+
+setlocal
+
+set NANT=tools\nant\bin\nant.exe
+set OPTIONS=-f:scripts/nunit.package.targets
+set CONFIG=
+set RUNTIME=
+set COMMANDS=
+set PASSTHRU=
+set CHECK=
+goto start
+
+:shift
+shift /1
+
+:start
+
+IF "%1" EQU "" goto execute
+
+IF "%PASSTHRU%" NEQ "" set COMMANDS=%COMMANDS% %1&goto shift
+
+IF /I "%1" EQU "?"	goto usage
+IF /I "%1" EQU "/h"	goto usage
+IF /I "%1" EQU "/help"	goto usage
+
+IF /I "%1" EQU "debug"	set CONFIG=debug&goto shift
+IF /I "%1" EQU "release" set CONFIG=release&goto shift
+
+IF /I "%1" EQU "net-1.0" set RUNTIME=net-1.0&goto shift
+IF /I "%1" EQU "net-1.1" set RUNTIME=net-1.1&goto shift
+IF /I "%1" EQU "net-2.0" set RUNTIME=net-2.0&goto shift
+IF /I "%1" EQU "net-3.0" set RUNTIME=net-3.0&goto shift
+IF /I "%1" EQU "net-3.5" set RUNTIME=net-3.5&goto shift
+IF /I "%1" EQU "net-4.0" set RUNTIME=net-4.0&goto shift
+
+IF /I "%1" EQU "mono-1.0" set RUNTIME=mono-1.0&goto shift
+IF /I "%1" EQU "mono-2.0" set RUNTIME=mono-2.0&goto shift
+IF /I "%1" EQU "mono-3.5" set RUNTIME=mono-3.5&goto shift
+IF /I "%1" EQU "mono-4.0" set RUNTIME=mono-4.0&goto shift
+
+IF /I "%1" EQU "check" set CHECK=1&goto shift
+
+IF /I "%1" EQU "all"		set COMMANDS=%COMMANDS% package-all&goto shift
+IF /I "%1" EQU "docs"		set COMMANDS=%COMMANDS% package-docs&goto shift
+IF /I "%1" EQU "source"		set COMMANDS=%COMMANDS% package-src&goto shift
+IF /I "%1" EQU "samples"	set COMMANDS=%COMMANDS% package-samples&goto shift
+IF /I "%1" EQU "src"		set COMMANDS=%COMMANDS% package-src&goto shift
+IF /I "%1" EQU "zip"		set COMMANDS=%COMMANDS% package-zip&goto shift
+IF /I "%1" EQU "msi"		set COMMANDS=%COMMANDS% package-msi&goto shift
+IF /I "%1" EQU "nuget"		set COMMANDS=%COMMANDS% package-nuget&goto shift
+
+IF "%1" EQU "--" set PASSTHRU=1&goto shift
+
+echo Invalid option: %1
+echo.
+echo Use PACKAGE /help for more information
+echo.
+
+goto done
+
+:execute
+
+IF "%CONFIG%" NEQ "" set OPTIONS=%OPTIONS% -D:build.config=%CONFIG%
+IF "%RUNTIME%" NEQ "" set OPTIONS=%OPTIONS% -D:runtime.config=%RUNTIME%
+IF "%CHECK%" EQU "" set OPTIONS=%OPTIONS% -D:light.suppressices=ICE69
+
+if "%COMMANDS%" EQU "" set COMMANDS=package
+
+%NANT% %OPTIONS% %COMMANDS%
+
+goto done
+
+:usage
+
+echo Builds one or more NUnit packages for distribution
+echo.
+echo usage: PACKAGE [option [...] ] [ -- nantoptions ]
+echo.
+echo Options may be any of the following, in any order...
+echo.
+echo   debug          Builds debug packages (default)
+echo   release        Builds release packages
+echo.
+echo   net-4.0        Builds package using .NET 4.0 build (future)
+echo   net-3.5        Builds package using .NET 3.5 build (default)
+echo   net-2.0        Builds package using .NET 2.0 build
+echo   net-1.1        Builds package using .NET 1.1 build
+echo   net-1.0        Builds package using .NET 1.0 build
+echo   mono-4.0       Builds package using Mono 4.0 profile (future)
+echo   mono-3.5       Builds package using Mono 3.5 profile (default)
+echo   mono-2.0       Builds package using Mono 2.0 profile
+echo   mono-1.0       Builds package using Mono 1.0 profile
+echo.
+echo   src, source    Builds the source package
+echo   docs           Builds the documentation package
+echo   zip            Builds a binary package in zipped form
+echo   msi            Builds a windows installer (msi) package
+echo   all            Builds source, documentation, 3.5 and 1.1 packages
+echo.
+echo   check          Causes all ICE verifications to run when building
+echo                  the msi, including those normally suppressed.
+echo.
+echo   ?, /h, /help   Displays this help message
+echo.
+echo Notes:
+echo.
+echo   1. The PACKAGE script assumes that the build to be packaged
+echo      has already been created and is located in the output
+echo      directory for the configuration and runtime specified.
+echo.
+echo   2. If no specific package type is specified, both zip and
+echo      msi packages are created.
+echo.
+echo   3. If the runtime is not specified, the net-3.5 and mono-3.5
+echo      builds are tried and the first found is used. If neither
+echo      is found an error is reported.
+echo.
+echo   4. Any arguments following '--' on the command line are passed
+echo      directly to the NAnt script.
+echo.
+
+:done
diff --git a/samples/Extensibility/Core/CoreExtensibility.sln b/samples/Extensibility/Core/CoreExtensibility.sln
index 2f1486b..b1672b6 100644
--- a/samples/Extensibility/Core/CoreExtensibility.sln
+++ b/samples/Extensibility/Core/CoreExtensibility.sln
@@ -1,53 +1,43 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Minimal", "Minimal\Minimal.csproj", "{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleFixtureExtension", "SampleFixtureExtension\SampleFixtureExtension.csproj", "{ED281A23-9579-4A70-B608-1B86DCDEB78C}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleFixtureExtensionTests", "SampleFixtureExtension\Tests\SampleFixtureExtensionTests.csproj", "{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleSuiteExtension", "SampleSuiteExtension\SampleSuiteExtension.csproj", "{0C4269EE-3266-45DD-9062-E356C067FBEF}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleSuiteExtensionTests", "SampleSuiteExtension\Tests\SampleSuiteExtensionTests.csproj", "{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Debug.ActiveCfg = Debug|.NET
-		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Debug.Build.0 = Debug|.NET
-		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Release.ActiveCfg = Release|.NET
-		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Release.Build.0 = Release|.NET
-		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Debug.ActiveCfg = Debug|.NET
-		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Debug.Build.0 = Debug|.NET
-		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Release.ActiveCfg = Release|.NET
-		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Release.Build.0 = Release|.NET
-		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Debug.ActiveCfg = Debug|.NET
-		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Debug.Build.0 = Debug|.NET
-		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Release.ActiveCfg = Release|.NET
-		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Release.Build.0 = Release|.NET
-		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Debug.ActiveCfg = Debug|.NET
-		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Debug.Build.0 = Debug|.NET
-		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Release.ActiveCfg = Release|.NET
-		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Release.Build.0 = Release|.NET
-		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Debug.ActiveCfg = Debug|.NET
-		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Debug.Build.0 = Debug|.NET
-		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Release.ActiveCfg = Release|.NET
-		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Release.Build.0 = Release|.NET
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Minimal", "Minimal\Minimal.csproj", "{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleFixtureExtension", "SampleFixtureExtension\SampleFixtureExtension.csproj", "{ED281A23-9579-4A70-B608-1B86DCDEB78C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleFixtureExtensionTests", "SampleFixtureExtension\Tests\SampleFixtureExtensionTests.csproj", "{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleSuiteExtension", "SampleSuiteExtension\SampleSuiteExtension.csproj", "{0C4269EE-3266-45DD-9062-E356C067FBEF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleSuiteExtensionTests", "SampleSuiteExtension\Tests\SampleSuiteExtensionTests.csproj", "{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ED281A23-9579-4A70-B608-1B86DCDEB78C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C4269EE-3266-45DD-9062-E356C067FBEF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/samples/Extensibility/Core/Minimal/Minimal.build b/samples/Extensibility/Core/Minimal/Minimal.build
index 3002e34..f92d521 100644
--- a/samples/Extensibility/Core/Minimal/Minimal.build
+++ b/samples/Extensibility/Core/Minimal/Minimal.build
@@ -1,21 +1,21 @@
-<?xml version="1.0"?>
-<project name="Minimal" default="build" basedir=".">
-
-  <include buildfile="../../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="Minimal.cs" />
-  </patternset>
-
-  <target name="packagex">
-    <copy todir="${package.samples.dir}/Extensibility/Core/Minimal">
-      <fileset basedir=".">
-        <include name="Minimal.csproj" />
-        <include name="Minimal.build" />
-        <include name="Readme.txt" />
-        <patternset refid="source-files" />
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="Minimal" default="build" basedir=".">
+
+  <include buildfile="../../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="Minimal.cs" />
+  </patternset>
+
+  <target name="packagex">
+    <copy todir="${package.samples.dir}/Extensibility/Core/Minimal">
+      <fileset basedir=".">
+        <include name="Minimal.csproj" />
+        <include name="Minimal.build" />
+        <include name="Readme.txt" />
+        <patternset refid="source-files" />
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/Minimal/Minimal.cs b/samples/Extensibility/Core/Minimal/Minimal.cs
index c5bf38d..fd83c4c 100644
--- a/samples/Extensibility/Core/Minimal/Minimal.cs
+++ b/samples/Extensibility/Core/Minimal/Minimal.cs
@@ -1,36 +1,37 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Samples.Extensibility
-{
-	/// <summary>
-	/// This is the smallest possible Addin, which does nothing 
-	/// but is recognized by NUnit and listed in the Addins dialog.
-	/// 
-	/// The Addin class is marked by the NUnitAddin attribute and
-	/// implements IAddin, as required. Optional property syntax
-	/// is used here to override the default name of the addin and
-	/// to provide a description. Both are displayed by NUnit in the
-	/// Addin Dialog.
-	/// 
-	/// The addin doesn't actually install anything, but simply
-	/// returns false in its Install method.
-	/// </summary>
-	[NUnitAddin(Name="Minimal Addin", Description="This Addin doesn't do anything")]
-	public class Minimal : IAddin
-	{
-		#region IAddin Members
-		public bool Install(IExtensionHost host)
-		{
-			// TODO:  Add Minimal.Install implementation
-			return true;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility;
+
+namespace NUnit.Samples.Extensibility
+{
+	/// <summary>
+	/// This is the smallest possible Addin, which does nothing 
+	/// but is recognized by NUnit and listed in the Addins dialog.
+	/// 
+	/// The Addin class is marked by the NUnitAddin attribute and
+	/// implements IAddin, as required. Optional property syntax
+	/// is used here to override the default name of the addin and
+	/// to provide a description. Both are displayed by NUnit in the
+	/// Addin Dialog.
+	/// 
+	/// The addin doesn't actually do anything, but simply returns
+	/// true in its Install method and can be seen listed in the 
+    /// Addin dialog of the Gui.
+	/// </summary>
+	[NUnitAddin(Name="Minimal Addin", Description="This Addin doesn't do anything")]
+	public class Minimal : IAddin
+	{
+		#region IAddin Members
+		public bool Install(IExtensionHost host)
+		{
+			// TODO:  Add Minimal.Install implementation
+			return true;
+		}
+		#endregion
+	}
+}
diff --git a/samples/Extensibility/Core/Minimal/Minimal.csproj b/samples/Extensibility/Core/Minimal/Minimal.csproj
index 68454c7..b281cb4 100644
--- a/samples/Extensibility/Core/Minimal/Minimal.csproj
+++ b/samples/Extensibility/Core/Minimal/Minimal.csproj
@@ -1,89 +1,121 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "Minimal"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "NUnit.Samples.Extensibility"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces"
-                    AssemblyName = "nunit.core.interfaces"
-                    HintPath = "..\..\..\..\solutions\vs2003\NUnitCore\interfaces\bin\Debug\nunit.core.interfaces.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "Minimal.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EF428E5B-B3E7-4C2F-B005-98DE7D6E7CDB}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>Minimal</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Samples.Extensibility</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.core.interfaces, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\NUnit 2.6.2\bin\lib\nunit.core.interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Minimal.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/Minimal/ReadMe.txt b/samples/Extensibility/Core/Minimal/ReadMe.txt
index 6586935..901df80 100644
--- a/samples/Extensibility/Core/Minimal/ReadMe.txt
+++ b/samples/Extensibility/Core/Minimal/ReadMe.txt
@@ -1,27 +1,27 @@
-Minimal Addin Example
-
-
-MinimalAddin Class
-
-This class represents the addin. It is marked by the NUnitAddinAttribute
-and implements the required IAddin interface. When called by NUnit to
-install itself, it simply returns false.
-
-Note on Building this Extension
-
-If you use the Visual Studio solution, the NUnit references in both
-included projects must be changed so that they refer to the copy of 
-NUnit in which you want to install the extension. The post-build step 
-for the SampleSuiteExtension project must be changed to copy the 
-extension into the addins directory for your NUnit install.
-
-NOTE:
-
-The references to nunit.core and nunit.common in the 
-SampleSuiteExtension project have their Copy Local property set to 
-false, rather than the Visual Studio default of true. In developing
-extensions, it is essential there be no extra copies of these assemblies
-be created. Once the extension is complete, those who install it in
-binary form will not need to deal with this issue.
-
-
+Minimal Addin Example
+
+
+MinimalAddin Class
+
+This class represents the addin. It is marked by the NUnitAddinAttribute
+and implements the required IAddin interface. When called by NUnit to
+install itself, it simply returns false.
+
+Note on Building this Extension
+
+If you use the Visual Studio solution, the NUnit references in both
+included projects must be changed so that they refer to the copy of 
+NUnit in which you want to install the extension. The post-build step 
+for the SampleSuiteExtension project must be changed to copy the 
+extension into the addins directory for your NUnit install.
+
+NOTE:
+
+The references to nunit.core and nunit.common in the 
+SampleSuiteExtension project have their Copy Local property set to 
+false, rather than the Visual Studio default of true. In developing
+extensions, it is essential there be no extra copies of these assemblies
+be created. Once the extension is complete, those who install it in
+binary form will not need to deal with this issue.
+
+
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/AssemblyInfo.cs b/samples/Extensibility/Core/SampleFixtureExtension/AssemblyInfo.cs
index 177a4f0..9f89a32 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/AssemblyInfo.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-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("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/ReadMe.txt b/samples/Extensibility/Core/SampleFixtureExtension/ReadMe.txt
index 045e4f4..11fb204 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/ReadMe.txt
+++ b/samples/Extensibility/Core/SampleFixtureExtension/ReadMe.txt
@@ -1,43 +1,43 @@
-SampleSuiteExtension Example
-
-This is a minimal example of a SuiteBuilder extension. It extends 
-NUnit.Core.TestSuite test suite and creates a fixture that runs every 
-test starting with "SampleTest..." It packages both the core extension
-and the attribute used in the tests in the same assembly.
-
-SampleSuiteExtension Class
-
-This class derives from NUnit.Framework.TestSuite and represents the
-extended suite within NUnit. Because it inherits from TestSuite,
-rather than TestFixture, it has to construct its own fixture object and 
-find its own tests. Everything is done in the constructor for simplicity.
-
-SampleSuiteExtensionBuilder
-
-This class is the actual SuiteBuilder loaded by NUnit as an add-in.
-It recognizes the SampleSuiteExtensionAttribute and invokes the
-SampleSuiteExtension constructor to build the suite.
-
-SampleSuiteExtensionAttribute
-
-This is the special attribute used to mark tests to be constructed
-using this add-in. It is the only class referenced from the user tests.
-
-Note on Building this Extension
-
-If you use the Visual Studio solution, the NUnit references in both
-included projects must be changed so that they refer to the copy of 
-NUnit in which you want to install the extension. The post-build step 
-for the SampleSuiteExtension project must be changed to copy the 
-extension into the addins directory for your NUnit install.
-
-NOTE:
-
-The references to nunit.core and nunit.common in the 
-SampleSuiteExtension project have their Copy Local property set to 
-false, rather than the Visual Studio default of true. In developing
-extensions, it is essential there be no extra copies of these assemblies
-be created. Once the extension is complete, those who install it in
-binary form will not need to deal with this issue.
-
-
+SampleSuiteExtension Example
+
+This is a minimal example of a SuiteBuilder extension. It extends 
+NUnit.Core.TestSuite test suite and creates a fixture that runs every 
+test starting with "SampleTest..." It packages both the core extension
+and the attribute used in the tests in the same assembly.
+
+SampleSuiteExtension Class
+
+This class derives from NUnit.Framework.TestSuite and represents the
+extended suite within NUnit. Because it inherits from TestSuite,
+rather than TestFixture, it has to construct its own fixture object and 
+find its own tests. Everything is done in the constructor for simplicity.
+
+SampleSuiteExtensionBuilder
+
+This class is the actual SuiteBuilder loaded by NUnit as an add-in.
+It recognizes the SampleSuiteExtensionAttribute and invokes the
+SampleSuiteExtension constructor to build the suite.
+
+SampleSuiteExtensionAttribute
+
+This is the special attribute used to mark tests to be constructed
+using this add-in. It is the only class referenced from the user tests.
+
+Note on Building this Extension
+
+If you use the Visual Studio solution, the NUnit references in both
+included projects must be changed so that they refer to the copy of 
+NUnit in which you want to install the extension. The post-build step 
+for the SampleSuiteExtension project must be changed to copy the 
+extension into the addins directory for your NUnit install.
+
+NOTE:
+
+The references to nunit.core and nunit.common in the 
+SampleSuiteExtension project have their Copy Local property set to 
+false, rather than the Visual Studio default of true. In developing
+extensions, it is essential there be no extra copies of these assemblies
+be created. Once the extension is complete, those who install it in
+binary form will not need to deal with this issue.
+
+
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build
index 394dbe5..474d4aa 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.build
@@ -1,18 +1,18 @@
-<?xml version="1.0"?>
-<project name="SampleFixtureExtension" default="build" basedir=".">
-
-  <include buildfile="../../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cs" />
-    <include name="SampleFixtureExtension.cs" />
-    <include name="SampleFixtureExtensionAttribute.cs" />
-    <include name="SampleFixtureExtensionBuilder.cs" />
-  </patternset>
-
-  <patternset id="test-files">
-    <include name="AssemblyInfo.cs" />
-    <include name="SampleFixtureExtensionTests.cs" />
-  </patternset>
-  
+<?xml version="1.0"?>
+<project name="SampleFixtureExtension" default="build" basedir=".">
+
+  <include buildfile="../../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="SampleFixtureExtension.cs" />
+    <include name="SampleFixtureExtensionAttribute.cs" />
+    <include name="SampleFixtureExtensionBuilder.cs" />
+  </patternset>
+
+  <patternset id="test-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="SampleFixtureExtensionTests.cs" />
+  </patternset>
+  
 </project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.cs b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.cs
index 067cdaa..7816b0b 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// SampleFixtureExtension extends NUnitTestFixture and adds a custom setup
-	/// before running TestFixtureSetUp and after running TestFixtureTearDown.
-	/// Because it inherits from NUnitTestFixture, a lot of work is done for it.
-	/// </summary>
-	class SampleFixtureExtension : NUnitTestFixture
-	{
-		public SampleFixtureExtension( Type fixtureType ) 
-			: base( fixtureType )
-		{
-			// NOTE: Since we are inheriting from NUnitTestFixture we don't 
-			// have to do anything if we don't want to. All the attributes
-			// that are normally used with an NUnitTestFixture will be
-			// recognized.
-			//
-			// Just to have something to do, we override DoOneTimeSetUp and 
-			// DoOneTimeTearDown below to do some special processing before 
-			// and after the normal TestFixtureSetUp and TestFixtureTearDown.
-			// In this example, we simply display a message.
-		}
-
-		protected override void DoOneTimeSetUp(TestResult suiteResult)
-		{
-			Console.WriteLine( "Extended Fixture SetUp called" );
-			base.DoOneTimeSetUp (suiteResult);
-		}
-
-		protected override void DoOneTimeTearDown(TestResult suiteResult)
-		{
-			base.DoOneTimeTearDown (suiteResult);
-			Console.WriteLine( "Extended Fixture TearDown called" );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensions
+{
+	/// <summary>
+	/// SampleFixtureExtension extends NUnitTestFixture and adds a custom setup
+	/// before running TestFixtureSetUp and after running TestFixtureTearDown.
+	/// Because it inherits from NUnitTestFixture, a lot of work is done for it.
+	/// </summary>
+	class SampleFixtureExtension : NUnitTestFixture
+	{
+		public SampleFixtureExtension( Type fixtureType ) 
+			: base( fixtureType )
+		{
+			// NOTE: Since we are inheriting from NUnitTestFixture we don't 
+			// have to do anything if we don't want to. All the attributes
+			// that are normally used with an NUnitTestFixture will be
+			// recognized.
+			//
+			// Just to have something to do, we override DoOneTimeSetUp and 
+			// DoOneTimeTearDown below to do some special processing before 
+			// and after the normal TestFixtureSetUp and TestFixtureTearDown.
+			// In this example, we simply display a message.
+		}
+
+		protected override void DoOneTimeSetUp(TestResult suiteResult)
+		{
+			Console.WriteLine( "Extended Fixture SetUp called" );
+			base.DoOneTimeSetUp (suiteResult);
+		}
+
+		protected override void DoOneTimeTearDown(TestResult suiteResult)
+		{
+			base.DoOneTimeTearDown (suiteResult);
+			Console.WriteLine( "Extended Fixture TearDown called" );
+		}
+	}
+}
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj
index 52c3a78..22a29b6 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtension.csproj
@@ -1,109 +1,134 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{ED281A23-9579-4A70-B608-1B86DCDEB78C}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "SampleFixtureExtension"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "SampleFixtureExtension"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces"
-                    AssemblyName = "nunit.core.interfaces"
-                    HintPath = "..\..\..\..\solutions\vs2003\NUnitCore\interfaces\bin\Debug\nunit.core.interfaces.dll"
-                />
-                <Reference
-                    Name = "nunit.core"
-                    AssemblyName = "nunit.core"
-                    HintPath = "..\..\..\..\solutions\vs2003\NUnitCore\core\bin\Debug\nunit.core.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SampleFixtureExtension.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SampleFixtureExtensionAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SampleFixtureExtensionBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{ED281A23-9579-4A70-B608-1B86DCDEB78C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>SampleFixtureExtension</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>SampleFixtureExtension</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.core">
+      <Name>nunit.core</Name>
+      <HintPath>..\..\..\..\solutions\vs2003\NUnitCore\core\bin\Debug\nunit.core.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.core.interfaces">
+      <Name>nunit.core.interfaces</Name>
+      <HintPath>..\..\..\..\solutions\vs2003\NUnitCore\interfaces\bin\Debug\nunit.core.interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SampleFixtureExtension.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SampleFixtureExtensionAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SampleFixtureExtensionBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionAttribute.cs b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionAttribute.cs
index 2f90681..0bbdad3 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionAttribute.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionAttribute.cs
@@ -1,18 +1,18 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// SampleFixtureExtensionAttribute is used to identify a SampleFixtureExtension class
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public sealed class SampleFixtureExtensionAttribute : Attribute
-	{
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensions
+{
+	/// <summary>
+	/// SampleFixtureExtensionAttribute is used to identify a SampleFixtureExtension class
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	public sealed class SampleFixtureExtensionAttribute : Attribute
+	{
+	}
+}
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs
index abdb1df..286dff8 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/SampleFixtureExtensionBuilder.cs
@@ -1,58 +1,49 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Core.Builders;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// MockFixtureExtensionBuilder knows how to build
-	/// a MockFixtureExtension.
-	/// </summary>
-	[NUnitAddin(Description="Wraps an NUnitTestFixture with an additional level of SetUp and TearDown")]
-	public class SampleFixtureExtensionBuilder : ISuiteBuilder, IAddin
-	{	
-		#region NUnitTestFixtureBuilder Overrides
-		/// <summary>
-		/// Makes a SampleFixtureExtension instance
-		/// </summary>
-		/// <param name="type">The type to be used</param>
-		/// <returns>A SampleFixtureExtension as a TestSuite</returns>
-//		protected override TestSuite MakeSuite(Type type)
-//		{
-//			return new SampleFixtureExtension( type );
-//		}
-
-		// The builder recognizes the types that it can use by the presense
-		// of SampleFixtureExtensionAttribute. Note that an attribute does not
-		// have to be used. You can use any arbitrary set of rules that can be 
-		// implemented using reflection on the type.
-		public bool CanBuildFrom(Type type)
-		{
-			return Reflect.HasAttribute( type, "NUnit.Core.Extensions.SampleFixtureExtensionAttribute", false );
-		}
-
-		public Test BuildFrom(Type type)
-		{
-			return null;
-		}
-		#endregion
-
-		#region IAddin Members
-		public bool Install(IExtensionHost host)
-		{
-			IExtensionPoint suiteBuilders = host.GetExtensionPoint( "SuiteBuilders" );
-			if ( suiteBuilders == null )
-				return false;
-
-			suiteBuilders.Install( this );
-			return true;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Builders;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Extensions
+{
+	/// <summary>
+	/// MockFixtureExtensionBuilder knows how to build
+	/// a MockFixtureExtension.
+	/// </summary>
+	[NUnitAddin(Description="Wraps an NUnitTestFixture with an additional level of SetUp and TearDown")]
+	public class SampleFixtureExtensionBuilder : ISuiteBuilder, IAddin
+	{	
+		#region NUnitTestFixtureBuilder Overrides
+
+		// The builder recognizes the types that it can use by the presense
+		// of SampleFixtureExtensionAttribute. Note that an attribute does not
+		// have to be used. You can use any arbitrary set of rules that can be 
+		// implemented using reflection on the type.
+		public bool CanBuildFrom(Type type)
+		{
+			return Reflect.HasAttribute( type, "NUnit.Core.Extensions.SampleFixtureExtensionAttribute", false );
+		}
+
+		public Test BuildFrom(Type type)
+		{
+			return null;
+		}
+		#endregion
+
+		#region IAddin Members
+		public bool Install(IExtensionHost host)
+		{
+			IExtensionPoint suiteBuilders = host.GetExtensionPoint( "SuiteBuilders" );
+			if ( suiteBuilders == null )
+				return false;
+
+			suiteBuilders.Install( this );
+			return true;
+		}
+		#endregion
+	}
+}
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/Tests/AssemblyInfo.cs b/samples/Extensibility/Core/SampleFixtureExtension/Tests/AssemblyInfo.cs
index 177a4f0..9f89a32 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/Tests/AssemblyInfo.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/Tests/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-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("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.cs b/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.cs
index 1a61a95..ae340e3 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.cs
+++ b/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core.Extensions;
-
-namespace NUnit.Extensions.Tests
-{
-	/// <summary>
-	/// Test class that demonstrates SampleFixtureExtension
-	/// </summary>
-	[SampleFixtureExtension]
-	public class SampleFixtureExtensionTests
-	{
-		[TestFixtureSetUp]
-		public void SetUpTests()
-		{
-			Console.WriteLine( "TestFixtureSetUp called" );
-		}
-
-		[TestFixtureTearDown]
-		public void FixtureTearDown()
-		{
-			Console.WriteLine( "TestFixtureTearDown called" );
-		}
-
-		[Test]
-		public void SomeTest()
-		{
-			Console.WriteLine( "Hello from some test" );
-		}
-
-		[Test]
-		public void AnotherTest()
-		{
-			Console.WriteLine( "Hello from another test" );
-		}
-
-		public void NotATest()
-		{
-			Console.WriteLine( "I shouldn't be called!" );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core.Extensions;
+
+namespace NUnit.Extensions.Tests
+{
+	/// <summary>
+	/// Test class that demonstrates SampleFixtureExtension
+	/// </summary>
+	[SampleFixtureExtension]
+	public class SampleFixtureExtensionTests
+	{
+		[TestFixtureSetUp]
+		public void SetUpTests()
+		{
+			Console.WriteLine( "TestFixtureSetUp called" );
+		}
+
+		[TestFixtureTearDown]
+		public void FixtureTearDown()
+		{
+			Console.WriteLine( "TestFixtureTearDown called" );
+		}
+
+		[Test]
+		public void SomeTest()
+		{
+			Console.WriteLine( "Hello from some test" );
+		}
+
+		[Test]
+		public void AnotherTest()
+		{
+			Console.WriteLine( "Hello from another test" );
+		}
+
+		public void NotATest()
+		{
+			Console.WriteLine( "I shouldn't be called!" );
+		}
+	}
+}
diff --git a/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj b/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj
index e367ade..e46deec 100644
--- a/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj
+++ b/samples/Extensibility/Core/SampleFixtureExtension/Tests/SampleFixtureExtensionTests.csproj
@@ -1,94 +1,126 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "SampleFixtureExtensionTests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                />
-                <Reference
-                    Name = "SampleFixtureExtension"
-                    Project = "{ED281A23-9579-4A70-B608-1B86DCDEB78C}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.framework"
-                    AssemblyName = "nunit.framework"
-                    HintPath = "..\..\..\bin\nunit.framework.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "SampleFixtureExtensionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0DE6C90F-BB74-4BC8-887A-2222DB56D2EB}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>SampleFixtureExtensionTests</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\SampleFixtureExtension.csproj">
+      <Name>SampleFixtureExtension</Name>
+      <Project>{ED281A23-9579-4A70-B608-1B86DCDEB78C}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>..\..\..\bin\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SampleFixtureExtensionTests.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/Addin.cs b/samples/Extensibility/Core/SampleSuiteExtension/Addin.cs
index a500127..30f0a63 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/Addin.cs
+++ b/samples/Extensibility/Core/SampleSuiteExtension/Addin.cs
@@ -1,30 +1,30 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// Summary description for Addin.
-	/// </summary>
-	[NUnitAddin(Name="SampleSuiteExtension", Description = "Recognizes Tests starting with SampleTest...")]
-	public class Addin : IAddin
-	{
-		#region IAddin Members
-		public bool Install(IExtensionHost host)
-		{
-			IExtensionPoint builders = host.GetExtensionPoint( "SuiteBuilders" );
-			if ( builders == null )
-				return false;
-
-			builders.Install( new SampleSuiteExtensionBuilder() );
-			return true;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility;
+
+namespace NUnit.Core.Extensions
+{
+	/// <summary>
+	/// Summary description for Addin.
+	/// </summary>
+	[NUnitAddin(Name="SampleSuiteExtension", Description = "Recognizes Tests starting with SampleTest...")]
+	public class Addin : IAddin
+	{
+		#region IAddin Members
+		public bool Install(IExtensionHost host)
+		{
+			IExtensionPoint builders = host.GetExtensionPoint( "SuiteBuilders" );
+			if ( builders == null )
+				return false;
+
+			builders.Install( new SampleSuiteExtensionBuilder() );
+			return true;
+		}
+		#endregion
+	}
+}
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/AssemblyInfo.cs b/samples/Extensibility/Core/SampleSuiteExtension/AssemblyInfo.cs
index 177a4f0..9f89a32 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/AssemblyInfo.cs
+++ b/samples/Extensibility/Core/SampleSuiteExtension/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-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("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/ReadMe.txt b/samples/Extensibility/Core/SampleSuiteExtension/ReadMe.txt
index 045e4f4..11fb204 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/ReadMe.txt
+++ b/samples/Extensibility/Core/SampleSuiteExtension/ReadMe.txt
@@ -1,43 +1,43 @@
-SampleSuiteExtension Example
-
-This is a minimal example of a SuiteBuilder extension. It extends 
-NUnit.Core.TestSuite test suite and creates a fixture that runs every 
-test starting with "SampleTest..." It packages both the core extension
-and the attribute used in the tests in the same assembly.
-
-SampleSuiteExtension Class
-
-This class derives from NUnit.Framework.TestSuite and represents the
-extended suite within NUnit. Because it inherits from TestSuite,
-rather than TestFixture, it has to construct its own fixture object and 
-find its own tests. Everything is done in the constructor for simplicity.
-
-SampleSuiteExtensionBuilder
-
-This class is the actual SuiteBuilder loaded by NUnit as an add-in.
-It recognizes the SampleSuiteExtensionAttribute and invokes the
-SampleSuiteExtension constructor to build the suite.
-
-SampleSuiteExtensionAttribute
-
-This is the special attribute used to mark tests to be constructed
-using this add-in. It is the only class referenced from the user tests.
-
-Note on Building this Extension
-
-If you use the Visual Studio solution, the NUnit references in both
-included projects must be changed so that they refer to the copy of 
-NUnit in which you want to install the extension. The post-build step 
-for the SampleSuiteExtension project must be changed to copy the 
-extension into the addins directory for your NUnit install.
-
-NOTE:
-
-The references to nunit.core and nunit.common in the 
-SampleSuiteExtension project have their Copy Local property set to 
-false, rather than the Visual Studio default of true. In developing
-extensions, it is essential there be no extra copies of these assemblies
-be created. Once the extension is complete, those who install it in
-binary form will not need to deal with this issue.
-
-
+SampleSuiteExtension Example
+
+This is a minimal example of a SuiteBuilder extension. It extends 
+NUnit.Core.TestSuite test suite and creates a fixture that runs every 
+test starting with "SampleTest..." It packages both the core extension
+and the attribute used in the tests in the same assembly.
+
+SampleSuiteExtension Class
+
+This class derives from NUnit.Framework.TestSuite and represents the
+extended suite within NUnit. Because it inherits from TestSuite,
+rather than TestFixture, it has to construct its own fixture object and 
+find its own tests. Everything is done in the constructor for simplicity.
+
+SampleSuiteExtensionBuilder
+
+This class is the actual SuiteBuilder loaded by NUnit as an add-in.
+It recognizes the SampleSuiteExtensionAttribute and invokes the
+SampleSuiteExtension constructor to build the suite.
+
+SampleSuiteExtensionAttribute
+
+This is the special attribute used to mark tests to be constructed
+using this add-in. It is the only class referenced from the user tests.
+
+Note on Building this Extension
+
+If you use the Visual Studio solution, the NUnit references in both
+included projects must be changed so that they refer to the copy of 
+NUnit in which you want to install the extension. The post-build step 
+for the SampleSuiteExtension project must be changed to copy the 
+extension into the addins directory for your NUnit install.
+
+NOTE:
+
+The references to nunit.core and nunit.common in the 
+SampleSuiteExtension project have their Copy Local property set to 
+false, rather than the Visual Studio default of true. In developing
+extensions, it is essential there be no extra copies of these assemblies
+be created. Once the extension is complete, those who install it in
+binary form will not need to deal with this issue.
+
+
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build
index 5444fdc..0dda8cc 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.build
@@ -1,18 +1,18 @@
-<?xml version="1.0"?>
-<project name="SampleSuiteExtension" default="build" basedir=".">
-
-  <include buildfile="../../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="Addin.cs" />
-    <include name="AssemblyInfo.cs" />
-    <include name="SampleSuiteExtension.cs" />
-    <include name="SampleSuiteExtensionAttribute.cs" />
-    <include name="SampleSuiteExtensionBuilder.cs" />
-  </patternset>
-
-  <patternset id="test-files">
-    <include name="SampleSuiteExtensionTests.cs" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="SampleSuiteExtension" default="build" basedir=".">
+
+  <include buildfile="../../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="Addin.cs" />
+    <include name="AssemblyInfo.cs" />
+    <include name="SampleSuiteExtension.cs" />
+    <include name="SampleSuiteExtensionAttribute.cs" />
+    <include name="SampleSuiteExtensionBuilder.cs" />
+  </patternset>
+
+  <patternset id="test-files">
+    <include name="SampleSuiteExtensionTests.cs" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.cs b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.cs
index b37e893..8d738aa 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.cs
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.cs
@@ -1,39 +1,39 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// SampleSuiteExtension is a minimal example of a suite extension. It 
-	/// extends test suite and creates a fixture that runs every test starting 
-	/// with "SampleTest..." Because it inherits from TestSuite, rather than
-	/// TestFixture, it has to construct its own fixture object and find its 
-	/// own tests. Everything is done in the constructor for simplicity.
-	/// </summary>
-	class SampleSuiteExtension : TestSuite
-	{
-		public SampleSuiteExtension( Type fixtureType ) 
-			: base( fixtureType )
-		{
-			// Create the fixture object. We could wait to do this when
-			// it is needed, but we do it here for simplicity.
-			this.Fixture = Reflect.Construct( fixtureType );
-
-			// Locate our test methods and add them to the suite using
-			// the Add method of TestSuite. Note that we don't do a simple
-			// Tests.Add, because that wouldn't set the parent of the tests.
-			foreach( MethodInfo method in fixtureType.GetMethods( 
-				BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly ) )
-			{
-				if ( method.Name.StartsWith( "SampleTest" ) )
-					this.Add( new NUnitTestMethod( method ) );
-			}
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensions
+{
+	/// <summary>
+	/// SampleSuiteExtension is a minimal example of a suite extension. It 
+	/// extends test suite and creates a fixture that runs every test starting 
+	/// with "SampleTest..." Because it inherits from TestSuite, rather than
+	/// TestFixture, it has to construct its own fixture object and find its 
+	/// own tests. Everything is done in the constructor for simplicity.
+	/// </summary>
+	class SampleSuiteExtension : TestSuite
+	{
+		public SampleSuiteExtension( Type fixtureType ) 
+			: base( fixtureType )
+		{
+			// Create the fixture object. We could wait to do this when
+			// it is needed, but we do it here for simplicity.
+			this.Fixture = Reflect.Construct( fixtureType );
+
+			// Locate our test methods and add them to the suite using
+			// the Add method of TestSuite. Note that we don't do a simple
+			// Tests.Add, because that wouldn't set the parent of the tests.
+			foreach( MethodInfo method in fixtureType.GetMethods( 
+				BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly ) )
+			{
+				if ( method.Name.StartsWith( "SampleTest" ) )
+					this.Add( new NUnitTestMethod( method ) );
+			}
+		}
+	}
+}
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj
index 06383d2..f541361 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtension.csproj
@@ -1,114 +1,137 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{0C4269EE-3266-45DD-9062-E356C067FBEF}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "SampleSuiteExtension"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "SampleSuiteExtension"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                />
-                <Reference
-                    Name = "nunit.core.interfaces"
-                    AssemblyName = "nunit.core.interfaces"
-                    HintPath = "..\..\..\bin\nunit.core.interfaces.dll"
-                />
-                <Reference
-                    Name = "nunit.core"
-                    AssemblyName = "nunit.core"
-                    HintPath = "..\..\..\bin\nunit.core.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "Addin.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SampleSuiteExtension.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SampleSuiteExtensionAttribute.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "SampleSuiteExtensionBuilder.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C4269EE-3266-45DD-9062-E356C067FBEF}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>SampleSuiteExtension</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>SampleSuiteExtension</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.core">
+      <Name>nunit.core</Name>
+      <HintPath>..\..\..\bin\nunit.core.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.core.interfaces">
+      <Name>nunit.core.interfaces</Name>
+      <HintPath>..\..\..\bin\nunit.core.interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Addin.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SampleSuiteExtension.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SampleSuiteExtensionAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SampleSuiteExtensionBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionAttribute.cs b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionAttribute.cs
index 8326d15..fa71738 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionAttribute.cs
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionAttribute.cs
@@ -1,18 +1,18 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// SampleSuiteExtensionAttribute is used to identify a SampleSuiteExtension fixture
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public sealed class SampleSuiteExtensionAttribute : Attribute
-	{
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensions
+{
+	/// <summary>
+	/// SampleSuiteExtensionAttribute is used to identify a SampleSuiteExtension fixture
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	public sealed class SampleSuiteExtensionAttribute : Attribute
+	{
+	}
+}
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionBuilder.cs b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionBuilder.cs
index f901b9c..c95d967 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionBuilder.cs
+++ b/samples/Extensibility/Core/SampleSuiteExtension/SampleSuiteExtensionBuilder.cs
@@ -1,41 +1,41 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Extensions
-{
-	/// <summary>
-	/// SampleSuiteExtensionBuilder knows how to build a SampleSuiteExtension
-	/// </summary>
-	public class SampleSuiteExtensionBuilder : ISuiteBuilder
-	{	
-		#region ISuiteBuilder Members
-
-		// This builder delegates all the work to the constructor of the  
-		// extension suite. Many builders will need to do more work, 
-		// looking for other attributes, setting properties on the 
-		// suite and locating methods for tests, setup and teardown.
-		public Test BuildFrom(Type type)
-		{
-			if ( CanBuildFrom( type ) )
-				return new SampleSuiteExtension( type );
-			return null;
-		}
-		
-		// The builder recognizes the types that it can use by the presense
-		// of SampleSuiteExtensionAttribute. Note that an attribute does not
-		// have to be used. You can use any arbitrary set of rules that can be 
-		// implemented using reflection on the type.
-		public bool CanBuildFrom(Type type)
-		{
-			return Reflect.HasAttribute( type, "NUnit.Core.Extensions.SampleSuiteExtensionAttribute", false );
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility;
+
+namespace NUnit.Core.Extensions
+{
+	/// <summary>
+	/// SampleSuiteExtensionBuilder knows how to build a SampleSuiteExtension
+	/// </summary>
+	public class SampleSuiteExtensionBuilder : ISuiteBuilder
+	{	
+		#region ISuiteBuilder Members
+
+		// This builder delegates all the work to the constructor of the  
+		// extension suite. Many builders will need to do more work, 
+		// looking for other attributes, setting properties on the 
+		// suite and locating methods for tests, setup and teardown.
+		public Test BuildFrom(Type type)
+		{
+			if ( CanBuildFrom( type ) )
+				return new SampleSuiteExtension( type );
+			return null;
+		}
+		
+		// The builder recognizes the types that it can use by the presense
+		// of SampleSuiteExtensionAttribute. Note that an attribute does not
+		// have to be used. You can use any arbitrary set of rules that can be 
+		// implemented using reflection on the type.
+		public bool CanBuildFrom(Type type)
+		{
+			return Reflect.HasAttribute( type, "NUnit.Core.Extensions.SampleSuiteExtensionAttribute", false );
+		}
+
+		#endregion
+	}
+}
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.cs b/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.cs
index 8158bc1..537edc0 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.cs
+++ b/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core.Extensions.Tests
-{
-	/// <summary>
-	/// Test class that demonstrates SampleSuiteExtension
-	/// </summary>
-	[SampleSuiteExtension]
-	public class SampleSuiteExtensionTests
-	{
-		public void SampleTest1()
-		{
-			Console.WriteLine( "Hello from sample test 1" );
-		}
-
-		public void SampleTest2()
-		{
-			Console.WriteLine( "Hello from sample test 2" );
-		}
-
-		public void NotATest()
-		{
-			Console.WriteLine( "I shouldn't be called!" );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensions.Tests
+{
+	/// <summary>
+	/// Test class that demonstrates SampleSuiteExtension
+	/// </summary>
+	[SampleSuiteExtension]
+	public class SampleSuiteExtensionTests
+	{
+		public void SampleTest1()
+		{
+			Console.WriteLine( "Hello from sample test 1" );
+		}
+
+		public void SampleTest2()
+		{
+			Console.WriteLine( "Hello from sample test 2" );
+		}
+
+		public void NotATest()
+		{
+			Console.WriteLine( "I shouldn't be called!" );
+		}
+	}
+}
diff --git a/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj b/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj
index b849ada..aa4a43d 100644
--- a/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj
+++ b/samples/Extensibility/Core/SampleSuiteExtension/Tests/SampleSuiteExtensionTests.csproj
@@ -1,94 +1,126 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "SampleSuiteExtensionTests"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "Tests"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                />
-                <Reference
-                    Name = "SampleSuiteExtension"
-                    Project = "{0C4269EE-3266-45DD-9062-E356C067FBEF}"
-                    Package = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"
-                />
-                <Reference
-                    Name = "nunit.framework"
-                    AssemblyName = "nunit.framework"
-                    HintPath = "..\..\..\..\bin\nunit.framework.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "SampleSuiteExtensionTests.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9F609A0D-FF7E-4F0C-B2DF-417EBC557CFF}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>SampleSuiteExtensionTests</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\SampleSuiteExtension.csproj">
+      <Name>SampleSuiteExtension</Name>
+      <Project>{0C4269EE-3266-45DD-9062-E356C067FBEF}</Project>
+      <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
+    </ProjectReference>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>..\..\..\..\bin\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SampleSuiteExtensionTests.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/ReadMe.txt b/samples/ReadMe.txt
index 43054b6..7587a2e 100644
--- a/samples/ReadMe.txt
+++ b/samples/ReadMe.txt
@@ -1,69 +1,58 @@
-NUnit Samples
-
-This directory contains sample applications demonstrating the use of NUnit and organized as follows...
-
-  CSharp: Samples in C#
-
-    Failures: Demonstrates 4 failing tests and one that is not run.
-
-    Money: This is a C# version of the money example which is found in most xUnit implementations. Thanks to Kent Beck.
-
-    Money-Port: This shows how the Money example can be ported from Version 1 of NUnit with minimal changes.
-
-    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
-
-  JSharp: Samples in J#
-
-    Failures: Demonstrates 4 failing tests and one that is not run.
-
-  CPP: C++ Samples
-
-   MANAGED: Managed C++ Samples (VS 2003 compatible)
-
-    Failures: Demonstrates 4 failing tests and one that is not run.
-
-   CPP-CLI: C++/CLI Samples (VS 2005 only)
-
-    Failures: Demonstrates 4 failing tests and one that is not run.
-
-    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
-
-  VB: Samples in VB.NET
-
-    Failures: Demonstrates 4 failing tests and one that is not run.
-
-    Money: This is a VB.NET version of the money example found in most xUnit implementations. Thanks to Kent Beck.
-
-    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
-
-  Extensibility: Examples of extending NUnit
-
-    Framework:
-
-    Core:
-    
-      TestSuiteExtension
-
-      TestFixtureExtension
-
-
-Building the Samples
-
-A Visual Studio 2003 project is included for most samples. 
-Visual Studio 2005 will convert the format automatically upon
-opening it. The C++/CLI samples, as well as other samples that
-depend on .NET 2.0 features, include Visual Studio 2005 projects.
-
-In most cases, you will need to remove the reference to the
-nunit.framework assembly and replace it with a reference to 
-your installed copy of NUnit.
-
-To build using the Microsoft compiler, use a command similar 
-to the following:
-
-  csc /target:library /r:<path-to-NUnit>/nunit.framework.dll example.cs
-
-To build using the mono compiler, use a command like this:
-
-  msc /target:library /r:<path-to-NUNit>/nunit.framework.dll example.cs  
-
+NUnit Samples
+
+This directory contains sample applications demonstrating the use of NUnit and organized as follows...
+
+  CSharp: Samples in C#
+
+    Failures: Demonstrates 4 failing tests and one that is not run.
+
+    Money: This is a C# version of the money example which is found in most xUnit implementations. Thanks to Kent Beck.
+
+    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
+
+  FSHARP: Samples in F#
+
+    Failures: Demonstrates 4 failing tests and one that is not run.
+
+    Money: This is an F# version of the money example which is found in most xUnit implementations. Thanks to Kent Beck.
+
+    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
+
+  CPP: C++ Samples
+
+   MANAGED: Managed C++ Samples (VS 2003 compatible)
+
+    Failures: Demonstrates 4 failing tests and one that is not run.
+
+   CPP-CLI: C++/CLI Samples
+
+    Failures: Demonstrates 4 failing tests and one that is not run.
+
+    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
+
+  VB: Samples in VB.NET
+
+    Failures: Demonstrates 4 failing tests and one that is not run.
+
+    Money: This is a VB.NET version of the money example found in most xUnit implementations. Thanks to Kent Beck.
+
+    Syntax: Illustrates most Assert methods using both the classic and constraint-based syntax.
+
+  Extensibility: Examples of extending NUnit
+
+    Framework:
+
+    Core:
+    
+      TestSuiteExtension
+
+      TestFixtureExtension
+
+
+Building the Samples
+
+A Visual Studio 2010 project is included for each sample. 
+
+In most cases, you will need to remove the reference to the
+nunit.framework assembly and replace it with a reference to 
+your installed copy of NUnit.
diff --git a/samples/cpp/cpp-cli.sln b/samples/cpp/cpp-cli.sln
new file mode 100644
index 0000000..ceaed28
--- /dev/null
+++ b/samples/cpp/cpp-cli.sln
@@ -0,0 +1,41 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-cli-failures", "failures\cpp-cli-failures.vcxproj", "{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-cli-syntax", "syntax\cpp-cli-syntax.vcxproj", "{72448C2D-17C9-419E-B28D-3B533E7E0CD5}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Win32.ActiveCfg = Debug|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Win32.Build.0 = Debug|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Any CPU.ActiveCfg = Release|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Win32.ActiveCfg = Release|Win32
+		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Win32.Build.0 = Release|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Win32.ActiveCfg = Debug|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Win32.Build.0 = Debug|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Any CPU.ActiveCfg = Release|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Win32.ActiveCfg = Release|Win32
+		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/samples/cpp/cpp-cli/cpp-cli.sln b/samples/cpp/cpp-cli/cpp-cli.sln
deleted file mode 100644
index 0417372..0000000
--- a/samples/cpp/cpp-cli/cpp-cli.sln
+++ /dev/null
@@ -1,41 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-cli-failures", "failures\cpp-cli-failures.vcproj", "{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-cli-syntax", "syntax\cpp-cli-syntax.vcproj", "{72448C2D-17C9-419E-B28D-3B533E7E0CD5}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Debug|Mixed Platforms = Debug|Mixed Platforms
-		Debug|Win32 = Debug|Win32
-		Release|Any CPU = Release|Any CPU
-		Release|Mixed Platforms = Release|Mixed Platforms
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Any CPU.ActiveCfg = Debug|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Win32.ActiveCfg = Debug|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Debug|Win32.Build.0 = Debug|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Any CPU.ActiveCfg = Release|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Mixed Platforms.Build.0 = Release|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Win32.ActiveCfg = Release|Win32
-		{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}.Release|Win32.Build.0 = Release|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Any CPU.ActiveCfg = Debug|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Win32.ActiveCfg = Debug|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Debug|Win32.Build.0 = Debug|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Any CPU.ActiveCfg = Release|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Mixed Platforms.Build.0 = Release|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Win32.ActiveCfg = Release|Win32
-		{72448C2D-17C9-419E-B28D-3B533E7E0CD5}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/samples/cpp/cpp-cli/failures/AssemblyInfo.cpp b/samples/cpp/cpp-cli/failures/AssemblyInfo.cpp
deleted file mode 100644
index f935771..0000000
--- a/samples/cpp/cpp-cli/failures/AssemblyInfo.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-using namespace System::Reflection;
-using namespace 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:AssemblyTitleAttribute("")];
-[assembly:AssemblyDescriptionAttribute("")];
-[assembly:AssemblyConfigurationAttribute("")];
-[assembly:AssemblyCompanyAttribute("")];
-[assembly:AssemblyProductAttribute("")];
-[assembly:AssemblyCopyrightAttribute("")];
-[assembly:AssemblyTrademarkAttribute("")];
-[assembly:AssemblyCultureAttribute("")];		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the value or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly:AssemblyVersionAttribute("2.2.0.0")];
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//        When specifying the KeyFile, the location of the KeyFile should be
-//        relative to the project directory.
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly:AssemblyDelaySignAttribute(false)];
-[assembly:AssemblyKeyFileAttribute("")];
-[assembly:AssemblyKeyNameAttribute("")];
-
diff --git a/samples/cpp/cpp-cli/failures/cpp-cli-failures.build b/samples/cpp/cpp-cli/failures/cpp-cli-failures.build
deleted file mode 100644
index 99aabd3..0000000
--- a/samples/cpp/cpp-cli/failures/cpp-cli-failures.build
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<project name="cpp-cli-failures" default="build">
-
-  <include buildfile="../../../samples.common"/>
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cpp" />
-    <include name="cppsample.cpp" />
-    <include name="cppsample.h" />
-  </patternset>
-
-  <target name="packagex">
-    <copy todir="${package.samples.dir}/cpp/cpp-cli/failures">
-      <fileset basedir=".">
-        <include name="cpp-cli-failures.vcproj" />
-        <include name="cpp-cli-failures.build" />
-        <include name="AssemblyInfo.cpp" />
-        <include name="cppsample.cpp" />
-        <include name="cppsample.h" />
-      </fileset>
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj b/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj
deleted file mode 100644
index e11541d..0000000
--- a/samples/cpp/cpp-cli/failures/cpp-cli-failures.vcproj
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="cpp-cli-failures"
-	ProjectGUID="{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}"
-	RootNamespace="cpp-failures"
-	Keyword="ManagedCProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="2"
-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-			CharacterSet="2"
-			ManagedExtensions="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalUsingDirectories=""
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				MinimalRebuild="false"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-cli-failures.dll"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				AssemblyDebug="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="2"
-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-			CharacterSet="2"
-			ManagedExtensions="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				AdditionalUsingDirectories=""
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				MinimalRebuild="false"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-cli-failures.dll"
-				LinkIncremental="1"
-				GenerateDebugInformation="true"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath="..\..\..\..\solutions\vs2005\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
-			AssemblyName="nunit.framework, Version=2.5.0.0, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"
-		/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
-			>
-			<File
-				RelativePath="AssemblyInfo.cpp"
-				>
-			</File>
-			<File
-				RelativePath="cppsample.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc"
-			>
-			<File
-				RelativePath="cppsample.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r"
-			>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/samples/cpp/cpp-cli/failures/cppsample.cpp b/samples/cpp/cpp-cli/failures/cppsample.cpp
deleted file mode 100644
index 4404af3..0000000
--- a/samples/cpp/cpp-cli/failures/cppsample.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-#include "cppsample.h"
-
-namespace NUnitSamples {
-
-	void SimpleCPPSample::Init() {
-		fValue1 = 2;
-		fValue2 = 3;
-	}
-
-	void SimpleCPPSample::Add() {
-		int result = fValue1 + fValue2;
-		Assert::AreEqual(6,result);
-	}
-
-	void SimpleCPPSample::DivideByZero()
-	{
-		int zero= 0;
-		int result= 8/zero;
-	}
-
-	void SimpleCPPSample::Equals() {
-		Assert::AreEqual(12, 12, "Integer");
-		Assert::AreEqual(12L, 12L, "Long");
-		Assert::AreEqual('a', 'a', "Char");
-
-
-		Assert::AreEqual(12, 13, "Expected Failure (Integer)");
-		Assert::AreEqual(12.0, 11.99, 0.0, "Expected Failure (Double)");
-	}
-
-	void SimpleCPPSample::IgnoredTest()
-	{
-		throw gcnew InvalidCastException();
-	}
-
-	void SimpleCPPSample::ExpectAnException()
-	{
-		throw gcnew InvalidCastException();
-	}
-
-}
-
diff --git a/samples/cpp/cpp-cli/failures/cppsample.h b/samples/cpp/cpp-cli/failures/cppsample.h
deleted file mode 100644
index 5d48a79..0000000
--- a/samples/cpp/cpp-cli/failures/cppsample.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-#pragma once
-
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitSamples
-{
-	[TestFixture]
-	public ref class SimpleCPPSample
-	{
-		int fValue1;
-		int fValue2;
-	public:
-		[SetUp] void Init();
-
-		[Test] void Add();
-		[Test] void DivideByZero();
-		[Test] void Equals();
-		[Test] [Ignore("ignored test")] void IgnoredTest();
-		[Test] [ExpectedException(InvalidOperationException::typeid)] void ExpectAnException();
-	};
-}
diff --git a/samples/cpp/cpp-cli/syntax/AssemblyInfo.cpp b/samples/cpp/cpp-cli/syntax/AssemblyInfo.cpp
deleted file mode 100644
index 9b65c87..0000000
--- a/samples/cpp/cpp-cli/syntax/AssemblyInfo.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include "stdafx.h"
-
-using namespace System;
-using namespace System::Reflection;
-using namespace System::Runtime::CompilerServices;
-using namespace System::Runtime::InteropServices;
-using namespace System::Security::Permissions;
-
-//
-// 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:AssemblyTitleAttribute("cppclisyntax")];
-[assembly:AssemblyDescriptionAttribute("")];
-[assembly:AssemblyConfigurationAttribute("")];
-[assembly:AssemblyCompanyAttribute("")];
-[assembly:AssemblyProductAttribute("cppclisyntax")];
-[assembly:AssemblyCopyrightAttribute("Copyright (c)  2007")];
-[assembly:AssemblyTrademarkAttribute("")];
-[assembly:AssemblyCultureAttribute("")];
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the value or you can default the Revision and Build Numbers
-// by using the '*' as shown below:
-
-[assembly:AssemblyVersionAttribute("1.0.*")];
-
-[assembly:ComVisible(false)];
-
-[assembly:CLSCompliantAttribute(true)];
-
-[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
diff --git a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build
deleted file mode 100644
index 3ac3260..0000000
--- a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.build
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-<project name="cpp-cli-syntax" default="build">
-
-  <include buildfile="../../../samples.common"/>
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cpp" />
-    <include name="cpp-cli-syntax.cpp" />
-  </patternset>
-  
-</project>
\ No newline at end of file
diff --git a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp
deleted file mode 100644
index 81e013c..0000000
--- a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.cpp
+++ /dev/null
@@ -1,641 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-using namespace NUnit::Framework;
-using NUnit::Framework::Is;
-using NUnit::Framework::Text;
-using NUnit::Framework::List;
-using NUnit::Framework::Has;
-using System::String;
-
-namespace NUnitSamples
-{
-	[TestFixture]
-	public ref class AssertSyntaxTests : AssertionHelper
-	{
-	public:
-		[Test]
-		void IsNull()
-		{
-			Object ^nada = nullptr;
-
-			// Classic syntax
-			Assert::IsNull(nada);
-
-			// Helper syntax
-			Assert::That(nada, Is::Null);
-
-			// Inherited syntax
-			Expect(nada, Null);
-		}
-
-		[Test]
-		void IsNotNull()
-		{
-			// Classic syntax
-			Assert::IsNotNull(42);
-
-			// Helper syntax
-			Assert::That(42, Is::Not->Null);
-
-			// Inherited syntax
-			Expect( 42, Not->Null );
-		}
-
-		[Test]
-		void IsTrue()
-		{
-			// Classic syntax
-			Assert::IsTrue(2+2==4);
-
-			// Helper syntax
-			Assert::That(2+2==4, Is::True);
-			Assert::That(2+2==4);
-
-			// Inherited syntax
-			Expect(2+2==4, True);
-			Expect(2+2==4);
-		}
-
-		[Test]
-		void IsFalse()
-		{
-			// Classic syntax
-			Assert::IsFalse(2+2==5);
-
-			// Helper syntax
-			Assert::That(2+2==5, Is::False);
-			
-			// Inherited syntax
-			Expect(2+2==5, False);
-		}
-
-		[Test]
-		void IsNaN()
-		{
-			double d = double::NaN;
-			float f = float::NaN;
-
-			// Classic syntax
-			Assert::IsNaN(d);
-			Assert::IsNaN(f);
-
-			// Helper syntax
-			Assert::That(d, Is::NaN);
-			Assert::That(f, Is::NaN);
-			
-			// Inherited syntax
-			Expect(d, NaN);
-			Expect(f, NaN);
-		}
-
-		[Test]
-		void EmptyStringTests()
-		{
-			// Classic syntax
-			Assert::IsEmpty("");
-			Assert::IsNotEmpty("Hello!");
-
-			// Helper syntax
-			Assert::That("", Is::Empty);
-			Assert::That("Hello!", Is::Not->Empty);
-
-			// Inherited syntax
-			Expect("", Empty);
-			Expect("Hello!", Not->Empty);
-		}
-
-		[Test]
-		void EmptyCollectionTests()
-		{
-			// Classic syntax
-			Assert::IsEmpty(gcnew array<bool>(0));
-			Assert::IsNotEmpty(gcnew array<int>(3));
-
-			// Helper syntax
-			Assert::That(gcnew array<bool>(0), Is::Empty);
-			Assert::That(gcnew array<int>(3), Is::Not->Empty);
-
-			// Inherited syntax
-			Expect(gcnew array<bool>(0), Empty);
-			Expect(gcnew array<int>(3), Not->Empty);
-		}
-
-		[Test]
-		void ExactTypeTests()
-		{
-			// Classic syntax workarounds)
-			String^ greeting = "Hello";
-			Assert::AreEqual(String::typeid, greeting->GetType());
-			Assert::AreEqual("System.String", greeting->GetType()->FullName);
-			Assert::AreNotEqual(int::typeid, greeting->GetType());
-			Assert::AreNotEqual("System.Int32", greeting->GetType()->FullName);
-
-			// Helper syntax
-			Assert::That(greeting, Is::TypeOf(String::typeid));
-			Assert::That(greeting, Is::Not->TypeOf(int::typeid));
-			
-			// Inherited syntax
-			Expect( "Hello", TypeOf(String::typeid));
-			Expect( "Hello", Not->TypeOf(int::typeid));
-		}
-
-		[Test]
-		void InstanceOfTypeTests()
-		{
-			// Classic syntax
-			Assert::IsInstanceOfType(String::typeid, "Hello");
-			Assert::IsNotInstanceOfType(String::typeid, 5);
-
-			// Helper syntax
-			Assert::That("Hello", Is::InstanceOfType(String::typeid));
-			Assert::That(5, Is::Not->InstanceOfType(String::typeid));
-
-			// Inherited syntax
-			Expect("Hello", InstanceOfType(String::typeid));
-			Expect(5, Not->InstanceOfType(String::typeid));
-		}
-
-		[Test]
-		void AssignableFromTypeTests()
-		{
-			// Classic syntax
-			Assert::IsAssignableFrom(String::typeid, "Hello");
-			Assert::IsNotAssignableFrom(String::typeid, 5);
-
-			// Helper syntax
-			Assert::That( "Hello", Is::AssignableFrom(String::typeid));
-			Assert::That( 5, Is::Not->AssignableFrom(String::typeid));
-			
-			// Inherited syntax
-			Expect( "Hello", AssignableFrom(String::typeid));
-			Expect( 5, Not->AssignableFrom(String::typeid));
-		}
-
-		[Test]
-		void SubstringTests()
-		{
-			String^ phrase = "Hello World!";
-			array<String^>^ strings = {"abc", "bad", "dba" };
-			
-			// Classic Syntax
-			StringAssert::Contains("World", phrase);
-			
-			// Helper syntax
-			Assert::That(phrase, Contains("World"));
-			// Only available using new syntax
-			Assert::That(phrase, Text::DoesNotContain("goodbye"));
-			Assert::That(phrase, Text::Contains("WORLD")->IgnoreCase);
-			Assert::That(phrase, Text::DoesNotContain("BYE")->IgnoreCase);
-			Assert::That(strings, Text::All->Contains( "b" ) );
-
-			// Inherited syntax
-			Expect(phrase, Contains("World"));
-			// Only available using new syntax
-			Expect(phrase, Not->Contains("goodbye"));
-			Expect(phrase, Contains("WORLD")->IgnoreCase);
-			Expect(phrase, Not->Contains("BYE")->IgnoreCase);
-			Expect(strings, All->Contains("b"));
-		}
-
-		[Test]
-		void StartsWithTests()
-		{
-			String^ phrase = "Hello World!";
-			array<String^>^ greetings = { "Hello!", "Hi!", "Hola!" };
-
-			// Classic syntax
-			StringAssert::StartsWith("Hello", phrase);
-
-			// Helper syntax
-			Assert::That(phrase, Text::StartsWith("Hello"));
-			// Only available using new syntax
-			Assert::That(phrase, Text::DoesNotStartWith("Hi!"));
-			Assert::That(phrase, Text::StartsWith("HeLLo")->IgnoreCase);
-			Assert::That(phrase, Text::DoesNotStartWith("HI")->IgnoreCase);
-			Assert::That(greetings, Text::All->StartsWith("h")->IgnoreCase);
-
-			// Inherited syntax
-			Expect(phrase, StartsWith("Hello"));
-			// Only available using new syntax
-			Expect(phrase, Not->StartsWith("Hi!"));
-			Expect(phrase, StartsWith("HeLLo")->IgnoreCase);
-			Expect(phrase, Not->StartsWith("HI")->IgnoreCase);
-			Expect(greetings, All->StartsWith("h")->IgnoreCase);
-		}
-
-		[Test]
-		void EndsWithTests()
-		{
-			String^ phrase = "Hello World!";
-			array<String^>^ greetings = { "Hello!", "Hi!", "Hola!" };
-
-			// Classic Syntax
-			StringAssert::EndsWith("!", phrase);
-
-			// Helper syntax
-			Assert::That(phrase, Text::EndsWith("!"));
-			// Only available using new syntax
-			Assert::That(phrase, Text::DoesNotEndWith("?"));
-			Assert::That(phrase, Text::EndsWith("WORLD!")->IgnoreCase);
-			Assert::That(greetings, Text::All->EndsWith("!"));
-		
-			// Inherited syntax
-			Expect(phrase, EndsWith("!"));
-			// Only available using new syntax
-			Expect(phrase, Not->EndsWith("?"));
-			Expect(phrase, EndsWith("WORLD!")->IgnoreCase);
-			Expect(greetings, All->EndsWith("!") );
-		}
-
-		[Test]
-		void EqualIgnoringCaseTests()
-		{
-			String^ phrase = "Hello World!";
-
-			// Classic syntax
-			StringAssert::AreEqualIgnoringCase("hello world!",phrase);
-            
-			// Helper syntax
-			Assert::That(phrase, Is::EqualTo("hello world!")->IgnoreCase);
-			//Only available using new syntax
-			Assert::That(phrase, Is::Not->EqualTo("goodbye world!")->IgnoreCase);
-			Assert::That(gcnew array<String^> { "Hello", "World" }, 
-				Is::EqualTo(gcnew array<Object^> { "HELLO", "WORLD" })->IgnoreCase);
-			Assert::That(gcnew array<String^> {"HELLO", "Hello", "hello" },
-				Is::All->EqualTo( "hello" )->IgnoreCase);
-		            
-			// Inherited syntax
-			Expect(phrase, EqualTo("hello world!")->IgnoreCase);
-			//Only available using new syntax
-			Expect(phrase, Not->EqualTo("goodbye world!")->IgnoreCase);
-			Expect(gcnew array<String^> { "Hello", "World" }, 
-				EqualTo(gcnew array<Object^> { "HELLO", "WORLD" })->IgnoreCase);
-			Expect(gcnew array<String^> {"HELLO", "Hello", "hello" },
-				All->EqualTo( "hello" )->IgnoreCase);
-		}
-
-		[Test]
-		void RegularExpressionTests()
-		{
-			String^ phrase = "Now is the time for all good men to come to the aid of their country.";
-			array<String^>^ quotes = { "Never say never", "It's never too late", "Nevermore!" };
-
-			// Classic syntax
-			StringAssert::IsMatch( "all good men", phrase );
-			StringAssert::IsMatch( "Now.*come", phrase );
-
-			// Helper syntax
-			Assert::That( phrase, Text::Matches( "all good men" ) );
-			Assert::That( phrase, Text::Matches( "Now.*come" ) );
-			// Only available using new syntax
-			Assert::That(phrase, Text::DoesNotMatch("all.*men.*good"));
-			Assert::That(phrase, Text::Matches("ALL")->IgnoreCase);
-			Assert::That(quotes, Text::All->Matches("never")->IgnoreCase);
-		
-			// Inherited syntax
-			Expect( phrase, Matches( "all good men" ) );
-			Expect( phrase, Matches( "Now.*come" ) );
-			// Only available using new syntax
-			Expect(phrase, Not->Matches("all.*men.*good"));
-			Expect(phrase, Matches("ALL")->IgnoreCase);
-			Expect(quotes, All->Matches("never")->IgnoreCase);
-		}
-
-		[Test]
-		void EqualityTests()
-		{
-			array<int>^ i3 = { 1, 2, 3 };
-			array<double>^ d3 = { 1.0, 2.0, 3.0 };
-			array<int>^ iunequal = { 1, 3, 2 };
-
-			// Classic Syntax
-			Assert::AreEqual(4, 2 + 2);
-			Assert::AreEqual(i3, d3);
-			Assert::AreNotEqual(5, 2 + 2);
-			Assert::AreNotEqual(i3, iunequal);
-
-			// Helper syntax
-			Assert::That(2 + 2, Is::EqualTo(4));
-			Assert::That(2 + 2 == 4);
-			Assert::That(i3, Is::EqualTo(d3));
-			Assert::That(2 + 2, Is::Not->EqualTo(5));
-			Assert::That(i3, Is::Not->EqualTo(iunequal));
-		
-			// Inherited syntax
-			Expect(2 + 2, EqualTo(4));
-			Expect(2 + 2 == 4);
-			Expect(i3, EqualTo(d3));
-			Expect(2 + 2, Not->EqualTo(5));
-			Expect(i3, Not->EqualTo(iunequal));
-		}
-
-		[Test]
-		void EqualityTestsWithTolerance()
-		{
-			// CLassic syntax
-			Assert::AreEqual(5.0, 4.99, 0.05);
-			Assert::AreEqual(5.0F, 4.99F, 0.05F);
-
-			// Helper syntax
-			Assert::That(4.99L, Is::EqualTo(5.0L)->Within(0.05L));
-			Assert::That(4.99f, Is::EqualTo(5.0f)->Within(0.05f));
-		
-			// Inherited syntax
-			Expect(4.99L, EqualTo(5.0L)->Within(0.05L));
-			Expect(4.99f, EqualTo(5.0f)->Within(0.05f));
-		}
-
-		[Test]
-		void ComparisonTests()
-		{
-			// Classic Syntax
-			Assert::Greater(7, 3);
-			Assert::GreaterOrEqual(7, 3);
-			Assert::GreaterOrEqual(7, 7);
-
-			// Helper syntax
-			Assert::That(7, Is::GreaterThan(3));
-			Assert::That(7, Is::GreaterThanOrEqualTo(3));
-			Assert::That(7, Is::AtLeast(3));
-			Assert::That(7, Is::GreaterThanOrEqualTo(7));
-			Assert::That(7, Is::AtLeast(7));
-
-			// Inherited syntax
-			Expect(7, GreaterThan(3));
-			Expect(7, GreaterThanOrEqualTo(3));
-			Expect(7, AtLeast(3));
-			Expect(7, GreaterThanOrEqualTo(7));
-			Expect(7, AtLeast(7));
-
-			// Classic syntax
-			Assert::Less(3, 7);
-			Assert::LessOrEqual(3, 7);
-			Assert::LessOrEqual(3, 3);
-
-			// Helper syntax
-			Assert::That(3, Is::LessThan(7));
-			Assert::That(3, Is::LessThanOrEqualTo(7));
-			Assert::That(3, Is::AtMost(7));
-			Assert::That(3, Is::LessThanOrEqualTo(3));
-			Assert::That(3, Is::AtMost(3));
-		
-			// Inherited syntax
-			Expect(3, LessThan(7));
-			Expect(3, LessThanOrEqualTo(7));
-			Expect(3, AtMost(7));
-			Expect(3, LessThanOrEqualTo(3));
-			Expect(3, AtMost(3));
-		}
-
-		[Test]
-		void AllItemsTests()
-		{
-			array<Object^>^ ints = { 1, 2, 3, 4 };
-			array<Object^>^ strings = { "abc", "bad", "cab", "bad", "dad" };
-
-			// Classic syntax
-			CollectionAssert::AllItemsAreNotNull(ints);
-			CollectionAssert::AllItemsAreInstancesOfType(ints, int::typeid);
-			CollectionAssert::AllItemsAreInstancesOfType(strings, String::typeid);
-			CollectionAssert::AllItemsAreUnique(ints);
-
-			// Helper syntax
-			Assert::That(ints, Is::All->Not->Null);
-			Assert::That(ints, Is::All->InstanceOfType(int::typeid));
-			Assert::That(strings, Is::All->InstanceOfType(String::typeid));
-			Assert::That(ints, Is::Unique);
-			// Only available using new syntax
-			Assert::That(strings, Is::Not->Unique);
-			Assert::That(ints, Is::All->GreaterThan(0));
-			Assert::That(strings, Text::All->Contains( "a" ) );
-			Assert::That(strings, Has::Some->StartsWith( "ba" ) );
-		
-			// Inherited syntax
-			Expect(ints, All->Not->Null);
-			Expect(ints, All->InstanceOfType(int::typeid));
-			Expect(strings, All->InstanceOfType(String::typeid));
-			Expect(ints, Unique);
-			// Only available using new syntax
-			Expect(strings, Not->Unique);
-			Expect(ints, All->GreaterThan(0));
-			Expect(strings, All->Contains( "a" ) );
-			Expect(strings, Some->StartsWith( "ba" ) );
-		}
-
-		[Test]
-		void SomeItemsTests()
-		{
-			array<Object^>^ mixed = { 1, 2, "3", nullptr, "four", 100 };
-			array<Object^>^ strings = { "abc", "bad", "cab", "bad", "dad" };
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert::That(mixed, Has::Some->Null);
-			Assert::That(mixed, Has::Some->InstanceOfType(int::typeid));
-			Assert::That(mixed, Has::Some->InstanceOfType(String::typeid));
-			Assert::That(strings, Has::Some->StartsWith( "ba" ) );
-			Assert::That(strings, Has::Some->Not->StartsWith( "ba" ) );
-		
-			// Inherited syntax
-			Expect(mixed, Some->Null);
-			Expect(mixed, Some->InstanceOfType(int::typeid));
-			Expect(mixed, Some->InstanceOfType(String::typeid));
-			Expect(strings, Some->StartsWith( "ba" ) );
-			Expect(strings, Some->Not->StartsWith( "ba" ) );
-		}
-
-		[Test]
-		void NoItemsTests()
-		{
-			array<Object^>^ ints = { 1, 2, 3, 4, 5 };
-			array<Object^>^ strings = { "abc", "bad", "cab", "bad", "dad" };
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert::That(ints, Has::None->Null);
-			Assert::That(ints, Has::None->InstanceOfType(String::typeid));
-			Assert::That(ints, Has::None->GreaterThan(99));
-			Assert::That(strings, Has::None->StartsWith( "qu" ) );
-		
-			// Inherited syntax
-			Expect(ints, None->Null);
-			Expect(ints, None->InstanceOfType(String::typeid));
-			Expect(ints, None->GreaterThan(99));
-			Expect(strings, None->StartsWith( "qu" ) );
-		}
-
-		[Test]
-		void CollectionContainsTests()
-		{
-			array<int>^ iarray = { 1, 2, 3 };
-			array<String^>^ sarray = { "a", "b", "c" };
-
-			// Classic syntax
-			Assert::Contains(3, iarray);
-			Assert::Contains("b", sarray);
-			CollectionAssert::Contains(iarray, 3);
-			CollectionAssert::Contains(sarray, "b");
-			CollectionAssert::DoesNotContain(sarray, "x");
-
-			// Helper syntax
-			Assert::That(iarray, Has::Member(3));
-			Assert::That(sarray, Has::Member("b"));
-			Assert::That(sarray, Has::No->Member("x")); // Yuck!
-			Assert::That(sarray, !Has::Member("x"));
-		
-			// Inherited syntax
-			Expect(iarray, Contains(3));
-			Expect(sarray, Contains("b"));
-			Expect(sarray, Not->Contains("x"));
-			Expect(sarray, !Contains("x"));
-		}
-
-		[Test]
-		void CollectionEquivalenceTests()
-		{
-			array<int>^ ints1to5 = { 1, 2, 3, 4, 5 };
-
-			// Classic syntax
-			CollectionAssert::AreEquivalent(gcnew array<int> { 2, 1, 4, 3, 5 }, ints1to5);
-			CollectionAssert::AreNotEquivalent(gcnew array<int> { 2, 2, 4, 3, 5 }, ints1to5);
-			CollectionAssert::AreNotEquivalent(gcnew array<int> { 2, 4, 3, 5 }, ints1to5);
-			CollectionAssert::AreNotEquivalent(gcnew array<int> { 2, 2, 1, 1, 4, 3, 5 }, ints1to5);
-		
-			// Helper syntax
-			Assert::That(gcnew array<int> { 2, 1, 4, 3, 5 }, Is::EquivalentTo(ints1to5));
-			Assert::That(gcnew array<int> { 2, 2, 4, 3, 5 }, Is::Not->EquivalentTo(ints1to5));
-			Assert::That(gcnew array<int> { 2, 4, 3, 5 }, Is::Not->EquivalentTo(ints1to5));
-			Assert::That(gcnew array<int> { 2, 2, 1, 1, 4, 3, 5 }, Is::Not->EquivalentTo(ints1to5));
-
-			// Inherited syntax
-			Expect(gcnew array<int> { 2, 1, 4, 3, 5 }, EquivalentTo(ints1to5));
-			Expect(gcnew array<int> { 2, 2, 4, 3, 5 }, Not->EquivalentTo(ints1to5));
-			Expect(gcnew array<int> { 2, 4, 3, 5 }, Not->EquivalentTo(ints1to5));
-			Expect(gcnew array<int> { 2, 2, 1, 1, 4, 3, 5 }, Not->EquivalentTo(ints1to5));
-		}
-
-		[Test]
-		void SubsetTests()
-		{
-			array<int>^ ints1to5 = { 1, 2, 3, 4, 5 };
-
-			// Classic syntax
-			CollectionAssert::IsSubsetOf(gcnew array<int> { 1, 3, 5 }, ints1to5);
-			CollectionAssert::IsSubsetOf(gcnew array<int> { 1, 2, 3, 4, 5 }, ints1to5);
-			CollectionAssert::IsNotSubsetOf(gcnew array<int> { 2, 4, 6 }, ints1to5);
-			CollectionAssert::IsNotSubsetOf(gcnew array<int> { 1, 2, 2, 2, 5 }, ints1to5);
-
-			// Helper syntax
-			Assert::That(gcnew array<int> { 1, 3, 5 }, Is::SubsetOf(ints1to5));
-			Assert::That(gcnew array<int> { 1, 2, 3, 4, 5 }, Is::SubsetOf(ints1to5));
-			Assert::That(gcnew array<int> { 2, 4, 6 }, Is::Not->SubsetOf(ints1to5));
-			Assert::That(gcnew array<int> { 1, 2, 2, 2, 5 }, Is::Not->SubsetOf(ints1to5));
-		
-			// Inherited syntax
-			Expect(gcnew array<int> { 1, 3, 5 }, SubsetOf(ints1to5));
-			Expect(gcnew array<int> { 1, 2, 3, 4, 5 }, SubsetOf(ints1to5));
-			Expect(gcnew array<int> { 2, 4, 6 }, Not->SubsetOf(ints1to5));
-			Expect(gcnew array<int> { 1, 2, 2, 2, 5 }, Not->SubsetOf(ints1to5));
-		}
-
-		[Test]
-		void PropertyTests()
-		{
-			array<String^>^ strings = { "abc", "bca", "xyz" };
-
-			// Helper syntax
-			Assert::That( "Hello", Has::Property("Length")->EqualTo(5) );
-			Assert::That( "Hello", Has::Length->EqualTo( 5 ) );
-			Assert::That( strings , Has::All->Property( "Length")->EqualTo(3) );
-			Assert::That( strings, Has::All->Length->EqualTo( 3 ) );
-
-			// Inherited syntax
-			Expect( "Hello", Property("Length")->EqualTo(5) );
-			Expect( "Hello", Length->EqualTo( 5 ) );
-			Expect( strings, All->Property("Length")->EqualTo(3) );
-			Expect( strings, All->Length->EqualTo( 3 ) );
-		}
-
-		[Test]
-		void NotTests()
-		{
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert::That(42, Is::Not->Null);
-			Assert::That(42, Is::Not->True);
-			Assert::That(42, Is::Not->False);
-			Assert::That(2.5, Is::Not->NaN);
-			Assert::That(2 + 2, Is::Not->EqualTo(3));
-			Assert::That(2 + 2, Is::Not->Not->EqualTo(4));
-			Assert::That(2 + 2, Is::Not->Not->Not->EqualTo(5));
-
-			// Inherited syntax
-			Expect(42, Not->Null);
-			Expect(42, Not->True);
-			Expect(42, Not->False);
-			Expect(2.5, Not->NaN);
-			Expect(2 + 2, Not->EqualTo(3));
-			Expect(2 + 2, Not->Not->EqualTo(4));
-			Expect(2 + 2, Not->Not->Not->EqualTo(5));
-		}
-
-		[Test]
-		void NotOperator()
-		{
-			// The ! operator is only available in the new syntax
-			Assert::That(42, !Is::Null);
-			// Inherited syntax
-			Expect( 42, !Null );
-		}
-
-		[Test]
-		void AndOperator()
-		{
-			// The & operator is only available in the new syntax
-			Assert::That(7, Is::GreaterThan(5) & Is::LessThan(10));
-			// Inherited syntax
-			Expect( 7, GreaterThan(5) & LessThan(10));
-		}
-
-		[Test]
-		void OrOperator()
-		{
-			// The | operator is only available in the new syntax
-			Assert::That(3, Is::LessThan(5) | Is::GreaterThan(10));
-			Expect( 3, LessThan(5) | GreaterThan(10));
-		}
-
-		[Test]
-		void ComplexTests()
-		{
-			Assert::That(7, Is::Not->Null & Is::Not->LessThan(5) & Is::Not->GreaterThan(10));
-			Expect(7, Not->Null & Not->LessThan(5) & Not->GreaterThan(10));
-
-			Assert::That(7, !Is::Null & !Is::LessThan(5) & !Is::GreaterThan(10));
-			Expect(7, !Null & !LessThan(5) & !GreaterThan(10));
-		}
-
-		// This method contains assertions that should not compile
-		// You can check by uncommenting it.
-		//void WillNotCompile()
-		//{
-		//    Assert::That(42, Is::Not);
-		//    Assert::That(42, Is::All);
-		//    Assert::That(42, Is::Null->Not);
-		//    Assert::That(42, Is::Not->Null->GreaterThan(10));
-		//    Assert::That(42, Is::GreaterThan(10)->LessThan(99));
-
-		//    object[] c = new object[0];
-		//    Assert::That(c, Is::Null->All);
-		//    Assert::That(c, Is::Not->All);
-		//    Assert::That(c, Is::All->Not);
-		//}
-	};
-}
\ No newline at end of file
diff --git a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj b/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj
deleted file mode 100644
index d16dd41..0000000
--- a/samples/cpp/cpp-cli/syntax/cpp-cli-syntax.vcproj
+++ /dev/null
@@ -1,200 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="cpp-cli-syntax"
-	ProjectGUID="{72448C2D-17C9-419E-B28D-3B533E7E0CD5}"
-	RootNamespace="cppclisyntax"
-	Keyword="ManagedCProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="1"
-			ManagedExtensions="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				RuntimeLibrary="3"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="$(NoInherit)"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				AssemblyDebug="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="1"
-			ManagedExtensions="1"
-			WholeProgramOptimization="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				RuntimeLibrary="2"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="$(NoInherit)"
-				LinkIncremental="1"
-				GenerateDebugInformation="true"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath="System.dll"
-			AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
-		/>
-		<AssemblyReference
-			RelativePath="..\..\..\..\solutions\vs2005\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
-			AssemblyName="nunit.framework, Version=2.5.0.0, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"
-		/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\cpp-cli-syntax.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/samples/cpp/failures/AssemblyInfo.cpp b/samples/cpp/failures/AssemblyInfo.cpp
new file mode 100644
index 0000000..e64d6ee
--- /dev/null
+++ b/samples/cpp/failures/AssemblyInfo.cpp
@@ -0,0 +1,56 @@
+using namespace System::Reflection;
+using namespace 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:AssemblyTitleAttribute("")];
+[assembly:AssemblyDescriptionAttribute("")];
+[assembly:AssemblyConfigurationAttribute("")];
+[assembly:AssemblyCompanyAttribute("")];
+[assembly:AssemblyProductAttribute("")];
+[assembly:AssemblyCopyrightAttribute("")];
+[assembly:AssemblyTrademarkAttribute("")];
+[assembly:AssemblyCultureAttribute("")];		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the value or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly:AssemblyVersionAttribute("2.2.0.0")];
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//        When specifying the KeyFile, the location of the KeyFile should be
+//        relative to the project directory.
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly:AssemblyDelaySignAttribute(false)];
+[assembly:AssemblyKeyFileAttribute("")];
+[assembly:AssemblyKeyNameAttribute("")];
+
diff --git a/samples/cpp/failures/cpp-cli-failures.build b/samples/cpp/failures/cpp-cli-failures.build
new file mode 100644
index 0000000..55c52a3
--- /dev/null
+++ b/samples/cpp/failures/cpp-cli-failures.build
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<project name="cpp-cli-failures" default="build">
+
+  <include buildfile="../../samples.common"/>
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cpp" />
+    <include name="cppsample.cpp" />
+    <include name="cppsample.h" />
+  </patternset>
+
+  <target name="packagex">
+    <copy todir="${package.samples.dir}/cpp/cpp-cli/failures">
+      <fileset basedir=".">
+        <include name="cpp-cli-failures.vcproj" />
+        <include name="cpp-cli-failures.build" />
+        <include name="AssemblyInfo.cpp" />
+        <include name="cppsample.cpp" />
+        <include name="cppsample.h" />
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/samples/cpp/failures/cpp-cli-failures.vcxproj b/samples/cpp/failures/cpp-cli-failures.vcxproj
new file mode 100644
index 0000000..d3040a9
--- /dev/null
+++ b/samples/cpp/failures/cpp-cli-failures.vcxproj
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{A0987BCD-AFE6-40E4-95A8-ADA7ADB7E97D}</ProjectGuid>
+    <RootNamespace>cpp-failures</RootNamespace>
+    <Keyword>ManagedCProj</Keyword>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <CLRSupport>true</CLRSupport>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <CLRSupport>true</CLRSupport>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
+      <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>false</MinimalRebuild>
+      <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(OutDir)cpp-cli-failures.dll</OutputFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AssemblyDebug>true</AssemblyDebug>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>false</MinimalRebuild>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(OutDir)cpp-cli-failures.dll</OutputFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77">
+      <HintPath>..\..\..\..\solutions\vs2005\NUnitFramework\framework\bin\Debug\nunit.framework.dll</HintPath>
+      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
+      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="AssemblyInfo.cpp" />
+    <ClCompile Include="cppsample.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="cppsample.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/cpp/failures/cppsample.cpp b/samples/cpp/failures/cppsample.cpp
new file mode 100644
index 0000000..b467080
--- /dev/null
+++ b/samples/cpp/failures/cppsample.cpp
@@ -0,0 +1,48 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#include "cppsample.h"
+
+namespace NUnitSamples {
+
+	void SimpleCPPSample::Init() {
+		fValue1 = 2;
+		fValue2 = 3;
+	}
+
+	void SimpleCPPSample::Add() {
+		int result = fValue1 + fValue2;
+		Assert::AreEqual(6,result);
+	}
+
+	void SimpleCPPSample::DivideByZero()
+	{
+		int zero= 0;
+		int result= 8/zero;
+	}
+
+	void SimpleCPPSample::Equals() {
+		Assert::AreEqual(12, 12, "Integer");
+		Assert::AreEqual(12L, 12L, "Long");
+		Assert::AreEqual('a', 'a', "Char");
+
+
+		Assert::AreEqual(12, 13, "Expected Failure (Integer)");
+		Assert::AreEqual(12.0, 11.99, 0.0, "Expected Failure (Double)");
+	}
+
+	void SimpleCPPSample::IgnoredTest()
+	{
+		throw gcnew InvalidCastException();
+	}
+
+	void SimpleCPPSample::ExpectAnException()
+	{
+		throw gcnew InvalidCastException();
+	}
+
+}
+
diff --git a/samples/cpp/failures/cppsample.h b/samples/cpp/failures/cppsample.h
new file mode 100644
index 0000000..9b99517
--- /dev/null
+++ b/samples/cpp/failures/cppsample.h
@@ -0,0 +1,28 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+#pragma once
+
+using namespace System;
+using namespace NUnit::Framework;
+
+namespace NUnitSamples
+{
+	[TestFixture]
+	public ref class SimpleCPPSample
+	{
+		int fValue1;
+		int fValue2;
+	public:
+		[SetUp] void Init();
+
+		[Test] void Add();
+		[Test] void DivideByZero();
+		[Test] void Equals();
+		[Test] [Ignore("ignored test")] void IgnoredTest();
+		[Test] [ExpectedException(InvalidOperationException::typeid)] void ExpectAnException();
+	};
+}
diff --git a/samples/cpp/managed/failures/AssemblyInfo.cpp b/samples/cpp/managed/failures/AssemblyInfo.cpp
deleted file mode 100644
index f935771..0000000
--- a/samples/cpp/managed/failures/AssemblyInfo.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-using namespace System::Reflection;
-using namespace 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:AssemblyTitleAttribute("")];
-[assembly:AssemblyDescriptionAttribute("")];
-[assembly:AssemblyConfigurationAttribute("")];
-[assembly:AssemblyCompanyAttribute("")];
-[assembly:AssemblyProductAttribute("")];
-[assembly:AssemblyCopyrightAttribute("")];
-[assembly:AssemblyTrademarkAttribute("")];
-[assembly:AssemblyCultureAttribute("")];		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the value or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly:AssemblyVersionAttribute("2.2.0.0")];
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//        When specifying the KeyFile, the location of the KeyFile should be
-//        relative to the project directory.
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly:AssemblyDelaySignAttribute(false)];
-[assembly:AssemblyKeyFileAttribute("")];
-[assembly:AssemblyKeyNameAttribute("")];
-
diff --git a/samples/cpp/managed/failures/cpp-managed-failures.build b/samples/cpp/managed/failures/cpp-managed-failures.build
deleted file mode 100644
index 40cf2b9..0000000
--- a/samples/cpp/managed/failures/cpp-managed-failures.build
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<project name="cpp-managed-failures" default="build">
-
-  <include buildfile="../../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cpp" />
-    <include name="cppsample.cpp" />
-    <include name="cppsample.h" />
-  </patternset>
-
-  <target name="packagex">
-    <copy todir="${package.samples.dir}/cpp/managed/failures">
-      <fileset basedir=".">
-        <include name="cpp-managed-failures.build" />
-        <include name="AssemblyInfo.cpp" />
-        <include name="cppsample.cpp" />
-        <include name="cppsample.h" />
-      </fileset>
-    </copy>
-
-    <copy todir="${package.samples.dir}/cpp/managed/failures"
-        file="./cpp-managed-failures.vcproj">
-      <filterchain>
-        <replacestring from="$(SolutionDir)..\..\..\src\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
-          to="..\..\..\..\bin\nunit.framework.dll"/>
-      </filterchain>
-    </copy>
-  </target>
-
-</project>
\ No newline at end of file
diff --git a/samples/cpp/managed/failures/cpp-managed-failures.vcproj b/samples/cpp/managed/failures/cpp-managed-failures.vcproj
deleted file mode 100644
index c978c5f..0000000
--- a/samples/cpp/managed/failures/cpp-managed-failures.vcproj
+++ /dev/null
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="cpp-managed-failures"
-	ProjectGUID="{7E5849C7-0469-4AD2-91B9-C87203934254}"
-	Keyword="ManagedCProj">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="TRUE"
-			ReferencesPath=""D:\Dev\NUnit\nunit-2.5\solutions\vs2005\NUnitFramework\framework\bin\Release"">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalUsingDirectories=""
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				MinimalRebuild="FALSE"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				DebugInformationFormat="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/managed-cpp-failures.dll"
-				LinkIncremental="2"
-				GenerateDebugInformation="TRUE"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="TRUE"
-			ReferencesPath=""D:\Dev\NUnit\nunit-2.5\solutions\vs2005\NUnitFramework\framework\bin\Release"">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Release;..\..\src\NUnitFramework\framework\bin\Debug"
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				MinimalRebuild="FALSE"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/managed-cpp-failures.dll"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath="mscorlib.dll"/>
-		<AssemblyReference
-			RelativePath="$(SolutionDir)..\..\bin\nunit.framework.dll"/>
-		<AssemblyReference
-			RelativePath="System.dll"/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
-			<File
-				RelativePath="AssemblyInfo.cpp">
-			</File>
-			<File
-				RelativePath="cppsample.cpp">
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc">
-			<File
-				RelativePath="cppsample.h">
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r">
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/samples/cpp/managed/failures/cppsample.cpp b/samples/cpp/managed/failures/cppsample.cpp
deleted file mode 100644
index fe368fe..0000000
--- a/samples/cpp/managed/failures/cppsample.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-#include "cppsample.h"
-
-namespace NUnitSamples {
-
-	void SimpleCPPSample::Init() {
-		fValue1 = 2;
-		fValue2 = 3;
-	}
-
-	void SimpleCPPSample::Add() {
-		int result = fValue1 + fValue2;
-		Assert::AreEqual(6,result);
-	}
-
-	void SimpleCPPSample::DivideByZero()
-	{
-		int zero= 0;
-		int result= 8/zero;
-	}
-
-	void SimpleCPPSample::Equals() {
-		Assert::AreEqual(12, 12, "Integer");
-		Assert::AreEqual(12L, 12L, "Long");
-		Assert::AreEqual('a', 'a', "Char");
-
-
-		Assert::AreEqual(12, 13, "Expected Failure (Integer)");
-		Assert::AreEqual(12.0, 11.99, 0.0, "Expected Failure (Double)");
-	}
-
-	void SimpleCPPSample::IgnoredTest()
-	{
-		throw new InvalidCastException();
-	}
-
-	void SimpleCPPSample::ExpectAnException()
-	{
-		throw new InvalidCastException();
-	}
-
-}
-
diff --git a/samples/cpp/managed/failures/cppsample.h b/samples/cpp/managed/failures/cppsample.h
deleted file mode 100644
index 4383db0..0000000
--- a/samples/cpp/managed/failures/cppsample.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-#pragma once
-
-using namespace System;
-using namespace NUnit::Framework;
-
-namespace NUnitSamples
-{
-	[TestFixture]
-	public __gc class SimpleCPPSample
-	{
-		int fValue1;
-		int fValue2;
-	public:
-		[SetUp] void Init();
-
-		[Test] void Add();
-		[Test] void DivideByZero();
-		[Test] void Equals();
-		[Test] [Ignore("ignored test")] void IgnoredTest();
-		[Test] [ExpectedException(__typeof(InvalidOperationException))] void ExpectAnException();
-	};
-}
diff --git a/samples/cpp/managed/managed-cpp.sln b/samples/cpp/managed/managed-cpp.sln
deleted file mode 100644
index 725ab79..0000000
--- a/samples/cpp/managed/managed-cpp.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-managed-failures", "failures\cpp-managed-failures.vcproj", "{7E5849C7-0469-4AD2-91B9-C87203934254}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.ActiveCfg = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.Build.0 = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release.ActiveCfg = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
diff --git a/samples/cpp/syntax/AssemblyInfo.cpp b/samples/cpp/syntax/AssemblyInfo.cpp
new file mode 100644
index 0000000..b18cdfa
--- /dev/null
+++ b/samples/cpp/syntax/AssemblyInfo.cpp
@@ -0,0 +1,40 @@
+#include "stdafx.h"
+
+using namespace System;
+using namespace System::Reflection;
+using namespace System::Runtime::CompilerServices;
+using namespace System::Runtime::InteropServices;
+using namespace System::Security::Permissions;
+
+//
+// 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:AssemblyTitleAttribute("cppclisyntax")];
+[assembly:AssemblyDescriptionAttribute("")];
+[assembly:AssemblyConfigurationAttribute("")];
+[assembly:AssemblyCompanyAttribute("")];
+[assembly:AssemblyProductAttribute("cppclisyntax")];
+[assembly:AssemblyCopyrightAttribute("Copyright (c)  2007")];
+[assembly:AssemblyTrademarkAttribute("")];
+[assembly:AssemblyCultureAttribute("")];
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the value or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly:AssemblyVersionAttribute("1.0.*")];
+
+[assembly:ComVisible(false)];
+
+[assembly:CLSCompliantAttribute(true)];
+
+[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
diff --git a/samples/cpp/syntax/cpp-cli-syntax.build b/samples/cpp/syntax/cpp-cli-syntax.build
new file mode 100644
index 0000000..7a8bcac
--- /dev/null
+++ b/samples/cpp/syntax/cpp-cli-syntax.build
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<project name="cpp-cli-syntax" default="build">
+
+  <include buildfile="../../samples.common"/>
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cpp" />
+    <include name="cpp-cli-syntax.cpp" />
+  </patternset>
+  
+</project>
\ No newline at end of file
diff --git a/samples/cpp/syntax/cpp-cli-syntax.cpp b/samples/cpp/syntax/cpp-cli-syntax.cpp
new file mode 100644
index 0000000..2e6ff5e
--- /dev/null
+++ b/samples/cpp/syntax/cpp-cli-syntax.cpp
@@ -0,0 +1,651 @@
+// ****************************************************************
+// 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 namespace NUnit::Framework;
+using NUnit::Framework::Is;
+using NUnit::Framework::List;
+using NUnit::Framework::Has;
+using System::String;
+
+namespace NUnitSamples
+{
+	[TestFixture]
+	public ref class AssertSyntaxTests : AssertionHelper
+	{
+	public:
+		[Test]
+		void IsNull()
+		{
+			Object ^nada = nullptr;
+
+			// Classic syntax
+			Assert::IsNull(nada);
+
+			// Constraint Syntax
+			Assert::That(nada, Is::Null);
+
+			// Inherited syntax
+			Expect(nada, Null);
+		}
+
+		[Test]
+		void IsNotNull()
+		{
+			// Classic syntax
+			Assert::IsNotNull(42);
+
+			// Constraint Syntax
+			Assert::That(42, Is::Not->Null);
+
+			// Inherited syntax
+			Expect( 42, Not->Null );
+		}
+
+		[Test]
+		void IsTrue()
+		{
+			// Classic syntax
+			Assert::IsTrue(2+2==4);
+
+			// Constraint Syntax
+			Assert::That(2+2==4, Is::True);
+			Assert::That(2+2==4);
+
+			// Inherited syntax
+			Expect(2+2==4, True);
+			Expect(2+2==4);
+		}
+
+		[Test]
+		void IsFalse()
+		{
+			// Classic syntax
+			Assert::IsFalse(2+2==5);
+
+			// Constraint Syntax
+			Assert::That(2+2==5, Is::False);
+			
+			// Inherited syntax
+			Expect(2+2==5, False);
+		}
+
+		[Test]
+		void IsNaN()
+		{
+			double d = double::NaN;
+			float f = float::NaN;
+
+			// Classic syntax
+			Assert::IsNaN(d);
+			Assert::IsNaN(f);
+
+			// Constraint Syntax
+			Assert::That(d, Is::NaN);
+			Assert::That(f, Is::NaN);
+			
+			// Inherited syntax
+			Expect(d, NaN);
+			Expect(f, NaN);
+		}
+
+		[Test]
+		void EmptyStringTests()
+		{
+			// Classic syntax
+			Assert::IsEmpty("");
+			Assert::IsNotEmpty("Hello!");
+
+			// Constraint Syntax
+			Assert::That("", Is::Empty);
+			Assert::That("Hello!", Is::Not->Empty);
+
+			// Inherited syntax
+			Expect("", Empty);
+			Expect("Hello!", Not->Empty);
+		}
+
+		[Test]
+		void EmptyCollectionTests()
+		{
+			// Classic syntax
+			Assert::IsEmpty(gcnew array<bool>(0));
+			Assert::IsNotEmpty(gcnew array<int>(3));
+
+			// Constraint Syntax
+			Assert::That(gcnew array<bool>(0), Is::Empty);
+			Assert::That(gcnew array<int>(3), Is::Not->Empty);
+
+			// Inherited syntax
+			Expect(gcnew array<bool>(0), Empty);
+			Expect(gcnew array<int>(3), Not->Empty);
+		}
+
+		[Test]
+		void ExactTypeTests()
+		{
+			// Classic syntax workarounds)
+			String^ greeting = "Hello";
+			Assert::AreEqual(String::typeid, greeting->GetType());
+			Assert::AreEqual("System.String", greeting->GetType()->FullName);
+			Assert::AreNotEqual(int::typeid, greeting->GetType());
+			Assert::AreNotEqual("System.Int32", greeting->GetType()->FullName);
+
+			// Constraint Syntax
+			Assert::That(greeting, Is::TypeOf(String::typeid));
+			Assert::That(greeting, Is::Not->TypeOf(int::typeid));
+			
+			// Inherited syntax
+			Expect( "Hello", TypeOf(String::typeid));
+			Expect( "Hello", Not->TypeOf(int::typeid));
+		}
+
+		[Test]
+		void InstanceOfTests()
+		{
+			// Classic syntax
+			Assert::IsInstanceOf(String::typeid, "Hello");
+			Assert::IsNotInstanceOf(String::typeid, 5);
+
+			// Constraint Syntax
+			Assert::That("Hello", Is::InstanceOf(String::typeid));
+			Assert::That(5, Is::Not->InstanceOf(String::typeid));
+
+			// Inherited syntax
+			Expect("Hello", InstanceOf(String::typeid));
+			Expect(5, Not->InstanceOf(String::typeid));
+		}
+
+		[Test]
+		void AssignableFromTypeTests()
+		{
+			// Classic syntax
+			Assert::IsAssignableFrom(String::typeid, "Hello");
+			Assert::IsNotAssignableFrom(String::typeid, 5);
+
+			// Constraint Syntax
+			Assert::That( "Hello", Is::AssignableFrom(String::typeid));
+			Assert::That( 5, Is::Not->AssignableFrom(String::typeid));
+			
+			// Inherited syntax
+			Expect( "Hello", AssignableFrom(String::typeid));
+			Expect( 5, Not->AssignableFrom(String::typeid));
+		}
+
+		[Test]
+		void SubstringTests()
+		{
+			String^ phrase = "Hello World!";
+			array<String^>^ strings = {"abc", "bad", "dba" };
+			
+			// Classic Syntax
+			StringAssert::Contains("World", phrase);
+			
+			// Constraint Syntax
+			Assert::That(phrase, Is::StringContaining("World"));
+			// Only available using new syntax
+			Assert::That(phrase, Is::Not->StringContaining("goodbye"));
+			Assert::That(phrase, Is::StringContaining("WORLD")->IgnoreCase);
+			Assert::That(phrase, Is::Not->StringContaining("BYE")->IgnoreCase);
+			Assert::That(strings, Is::All->StringContaining( "b" ) );
+
+			// Inherited syntax
+			Expect(phrase, Contains("World"));
+			// Only available using new syntax
+			Expect(phrase, Not->Contains("goodbye"));
+			Expect(phrase, Contains("WORLD")->IgnoreCase);
+			Expect(phrase, Not->Contains("BYE")->IgnoreCase);
+			Expect(strings, All->Contains("b"));
+		}
+
+		[Test]
+		void StartsWithTests()
+		{
+			String^ phrase = "Hello World!";
+			array<String^>^ greetings = { "Hello!", "Hi!", "Hola!" };
+
+			// Classic syntax
+			StringAssert::StartsWith("Hello", phrase);
+
+			// Constraint Syntax
+			Assert::That(phrase, Is::StringStarting("Hello"));
+			// Only available using new syntax
+			Assert::That(phrase, Is::Not->StringStarting("Hi!"));
+			Assert::That(phrase, Is::StringStarting("HeLLo")->IgnoreCase);
+			Assert::That(phrase, Is::Not->StringStarting("HI")->IgnoreCase);
+			Assert::That(greetings, Is::All->StringStarting("h")->IgnoreCase);
+
+			// Inherited syntax
+			Expect(phrase, StartsWith("Hello"));
+			// Only available using new syntax
+			Expect(phrase, Not->StartsWith("Hi!"));
+			Expect(phrase, StartsWith("HeLLo")->IgnoreCase);
+			Expect(phrase, Not->StartsWith("HI")->IgnoreCase);
+			Expect(greetings, All->StartsWith("h")->IgnoreCase);
+		}
+
+		[Test]
+		void EndsWithTests()
+		{
+			String^ phrase = "Hello World!";
+			array<String^>^ greetings = { "Hello!", "Hi!", "Hola!" };
+
+			// Classic Syntax
+			StringAssert::EndsWith("!", phrase);
+
+			// Constraint Syntax
+			Assert::That(phrase, Is::StringEnding("!"));
+			// Only available using new syntax
+			Assert::That(phrase, Is::Not->StringEnding("?"));
+			Assert::That(phrase, Is::StringEnding("WORLD!")->IgnoreCase);
+			Assert::That(greetings, Is::All->StringEnding("!"));
+		
+			// Inherited syntax
+			Expect(phrase, EndsWith("!"));
+			// Only available using new syntax
+			Expect(phrase, Not->EndsWith("?"));
+			Expect(phrase, EndsWith("WORLD!")->IgnoreCase);
+			Expect(greetings, All->EndsWith("!") );
+		}
+
+		[Test]
+		void EqualIgnoringCaseTests()
+		{
+			String^ phrase = "Hello World!";
+
+			// Classic syntax
+			StringAssert::AreEqualIgnoringCase("hello world!",phrase);
+            
+			// Constraint Syntax
+			Assert::That(phrase, Is::EqualTo("hello world!")->IgnoreCase);
+			//Only available using new syntax
+			Assert::That(phrase, Is::Not->EqualTo("goodbye world!")->IgnoreCase);
+			Assert::That(gcnew array<String^> { "Hello", "World" }, 
+				Is::EqualTo(gcnew array<Object^> { "HELLO", "WORLD" })->IgnoreCase);
+			Assert::That(gcnew array<String^> {"HELLO", "Hello", "hello" },
+				Is::All->EqualTo( "hello" )->IgnoreCase);
+		            
+			// Inherited syntax
+			Expect(phrase, EqualTo("hello world!")->IgnoreCase);
+			//Only available using new syntax
+			Expect(phrase, Not->EqualTo("goodbye world!")->IgnoreCase);
+			Expect(gcnew array<String^> { "Hello", "World" }, 
+				EqualTo(gcnew array<Object^> { "HELLO", "WORLD" })->IgnoreCase);
+			Expect(gcnew array<String^> {"HELLO", "Hello", "hello" },
+				All->EqualTo( "hello" )->IgnoreCase);
+		}
+
+		[Test]
+		void RegularExpressionTests()
+		{
+			String^ phrase = "Now is the time for all good men to come to the aid of their country.";
+			array<String^>^ quotes = { "Never say never", "It's never too late", "Nevermore!" };
+
+			// Classic syntax
+			StringAssert::IsMatch( "all good men", phrase );
+			StringAssert::IsMatch( "Now.*come", phrase );
+
+			// Constraint Syntax
+			Assert::That( phrase, Is::StringMatching( "all good men" ) );
+			Assert::That( phrase, Is::StringMatching( "Now.*come" ) );
+			// Only available using new syntax
+			Assert::That(phrase, Is::Not->StringMatching("all.*men.*good"));
+			Assert::That(phrase, Is::StringMatching("ALL")->IgnoreCase);
+			Assert::That(quotes, Text::All->Matches("never")->IgnoreCase);
+		
+			// Inherited syntax
+			Expect( phrase, Matches( "all good men" ) );
+			Expect( phrase, Matches( "Now.*come" ) );
+			// Only available using new syntax
+			Expect(phrase, Not->Matches("all.*men.*good"));
+			Expect(phrase, Matches("ALL")->IgnoreCase);
+			Expect(quotes, All->Matches("never")->IgnoreCase);
+		}
+
+		[Test]
+		void EqualityTests()
+		{
+			array<int>^ i3 = { 1, 2, 3 };
+			array<double>^ d3 = { 1.0, 2.0, 3.0 };
+			array<int>^ iunequal = { 1, 3, 2 };
+
+			// Classic Syntax
+			Assert::AreEqual(4, 2 + 2);
+			Assert::AreEqual(i3, d3);
+			Assert::AreNotEqual(5, 2 + 2);
+			Assert::AreNotEqual(i3, iunequal);
+
+			// Constraint Syntax
+			Assert::That(2 + 2, Is::EqualTo(4));
+			Assert::That(2 + 2 == 4);
+			Assert::That(i3, Is::EqualTo(d3));
+			Assert::That(2 + 2, Is::Not->EqualTo(5));
+			Assert::That(i3, Is::Not->EqualTo(iunequal));
+		
+			// Inherited syntax
+			Expect(2 + 2, EqualTo(4));
+			Expect(2 + 2 == 4);
+			Expect(i3, EqualTo(d3));
+			Expect(2 + 2, Not->EqualTo(5));
+			Expect(i3, Not->EqualTo(iunequal));
+		}
+
+		[Test]
+		void EqualityTestsWithTolerance()
+		{
+			// CLassic syntax
+			Assert::AreEqual(5.0, 4.99, 0.05);
+			Assert::AreEqual(5.0F, 4.99F, 0.05F);
+
+			// Constraint Syntax
+			Assert::That(4.99L, Is::EqualTo(5.0L)->Within(0.05L));
+			Assert::That(4.99f, Is::EqualTo(5.0f)->Within(0.05f));
+		
+			// Inherited syntax
+			Expect(4.99L, EqualTo(5.0L)->Within(0.05L));
+			Expect(4.99f, EqualTo(5.0f)->Within(0.05f));
+		}
+
+		[Test]
+		void ComparisonTests()
+		{
+			// Classic Syntax
+			Assert::Greater(7, 3);
+			Assert::GreaterOrEqual(7, 3);
+			Assert::GreaterOrEqual(7, 7);
+
+			// Constraint Syntax
+			Assert::That(7, Is::GreaterThan(3));
+			Assert::That(7, Is::GreaterThanOrEqualTo(3));
+			Assert::That(7, Is::AtLeast(3));
+			Assert::That(7, Is::GreaterThanOrEqualTo(7));
+			Assert::That(7, Is::AtLeast(7));
+
+			// Inherited syntax
+			Expect(7, GreaterThan(3));
+			Expect(7, GreaterThanOrEqualTo(3));
+			Expect(7, AtLeast(3));
+			Expect(7, GreaterThanOrEqualTo(7));
+			Expect(7, AtLeast(7));
+
+			// Classic syntax
+			Assert::Less(3, 7);
+			Assert::LessOrEqual(3, 7);
+			Assert::LessOrEqual(3, 3);
+
+			// Constraint Syntax
+			Assert::That(3, Is::LessThan(7));
+			Assert::That(3, Is::LessThanOrEqualTo(7));
+			Assert::That(3, Is::AtMost(7));
+			Assert::That(3, Is::LessThanOrEqualTo(3));
+			Assert::That(3, Is::AtMost(3));
+		
+			// Inherited syntax
+			Expect(3, LessThan(7));
+			Expect(3, LessThanOrEqualTo(7));
+			Expect(3, AtMost(7));
+			Expect(3, LessThanOrEqualTo(3));
+			Expect(3, AtMost(3));
+		}
+
+		[Test]
+		void AllItemsTests()
+		{
+			array<Object^>^ ints = { 1, 2, 3, 4 };
+			array<Object^>^ strings = { "abc", "bad", "cab", "bad", "dad" };
+
+			// Classic syntax
+			CollectionAssert::AllItemsAreNotNull(ints);
+			CollectionAssert::AllItemsAreInstancesOfType(ints, int::typeid);
+			CollectionAssert::AllItemsAreInstancesOfType(strings, String::typeid);
+			CollectionAssert::AllItemsAreUnique(ints);
+
+			// Constraint Syntax
+			Assert::That(ints, Is::All->Not->Null);
+			Assert::That(ints, Is::All->InstanceOf(int::typeid));
+			Assert::That(strings, Is::All->InstanceOf(String::typeid));
+			Assert::That(ints, Is::Unique);
+			// Only available using new syntax
+			Assert::That(strings, Is::Not->Unique);
+			Assert::That(ints, Is::All->GreaterThan(0));
+			Assert::That(strings, Text::All->Contains( "a" ) );
+			Assert::That(strings, Has::Some->StartsWith( "ba" ) );
+		
+			// Inherited syntax
+			Expect(ints, All->Not->Null);
+			Expect(ints, All->InstanceOf(int::typeid));
+			Expect(strings, All->InstanceOf(String::typeid));
+			Expect(ints, Unique);
+			// Only available using new syntax
+			Expect(strings, Not->Unique);
+			Expect(ints, All->GreaterThan(0));
+			Expect(strings, All->Contains( "a" ) );
+			Expect(strings, Some->StartsWith( "ba" ) );
+		}
+
+		[Test]
+		void SomeItemsTests()
+		{
+			array<Object^>^ mixed = { 1, 2, "3", nullptr, "four", 100 };
+			array<Object^>^ strings = { "abc", "bad", "cab", "bad", "dad" };
+
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert::That(mixed, Has::Some->Null);
+			Assert::That(mixed, Has::Some->InstanceOf(int::typeid));
+			Assert::That(mixed, Has::Some->InstanceOf(String::typeid));
+			Assert::That(strings, Has::Some->StartsWith( "ba" ) );
+			Assert::That(strings, Has::Some->Not->StartsWith( "ba" ) );
+		
+			// Inherited syntax
+			Expect(mixed, Some->Null);
+			Expect(mixed, Some->InstanceOf(int::typeid));
+			Expect(mixed, Some->InstanceOf(String::typeid));
+			Expect(strings, Some->StartsWith( "ba" ) );
+			Expect(strings, Some->Not->StartsWith( "ba" ) );
+		}
+
+		[Test]
+		void NoItemsTests()
+		{
+			array<Object^>^ ints = { 1, 2, 3, 4, 5 };
+			array<Object^>^ strings = { "abc", "bad", "cab", "bad", "dad" };
+
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert::That(ints, Has::None->Null);
+			Assert::That(ints, Has::None->InstanceOf(String::typeid));
+			Assert::That(ints, Has::None->GreaterThan(99));
+			Assert::That(strings, Has::None->StartsWith( "qu" ) );
+		
+			// Inherited syntax
+			Expect(ints, None->Null);
+			Expect(ints, None->InstanceOf(String::typeid));
+			Expect(ints, None->GreaterThan(99));
+			Expect(strings, None->StartsWith( "qu" ) );
+		}
+
+		[Test]
+		void CollectionContainsTests()
+		{
+			array<int>^ iarray = { 1, 2, 3 };
+			array<String^>^ sarray = { "a", "b", "c" };
+
+			// Classic syntax
+			Assert::Contains(3, iarray);
+			Assert::Contains("b", sarray);
+			CollectionAssert::Contains(iarray, 3);
+			CollectionAssert::Contains(sarray, "b");
+			CollectionAssert::DoesNotContain(sarray, "x");
+
+			// Constraint Syntax
+			Assert::That(iarray, Has::Member(3));
+			Assert::That(sarray, Has::Member("b"));
+			Assert::That(sarray, Has::No->Member("x")); // Yuck!
+			Assert::That(sarray, !Has::Member("x"));
+		
+			// Inherited syntax
+			Expect(iarray, Contains(3));
+			Expect(sarray, Contains("b"));
+			Expect(sarray, Not->Contains("x"));
+			Expect(sarray, !Contains("x"));
+		}
+
+		[Test]
+		void CollectionEquivalenceTests()
+		{
+			array<int>^ ints1to5 = { 1, 2, 3, 4, 5 };
+
+			// Classic syntax
+			CollectionAssert::AreEquivalent(gcnew array<int> { 2, 1, 4, 3, 5 }, ints1to5);
+			CollectionAssert::AreNotEquivalent(gcnew array<int> { 2, 2, 4, 3, 5 }, ints1to5);
+			CollectionAssert::AreNotEquivalent(gcnew array<int> { 2, 4, 3, 5 }, ints1to5);
+			CollectionAssert::AreNotEquivalent(gcnew array<int> { 2, 2, 1, 1, 4, 3, 5 }, ints1to5);
+		
+			// Constraint Syntax
+			Assert::That(gcnew array<int> { 2, 1, 4, 3, 5 }, Is::EquivalentTo(ints1to5));
+			Assert::That(gcnew array<int> { 2, 2, 4, 3, 5 }, Is::Not->EquivalentTo(ints1to5));
+			Assert::That(gcnew array<int> { 2, 4, 3, 5 }, Is::Not->EquivalentTo(ints1to5));
+			Assert::That(gcnew array<int> { 2, 2, 1, 1, 4, 3, 5 }, Is::Not->EquivalentTo(ints1to5));
+
+			// Inherited syntax
+			Expect(gcnew array<int> { 2, 1, 4, 3, 5 }, EquivalentTo(ints1to5));
+			Expect(gcnew array<int> { 2, 2, 4, 3, 5 }, Not->EquivalentTo(ints1to5));
+			Expect(gcnew array<int> { 2, 4, 3, 5 }, Not->EquivalentTo(ints1to5));
+			Expect(gcnew array<int> { 2, 2, 1, 1, 4, 3, 5 }, Not->EquivalentTo(ints1to5));
+		}
+
+		[Test]
+		void SubsetTests()
+		{
+			array<int>^ ints1to5 = { 1, 2, 3, 4, 5 };
+
+			// Classic syntax
+			CollectionAssert::IsSubsetOf(gcnew array<int> { 1, 3, 5 }, ints1to5);
+			CollectionAssert::IsSubsetOf(gcnew array<int> { 1, 2, 3, 4, 5 }, ints1to5);
+			CollectionAssert::IsNotSubsetOf(gcnew array<int> { 2, 4, 6 }, ints1to5);
+			CollectionAssert::IsNotSubsetOf(gcnew array<int> { 1, 2, 2, 2, 5 }, ints1to5);
+
+			// Constraint Syntax
+			Assert::That(gcnew array<int> { 1, 3, 5 }, Is::SubsetOf(ints1to5));
+			Assert::That(gcnew array<int> { 1, 2, 3, 4, 5 }, Is::SubsetOf(ints1to5));
+			Assert::That(gcnew array<int> { 2, 4, 6 }, Is::Not->SubsetOf(ints1to5));
+			Assert::That(gcnew array<int> { 1, 2, 2, 2, 5 }, Is::Not->SubsetOf(ints1to5));
+		
+			// Inherited syntax
+			Expect(gcnew array<int> { 1, 3, 5 }, SubsetOf(ints1to5));
+			Expect(gcnew array<int> { 1, 2, 3, 4, 5 }, SubsetOf(ints1to5));
+			Expect(gcnew array<int> { 2, 4, 6 }, Not->SubsetOf(ints1to5));
+			Expect(gcnew array<int> { 1, 2, 2, 2, 5 }, Not->SubsetOf(ints1to5));
+		}
+
+		[Test]
+		void PropertyTests()
+		{
+			array<String^>^ strings = { "abc", "bca", "xyz" };
+
+			// Constraint Syntax
+			Assert::That( "Hello", Has::Property("Length")->EqualTo(5) );
+			Assert::That( "Hello", Has::Length->EqualTo( 5 ) );
+			Assert::That( strings , Has::All->Property( "Length")->EqualTo(3) );
+			Assert::That( strings, Has::All->Length->EqualTo( 3 ) );
+
+			// Inherited syntax
+			Expect( "Hello", Property("Length")->EqualTo(5) );
+			Expect( "Hello", Length->EqualTo( 5 ) );
+			Expect( strings, All->Property("Length")->EqualTo(3) );
+			Expect( strings, All->Length->EqualTo( 3 ) );
+		}
+
+		[Test]
+		void NotTests()
+		{
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert::That(42, Is::Not->Null);
+			Assert::That(42, Is::Not->True);
+			Assert::That(42, Is::Not->False);
+			Assert::That(2.5, Is::Not->NaN);
+			Assert::That(2 + 2, Is::Not->EqualTo(3));
+			Assert::That(2 + 2, Is::Not->Not->EqualTo(4));
+			Assert::That(2 + 2, Is::Not->Not->Not->EqualTo(5));
+
+			// Inherited syntax
+			Expect(42, Not->Null);
+			Expect(42, Not->True);
+			Expect(42, Not->False);
+			Expect(2.5, Not->NaN);
+			Expect(2 + 2, Not->EqualTo(3));
+			Expect(2 + 2, Not->Not->EqualTo(4));
+			Expect(2 + 2, Not->Not->Not->EqualTo(5));
+		}
+
+		[Test]
+		void NotOperator()
+		{
+			// The ! operator is only available in the new syntax
+			Assert::That(42, !Is::Null);
+			// Inherited syntax
+			Expect( 42, !Null );
+		}
+
+		[Test]
+		void AndOperator()
+		{
+			// The & operator is only available in the new syntax
+			Assert::That(7, Is::GreaterThan(5) & Is::LessThan(10));
+			// Inherited syntax
+			Expect( 7, GreaterThan(5) & LessThan(10));
+		}
+
+		[Test]
+		void OrOperator()
+		{
+			// The | operator is only available in the new syntax
+			Assert::That(3, Is::LessThan(5) | Is::GreaterThan(10));
+			Expect( 3, LessThan(5) | GreaterThan(10));
+		}
+
+		[Test]
+		void ComplexTests()
+		{
+			Assert::That(7, Is::Not->Null & Is::Not->LessThan(5) & Is::Not->GreaterThan(10));
+			Expect(7, Not->Null & Not->LessThan(5) & Not->GreaterThan(10));
+
+			Assert::That(7, !Is::Null & !Is::LessThan(5) & !Is::GreaterThan(10));
+			Expect(7, !Null & !LessThan(5) & !GreaterThan(10));
+		}
+
+		// This method contains assertions that should not compile
+		// You can check by uncommenting it.
+		//void WillNotCompile()
+		//{
+		//    Assert::That(42, Is::Not);
+		//    Assert::That(42, Is::All);
+		//    Assert::That(42, Is::Null->Not);
+		//    Assert::That(42, Is::Not->Null->GreaterThan(10));
+		//    Assert::That(42, Is::GreaterThan(10)->LessThan(99));
+
+		//    object[] c = new object[0];
+		//    Assert::That(c, Is::Null->All);
+		//    Assert::That(c, Is::Not->All);
+		//    Assert::That(c, Is::All->Not);
+		//}
+
+		[Test]
+		void ThrowsTests()
+		{
+			Assert::Throws(System::ArgumentException::typeid, gcnew TestDelegate(ThrowsArgumentException));
+		}
+
+		static void ThrowsArgumentException()
+		{
+			throw gcnew System::ArgumentException();
+		}
+	};
+}
\ No newline at end of file
diff --git a/samples/cpp/syntax/cpp-cli-syntax.vcxproj b/samples/cpp/syntax/cpp-cli-syntax.vcxproj
new file mode 100644
index 0000000..f51ac10
--- /dev/null
+++ b/samples/cpp/syntax/cpp-cli-syntax.vcxproj
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{72448C2D-17C9-419E-B28D-3B533E7E0CD5}</ProjectGuid>
+    <RootNamespace>cppclisyntax</RootNamespace>
+    <Keyword>ManagedCProj</Keyword>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <CLRSupport>true</CLRSupport>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <CLRSupport>true</CLRSupport>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>
+      </AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AssemblyDebug>true</AssemblyDebug>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>
+      </AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
+      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
+    </Reference>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77">
+      <HintPath>..\..\..\..\solutions\vs2005\NUnitFramework\framework\bin\Debug\nunit.framework.dll</HintPath>
+      <CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
+      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="cpp-cli-syntax.cpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/csharp/CSharp.sln b/samples/csharp/CSharp.sln
index 456b6f0..ad3b7f2 100644
--- a/samples/csharp/CSharp.sln
+++ b/samples/csharp/CSharp.sln
@@ -1,37 +1,31 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-failures", "failures\cs-failures.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-money", "money\cs-money.csproj", "{11EDF872-A04D-4F75-A1BF-71168DC86AF3}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-syntax", "syntax\cs-syntax.csproj", "{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.ActiveCfg = Debug|.NET
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.Build.0 = Debug|.NET
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.ActiveCfg = Release|.NET
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.Build.0 = Release|.NET
-		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug.ActiveCfg = Debug|.NET
-		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug.Build.0 = Debug|.NET
-		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release.ActiveCfg = Release|.NET
-		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release.Build.0 = Release|.NET
-		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Debug.ActiveCfg = Debug|.NET
-		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Debug.Build.0 = Debug|.NET
-		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Release.ActiveCfg = Release|.NET
-		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Release.Build.0 = Release|.NET
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-failures", "failures\cs-failures.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-money", "money\cs-money.csproj", "{11EDF872-A04D-4F75-A1BF-71168DC86AF3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs-syntax", "syntax\cs-syntax.csproj", "{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Any CPU.Build.0 = Release|Any CPU
+		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/samples/csharp/failures/AssemblyInfo.cs b/samples/csharp/failures/AssemblyInfo.cs
index d56266d..67e65b0 100644
--- a/samples/csharp/failures/AssemblyInfo.cs
+++ b/samples/csharp/failures/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-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("csharp.sample.dll")]
-[assembly: AssemblyDescription("C# Sample Unit Tests")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("NUnit")]
-[assembly: AssemblyProduct("NUnit")]
-[assembly: AssemblyCopyright("Copyright (C) 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov. \nCopyright (C) 2000-2003 Philip Craig.\nAll Rights Reserved.")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("2.2.0.0")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+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("csharp.sample.dll")]
+[assembly: AssemblyDescription("C# Sample Unit Tests")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("NUnit")]
+[assembly: AssemblyProduct("NUnit")]
+[assembly: AssemblyCopyright("Copyright (C) 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov. \nCopyright (C) 2000-2003 Philip Craig.\nAll Rights Reserved.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("2.2.0.0")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/samples/csharp/failures/CSharpTest.cs b/samples/csharp/failures/CSharpTest.cs
index 300b11b..d74c70a 100644
--- a/samples/csharp/failures/CSharpTest.cs
+++ b/samples/csharp/failures/CSharpTest.cs
@@ -1,85 +1,85 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples 
-{
-	using System;
-	using NUnit.Framework;
-
-	/// <summary>Some simple Tests.</summary>
-	/// 
-	[TestFixture] 
-	public class SimpleCSharpTest
-	{
-		/// <summary>
-		/// 
-		/// </summary>
-		protected int fValue1;
-		/// <summary>
-		/// 
-		/// </summary>
-		protected int fValue2;
-		
-		/// <summary>
-		/// 
-		/// </summary>
-		[SetUp] public void Init() 
-		{
-			fValue1= 2;
-			fValue2= 3;
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		///
-		[Test] public void Add() 
-		{
-			double result= fValue1 + fValue2;
-			// forced failure result == 5
-			Assert.AreEqual(6, result, "Expected Failure.");
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test] public void DivideByZero() 
-		{
-			int zero= 0;
-			int result= 8/zero;
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test] public void Equals() 
-		{
-			Assert.AreEqual(12, 12, "Integer");
-			Assert.AreEqual(12L, 12L, "Long");
-			Assert.AreEqual('a', 'a', "Char");
-			Assert.AreEqual((object)12, (object)12, "Integer Object Cast");
-            
-			Assert.AreEqual(12, 13, "Expected Failure (Integer)");
-			Assert.AreEqual(12.0, 11.99, 0.0, "Expected Failure (Double).");
-		}
-
-		[Test]
-		[ExpectedException(typeof(InvalidOperationException))]
-		public void ExpectAnException()
-		{
-			throw new InvalidCastException();
-		}
-
-		[Test]
-		[Ignore("ignored test")]
-		public void IgnoredTest()
-		{
-			throw new Exception();
-		}
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Samples 
+{
+	using System;
+	using NUnit.Framework;
+
+	/// <summary>Some simple Tests.</summary>
+	/// 
+	[TestFixture] 
+	public class SimpleCSharpTest
+	{
+		/// <summary>
+		/// 
+		/// </summary>
+		protected int fValue1;
+		/// <summary>
+		/// 
+		/// </summary>
+		protected int fValue2;
+		
+		/// <summary>
+		/// 
+		/// </summary>
+		[SetUp] public void Init() 
+		{
+			fValue1= 2;
+			fValue2= 3;
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		///
+		[Test] public void Add() 
+		{
+			double result= fValue1 + fValue2;
+			// forced failure result == 5
+			Assert.AreEqual(6, result, "Expected Failure.");
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test] public void DivideByZero() 
+		{
+			int zero= 0;
+			int result= 8/zero;
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test] public void Equals() 
+		{
+			Assert.AreEqual(12, 12, "Integer");
+			Assert.AreEqual(12L, 12L, "Long");
+			Assert.AreEqual('a', 'a', "Char");
+			Assert.AreEqual((object)12, (object)12, "Integer Object Cast");
+            
+			Assert.AreEqual(12, 13, "Expected Failure (Integer)");
+			Assert.AreEqual(12.0, 11.99, 0.0, "Expected Failure (Double).");
+		}
+
+		[Test]
+		[ExpectedException(typeof(InvalidOperationException))]
+		public void ExpectAnException()
+		{
+			throw new InvalidCastException();
+		}
+
+		[Test]
+		[Ignore("ignored test")]
+		public void IgnoredTest()
+		{
+			throw new Exception();
+		}
+	}
 }
\ No newline at end of file
diff --git a/samples/csharp/failures/cs-failures.build b/samples/csharp/failures/cs-failures.build
index e104e6a..ea71419 100644
--- a/samples/csharp/failures/cs-failures.build
+++ b/samples/csharp/failures/cs-failures.build
@@ -1,11 +1,11 @@
-<?xml version="1.0"?>
-<project name="cs-failures" default="build">
-
-  <include buildfile="../../samples.common"/>
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cs" />
-    <include name="CSharpTest.cs" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="cs-failures" default="build">
+
+  <include buildfile="../../samples.common"/>
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="CSharpTest.cs" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/csharp/failures/cs-failures.csproj b/samples/csharp/failures/cs-failures.csproj
index 2811109..21f3d1b 100644
--- a/samples/csharp/failures/cs-failures.csproj
+++ b/samples/csharp/failures/cs-failures.csproj
@@ -1,20 +1,122 @@
-<VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{15D66EEE-A852-4A52-89C2-83E74ECF3770}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="cs-failures" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="csharp_sample" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="true" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="CSharpTest.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{15D66EEE-A852-4A52-89C2-83E74ECF3770}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>cs-failures</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>csharp_sample</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CSharpTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/csharp/money/AssemblyInfo.cs b/samples/csharp/money/AssemblyInfo.cs
index 2861f83..72a1771 100644
--- a/samples/csharp/money/AssemblyInfo.cs
+++ b/samples/csharp/money/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("2.2.0.0")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("2.2.0.0")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/samples/csharp/money/IMoney.cs b/samples/csharp/money/IMoney.cs
index d23c703..f1e0fde 100644
--- a/samples/csharp/money/IMoney.cs
+++ b/samples/csharp/money/IMoney.cs
@@ -1,37 +1,36 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-
-	/// <summary>The common interface for simple Monies and MoneyBags.</summary>
-	interface IMoney 
-	{
-
-		/// <summary>Adds a money to this money.</summary>
-		IMoney Add(IMoney m);
-
-		/// <summary>Adds a simple Money to this money. This is a helper method for
-		/// implementing double dispatch.</summary>
-		IMoney AddMoney(Money m);
-
-		/// <summary>Adds a MoneyBag to this money. This is a helper method for
-		/// implementing double dispatch.</summary>
-		IMoney AddMoneyBag(MoneyBag s);
-
-		/// <value>True if this money is zero.</value>
-		bool IsZero { get; }
-
-		/// <summary>Multiplies a money by the given factor.</summary>
-		IMoney Multiply(int factor);
-
-		/// <summary>Negates this money.</summary>
-		IMoney Negate();
-
-		/// <summary>Subtracts a money from this money.</summary>
-		IMoney Subtract(IMoney m);
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Samples.Money
+{
+
+	/// <summary>The common interface for simple Monies and MoneyBags.</summary>
+	interface IMoney 
+	{
+		/// <summary>Adds a money to this money.</summary>
+		IMoney Add(IMoney m);
+
+		/// <summary>Adds a simple Money to this money. This is a helper method for
+		/// implementing double dispatch.</summary>
+		IMoney AddMoney(Money m);
+
+		/// <summary>Adds a MoneyBag to this money. This is a helper method for
+		/// implementing double dispatch.</summary>
+		IMoney AddMoneyBag(MoneyBag s);
+
+		/// <value>True if this money is zero.</value>
+		bool IsZero { get; }
+
+		/// <summary>Multiplies a money by the given factor.</summary>
+		IMoney Multiply(int factor);
+
+		/// <summary>Negates this money.</summary>
+		IMoney Negate();
+
+		/// <summary>Subtracts a money from this money.</summary>
+		IMoney Subtract(IMoney m);
+	}
+}
diff --git a/samples/csharp/money/Money.cs b/samples/csharp/money/Money.cs
index a7b9d3a..a374139 100644
--- a/samples/csharp/money/Money.cs
+++ b/samples/csharp/money/Money.cs
@@ -1,103 +1,103 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-
-	using System;
-	using System.Text;
-
-	/// <summary>A simple Money.</summary>
-	class Money: IMoney 
-	{
-
-		private int fAmount;
-		private String fCurrency;
-        
-		/// <summary>Constructs a money from the given amount and
-		/// currency.</summary>
-		public Money(int amount, String currency) 
-		{
-			fAmount= amount;
-			fCurrency= currency;
-		}
-
-		/// <summary>Adds a money to this money. Forwards the request to
-		/// the AddMoney helper.</summary>
-		public IMoney Add(IMoney m) 
-		{
-			return m.AddMoney(this);
-		}
-
-		public IMoney AddMoney(Money m) 
-		{
-			if (m.Currency.Equals(Currency) )
-				return new Money(Amount+m.Amount, Currency);
-			return new MoneyBag(this, m);
-		}
-
-		public IMoney AddMoneyBag(MoneyBag s) 
-		{
-			return s.AddMoney(this);
-		}
-
-		public int Amount 
-		{
-			get { return fAmount; }
-		}
-
-		public String Currency 
-		{
-			get { return fCurrency; }
-		}
-
-		public override bool Equals(Object anObject) 
-		{
-			if (IsZero)
-				if (anObject is IMoney)
-					return ((IMoney)anObject).IsZero;
-			if (anObject is Money) 
-			{
-				Money aMoney= (Money)anObject;
-				return aMoney.Currency.Equals(Currency)
-					&& Amount == aMoney.Amount;
-			}
-			return false;
-		}
-
-		public override int GetHashCode() 
-		{
-			return fCurrency.GetHashCode()+fAmount;
-		}
-
-		public bool IsZero 
-		{
-			get { return Amount == 0; }
-		}
-
-		public IMoney Multiply(int factor) 
-		{
-			return new Money(Amount*factor, Currency);
-		}
-
-		public IMoney Negate() 
-		{
-			return new Money(-Amount, Currency);
-		}
-
-		public IMoney Subtract(IMoney m) 
-		{
-			return Add(m.Negate());
-		}
-
-		public override String ToString() 
-		{
-			StringBuilder buffer = new StringBuilder();
-			buffer.Append("["+Amount+" "+Currency+"]");
-			return buffer.ToString();
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Samples.Money 
+{
+
+	using System;
+	using System.Text;
+
+	/// <summary>A simple Money.</summary>
+	class Money: IMoney 
+	{
+
+		private int fAmount;
+		private String fCurrency;
+        
+		/// <summary>Constructs a money from the given amount and
+		/// currency.</summary>
+		public Money(int amount, String currency) 
+		{
+			fAmount= amount;
+			fCurrency= currency;
+		}
+
+		/// <summary>Adds a money to this money. Forwards the request to
+		/// the AddMoney helper.</summary>
+		public IMoney Add(IMoney m) 
+		{
+			return m.AddMoney(this);
+		}
+
+		public IMoney AddMoney(Money m) 
+		{
+			if (m.Currency.Equals(Currency) )
+				return new Money(Amount+m.Amount, Currency);
+			return new MoneyBag(this, m);
+		}
+
+		public IMoney AddMoneyBag(MoneyBag s) 
+		{
+			return s.AddMoney(this);
+		}
+
+		public int Amount 
+		{
+			get { return fAmount; }
+		}
+
+		public String Currency 
+		{
+			get { return fCurrency; }
+		}
+
+		public override bool Equals(Object anObject) 
+		{
+			if (IsZero)
+				if (anObject is IMoney)
+					return ((IMoney)anObject).IsZero;
+			if (anObject is Money) 
+			{
+				Money aMoney= (Money)anObject;
+				return aMoney.Currency.Equals(Currency)
+					&& Amount == aMoney.Amount;
+			}
+			return false;
+		}
+
+		public override int GetHashCode() 
+		{
+			return fCurrency.GetHashCode()+fAmount;
+		}
+
+		public bool IsZero 
+		{
+			get { return Amount == 0; }
+		}
+
+		public IMoney Multiply(int factor) 
+		{
+			return new Money(Amount*factor, Currency);
+		}
+
+		public IMoney Negate() 
+		{
+			return new Money(-Amount, Currency);
+		}
+
+		public IMoney Subtract(IMoney m) 
+		{
+			return Add(m.Negate());
+		}
+
+		public override String ToString() 
+		{
+			StringBuilder buffer = new StringBuilder();
+			buffer.Append("["+Amount+" "+Currency+"]");
+			return buffer.ToString();
+		}
+	}
+}
diff --git a/samples/csharp/money/MoneyBag.cs b/samples/csharp/money/MoneyBag.cs
index 2276733..5ea79fe 100644
--- a/samples/csharp/money/MoneyBag.cs
+++ b/samples/csharp/money/MoneyBag.cs
@@ -1,174 +1,174 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-
-	using System;
-	using System.Collections;
-	using System.Text;
-
-	/// <summary>A MoneyBag defers exchange rate conversions.</summary>
-	/// <remarks>For example adding 
-	/// 12 Swiss Francs to 14 US Dollars is represented as a bag 
-	/// containing the two Monies 12 CHF and 14 USD. Adding another
-	/// 10 Swiss francs gives a bag with 22 CHF and 14 USD. Due to 
-	/// the deferred exchange rate conversion we can later value a 
-	/// MoneyBag with different exchange rates.
-	///
-	/// A MoneyBag is represented as a list of Monies and provides 
-	/// different constructors to create a MoneyBag.</remarks>
-	class MoneyBag: IMoney 
-	{
-		private ArrayList fMonies= new ArrayList(5);
-
-		private MoneyBag() 
-		{
-		}
-		public MoneyBag(Money[] bag) 
-		{
-			for (int i= 0; i < bag.Length; i++) 
-			{
-				if (!bag[i].IsZero)
-					AppendMoney(bag[i]);
-			}
-		}
-		public MoneyBag(Money m1, Money m2) 
-		{
-			AppendMoney(m1);
-			AppendMoney(m2);
-		}
-		public MoneyBag(Money m, MoneyBag bag) 
-		{
-			AppendMoney(m);
-			AppendBag(bag);
-		}
-		public MoneyBag(MoneyBag m1, MoneyBag m2) 
-		{
-			AppendBag(m1);
-			AppendBag(m2);
-		}
-		public IMoney Add(IMoney m) 
-		{
-			return m.AddMoneyBag(this);
-		}
-		public IMoney AddMoney(Money m) 
-		{
-			return (new MoneyBag(m, this)).Simplify();
-		}
-		public IMoney AddMoneyBag(MoneyBag s) 
-		{
-			return (new MoneyBag(s, this)).Simplify();
-		}
-		private void AppendBag(MoneyBag aBag) 
-		{
-			foreach (Money m in aBag.fMonies)
-				AppendMoney(m);
-		}
-		private void AppendMoney(Money aMoney) 
-		{
-			IMoney old= FindMoney(aMoney.Currency);
-			if (old == null) 
-			{
-				fMonies.Add(aMoney);
-				return;
-			}
-			fMonies.Remove(old);
-			IMoney sum= old.Add(aMoney);
-			if (sum.IsZero) 
-				return;
-			fMonies.Add(sum);
-		}
-		private bool Contains(Money aMoney) 
-		{
-			Money m= FindMoney(aMoney.Currency);
-			return m.Amount == aMoney.Amount;
-		}
-		public override bool Equals(Object anObject) 
-		{
-			if (IsZero)
-				if (anObject is IMoney)
-					return ((IMoney)anObject).IsZero;
-            
-			if (anObject is MoneyBag) 
-			{
-				MoneyBag aMoneyBag= (MoneyBag)anObject;
-				if (aMoneyBag.fMonies.Count != fMonies.Count)
-					return false;
-                
-				foreach (Money m in fMonies) 
-				{
-					if (!aMoneyBag.Contains(m))
-						return false;
-				}
-				return true;
-			}
-			return false;
-		}
-		private Money FindMoney(String currency) 
-		{
-			foreach (Money m in fMonies) 
-			{
-				if (m.Currency.Equals(currency))
-					return m;
-			}
-			return null;
-		}
-		public override int GetHashCode() 
-		{
-			int hash= 0;
-			foreach (Money m in fMonies) 
-			{
-				hash^= m.GetHashCode();
-			}
-			return hash;
-		}
-		public bool IsZero 
-		{
-			get { return fMonies.Count == 0; }
-		}
-		public IMoney Multiply(int factor) 
-		{
-			MoneyBag result= new MoneyBag();
-			if (factor != 0) 
-			{
-				foreach (Money m in fMonies) 
-				{
-					result.AppendMoney((Money)m.Multiply(factor));
-				}
-			}
-			return result;
-		}
-		public IMoney Negate() 
-		{
-			MoneyBag result= new MoneyBag();
-			foreach (Money m in fMonies) 
-			{
-				result.AppendMoney((Money)m.Negate());
-			}
-			return result;
-		}
-		private IMoney Simplify() 
-		{
-			if (fMonies.Count == 1)
-				return (IMoney)fMonies[0];
-			return this;
-		}
-		public IMoney Subtract(IMoney m) 
-		{
-			return Add(m.Negate());
-		}
-		public override String ToString() 
-		{
-			StringBuilder buffer = new StringBuilder();
-			buffer.Append("{");
-			foreach (Money m in fMonies)
-				buffer.Append(m);
-			buffer.Append("}");
-			return buffer.ToString();
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Samples.Money 
+{
+
+	using System;
+	using System.Collections;
+	using System.Text;
+
+	/// <summary>A MoneyBag defers exchange rate conversions.</summary>
+	/// <remarks>For example adding 
+	/// 12 Swiss Francs to 14 US Dollars is represented as a bag 
+	/// containing the two Monies 12 CHF and 14 USD. Adding another
+	/// 10 Swiss francs gives a bag with 22 CHF and 14 USD. Due to 
+	/// the deferred exchange rate conversion we can later value a 
+	/// MoneyBag with different exchange rates.
+	///
+	/// A MoneyBag is represented as a list of Monies and provides 
+	/// different constructors to create a MoneyBag.</remarks>
+	class MoneyBag: IMoney 
+	{
+		private ArrayList fMonies= new ArrayList(5);
+
+		private MoneyBag() 
+		{
+		}
+		public MoneyBag(Money[] bag) 
+		{
+			for (int i= 0; i < bag.Length; i++) 
+			{
+				if (!bag[i].IsZero)
+					AppendMoney(bag[i]);
+			}
+		}
+		public MoneyBag(Money m1, Money m2) 
+		{
+			AppendMoney(m1);
+			AppendMoney(m2);
+		}
+		public MoneyBag(Money m, MoneyBag bag) 
+		{
+			AppendMoney(m);
+			AppendBag(bag);
+		}
+		public MoneyBag(MoneyBag m1, MoneyBag m2) 
+		{
+			AppendBag(m1);
+			AppendBag(m2);
+		}
+		public IMoney Add(IMoney m) 
+		{
+			return m.AddMoneyBag(this);
+		}
+		public IMoney AddMoney(Money m) 
+		{
+			return (new MoneyBag(m, this)).Simplify();
+		}
+		public IMoney AddMoneyBag(MoneyBag s) 
+		{
+			return (new MoneyBag(s, this)).Simplify();
+		}
+		private void AppendBag(MoneyBag aBag) 
+		{
+			foreach (Money m in aBag.fMonies)
+				AppendMoney(m);
+		}
+		private void AppendMoney(Money aMoney) 
+		{
+			IMoney old= FindMoney(aMoney.Currency);
+			if (old == null) 
+			{
+				fMonies.Add(aMoney);
+				return;
+			}
+			fMonies.Remove(old);
+			IMoney sum= old.Add(aMoney);
+			if (sum.IsZero) 
+				return;
+			fMonies.Add(sum);
+		}
+		private bool Contains(Money aMoney) 
+		{
+			Money m= FindMoney(aMoney.Currency);
+			return m.Amount == aMoney.Amount;
+		}
+		public override bool Equals(Object anObject) 
+		{
+			if (IsZero)
+				if (anObject is IMoney)
+					return ((IMoney)anObject).IsZero;
+            
+			if (anObject is MoneyBag) 
+			{
+				MoneyBag aMoneyBag= (MoneyBag)anObject;
+				if (aMoneyBag.fMonies.Count != fMonies.Count)
+					return false;
+                
+				foreach (Money m in fMonies) 
+				{
+					if (!aMoneyBag.Contains(m))
+						return false;
+				}
+				return true;
+			}
+			return false;
+		}
+		private Money FindMoney(String currency) 
+		{
+			foreach (Money m in fMonies) 
+			{
+				if (m.Currency.Equals(currency))
+					return m;
+			}
+			return null;
+		}
+		public override int GetHashCode() 
+		{
+			int hash= 0;
+			foreach (Money m in fMonies) 
+			{
+				hash^= m.GetHashCode();
+			}
+			return hash;
+		}
+		public bool IsZero 
+		{
+			get { return fMonies.Count == 0; }
+		}
+		public IMoney Multiply(int factor) 
+		{
+			MoneyBag result= new MoneyBag();
+			if (factor != 0) 
+			{
+				foreach (Money m in fMonies) 
+				{
+					result.AppendMoney((Money)m.Multiply(factor));
+				}
+			}
+			return result;
+		}
+		public IMoney Negate() 
+		{
+			MoneyBag result= new MoneyBag();
+			foreach (Money m in fMonies) 
+			{
+				result.AppendMoney((Money)m.Negate());
+			}
+			return result;
+		}
+		private IMoney Simplify() 
+		{
+			if (fMonies.Count == 1)
+				return (IMoney)fMonies[0];
+			return this;
+		}
+		public IMoney Subtract(IMoney m) 
+		{
+			return Add(m.Negate());
+		}
+		public override String ToString() 
+		{
+			StringBuilder buffer = new StringBuilder();
+			buffer.Append("{");
+			foreach (Money m in fMonies)
+				buffer.Append(m);
+			buffer.Append("}");
+			return buffer.ToString();
+		}
+	}
+}
diff --git a/samples/csharp/money/MoneyTest.cs b/samples/csharp/money/MoneyTest.cs
index 8c8511c..c421a7b 100644
--- a/samples/csharp/money/MoneyTest.cs
+++ b/samples/csharp/money/MoneyTest.cs
@@ -1,321 +1,321 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-namespace NUnit.Samples.Money 
-{
-	using System;
-	using NUnit.Framework;
-	/// <summary>
-	/// 
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class MoneyTest 
-	{
-		private Money f12CHF;
-		private Money f14CHF;
-		private Money f7USD;
-		private Money f21USD;
-        
-		private MoneyBag fMB1;
-		private MoneyBag fMB2;
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[SetUp]
-		protected void SetUp() 
-		{
-			f12CHF= new Money(12, "CHF");
-			f14CHF= new Money(14, "CHF");
-			f7USD= new Money( 7, "USD");
-			f21USD= new Money(21, "USD");
-
-			fMB1= new MoneyBag(f12CHF, f7USD);
-			fMB2= new MoneyBag(f14CHF, f21USD);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void BagMultiply() 
-		{
-			// {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
-			Money[] bag = { new Money(24, "CHF"), new Money(14, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, fMB1.Multiply(2));
-			Assert.AreEqual(fMB1, fMB1.Multiply(1));
-			Assert.IsTrue(fMB1.Multiply(0).IsZero);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void BagNegate() 
-		{
-			// {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
-			Money[] bag= { new Money(-12, "CHF"), new Money(-7, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, fMB1.Negate());
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void BagSimpleAdd() 
-		{
-			// {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]}
-			Money[] bag= { new Money(26, "CHF"), new Money(7, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, fMB1.Add(f14CHF));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void BagSubtract() 
-		{
-			// {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
-			Money[] bag= { new Money(-2, "CHF"), new Money(-14, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, fMB1.Subtract(fMB2));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void BagSumAdd() 
-		{
-			// {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
-			Money[] bag= { new Money(26, "CHF"), new Money(28, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, fMB1.Add(fMB2));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void IsZero() 
-		{
-			Assert.IsTrue(fMB1.Subtract(fMB1).IsZero);
-
-			Money[] bag = { new Money(0, "CHF"), new Money(0, "USD") };
-			Assert.IsTrue(new MoneyBag(bag).IsZero);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void MixedSimpleAdd() 
-		{
-			// [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
-			Money[] bag= { f12CHF, f7USD };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, f12CHF.Add(f7USD));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void MoneyBagEquals() 
-		{
-			//NOTE: Normally we use Assert.AreEqual to test whether two
-			// objects are equal. But here we are testing the MoneyBag.Equals()
-			// method itself, so using AreEqual would not serve the purpose.
-			Assert.IsFalse(fMB1.Equals(null)); 
-
-			Assert.IsTrue(fMB1.Equals( fMB1 ));
-			MoneyBag equal= new MoneyBag(new Money(12, "CHF"), new Money(7, "USD"));
-			Assert.IsTrue(fMB1.Equals(equal));
-			Assert.IsTrue(!fMB1.Equals(f12CHF));
-			Assert.IsTrue(!f12CHF.Equals(fMB1));
-			Assert.IsTrue(!fMB1.Equals(fMB2));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void MoneyBagHash() 
-		{
-			MoneyBag equal= new MoneyBag(new Money(12, "CHF"), new Money(7, "USD"));
-			Assert.AreEqual(fMB1.GetHashCode(), equal.GetHashCode());
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void MoneyEquals() 
-		{
-			//NOTE: Normally we use Assert.AreEqual to test whether two
-			// objects are equal. But here we are testing the MoneyBag.Equals()
-			// method itself, so using AreEqual would not serve the purpose.
-			Assert.IsFalse(f12CHF.Equals(null)); 
-			Money equalMoney= new Money(12, "CHF");
-			Assert.IsTrue(f12CHF.Equals( f12CHF ));
-			Assert.IsTrue(f12CHF.Equals( equalMoney ));
-			Assert.IsFalse(f12CHF.Equals(f14CHF));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void MoneyHash() 
-		{
-			Assert.IsFalse(f12CHF.Equals(null)); 
-			Money equal= new Money(12, "CHF");
-			Assert.AreEqual(f12CHF.GetHashCode(), equal.GetHashCode());
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void Normalize() 
-		{
-			Money[] bag= { new Money(26, "CHF"), new Money(28, "CHF"), new Money(6, "CHF") };
-			MoneyBag moneyBag= new MoneyBag(bag);
-			Money[] expected = { new Money(60, "CHF") };
-			// note: expected is still a MoneyBag
-			MoneyBag expectedBag= new MoneyBag(expected);
-			Assert.AreEqual(expectedBag, moneyBag);
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void Normalize2() 
-		{
-			// {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
-			Money expected= new Money(7, "USD");
-			Assert.AreEqual(expected, fMB1.Subtract(f12CHF));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void Normalize3() 
-		{
-			// {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
-			Money[] s1 = { new Money(12, "CHF"), new Money(3, "USD") };
-			MoneyBag ms1= new MoneyBag(s1);
-			Money expected= new Money(4, "USD");
-			Assert.AreEqual(expected, fMB1.Subtract(ms1));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void Normalize4() 
-		{
-			// [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
-			Money[] s1 = { new Money(12, "CHF"), new Money(3, "USD") };
-			MoneyBag ms1= new MoneyBag(s1);
-			Money expected= new Money(-3, "USD");
-			Assert.AreEqual(expected, f12CHF.Subtract(ms1));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void Print() 
-		{
-			Assert.AreEqual("[12 CHF]", f12CHF.ToString());
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void SimpleAdd() 
-		{
-			// [12 CHF] + [14 CHF] == [26 CHF]
-			Money expected= new Money(26, "CHF");
-			Assert.AreEqual(expected, f12CHF.Add(f14CHF));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void SimpleBagAdd() 
-		{
-			// [14 CHF] + {[12 CHF][7 USD]} == {[26 CHF][7 USD]}
-			Money[] bag= { new Money(26, "CHF"), new Money(7, "USD") };
-			MoneyBag expected= new MoneyBag(bag);
-			Assert.AreEqual(expected, f14CHF.Add(fMB1));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void SimpleMultiply() 
-		{
-			// [14 CHF] *2 == [28 CHF]
-			Money expected= new Money(28, "CHF");
-			Assert.AreEqual(expected, f14CHF.Multiply(2));
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void SimpleNegate() 
-		{
-			// [14 CHF] negate == [-14 CHF]
-			Money expected= new Money(-14, "CHF");
-			Assert.AreEqual(expected, f14CHF.Negate());
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// 
-		[Test]
-		public void SimpleSubtract() 
-		{
-			// [14 CHF] - [12 CHF] == [2 CHF]
-			Money expected= new Money(2, "CHF");
-			Assert.AreEqual(expected, f14CHF.Subtract(f12CHF));
-		}
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Samples.Money 
+{
+	using System;
+	using NUnit.Framework;
+	/// <summary>
+	/// 
+	/// </summary>
+	/// 
+	[TestFixture]
+	public class MoneyTest 
+	{
+		private Money f12CHF;
+		private Money f14CHF;
+		private Money f7USD;
+		private Money f21USD;
+        
+		private MoneyBag fMB1;
+		private MoneyBag fMB2;
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[SetUp]
+		protected void SetUp() 
+		{
+			f12CHF= new Money(12, "CHF");
+			f14CHF= new Money(14, "CHF");
+			f7USD= new Money( 7, "USD");
+			f21USD= new Money(21, "USD");
+
+			fMB1= new MoneyBag(f12CHF, f7USD);
+			fMB2= new MoneyBag(f14CHF, f21USD);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void BagMultiply() 
+		{
+			// {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
+			Money[] bag = { new Money(24, "CHF"), new Money(14, "USD") };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, fMB1.Multiply(2));
+			Assert.AreEqual(fMB1, fMB1.Multiply(1));
+			Assert.IsTrue(fMB1.Multiply(0).IsZero);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void BagNegate() 
+		{
+			// {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
+			Money[] bag= { new Money(-12, "CHF"), new Money(-7, "USD") };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, fMB1.Negate());
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void BagSimpleAdd() 
+		{
+			// {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]}
+			Money[] bag= { new Money(26, "CHF"), new Money(7, "USD") };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, fMB1.Add(f14CHF));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void BagSubtract() 
+		{
+			// {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
+			Money[] bag= { new Money(-2, "CHF"), new Money(-14, "USD") };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, fMB1.Subtract(fMB2));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void BagSumAdd() 
+		{
+			// {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
+			Money[] bag= { new Money(26, "CHF"), new Money(28, "USD") };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, fMB1.Add(fMB2));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void IsZero() 
+		{
+			Assert.IsTrue(fMB1.Subtract(fMB1).IsZero);
+
+			Money[] bag = { new Money(0, "CHF"), new Money(0, "USD") };
+			Assert.IsTrue(new MoneyBag(bag).IsZero);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void MixedSimpleAdd() 
+		{
+			// [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
+			Money[] bag= { f12CHF, f7USD };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, f12CHF.Add(f7USD));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void MoneyBagEquals() 
+		{
+			//NOTE: Normally we use Assert.AreEqual to test whether two
+			// objects are equal. But here we are testing the MoneyBag.Equals()
+			// method itself, so using AreEqual would not serve the purpose.
+			Assert.IsFalse(fMB1.Equals(null)); 
+
+			Assert.IsTrue(fMB1.Equals( fMB1 ));
+			MoneyBag equal= new MoneyBag(new Money(12, "CHF"), new Money(7, "USD"));
+			Assert.IsTrue(fMB1.Equals(equal));
+			Assert.IsTrue(!fMB1.Equals(f12CHF));
+			Assert.IsTrue(!f12CHF.Equals(fMB1));
+			Assert.IsTrue(!fMB1.Equals(fMB2));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void MoneyBagHash() 
+		{
+			MoneyBag equal= new MoneyBag(new Money(12, "CHF"), new Money(7, "USD"));
+			Assert.AreEqual(fMB1.GetHashCode(), equal.GetHashCode());
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void MoneyEquals() 
+		{
+			//NOTE: Normally we use Assert.AreEqual to test whether two
+			// objects are equal. But here we are testing the MoneyBag.Equals()
+			// method itself, so using AreEqual would not serve the purpose.
+			Assert.IsFalse(f12CHF.Equals(null)); 
+			Money equalMoney= new Money(12, "CHF");
+			Assert.IsTrue(f12CHF.Equals( f12CHF ));
+			Assert.IsTrue(f12CHF.Equals( equalMoney ));
+			Assert.IsFalse(f12CHF.Equals(f14CHF));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void MoneyHash() 
+		{
+			Assert.IsFalse(f12CHF.Equals(null)); 
+			Money equal= new Money(12, "CHF");
+			Assert.AreEqual(f12CHF.GetHashCode(), equal.GetHashCode());
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void Normalize() 
+		{
+			Money[] bag= { new Money(26, "CHF"), new Money(28, "CHF"), new Money(6, "CHF") };
+			MoneyBag moneyBag= new MoneyBag(bag);
+			Money[] expected = { new Money(60, "CHF") };
+			// note: expected is still a MoneyBag
+			MoneyBag expectedBag= new MoneyBag(expected);
+			Assert.AreEqual(expectedBag, moneyBag);
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void Normalize2() 
+		{
+			// {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
+			Money expected= new Money(7, "USD");
+			Assert.AreEqual(expected, fMB1.Subtract(f12CHF));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void Normalize3() 
+		{
+			// {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
+			Money[] s1 = { new Money(12, "CHF"), new Money(3, "USD") };
+			MoneyBag ms1= new MoneyBag(s1);
+			Money expected= new Money(4, "USD");
+			Assert.AreEqual(expected, fMB1.Subtract(ms1));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void Normalize4() 
+		{
+			// [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
+			Money[] s1 = { new Money(12, "CHF"), new Money(3, "USD") };
+			MoneyBag ms1= new MoneyBag(s1);
+			Money expected= new Money(-3, "USD");
+			Assert.AreEqual(expected, f12CHF.Subtract(ms1));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void Print() 
+		{
+			Assert.AreEqual("[12 CHF]", f12CHF.ToString());
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void SimpleAdd() 
+		{
+			// [12 CHF] + [14 CHF] == [26 CHF]
+			Money expected= new Money(26, "CHF");
+			Assert.AreEqual(expected, f12CHF.Add(f14CHF));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void SimpleBagAdd() 
+		{
+			// [14 CHF] + {[12 CHF][7 USD]} == {[26 CHF][7 USD]}
+			Money[] bag= { new Money(26, "CHF"), new Money(7, "USD") };
+			MoneyBag expected= new MoneyBag(bag);
+			Assert.AreEqual(expected, f14CHF.Add(fMB1));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void SimpleMultiply() 
+		{
+			// [14 CHF] *2 == [28 CHF]
+			Money expected= new Money(28, "CHF");
+			Assert.AreEqual(expected, f14CHF.Multiply(2));
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void SimpleNegate() 
+		{
+			// [14 CHF] negate == [-14 CHF]
+			Money expected= new Money(-14, "CHF");
+			Assert.AreEqual(expected, f14CHF.Negate());
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// 
+		[Test]
+		public void SimpleSubtract() 
+		{
+			// [14 CHF] - [12 CHF] == [2 CHF]
+			Money expected= new Money(2, "CHF");
+			Assert.AreEqual(expected, f14CHF.Subtract(f12CHF));
+		}
+	}
 }
\ No newline at end of file
diff --git a/samples/csharp/money/cs-money.build b/samples/csharp/money/cs-money.build
index b6993eb..917d973 100644
--- a/samples/csharp/money/cs-money.build
+++ b/samples/csharp/money/cs-money.build
@@ -1,14 +1,14 @@
-<?xml version="1.0"?>
-<project name="cs-money" default="build">
-
-  <include buildfile="../../samples.common" />
-  
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cs" />
-    <include name="IMoney.cs" />
-    <include name="Money.cs" />
-    <include name="MoneyBag.cs" />
-    <include name="MoneyTest.cs" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="cs-money" default="build">
+
+  <include buildfile="../../samples.common" />
+  
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="IMoney.cs" />
+    <include name="Money.cs" />
+    <include name="MoneyBag.cs" />
+    <include name="MoneyTest.cs" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/csharp/money/cs-money.csproj b/samples/csharp/money/cs-money.csproj
index 84e76ae..78eea6b 100644
--- a/samples/csharp/money/cs-money.csproj
+++ b/samples/csharp/money/cs-money.csproj
@@ -1,23 +1,131 @@
-<VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{11EDF872-A04D-4F75-A1BF-71168DC86AF3}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="cs-money" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="money" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="true" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="IMoney.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="Money.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MoneyBag.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MoneyTest.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{11EDF872-A04D-4F75-A1BF-71168DC86AF3}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>cs-money</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>money</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="IMoney.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Money.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MoneyBag.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MoneyTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/csharp/syntax/AssemblyInfo.cs b/samples/csharp/syntax/AssemblyInfo.cs
index 177a4f0..9f89a32 100644
--- a/samples/csharp/syntax/AssemblyInfo.cs
+++ b/samples/csharp/syntax/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-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("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/samples/csharp/syntax/AssertSyntaxTests.cs b/samples/csharp/syntax/AssertSyntaxTests.cs
index 7978c87..c04964a 100644
--- a/samples/csharp/syntax/AssertSyntaxTests.cs
+++ b/samples/csharp/syntax/AssertSyntaxTests.cs
@@ -1,828 +1,828 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// This test fixture attempts to exercise all the syntactic
-	/// variations of Assert without getting into failures, errors 
-	/// or corner cases. Thus, some of the tests may be duplicated 
-	/// in other fixtures.
-	/// 
-	/// Each test performs the same operations using the classic
-	/// syntax (if available) and the new syntax in both the
-	/// helper-based and inherited forms.
-	/// 
-	/// This Fixture will eventually be duplicated in other
-	/// supported languages. 
-	/// </summary>
-	[TestFixture]
-	public class AssertSyntaxTests : AssertionHelper
-	{
-		#region Simple Constraint Tests
-		[Test]
-		public void IsNull()
-		{
-			object nada = null;
-
-			// Classic syntax
-			Assert.IsNull(nada);
-
-			// Helper syntax
-			Assert.That(nada, Is.Null);
-
-			// Inherited syntax
-			Expect(nada, Null);
-		}
-
-		[Test]
-		public void IsNotNull()
-		{
-			// Classic syntax
-			Assert.IsNotNull(42);
-
-			// Helper syntax
-			Assert.That(42, Is.Not.Null);
-
-			// Inherited syntax
-			Expect( 42, Not.Null );
-		}
-
-		[Test]
-		public void IsTrue()
-		{
-			// Classic syntax
-			Assert.IsTrue(2+2==4);
-
-			// Helper syntax
-			Assert.That(2+2==4, Is.True);
-			Assert.That(2+2==4);
-
-			// Inherited syntax
-			Expect(2+2==4, True);
-			Expect(2+2==4);
-		}
-
-		[Test]
-		public void IsFalse()
-		{
-			// Classic syntax
-			Assert.IsFalse(2+2==5);
-
-			// Helper syntax
-			Assert.That(2+2== 5, Is.False);
-			
-			// Inherited syntax
-			Expect(2+2==5, False);
-		}
-
-		[Test]
-		public void IsNaN()
-		{
-			double d = double.NaN;
-			float f = float.NaN;
-
-			// Classic syntax
-			Assert.IsNaN(d);
-			Assert.IsNaN(f);
-
-			// Helper syntax
-			Assert.That(d, Is.NaN);
-			Assert.That(f, Is.NaN);
-			
-			// Inherited syntax
-			Expect(d, NaN);
-			Expect(f, NaN);
-		}
-
-		[Test]
-		public void EmptyStringTests()
-		{
-			// Classic syntax
-			Assert.IsEmpty("");
-			Assert.IsNotEmpty("Hello!");
-
-			// Helper syntax
-			Assert.That("", Is.Empty);
-			Assert.That("Hello!", Is.Not.Empty);
-
-			// Inherited syntax
-			Expect("", Empty);
-			Expect("Hello!", Not.Empty);
-		}
-
-		[Test]
-		public void EmptyCollectionTests()
-		{
-			// Classic syntax
-			Assert.IsEmpty(new bool[0]);
-			Assert.IsNotEmpty(new int[] { 1, 2, 3 });
-
-			// Helper syntax
-			Assert.That(new bool[0], Is.Empty);
-			Assert.That(new int[] { 1, 2, 3 }, Is.Not.Empty);
-
-			// Inherited syntax
-			Expect(new bool[0], Empty);
-			Expect(new int[] { 1, 2, 3 }, Not.Empty);
-		}
-		#endregion
-
-		#region TypeConstraint Tests
-		[Test]
-		public void ExactTypeTests()
-		{
-			// Classic syntax workarounds
-			Assert.AreEqual(typeof(string), "Hello".GetType());
-			Assert.AreEqual("System.String", "Hello".GetType().FullName);
-			Assert.AreNotEqual(typeof(int), "Hello".GetType());
-			Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName);
-
-			// Helper syntax
-			Assert.That("Hello", Is.TypeOf(typeof(string)));
-			Assert.That("Hello", Is.Not.TypeOf(typeof(int)));
-			
-			// Inherited syntax
-			Expect( "Hello", TypeOf(typeof(string)));
-			Expect( "Hello", Not.TypeOf(typeof(int)));
-		}
-
-		[Test]
-		public void InstanceOfTypeTests()
-		{
-			// Classic syntax
-			Assert.IsInstanceOf(typeof(string), "Hello");
-			Assert.IsNotInstanceOf(typeof(string), 5);
-
-			// Helper syntax
-			Assert.That("Hello", Is.InstanceOf(typeof(string)));
-			Assert.That(5, Is.Not.InstanceOf(typeof(string)));
-
-			// Inherited syntax
-			Expect("Hello", InstanceOf(typeof(string)));
-			Expect(5, Not.InstanceOf(typeof(string)));
-		}
-
-		[Test]
-		public void AssignableFromTypeTests()
-		{
-			// Classic syntax
-			Assert.IsAssignableFrom(typeof(string), "Hello");
-			Assert.IsNotAssignableFrom(typeof(string), 5);
-
-			// Helper syntax
-			Assert.That( "Hello", Is.AssignableFrom(typeof(string)));
-			Assert.That( 5, Is.Not.AssignableFrom(typeof(string)));
-			
-			// Inherited syntax
-			Expect( "Hello", AssignableFrom(typeof(string)));
-			Expect( 5, Not.AssignableFrom(typeof(string)));
-		}
-		#endregion
-
-		#region StringConstraint Tests
-		[Test]
-		public void SubstringTests()
-		{
-			string phrase = "Hello World!";
-			string[] array = new string[] { "abc", "bad", "dba" };
-			
-			// Classic Syntax
-			StringAssert.Contains("World", phrase);
-			
-			// Helper syntax
-			Assert.That(phrase, Text.Contains("World"));
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotContain("goodbye"));
-			Assert.That(phrase, Text.Contains("WORLD").IgnoreCase);
-			Assert.That(phrase, Text.DoesNotContain("BYE").IgnoreCase);
-			Assert.That(array, Text.All.Contains( "b" ) );
-
-			// Inherited syntax
-			Expect(phrase, Contains("World"));
-			// Only available using new syntax
-			Expect(phrase, Not.Contains("goodbye"));
-			Expect(phrase, Contains("WORLD").IgnoreCase);
-			Expect(phrase, Not.Contains("BYE").IgnoreCase);
-			Expect(array, All.Contains("b"));
-		}
-
-		[Test]
-		public void StartsWithTests()
-		{
-			string phrase = "Hello World!";
-			string[] greetings = new string[] { "Hello!", "Hi!", "Hola!" };
-
-			// Classic syntax
-			StringAssert.StartsWith("Hello", phrase);
-
-			// Helper syntax
-			Assert.That(phrase, Text.StartsWith("Hello"));
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotStartWith("Hi!"));
-			Assert.That(phrase, Text.StartsWith("HeLLo").IgnoreCase);
-			Assert.That(phrase, Text.DoesNotStartWith("HI").IgnoreCase);
-			Assert.That(greetings, Text.All.StartsWith("h").IgnoreCase);
-
-			// Inherited syntax
-			Expect(phrase, StartsWith("Hello"));
-			// Only available using new syntax
-			Expect(phrase, Not.StartsWith("Hi!"));
-			Expect(phrase, StartsWith("HeLLo").IgnoreCase);
-			Expect(phrase, Not.StartsWith("HI").IgnoreCase);
-			Expect(greetings, All.StartsWith("h").IgnoreCase);
-		}
-
-		[Test]
-		public void EndsWithTests()
-		{
-			string phrase = "Hello World!";
-			string[] greetings = new string[] { "Hello!", "Hi!", "Hola!" };
-
-			// Classic Syntax
-			StringAssert.EndsWith("!", phrase);
-
-			// Helper syntax
-			Assert.That(phrase, Text.EndsWith("!"));
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotEndWith("?"));
-			Assert.That(phrase, Text.EndsWith("WORLD!").IgnoreCase);
-			Assert.That(greetings, Text.All.EndsWith("!"));
-		
-			// Inherited syntax
-			Expect(phrase, EndsWith("!"));
-			// Only available using new syntax
-			Expect(phrase, Not.EndsWith("?"));
-			Expect(phrase, EndsWith("WORLD!").IgnoreCase);
-			Expect(greetings, All.EndsWith("!") );
-		}
-
-		[Test]
-		public void EqualIgnoringCaseTests()
-		{
-			string phrase = "Hello World!";
-
-			// Classic syntax
-			StringAssert.AreEqualIgnoringCase("hello world!",phrase);
-            
-			// Helper syntax
-			Assert.That(phrase, Is.EqualTo("hello world!").IgnoreCase);
-			//Only available using new syntax
-			Assert.That(phrase, Is.Not.EqualTo("goodbye world!").IgnoreCase);
-			Assert.That(new string[] { "Hello", "World" }, 
-				Is.EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
-			Assert.That(new string[] {"HELLO", "Hello", "hello" },
-				Is.All.EqualTo( "hello" ).IgnoreCase);
-		            
-			// Inherited syntax
-			Expect(phrase, EqualTo("hello world!").IgnoreCase);
-			//Only available using new syntax
-			Expect(phrase, Not.EqualTo("goodbye world!").IgnoreCase);
-			Expect(new string[] { "Hello", "World" }, 
-				EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
-			Expect(new string[] {"HELLO", "Hello", "hello" },
-				All.EqualTo( "hello" ).IgnoreCase);
-		}
-
-		[Test]
-		public void RegularExpressionTests()
-		{
-			string phrase = "Now is the time for all good men to come to the aid of their country.";
-			string[] quotes = new string[] { "Never say never", "It's never too late", "Nevermore!" };
-
-			// Classic syntax
-			StringAssert.IsMatch( "all good men", phrase );
-			StringAssert.IsMatch( "Now.*come", phrase );
-
-			// Helper syntax
-			Assert.That( phrase, Text.Matches( "all good men" ) );
-			Assert.That( phrase, Text.Matches( "Now.*come" ) );
-			// Only available using new syntax
-			Assert.That(phrase, Text.DoesNotMatch("all.*men.*good"));
-			Assert.That(phrase, Text.Matches("ALL").IgnoreCase);
-			Assert.That(quotes, Text.All.Matches("never").IgnoreCase);
-		
-			// Inherited syntax
-			Expect( phrase, Matches( "all good men" ) );
-			Expect( phrase, Matches( "Now.*come" ) );
-			// Only available using new syntax
-			Expect(phrase, Not.Matches("all.*men.*good"));
-			Expect(phrase, Matches("ALL").IgnoreCase);
-			Expect(quotes, All.Matches("never").IgnoreCase);
-		}
-		#endregion
-
-		#region Equality Tests
-		[Test]
-		public void EqualityTests()
-		{
-			int[] i3 = new int[] { 1, 2, 3 };
-			double[] d3 = new double[] { 1.0, 2.0, 3.0 };
-			int[] iunequal = new int[] { 1, 3, 2 };
-
-			// Classic Syntax
-			Assert.AreEqual(4, 2 + 2);
-			Assert.AreEqual(i3, d3);
-			Assert.AreNotEqual(5, 2 + 2);
-			Assert.AreNotEqual(i3, iunequal);
-
-			// Helper syntax
-			Assert.That(2 + 2, Is.EqualTo(4));
-			Assert.That(2 + 2 == 4);
-			Assert.That(i3, Is.EqualTo(d3));
-			Assert.That(2 + 2, Is.Not.EqualTo(5));
-			Assert.That(i3, Is.Not.EqualTo(iunequal));
-		
-			// Inherited syntax
-			Expect(2 + 2, EqualTo(4));
-			Expect(2 + 2 == 4);
-			Expect(i3, EqualTo(d3));
-			Expect(2 + 2, Not.EqualTo(5));
-			Expect(i3, Not.EqualTo(iunequal));
-		}
-
-		[Test]
-		public void EqualityTestsWithTolerance()
-		{
-			// CLassic syntax
-			Assert.AreEqual(5.0d, 4.99d, 0.05d);
-			Assert.AreEqual(5.0f, 4.99f, 0.05f);
-
-			// Helper syntax
-			Assert.That(4.99d, Is.EqualTo(5.0d).Within(0.05d));
-			Assert.That(4.0d, Is.Not.EqualTo(5.0d).Within(0.5d));
-			Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f));
-			Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m));
-			Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u));
-			Assert.That(499, Is.EqualTo(500).Within(5));
-			Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L));
-			Assert.That(5999999999ul, Is.EqualTo(6000000000ul).Within(5ul));
-		
-			// Inherited syntax
-			Expect(4.99d, EqualTo(5.0d).Within(0.05d));
-			Expect(4.0d, Not.EqualTo(5.0d).Within(0.5d));
-			Expect(4.99f, EqualTo(5.0f).Within(0.05f));
-			Expect(4.99m, EqualTo(5.0m).Within(0.05m));
-			Expect(499u, EqualTo(500u).Within(5u));
-			Expect(499, EqualTo(500).Within(5));
-			Expect(4999999999L, EqualTo(5000000000L).Within(5L));
-			Expect(5999999999ul, EqualTo(6000000000ul).Within(5ul));
-		}
-
-		[Test]
-		public void EqualityTestsWithTolerance_MixedFloatAndDouble()
-		{
-			// Bug Fix 1743844
-			Assert.That(2.20492d, Is.EqualTo(2.2d).Within(0.01f),
-				"Double actual, Double expected, Single tolerance");
-			Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01d),
-				"Double actual, Single expected, Double tolerance" );
-			Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01f),
-				"Double actual, Single expected, Single tolerance" );
-			Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01d),
-				"Single actual, Single expected, Double tolerance");
-			Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01d),
-				"Single actual, Double expected, Double tolerance");
-			Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01f),
-				"Single actual, Double expected, Single tolerance");
-		}
-
-		[Test]
-			public void EqualityTestsWithTolerance_MixingTypesGenerally()
-		{
-			// Extending tolerance to all numeric types
-			Assert.That(202d, Is.EqualTo(200d).Within(2),
-				"Double actual, Double expected, int tolerance");
-			Assert.That( 4.87m, Is.EqualTo(5).Within(.25),
-				"Decimal actual, int expected, Double tolerance" );
-			Assert.That( 4.87m, Is.EqualTo(5ul).Within(1),
-				"Decimal actual, ulong expected, int tolerance" );
-			Assert.That( 487, Is.EqualTo(500).Within(25),
-				"int actual, int expected, int tolerance" );
-			Assert.That( 487u, Is.EqualTo(500).Within(25),
-				"uint actual, int expected, int tolerance" );
-			Assert.That( 487L, Is.EqualTo(500).Within(25),
-				"long actual, int expected, int tolerance" );
-			Assert.That( 487ul, Is.EqualTo(500).Within(25),
-				"ulong actual, int expected, int tolerance" );
-		}
-		#endregion
-
-		#region Comparison Tests
-		[Test]
-		public void ComparisonTests()
-		{
-			// Classic Syntax
-			Assert.Greater(7, 3);
-			Assert.GreaterOrEqual(7, 3);
-			Assert.GreaterOrEqual(7, 7);
-
-			// Helper syntax
-			Assert.That(7, Is.GreaterThan(3));
-			Assert.That(7, Is.GreaterThanOrEqualTo(3));
-			Assert.That(7, Is.AtLeast(3));
-			Assert.That(7, Is.GreaterThanOrEqualTo(7));
-			Assert.That(7, Is.AtLeast(7));
-
-			// Inherited syntax
-			Expect(7, GreaterThan(3));
-			Expect(7, GreaterThanOrEqualTo(3));
-			Expect(7, AtLeast(3));
-			Expect(7, GreaterThanOrEqualTo(7));
-			Expect(7, AtLeast(7));
-
-			// Classic syntax
-			Assert.Less(3, 7);
-			Assert.LessOrEqual(3, 7);
-			Assert.LessOrEqual(3, 3);
-
-			// Helper syntax
-			Assert.That(3, Is.LessThan(7));
-			Assert.That(3, Is.LessThanOrEqualTo(7));
-			Assert.That(3, Is.AtMost(7));
-			Assert.That(3, Is.LessThanOrEqualTo(3));
-			Assert.That(3, Is.AtMost(3));
-		
-			// Inherited syntax
-			Expect(3, LessThan(7));
-			Expect(3, LessThanOrEqualTo(7));
-			Expect(3, AtMost(7));
-			Expect(3, LessThanOrEqualTo(3));
-			Expect(3, AtMost(3));
-		}
-		#endregion
-
-		#region Collection Tests
-		[Test]
-		public void AllItemsTests()
-		{
-			object[] ints = new object[] { 1, 2, 3, 4 };
-			object[] doubles = new object[] { 0.99, 2.1, 3.0, 4.05 };
-			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
-
-			// Classic syntax
-			CollectionAssert.AllItemsAreNotNull(ints);
-			CollectionAssert.AllItemsAreInstancesOfType(ints, typeof(int));
-			CollectionAssert.AllItemsAreInstancesOfType(strings, typeof(string));
-			CollectionAssert.AllItemsAreUnique(ints);
-
-			// Helper syntax
-			Assert.That(ints, Is.All.Not.Null);
-			Assert.That(ints, Has.None.Null);
-			Assert.That(ints, Is.All.InstanceOfType(typeof(int)));
-			Assert.That(ints, Has.All.InstanceOfType(typeof(int)));
-			Assert.That(strings, Is.All.InstanceOfType(typeof(string)));
-			Assert.That(strings, Has.All.InstanceOfType(typeof(string)));
-			Assert.That(ints, Is.Unique);
-			// Only available using new syntax
-			Assert.That(strings, Is.Not.Unique);
-			Assert.That(ints, Is.All.GreaterThan(0));
-			Assert.That(ints, Has.All.GreaterThan(0));
-			Assert.That(ints, Has.None.LessThanOrEqualTo(0));
-			Assert.That(strings, Text.All.Contains( "a" ) );
-			Assert.That(strings, Has.All.Contains( "a" ) );
-			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
-			Assert.That( strings, Has.Some.Property( "Length" ).EqualTo( 3 ) );
-			Assert.That( strings, Has.Some.StartsWith( "BA" ).IgnoreCase );
-			Assert.That( doubles, Has.Some.EqualTo( 1.0 ).Within( .05 ) );
-		
-			// Inherited syntax
-			Expect(ints, All.Not.Null);
-			Expect(ints, None.Null);
-			Expect(ints, All.InstanceOfType(typeof(int)));
-			Expect(strings, All.InstanceOfType(typeof(string)));
-			Expect(ints, Unique);
-			// Only available using new syntax
-			Expect(strings, Not.Unique);
-			Expect(ints, All.GreaterThan(0));
-			Expect(ints, None.LessThanOrEqualTo(0));
-			Expect(strings, All.Contains( "a" ) );
-			Expect(strings, Some.StartsWith( "ba" ) );
-			Expect(strings, Some.StartsWith( "BA" ).IgnoreCase );
-			Expect(doubles, Some.EqualTo( 1.0 ).Within( .05 ) );
-		}
-
-		[Test]
-		public void SomeItemTests()
-		{
-			object[] mixed = new object[] { 1, 2, "3", null, "four", 100 };
-			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That(mixed, Has.Some.Null);
-			Assert.That(mixed, Has.Some.InstanceOfType(typeof(int)));
-			Assert.That(mixed, Has.Some.InstanceOfType(typeof(string)));
-			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
-			Assert.That(strings, Has.Some.Not.StartsWith( "ba" ) );
-		
-			// Inherited syntax
-			Expect(mixed, Some.Null);
-			Expect(mixed, Some.InstanceOfType(typeof(int)));
-			Expect(mixed, Some.InstanceOfType(typeof(string)));
-			Expect(strings, Some.StartsWith( "ba" ) );
-			Expect(strings, Some.Not.StartsWith( "ba" ) );
-		}
-
-		[Test]
-		public void NoItemTests()
-		{
-			object[] ints = new object[] { 1, 2, 3, 4, 5 };
-			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That(ints, Has.None.Null);
-			Assert.That(ints, Has.None.InstanceOfType(typeof(string)));
-			Assert.That(ints, Has.None.GreaterThan(99));
-			Assert.That(strings, Has.None.StartsWith( "qu" ) );
-		
-			// Inherited syntax
-			Expect(ints, None.Null);
-			Expect(ints, None.InstanceOfType(typeof(string)));
-			Expect(ints, None.GreaterThan(99));
-			Expect(strings, None.StartsWith( "qu" ) );
-		}
-
-		[Test]
-		public void CollectionContainsTests()
-		{
-			int[] iarray = new int[] { 1, 2, 3 };
-			string[] sarray = new string[] { "a", "b", "c" };
-
-			// Classic syntax
-			Assert.Contains(3, iarray);
-			Assert.Contains("b", sarray);
-			CollectionAssert.Contains(iarray, 3);
-			CollectionAssert.Contains(sarray, "b");
-			CollectionAssert.DoesNotContain(sarray, "x");
-			// Showing that Contains uses NUnit equality
-			CollectionAssert.Contains( iarray, 1.0d );
-
-			// Helper syntax
-			Assert.That(iarray, Has.Member(3));
-			Assert.That(sarray, Has.Member("b"));
-			Assert.That(sarray, Has.No.Member("x"));
-			// Showing that Contains uses NUnit equality
-			Assert.That(iarray, Has.Member( 1.0d ));
-
-			// Only available using the new syntax
-			// Note that EqualTo and SameAs do NOT give
-			// identical results to Contains because 
-			// Contains uses Object.Equals()
-			Assert.That(iarray, Has.Some.EqualTo(3));
-			Assert.That(iarray, Has.Member(3));
-			Assert.That(sarray, Has.Some.EqualTo("b"));
-			Assert.That(sarray, Has.None.EqualTo("x"));
-			Assert.That(iarray, Has.None.SameAs( 1.0d ));
-			Assert.That(iarray, Has.All.LessThan(10));
-			Assert.That(sarray, Has.All.Length.EqualTo(1));
-			Assert.That(sarray, Has.None.Property("Length").GreaterThan(3));
-		
-			// Inherited syntax
-			Expect(iarray, Contains(3));
-			Expect(sarray, Contains("b"));
-			Expect(sarray, Not.Contains("x"));
-
-			// Only available using new syntax
-			// Note that EqualTo and SameAs do NOT give
-			// identical results to Contains because 
-			// Contains uses Object.Equals()
-			Expect(iarray, Some.EqualTo(3));
-			Expect(sarray, Some.EqualTo("b"));
-			Expect(sarray, None.EqualTo("x"));
-			Expect(iarray, All.LessThan(10));
-			Expect(sarray, All.Length.EqualTo(1));
-			Expect(sarray, None.Property("Length").GreaterThan(3));
-		}
-
-		[Test]
-		public void CollectionEquivalenceTests()
-		{
-			int[] ints1to5 = new int[] { 1, 2, 3, 4, 5 };
-			int[] twothrees = new int[] { 1, 2, 3, 3, 4, 5 };
-			int[] twofours = new int[] { 1, 2, 3, 4, 4, 5 };
-
-		    // Classic syntax
-		    CollectionAssert.AreEquivalent(new int[] { 2, 1, 4, 3, 5 }, ints1to5);
-			CollectionAssert.AreNotEquivalent(new int[] { 2, 2, 4, 3, 5 }, ints1to5);
-			CollectionAssert.AreNotEquivalent(new int[] { 2, 4, 3, 5 }, ints1to5);
-			CollectionAssert.AreNotEquivalent(new int[] { 2, 2, 1, 1, 4, 3, 5 }, ints1to5);
-            CollectionAssert.AreNotEquivalent(twothrees, twofours); 
-		
-			// Helper syntax
-			Assert.That(new int[] { 2, 1, 4, 3, 5 }, Is.EquivalentTo(ints1to5));
-			Assert.That(new int[] { 2, 2, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
-			Assert.That(new int[] { 2, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
-			Assert.That(new int[] { 2, 2, 1, 1, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
-
-			// Inherited syntax
-			Expect(new int[] { 2, 1, 4, 3, 5 }, EquivalentTo(ints1to5));
-			Expect(new int[] { 2, 2, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
-			Expect(new int[] { 2, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
-			Expect(new int[] { 2, 2, 1, 1, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
-		}
-
-		[Test]
-		public void SubsetTests()
-		{
-			int[] ints1to5 = new int[] { 1, 2, 3, 4, 5 };
-
-			// Classic syntax
-			CollectionAssert.IsSubsetOf(new int[] { 1, 3, 5 }, ints1to5);
-			CollectionAssert.IsSubsetOf(new int[] { 1, 2, 3, 4, 5 }, ints1to5);
-			CollectionAssert.IsNotSubsetOf(new int[] { 2, 4, 6 }, ints1to5);
-			CollectionAssert.IsNotSubsetOf(new int[] { 1, 2, 2, 2, 5 }, ints1to5);
-
-			// Helper syntax
-			Assert.That(new int[] { 1, 3, 5 }, Is.SubsetOf(ints1to5));
-			Assert.That(new int[] { 1, 2, 3, 4, 5 }, Is.SubsetOf(ints1to5));
-			Assert.That(new int[] { 2, 4, 6 }, Is.Not.SubsetOf(ints1to5));
-		
-			// Inherited syntax
-			Expect(new int[] { 1, 3, 5 }, SubsetOf(ints1to5));
-			Expect(new int[] { 1, 2, 3, 4, 5 }, SubsetOf(ints1to5));
-			Expect(new int[] { 2, 4, 6 }, Not.SubsetOf(ints1to5));
-		}
-		#endregion
-
-		#region Property Tests
-		[Test]
-		public void PropertyTests()
-		{
-			string[] array = { "abc", "bca", "xyz", "qrs" };
-			string[] array2 = { "a", "ab", "abc" };
-			ArrayList list = new ArrayList( array );
-
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That( list, Has.Property( "Count" ) );
-			Assert.That( list, Has.No.Property( "Length" ) );
-
-			Assert.That( "Hello", Has.Length.EqualTo( 5 ) );
-			Assert.That( "Hello", Has.Length.LessThan( 10 ) );
-			Assert.That( "Hello", Has.Property("Length").EqualTo(5) );
-			Assert.That( "Hello", Has.Property("Length").GreaterThan(3) );
-
-			Assert.That( array, Has.Property( "Length" ).EqualTo( 4 ) );
-			Assert.That( array, Has.Length.EqualTo( 4 ) );
-			Assert.That( array, Has.Property( "Length" ).LessThan( 10 ) );
-
-			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
-			Assert.That( array, Has.All.Length.EqualTo( 3 ) );
-			Assert.That( array, Is.All.Length.EqualTo( 3 ) );
-			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
-			Assert.That( array, Is.All.Property("Length").EqualTo(3) );
-			
-			Assert.That( array2, Has.Some.Property("Length").EqualTo(2) );
-			Assert.That( array2, Has.Some.Length.EqualTo(2) );
-			Assert.That( array2, Has.Some.Property("Length").GreaterThan(2) );
-
-			Assert.That( array2, Is.Not.Property("Length").EqualTo(4) );
-			Assert.That( array2, Is.Not.Length.EqualTo( 4 ) );
-			Assert.That( array2, Has.No.Property("Length").GreaterThan(3) );
-
-			Assert.That( List.Map( array2 ).Property("Length"), Is.EqualTo( new int[] { 1, 2, 3 } ) );
-			Assert.That( List.Map( array2 ).Property("Length"), Is.EquivalentTo( new int[] { 3, 2, 1 } ) );
-			Assert.That( List.Map( array2 ).Property("Length"), Is.SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
-			Assert.That( List.Map( array2 ).Property("Length"), Is.Unique );
-
-			Assert.That( list, Has.Count.EqualTo( 4 ) );
-			
-			// Inherited syntax
-			Expect( list, Property( "Count" ) );
-			Expect( list, Not.Property( "Nada" ) );
-
-			Expect( "Hello", Length.EqualTo( 5 ) );
-			Expect( "Hello", Property("Length").EqualTo(5) );
-			Expect( "Hello", Property("Length").GreaterThan(0) );
-
-			Expect( array, Property("Length").EqualTo(4) );
-			Expect( array, Length.EqualTo(4) );
-			Expect( array, Property("Length").LessThan(10));
-
-			Expect( array, All.Length.EqualTo( 3 ) );
-			Expect( array, All.Property("Length").EqualTo(3));
-
-			Expect( array2, Some.Property("Length").EqualTo(2) );
-			Expect( array2, Some.Length.EqualTo( 2 ) );
-			Expect( array2, Some.Property("Length").GreaterThan(2));
-
-			Expect( array2, None.Property("Length").EqualTo(4) );
-			Expect( array2, None.Length.EqualTo( 4 ) );
-			Expect( array2, None.Property("Length").GreaterThan(3));
-
-			Expect( Map( array2 ).Property("Length"), EqualTo( new int[] { 1, 2, 3 } ) );
-			Expect( Map( array2 ).Property("Length"), EquivalentTo( new int[] { 3, 2, 1 } ) );
-			Expect( Map( array2 ).Property("Length"), SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
-			Expect( Map( array2 ).Property("Length"), Unique );
-
-			Expect( list, Count.EqualTo( 4 ) );
-
-		}
-		#endregion
-
-		#region Not Tests
-		[Test]
-		public void NotTests()
-		{
-			// Not available using the classic syntax
-
-			// Helper syntax
-			Assert.That(42, Is.Not.Null);
-			Assert.That(42, Is.Not.True);
-			Assert.That(42, Is.Not.False);
-			Assert.That(2.5, Is.Not.NaN);
-			Assert.That(2 + 2, Is.Not.EqualTo(3));
-			Assert.That(2 + 2, Is.Not.Not.EqualTo(4));
-			Assert.That(2 + 2, Is.Not.Not.Not.EqualTo(5));
-
-			// Inherited syntax
-			Expect(42, Not.Null);
-			Expect(42, Not.True);
-			Expect(42, Not.False);
-			Expect(2.5, Not.NaN);
-			Expect(2 + 2, Not.EqualTo(3));
-			Expect(2 + 2, Not.Not.EqualTo(4));
-			Expect(2 + 2, Not.Not.Not.EqualTo(5));
-		}
-		#endregion
-
-		#region Operator Tests
-		[Test]
-		public void NotOperator()
-		{
-			// The ! operator is only available in the new syntax
-			Assert.That(42, !Is.Null);
-			// Inherited syntax
-			Expect( 42, !Null );
-		}
-
-		[Test]
-		public void AndOperator()
-		{
-			// The & operator is only available in the new syntax
-			Assert.That(7, Is.GreaterThan(5) & Is.LessThan(10));
-			// Inherited syntax
-			Expect( 7, GreaterThan(5) & LessThan(10));
-		}
-
-		[Test]
-		public void OrOperator()
-		{
-			// The | operator is only available in the new syntax
-			Assert.That(3, Is.LessThan(5) | Is.GreaterThan(10));
-			Expect( 3, LessThan(5) | GreaterThan(10));
-		}
-
-		[Test]
-		public void ComplexTests()
-		{
-			Assert.That(7, Is.Not.Null & Is.Not.LessThan(5) & Is.Not.GreaterThan(10));
-			Expect(7, Not.Null & Not.LessThan(5) & Not.GreaterThan(10));
-
-			Assert.That(7, !Is.Null & !Is.LessThan(5) & !Is.GreaterThan(10));
-			Expect(7, !Null & !LessThan(5) & !GreaterThan(10));
-
-			// TODO: Remove #if when mono compiler can handle null
-#if MONO
-            Constraint x = null;
-            Assert.That(7, !x & !Is.LessThan(5) & !Is.GreaterThan(10));
-			Expect(7, !x & !LessThan(5) & !GreaterThan(10));
-#else
-			Assert.That(7, !(Constraint)null & !Is.LessThan(5) & !Is.GreaterThan(10));
-			Expect(7, !(Constraint)null & !LessThan(5) & !GreaterThan(10));
-#endif
-		}
-		#endregion
- 
-		#region Invalid Code Tests
-		// This method contains assertions that should not compile
-		// You can check by uncommenting it.
-		//public void WillNotCompile()
-		//{
-		//    Assert.That(42, Is.Not);
-		//    Assert.That(42, Is.All);
-		//    Assert.That(42, Is.Null.Not);
-		//    Assert.That(42, Is.Not.Null.GreaterThan(10));
-		//    Assert.That(42, Is.GreaterThan(10).LessThan(99));
-
-		//    object[] c = new object[0];
-		//    Assert.That(c, Is.Null.All);
-		//    Assert.That(c, Is.Not.All);
-		//    Assert.That(c, Is.All.Not);
-		//}
-		#endregion
-	}
-
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// This test fixture attempts to exercise all the syntactic
+	/// variations of Assert without getting into failures, errors 
+	/// or corner cases. Thus, some of the tests may be duplicated 
+	/// in other fixtures.
+	/// 
+	/// Each test performs the same operations using the classic
+	/// syntax (if available) and the new syntax in both the
+	/// helper-based and inherited forms.
+	/// 
+	/// This Fixture will eventually be duplicated in other
+	/// supported languages. 
+	/// </summary>
+	[TestFixture]
+	public class AssertSyntaxTests : AssertionHelper
+	{
+		#region Simple Constraint Tests
+		[Test]
+		public void IsNull()
+		{
+			object nada = null;
+
+			// Classic syntax
+			Assert.IsNull(nada);
+
+			// Constraint Syntax
+			Assert.That(nada, Is.Null);
+
+			// Inherited syntax
+			Expect(nada, Null);
+		}
+
+		[Test]
+		public void IsNotNull()
+		{
+			// Classic syntax
+			Assert.IsNotNull(42);
+
+			// Constraint Syntax
+			Assert.That(42, Is.Not.Null);
+
+			// Inherited syntax
+			Expect( 42, Not.Null );
+		}
+
+		[Test]
+		public void IsTrue()
+		{
+			// Classic syntax
+			Assert.IsTrue(2+2==4);
+
+			// Constraint Syntax
+			Assert.That(2+2==4, Is.True);
+			Assert.That(2+2==4);
+
+			// Inherited syntax
+			Expect(2+2==4, True);
+			Expect(2+2==4);
+		}
+
+		[Test]
+		public void IsFalse()
+		{
+			// Classic syntax
+			Assert.IsFalse(2+2==5);
+
+			// Constraint Syntax
+			Assert.That(2+2== 5, Is.False);
+			
+			// Inherited syntax
+			Expect(2+2==5, False);
+		}
+
+		[Test]
+		public void IsNaN()
+		{
+			double d = double.NaN;
+			float f = float.NaN;
+
+			// Classic syntax
+			Assert.IsNaN(d);
+			Assert.IsNaN(f);
+
+			// Constraint Syntax
+			Assert.That(d, Is.NaN);
+			Assert.That(f, Is.NaN);
+			
+			// Inherited syntax
+			Expect(d, NaN);
+			Expect(f, NaN);
+		}
+
+		[Test]
+		public void EmptyStringTests()
+		{
+			// Classic syntax
+			Assert.IsEmpty("");
+			Assert.IsNotEmpty("Hello!");
+
+			// Constraint Syntax
+			Assert.That("", Is.Empty);
+			Assert.That("Hello!", Is.Not.Empty);
+
+			// Inherited syntax
+			Expect("", Empty);
+			Expect("Hello!", Not.Empty);
+		}
+
+		[Test]
+		public void EmptyCollectionTests()
+		{
+			// Classic syntax
+			Assert.IsEmpty(new bool[0]);
+			Assert.IsNotEmpty(new int[] { 1, 2, 3 });
+
+			// Constraint Syntax
+			Assert.That(new bool[0], Is.Empty);
+			Assert.That(new int[] { 1, 2, 3 }, Is.Not.Empty);
+
+			// Inherited syntax
+			Expect(new bool[0], Empty);
+			Expect(new int[] { 1, 2, 3 }, Not.Empty);
+		}
+		#endregion
+
+		#region TypeConstraint Tests
+		[Test]
+		public void ExactTypeTests()
+		{
+			// Classic syntax workarounds
+			Assert.AreEqual(typeof(string), "Hello".GetType());
+			Assert.AreEqual("System.String", "Hello".GetType().FullName);
+			Assert.AreNotEqual(typeof(int), "Hello".GetType());
+			Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName);
+
+			// Constraint Syntax
+			Assert.That("Hello", Is.TypeOf(typeof(string)));
+			Assert.That("Hello", Is.Not.TypeOf(typeof(int)));
+			
+			// Inherited syntax
+			Expect( "Hello", TypeOf(typeof(string)));
+			Expect( "Hello", Not.TypeOf(typeof(int)));
+		}
+
+		[Test]
+		public void InstanceOfTests()
+		{
+			// Classic syntax
+			Assert.IsInstanceOf(typeof(string), "Hello");
+			Assert.IsNotInstanceOf(typeof(string), 5);
+
+			// Constraint Syntax
+			Assert.That("Hello", Is.InstanceOf(typeof(string)));
+			Assert.That(5, Is.Not.InstanceOf(typeof(string)));
+
+			// Inherited syntax
+			Expect("Hello", InstanceOf(typeof(string)));
+			Expect(5, Not.InstanceOf(typeof(string)));
+		}
+
+		[Test]
+		public void AssignableFromTypeTests()
+		{
+			// Classic syntax
+			Assert.IsAssignableFrom(typeof(string), "Hello");
+			Assert.IsNotAssignableFrom(typeof(string), 5);
+
+			// Constraint Syntax
+			Assert.That( "Hello", Is.AssignableFrom(typeof(string)));
+			Assert.That( 5, Is.Not.AssignableFrom(typeof(string)));
+			
+			// Inherited syntax
+			Expect( "Hello", AssignableFrom(typeof(string)));
+			Expect( 5, Not.AssignableFrom(typeof(string)));
+		}
+		#endregion
+
+		#region StringConstraint Tests
+		[Test]
+		public void SubstringTests()
+		{
+			string phrase = "Hello World!";
+			string[] array = new string[] { "abc", "bad", "dba" };
+			
+			// Classic Syntax
+			StringAssert.Contains("World", phrase);
+			
+			// Constraint Syntax
+			Assert.That(phrase, Is.StringContaining("World"));
+			// Only available using new syntax
+			Assert.That(phrase, Is.Not.StringContaining("goodbye"));
+			Assert.That(phrase, Is.StringContaining("WORLD").IgnoreCase);
+			Assert.That(phrase, Is.Not.StringContaining("BYE").IgnoreCase);
+			Assert.That(array, Is.All.StringContaining( "b" ) );
+
+			// Inherited syntax
+			Expect(phrase, Contains("World"));
+			// Only available using new syntax
+			Expect(phrase, Not.Contains("goodbye"));
+			Expect(phrase, Contains("WORLD").IgnoreCase);
+			Expect(phrase, Not.Contains("BYE").IgnoreCase);
+			Expect(array, All.Contains("b"));
+		}
+
+		[Test]
+		public void StartsWithTests()
+		{
+			string phrase = "Hello World!";
+			string[] greetings = new string[] { "Hello!", "Hi!", "Hola!" };
+
+			// Classic syntax
+			StringAssert.StartsWith("Hello", phrase);
+
+			// Constraint Syntax
+			Assert.That(phrase, Is.StringStarting("Hello"));
+			// Only available using new syntax
+			Assert.That(phrase, Is.Not.StringStarting("Hi!"));
+			Assert.That(phrase, Is.StringStarting("HeLLo").IgnoreCase);
+			Assert.That(phrase, Is.Not.StringStarting("HI").IgnoreCase);
+			Assert.That(greetings, Is.All.StringStarting("h").IgnoreCase);
+
+			// Inherited syntax
+			Expect(phrase, StartsWith("Hello"));
+			// Only available using new syntax
+			Expect(phrase, Not.StartsWith("Hi!"));
+			Expect(phrase, StartsWith("HeLLo").IgnoreCase);
+			Expect(phrase, Not.StartsWith("HI").IgnoreCase);
+			Expect(greetings, All.StartsWith("h").IgnoreCase);
+		}
+
+		[Test]
+		public void EndsWithTests()
+		{
+			string phrase = "Hello World!";
+			string[] greetings = new string[] { "Hello!", "Hi!", "Hola!" };
+
+			// Classic Syntax
+			StringAssert.EndsWith("!", phrase);
+
+			// Constraint Syntax
+			Assert.That(phrase, Is.StringEnding("!"));
+			// Only available using new syntax
+			Assert.That(phrase, Is.Not.StringEnding("?"));
+			Assert.That(phrase, Is.StringEnding("WORLD!").IgnoreCase);
+			Assert.That(greetings, Is.All.StringEnding("!"));
+		
+			// Inherited syntax
+			Expect(phrase, EndsWith("!"));
+			// Only available using new syntax
+			Expect(phrase, Not.EndsWith("?"));
+			Expect(phrase, EndsWith("WORLD!").IgnoreCase);
+			Expect(greetings, All.EndsWith("!") );
+		}
+
+		[Test]
+		public void EqualIgnoringCaseTests()
+		{
+			string phrase = "Hello World!";
+
+			// Classic syntax
+			StringAssert.AreEqualIgnoringCase("hello world!",phrase);
+            
+			// Constraint Syntax
+			Assert.That(phrase, Is.EqualTo("hello world!").IgnoreCase);
+			//Only available using new syntax
+			Assert.That(phrase, Is.Not.EqualTo("goodbye world!").IgnoreCase);
+			Assert.That(new string[] { "Hello", "World" }, 
+				Is.EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
+			Assert.That(new string[] {"HELLO", "Hello", "hello" },
+				Is.All.EqualTo( "hello" ).IgnoreCase);
+		            
+			// Inherited syntax
+			Expect(phrase, EqualTo("hello world!").IgnoreCase);
+			//Only available using new syntax
+			Expect(phrase, Not.EqualTo("goodbye world!").IgnoreCase);
+			Expect(new string[] { "Hello", "World" }, 
+				EqualTo(new object[] { "HELLO", "WORLD" }).IgnoreCase);
+			Expect(new string[] {"HELLO", "Hello", "hello" },
+				All.EqualTo( "hello" ).IgnoreCase);
+		}
+
+		[Test]
+		public void RegularExpressionTests()
+		{
+			string phrase = "Now is the time for all good men to come to the aid of their country.";
+			string[] quotes = new string[] { "Never say never", "It's never too late", "Nevermore!" };
+
+			// Classic syntax
+			StringAssert.IsMatch( "all good men", phrase );
+			StringAssert.IsMatch( "Now.*come", phrase );
+
+			// Constraint Syntax
+			Assert.That( phrase, Is.StringMatching( "all good men" ) );
+			Assert.That( phrase, Is.StringMatching( "Now.*come" ) );
+			// Only available using new syntax
+			Assert.That(phrase, Is.Not.StringMatching("all.*men.*good"));
+			Assert.That(phrase, Is.StringMatching("ALL").IgnoreCase);
+			Assert.That(quotes, Is.All.StringMatching("never").IgnoreCase);
+		
+			// Inherited syntax
+			Expect( phrase, Matches( "all good men" ) );
+			Expect( phrase, Matches( "Now.*come" ) );
+			// Only available using new syntax
+			Expect(phrase, Not.Matches("all.*men.*good"));
+			Expect(phrase, Matches("ALL").IgnoreCase);
+			Expect(quotes, All.Matches("never").IgnoreCase);
+		}
+		#endregion
+
+		#region Equality Tests
+		[Test]
+		public void EqualityTests()
+		{
+			int[] i3 = new int[] { 1, 2, 3 };
+			double[] d3 = new double[] { 1.0, 2.0, 3.0 };
+			int[] iunequal = new int[] { 1, 3, 2 };
+
+			// Classic Syntax
+			Assert.AreEqual(4, 2 + 2);
+			Assert.AreEqual(i3, d3);
+			Assert.AreNotEqual(5, 2 + 2);
+			Assert.AreNotEqual(i3, iunequal);
+
+			// Constraint Syntax
+			Assert.That(2 + 2, Is.EqualTo(4));
+			Assert.That(2 + 2 == 4);
+			Assert.That(i3, Is.EqualTo(d3));
+			Assert.That(2 + 2, Is.Not.EqualTo(5));
+			Assert.That(i3, Is.Not.EqualTo(iunequal));
+		
+			// Inherited syntax
+			Expect(2 + 2, EqualTo(4));
+			Expect(2 + 2 == 4);
+			Expect(i3, EqualTo(d3));
+			Expect(2 + 2, Not.EqualTo(5));
+			Expect(i3, Not.EqualTo(iunequal));
+		}
+
+		[Test]
+		public void EqualityTestsWithTolerance()
+		{
+			// CLassic syntax
+			Assert.AreEqual(5.0d, 4.99d, 0.05d);
+			Assert.AreEqual(5.0f, 4.99f, 0.05f);
+
+			// Constraint Syntax
+			Assert.That(4.99d, Is.EqualTo(5.0d).Within(0.05d));
+			Assert.That(4.0d, Is.Not.EqualTo(5.0d).Within(0.5d));
+			Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f));
+			Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m));
+			Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u));
+			Assert.That(499, Is.EqualTo(500).Within(5));
+			Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L));
+			Assert.That(5999999999ul, Is.EqualTo(6000000000ul).Within(5ul));
+		
+			// Inherited syntax
+			Expect(4.99d, EqualTo(5.0d).Within(0.05d));
+			Expect(4.0d, Not.EqualTo(5.0d).Within(0.5d));
+			Expect(4.99f, EqualTo(5.0f).Within(0.05f));
+			Expect(4.99m, EqualTo(5.0m).Within(0.05m));
+			Expect(499u, EqualTo(500u).Within(5u));
+			Expect(499, EqualTo(500).Within(5));
+			Expect(4999999999L, EqualTo(5000000000L).Within(5L));
+			Expect(5999999999ul, EqualTo(6000000000ul).Within(5ul));
+		}
+
+		[Test]
+		public void EqualityTestsWithTolerance_MixedFloatAndDouble()
+		{
+			// Bug Fix 1743844
+			Assert.That(2.20492d, Is.EqualTo(2.2d).Within(0.01f),
+				"Double actual, Double expected, Single tolerance");
+			Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01d),
+				"Double actual, Single expected, Double tolerance" );
+			Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01f),
+				"Double actual, Single expected, Single tolerance" );
+			Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01d),
+				"Single actual, Single expected, Double tolerance");
+			Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01d),
+				"Single actual, Double expected, Double tolerance");
+			Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01f),
+				"Single actual, Double expected, Single tolerance");
+		}
+
+		[Test]
+			public void EqualityTestsWithTolerance_MixingTypesGenerally()
+		{
+			// Extending tolerance to all numeric types
+			Assert.That(202d, Is.EqualTo(200d).Within(2),
+				"Double actual, Double expected, int tolerance");
+			Assert.That( 4.87m, Is.EqualTo(5).Within(.25),
+				"Decimal actual, int expected, Double tolerance" );
+			Assert.That( 4.87m, Is.EqualTo(5ul).Within(1),
+				"Decimal actual, ulong expected, int tolerance" );
+			Assert.That( 487, Is.EqualTo(500).Within(25),
+				"int actual, int expected, int tolerance" );
+			Assert.That( 487u, Is.EqualTo(500).Within(25),
+				"uint actual, int expected, int tolerance" );
+			Assert.That( 487L, Is.EqualTo(500).Within(25),
+				"long actual, int expected, int tolerance" );
+			Assert.That( 487ul, Is.EqualTo(500).Within(25),
+				"ulong actual, int expected, int tolerance" );
+		}
+		#endregion
+
+		#region Comparison Tests
+		[Test]
+		public void ComparisonTests()
+		{
+			// Classic Syntax
+			Assert.Greater(7, 3);
+			Assert.GreaterOrEqual(7, 3);
+			Assert.GreaterOrEqual(7, 7);
+
+			// Constraint Syntax
+			Assert.That(7, Is.GreaterThan(3));
+			Assert.That(7, Is.GreaterThanOrEqualTo(3));
+			Assert.That(7, Is.AtLeast(3));
+			Assert.That(7, Is.GreaterThanOrEqualTo(7));
+			Assert.That(7, Is.AtLeast(7));
+
+			// Inherited syntax
+			Expect(7, GreaterThan(3));
+			Expect(7, GreaterThanOrEqualTo(3));
+			Expect(7, AtLeast(3));
+			Expect(7, GreaterThanOrEqualTo(7));
+			Expect(7, AtLeast(7));
+
+			// Classic syntax
+			Assert.Less(3, 7);
+			Assert.LessOrEqual(3, 7);
+			Assert.LessOrEqual(3, 3);
+
+			// Constraint Syntax
+			Assert.That(3, Is.LessThan(7));
+			Assert.That(3, Is.LessThanOrEqualTo(7));
+			Assert.That(3, Is.AtMost(7));
+			Assert.That(3, Is.LessThanOrEqualTo(3));
+			Assert.That(3, Is.AtMost(3));
+		
+			// Inherited syntax
+			Expect(3, LessThan(7));
+			Expect(3, LessThanOrEqualTo(7));
+			Expect(3, AtMost(7));
+			Expect(3, LessThanOrEqualTo(3));
+			Expect(3, AtMost(3));
+		}
+		#endregion
+
+		#region Collection Tests
+		[Test]
+		public void AllItemsTests()
+		{
+			object[] ints = new object[] { 1, 2, 3, 4 };
+			object[] doubles = new object[] { 0.99, 2.1, 3.0, 4.05 };
+			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
+
+			// Classic syntax
+			CollectionAssert.AllItemsAreNotNull(ints);
+			CollectionAssert.AllItemsAreInstancesOfType(ints, typeof(int));
+			CollectionAssert.AllItemsAreInstancesOfType(strings, typeof(string));
+			CollectionAssert.AllItemsAreUnique(ints);
+
+			// Constraint Syntax
+			Assert.That(ints, Is.All.Not.Null);
+			Assert.That(ints, Has.None.Null);
+			Assert.That(ints, Is.All.InstanceOf(typeof(int)));
+			Assert.That(ints, Has.All.InstanceOf(typeof(int)));
+			Assert.That(strings, Is.All.InstanceOf(typeof(string)));
+			Assert.That(strings, Has.All.InstanceOf(typeof(string)));
+			Assert.That(ints, Is.Unique);
+			// Only available using new syntax
+			Assert.That(strings, Is.Not.Unique);
+			Assert.That(ints, Is.All.GreaterThan(0));
+			Assert.That(ints, Has.All.GreaterThan(0));
+			Assert.That(ints, Has.None.LessThanOrEqualTo(0));
+			Assert.That(strings, Is.All.StringContaining( "a" ) );
+			Assert.That(strings, Has.All.Contains( "a" ) );
+			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
+			Assert.That( strings, Has.Some.Property( "Length" ).EqualTo( 3 ) );
+			Assert.That( strings, Has.Some.StartsWith( "BA" ).IgnoreCase );
+			Assert.That( doubles, Has.Some.EqualTo( 1.0 ).Within( .05 ) );
+		
+			// Inherited syntax
+			Expect(ints, All.Not.Null);
+			Expect(ints, None.Null);
+			Expect(ints, All.InstanceOf(typeof(int)));
+			Expect(strings, All.InstanceOf(typeof(string)));
+			Expect(ints, Unique);
+			// Only available using new syntax
+			Expect(strings, Not.Unique);
+			Expect(ints, All.GreaterThan(0));
+			Expect(ints, None.LessThanOrEqualTo(0));
+			Expect(strings, All.Contains( "a" ) );
+			Expect(strings, Some.StartsWith( "ba" ) );
+			Expect(strings, Some.StartsWith( "BA" ).IgnoreCase );
+			Expect(doubles, Some.EqualTo( 1.0 ).Within( .05 ) );
+		}
+
+		[Test]
+		public void SomeItemTests()
+		{
+			object[] mixed = new object[] { 1, 2, "3", null, "four", 100 };
+			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
+
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert.That(mixed, Has.Some.Null);
+			Assert.That(mixed, Has.Some.InstanceOf(typeof(int)));
+			Assert.That(mixed, Has.Some.InstanceOf(typeof(string)));
+			Assert.That(strings, Has.Some.StartsWith( "ba" ) );
+			Assert.That(strings, Has.Some.Not.StartsWith( "ba" ) );
+		
+			// Inherited syntax
+			Expect(mixed, Some.Null);
+			Expect(mixed, Some.InstanceOf(typeof(int)));
+			Expect(mixed, Some.InstanceOf(typeof(string)));
+			Expect(strings, Some.StartsWith( "ba" ) );
+			Expect(strings, Some.Not.StartsWith( "ba" ) );
+		}
+
+		[Test]
+		public void NoItemTests()
+		{
+			object[] ints = new object[] { 1, 2, 3, 4, 5 };
+			object[] strings = new object[] { "abc", "bad", "cab", "bad", "dad" };
+
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert.That(ints, Has.None.Null);
+			Assert.That(ints, Has.None.InstanceOf(typeof(string)));
+			Assert.That(ints, Has.None.GreaterThan(99));
+			Assert.That(strings, Has.None.StartsWith( "qu" ) );
+		
+			// Inherited syntax
+			Expect(ints, None.Null);
+			Expect(ints, None.InstanceOf(typeof(string)));
+			Expect(ints, None.GreaterThan(99));
+			Expect(strings, None.StartsWith( "qu" ) );
+		}
+
+		[Test]
+		public void CollectionContainsTests()
+		{
+			int[] iarray = new int[] { 1, 2, 3 };
+			string[] sarray = new string[] { "a", "b", "c" };
+
+			// Classic syntax
+			Assert.Contains(3, iarray);
+			Assert.Contains("b", sarray);
+			CollectionAssert.Contains(iarray, 3);
+			CollectionAssert.Contains(sarray, "b");
+			CollectionAssert.DoesNotContain(sarray, "x");
+			// Showing that Contains uses NUnit equality
+			CollectionAssert.Contains( iarray, 1.0d );
+
+			// Constraint Syntax
+			Assert.That(iarray, Has.Member(3));
+			Assert.That(sarray, Has.Member("b"));
+			Assert.That(sarray, Has.No.Member("x"));
+			// Showing that Contains uses NUnit equality
+			Assert.That(iarray, Has.Member( 1.0d ));
+
+			// Only available using the new syntax
+			// Note that EqualTo and SameAs do NOT give
+			// identical results to Contains because 
+			// Contains uses Object.Equals()
+			Assert.That(iarray, Has.Some.EqualTo(3));
+			Assert.That(iarray, Has.Member(3));
+			Assert.That(sarray, Has.Some.EqualTo("b"));
+			Assert.That(sarray, Has.None.EqualTo("x"));
+			Assert.That(iarray, Has.None.SameAs( 1.0d ));
+			Assert.That(iarray, Has.All.LessThan(10));
+			Assert.That(sarray, Has.All.Length.EqualTo(1));
+			Assert.That(sarray, Has.None.Property("Length").GreaterThan(3));
+		
+			// Inherited syntax
+			Expect(iarray, Contains(3));
+			Expect(sarray, Contains("b"));
+			Expect(sarray, Not.Contains("x"));
+
+			// Only available using new syntax
+			// Note that EqualTo and SameAs do NOT give
+			// identical results to Contains because 
+			// Contains uses Object.Equals()
+			Expect(iarray, Some.EqualTo(3));
+			Expect(sarray, Some.EqualTo("b"));
+			Expect(sarray, None.EqualTo("x"));
+			Expect(iarray, All.LessThan(10));
+			Expect(sarray, All.Length.EqualTo(1));
+			Expect(sarray, None.Property("Length").GreaterThan(3));
+		}
+
+		[Test]
+		public void CollectionEquivalenceTests()
+		{
+			int[] ints1to5 = new int[] { 1, 2, 3, 4, 5 };
+			int[] twothrees = new int[] { 1, 2, 3, 3, 4, 5 };
+			int[] twofours = new int[] { 1, 2, 3, 4, 4, 5 };
+
+		    // Classic syntax
+		    CollectionAssert.AreEquivalent(new int[] { 2, 1, 4, 3, 5 }, ints1to5);
+			CollectionAssert.AreNotEquivalent(new int[] { 2, 2, 4, 3, 5 }, ints1to5);
+			CollectionAssert.AreNotEquivalent(new int[] { 2, 4, 3, 5 }, ints1to5);
+			CollectionAssert.AreNotEquivalent(new int[] { 2, 2, 1, 1, 4, 3, 5 }, ints1to5);
+            CollectionAssert.AreNotEquivalent(twothrees, twofours); 
+		
+			// Constraint Syntax
+			Assert.That(new int[] { 2, 1, 4, 3, 5 }, Is.EquivalentTo(ints1to5));
+			Assert.That(new int[] { 2, 2, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
+			Assert.That(new int[] { 2, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
+			Assert.That(new int[] { 2, 2, 1, 1, 4, 3, 5 }, Is.Not.EquivalentTo(ints1to5));
+
+			// Inherited syntax
+			Expect(new int[] { 2, 1, 4, 3, 5 }, EquivalentTo(ints1to5));
+			Expect(new int[] { 2, 2, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
+			Expect(new int[] { 2, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
+			Expect(new int[] { 2, 2, 1, 1, 4, 3, 5 }, Not.EquivalentTo(ints1to5));
+		}
+
+		[Test]
+		public void SubsetTests()
+		{
+			int[] ints1to5 = new int[] { 1, 2, 3, 4, 5 };
+
+			// Classic syntax
+			CollectionAssert.IsSubsetOf(new int[] { 1, 3, 5 }, ints1to5);
+			CollectionAssert.IsSubsetOf(new int[] { 1, 2, 3, 4, 5 }, ints1to5);
+			CollectionAssert.IsNotSubsetOf(new int[] { 2, 4, 6 }, ints1to5);
+			CollectionAssert.IsNotSubsetOf(new int[] { 1, 2, 2, 2, 5 }, ints1to5);
+
+			// Constraint Syntax
+			Assert.That(new int[] { 1, 3, 5 }, Is.SubsetOf(ints1to5));
+			Assert.That(new int[] { 1, 2, 3, 4, 5 }, Is.SubsetOf(ints1to5));
+			Assert.That(new int[] { 2, 4, 6 }, Is.Not.SubsetOf(ints1to5));
+		
+			// Inherited syntax
+			Expect(new int[] { 1, 3, 5 }, SubsetOf(ints1to5));
+			Expect(new int[] { 1, 2, 3, 4, 5 }, SubsetOf(ints1to5));
+			Expect(new int[] { 2, 4, 6 }, Not.SubsetOf(ints1to5));
+		}
+		#endregion
+
+		#region Property Tests
+		[Test]
+		public void PropertyTests()
+		{
+			string[] array = { "abc", "bca", "xyz", "qrs" };
+			string[] array2 = { "a", "ab", "abc" };
+			ArrayList list = new ArrayList( array );
+
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert.That( list, Has.Property( "Count" ) );
+			Assert.That( list, Has.No.Property( "Length" ) );
+
+			Assert.That( "Hello", Has.Length.EqualTo( 5 ) );
+			Assert.That( "Hello", Has.Length.LessThan( 10 ) );
+			Assert.That( "Hello", Has.Property("Length").EqualTo(5) );
+			Assert.That( "Hello", Has.Property("Length").GreaterThan(3) );
+
+			Assert.That( array, Has.Property( "Length" ).EqualTo( 4 ) );
+			Assert.That( array, Has.Length.EqualTo( 4 ) );
+			Assert.That( array, Has.Property( "Length" ).LessThan( 10 ) );
+
+			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
+			Assert.That( array, Has.All.Length.EqualTo( 3 ) );
+			Assert.That( array, Is.All.Length.EqualTo( 3 ) );
+			Assert.That( array, Has.All.Property("Length").EqualTo(3) );
+			Assert.That( array, Is.All.Property("Length").EqualTo(3) );
+			
+			Assert.That( array2, Has.Some.Property("Length").EqualTo(2) );
+			Assert.That( array2, Has.Some.Length.EqualTo(2) );
+			Assert.That( array2, Has.Some.Property("Length").GreaterThan(2) );
+
+			Assert.That( array2, Is.Not.Property("Length").EqualTo(4) );
+			Assert.That( array2, Is.Not.Length.EqualTo( 4 ) );
+			Assert.That( array2, Has.No.Property("Length").GreaterThan(3) );
+
+			Assert.That( List.Map( array2 ).Property("Length"), Is.EqualTo( new int[] { 1, 2, 3 } ) );
+			Assert.That( List.Map( array2 ).Property("Length"), Is.EquivalentTo( new int[] { 3, 2, 1 } ) );
+			Assert.That( List.Map( array2 ).Property("Length"), Is.SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
+			Assert.That( List.Map( array2 ).Property("Length"), Is.Unique );
+
+			Assert.That( list, Has.Count.EqualTo( 4 ) );
+			
+			// Inherited syntax
+			Expect( list, Property( "Count" ) );
+			Expect( list, Not.Property( "Nada" ) );
+
+			Expect( "Hello", Length.EqualTo( 5 ) );
+			Expect( "Hello", Property("Length").EqualTo(5) );
+			Expect( "Hello", Property("Length").GreaterThan(0) );
+
+			Expect( array, Property("Length").EqualTo(4) );
+			Expect( array, Length.EqualTo(4) );
+			Expect( array, Property("Length").LessThan(10));
+
+			Expect( array, All.Length.EqualTo( 3 ) );
+			Expect( array, All.Property("Length").EqualTo(3));
+
+			Expect( array2, Some.Property("Length").EqualTo(2) );
+			Expect( array2, Some.Length.EqualTo( 2 ) );
+			Expect( array2, Some.Property("Length").GreaterThan(2));
+
+			Expect( array2, None.Property("Length").EqualTo(4) );
+			Expect( array2, None.Length.EqualTo( 4 ) );
+			Expect( array2, None.Property("Length").GreaterThan(3));
+
+			Expect( Map( array2 ).Property("Length"), EqualTo( new int[] { 1, 2, 3 } ) );
+			Expect( Map( array2 ).Property("Length"), EquivalentTo( new int[] { 3, 2, 1 } ) );
+			Expect( Map( array2 ).Property("Length"), SubsetOf( new int[] { 1, 2, 3, 4, 5 } ) );
+			Expect( Map( array2 ).Property("Length"), Unique );
+
+			Expect( list, Count.EqualTo( 4 ) );
+
+		}
+		#endregion
+
+		#region Not Tests
+		[Test]
+		public void NotTests()
+		{
+			// Not available using the classic syntax
+
+			// Constraint Syntax
+			Assert.That(42, Is.Not.Null);
+			Assert.That(42, Is.Not.True);
+			Assert.That(42, Is.Not.False);
+			Assert.That(2.5, Is.Not.NaN);
+			Assert.That(2 + 2, Is.Not.EqualTo(3));
+			Assert.That(2 + 2, Is.Not.Not.EqualTo(4));
+			Assert.That(2 + 2, Is.Not.Not.Not.EqualTo(5));
+
+			// Inherited syntax
+			Expect(42, Not.Null);
+			Expect(42, Not.True);
+			Expect(42, Not.False);
+			Expect(2.5, Not.NaN);
+			Expect(2 + 2, Not.EqualTo(3));
+			Expect(2 + 2, Not.Not.EqualTo(4));
+			Expect(2 + 2, Not.Not.Not.EqualTo(5));
+		}
+		#endregion
+
+		#region Operator Tests
+		[Test]
+		public void NotOperator()
+		{
+			// The ! operator is only available in the new syntax
+			Assert.That(42, !Is.Null);
+			// Inherited syntax
+			Expect( 42, !Null );
+		}
+
+		[Test]
+		public void AndOperator()
+		{
+			// The & operator is only available in the new syntax
+			Assert.That(7, Is.GreaterThan(5) & Is.LessThan(10));
+			// Inherited syntax
+			Expect( 7, GreaterThan(5) & LessThan(10));
+		}
+
+		[Test]
+		public void OrOperator()
+		{
+			// The | operator is only available in the new syntax
+			Assert.That(3, Is.LessThan(5) | Is.GreaterThan(10));
+			Expect( 3, LessThan(5) | GreaterThan(10));
+		}
+
+		[Test]
+		public void ComplexTests()
+		{
+			Assert.That(7, Is.Not.Null & Is.Not.LessThan(5) & Is.Not.GreaterThan(10));
+			Expect(7, Not.Null & Not.LessThan(5) & Not.GreaterThan(10));
+
+			Assert.That(7, !Is.Null & !Is.LessThan(5) & !Is.GreaterThan(10));
+			Expect(7, !Null & !LessThan(5) & !GreaterThan(10));
+
+			// TODO: Remove #if when mono compiler can handle null
+#if MONO
+            Constraint x = null;
+            Assert.That(7, !x & !Is.LessThan(5) & !Is.GreaterThan(10));
+			Expect(7, !x & !LessThan(5) & !GreaterThan(10));
+#else
+			Assert.That(7, !(Constraint)null & !Is.LessThan(5) & !Is.GreaterThan(10));
+			Expect(7, !(Constraint)null & !LessThan(5) & !GreaterThan(10));
+#endif
+		}
+		#endregion
+ 
+		#region Invalid Code Tests
+		// This method contains assertions that should not compile
+		// You can check by uncommenting it.
+		//public void WillNotCompile()
+		//{
+		//    Assert.That(42, Is.Not);
+		//    Assert.That(42, Is.All);
+		//    Assert.That(42, Is.Null.Not);
+		//    Assert.That(42, Is.Not.Null.GreaterThan(10));
+		//    Assert.That(42, Is.GreaterThan(10).LessThan(99));
+
+		//    object[] c = new object[0];
+		//    Assert.That(c, Is.Null.All);
+		//    Assert.That(c, Is.Not.All);
+		//    Assert.That(c, Is.All.Not);
+		//}
+		#endregion
+	}
+
+}
diff --git a/samples/csharp/syntax/cs-syntax.build b/samples/csharp/syntax/cs-syntax.build
index 56bf9d9..c144588 100644
--- a/samples/csharp/syntax/cs-syntax.build
+++ b/samples/csharp/syntax/cs-syntax.build
@@ -1,11 +1,11 @@
-<?xml version="1.0"?>
-<project name="cs-syntax" default="build">
-
-  <include buildfile="../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cs" />
-    <include name="AssertSyntaxTests.cs" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="cs-syntax" default="build">
+
+  <include buildfile="../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs" />
+    <include name="AssertSyntaxTests.cs" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/csharp/syntax/cs-syntax.csproj b/samples/csharp/syntax/cs-syntax.csproj
index f3a9282..2d2439c 100644
--- a/samples/csharp/syntax/cs-syntax.csproj
+++ b/samples/csharp/syntax/cs-syntax.csproj
@@ -1,20 +1,122 @@
-<VisualStudioProject>
-  <CSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="cs-syntax" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="cs_syntax" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DocumentationFile="" DebugSymbols="true" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-        <Config Name="Release" AllowUnsafeBlocks="false" BaseAddress="285212672" CheckForOverflowUnderflow="false" ConfigurationOverrideFile="" DefineConstants="TRACE" DocumentationFile="" DebugSymbols="false" FileAlignment="4096" IncrementalBuild="false" NoStdLib="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="4" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.cs" SubType="Code" BuildAction="Compile" />
-        <File RelPath="AssertSyntaxTests.cs" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </CSHARP>
-</VisualStudioProject>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{06F46FA2-687B-4B46-A912-C1B0B4CC1B20}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>cs-syntax</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>cs_syntax</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</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 />
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile />
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile />
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn />
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssertSyntaxTests.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/fsharp/FSharp.sln b/samples/fsharp/FSharp.sln
new file mode 100644
index 0000000..bcbb71a
--- /dev/null
+++ b/samples/fsharp/FSharp.sln
@@ -0,0 +1,32 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "fs-failures", "failures\fs-failures.fsproj", "{1BDBEE34-CAA3-4004-9D0D-11E09C665A9F}"
+EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "syntax", "syntax\fs-syntax.fsproj", "{5DE001E7-2606-4DFE-8C03-90C70D2C3805}"
+EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "money", "money\fs-money.fsproj", "{3F6B1A52-B393-4218-9293-BE3F1701B6B6}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{1BDBEE34-CAA3-4004-9D0D-11E09C665A9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1BDBEE34-CAA3-4004-9D0D-11E09C665A9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1BDBEE34-CAA3-4004-9D0D-11E09C665A9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1BDBEE34-CAA3-4004-9D0D-11E09C665A9F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5DE001E7-2606-4DFE-8C03-90C70D2C3805}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5DE001E7-2606-4DFE-8C03-90C70D2C3805}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5DE001E7-2606-4DFE-8C03-90C70D2C3805}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5DE001E7-2606-4DFE-8C03-90C70D2C3805}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3F6B1A52-B393-4218-9293-BE3F1701B6B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3F6B1A52-B393-4218-9293-BE3F1701B6B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3F6B1A52-B393-4218-9293-BE3F1701B6B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3F6B1A52-B393-4218-9293-BE3F1701B6B6}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/samples/fsharp/failures/SimpleFSharpTest.fs b/samples/fsharp/failures/SimpleFSharpTest.fs
new file mode 100644
index 0000000..9b21309
--- /dev/null
+++ b/samples/fsharp/failures/SimpleFSharpTest.fs
@@ -0,0 +1,42 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+module NUnit.Samples.SimpleCSharpTest
+
+open System
+open NUnit.Framework
+
+let fValue1 = 2
+let fValue2 = 3
+
+[<Test>]
+let Add() =
+    let result = fValue1 + fValue2
+    Assert.AreEqual(6, result, "Expected Failure")
+
+[<Test>]
+let DivideByZero() =
+    let zero = 0
+    let result = 8 / zero
+    Assert.True(true)
+
+[<Test>]
+let Equals() =
+    Assert.AreEqual(12, 12, "Integer")
+    Assert.AreEqual(12L, 12L, "Long")
+    Assert.AreEqual('a', 'a', "Char")
+    Assert.AreEqual(12, 13, "Expected Failure");
+
+[<Test>]
+[<ExpectedException(typeof<InvalidOperationException>)>]
+let ExpectAnException() =
+    raise(InvalidCastException())
+    Assert.True(true)
+
+[<Test>]
+[<Ignore("ignored test")>]
+let IgnoredTest() =
+    Assert.True(true)
diff --git a/samples/fsharp/failures/fs-failures.build b/samples/fsharp/failures/fs-failures.build
new file mode 100644
index 0000000..5a51637
--- /dev/null
+++ b/samples/fsharp/failures/fs-failures.build
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<project name="fs-failures" default="build">
+
+  <include buildfile="../../samples.common"/>
+
+  <patternset id="source-files">
+    <include name="SimpleFSharpTest.fs" />
+  </patternset>
+
+</project>
\ No newline at end of file
diff --git a/samples/fsharp/failures/fs-failures.fsproj b/samples/fsharp/failures/fs-failures.fsproj
new file mode 100644
index 0000000..c8b5ee7
--- /dev/null
+++ b/samples/fsharp/failures/fs-failures.fsproj
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1bdbee34-caa3-4004-9d0d-11e09c665a9f}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>fs_failures</RootNamespace>
+    <AssemblyName>fs_failures</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <Name>fs-failures</Name>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <Tailcalls>false</Tailcalls>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <WarningLevel>3</WarningLevel>
+    <DocumentationFile>bin\Debug\fs_failures.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <Tailcalls>true</Tailcalls>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <WarningLevel>3</WarningLevel>
+    <DocumentationFile>bin\Release\fs_failures.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="FSharp.Core" />
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" />
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SimpleFSharpTest.fs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="!Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
+  <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition=" Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
+  <!-- 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/samples/fsharp/money/Money.fs b/samples/fsharp/money/Money.fs
new file mode 100644
index 0000000..361decb
--- /dev/null
+++ b/samples/fsharp/money/Money.fs
@@ -0,0 +1,122 @@
+module NUnit.Samples.Money
+
+open System
+open System.Collections.Generic
+
+type IMoney =
+    abstract IsZero : bool
+    abstract Add : IMoney -> IMoney
+    abstract AddMoney : Money -> IMoney
+    abstract Multiply : int -> IMoney
+    abstract Negate : unit -> IMoney
+    abstract Subtract : IMoney -> IMoney
+
+and Money(amount: int, currency: string) as this =
+
+    member internal this.currency
+        with get() = currency
+    member internal this.amount
+        with get() = amount
+
+    override self.Equals(anObject) =
+        match anObject with
+            | :? Money as money -> this.IsZero && money.IsZero || currency = money.currency && amount = money.amount
+            | _ -> false
+    override this.GetHashCode() = currency.GetHashCode() + amount 
+    override this.ToString() = System.String.Format("[{0} {1}]", amount, currency)
+
+    interface IMoney with
+        member this.IsZero = amount = 0
+        member this.Add(m: IMoney) = m.AddMoney(this)
+        member this.AddMoney(m: Money) = this.AddMoney(m)
+        member this.Multiply(factor) = this.Multiply(factor) :> IMoney
+        member this.Negate() = this.Negate() :> IMoney
+        member this.Subtract(m: IMoney) = this.Subtract(m) : IMoney
+
+    member this.IsZero = (this :> IMoney).IsZero
+    member this.Add(m: IMoney) = m.AddMoney(this)
+    member this.AddMoney(m: Money) =
+        if m.currency = this.currency then new Money(m.amount + this.amount, this.currency) :> IMoney
+        else new MoneyBag( [this; m] ) :> IMoney
+    member this.Multiply(factor) = new Money( this.amount * factor, this.currency )
+    member this.Negate() = new Money( -this.amount, this.currency)
+    member this.Subtract(m: IMoney) = m.Negate().Add(this);
+
+    // Operator overrides
+    static member (+) (m1: Money, m2: Money) = m1.AddMoney(m2)
+    static member (*) (m1: Money, factor) = m1.Multiply(factor)
+    static member (*) (factor, m1: Money) = m1.Multiply(factor)
+    static member (~-) (m: Money) = m.Negate()
+    static member (-) (m1: Money, m2: Money) = m1.Subtract(m2)
+
+and MoneyBag(contents0: Money list) =
+    // Although mutable, this should only be changed in the constructor
+    let mutable contents = []
+    do
+        let mutable map = Map.empty
+        for m in contents0 do
+            if m.IsZero <> true then
+                match map.TryFind(m.currency) with
+                    | None -> map <- map.Add(m.currency, m.amount)
+                    | Some(_) as old ->
+                        map <- map.Add(m.currency, m.amount + old.Value)
+        for pair in map do
+            contents <- new Money(pair.Value, pair.Key)::contents
+
+    member this.Contents
+        with get() = contents
+
+    override this.Equals(anObject) =
+        match anObject with
+            | :? MoneyBag as bag when this.IsZero -> bag.IsZero
+            | :? MoneyBag as bag -> bag.contentsEqual(contents)
+            | _ ->false
+    override this.GetHashCode() =
+        contents.GetHashCode()
+    override this.ToString() =
+        contents.ToString()
+
+    interface IMoney with
+        member this.IsZero = contents.IsEmpty
+        member this.Multiply(factor) = this.Multiply(factor) :> IMoney
+        member this.Negate() = this.Negate() :> IMoney
+        member this.Subtract(m: IMoney) = this.Subtract(m)
+        member this.Add(m: IMoney) : IMoney = this.Add(m)
+        member this.AddMoney(m: Money) = this.AddMoney(m) :> IMoney
+
+    member this.IsZero = contents.IsEmpty
+    member this.Multiply(factor) =
+        if factor = 0 then new MoneyBag( [] )
+        else new MoneyBag( [ for m in contents -> m * factor ] )
+    member this.Negate() = new MoneyBag( [ for m in contents -> -m ] )
+    member this.Add(m: IMoney): IMoney =
+        match m with
+            | :? Money as money -> this.AddMoney(money).simplify()
+            | :? MoneyBag as bag -> this.AddMoneyBag(bag).simplify()
+            | _ -> failwith "Unexpected Type for IMoney"
+    member this.AddMoney(money: Money): MoneyBag =
+        new MoneyBag( [ for m in contents -> if m.currency = money.currency then new Money(m.amount + money.amount, m.currency) else m ] )
+    member this.AddMoneyBag(bag: MoneyBag): MoneyBag =
+        let mutable result = bag
+        for m in contents do
+            result <- result.AddMoney m
+        result
+    member this.Subtract(money: IMoney): IMoney = this.Add( money.Negate() )
+
+    member private self.contains(aMoney: Money) =
+        List.tryFind (fun m -> m = aMoney) contents <> None            
+    member private self.contentsEqual(c: Money list) =
+        if c.Length <> contents.Length then false
+        else List.forall (fun m -> self.contains m) c
+    member private self.simplify() =
+        match contents.Length with
+            | 1 -> contents.Head :> IMoney
+            | _ -> self :> IMoney
+
+    static member (*) (bag: MoneyBag, factor) = bag.Multiply(factor)
+    static member (*) (factor, bag: MoneyBag) = bag.Multiply(factor)
+    static member (~-) (bag: MoneyBag) = bag.Negate()
+    static member (+) (bag: MoneyBag, m: IMoney) = bag.Add(m)
+    static member (+) (m: Money, bag: MoneyBag) = bag.AddMoney(m)
+    static member (-) (bag: MoneyBag, m: IMoney) = bag.Subtract(m)
+    static member (-) (m: Money, bag: MoneyBag) = m.Subtract(bag)
diff --git a/samples/fsharp/money/MoneyBag.fs b/samples/fsharp/money/MoneyBag.fs
new file mode 100644
index 0000000..c60a68b
--- /dev/null
+++ b/samples/fsharp/money/MoneyBag.fs
@@ -0,0 +1,12 @@
+namespace NUnit.Samples.Money
+
+open System
+
+type MoneyBag([<ParamArray>] contents: Money[]) =
+    let mutable monies:Money[] = contents
+
+    member self.Multiply(factor) =
+        let result = array.CreateInstance(typeof<Money>, monies.Length)
+        for i in 0..contents.Length-1 do
+            result[i] = contents[i] * factor
+            
diff --git a/samples/fsharp/money/MoneyTest.fs b/samples/fsharp/money/MoneyTest.fs
new file mode 100644
index 0000000..71cad20
--- /dev/null
+++ b/samples/fsharp/money/MoneyTest.fs
@@ -0,0 +1,189 @@
+module NUnit.Samples.MoneyTest
+
+open System
+open NUnit.Framework
+open NUnit.Samples.Money
+
+let f12CHF = new Money(12, "CHF")
+let f14CHF = new Money(14, "CHF")
+let f7USD = new Money(7, "USD")
+let f21USD = new Money(21, "USD")
+
+let fMB1 = new MoneyBag( [ f12CHF; f7USD ] )
+let fMB2 = new MoneyBag( [ f14CHF; f21USD ] )
+
+[<Test>]
+let MoneyIsZero() =
+    let zeroUSD = new Money(0, "USD")
+    Assert.That(zeroUSD.IsZero)
+
+[<Test>]
+let MoneyEquals()  =
+    //NOTE: Normally we use Assert.AreEqual to test whether two
+    // objects are equal. But here we are testing the Money.Equals()
+    // method itself, so using AreEqual would not serve the purpose.
+    Assert.IsFalse(f12CHF.Equals(null))
+    let equalMoney = new Money(12, "CHF")
+    Assert.IsTrue(f12CHF.Equals( f12CHF ))
+    Assert.IsTrue(f12CHF.Equals( equalMoney ))
+    Assert.IsFalse(f12CHF.Equals(f14CHF))
+
+[<Test>]
+let MoneyHashCode() =
+    let equal = new Money(12, "CHF")
+    Assert.AreEqual(f12CHF.GetHashCode(), equal.GetHashCode())
+
+[<Test>]
+let MoneyPrint() =
+    Assert.AreEqual("[12 CHF]", f12CHF.ToString())
+
+[<Test>]
+let SimpleAdd() =
+    // [12 CHF] + [14 CHF] == [26 CHF]
+    let expected = new Money(26, "CHF")
+    Assert.AreEqual(expected, f12CHF.AddMoney(f14CHF))
+    Assert.AreEqual(expected, f12CHF.Add(f14CHF))
+    Assert.AreEqual(expected, f12CHF + f14CHF)
+
+[<Test>]
+let SimpleMultiply() =
+    // [14 CHF] *2 == [28 CHF]
+    let expected = new Money(28, "CHF")
+    Assert.AreEqual(expected, f14CHF.Multiply(2))
+    Assert.AreEqual(expected, f14CHF*2)
+    Assert.AreEqual(expected, 2*f14CHF)
+
+[<Test>]
+let SimpleNegate() =
+    // [14 CHF] negate == [-14 CHF]
+    let expected = new Money(-14, "CHF")
+    Assert.AreEqual(expected, f14CHF.Negate())
+    Assert.AreEqual(expected, -f14CHF)
+
+[<Test>]
+let SimpleSubtract()  =
+    // [14 CHF] - [12 CHF] == [2 CHF]
+    let expected = new Money(2, "CHF")
+    Assert.AreEqual(expected, f14CHF.Subtract(f12CHF))
+    Assert.AreEqual(expected, f14CHF - f12CHF)
+
+[<Test>]
+let MoneyBagEquals() =
+    //NOTE: Normally we use Assert.AreEqual to test whether two
+    // objects are equal. But here we are testing the MoneyBag.Equals()
+    // method itself, so using AreEqual would not serve the purpose.
+    Assert.False(fMB1.Equals(null)) 
+    Assert.True(fMB1.Equals( fMB1 ))
+    let equalBag = new MoneyBag( [new Money(12, "CHF"); new Money(7, "USD")] )
+    Assert.True(fMB1.Equals(equalBag))
+    Assert.False(fMB1.Equals(f12CHF))
+    Assert.False(f12CHF.Equals(fMB1))
+    Assert.False(fMB1.Equals(fMB2))
+
+[<Test>]
+let MoneyBagHash() =
+    let equalBag = new MoneyBag( [new Money(12, "CHF"); new Money(7, "USD")] )
+    Assert.AreEqual(fMB1.GetHashCode(), equalBag.GetHashCode())
+
+[<Test>]
+let MoneyBagIsZero() =
+    Assert.True(fMB1.Subtract(fMB1).IsZero);
+
+    let bag = new MoneyBag( [ new Money(0, "CHF"); new Money(0, "USD") ] )
+    Assert.True( bag.IsZero )
+
+[<Test>]
+let BagMultiply() =
+    // {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
+    let expected = new MoneyBag( [new Money(24, "CHF"); new Money(14, "USD")] )
+    Assert.AreEqual(expected, fMB1.Multiply(2))
+    Assert.AreEqual(expected, fMB1 * 2)
+    Assert.AreEqual(expected, 2 * fMB1)
+    Assert.AreEqual(fMB1, fMB1.Multiply(1))
+    Assert.IsTrue(fMB1.Multiply(0).IsZero)
+
+[<Test>]
+let BagNegate() =
+    // {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
+    let expected = new MoneyBag( [new Money(-12, "CHF"); new Money(-7, "USD")] )
+    Assert.AreEqual(expected, -fMB1)
+    Assert.AreEqual(expected, fMB1.Negate())
+
+[<Test>]
+let BagSimpleAdd() =
+    // {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]}
+    let bag = [ new Money(26, "CHF"); new Money(7, "USD") ]
+    let expected = new MoneyBag(bag)
+    Assert.AreEqual(expected, fMB1.AddMoney(f14CHF))
+    Assert.AreEqual(expected, fMB1.Add(f14CHF))
+    Assert.AreEqual(expected, fMB1 + f14CHF)
+
+[<Test>]
+let BagSubtract() =
+    // {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
+    let bag= [ new Money(-2, "CHF"); new Money(-14, "USD") ]
+    let expected= new MoneyBag(bag)
+    Assert.AreEqual(expected, fMB1.Subtract(fMB2))
+    Assert.AreEqual(expected, fMB1 - fMB2)
+
+[<Test>]
+let BagSumAdd() =
+    // {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
+    let contents = [ new Money(26, "CHF"); new Money(28, "USD") ]
+    let expected= new MoneyBag(contents)
+    Assert.AreEqual(expected, fMB1.AddMoneyBag(fMB2))
+    Assert.AreEqual(expected, fMB1.Add(fMB2))
+    Assert.AreEqual(expected, fMB1 + fMB2)
+
+[<Test>]
+let MixedSimpleAdd() =
+    // [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
+    let contents = [ f12CHF; f7USD ]
+    let expected = new MoneyBag(contents)
+    Assert.AreEqual(expected, f12CHF.AddMoney(f7USD))
+    Assert.AreEqual(expected, f12CHF.Add(f7USD))
+    Assert.AreEqual(expected, f12CHF + f7USD)
+    Assert.AreEqual(expected, f7USD + f12CHF)
+
+[<Test>]
+let SimpleBagAdd() =
+    // [14 CHF] + {[12 CHF][7 USD]} == {[26 CHF][7 USD]}
+    let contents = [ new Money(26, "CHF"); new Money(7, "USD") ]
+    let expected= new MoneyBag(contents)
+    Assert.AreEqual(expected, f14CHF.Add(fMB1))
+    Assert.AreEqual(expected, f14CHF + fMB1)
+
+[<Test>]
+let Normalize() =
+    let contents = [ new Money(26, "CHF"); new Money(28, "CHF"); new Money(6, "CHF") ]
+    let moneyBag= new MoneyBag(contents)
+    let expected = [ new Money(60, "CHF") ]
+    // note: expected is still a MoneyBag
+    let expectedBag = new MoneyBag( [new Money(60, "CHF")] )
+    Assert.AreEqual(expectedBag, moneyBag)
+
+[<Test>]
+let Normalize2() =
+    // {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
+    let expected = new Money(7, "USD")
+    Assert.AreEqual(expected, fMB1.Subtract(f12CHF))
+    Assert.AreEqual(expected, fMB1 - f12CHF)
+
+[<Test>]
+let Normalize3() =
+    // {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
+    let contents = [ new Money(12, "CHF"); new Money(3, "USD") ]
+    let bag = new MoneyBag(contents)
+    let expected = new Money(4, "USD")
+    Assert.AreEqual(expected, fMB1.Subtract(bag))
+    Assert.AreEqual(expected, fMB1 - bag)
+
+[<Test>]
+let Normalize4() =
+    // [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
+    let contents = [ new Money(12, "CHF"); new Money(3, "USD") ]
+    let bag = new MoneyBag(contents)
+    let expected = new Money(-3, "USD")
+    Assert.AreEqual(expected, f12CHF.Subtract(bag));
+    Assert.AreEqual(expected, f12CHF - bag)
+
diff --git a/samples/fsharp/money/fs-money.build b/samples/fsharp/money/fs-money.build
new file mode 100644
index 0000000..7da8cf2
--- /dev/null
+++ b/samples/fsharp/money/fs-money.build
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<project name="fs-money" default="build">
+
+  <include buildfile="../../samples.common" />
+  
+  <patternset id="source-files">
+    <include name="Money.fs" />
+    <include name="MoneyBag.fs" />
+    <include name="MoneyTest.fs" />
+  </patternset>
+
+</project>
\ No newline at end of file
diff --git a/samples/fsharp/money/fs-money.fsproj b/samples/fsharp/money/fs-money.fsproj
new file mode 100644
index 0000000..4030243
--- /dev/null
+++ b/samples/fsharp/money/fs-money.fsproj
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3f6b1a52-b393-4218-9293-be3f1701b6b6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>money</RootNamespace>
+    <AssemblyName>money</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <Name>money</Name>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <Tailcalls>false</Tailcalls>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <WarningLevel>3</WarningLevel>
+    <DocumentationFile>bin\Debug\money.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <Tailcalls>true</Tailcalls>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <WarningLevel>3</WarningLevel>
+    <DocumentationFile>bin\Release\money.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="FSharp.Core" />
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" />
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Money.fs" />
+    <Compile Include="MoneyTest.fs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="!Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
+  <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition=" Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
+  <!-- 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/samples/fsharp/syntax/AssertSyntaxTests.fs b/samples/fsharp/syntax/AssertSyntaxTests.fs
new file mode 100644
index 0000000..7bba26e
--- /dev/null
+++ b/samples/fsharp/syntax/AssertSyntaxTests.fs
@@ -0,0 +1,392 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+module NUnit.Samples.AssertSyntaxTests
+
+open System
+open System.Collections
+open NUnit.Framework
+open NUnit.Framework.Constraints
+
+/// <summary>
+/// This test fixture attempts to exercise all the syntactic
+/// variations of Assert without getting into failures, errors 
+/// or corner cases. Thus, some of the tests may be duplicated 
+/// in other fixtures.
+/// 
+/// Each test performs the same operations using the classic
+/// syntax (if available) and the constraint syntax. The
+/// inherited syntax is not used in this example, since it
+/// would require using a class to hold the tests, which
+/// seems to make it less useful in F#.
+/// </summary>
+
+[<Test>]
+let IsNull() =
+    let nada : obj = null
+    Assert.IsNull(nada)
+    Assert.That(nada, Is.Null)
+
+[<Test>]
+let IsNotNull() =
+    Assert.IsNotNull(42)
+    Assert.That(42, Is.Not.Null)
+
+[<Test>]
+let IsTrue() =
+    Assert.IsTrue(2+2=4)
+    Assert.True(2+2=4)
+    Assert.That(2+2=4, Is.True)
+    Assert.That(2+2=4)
+
+[<Test>]
+let IsFalse() =
+    Assert.IsFalse(2+2=5)
+    Assert.That(2+2=5, Is.False)
+
+[<Test>]
+let IsNaN() =
+    let d : double = Double.NaN
+    let f : float = Double.NaN
+    Assert.IsNaN(d)
+    Assert.IsNaN(f)
+    Assert.That(d, Is.NaN)
+    Assert.That(f, Is.NaN)
+
+[<Test>]
+let EmptyStringTests() =
+    Assert.IsEmpty("")
+    Assert.IsNotEmpty("Hello!")
+    Assert.That("", Is.Empty)
+    Assert.That("Hello!", Is.Not.Empty)
+
+[<Test>]
+let EmptyCollectionTests() =
+    // Lists
+    Assert.IsEmpty([])
+    Assert.IsNotEmpty([ 1; 2; 3 ])
+    Assert.That([], Is.Empty)
+    Assert.That([ 1; 2; 3 ], Is.Not.Empty)
+    //Arrays
+    Assert.IsEmpty([||])
+    Assert.IsNotEmpty([| 1; 2; 3 |])
+    Assert.That([||], Is.Empty)
+    Assert.That([| 1; 2; 3 |], Is.Not.Empty)
+
+[<Test>]
+let ExactTypeTests() =
+    Assert.AreEqual(typeof<string>, "Hello".GetType())
+    Assert.AreEqual("System.String", "Hello".GetType().FullName)
+    Assert.AreNotEqual(typeof<int>, "Hello".GetType())
+    Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName)
+    Assert.That("Hello", Is.TypeOf<string>())
+    Assert.That("Hello", Is.Not.TypeOf<int>())
+
+[<Test>]
+let InstanceOfTypeTests() =
+    Assert.IsInstanceOf(typeof<string>, "Hello")
+    Assert.IsNotInstanceOf(typeof<string>, 5)
+    Assert.That("Hello", Is.InstanceOf(typeof<string>))
+    Assert.That(5, Is.Not.InstanceOf(typeof<string>))
+
+[<Test>]
+let AssignableFromTypeTests() =
+    Assert.IsAssignableFrom(typeof<string>, "Hello")
+    Assert.IsNotAssignableFrom(typeof<string>, 5)
+    Assert.That( "Hello", Is.AssignableFrom(typeof<string>))
+    Assert.That( 5, Is.Not.AssignableFrom(typeof<string>))
+
+[<Test>]
+let SubstringTests() =
+    let phrase = "Hello World!"
+    let array = [| "abc"; "bad"; "dba" |]
+    StringAssert.Contains("World", phrase)
+    Assert.That(phrase, Contains.Substring("World"))
+    Assert.That(phrase, Is.Not.StringContaining("goodbye"))
+    Assert.That(phrase, Contains.Substring("WORLD").IgnoreCase)
+    Assert.That(phrase, Is.Not.StringContaining("BYE").IgnoreCase)
+    Assert.That(array, Has.All.StringContaining( "b" ) )
+
+[<Test>]
+let StartsWithTests() =
+    let phrase = "Hello World!"
+    let greetings = [| "Hello!"; "Hi!"; "Hola!" |]
+    StringAssert.StartsWith("Hello", phrase);
+    Assert.That(phrase, Is.StringStarting("Hello"))
+    Assert.That(phrase, Is.Not.StringStarting("Hi!"))
+    Assert.That(phrase, Is.StringStarting("HeLLo").IgnoreCase)
+    Assert.That(phrase, Is.Not.StringStarting("HI").IgnoreCase)
+    Assert.That(greetings, Is.All.StringStarting("h").IgnoreCase)
+
+[<Test>]
+let EndsWithTests() =
+    let phrase = "Hello World!"
+    let greetings = [| "Hello!"; "Hi!"; "Hola!" |];
+    StringAssert.EndsWith("!", phrase)
+    Assert.That(phrase, Is.StringEnding("!"))
+    Assert.That(phrase, Is.Not.StringEnding("?"))
+    Assert.That(phrase, Is.StringEnding("WORLD!").IgnoreCase)
+    Assert.That(greetings, Is.All.StringEnding("!"))
+
+[<Test>]
+let EqualIgnoringCaseTests() =
+    let phrase = "Hello World!"
+    StringAssert.AreEqualIgnoringCase("hello world!",phrase)
+    Assert.That(phrase, Is.EqualTo("hello world!").IgnoreCase)
+    Assert.That(phrase, Is.Not.EqualTo("goodbye world!").IgnoreCase)
+    Assert.That( [| "Hello"; "World" |], 
+        Is.EqualTo( [| "HELLO"; "WORLD" |] ).IgnoreCase)
+    Assert.That( [| "HELLO"; "Hello"; "hello" |],
+        Is.All.EqualTo( "hello" ).IgnoreCase)
+          
+[<Test>]
+let RegularExpressionTests() =
+    let phrase = "Now is the time for all good men to come to the aid of their country."
+    let quotes = [| "Never say never"; "It's never too late"; "Nevermore!" |]
+    StringAssert.IsMatch( "all good men", phrase )
+    StringAssert.IsMatch( "Now.*come", phrase )
+    Assert.That( phrase, Is.StringMatching( "all good men" ) )
+    Assert.That( phrase, Is.StringMatching( "Now.*come" ) )
+    Assert.That( phrase, Is.Not.StringMatching("all.*men.*good") )
+    Assert.That( phrase, Is.StringMatching("ALL").IgnoreCase )
+    Assert.That( quotes, Is.All.StringMatching("never").IgnoreCase )
+
+[<Test>]
+let EqualityTests() =
+    let i3 = [| 1; 2; 3 |]
+    let d3 = [| 1.0; 2.0; 3.0 |]
+    let iunequal = [| 1; 3; 2 |]
+    Assert.AreEqual(4, 2 + 2)
+    Assert.AreEqual(i3, d3)
+    Assert.AreNotEqual(5, 2 + 2)
+    Assert.AreNotEqual(i3, iunequal)
+    Assert.That(2 + 2, Is.EqualTo(4))
+    Assert.That(2 + 2 = 4)
+    Assert.That(i3, Is.EqualTo(d3))
+    Assert.That(2 + 2, Is.Not.EqualTo(5))
+    Assert.That(i3, Is.Not.EqualTo(iunequal))
+
+[<Test>]
+let EqualityTestsWithTolerance() =
+    Assert.AreEqual(5.0, 4.99, 0.05)
+    Assert.That(4.99, Is.EqualTo(5.0).Within(0.05))
+    Assert.That(4.0, Is.Not.EqualTo(5.0).Within(0.5))
+    Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f))
+    Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m))
+    Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u))
+    Assert.That(499, Is.EqualTo(500).Within(5))
+    Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L))
+    Assert.That(5999999999UL, Is.EqualTo(6000000000UL).Within(5UL))
+
+[<Test>]
+let EqualityTestsWithTolerance_MixedFloatAndDouble() =
+    // Bug Fix 1743844
+    Assert.That(2.20492, Is.EqualTo(2.2).Within(0.01f),
+        "Double actual, Double expected, Single tolerance")
+    Assert.That(2.20492, Is.EqualTo(2.2f).Within(0.01),
+        "Double actual, Single expected, Double tolerance" )
+    Assert.That(2.20492, Is.EqualTo(2.2f).Within(0.01f),
+        "Double actual, Single expected, Single tolerance" )
+    Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01),
+        "Single actual, Single expected, Double tolerance")
+    Assert.That(2.20492f, Is.EqualTo(2.2).Within(0.01),
+        "Single actual, Double expected, Double tolerance")
+    Assert.That(2.20492f, Is.EqualTo(2.2).Within(0.01f),
+        "Single actual, Double expected, Single tolerance")
+
+[<Test>]
+let EqualityTestsWithTolerance_MixingTypesGenerally() =
+    Assert.That(202.0, Is.EqualTo(200.0).Within(2),
+        "Double actual, Double expected, int tolerance")
+    Assert.That( 4.87m, Is.EqualTo(5).Within(0.25),
+        "Decimal actual, int expected, Double tolerance" )
+    Assert.That( 4.87m, Is.EqualTo(5ul).Within(1),
+        "Decimal actual, ulong expected, int tolerance" )
+    Assert.That( 487, Is.EqualTo(500).Within(25),
+        "int actual, int expected, int tolerance" )
+    Assert.That( 487u, Is.EqualTo(500).Within(25),
+        "uint actual, int expected, int tolerance" )
+    Assert.That( 487L, Is.EqualTo(500).Within(25),
+        "long actual, int expected, int tolerance" )
+    Assert.That( 487ul, Is.EqualTo(500).Within(25),
+        "ulong actual, int expected, int tolerance" )
+
+[<Test>]
+let ComparisonTests() =
+    Assert.Greater(7, 3)
+    Assert.GreaterOrEqual(7, 3)
+    Assert.GreaterOrEqual(7, 7)
+    Assert.That(7, Is.GreaterThan(3))
+    Assert.That(7, Is.GreaterThanOrEqualTo(3))
+    Assert.That(7, Is.AtLeast(3))
+    Assert.That(7, Is.GreaterThanOrEqualTo(7))
+    Assert.That(7, Is.AtLeast(7))
+
+    Assert.Less(3, 7)
+    Assert.LessOrEqual(3, 7)
+    Assert.LessOrEqual(3, 3)
+    Assert.That(3, Is.LessThan(7))
+    Assert.That(3, Is.LessThanOrEqualTo(7))
+    Assert.That(3, Is.AtMost(7))
+    Assert.That(3, Is.LessThanOrEqualTo(3))
+    Assert.That(3, Is.AtMost(3))
+
+[<Test>]
+let AllItemsTests() =
+    let ints = [| 1; 2; 3; 4 |]
+    let doubles = [| 0.99; 2.1; 3.0; 4.05 |]
+    let strings = [| "abc"; "bad"; "cab"; "bad"; "dad" |]
+    CollectionAssert.AllItemsAreNotNull(ints)
+    CollectionAssert.AllItemsAreInstancesOfType(ints, typeof<int>)
+    CollectionAssert.AllItemsAreInstancesOfType(strings, typeof<string>)
+    CollectionAssert.AllItemsAreUnique(ints)
+    Assert.That(ints, Is.All.Not.Null)
+    Assert.That(ints, Has.None.Null)
+    Assert.That(ints, Is.All.InstanceOf(typeof<int>))
+    Assert.That(ints, Has.All.InstanceOf(typeof<int>))
+    Assert.That(strings, Is.All.InstanceOf(typeof<string>))
+    Assert.That(strings, Has.All.InstanceOf(typeof<string>))
+    Assert.That(ints, Is.Unique)
+    Assert.That(strings, Is.Not.Unique)
+    Assert.That(ints, Is.All.GreaterThan(0))
+    Assert.That(ints, Has.All.GreaterThan(0));
+    Assert.That(ints, Has.None.LessThanOrEqualTo(0))
+    Assert.That(strings, Is.All.StringContaining( "a" ) )
+    Assert.That(strings, Has.All.Contains( "a" ) )
+    Assert.That(strings, Has.Some.StartsWith( "ba" ) )
+    Assert.That( strings, Has.Some.Property( "Length" ).EqualTo( 3 ) )
+    Assert.That( strings, Has.Some.StartsWith( "BA" ).IgnoreCase )
+    Assert.That( doubles, Has.Some.EqualTo( 1.0 ).Within( 0.05 ) )
+
+[<Test>]
+let SomeItemTests() =
+    let mixed = [| 1; 2; "3"; null; "four"; 100 |]: obj array
+    let strings = [| "abc"; "bad"; "cab"; "bad"; "dad" |]
+    Assert.That(mixed, Has.Some.Null)
+    Assert.That(mixed, Has.Some.InstanceOf<int>())
+    Assert.That(mixed, Has.Some.InstanceOf<string>())
+    Assert.That(strings, Has.Some.StartsWith( "ba" ) )
+    Assert.That(strings, Has.Some.Not.StartsWith( "ba" ) )
+
+[<Test>]
+let NoItemTests() =
+    let ints = [| 1; 2; 3; 4; 5 |]
+    let strings = [| "abc"; "bad"; "cab"; "bad"; "dad" |]
+    Assert.That(ints, Has.None.Null)
+    Assert.That(ints, Has.None.InstanceOf<string>());
+    Assert.That(ints, Has.None.GreaterThan(99));
+    Assert.That(strings, Has.None.StartsWith( "qu" ) );
+
+[<Test>]
+let CollectionContainsTests() =
+    let iarray = [| 1; 2; 3 |]
+    let sarray = [| "a"; "b"; "c" |]
+
+    Assert.Contains(3, iarray)
+    Assert.Contains("b", sarray)
+    CollectionAssert.Contains(iarray, 3)
+    CollectionAssert.Contains(sarray, "b")
+    CollectionAssert.DoesNotContain(sarray, "x")
+    // Showing that Contains uses NUnit equality
+    CollectionAssert.Contains( iarray, 1.0 )
+
+    Assert.That(iarray, Has.Member(3))
+    Assert.That(sarray, Has.Member("b"))
+    Assert.That(sarray, Has.No.Member("x"))
+    // Showing that Contains uses NUnit equality
+    Assert.That(iarray, Has.Member( 1.0 ))
+
+    // Only available using the new syntax
+    // Note that EqualTo and SameAs do NOT give
+    // identical results to Contains because 
+    // Contains uses Object.Equals()
+    Assert.That(iarray, Has.Some.EqualTo(3))
+    Assert.That(iarray, Has.Member(3))
+    Assert.That(sarray, Has.Some.EqualTo("b"))
+    Assert.That(sarray, Has.None.EqualTo("x"))
+    Assert.That(iarray, Has.None.SameAs( 1.0 ))
+    Assert.That(iarray, Has.All.LessThan(10))
+    Assert.That(sarray, Has.All.Length.EqualTo(1))
+    Assert.That(sarray, Has.None.Property("Length").GreaterThan(3))
+
+[<Test>]
+let CollectionEquivalenceTests() =
+    let ints1to5 = [| 1; 2; 3; 4; 5 |]
+    let twothrees = [| 1; 2; 3; 3; 4; 5 |]
+    let twofours = [| 1; 2; 3; 4; 4; 5 |]
+
+    CollectionAssert.AreEquivalent( [| 2; 1; 4; 3; 5 |], ints1to5)
+    CollectionAssert.AreNotEquivalent( [| 2; 2; 4; 3; 5 |], ints1to5)
+    CollectionAssert.AreNotEquivalent( [| 2; 4; 3; 5 |], ints1to5)
+    CollectionAssert.AreNotEquivalent( [| 2; 2; 1; 1; 4; 3; 5 |], ints1to5)
+    CollectionAssert.AreNotEquivalent(twothrees, twofours)
+
+    Assert.That( [| 2; 1; 4; 3; 5 |], Is.EquivalentTo(ints1to5))
+    Assert.That( [| 2; 2; 4; 3; 5 |], Is.Not.EquivalentTo(ints1to5))
+    Assert.That( [| 2; 4; 3; 5 |], Is.Not.EquivalentTo(ints1to5))
+    Assert.That( [| 2; 2; 1; 1; 4; 3; 5 |], Is.Not.EquivalentTo(ints1to5))
+
+[<Test>]
+let SubsetTests() =
+    let ints1to5 = [| 1; 2; 3; 4; 5 |]
+
+    CollectionAssert.IsSubsetOf( [| 1; 3; 5 |], ints1to5)
+    CollectionAssert.IsSubsetOf( [| 1; 2; 3; 4; 5 |], ints1to5)
+    CollectionAssert.IsNotSubsetOf( [| 2; 4; 6 |], ints1to5)
+    CollectionAssert.IsNotSubsetOf( [| 1; 2; 2; 2; 5 |], ints1to5)
+
+    Assert.That( [| 1; 3; 5 |], Is.SubsetOf(ints1to5))
+    Assert.That( [| 1; 2; 3; 4; 5 |], Is.SubsetOf(ints1to5))
+    Assert.That( [| 2; 4; 6 |], Is.Not.SubsetOf(ints1to5))
+
+[<Test>]
+let PropertyTests() =
+    let array = [| "abc"; "bca"; "xyz"; "qrs" |]
+    let array2 = [| "a"; "ab"; "abc" |]
+    let list = new System.Collections.ArrayList( array )
+
+    Assert.That( list, Has.Property( "Count" ) )
+    Assert.That( list, Has.No.Property( "Length" ) )
+
+    Assert.That( "Hello", Has.Length.EqualTo( 5 ) )
+    Assert.That( "Hello", Has.Length.LessThan( 10 ) )
+    Assert.That( "Hello", Has.Property("Length").EqualTo(5) )
+    Assert.That( "Hello", Has.Property("Length").GreaterThan(3) )
+
+    Assert.That( array, Has.Property( "Length" ).EqualTo( 4 ) )
+    Assert.That( array, Has.Length.EqualTo( 4 ) )
+    Assert.That( array, Has.Property( "Length" ).LessThan( 10 ) )
+
+    Assert.That( array, Has.All.Property("Length").EqualTo(3) )
+    Assert.That( array, Has.All.Length.EqualTo( 3 ) )
+    Assert.That( array, Is.All.Length.EqualTo( 3 ) )
+    Assert.That( array, Has.All.Property("Length").EqualTo(3) )
+    Assert.That( array, Is.All.Property("Length").EqualTo(3) )
+
+    Assert.That( array2, Has.Some.Property("Length").EqualTo(2) )
+    Assert.That( array2, Has.Some.Length.EqualTo(2) )
+    Assert.That( array2, Has.Some.Property("Length").GreaterThan(2) )
+
+    Assert.That( array2, Is.Not.Property("Length").EqualTo(4) )
+    Assert.That( array2, Is.Not.Length.EqualTo( 4 ) )
+    Assert.That( array2, Has.No.Property("Length").GreaterThan(3) )
+
+    Assert.That( List.Map( array2 ).Property("Length"), Is.EqualTo( [| 1; 2; 3 |] ) )
+    Assert.That( List.Map( array2 ).Property("Length"), Is.EquivalentTo( [| 3; 2; 1 |] ) )
+    Assert.That( List.Map( array2 ).Property("Length"), Is.SubsetOf( [| 1; 2; 3; 4; 5 |] ) )
+    Assert.That( List.Map( array2 ).Property("Length"), Is.Unique )
+
+    Assert.That( list, Has.Count.EqualTo( 4 ) )
+
+[<Test>]
+let NotTests() =
+    Assert.That(42, Is.Not.Null)
+    Assert.That(42, Is.Not.True)
+    Assert.That(42, Is.Not.False)
+    Assert.That(2.5, Is.Not.NaN)
+    Assert.That(2 + 2, Is.Not.EqualTo(3))
+    Assert.That(2 + 2, Is.Not.Not.EqualTo(4))
+    Assert.That(2 + 2, Is.Not.Not.Not.EqualTo(5))
diff --git a/samples/fsharp/syntax/fs-syntax.build b/samples/fsharp/syntax/fs-syntax.build
new file mode 100644
index 0000000..b660cad
--- /dev/null
+++ b/samples/fsharp/syntax/fs-syntax.build
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<project name="fs-syntax" default="build">
+
+  <include buildfile="../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="AssertSyntaxTests.fs" />
+  </patternset>
+
+</project>
\ No newline at end of file
diff --git a/samples/fsharp/syntax/fs-syntax.fsproj b/samples/fsharp/syntax/fs-syntax.fsproj
new file mode 100644
index 0000000..dc5fde7
--- /dev/null
+++ b/samples/fsharp/syntax/fs-syntax.fsproj
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5de001e7-2606-4dfe-8c03-90c70d2c3805}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>syntax</RootNamespace>
+    <AssemblyName>syntax</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <Name>syntax</Name>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <Tailcalls>false</Tailcalls>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <WarningLevel>3</WarningLevel>
+    <DocumentationFile>bin\Debug\syntax.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <Tailcalls>true</Tailcalls>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <WarningLevel>3</WarningLevel>
+    <DocumentationFile>bin\Release\syntax.XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="FSharp.Core" />
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" />
+    <Reference Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssertSyntaxTests.fs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\FSharp\1.0\Microsoft.FSharp.Targets" Condition="!Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
+  <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" Condition=" Exists('$(MSBuildBinPath)\Microsoft.Build.Tasks.v4.0.dll')" />
+  <!-- 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/samples/jsharp/failures/AssemblyInfo.jsl b/samples/jsharp/failures/AssemblyInfo.jsl
deleted file mode 100644
index 4245ffd..0000000
--- a/samples/jsharp/failures/AssemblyInfo.jsl
+++ /dev/null
@@ -1,58 +0,0 @@
-import System.Reflection.*;
-import System.Runtime.CompilerServices.*;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-/** @assembly AssemblyTitle("") */
-/** @assembly AssemblyDescription("") */
-/** @assembly AssemblyConfiguration("") */
-/** @assembly AssemblyCompany("") */
-/** @assembly AssemblyProduct("") */
-/** @assembly AssemblyCopyright("") */
-/** @assembly AssemblyTrademark("") */
-/** @assembly AssemblyCulture("") */
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build
-// Numbers by using the '*' as shown below:
-
-/** @assembly AssemblyVersion("2.2.0.0") */
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project directory. For example, if your KeyFile is
-//       located in the project directory itself, you would specify the
-//       AssemblyKeyFile attribute as @assembly AssemblyKeyFile("mykey.snk")
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-
-/** @assembly AssemblyDelaySign(false) */
-/** @assembly AssemblyKeyFile("") */
-/** @assembly AssemblyKeyName("") */
diff --git a/samples/jsharp/failures/JSharpTest.jsl b/samples/jsharp/failures/JSharpTest.jsl
deleted file mode 100644
index 46fdcc6..0000000
--- a/samples/jsharp/failures/JSharpTest.jsl
+++ /dev/null
@@ -1,65 +0,0 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org/?p=license&r=2.4.
-// ****************************************************************
-
-package NUnit.Samples;
-
-import System.*;
-import NUnit.Framework.Assert;
-
-/** @attribute NUnit.Framework.TestFixture() */
-public class SimpleJSharpTest
-{
-	protected int fValue1;
-	protected int fValue2;
-
-	/** @attribute NUnit.Framework.SetUp() */
-	public void Init()
-	{
-		fValue1 = 2;
-		fValue2 = 3;
-	}
-
-	/** @attribute NUnit.Framework.Test() */
-	public void Add() 
-	{
-		int result= fValue1 + fValue2;
-		Assert.AreEqual(6,result, "Expected Failure");
-	}
-
-	/** @attribute NUnit.Framework.Test() */
-	public void DivideByZero() 
-	{
-		int zero= 0;
-		int result = 8/zero;
-		KeepCompilerFromWarning(result); // never executed, here to avoid compiler warning that result is unused.
-	}
-
-	/** @attribute NUnit.Framework.Test() */
-	public void Equals() 
-	{
-		Assert.AreEqual(12, 12, "Integer");
-		Assert.AreEqual(new Long(12), new Long(13), "Long");
-		Assert.AreEqual('a', 'a', "Char");
-		Assert.AreEqual(new Integer(12), new Integer(12), "Integer Object Cast");
-            
-		Assert.AreEqual(12, 13, "Expected Failure (Integer)");
-		Assert.AreEqual(12.0, 11.99, 0.0, "Expected Failure (Double).");
-	}
-
-	/** @attribute NUnit.Framework.Test() */
-	/** @attribute NUnit.Framework.Ignore("ignored test") */
-	public void IgnoredTest()
-	{
-		throw new InvalidCastException();
-	}
-
-	// A useless function, designed to avoid a compiler warning in the the DivideByZero test.
-	private int KeepCompilerFromWarning(int dummy)
-	{
-		return dummy;
-	}
-
-}
\ No newline at end of file
diff --git a/samples/jsharp/failures/jsharp-failures.build b/samples/jsharp/failures/jsharp-failures.build
deleted file mode 100644
index a4b2f60..0000000
--- a/samples/jsharp/failures/jsharp-failures.build
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0"?>
-<project name="jsharp-failures" default="build">
-
-  <include buildfile="../../samples.common" />
-  
-  <patternset id="source-files">
-    <include name="AssemblyInfo.jsl" />
-    <include name="JSharpTest.jsl" />
-  </patternset>
-
-</project>
\ No newline at end of file
diff --git a/samples/jsharp/failures/jsharp-failures.vjsproj b/samples/jsharp/failures/jsharp-failures.vjsproj
deleted file mode 100644
index 0baa0ce..0000000
--- a/samples/jsharp/failures/jsharp-failures.vjsproj
+++ /dev/null
@@ -1,21 +0,0 @@
-<VisualStudioProject>
-  <VISUALJSHARP ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{B55A6E53-57A9-4205-B396-C9983B3AF46A}">
-    <Build>
-      <Settings AssemblyKeyContainerName="" AssemblyName="jsharp-failures" AssemblyOriginatorKeyFile="" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" OutputType="Library" PreBuildEvent="" PostBuildEvent="" RootNamespace="jsharp" RunPostBuildEvent="OnBuildSuccess" StartupObject="">
-        <Config Name="Debug" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="DEBUG;TRACE" DebugSymbols="true" NoWarn="" Optimize="false" OutputPath="bin\Debug\" RegisterForComInterop="false" TreatWarningsAsErrors="false" WarningLevel="4" AdditionalOptions="" />
-        <Config Name="Release" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="TRACE" DebugSymbols="false" NoWarn="" Optimize="true" OutputPath="bin\Release\" RegisterForComInterop="false" TreatWarningsAsErrors="false" WarningLevel="4" AdditionalOptions="" />
-      </Settings>
-      <References>
-        <Reference Name="vjslib" AssemblyName="vjslib" />
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.jsl" SubType="Code" BuildAction="Compile" />
-        <File RelPath="JSharpTest.jsl" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </VISUALJSHARP>
-</VisualStudioProject>
\ No newline at end of file
diff --git a/samples/jsharp/jsharp.sln b/samples/jsharp/jsharp.sln
deleted file mode 100644
index ee00c2a..0000000
--- a/samples/jsharp/jsharp.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "jsharp-failures", "failures\jsharp-failures.vjsproj", "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.ActiveCfg = Debug|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.Build.0 = Debug|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.ActiveCfg = Release|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.Build.0 = Release|.NET
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
diff --git a/samples/samples.common b/samples/samples.common
index 27f743d..d60ff2f 100644
--- a/samples/samples.common
+++ b/samples/samples.common
@@ -1,311 +1,263 @@
-<?xml version="1.0"?>
-<project>
-
-  <property name="project.base" value="${project::get-base-directory()}" />
-
-  <property name="samples.base" value="${path::get-full-path('../..')}" />
-  <!-- Duplicate the following if more levels are added -->te
-  <property name="samples.base" value="${path::get-full-path('../../..')}"
-            unless="${path::get-file-name(samples.base)=='samples'}" />
-
-  <property name="output.dir" value="${samples.base}/bin" />
-
-  <property name="nunit.bin.dir"
-            value="${path::combine(path::get-directory-name(samples.base), 'bin')}" />
-  <property name="nunit.framework.dll"
-            value="${path::combine(nunit.bin.dir,'net-1.1/framework/nunit.framework.dll')}" />
-  <property name="nunit.core.dll"
-            value="${path::combine(nunit.bin.dir,'net-1.1/nunit.core.dll')}" />
-  <property name="nunit.core.interfaces.dll"
-            value="${path::combine(nunit.bin.dir,'net-1.1/nunit.core.interfaces.dll')}" />
-
-  <property name="sample" value="${project::get-name()}"
-            unless="${property::exists('sample')}"/>
-  <property name="sample.dll" value="${sample}.dll" />
-
-  <property name="sample.type"
-          value="${path::get-file-name(path::get-directory-name(project.base))}" />
-  <property name="sample.type" value="addin" if="${sample.type=='Core'}" />
-
-  <if test="${directory::exists(path::combine(project.base, 'Tests'))}" >
-    <property name="tests" value="${sample}Tests"
-          unless="${property::exists('tests')}" />
-    <property name="test.dll" value="${tests}.dll" />
-  </if>
-  
-  <property name="nunit.build" value="false"
-    unless="${property::exists('project.package.dir')}"/>
-  <property name="nunit.build" value="true" 
-    if="${property::exists('project.package.dir')}"/>
-
-  <property name="build.debug" value="true"
-            unless="${property::exists('build.debug')}" />
-
-  <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">
-
-    <delete file="${output.dir}/${sample.dll}" />
-    <delete file="${output.dir}/${sample}.pdb" />
-
-    <if test="${property::exists('test.dll')}">
-      <delete file="${output.dir}/${test.dll}" />
-      <delete file="${output.dir}/${path::change-extension(test.dll, '.pdb')}" />
-    </if>
-
-  </target>
-
-  <target name="init">
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-
-    <copy file="${nunit.framework.dll}" todir="${output.dir}"
-          if="${not nunit.build and file::exists(nunit.framework.dll)}" />
-
-  </target>
-
-  <target name="init-addin">
-
-    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
-
-    <copy file="${nunit.core.dll}" todir="${output.dir}"
-          if="${not nunit.build and file::exists(nunit.core.dll)}" />
-    <copy file="${nunit.core.interfaces.dll}" todir="${output.dir}"
-          if="${not nunit.build and file::exists(nunit.core.interfaces.dll)}" />
-
-  </target>
-
-  <target name="build" Description="Build the sample">
-    <call target="build-${sample.type}"/>
-  </target>
-  
-  <target name="build-csharp" depends="init">
-
-    <csc target="library" output="${output.dir}/${sample.dll}" debug="${build.debug}">
-      <sources>
-        <patternset refid="source-files"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </csc>
-
-  </target>
-
-  <target name="build-addin" depends="init-addin">
-
-    <csc target="library" output="${output.dir}/${sample}.dll" debug="${build.debug}">
-      <sources>
-        <patternset refid="source-files"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.core.interfaces.dll" />
-        <include name="nunit.core.dll" />
-      </references>
-    </csc>
-
-    <call target="build-addin-test" if="${property::exists('test.dll')}" />
-
-  </target>
-
-  <target name="build-addin-test">
-
-    <csc target="library" output="${output.dir}/${test.dll}" debug="${build.debug}">
-      <sources basedir="Tests">
-        <patternset refid="test-files"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-        <include name="${sample}.dll" />
-      </references>
-    </csc>
-
-  </target>
-
-  <target name="build-vb" depends="init">
-
-    <vbc target="library"
-        output="${output.dir}/${sample.dll}" debug="${build.debug}">
-      <imports>
-        <import namespace="System"/>
-        <import namespace="System.Collections"/>
-      </imports>
-      <sources>
-        <patternset refid="source-files"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="System.dll" />
-        <include name="nunit.framework.dll" />
-      </references>
-    </vbc>
-
-  </target>
-
-  <target name="build-jsharp" depends="init">
-
-    <vjc target="library" output="${output.dir}/${sample.dll}" debug="${build.debug}">
-      <sources>
-        <patternset refid="source-files"/>
-      </sources>
-      <references basedir="${output.dir}">
-        <include name="nunit.framework.dll" />
-      </references>
-    </vjc>
-
-  </target>
-
-  <target name="build-managed" depends="init">
-
-    <readregistry property="vs.2003.path"
-      key="Software\Microsoft\VisualStudio\7.1\InstallDir"
-      hive="LocalMachine" failonerror="false"
-      unless="${property::exists( 'vs.2003.path' )}"/>
-
-    <fail message="VS 2003 must be installed to build this sample"
-      unless="${property::exists( 'vs.2003.path' )}"/>
-
-    <exec program="devenv.exe" basedir="${vs.2003.path}" workingdir="."
-      commandline="${sample}.vcproj /build ${build.config} /out ${output.dir}/${sample.dll}" />
-
-  </target>
-
-  <target name="build-cpp-cli" depends="init">
-
-    <readregistry property="vs.2005.path"
-      key="Software\Microsoft\VisualStudio\8.0\InstallDir"
-      hive="LocalMachine" failonerror="false"
-      unless="${property::exists( 'vs.2005.path' )}"/>
-
-    <fail message="VS 2005 must be installed to build this sample"
-      unless="${property::exists( 'vs.2005.path' )}"/>
-
-    <exec program="devenv.exe"
-      basedir="${vs.2005.path}" workingdir="."
-      commandline="${sample}.vcproj /build ${build.config} /out ${output.dir}/${sample.dll}"/>
-
-  </target>
-
-  <!-- ************************************************************* -->
-  <!-- Package targets are only used by the NUnit build script in    -->
-  <!-- order to package the samples for distribution.                -->
-  <!-- ************************************************************* -->
-  
-  <target name="package">
-
-    <fail message="Can't use package target directly - it must be called from the NUnit build script."
-          unless="${nunit.build}"/>
-
-    <property name="sample.path"
-              value="${string::replace(project.base, samples.base, package.samples.dir)}" />
-
-    <call target="package-${sample.type}" />
-
-  </target>
-
-  <target name="package-csharp">
-
-    <property name="sample.proj" value="${sample}.csproj" />
-
-    <call target="copy-source-files" />
-    <call target="update-framework-ref" />
-
-  </target>
-
-  <target name="package-jsharp">
-    
-    <property name="sample.proj" value="${sample}.vjsproj" />
-
-    <call target="copy-source-files" />
-    <call target="update-framework-ref" />
-
-  </target>
-
-  <target name="update-framework-ref">
-    
-    <xmlpoke
-      file="${sample.path}/${sample.proj}"
-      xpath="/VisualStudioProject/*/Build/References/Reference[@Name='nunit.framework']/@HintPath"
-      value="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-
-  </target>
-
-  <target name="package-vb">
-    
-    <property name="sample.proj" value="${sample}.vbproj" />
-
-    <call target="copy-source-files" />
-    <call target="update-framework-ref" />
-
-  </target>
-
-  <target name="package-managed">
-    
-    <property name="sample.proj" value="${sample}.vcproj" />
-
-    <call target="copy-source-files" />
-
-    <copy todir="${package.samples.dir}/cpp/managed/failures"
-        file="./cpp-managed-failures.vcproj">
-      <filterchain>
-        <replacestring from="$(SolutionDir)..\..\..\src\NUnitFramework\framework\bin\Debug\nunit.framework.dll"
-          to="..\..\..\..\bin\nunit.framework.dll"/>
-      </filterchain>
-    </copy>
-
-  </target>
-
-  <target name="package-cpp-cli">
-    
-    <property name="sample.proj" value="${sample}.vcproj" />
-
-    <call target="copy-source-files" />
-
-    <xmlpoke
-      file="${sample.path}/${sample.proj}"
-      xpath="/VisualStudioProject/References/AssemblyReference[@AssemblyName='nunit.framework']/@RelativePath"
-      value="..\..\..\..\bin\net-2.0\framework\nunit.framework.dll" />
-
-  </target>
-
-  <target name="package-addin">
-    
-    <property name="sample.proj" value="${sample}.csproj" />
-
-    <call target="copy-source-files" />
-    <call target="copy-test-files" 
-      if="${property::exists('test.dll')}"/>
-
-  </target>
-
-  <target name="copy-source-files">
-
-    <copy todir="${sample.path}" includeemptydirs="false">
-      <fileset basedir=".">
-        <include name="${sample.proj}" />
-        <include name="${sample}.build" />
-        <include name="Readme.txt" />
-        <patternset refid="source-files" />
-      </fileset>
-    </copy>
-
-  </target>
-
-  <target name="copy-test-files">
-
-    <copy todir="${sample.path}/Tests" includeemptydirs="false">
-      <fileset basedir="Tests">
-        <include name="${sample}Tests.csproj" />
-        <include name="${sample}Tests.build" />
-        <patternset refid="test-files" />
-      </fileset>
-    </copy>
-
-  </target>
-
+<?xml version="1.0"?>
+<project>
+
+  <property name="project.base" value="${project::get-base-directory()}" />
+
+  <property name="samples.base" value="${path::get-full-path('../..')}" />
+  <!-- Duplicate the following if more levels are added -->te
+  <property name="samples.base" value="${path::get-full-path('../../..')}"
+            unless="${path::get-file-name(samples.base)=='samples'}" />
+
+  <property name="output.dir" value="${samples.base}/bin" />
+
+  <property name="nunit.bin.dir"
+            value="${path::combine(path::get-directory-name(samples.base), 'bin')}" />
+  <property name="nunit.framework.dll"
+            value="${path::combine(nunit.bin.dir,'net-1.1/framework/nunit.framework.dll')}" />
+  <property name="nunit.core.dll"
+            value="${path::combine(nunit.bin.dir,'net-1.1/nunit.core.dll')}" />
+  <property name="nunit.core.interfaces.dll"
+            value="${path::combine(nunit.bin.dir,'net-1.1/nunit.core.interfaces.dll')}" />
+
+  <property name="sample" value="${project::get-name()}"
+            unless="${property::exists('sample')}"/>
+  <property name="sample.dll" value="${sample}.dll" />
+
+  <property name="sample.type"
+          value="${path::get-file-name(path::get-directory-name(project.base))}" />
+  <property name="sample.type" value="addin" if="${sample.type=='Core'}" />
+
+  <if test="${directory::exists(path::combine(project.base, 'Tests'))}" >
+    <property name="tests" value="${sample}Tests"
+          unless="${property::exists('tests')}" />
+    <property name="test.dll" value="${tests}.dll" />
+  </if>
+  
+  <property name="nunit.build" value="false"
+    unless="${property::exists('project.package.dir')}"/>
+  <property name="nunit.build" value="true" 
+    if="${property::exists('project.package.dir')}"/>
+
+  <property name="build.debug" value="true"
+            unless="${property::exists('build.debug')}" />
+
+  <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">
+
+    <delete file="${output.dir}/${sample.dll}" />
+    <delete file="${output.dir}/${sample}.pdb" />
+
+    <if test="${property::exists('test.dll')}">
+      <delete file="${output.dir}/${test.dll}" />
+      <delete file="${output.dir}/${path::change-extension(test.dll, '.pdb')}" />
+    </if>
+
+  </target>
+
+  <target name="init">
+
+    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
+
+    <copy file="${nunit.framework.dll}" todir="${output.dir}"
+          if="${not nunit.build and file::exists(nunit.framework.dll)}" />
+
+  </target>
+
+  <target name="init-addin">
+
+    <mkdir dir="${output.dir}" unless="${directory::exists(output.dir)}" />
+
+    <copy file="${nunit.core.dll}" todir="${output.dir}"
+          if="${not nunit.build and file::exists(nunit.core.dll)}" />
+    <copy file="${nunit.core.interfaces.dll}" todir="${output.dir}"
+          if="${not nunit.build and file::exists(nunit.core.interfaces.dll)}" />
+
+  </target>
+
+  <target name="build" Description="Build the sample">
+    <call target="build-${sample.type}"/>
+  </target>
+  
+  <target name="build-csharp" depends="init">
+
+    <csc target="library" output="${output.dir}/${sample.dll}" debug="${build.debug}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.framework.dll" />
+      </references>
+    </csc>
+
+  </target>
+
+  <target name="build-fsharp" depends="init">
+
+    <property name="fsc.path" value="C:/Program Files/Microsoft SDKs/F#/3.0/Framework/v4.0/fsc.exe"/>
+
+    <echo message="F# Build not yet supported"/>
+
+  </target>
+
+  <target name="build-addin" depends="init-addin">
+
+    <csc target="library" output="${output.dir}/${sample}.dll" debug="${build.debug}">
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.core.interfaces.dll" />
+        <include name="nunit.core.dll" />
+      </references>
+    </csc>
+
+    <call target="build-addin-test" if="${property::exists('test.dll')}" />
+
+  </target>
+
+  <target name="build-addin-test">
+
+    <csc target="library" output="${output.dir}/${test.dll}" debug="${build.debug}">
+      <sources basedir="Tests">
+        <patternset refid="test-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="nunit.framework.dll" />
+        <include name="${sample}.dll" />
+      </references>
+    </csc>
+
+  </target>
+
+  <target name="build-vb" depends="init">
+
+    <vbc target="library"
+        output="${output.dir}/${sample.dll}" debug="${build.debug}">
+      <imports>
+        <import namespace="System"/>
+        <import namespace="System.Collections"/>
+      </imports>
+      <sources>
+        <patternset refid="source-files"/>
+      </sources>
+      <references basedir="${output.dir}">
+        <include name="System.dll" />
+        <include name="nunit.framework.dll" />
+      </references>
+    </vbc>
+
+  </target>
+
+  <target name="build-cpp" depends="init,set-vs-path">
+
+    <fail message="Visual Studio 2010 must be installed to build this sample"
+      unless="${property::exists( 'vs.2010.path' )}"/>
+
+    <exec program="devenv.exe"
+      basedir="${vs.2010.path}" 
+      workingdir="."
+      commandline="${sample}.vcxproj /build ${build.config} /out ${output.dir}/${sample.dll}"/>
+
+  </target>
+
+  <target name="set-vs-path">
+
+    <readregistry property="vs.2010.path"
+      key="Software\Microsoft\VisualStudio\10.0\InstallDir"
+      hive="LocalMachine" failonerror="false"
+      unless="${property::exists( 'vs.2010.path' )}"/>
+
+  </target>
+
+  <!-- ************************************************************* -->
+  <!-- Package targets are only used by the NUnit build script in    -->
+  <!-- order to package the samples for distribution.                -->
+  <!-- ************************************************************* -->
+  
+  <target name="package">
+
+    <fail message="Can't use package target directly - it must be called from the NUnit build script."
+          unless="${nunit.build}"/>
+
+    <property name="sample.path"
+              value="${string::replace(project.base, samples.base, package.samples.dir)}" />
+
+    <call target="package-${sample.type}" />
+
+  </target>
+
+  <target name="package-csharp">
+
+    <property name="sample.proj" value="${sample}.csproj" />
+
+    <call target="copy-source-files" />
+
+  </target>
+
+  <target name="package-fsharp">
+
+    <property name="sample.proj" value="${sample}.fsproj" />
+
+    <call target="copy-source-files" />
+
+  </target>
+
+  <target name="package-vb">
+    
+    <property name="sample.proj" value="${sample}.vbproj" />
+
+    <call target="copy-source-files" />
+
+  </target>
+
+  <target name="package-cpp">
+    
+    <property name="sample.proj" value="${sample}.vcxproj" />
+
+    <call target="copy-source-files" />
+
+  </target>
+
+  <target name="package-addin">
+    
+    <property name="sample.proj" value="${sample}.csproj" />
+
+    <call target="copy-source-files" />
+    <call target="copy-test-files" 
+      if="${property::exists('test.dll')}"/>
+
+  </target>
+
+  <target name="copy-source-files">
+
+    <copy todir="${sample.path}" includeemptydirs="false">
+      <fileset basedir=".">
+        <include name="${sample.proj}" />
+        <include name="${sample}.build" />
+        <include name="Readme.txt" />
+        <patternset refid="source-files" />
+      </fileset>
+    </copy>
+
+  </target>
+
+  <target name="copy-test-files">
+
+    <copy todir="${sample.path}/Tests" includeemptydirs="false">
+      <fileset basedir="Tests">
+        <include name="${sample}Tests.csproj" />
+        <include name="${sample}Tests.build" />
+        <patternset refid="test-files" />
+      </fileset>
+    </copy>
+
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/samples/vb/failures/AssemblyInfo.vb b/samples/vb/failures/AssemblyInfo.vb
index da3d973..3e9a34c 100644
--- a/samples/vb/failures/AssemblyInfo.vb
+++ b/samples/vb/failures/AssemblyInfo.vb
@@ -1,32 +1,32 @@
-Imports System.Reflection
-Imports 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.
-
-' Review the values of the assembly attributes
-
-<Assembly: AssemblyTitle("")> 
-<Assembly: AssemblyDescription("")> 
-<Assembly: AssemblyCompany("")> 
-<Assembly: AssemblyProduct("")> 
-<Assembly: AssemblyCopyright("")> 
-<Assembly: AssemblyTrademark("")> 
-<Assembly: CLSCompliant(True)> 
-
-'The following GUID is for the ID of the typelib if this project is exposed to COM
-<Assembly: Guid("592E12A6-DA65-4E00-BCE6-4AB403604F41")> 
-
-' 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("2.2.0.0")> 
-
+Imports System.Reflection
+Imports 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.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("")> 
+<Assembly: AssemblyCopyright("")> 
+<Assembly: AssemblyTrademark("")> 
+<Assembly: CLSCompliant(True)> 
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("592E12A6-DA65-4E00-BCE6-4AB403604F41")> 
+
+' 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("2.2.0.0")> 
+
diff --git a/samples/vb/failures/SimpleVBTest.vb b/samples/vb/failures/SimpleVBTest.vb
index ffea26a..d635671 100644
--- a/samples/vb/failures/SimpleVBTest.vb
+++ b/samples/vb/failures/SimpleVBTest.vb
@@ -1,60 +1,60 @@
-' ****************************************************************
-' This is free software licensed under the NUnit license. You
-' may obtain a copy of the license as well as information regarding
-' copyright ownership at http://nunit.org/?p=license&r=2.4.
-' ****************************************************************
-
-Option Explicit On 
-Imports System
-Imports NUnit.Framework
-
-Namespace NUnit.Samples
-
-    <TestFixture()> Public Class SimpleVBTest
-
-        Private fValue1 As Integer
-        Private fValue2 As Integer
-
-        Public Sub New()
-            MyBase.New()
-        End Sub
-
-        <SetUp()> Public Sub Init()
-            fValue1 = 2
-            fValue2 = 3
-        End Sub
-
-        <Test()> Public Sub Add()
-            Dim result As Double
-
-            result = fValue1 + fValue2
-            Assert.AreEqual(6, result)
-        End Sub
-
-        <Test()> Public Sub DivideByZero()
-            Dim zero As Integer
-            Dim result As Integer
-
-            zero = 0
-            result = 8 / zero
-        End Sub
-
-        <Test()> Public Sub TestEquals()
-            Assert.AreEqual(12, 12)
-            Assert.AreEqual(CLng(12), CLng(12))
-
-            Assert.AreEqual(12, 13, "Size")
-            Assert.AreEqual(12, 11.99, 0, "Capacity")
-        End Sub
-
-        <Test(), ExpectedException(GetType(Exception))> Public Sub ExpectAnException()
-            Throw New InvalidCastException()
-        End Sub
-
-        <Test(), Ignore("sample ignore")> Public Sub IgnoredTest()
-            ' does not matter what we type the test is not run
-            Throw New ArgumentException()
-        End Sub
-
-    End Class
+' ****************************************************************
+' 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
+' ****************************************************************
+
+Option Explicit On 
+Imports System
+Imports NUnit.Framework
+
+Namespace NUnit.Samples
+
+    <TestFixture()> Public Class SimpleVBTest
+
+        Private fValue1 As Integer
+        Private fValue2 As Integer
+
+        Public Sub New()
+            MyBase.New()
+        End Sub
+
+        <SetUp()> Public Sub Init()
+            fValue1 = 2
+            fValue2 = 3
+        End Sub
+
+        <Test()> Public Sub Add()
+            Dim result As Double
+
+            result = fValue1 + fValue2
+            Assert.AreEqual(6, result)
+        End Sub
+
+        <Test()> Public Sub DivideByZero()
+            Dim zero As Integer
+            Dim result As Integer
+
+            zero = 0
+            result = 8 / zero
+        End Sub
+
+        <Test()> Public Sub TestEquals()
+            Assert.AreEqual(12, 12)
+            Assert.AreEqual(CLng(12), CLng(12))
+
+            Assert.AreEqual(12, 13, "Size")
+            Assert.AreEqual(12, 11.99, 0, "Capacity")
+        End Sub
+
+        <Test(), ExpectedException(GetType(Exception))> Public Sub ExpectAnException()
+            Throw New InvalidCastException()
+        End Sub
+
+        <Test(), Ignore("sample ignore")> Public Sub IgnoredTest()
+            ' does not matter what we type the test is not run
+            Throw New ArgumentException()
+        End Sub
+
+    End Class
 End Namespace
\ No newline at end of file
diff --git a/samples/vb/failures/vb-failures.build b/samples/vb/failures/vb-failures.build
index 37ab1cb..1d89264 100644
--- a/samples/vb/failures/vb-failures.build
+++ b/samples/vb/failures/vb-failures.build
@@ -1,11 +1,11 @@
-<?xml version="1.0"?>
-<project name="vb-failures" default="build">
-
-  <include buildfile="../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.vb" />
-    <include name="SimpleVBTest.vb" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="vb-failures" default="build">
+
+  <include buildfile="../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.vb" />
+    <include name="SimpleVBTest.vb" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/vb/failures/vb-failures.vbproj b/samples/vb/failures/vb-failures.vbproj
index 4eff16b..1dbb61b 100644
--- a/samples/vb/failures/vb-failures.vbproj
+++ b/samples/vb/failures/vb-failures.vbproj
@@ -1,24 +1,127 @@
-<VisualStudioProject>
-  <VisualBasic ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{F199991B-6C8E-4AB0-9AAA-703CD4897700}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="vb-failures" AssemblyOriginatorKeyFile="" AssemblyOriginatorKeyMode="None" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" OptionCompare="Binary" OptionExplicit="On" OptionStrict="Off" RootNamespace="vb_failures" StartupObject="vb_failures.(None)">
-        <Config Name="Debug" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="" DefineDebug="true" DefineTrace="true" DebugSymbols="true" IncrementalBuild="true" Optimize="false" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="1" />
-        <Config Name="Release" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="" DefineDebug="false" DefineTrace="true" DebugSymbols="false" IncrementalBuild="false" Optimize="true" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="1" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-      <Imports>
-        <Import Namespace="Microsoft.VisualBasic" />
-        <Import Namespace="System" />
-      </Imports>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.vb" SubType="Code" BuildAction="Compile" />
-        <File RelPath="SimpleVBTest.vb" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </VisualBasic>
-</VisualStudioProject>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F199991B-6C8E-4AB0-9AAA-703CD4897700}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>vb-failures</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <AssemblyOriginatorKeyMode>None</AssemblyOriginatorKeyMode>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <OptionCompare>Binary</OptionCompare>
+    <OptionExplicit>On</OptionExplicit>
+    <OptionStrict>Off</OptionStrict>
+    <RootNamespace>vb_failures</RootNamespace>
+    <StartupObject>vb_failures.%28None%29</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <MyType>Windows</MyType>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <DocumentationFile>vb-failures.xml</DocumentationFile>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile />
+    <DefineConstants />
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <DocumentationFile>vb-failures.xml</DocumentationFile>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile />
+    <DefineConstants />
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>false</DebugSymbols>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
+    <DebugType>none</DebugType>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SimpleVBTest.vb">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="My Project\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/vb/money/AssemblyInfo.vb b/samples/vb/money/AssemblyInfo.vb
index f9ece7c..f929cbc 100644
--- a/samples/vb/money/AssemblyInfo.vb
+++ b/samples/vb/money/AssemblyInfo.vb
@@ -1,32 +1,32 @@
-Imports System
-Imports System.Reflection
-Imports 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.
-
-' Review the values of the assembly attributes
-
-<Assembly: AssemblyTitle("")> 
-<Assembly: AssemblyDescription("")> 
-<Assembly: AssemblyCompany("")> 
-<Assembly: AssemblyProduct("")> 
-<Assembly: AssemblyCopyright("")> 
-<Assembly: AssemblyTrademark("")> 
-<Assembly: CLSCompliant(True)> 
-
-'The following GUID is for the ID of the typelib if this project is exposed to COM
-<Assembly: Guid("F21BB3B6-0C5E-4AE5-ABC7-4D25FC3F98DB")> 
-
-' 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.*")> 
+Imports System
+Imports System.Reflection
+Imports 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.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("")> 
+<Assembly: AssemblyCopyright("")> 
+<Assembly: AssemblyTrademark("")> 
+<Assembly: CLSCompliant(True)> 
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("F21BB3B6-0C5E-4AE5-ABC7-4D25FC3F98DB")> 
+
+' 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.*")> 
diff --git a/samples/vb/money/IMoney.vb b/samples/vb/money/IMoney.vb
index 4562886..966da86 100644
--- a/samples/vb/money/IMoney.vb
+++ b/samples/vb/money/IMoney.vb
@@ -1,37 +1,37 @@
-' ****************************************************************
-' This is free software licensed under the NUnit license. You
-' may obtain a copy of the license as well as information regarding
-' copyright ownership at http://nunit.org/?p=license&r=2.4.
-' ****************************************************************
-
-Namespace NUnit.Samples
-
-    'The common interface for simple Monies and MoneyBags.
-    Public Interface IMoney
-
-        'Adds a money to this money
-        Function Add(ByVal m As IMoney) As IMoney
-
-        'Adds a simple Money to this money. This is a helper method for
-        'implementing double dispatch.
-        Function AddMoney(ByVal m As Money) As IMoney
-
-        'Adds a MoneyBag to this money. This is a helper method for
-        'implementing double dispatch.
-        Function AddMoneyBag(ByVal s As MoneyBag) As IMoney
-
-        'True if this money is zero.
-        ReadOnly Property IsZero() As Boolean
-
-        'Multiplies a money by the given factor.
-        Function Multiply(ByVal factor As Int32) As IMoney
-
-        'Negates this money.
-        Function Negate() As IMoney
-
-        'Subtracts a money from this money.
-        Function Subtract(ByVal m As IMoney) As IMoney
-
-    End Interface
-
-End Namespace
+' ****************************************************************
+' This is free software licensed under the NUnit license. You
+' may obtain a copy of the license as well as information regarding
+' copyright ownership at http://nunit.org
+' ****************************************************************
+
+Namespace NUnit.Samples
+
+    'The common interface for simple Monies and MoneyBags.
+    Public Interface IMoney
+
+        'Adds a money to this money
+        Function Add(ByVal m As IMoney) As IMoney
+
+        'Adds a simple Money to this money. This is a helper method for
+        'implementing double dispatch.
+        Function AddMoney(ByVal m As Money) As IMoney
+
+        'Adds a MoneyBag to this money. This is a helper method for
+        'implementing double dispatch.
+        Function AddMoneyBag(ByVal s As MoneyBag) As IMoney
+
+        'True if this money is zero.
+        ReadOnly Property IsZero() As Boolean
+
+        'Multiplies a money by the given factor.
+        Function Multiply(ByVal factor As Int32) As IMoney
+
+        'Negates this money.
+        Function Negate() As IMoney
+
+        'Subtracts a money from this money.
+        Function Subtract(ByVal m As IMoney) As IMoney
+
+    End Interface
+
+End Namespace
diff --git a/samples/vb/money/Money.vb b/samples/vb/money/Money.vb
index 13d7f6f..c31aa67 100644
--- a/samples/vb/money/Money.vb
+++ b/samples/vb/money/Money.vb
@@ -1,109 +1,109 @@
-' ****************************************************************
-' This is free software licensed under the NUnit license. You
-' may obtain a copy of the license as well as information regarding
-' copyright ownership at http://nunit.org/?p=license&r=2.4.
-' ****************************************************************
-
-Option Explicit On 
-
-Namespace NUnit.Samples
-
-    ' A Simple Money.
-    Public Class Money
-        Implements IMoney
-
-        Private fAmount As Int32
-        Private fCurrency As String
-
-        ' Constructs a money from a given amount and currency.
-        Public Sub New(ByVal amount As Int32, ByVal currency As String)
-            Me.fAmount = amount
-            Me.fCurrency = currency
-        End Sub
-
-
-        ' Adds a money to this money. Forwards the request
-        ' to the AddMoney helper.
-        Public Overloads Function Add(ByVal m As IMoney) As IMoney Implements IMoney.Add
-            Return m.AddMoney(Me)
-        End Function
-
-        Public Overloads Function AddMoney(ByVal m As Money) As IMoney Implements IMoney.AddMoney
-            If m.Currency.Equals(Currency) Then
-                Return New Money(Amount + m.Amount, Currency)
-            End If
-
-            Return New MoneyBag(Me, m)
-        End Function
-
-        Public Function AddMoneyBag(ByVal s As MoneyBag) As IMoney Implements IMoney.AddMoneyBag
-            Return s.AddMoney(Me)
-        End Function
-
-        Public ReadOnly Property Amount() As Integer
-            Get
-                Return fAmount
-            End Get
-        End Property
-
-        Public ReadOnly Property Currency() As String
-            Get
-                Return fCurrency
-            End Get
-        End Property
-
-        Public Overloads Overrides Function Equals(ByVal anObject As Object) As Boolean
-            If IsZero And TypeOf anObject Is IMoney Then
-                Dim aMoney As IMoney = anObject
-                Return aMoney.IsZero
-            End If
-
-            If TypeOf anObject Is Money Then
-                Dim aMoney As Money = anObject
-                If (IsZero) Then
-                    Return aMoney.IsZero
-                End If
-
-                Return Currency.Equals(aMoney.Currency) And Amount.Equals(aMoney.Amount)
-            End If
-
-            Return False
-        End Function
-
-        Public Overrides Function GetHashCode() As Int32
-            Return fCurrency.GetHashCode() + fAmount
-        End Function
-
-        Public ReadOnly Property IsZero() As Boolean Implements IMoney.IsZero
-            Get
-                Return Amount.Equals(0)
-            End Get
-        End Property
-
-        Public Function Multiply(ByVal factor As Integer) As IMoney Implements IMoney.Multiply
-
-            Return New Money(Amount * factor, Currency)
-
-        End Function
-
-        Public Function Negate() As IMoney Implements IMoney.Negate
-
-            Return New Money(-Amount, Currency)
-
-        End Function
-
-        Public Function Subtract(ByVal m As IMoney) As IMoney Implements IMoney.Subtract
-
-            Return Add(m.Negate())
-
-        End Function
-
-        Public Overrides Function ToString() As String
-
-            Return String.Format("[{0} {1}]", Amount, Currency)
-
-        End Function
-
-    End Class
-
-End Namespace
+' ****************************************************************
+' 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
+' ****************************************************************
+
+Option Explicit On 
+
+Namespace NUnit.Samples
+
+    ' A Simple Money.
+    Public Class Money
+        Implements IMoney
+
+        Private fAmount As Int32
+        Private fCurrency As String
+
+        ' Constructs a money from a given amount and currency.
+        Public Sub New(ByVal amount As Int32, ByVal currency As String)
+            Me.fAmount = amount
+            Me.fCurrency = currency
+        End Sub
+
+
+        ' Adds a money to this money. Forwards the request
+        ' to the AddMoney helper.
+        Public Overloads Function Add(ByVal m As IMoney) As IMoney Implements IMoney.Add
+            Return m.AddMoney(Me)
+        End Function
+
+        Public Overloads Function AddMoney(ByVal m As Money) As IMoney Implements IMoney.AddMoney
+            If m.Currency.Equals(Currency) Then
+                Return New Money(Amount + m.Amount, Currency)
+            End If
+
+            Return New MoneyBag(Me, m)
+        End Function
+
+        Public Function AddMoneyBag(ByVal s As MoneyBag) As IMoney Implements IMoney.AddMoneyBag
+            Return s.AddMoney(Me)
+        End Function
+
+        Public ReadOnly Property Amount() As Integer
+            Get
+                Return fAmount
+            End Get
+        End Property
+
+        Public ReadOnly Property Currency() As String
+            Get
+                Return fCurrency
+            End Get
+        End Property
+
+        Public Overloads Overrides Function Equals(ByVal anObject As Object) As Boolean
+            If IsZero And TypeOf anObject Is IMoney Then
+                Dim aMoney As IMoney = anObject
+                Return aMoney.IsZero
+            End If
+
+            If TypeOf anObject Is Money Then
+                Dim aMoney As Money = anObject
+                If (IsZero) Then
+                    Return aMoney.IsZero
+                End If
+
+                Return Currency.Equals(aMoney.Currency) And Amount.Equals(aMoney.Amount)
+            End If
+
+            Return False
+        End Function
+
+        Public Overrides Function GetHashCode() As Int32
+            Return fCurrency.GetHashCode() + fAmount
+        End Function
+
+        Public ReadOnly Property IsZero() As Boolean Implements IMoney.IsZero
+            Get
+                Return Amount.Equals(0)
+            End Get
+        End Property
+
+        Public Function Multiply(ByVal factor As Integer) As IMoney Implements IMoney.Multiply
+
+            Return New Money(Amount * factor, Currency)
+
+        End Function
+
+        Public Function Negate() As IMoney Implements IMoney.Negate
+
+            Return New Money(-Amount, Currency)
+
+        End Function
+
+        Public Function Subtract(ByVal m As IMoney) As IMoney Implements IMoney.Subtract
+
+            Return Add(m.Negate())
+
+        End Function
+
+        Public Overrides Function ToString() As String
+
+            Return String.Format("[{0} {1}]", Amount, Currency)
+
+        End Function
+
+    End Class
+
+End Namespace
diff --git a/samples/vb/money/MoneyBag.vb b/samples/vb/money/MoneyBag.vb
index bebb43c..f8dd688 100644
--- a/samples/vb/money/MoneyBag.vb
+++ b/samples/vb/money/MoneyBag.vb
@@ -1,164 +1,164 @@
-' ****************************************************************
-' This is free software licensed under the NUnit license. You
-' may obtain a copy of the license as well as information regarding
-' copyright ownership at http://nunit.org/?p=license&r=2.4.
-' ****************************************************************
-
-Option Explicit On 
-
-Namespace NUnit.Samples
-
-    Public Class MoneyBag
-        Implements IMoney
-
-        Private fmonies As ArrayList = New ArrayList(5)
-
-        Private Sub New()
-
-        End Sub
-
-        Public Sub New(ByVal bag As Money())
-            For Each m As Money In bag
-                If Not m.IsZero Then
-                    AppendMoney(m)
-                End If
-            Next
-        End Sub
-
-        Public Sub New(ByVal m1 As Money, ByVal m2 As Money)
-
-            AppendMoney(m1)
-            AppendMoney(m2)
-
-        End Sub
-
-        Public Sub New(ByVal m As Money, ByVal bag As MoneyBag)
-            AppendMoney(m)
-            AppendBag(bag)
-        End Sub
-
-        Public Sub New(ByVal m1 As MoneyBag, ByVal m2 As MoneyBag)
-            AppendBag(m1)
-            AppendBag(m2)
-        End Sub
-
-        Public Function Add(ByVal m As IMoney) As IMoney Implements IMoney.Add
-            Return m.AddMoneyBag(Me)
-        End Function
-
-        Public Function AddMoney(ByVal m As Money) As IMoney Implements IMoney.AddMoney
-            Return New MoneyBag(m, Me).Simplify
-        End Function
-
-        Public Function AddMoneyBag(ByVal s As MoneyBag) As IMoney Implements IMoney.AddMoneyBag
-            Return New MoneyBag(s, Me).Simplify()
-        End Function
-
-        Private Sub AppendBag(ByVal aBag As MoneyBag)
-            For Each m As Money In aBag.fmonies
-                AppendMoney(m)
-            Next
-        End Sub
-
-        Private Sub AppendMoney(ByVal aMoney As Money)
-
-            Dim old As Money = FindMoney(aMoney.Currency)
-            If old Is Nothing Then
-                fmonies.Add(aMoney)
-                Return
-            End If
-            fmonies.Remove(old)
-            Dim sum As IMoney = old.Add(aMoney)
-            If (sum.IsZero) Then
-                Return
-            End If
-            fmonies.Add(sum)
-        End Sub
-
-        Private Function Contains(ByVal aMoney As Money) As Boolean
-            Dim m As Money = FindMoney(aMoney.Currency)
-            Return m.Amount.Equals(aMoney.Amount)
-        End Function
-
-        Public Overloads Overrides Function Equals(ByVal anObject As Object) As Boolean
-            If IsZero Then
-                If TypeOf anObject Is IMoney Then
-                    Dim aMoney As IMoney = anObject
-                    Return aMoney.IsZero
-                End If
-            End If
-
-            If TypeOf anObject Is MoneyBag Then
-                Dim aMoneyBag As MoneyBag = anObject
-                If Not aMoneyBag.fmonies.Count.Equals(fmonies.Count) Then
-                    Return False
-                End If
-
-                For Each m As Money In fmonies
-                    If Not aMoneyBag.Contains(m) Then
-                        Return False
-                    End If
-
-                    Return True
-                Next
-            End If
-
-            Return False
-        End Function
-
-        Private Function FindMoney(ByVal currency As String) As Money
-            For Each m As Money In fmonies
-                If m.Currency.Equals(currency) Then
-                    Return m
-                End If
-            Next
-
-            Return Nothing
-        End Function
-
-        Public Overrides Function GetHashCode() As Int32
-            Dim hash As Int32 = 0
-            For Each m As Money In fmonies
-                hash += m.GetHashCode()
-            Next
-            Return hash
-        End Function
-
-        Public ReadOnly Property IsZero() As Boolean Implements IMoney.IsZero
-            Get
-                Return fmonies.Count.Equals(0)
-            End Get
-        End Property
-
-        Public Function Multiply(ByVal factor As Integer) As IMoney Implements IMoney.Multiply
-            Dim result As New MoneyBag
-            If Not factor.Equals(0) Then
-                For Each m As Money In fmonies
-                    result.AppendMoney(m.Multiply(factor))
-                Next
-            End If
-            Return result
-        End Function
-
-        Public Function Negate() As IMoney Implements IMoney.Negate
-            Dim result As New MoneyBag
-            For Each m As Money In fmonies
-                result.AppendMoney(m.Negate())
-            Next
-            Return result
-        End Function
-
-        Private Function Simplify() As IMoney
-            If fmonies.Count.Equals(1) Then
-                Return fmonies(0)
-            End If
-            Return Me
-        End Function
-
-
-        Public Function Subtract(ByVal m As IMoney) As IMoney Implements IMoney.Subtract
-            Return Add(m.Negate())
-        End Function
-    End Class
-
-End Namespace
+' ****************************************************************
+' 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
+' ****************************************************************
+
+Option Explicit On 
+
+Namespace NUnit.Samples
+
+    Public Class MoneyBag
+        Implements IMoney
+
+        Private fmonies As ArrayList = New ArrayList(5)
+
+        Private Sub New()
+
+        End Sub
+
+        Public Sub New(ByVal bag As Money())
+            For Each m As Money In bag
+                If Not m.IsZero Then
+                    AppendMoney(m)
+                End If
+            Next
+        End Sub
+
+        Public Sub New(ByVal m1 As Money, ByVal m2 As Money)
+
+            AppendMoney(m1)
+            AppendMoney(m2)
+
+        End Sub
+
+        Public Sub New(ByVal m As Money, ByVal bag As MoneyBag)
+            AppendMoney(m)
+            AppendBag(bag)
+        End Sub
+
+        Public Sub New(ByVal m1 As MoneyBag, ByVal m2 As MoneyBag)
+            AppendBag(m1)
+            AppendBag(m2)
+        End Sub
+
+        Public Function Add(ByVal m As IMoney) As IMoney Implements IMoney.Add
+            Return m.AddMoneyBag(Me)
+        End Function
+
+        Public Function AddMoney(ByVal m As Money) As IMoney Implements IMoney.AddMoney
+            Return New MoneyBag(m, Me).Simplify
+        End Function
+
+        Public Function AddMoneyBag(ByVal s As MoneyBag) As IMoney Implements IMoney.AddMoneyBag
+            Return New MoneyBag(s, Me).Simplify()
+        End Function
+
+        Private Sub AppendBag(ByVal aBag As MoneyBag)
+            For Each m As Money In aBag.fmonies
+                AppendMoney(m)
+            Next
+        End Sub
+
+        Private Sub AppendMoney(ByVal aMoney As Money)
+
+            Dim old As Money = FindMoney(aMoney.Currency)
+            If old Is Nothing Then
+                fmonies.Add(aMoney)
+                Return
+            End If
+            fmonies.Remove(old)
+            Dim sum As IMoney = old.Add(aMoney)
+            If (sum.IsZero) Then
+                Return
+            End If
+            fmonies.Add(sum)
+        End Sub
+
+        Private Function Contains(ByVal aMoney As Money) As Boolean
+            Dim m As Money = FindMoney(aMoney.Currency)
+            Return m.Amount.Equals(aMoney.Amount)
+        End Function
+
+        Public Overloads Overrides Function Equals(ByVal anObject As Object) As Boolean
+            If IsZero Then
+                If TypeOf anObject Is IMoney Then
+                    Dim aMoney As IMoney = anObject
+                    Return aMoney.IsZero
+                End If
+            End If
+
+            If TypeOf anObject Is MoneyBag Then
+                Dim aMoneyBag As MoneyBag = anObject
+                If Not aMoneyBag.fmonies.Count.Equals(fmonies.Count) Then
+                    Return False
+                End If
+
+                For Each m As Money In fmonies
+                    If Not aMoneyBag.Contains(m) Then
+                        Return False
+                    End If
+
+                    Return True
+                Next
+            End If
+
+            Return False
+        End Function
+
+        Private Function FindMoney(ByVal currency As String) As Money
+            For Each m As Money In fmonies
+                If m.Currency.Equals(currency) Then
+                    Return m
+                End If
+            Next
+
+            Return Nothing
+        End Function
+
+        Public Overrides Function GetHashCode() As Int32
+            Dim hash As Int32 = 0
+            For Each m As Money In fmonies
+                hash += m.GetHashCode()
+            Next
+            Return hash
+        End Function
+
+        Public ReadOnly Property IsZero() As Boolean Implements IMoney.IsZero
+            Get
+                Return fmonies.Count.Equals(0)
+            End Get
+        End Property
+
+        Public Function Multiply(ByVal factor As Integer) As IMoney Implements IMoney.Multiply
+            Dim result As New MoneyBag
+            If Not factor.Equals(0) Then
+                For Each m As Money In fmonies
+                    result.AppendMoney(m.Multiply(factor))
+                Next
+            End If
+            Return result
+        End Function
+
+        Public Function Negate() As IMoney Implements IMoney.Negate
+            Dim result As New MoneyBag
+            For Each m As Money In fmonies
+                result.AppendMoney(m.Negate())
+            Next
+            Return result
+        End Function
+
+        Private Function Simplify() As IMoney
+            If fmonies.Count.Equals(1) Then
+                Return fmonies(0)
+            End If
+            Return Me
+        End Function
+
+
+        Public Function Subtract(ByVal m As IMoney) As IMoney Implements IMoney.Subtract
+            Return Add(m.Negate())
+        End Function
+    End Class
+
+End Namespace
diff --git a/samples/vb/money/MoneyTest.vb b/samples/vb/money/MoneyTest.vb
index 4df897f..c178f0c 100644
--- a/samples/vb/money/MoneyTest.vb
+++ b/samples/vb/money/MoneyTest.vb
@@ -1,216 +1,216 @@
-' ****************************************************************
-' This is free software licensed under the NUnit license. You
-' may obtain a copy of the license as well as information regarding
-' copyright ownership at http://nunit.org/?p=license&r=2.4.
-' ****************************************************************
-
-Option Explicit On 
-
-Imports System
-Imports NUnit.Framework
-
-Namespace NUnit.Samples
-
-    <TestFixture()> _
-    Public Class MoneyTest
-
-        Private f12CHF As Money
-        Private f14CHF As Money
-        Private f7USD As Money
-        Private f21USD As Money
-
-        Private fMB1 As MoneyBag
-        Private fMB2 As MoneyBag
-
-        <SetUp()> _
-        Protected Sub SetUp()
-
-            f12CHF = New Money(12, "CHF")
-            f14CHF = New Money(14, "CHF")
-            f7USD = New Money(7, "USD")
-            f21USD = New Money(21, "USD")
-
-            fMB1 = New MoneyBag(f12CHF, f7USD)
-            fMB2 = New MoneyBag(f14CHF, f21USD)
-
-        End Sub
-
-        <Test()> _
-        Public Sub BagMultiply()
-            ' {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
-            Dim bag() As Money = New Money() {New Money(24, "CHF"), New Money(14, "USD")}
-            Dim expected As New MoneyBag(bag)
-            Assert.AreEqual(expected, fMB1.Multiply(2))
-            Assert.AreEqual(fMB1, fMB1.Multiply(1))
-            Assert.IsTrue(fMB1.Multiply(0).IsZero)
-        End Sub
-
-        <Test()> _
-        Public Sub BagNegate()
-            ' {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
-            Dim bag() As Money = New Money() {New Money(-12, "CHF"), New Money(-7, "USD")}
-            Dim expected As New MoneyBag(bag)
-            Assert.AreEqual(expected, fMB1.Negate())
-        End Sub
-
-        <Test()> _
-        Public Sub BagSimpleAdd()
-
-            ' {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]}
-            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(7, "USD")}
-            Dim expected As New MoneyBag(bag)
-            Assert.AreEqual(expected, fMB1.Add(f14CHF))
-
-        End Sub
-
-        <Test()> _
-        Public Sub BagSubtract()
-            ' {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
-            Dim bag() As Money = New Money() {New Money(-2, "CHF"), New Money(-14, "USD")}
-            Dim expected As New MoneyBag(bag)
-            Assert.AreEqual(expected, fMB1.Subtract(fMB2))
-        End Sub
-
-        <Test()> _
-        Public Sub BagSumAdd()
-            ' {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
-            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(28, "USD")}
-            Dim expected As New MoneyBag(bag)
-            Assert.AreEqual(expected, fMB1.Add(fMB2))
-        End Sub
-
-        <Test()> _
-        Public Sub IsZero()
-            Assert.IsTrue(fMB1.Subtract(fMB1).IsZero)
-
-            Dim bag() As Money = New Money() {New Money(0, "CHF"), New Money(0, "USD")}
-            Assert.IsTrue(New MoneyBag(bag).IsZero)
-        End Sub
-
-        <Test()> _
-        Public Sub MixedSimpleAdd()
-            ' [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
-            Dim bag() As Money = New Money() {f12CHF, f7USD}
-            Dim expected As New MoneyBag(bag)
-            Assert.AreEqual(expected, f12CHF.Add(f7USD))
-        End Sub
-
-        <Test()> _
-        Public Sub MoneyBagEquals()
-            ' NOTE: Normally we use Assert.AreEqual to test whether two
-            ' objects are equal. But here we are testing the MoneyBag.Equals()
-            ' method itself, so using AreEqual would not serve the purpose.
-            Assert.IsFalse(fMB1.Equals(Nothing))
-
-            Assert.IsTrue(fMB1.Equals(fMB1))
-            Dim equal As MoneyBag = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
-            Assert.IsTrue(fMB1.Equals(equal))
-            Assert.IsFalse(fMB1.Equals(f12CHF))
-            Assert.IsFalse(f12CHF.Equals(fMB1))
-            Assert.IsFalse(fMB1.Equals(fMB2))
-        End Sub
-
-        <Test()> _
-        Public Sub MoneyBagHash()
-            Dim equal As MoneyBag = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
-            Assert.AreEqual(fMB1.GetHashCode(), equal.GetHashCode())
-        End Sub
-
-        <Test()> _
-        Public Sub MoneyEquals()
-            ' NOTE: Normally we use Assert.AreEqual to test whether two
-            ' objects are equal. But here we are testing the MoneyBag.Equals()
-            ' method itself, so using AreEqual would not serve the purpose.
-            Assert.IsFalse(f12CHF.Equals(Nothing))
-            Dim equalMoney As Money = New Money(12, "CHF")
-            Assert.IsTrue(f12CHF.Equals(f12CHF))
-            Assert.IsTrue(f12CHF.Equals(equalMoney))
-            Assert.IsFalse(f12CHF.Equals(f14CHF))
-        End Sub
-
-        <Test()> _
-        Public Sub MoneyHash()
-            Assert.IsFalse(f12CHF.Equals(Nothing))
-            Dim equal As Money = New Money(12, "CHF")
-            Assert.AreEqual(f12CHF.GetHashCode(), equal.GetHashCode())
-        End Sub
-
-        <Test()> _
-        Public Sub Normalize()
-            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(28, "CHF"), New Money(6, "CHF")}
-            Dim moneyBag As New MoneyBag(bag)
-            Dim expected() As Money = New Money() {New Money(60, "CHF")}
-            '	// note: expected is still a MoneyBag
-            Dim expectedBag As New MoneyBag(expected)
-            Assert.AreEqual(expectedBag, moneyBag)
-        End Sub
-
-        <Test()> _
-        Public Sub Normalize2()
-            ' {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
-            Dim expected As Money = New Money(7, "USD")
-            Assert.AreEqual(expected, fMB1.Subtract(f12CHF))
-        End Sub
-
-        <Test()> _
-        Public Sub Normalize3()
-            ' {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
-            Dim s1() As Money = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
-            Dim ms1 As New MoneyBag(s1)
-            Dim expected As New Money(4, "USD")
-            Assert.AreEqual(expected, fMB1.Subtract(ms1))
-        End Sub
-
-        <Test()> _
-        Public Sub Normalize4()
-            ' [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
-            Dim s1() As Money = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
-            Dim ms1 As New MoneyBag(s1)
-            Dim expected As New Money(-3, "USD")
-            Assert.AreEqual(expected, f12CHF.Subtract(ms1))
-        End Sub
-
-        <Test()> _
-        Public Sub Print()
-            Assert.AreEqual("[12 CHF]", f12CHF.ToString())
-        End Sub
-
-        <Test()> _
-        Public Sub SimpleAdd()
-
-            ' [12 CHF] + [14 CHF] == [26 CHF]
-            Dim expected As Money = New Money(26, "CHF")
-            Assert.AreEqual(expected, f12CHF.Add(f14CHF))
-
-        End Sub
-
-        <Test()> _
-        Public Sub SimpleNegate()
-
-            ' [14 CHF] negate == [-14 CHF]
-            Dim expected As New Money(-14, "CHF")
-            Assert.AreEqual(expected, f14CHF.Negate())
-
-        End Sub
-
-        <Test()> _
-        Public Sub SimpleSubtract()
-
-            ' [14 CHF] - [12 CHF] == [2 CHF]
-            Dim expected As New Money(2, "CHF")
-            Assert.AreEqual(expected, f14CHF.Subtract(f12CHF))
-
-        End Sub
-
-        <Test()> _
-        Public Sub SimpleMultiply()
-
-            ' [14 CHF] *2 == [28 CHF]
-            Dim expected As New Money(28, "CHF")
-            Assert.AreEqual(expected, f14CHF.Multiply(2))
-
-        End Sub
-
-    End Class
-
-End Namespace
+' ****************************************************************
+' 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
+' ****************************************************************
+
+Option Explicit On 
+
+Imports System
+Imports NUnit.Framework
+
+Namespace NUnit.Samples
+
+    <TestFixture()> _
+    Public Class MoneyTest
+
+        Private f12CHF As Money
+        Private f14CHF As Money
+        Private f7USD As Money
+        Private f21USD As Money
+
+        Private fMB1 As MoneyBag
+        Private fMB2 As MoneyBag
+
+        <SetUp()> _
+        Protected Sub SetUp()
+
+            f12CHF = New Money(12, "CHF")
+            f14CHF = New Money(14, "CHF")
+            f7USD = New Money(7, "USD")
+            f21USD = New Money(21, "USD")
+
+            fMB1 = New MoneyBag(f12CHF, f7USD)
+            fMB2 = New MoneyBag(f14CHF, f21USD)
+
+        End Sub
+
+        <Test()> _
+        Public Sub BagMultiply()
+            ' {[12 CHF][7 USD]} *2 == {[24 CHF][14 USD]}
+            Dim bag() As Money = New Money() {New Money(24, "CHF"), New Money(14, "USD")}
+            Dim expected As New MoneyBag(bag)
+            Assert.AreEqual(expected, fMB1.Multiply(2))
+            Assert.AreEqual(fMB1, fMB1.Multiply(1))
+            Assert.IsTrue(fMB1.Multiply(0).IsZero)
+        End Sub
+
+        <Test()> _
+        Public Sub BagNegate()
+            ' {[12 CHF][7 USD]} negate == {[-12 CHF][-7 USD]}
+            Dim bag() As Money = New Money() {New Money(-12, "CHF"), New Money(-7, "USD")}
+            Dim expected As New MoneyBag(bag)
+            Assert.AreEqual(expected, fMB1.Negate())
+        End Sub
+
+        <Test()> _
+        Public Sub BagSimpleAdd()
+
+            ' {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]}
+            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(7, "USD")}
+            Dim expected As New MoneyBag(bag)
+            Assert.AreEqual(expected, fMB1.Add(f14CHF))
+
+        End Sub
+
+        <Test()> _
+        Public Sub BagSubtract()
+            ' {[12 CHF][7 USD]} - {[14 CHF][21 USD] == {[-2 CHF][-14 USD]}
+            Dim bag() As Money = New Money() {New Money(-2, "CHF"), New Money(-14, "USD")}
+            Dim expected As New MoneyBag(bag)
+            Assert.AreEqual(expected, fMB1.Subtract(fMB2))
+        End Sub
+
+        <Test()> _
+        Public Sub BagSumAdd()
+            ' {[12 CHF][7 USD]} + {[14 CHF][21 USD]} == {[26 CHF][28 USD]}
+            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(28, "USD")}
+            Dim expected As New MoneyBag(bag)
+            Assert.AreEqual(expected, fMB1.Add(fMB2))
+        End Sub
+
+        <Test()> _
+        Public Sub IsZero()
+            Assert.IsTrue(fMB1.Subtract(fMB1).IsZero)
+
+            Dim bag() As Money = New Money() {New Money(0, "CHF"), New Money(0, "USD")}
+            Assert.IsTrue(New MoneyBag(bag).IsZero)
+        End Sub
+
+        <Test()> _
+        Public Sub MixedSimpleAdd()
+            ' [12 CHF] + [7 USD] == {[12 CHF][7 USD]}
+            Dim bag() As Money = New Money() {f12CHF, f7USD}
+            Dim expected As New MoneyBag(bag)
+            Assert.AreEqual(expected, f12CHF.Add(f7USD))
+        End Sub
+
+        <Test()> _
+        Public Sub MoneyBagEquals()
+            ' NOTE: Normally we use Assert.AreEqual to test whether two
+            ' objects are equal. But here we are testing the MoneyBag.Equals()
+            ' method itself, so using AreEqual would not serve the purpose.
+            Assert.IsFalse(fMB1.Equals(Nothing))
+
+            Assert.IsTrue(fMB1.Equals(fMB1))
+            Dim equal As MoneyBag = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
+            Assert.IsTrue(fMB1.Equals(equal))
+            Assert.IsFalse(fMB1.Equals(f12CHF))
+            Assert.IsFalse(f12CHF.Equals(fMB1))
+            Assert.IsFalse(fMB1.Equals(fMB2))
+        End Sub
+
+        <Test()> _
+        Public Sub MoneyBagHash()
+            Dim equal As MoneyBag = New MoneyBag(New Money(12, "CHF"), New Money(7, "USD"))
+            Assert.AreEqual(fMB1.GetHashCode(), equal.GetHashCode())
+        End Sub
+
+        <Test()> _
+        Public Sub MoneyEquals()
+            ' NOTE: Normally we use Assert.AreEqual to test whether two
+            ' objects are equal. But here we are testing the MoneyBag.Equals()
+            ' method itself, so using AreEqual would not serve the purpose.
+            Assert.IsFalse(f12CHF.Equals(Nothing))
+            Dim equalMoney As Money = New Money(12, "CHF")
+            Assert.IsTrue(f12CHF.Equals(f12CHF))
+            Assert.IsTrue(f12CHF.Equals(equalMoney))
+            Assert.IsFalse(f12CHF.Equals(f14CHF))
+        End Sub
+
+        <Test()> _
+        Public Sub MoneyHash()
+            Assert.IsFalse(f12CHF.Equals(Nothing))
+            Dim equal As Money = New Money(12, "CHF")
+            Assert.AreEqual(f12CHF.GetHashCode(), equal.GetHashCode())
+        End Sub
+
+        <Test()> _
+        Public Sub Normalize()
+            Dim bag() As Money = New Money() {New Money(26, "CHF"), New Money(28, "CHF"), New Money(6, "CHF")}
+            Dim moneyBag As New MoneyBag(bag)
+            Dim expected() As Money = New Money() {New Money(60, "CHF")}
+            '	// note: expected is still a MoneyBag
+            Dim expectedBag As New MoneyBag(expected)
+            Assert.AreEqual(expectedBag, moneyBag)
+        End Sub
+
+        <Test()> _
+        Public Sub Normalize2()
+            ' {[12 CHF][7 USD]} - [12 CHF] == [7 USD]
+            Dim expected As Money = New Money(7, "USD")
+            Assert.AreEqual(expected, fMB1.Subtract(f12CHF))
+        End Sub
+
+        <Test()> _
+        Public Sub Normalize3()
+            ' {[12 CHF][7 USD]} - {[12 CHF][3 USD]} == [4 USD]
+            Dim s1() As Money = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
+            Dim ms1 As New MoneyBag(s1)
+            Dim expected As New Money(4, "USD")
+            Assert.AreEqual(expected, fMB1.Subtract(ms1))
+        End Sub
+
+        <Test()> _
+        Public Sub Normalize4()
+            ' [12 CHF] - {[12 CHF][3 USD]} == [-3 USD]
+            Dim s1() As Money = New Money() {New Money(12, "CHF"), New Money(3, "USD")}
+            Dim ms1 As New MoneyBag(s1)
+            Dim expected As New Money(-3, "USD")
+            Assert.AreEqual(expected, f12CHF.Subtract(ms1))
+        End Sub
+
+        <Test()> _
+        Public Sub Print()
+            Assert.AreEqual("[12 CHF]", f12CHF.ToString())
+        End Sub
+
+        <Test()> _
+        Public Sub SimpleAdd()
+
+            ' [12 CHF] + [14 CHF] == [26 CHF]
+            Dim expected As Money = New Money(26, "CHF")
+            Assert.AreEqual(expected, f12CHF.Add(f14CHF))
+
+        End Sub
+
+        <Test()> _
+        Public Sub SimpleNegate()
+
+            ' [14 CHF] negate == [-14 CHF]
+            Dim expected As New Money(-14, "CHF")
+            Assert.AreEqual(expected, f14CHF.Negate())
+
+        End Sub
+
+        <Test()> _
+        Public Sub SimpleSubtract()
+
+            ' [14 CHF] - [12 CHF] == [2 CHF]
+            Dim expected As New Money(2, "CHF")
+            Assert.AreEqual(expected, f14CHF.Subtract(f12CHF))
+
+        End Sub
+
+        <Test()> _
+        Public Sub SimpleMultiply()
+
+            ' [14 CHF] *2 == [28 CHF]
+            Dim expected As New Money(28, "CHF")
+            Assert.AreEqual(expected, f14CHF.Multiply(2))
+
+        End Sub
+
+    End Class
+
+End Namespace
diff --git a/samples/vb/money/vb-money.build b/samples/vb/money/vb-money.build
index d6cc609..0d3cc04 100644
--- a/samples/vb/money/vb-money.build
+++ b/samples/vb/money/vb-money.build
@@ -1,14 +1,14 @@
-<?xml version="1.0"?>
-<project name="vb-money" default="build">
-
-  <include buildfile="../../samples.common" />
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.vb" />
-    <include name="IMoney.vb" />
-    <include name="Money.vb" />
-    <include name="MoneyBag.vb" />
-    <include name="MoneyTest.vb" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="vb-money" default="build">
+
+  <include buildfile="../../samples.common" />
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.vb" />
+    <include name="IMoney.vb" />
+    <include name="Money.vb" />
+    <include name="MoneyBag.vb" />
+    <include name="MoneyTest.vb" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/vb/money/vb-money.vbproj b/samples/vb/money/vb-money.vbproj
index b98e920..592dcc7 100644
--- a/samples/vb/money/vb-money.vbproj
+++ b/samples/vb/money/vb-money.vbproj
@@ -1,28 +1,137 @@
-<VisualStudioProject>
-  <VisualBasic ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{95394B96-A794-48EA-9879-0E4EC79C5724}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="vb-money" AssemblyOriginatorKeyFile="" AssemblyOriginatorKeyMode="None" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" OptionCompare="Binary" OptionExplicit="On" OptionStrict="Off" RootNamespace="Money" StartupObject="">
-        <Config Name="Debug" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="" DefineDebug="true" DefineTrace="true" DebugSymbols="true" IncrementalBuild="true" Optimize="false" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="1" />
-        <Config Name="Release" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="" DefineDebug="false" DefineTrace="true" DebugSymbols="false" IncrementalBuild="false" Optimize="true" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="1" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-      <Imports>
-        <Import Namespace="Microsoft.VisualBasic" />
-        <Import Namespace="System" />
-        <Import Namespace="System.Collections" />
-      </Imports>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.vb" SubType="Code" BuildAction="Compile" />
-        <File RelPath="IMoney.vb" SubType="Code" BuildAction="Compile" />
-        <File RelPath="Money.vb" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MoneyBag.vb" SubType="Code" BuildAction="Compile" />
-        <File RelPath="MoneyTest.vb" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </VisualBasic>
-</VisualStudioProject>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{95394B96-A794-48EA-9879-0E4EC79C5724}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>vb-money</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <AssemblyOriginatorKeyMode>None</AssemblyOriginatorKeyMode>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <OptionCompare>Binary</OptionCompare>
+    <OptionExplicit>On</OptionExplicit>
+    <OptionStrict>Off</OptionStrict>
+    <RootNamespace>Money</RootNamespace>
+    <StartupObject />
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <MyType>Windows</MyType>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <DocumentationFile>vb-money.xml</DocumentationFile>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile />
+    <DefineConstants />
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <DocumentationFile>vb-money.xml</DocumentationFile>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile />
+    <DefineConstants />
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>false</DebugSymbols>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
+    <DebugType>none</DebugType>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="IMoney.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Money.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MoneyBag.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MoneyTest.vb">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="My Project\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/vb/syntax/AssemblyInfo.vb b/samples/vb/syntax/AssemblyInfo.vb
index 288767e..e29c3d4 100644
--- a/samples/vb/syntax/AssemblyInfo.vb
+++ b/samples/vb/syntax/AssemblyInfo.vb
@@ -1,32 +1,32 @@
-Imports System
-Imports System.Reflection
-Imports 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.
-
-' Review the values of the assembly attributes
-
-<Assembly: AssemblyTitle("")> 
-<Assembly: AssemblyDescription("")> 
-<Assembly: AssemblyCompany("")> 
-<Assembly: AssemblyProduct("")> 
-<Assembly: AssemblyCopyright("")> 
-<Assembly: AssemblyTrademark("")> 
-<Assembly: CLSCompliant(True)> 
-
-'The following GUID is for the ID of the typelib if this project is exposed to COM
-<Assembly: Guid("966C964A-3C92-4834-AC3A-9A47BA0A728B")> 
-
-' 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.*")> 
+Imports System
+Imports System.Reflection
+Imports 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.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("")> 
+<Assembly: AssemblyCopyright("")> 
+<Assembly: AssemblyTrademark("")> 
+<Assembly: CLSCompliant(True)> 
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("966C964A-3C92-4834-AC3A-9A47BA0A728B")> 
+
+' 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.*")> 
diff --git a/samples/vb/syntax/AssertSyntaxTests.vb b/samples/vb/syntax/AssertSyntaxTests.vb
index dbb5246..b00fa8d 100644
--- a/samples/vb/syntax/AssertSyntaxTests.vb
+++ b/samples/vb/syntax/AssertSyntaxTests.vb
@@ -1,705 +1,703 @@
-' ****************************************************************
-' Copyright 2007, Charlie Poole
-' This is free software licensed under the NUnit license. You may
-' obtain a copy of the license at http:'nunit.org/?p=license&r=2.4
-' ****************************************************************
-
-Option Explicit On 
-
-Imports System
-Imports NUnit.Framework
-Imports NUnit.Framework.Constraints
-Imports Text = NUnit.Framework.Text
-
-Namespace NUnit.Samples
-
-    ' This test fixture attempts to exercise all the syntactic
-    ' variations of Assert without getting into failures, errors 
-    ' or corner cases. Thus, some of the tests may be duplicated 
-    ' in other fixtures.
-    ' 
-    ' Each test performs the same operations using the classic
-    ' syntax (if available) and the new syntax in both the
-    ' helper-based and inherited forms.
-    ' 
-    ' This Fixture will eventually be duplicated in other
-    ' supported languages. 
-
-    <TestFixture()> _
-    Public Class AssertSyntaxTests
-        Inherits AssertionHelper
-
-#Region "Simple Constraint Tests"
-        <Test()> _
-        Public Sub IsNull()
-            Dim nada As Object = Nothing
-
-            ' Classic syntax
-            Assert.IsNull(nada)
-
-            ' Helper syntax
-            Assert.That(nada, Iz.Null)
-
-            ' Inherited syntax
-            Expect(nada, Null)
-        End Sub
-
-
-        <Test()> _
-        Public Sub IsNotNull()
-            ' Classic syntax
-            Assert.IsNotNull(42)
-
-            ' Helper syntax
-            Assert.That(42, Iz.Not.Null)
-
-            ' Inherited syntax
-            Expect(42, Iz.Not.Null)
-        End Sub
-
-        <Test()> _
-        Public Sub IsTrue()
-            ' Classic syntax
-            Assert.IsTrue(2 + 2 = 4)
-
-            ' Helper syntax
-            Assert.That(2 + 2 = 4, Iz.True)
-            Assert.That(2 + 2 = 4)
-
-            ' Inherited syntax
-            Expect(2 + 2 = 4, Iz.True)
-            Expect(2 + 2 = 4)
-        End Sub
-
-        <Test()> _
-        Public Sub IsFalse()
-            ' Classic syntax
-            Assert.IsFalse(2 + 2 = 5)
-
-            ' Helper syntax
-            Assert.That(2 + 2 = 5, Iz.False)
-
-            ' Inherited syntax
-            Expect(2 + 2 = 5, Iz.False)
-        End Sub
-
-        <Test()> _
-        Public Sub IsNaN()
-            Dim d As Double = Double.NaN
-            Dim f As Single = Single.NaN
-
-            ' Classic syntax
-            Assert.IsNaN(d)
-            Assert.IsNaN(f)
-
-            ' Helper syntax
-            Assert.That(d, Iz.NaN)
-            Assert.That(f, Iz.NaN)
-
-            ' Inherited syntax
-            Expect(d, NaN)
-            Expect(f, NaN)
-        End Sub
-
-        <Test()> _
-        Public Sub EmptyStringTests()
-            ' Classic syntax
-            Assert.IsEmpty("")
-            Assert.IsNotEmpty("Hello!")
-
-            ' Helper syntax
-            Assert.That("", Iz.Empty)
-            Assert.That("Hello!", Iz.Not.Empty)
-
-            ' Inherited syntax
-            Expect("", Empty)
-            Expect("Hello!", Iz.Not.Empty)
-        End Sub
-
-        <Test()> _
-        Public Sub EmptyCollectionTests()
-
-            Dim boolArray As Boolean() = New Boolean() {}
-            Dim nonEmpty As Integer() = New Integer() {1, 2, 3}
-
-            ' Classic syntax
-            Assert.IsEmpty(boolArray)
-            Assert.IsNotEmpty(nonEmpty)
-
-            ' Helper syntax
-            Assert.That(boolArray, Iz.Empty)
-            Assert.That(nonEmpty, Iz.Not.Empty)
-
-            ' Inherited syntax
-            Expect(boolArray, Iz.Empty)
-            Expect(nonEmpty, Iz.Not.Empty)
-        End Sub
-#End Region
-
-#Region "TypeConstraint Tests"
-        <Test()> _
-        Public Sub ExactTypeTests()
-            ' Classic syntax workarounds
-            Assert.AreEqual(GetType(String), "Hello".GetType())
-            Assert.AreEqual("System.String", "Hello".GetType().FullName)
-            Assert.AreNotEqual(GetType(Integer), "Hello".GetType())
-            Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName)
-
-            ' Helper syntax
-            Assert.That("Hello", Iz.TypeOf(GetType(String)))
-            Assert.That("Hello", Iz.Not.TypeOf(GetType(Integer)))
-
-            ' Inherited syntax
-            Expect("Hello", Iz.TypeOf(GetType(String)))
-            Expect("Hello", Iz.Not.TypeOf(GetType(Integer)))
-        End Sub
-
-        <Test()> _
-        Public Sub InstanceOfTypeTests()
-            ' Classic syntax
-            Assert.IsInstanceOf(GetType(String), "Hello")
-            Assert.IsNotInstanceOf(GetType(String), 5)
-
-            ' Helper syntax
-            Assert.That("Hello", Iz.InstanceOf(GetType(String)))
-            Assert.That(5, Iz.Not.InstanceOf(GetType(String)))
-
-            ' Inherited syntax
-            Expect("Hello", InstanceOf(GetType(String)))
-            Expect(5, Iz.Not.InstanceOf(GetType(String)))
-        End Sub
-
-        <Test()> _
-        Public Sub AssignableFromTypeTests()
-            ' Classic syntax
-            Assert.IsAssignableFrom(GetType(String), "Hello")
-            Assert.IsNotAssignableFrom(GetType(String), 5)
-
-            ' Helper syntax
-            Assert.That("Hello", Iz.AssignableFrom(GetType(String)))
-            Assert.That(5, Iz.Not.AssignableFrom(GetType(String)))
-
-            ' Inherited syntax
-            Expect("Hello", AssignableFrom(GetType(String)))
-            Expect(5, Iz.Not.AssignableFrom(GetType(String)))
-        End Sub
-#End Region
-
-#Region "StringConstraintTests"
-        <Test()> _
-        Public Sub SubstringTests()
-            Dim phrase As String = "Hello World!"
-            Dim array As String() = New String() {"abc", "bad", "dba"}
-
-            ' Classic Syntax
-            StringAssert.Contains("World", phrase)
-
-            ' Helper syntax
-            Assert.That(phrase, Text.Contains("World"))
-            ' Only available using new syntax
-            Assert.That(phrase, Text.DoesNotContain("goodbye"))
-            Assert.That(phrase, Text.Contains("WORLD").IgnoreCase)
-            Assert.That(phrase, Text.DoesNotContain("BYE").IgnoreCase)
-            Assert.That(array, Text.All.Contains("b"))
-
-            ' Inherited syntax
-            Expect(phrase, Contains("World"))
-            ' Only available using new syntax
-            Expect(phrase, Text.DoesNotContain("goodbye"))
-            Expect(phrase, Contains("WORLD").IgnoreCase)
-            Expect(phrase, Text.DoesNotContain("BYE").IgnoreCase)
-            Expect(array, All.Contains("b"))
-        End Sub
-
-        <Test()> _
-        Public Sub StartsWithTests()
-            Dim phrase As String = "Hello World!"
-            Dim greetings As String() = New String() {"Hello!", "Hi!", "Hola!"}
-
-            ' Classic syntax
-            StringAssert.StartsWith("Hello", phrase)
-
-            ' Helper syntax
-            Assert.That(phrase, Text.StartsWith("Hello"))
-            ' Only available using new syntax
-            Assert.That(phrase, Text.DoesNotStartWith("Hi!"))
-            Assert.That(phrase, Text.StartsWith("HeLLo").IgnoreCase)
-            Assert.That(phrase, Text.DoesNotStartWith("HI").IgnoreCase)
-            Assert.That(greetings, Text.All.StartsWith("h").IgnoreCase)
-
-            ' Inherited syntax
-            Expect(phrase, StartsWith("Hello"))
-            ' Only available using new syntax
-            Expect(phrase, Text.DoesNotStartWith("Hi!"))
-            Expect(phrase, StartsWith("HeLLo").IgnoreCase)
-            Expect(phrase, Text.DoesNotStartWith("HI").IgnoreCase)
-            Expect(greetings, All.StartsWith("h").IgnoreCase)
-        End Sub
-
-        <Test()> _
-        Public Sub EndsWithTests()
-            Dim phrase As String = "Hello World!"
-            Dim greetings As String() = New String() {"Hello!", "Hi!", "Hola!"}
-
-            ' Classic Syntax
-            StringAssert.EndsWith("!", phrase)
-
-            ' Helper syntax
-            Assert.That(phrase, Text.EndsWith("!"))
-            ' Only available using new syntax
-            Assert.That(phrase, Text.DoesNotEndWith("?"))
-            Assert.That(phrase, Text.EndsWith("WORLD!").IgnoreCase)
-            Assert.That(greetings, Text.All.EndsWith("!"))
-
-            ' Inherited syntax
-            Expect(phrase, EndsWith("!"))
-            ' Only available using new syntax
-            Expect(phrase, Text.DoesNotEndWith("?"))
-            Expect(phrase, EndsWith("WORLD!").IgnoreCase)
-            Expect(greetings, All.EndsWith("!"))
-        End Sub
-
-        <Test()> _
-        Public Sub EqualIgnoringCaseTests()
-
-            Dim phrase As String = "Hello World!"
-            Dim array1 As String() = New String() {"Hello", "World"}
-            Dim array2 As String() = New String() {"HELLO", "WORLD"}
-            Dim array3 As String() = New String() {"HELLO", "Hello", "hello"}
-
-            ' Classic syntax
-            StringAssert.AreEqualIgnoringCase("hello world!", phrase)
-
-            ' Helper syntax
-            Assert.That(phrase, Iz.EqualTo("hello world!").IgnoreCase)
-            'Only available using new syntax
-            Assert.That(phrase, Iz.Not.EqualTo("goodbye world!").IgnoreCase)
-            Assert.That(array1, Iz.EqualTo(array2).IgnoreCase)
-            Assert.That(array3, Iz.All.EqualTo("hello").IgnoreCase)
-
-            ' Inherited syntax
-            Expect(phrase, EqualTo("hello world!").IgnoreCase)
-            'Only available using new syntax
-            Expect(phrase, Iz.Not.EqualTo("goodbye world!").IgnoreCase)
-            Expect(array1, EqualTo(array2).IgnoreCase)
-            Expect(array3, All.EqualTo("hello").IgnoreCase)
-        End Sub
-
-        <Test()> _
-        Public Sub RegularExpressionTests()
-            Dim phrase As String = "Now is the time for all good men to come to the aid of their country."
-            Dim quotes As String() = New String() {"Never say never", "It's never too late", "Nevermore!"}
-
-            ' Classic syntax
-            StringAssert.IsMatch("all good men", phrase)
-            StringAssert.IsMatch("Now.*come", phrase)
-
-            ' Helper syntax
-            Assert.That(phrase, Text.Matches("all good men"))
-            Assert.That(phrase, Text.Matches("Now.*come"))
-            ' Only available using new syntax
-            Assert.That(phrase, Text.DoesNotMatch("all.*men.*good"))
-            Assert.That(phrase, Text.Matches("ALL").IgnoreCase)
-            Assert.That(quotes, Text.All.Matches("never").IgnoreCase)
-
-            ' Inherited syntax
-            Expect(phrase, Matches("all good men"))
-            Expect(phrase, Matches("Now.*come"))
-            ' Only available using new syntax
-            Expect(phrase, Text.DoesNotMatch("all.*men.*good"))
-            Expect(phrase, Matches("ALL").IgnoreCase)
-            Expect(quotes, All.Matches("never").IgnoreCase)
-        End Sub
-#End Region
-
-#Region "Equality Tests"
-        <Test()> _
-        Public Sub EqualityTests()
-
-            Dim i3 As Integer() = {1, 2, 3}
-            Dim d3 As Double() = {1.0, 2.0, 3.0}
-            Dim iunequal As Integer() = {1, 3, 2}
-
-            ' Classic Syntax
-            Assert.AreEqual(4, 2 + 2)
-            Assert.AreEqual(i3, d3)
-            Assert.AreNotEqual(5, 2 + 2)
-            Assert.AreNotEqual(i3, iunequal)
-
-            ' Helper syntax
-            Assert.That(2 + 2, Iz.EqualTo(4))
-            Assert.That(2 + 2 = 4)
-            Assert.That(i3, Iz.EqualTo(d3))
-            Assert.That(2 + 2, Iz.Not.EqualTo(5))
-            Assert.That(i3, Iz.Not.EqualTo(iunequal))
-
-            ' Inherited syntax
-            Expect(2 + 2, EqualTo(4))
-            Expect(2 + 2 = 4)
-            Expect(i3, EqualTo(d3))
-            Expect(2 + 2, Iz.Not.EqualTo(5))
-            Expect(i3, Iz.Not.EqualTo(iunequal))
-        End Sub
-
-        <Test()> _
-        Public Sub EqualityTestsWithTolerance()
-            ' CLassic syntax
-            Assert.AreEqual(5.0R, 4.99R, 0.05R)
-            Assert.AreEqual(5.0F, 4.99F, 0.05F)
-
-            ' Helper syntax
-            Assert.That(4.99R, Iz.EqualTo(5.0R).Within(0.05R))
-            Assert.That(4D, Iz.Not.EqualTo(5D).Within(0.5D))
-            Assert.That(4.99F, Iz.EqualTo(5.0F).Within(0.05F))
-            Assert.That(4.99D, Iz.EqualTo(5D).Within(0.05D))
-            Assert.That(499, Iz.EqualTo(500).Within(5))
-            Assert.That(4999999999L, Iz.EqualTo(5000000000L).Within(5L))
-
-            ' Inherited syntax
-            Expect(4.99R, EqualTo(5.0R).Within(0.05R))
-            Expect(4D, Iz.Not.EqualTo(5D).Within(0.5D))
-            Expect(4.99F, EqualTo(5.0F).Within(0.05F))
-            Expect(4.99D, EqualTo(5D).Within(0.05D))
-            Expect(499, EqualTo(500).Within(5))
-            Expect(4999999999L, EqualTo(5000000000L).Within(5L))
-        End Sub
-
-        <Test()> _
-        Public Sub EqualityTestsWithTolerance_MixedFloatAndDouble()
-            ' Bug Fix 1743844
-            Assert.That(2.20492R, Iz.EqualTo(2.2R).Within(0.01F), _
-                "Double actual, Double expected, Single tolerance")
-            Assert.That(2.20492R, Iz.EqualTo(2.2F).Within(0.01R), _
-                "Double actual, Single expected, Double tolerance")
-            Assert.That(2.20492R, Iz.EqualTo(2.2F).Within(0.01F), _
-                "Double actual, Single expected, Single tolerance")
-            Assert.That(2.20492F, Iz.EqualTo(2.2F).Within(0.01R), _
-                "Single actual, Single expected, Double tolerance")
-            Assert.That(2.20492F, Iz.EqualTo(2.2R).Within(0.01R), _
-                "Single actual, Double expected, Double tolerance")
-            Assert.That(2.20492F, Iz.EqualTo(2.2R).Within(0.01F), _
-                "Single actual, Double expected, Single tolerance")
-        End Sub
-
-        <Test()> _
-        Public Sub EqualityTestsWithTolerance_MixingTypesGenerally()
-            ' Extending tolerance to all numeric types
-            Assert.That(202.0R, Iz.EqualTo(200.0R).Within(2), _
-                "Double actual, Double expected, int tolerance")
-            Assert.That(4.87D, Iz.EqualTo(5).Within(0.25R), _
-                "Decimal actual, int expected, Double tolerance")
-            Assert.That(4.87D, Iz.EqualTo(5L).Within(1), _
-                "Decimal actual, long expected, int tolerance")
-            Assert.That(487, Iz.EqualTo(500).Within(25), _
-                "int actual, int expected, int tolerance")
-            Assert.That(487L, Iz.EqualTo(500).Within(25), _
-                "long actual, int expected, int tolerance")
-        End Sub
-#End Region
-
-#Region "Comparison Tests"
-        <Test()> _
-        Public Sub ComparisonTests()
-            ' Classic Syntax
-            Assert.Greater(7, 3)
-            Assert.GreaterOrEqual(7, 3)
-            Assert.GreaterOrEqual(7, 7)
-
-            ' Helper syntax
-            Assert.That(7, Iz.GreaterThan(3))
-            Assert.That(7, Iz.GreaterThanOrEqualTo(3))
-            Assert.That(7, Iz.AtLeast(3))
-            Assert.That(7, Iz.GreaterThanOrEqualTo(7))
-            Assert.That(7, Iz.AtLeast(7))
-
-            ' Inherited syntax
-            Expect(7, GreaterThan(3))
-            Expect(7, GreaterThanOrEqualTo(3))
-            Expect(7, AtLeast(3))
-            Expect(7, GreaterThanOrEqualTo(7))
-            Expect(7, AtLeast(7))
-
-            ' Classic syntax
-            Assert.Less(3, 7)
-            Assert.LessOrEqual(3, 7)
-            Assert.LessOrEqual(3, 3)
-
-            ' Helper syntax
-            Assert.That(3, Iz.LessThan(7))
-            Assert.That(3, Iz.LessThanOrEqualTo(7))
-            Assert.That(3, Iz.AtMost(7))
-            Assert.That(3, Iz.LessThanOrEqualTo(3))
-            Assert.That(3, Iz.AtMost(3))
-
-            ' Inherited syntax
-            Expect(3, LessThan(7))
-            Expect(3, LessThanOrEqualTo(7))
-            Expect(3, AtMost(7))
-            Expect(3, LessThanOrEqualTo(3))
-            Expect(3, AtMost(3))
-        End Sub
-#End Region
-
-#Region "Collection Tests"
-        <Test()> _
-        Public Sub AllItemsTests()
-
-            Dim ints As Object() = {1, 2, 3, 4}
-            Dim doubles As Object() = {0.99, 2.1, 3.0, 4.05}
-            Dim strings As Object() = {"abc", "bad", "cab", "bad", "dad"}
-
-            ' Classic syntax
-            CollectionAssert.AllItemsAreNotNull(ints)
-            CollectionAssert.AllItemsAreInstancesOfType(ints, GetType(Integer))
-            CollectionAssert.AllItemsAreInstancesOfType(strings, GetType(String))
-            CollectionAssert.AllItemsAreUnique(ints)
-
-            ' Helper syntax
-            Assert.That(ints, Iz.All.Not.Null)
-            Assert.That(ints, Has.None.Null)
-            Assert.That(ints, Iz.All.InstanceOfType(GetType(Integer)))
-            Assert.That(ints, Has.All.InstanceOfType(GetType(Integer)))
-            Assert.That(strings, Iz.All.InstanceOfType(GetType(String)))
-            Assert.That(strings, Has.All.InstanceOfType(GetType(String)))
-            Assert.That(ints, Iz.Unique)
-            ' Only available using new syntax
-            Assert.That(strings, Iz.Not.Unique)
-            Assert.That(ints, Iz.All.GreaterThan(0))
-            Assert.That(ints, Has.All.GreaterThan(0))
-            Assert.That(ints, Has.None.LessThanOrEqualTo(0))
-            Assert.That(strings, Text.All.Contains("a"))
-            Assert.That(strings, Has.All.Contains("a"))
-            Assert.That(strings, Has.Some.StartsWith("ba"))
-            Assert.That(strings, Has.Some.Property("Length").EqualTo(3))
-            Assert.That(strings, Has.Some.StartsWith("BA").IgnoreCase)
-            Assert.That(doubles, Has.Some.EqualTo(1.0).Within(0.05))
-
-            ' Inherited syntax
-            Expect(ints, All.Not.Null)
-            Expect(ints, None.Null)
-            Expect(ints, All.InstanceOfType(GetType(Integer)))
-            Expect(strings, All.InstanceOfType(GetType(String)))
-            Expect(ints, Unique)
-            ' Only available using new syntax
-            Expect(strings, Iz.Not.Unique)
-            Expect(ints, All.GreaterThan(0))
-            Expect(strings, All.Contains("a"))
-            Expect(strings, Some.StartsWith("ba"))
-            Expect(strings, Some.StartsWith("BA").IgnoreCase)
-            Expect(doubles, Some.EqualTo(1.0).Within(0.05))
-        End Sub
-
-        <Test()> _
-       Public Sub SomeItemsTests()
-
-            Dim mixed As Object() = {1, 2, "3", Nothing, "four", 100}
-            Dim strings As Object() = {"abc", "bad", "cab", "bad", "dad"}
-
-            ' Not available using the classic syntax
-
-            ' Helper syntax
-            Assert.That(mixed, Has.Some.Null)
-            Assert.That(mixed, Has.Some.InstanceOfType(GetType(Integer)))
-            Assert.That(mixed, Has.Some.InstanceOfType(GetType(String)))
-            Assert.That(strings, Has.Some.StartsWith("ba"))
-            Assert.That(strings, Has.Some.Not.StartsWith("ba"))
-
-            ' Inherited syntax
-            Expect(mixed, Some.Null)
-            Expect(mixed, Some.InstanceOfType(GetType(Integer)))
-            Expect(mixed, Some.InstanceOfType(GetType(String)))
-            Expect(strings, Some.StartsWith("ba"))
-            Expect(strings, Some.Not.StartsWith("ba"))
-        End Sub
-
-        <Test()> _
-        Public Sub NoItemsTests()
-
-            Dim ints As Object() = {1, 2, 3, 4, 5}
-            Dim strings As Object() = {"abc", "bad", "cab", "bad", "dad"}
-
-            ' Not available using the classic syntax
-
-            ' Helper syntax
-            Assert.That(ints, Has.None.Null)
-            Assert.That(ints, Has.None.InstanceOfType(GetType(String)))
-            Assert.That(ints, Has.None.GreaterThan(99))
-            Assert.That(strings, Has.None.StartsWith("qu"))
-
-            ' Inherited syntax
-            Expect(ints, None.Null)
-            Expect(ints, None.InstanceOfType(GetType(String)))
-            Expect(ints, None.GreaterThan(99))
-            Expect(strings, None.StartsWith("qu"))
-        End Sub
-
-        <Test()> _
-        Public Sub CollectionContainsTests()
-
-            Dim iarray As Integer() = {1, 2, 3}
-            Dim sarray As String() = {"a", "b", "c"}
-
-            ' Classic syntax
-            Assert.Contains(3, iarray)
-            Assert.Contains("b", sarray)
-            CollectionAssert.Contains(iarray, 3)
-            CollectionAssert.Contains(sarray, "b")
-            CollectionAssert.DoesNotContain(sarray, "x")
-            ' Showing that Contains uses NUnit equality
-            CollectionAssert.Contains(iarray, 1.0R)
-
-            ' Helper syntax
-            Assert.That(iarray, Has.Member(3))
-            Assert.That(sarray, Has.Member("b"))
-            Assert.That(sarray, Has.No.Member("x"))
-            ' Showing that Contains uses NUnit equality
-            Assert.That(iarray, Has.Member(1.0R))
-
-            ' Only available using the new syntax
-            ' Note that EqualTo and SameAs do NOT give
-            ' identical results to Contains because 
-            ' Contains uses Object.Equals()
-            Assert.That(iarray, Has.Some.EqualTo(3))
-            Assert.That(iarray, Has.Member(3))
-            Assert.That(sarray, Has.Some.EqualTo("b"))
-            Assert.That(sarray, Has.None.EqualTo("x"))
-            Assert.That(iarray, Has.None.SameAs(1.0R))
-            Assert.That(iarray, Has.All.LessThan(10))
-            Assert.That(sarray, Has.All.Length.EqualTo(1))
-            Assert.That(sarray, Has.None.Property("Length").GreaterThan(3))
-
-            ' Inherited syntax
-            Expect(iarray, Contains(3))
-            Expect(sarray, Contains("b"))
-            Expect(sarray, Has.No.Member("x"))
-
-            ' Only available using new syntax
-            ' Note that EqualTo and SameAs do NOT give
-            ' identical results to Contains because 
-            ' Contains uses Object.Equals()
-            Expect(iarray, Some.EqualTo(3))
-            Expect(sarray, Some.EqualTo("b"))
-            Expect(sarray, None.EqualTo("x"))
-            Expect(iarray, All.LessThan(10))
-            Expect(sarray, All.Length.EqualTo(1))
-            Expect(sarray, None.Property("Length").GreaterThan(3))
-        End Sub
-
-        <Test()> _
-        Public Sub CollectionEquivalenceTests()
-
-            Dim ints1to5 As Integer() = {1, 2, 3, 4, 5}
-            Dim twothrees As Integer() = {1, 2, 3, 3, 4, 5}
-            Dim twofours As Integer() = {1, 2, 3, 4, 4, 5}
-
-            ' Classic syntax
-            CollectionAssert.AreEquivalent(New Integer() {2, 1, 4, 3, 5}, ints1to5)
-            CollectionAssert.AreNotEquivalent(New Integer() {2, 2, 4, 3, 5}, ints1to5)
-            CollectionAssert.AreNotEquivalent(New Integer() {2, 4, 3, 5}, ints1to5)
-            CollectionAssert.AreNotEquivalent(New Integer() {2, 2, 1, 1, 4, 3, 5}, ints1to5)
-            CollectionAssert.AreNotEquivalent(twothrees, twofours)
-
-            ' Helper syntax
-            Assert.That(New Integer() {2, 1, 4, 3, 5}, Iz.EquivalentTo(ints1to5))
-            Assert.That(New Integer() {2, 2, 4, 3, 5}, Iz.Not.EquivalentTo(ints1to5))
-            Assert.That(New Integer() {2, 4, 3, 5}, Iz.Not.EquivalentTo(ints1to5))
-            Assert.That(New Integer() {2, 2, 1, 1, 4, 3, 5}, Iz.Not.EquivalentTo(ints1to5))
-            Assert.That(twothrees, Iz.Not.EquivalentTo(twofours))
-
-            ' Inherited syntax
-            Expect(New Integer() {2, 1, 4, 3, 5}, EquivalentTo(ints1to5))
-        End Sub
-
-        <Test()> _
-        Public Sub SubsetTests()
-
-            Dim ints1to5 As Integer() = {1, 2, 3, 4, 5}
-
-            ' Classic syntax
-            CollectionAssert.IsSubsetOf(New Integer() {1, 3, 5}, ints1to5)
-            CollectionAssert.IsSubsetOf(New Integer() {1, 2, 3, 4, 5}, ints1to5)
-            CollectionAssert.IsNotSubsetOf(New Integer() {2, 4, 6}, ints1to5)
-            CollectionAssert.IsNotSubsetOf(New Integer() {1, 2, 2, 2, 5}, ints1to5)
-
-            ' Helper syntax
-            Assert.That(New Integer() {1, 3, 5}, Iz.SubsetOf(ints1to5))
-            Assert.That(New Integer() {1, 2, 3, 4, 5}, Iz.SubsetOf(ints1to5))
-            Assert.That(New Integer() {2, 4, 6}, Iz.Not.SubsetOf(ints1to5))
-
-            ' Inherited syntax
-            Expect(New Integer() {1, 3, 5}, SubsetOf(ints1to5))
-            Expect(New Integer() {1, 2, 3, 4, 5}, SubsetOf(ints1to5))
-            Expect(New Integer() {2, 4, 6}, Iz.Not.SubsetOf(ints1to5))
-        End Sub
-#End Region
-
-#Region "Property Tests"
-        <Test()> _
-        Public Sub PropertyTests()
-
-            Dim array As String() = {"abc", "bca", "xyz", "qrs"}
-            Dim array2 As String() = {"a", "ab", "abc"}
-            Dim list As New ArrayList(array)
-
-            ' Not available using the classic syntax
-
-            ' Helper syntax
-            ' Assert.That(list, Has.Property("Count"))
-            ' Assert.That(list, Has.No.Property("Length"))
-
-            Assert.That("Hello", Has.Length.EqualTo(5))
-            Assert.That("Hello", Has.Property("Length").EqualTo(5))
-            Assert.That("Hello", Has.Property("Length").GreaterThan(3))
-
-            Assert.That(array, Has.Property("Length").EqualTo(4))
-            Assert.That(array, Has.Length.EqualTo(4))
-            Assert.That(array, Has.Property("Length").LessThan(10))
-
-            Assert.That(array, Has.All.Property("Length").EqualTo(3))
-            Assert.That(array, Has.All.Length.EqualTo(3))
-            Assert.That(array, Iz.All.Length.EqualTo(3))
-            Assert.That(array, Has.All.Property("Length").EqualTo(3))
-            Assert.That(array, Iz.All.Property("Length").EqualTo(3))
-
-            Assert.That(array2, Iz.Not.Property("Length").EqualTo(4))
-            Assert.That(array2, Iz.Not.Length.EqualTo(4))
-            Assert.That(array2, Has.No.Property("Length").GreaterThan(3))
-
-            ' Inherited syntax
-            ' Expect(list, Has.Property("Count"))
-            ' Expect(list, Has.No.Property("Nada"))
-
-            Expect(array, All.Property("Length").EqualTo(3))
-            Expect(array, All.Length.EqualTo(3))
-        End Sub
-#End Region
-
-#Region "Not Tests"
-        <Test()> _
-        Public Sub NotTests()
-            ' Not available using the classic syntax
-
-            ' Helper syntax
-            Assert.That(42, Iz.Not.Null)
-            Assert.That(42, Iz.Not.True)
-            Assert.That(42, Iz.Not.False)
-            Assert.That(2.5, Iz.Not.NaN)
-            Assert.That(2 + 2, Iz.Not.EqualTo(3))
-            Assert.That(2 + 2, Iz.Not.Not.EqualTo(4))
-            Assert.That(2 + 2, Iz.Not.Not.Not.EqualTo(5))
-
-            ' Inherited syntax
-            Expect(42, Iz.Not.Null)
-            Expect(42, Iz.Not.True)
-            Expect(42, Iz.Not.False)
-            Expect(2.5, Iz.Not.NaN)
-            Expect(2 + 2, Iz.Not.EqualTo(3))
-            Expect(2 + 2, Iz.Not.Not.EqualTo(4))
-            Expect(2 + 2, Iz.Not.Not.Not.EqualTo(5))
-        End Sub
-#End Region
-
-    End Class
-
-End Namespace
-
+' ****************************************************************
+' Copyright 2007, Charlie Poole
+' This is free software licensed under the NUnit license. You may
+' obtain a copy of the license at http://nunit.org
+' ****************************************************************
+
+Option Explicit On 
+
+Imports System
+Imports NUnit.Framework
+Imports NUnit.Framework.Constraints
+
+Namespace NUnit.Samples
+
+    ' This test fixture attempts to exercise all the syntactic
+    ' variations of Assert without getting into failures, errors 
+    ' or corner cases. Thus, some of the tests may be duplicated 
+    ' in other fixtures.
+    ' 
+    ' Each test performs the same operations using the classic
+    ' syntax (if available) and the new syntax in both the
+    ' helper-based and inherited forms.
+    ' 
+    ' This Fixture will eventually be duplicated in other
+    ' supported languages. 
+
+    <TestFixture()> _
+    Public Class AssertSyntaxTests
+        Inherits AssertionHelper
+
+#Region "Simple Constraint Tests"
+        <Test()> _
+        Public Sub IsNull()
+            Dim nada As Object = Nothing
+
+            ' Classic syntax
+            Assert.IsNull(nada)
+
+            ' Helper syntax
+            Assert.That(nada, Iz.Null)
+
+            ' Inherited syntax
+            Expect(nada, Null)
+        End Sub
+
+
+        <Test()> _
+        Public Sub IsNotNull()
+            ' Classic syntax
+            Assert.IsNotNull(42)
+
+            ' Helper syntax
+            Assert.That(42, Iz.Not.Null)
+
+            ' Inherited syntax
+            Expect(42, Iz.Not.Null)
+        End Sub
+
+        <Test()> _
+        Public Sub IsTrue()
+            ' Classic syntax
+            Assert.IsTrue(2 + 2 = 4)
+
+            ' Helper syntax
+            Assert.That(2 + 2 = 4, Iz.True)
+            Assert.That(2 + 2 = 4)
+
+            ' Inherited syntax
+            Expect(2 + 2 = 4, Iz.True)
+            Expect(2 + 2 = 4)
+        End Sub
+
+        <Test()> _
+        Public Sub IsFalse()
+            ' Classic syntax
+            Assert.IsFalse(2 + 2 = 5)
+
+            ' Helper syntax
+            Assert.That(2 + 2 = 5, Iz.False)
+
+            ' Inherited syntax
+            Expect(2 + 2 = 5, Iz.False)
+        End Sub
+
+        <Test()> _
+        Public Sub IsNaN()
+            Dim d As Double = Double.NaN
+            Dim f As Single = Single.NaN
+
+            ' Classic syntax
+            Assert.IsNaN(d)
+            Assert.IsNaN(f)
+
+            ' Helper syntax
+            Assert.That(d, Iz.NaN)
+            Assert.That(f, Iz.NaN)
+
+            ' Inherited syntax
+            Expect(d, NaN)
+            Expect(f, NaN)
+        End Sub
+
+        <Test()> _
+        Public Sub EmptyStringTests()
+            ' Classic syntax
+            Assert.IsEmpty("")
+            Assert.IsNotEmpty("Hello!")
+
+            ' Helper syntax
+            Assert.That("", Iz.Empty)
+            Assert.That("Hello!", Iz.Not.Empty)
+
+            ' Inherited syntax
+            Expect("", Empty)
+            Expect("Hello!", Iz.Not.Empty)
+        End Sub
+
+        <Test()> _
+        Public Sub EmptyCollectionTests()
+
+            Dim boolArray As Boolean() = New Boolean() {}
+            Dim nonEmpty As Integer() = New Integer() {1, 2, 3}
+
+            ' Classic syntax
+            Assert.IsEmpty(boolArray)
+            Assert.IsNotEmpty(nonEmpty)
+
+            ' Helper syntax
+            Assert.That(boolArray, Iz.Empty)
+            Assert.That(nonEmpty, Iz.Not.Empty)
+
+            ' Inherited syntax
+            Expect(boolArray, Iz.Empty)
+            Expect(nonEmpty, Iz.Not.Empty)
+        End Sub
+#End Region
+
+#Region "TypeConstraint Tests"
+        <Test()> _
+        Public Sub ExactTypeTests()
+            ' Classic syntax workarounds
+            Assert.AreEqual(GetType(String), "Hello".GetType())
+            Assert.AreEqual("System.String", "Hello".GetType().FullName)
+            Assert.AreNotEqual(GetType(Integer), "Hello".GetType())
+            Assert.AreNotEqual("System.Int32", "Hello".GetType().FullName)
+
+            ' Helper syntax
+            Assert.That("Hello", Iz.TypeOf(GetType(String)))
+            Assert.That("Hello", Iz.Not.TypeOf(GetType(Integer)))
+
+            ' Inherited syntax
+            Expect("Hello", Iz.TypeOf(GetType(String)))
+            Expect("Hello", Iz.Not.TypeOf(GetType(Integer)))
+        End Sub
+
+        <Test()> _
+        Public Sub InstanceOfTests()
+            ' Classic syntax
+            Assert.IsInstanceOf(GetType(String), "Hello")
+            Assert.IsNotInstanceOf(GetType(String), 5)
+
+            ' Helper syntax
+            Assert.That("Hello", Iz.InstanceOf(GetType(String)))
+            Assert.That(5, Iz.Not.InstanceOf(GetType(String)))
+
+            ' Inherited syntax
+            Expect("Hello", InstanceOf(GetType(String)))
+            Expect(5, Iz.Not.InstanceOf(GetType(String)))
+        End Sub
+
+        <Test()> _
+        Public Sub AssignableFromTypeTests()
+            ' Classic syntax
+            Assert.IsAssignableFrom(GetType(String), "Hello")
+            Assert.IsNotAssignableFrom(GetType(String), 5)
+
+            ' Helper syntax
+            Assert.That("Hello", Iz.AssignableFrom(GetType(String)))
+            Assert.That(5, Iz.Not.AssignableFrom(GetType(String)))
+
+            ' Inherited syntax
+            Expect("Hello", AssignableFrom(GetType(String)))
+            Expect(5, Iz.Not.AssignableFrom(GetType(String)))
+        End Sub
+#End Region
+
+#Region "StringConstraintTests"
+        <Test()> _
+        Public Sub SubstringTests()
+            Dim phrase As String = "Hello World!"
+            Dim array As String() = New String() {"abc", "bad", "dba"}
+
+            ' Classic Syntax
+            StringAssert.Contains("World", phrase)
+
+            ' Helper syntax
+            Assert.That(phrase, Iz.StringContaining("World"))
+            ' Only available using new syntax
+            Assert.That(phrase, Iz.Not.StringContaining("goodbye"))
+            Assert.That(phrase, Iz.StringContaining("WORLD").IgnoreCase)
+            Assert.That(phrase, Iz.Not.StringContaining("BYE").IgnoreCase)
+            Assert.That(array, Iz.All.StringContaining("b"))
+
+            ' Inherited syntax
+            Expect(phrase, Contains("World"))
+            ' Only available using new syntax
+            Expect(phrase, Iz.Not.Contains("goodbye"))
+            Expect(phrase, Contains("WORLD").IgnoreCase)
+            Expect(phrase, Iz.Not.Contains("BYE").IgnoreCase)
+            Expect(array, All.Contains("b"))
+        End Sub
+
+        <Test()> _
+        Public Sub StartsWithTests()
+            Dim phrase As String = "Hello World!"
+            Dim greetings As String() = New String() {"Hello!", "Hi!", "Hola!"}
+
+            ' Classic syntax
+            StringAssert.StartsWith("Hello", phrase)
+
+            ' Helper syntax
+            Assert.That(phrase, Iz.StringStarting("Hello"))
+            ' Only available using new syntax
+            Assert.That(phrase, Iz.Not.StringStarting("Hi!"))
+            Assert.That(phrase, Iz.StringStarting("HeLLo").IgnoreCase)
+            Assert.That(phrase, Iz.Not.StringStarting("HI").IgnoreCase)
+            Assert.That(greetings, Iz.All.StringStarting("h").IgnoreCase)
+
+            ' Inherited syntax
+            Expect(phrase, StartsWith("Hello"))
+            ' Only available using new syntax
+            Expect(phrase, Iz.Not.StringStarting("Hi!"))
+            Expect(phrase, StartsWith("HeLLo").IgnoreCase)
+            Expect(phrase, Iz.Not.StringStarting("HI").IgnoreCase)
+            Expect(greetings, All.StartsWith("h").IgnoreCase)
+        End Sub
+
+        <Test()> _
+        Public Sub EndsWithTests()
+            Dim phrase As String = "Hello World!"
+            Dim greetings As String() = New String() {"Hello!", "Hi!", "Hola!"}
+
+            ' Classic Syntax
+            StringAssert.EndsWith("!", phrase)
+
+            ' Helper syntax
+            Assert.That(phrase, Iz.StringEnding("!"))
+            ' Only available using new syntax
+            Assert.That(phrase, Iz.Not.StringEnding("?"))
+            Assert.That(phrase, Iz.StringEnding("WORLD!").IgnoreCase)
+            Assert.That(greetings, Iz.All.StringEnding("!"))
+
+            ' Inherited syntax
+            Expect(phrase, EndsWith("!"))
+            ' Only available using new syntax
+            Expect(phrase, Iz.Not.StringEnding("?"))
+            Expect(phrase, EndsWith("WORLD!").IgnoreCase)
+            Expect(greetings, All.EndsWith("!"))
+        End Sub
+
+        <Test()> _
+        Public Sub EqualIgnoringCaseTests()
+
+            Dim phrase As String = "Hello World!"
+            Dim array1 As String() = New String() {"Hello", "World"}
+            Dim array2 As String() = New String() {"HELLO", "WORLD"}
+            Dim array3 As String() = New String() {"HELLO", "Hello", "hello"}
+
+            ' Classic syntax
+            StringAssert.AreEqualIgnoringCase("hello world!", phrase)
+
+            ' Helper syntax
+            Assert.That(phrase, Iz.EqualTo("hello world!").IgnoreCase)
+            'Only available using new syntax
+            Assert.That(phrase, Iz.Not.EqualTo("goodbye world!").IgnoreCase)
+            Assert.That(array1, Iz.EqualTo(array2).IgnoreCase)
+            Assert.That(array3, Iz.All.EqualTo("hello").IgnoreCase)
+
+            ' Inherited syntax
+            Expect(phrase, EqualTo("hello world!").IgnoreCase)
+            'Only available using new syntax
+            Expect(phrase, Iz.Not.EqualTo("goodbye world!").IgnoreCase)
+            Expect(array1, EqualTo(array2).IgnoreCase)
+            Expect(array3, All.EqualTo("hello").IgnoreCase)
+        End Sub
+
+        <Test()> _
+        Public Sub RegularExpressionTests()
+            Dim phrase As String = "Now is the time for all good men to come to the aid of their country."
+            Dim quotes As String() = New String() {"Never say never", "It's never too late", "Nevermore!"}
+
+            ' Classic syntax
+            StringAssert.IsMatch("all good men", phrase)
+            StringAssert.IsMatch("Now.*come", phrase)
+
+            ' Helper syntax
+            Assert.That(phrase, Iz.StringMatching("all good men"))
+            Assert.That(phrase, Iz.StringMatching("Now.*come"))
+            ' Only available using new syntax
+            Assert.That(phrase, Iz.Not.StringMatching("all.*men.*good"))
+            Assert.That(quotes, Iz.All.StringMatching("never").IgnoreCase)
+
+            ' Inherited syntax
+            Expect(phrase, Matches("all good men"))
+            Expect(phrase, Matches("Now.*come"))
+            ' Only available using new syntax
+            Expect(phrase, Iz.Not.StringMatching("all.*men.*good"))
+            Expect(phrase, Matches("ALL").IgnoreCase)
+            Expect(quotes, All.Matches("never").IgnoreCase)
+        End Sub
+#End Region
+
+#Region "Equality Tests"
+        <Test()> _
+        Public Sub EqualityTests()
+
+            Dim i3 As Integer() = {1, 2, 3}
+            Dim d3 As Double() = {1.0, 2.0, 3.0}
+            Dim iunequal As Integer() = {1, 3, 2}
+
+            ' Classic Syntax
+            Assert.AreEqual(4, 2 + 2)
+            Assert.AreEqual(i3, d3)
+            Assert.AreNotEqual(5, 2 + 2)
+            Assert.AreNotEqual(i3, iunequal)
+
+            ' Helper syntax
+            Assert.That(2 + 2, Iz.EqualTo(4))
+            Assert.That(2 + 2 = 4)
+            Assert.That(i3, Iz.EqualTo(d3))
+            Assert.That(2 + 2, Iz.Not.EqualTo(5))
+            Assert.That(i3, Iz.Not.EqualTo(iunequal))
+
+            ' Inherited syntax
+            Expect(2 + 2, EqualTo(4))
+            Expect(2 + 2 = 4)
+            Expect(i3, EqualTo(d3))
+            Expect(2 + 2, Iz.Not.EqualTo(5))
+            Expect(i3, Iz.Not.EqualTo(iunequal))
+        End Sub
+
+        <Test()> _
+        Public Sub EqualityTestsWithTolerance()
+            ' CLassic syntax
+            Assert.AreEqual(5.0R, 4.99R, 0.05R)
+            Assert.AreEqual(5.0F, 4.99F, 0.05F)
+
+            ' Helper syntax
+            Assert.That(4.99R, Iz.EqualTo(5.0R).Within(0.05R))
+            Assert.That(4D, Iz.Not.EqualTo(5D).Within(0.5D))
+            Assert.That(4.99F, Iz.EqualTo(5.0F).Within(0.05F))
+            Assert.That(4.99D, Iz.EqualTo(5D).Within(0.05D))
+            Assert.That(499, Iz.EqualTo(500).Within(5))
+            Assert.That(4999999999L, Iz.EqualTo(5000000000L).Within(5L))
+
+            ' Inherited syntax
+            Expect(4.99R, EqualTo(5.0R).Within(0.05R))
+            Expect(4D, Iz.Not.EqualTo(5D).Within(0.5D))
+            Expect(4.99F, EqualTo(5.0F).Within(0.05F))
+            Expect(4.99D, EqualTo(5D).Within(0.05D))
+            Expect(499, EqualTo(500).Within(5))
+            Expect(4999999999L, EqualTo(5000000000L).Within(5L))
+        End Sub
+
+        <Test()> _
+        Public Sub EqualityTestsWithTolerance_MixedFloatAndDouble()
+            ' Bug Fix 1743844
+            Assert.That(2.20492R, Iz.EqualTo(2.2R).Within(0.01F), _
+                "Double actual, Double expected, Single tolerance")
+            Assert.That(2.20492R, Iz.EqualTo(2.2F).Within(0.01R), _
+                "Double actual, Single expected, Double tolerance")
+            Assert.That(2.20492R, Iz.EqualTo(2.2F).Within(0.01F), _
+                "Double actual, Single expected, Single tolerance")
+            Assert.That(2.20492F, Iz.EqualTo(2.2F).Within(0.01R), _
+                "Single actual, Single expected, Double tolerance")
+            Assert.That(2.20492F, Iz.EqualTo(2.2R).Within(0.01R), _
+                "Single actual, Double expected, Double tolerance")
+            Assert.That(2.20492F, Iz.EqualTo(2.2R).Within(0.01F), _
+                "Single actual, Double expected, Single tolerance")
+        End Sub
+
+        <Test()> _
+        Public Sub EqualityTestsWithTolerance_MixingTypesGenerally()
+            ' Extending tolerance to all numeric types
+            Assert.That(202.0R, Iz.EqualTo(200.0R).Within(2), _
+                "Double actual, Double expected, int tolerance")
+            Assert.That(4.87D, Iz.EqualTo(5).Within(0.25R), _
+                "Decimal actual, int expected, Double tolerance")
+            Assert.That(4.87D, Iz.EqualTo(5L).Within(1), _
+                "Decimal actual, long expected, int tolerance")
+            Assert.That(487, Iz.EqualTo(500).Within(25), _
+                "int actual, int expected, int tolerance")
+            Assert.That(487L, Iz.EqualTo(500).Within(25), _
+                "long actual, int expected, int tolerance")
+        End Sub
+#End Region
+
+#Region "Comparison Tests"
+        <Test()> _
+        Public Sub ComparisonTests()
+            ' Classic Syntax
+            Assert.Greater(7, 3)
+            Assert.GreaterOrEqual(7, 3)
+            Assert.GreaterOrEqual(7, 7)
+
+            ' Helper syntax
+            Assert.That(7, Iz.GreaterThan(3))
+            Assert.That(7, Iz.GreaterThanOrEqualTo(3))
+            Assert.That(7, Iz.AtLeast(3))
+            Assert.That(7, Iz.GreaterThanOrEqualTo(7))
+            Assert.That(7, Iz.AtLeast(7))
+
+            ' Inherited syntax
+            Expect(7, GreaterThan(3))
+            Expect(7, GreaterThanOrEqualTo(3))
+            Expect(7, AtLeast(3))
+            Expect(7, GreaterThanOrEqualTo(7))
+            Expect(7, AtLeast(7))
+
+            ' Classic syntax
+            Assert.Less(3, 7)
+            Assert.LessOrEqual(3, 7)
+            Assert.LessOrEqual(3, 3)
+
+            ' Helper syntax
+            Assert.That(3, Iz.LessThan(7))
+            Assert.That(3, Iz.LessThanOrEqualTo(7))
+            Assert.That(3, Iz.AtMost(7))
+            Assert.That(3, Iz.LessThanOrEqualTo(3))
+            Assert.That(3, Iz.AtMost(3))
+
+            ' Inherited syntax
+            Expect(3, LessThan(7))
+            Expect(3, LessThanOrEqualTo(7))
+            Expect(3, AtMost(7))
+            Expect(3, LessThanOrEqualTo(3))
+            Expect(3, AtMost(3))
+        End Sub
+#End Region
+
+#Region "Collection Tests"
+        <Test()> _
+        Public Sub AllItemsTests()
+
+            Dim ints As Object() = {1, 2, 3, 4}
+            Dim doubles As Object() = {0.99, 2.1, 3.0, 4.05}
+            Dim strings As Object() = {"abc", "bad", "cab", "bad", "dad"}
+
+            ' Classic syntax
+            CollectionAssert.AllItemsAreNotNull(ints)
+            CollectionAssert.AllItemsAreInstancesOfType(ints, GetType(Integer))
+            CollectionAssert.AllItemsAreInstancesOfType(strings, GetType(String))
+            CollectionAssert.AllItemsAreUnique(ints)
+
+            ' Helper syntax
+            Assert.That(ints, Iz.All.Not.Null)
+            Assert.That(ints, Has.None.Null)
+            Assert.That(ints, Iz.All.InstanceOf(GetType(Integer)))
+            Assert.That(ints, Has.All.InstanceOf(GetType(Integer)))
+            Assert.That(strings, Iz.All.InstanceOf(GetType(String)))
+            Assert.That(strings, Has.All.InstanceOf(GetType(String)))
+            Assert.That(ints, Iz.Unique)
+            ' Only available using new syntax
+            Assert.That(strings, Iz.Not.Unique)
+            Assert.That(ints, Iz.All.GreaterThan(0))
+            Assert.That(ints, Has.All.GreaterThan(0))
+            Assert.That(ints, Has.None.LessThanOrEqualTo(0))
+            Assert.That(strings, Iz.All.StringContaining("a"))
+            Assert.That(strings, Has.All.Contains("a"))
+            Assert.That(strings, Has.Some.StartsWith("ba"))
+            Assert.That(strings, Has.Some.Property("Length").EqualTo(3))
+            Assert.That(strings, Has.Some.StartsWith("BA").IgnoreCase)
+            Assert.That(doubles, Has.Some.EqualTo(1.0).Within(0.05))
+
+            ' Inherited syntax
+            Expect(ints, All.Not.Null)
+            Expect(ints, None.Null)
+            Expect(ints, All.InstanceOf(GetType(Integer)))
+            Expect(strings, All.InstanceOf(GetType(String)))
+            Expect(ints, Unique)
+            ' Only available using new syntax
+            Expect(strings, Iz.Not.Unique)
+            Expect(ints, All.GreaterThan(0))
+            Expect(strings, All.Contains("a"))
+            Expect(strings, Some.StartsWith("ba"))
+            Expect(strings, Some.StartsWith("BA").IgnoreCase)
+            Expect(doubles, Some.EqualTo(1.0).Within(0.05))
+        End Sub
+
+        <Test()> _
+       Public Sub SomeItemsTests()
+
+            Dim mixed As Object() = {1, 2, "3", Nothing, "four", 100}
+            Dim strings As Object() = {"abc", "bad", "cab", "bad", "dad"}
+
+            ' Not available using the classic syntax
+
+            ' Helper syntax
+            Assert.That(mixed, Has.Some.Null)
+            Assert.That(mixed, Has.Some.InstanceOf(GetType(Integer)))
+            Assert.That(mixed, Has.Some.InstanceOf(GetType(String)))
+            Assert.That(strings, Has.Some.StartsWith("ba"))
+            Assert.That(strings, Has.Some.Not.StartsWith("ba"))
+
+            ' Inherited syntax
+            Expect(mixed, Some.Null)
+            Expect(mixed, Some.InstanceOf(GetType(Integer)))
+            Expect(mixed, Some.InstanceOf(GetType(String)))
+            Expect(strings, Some.StartsWith("ba"))
+            Expect(strings, Some.Not.StartsWith("ba"))
+        End Sub
+
+        <Test()> _
+        Public Sub NoItemsTests()
+
+            Dim ints As Object() = {1, 2, 3, 4, 5}
+            Dim strings As Object() = {"abc", "bad", "cab", "bad", "dad"}
+
+            ' Not available using the classic syntax
+
+            ' Helper syntax
+            Assert.That(ints, Has.None.Null)
+            Assert.That(ints, Has.None.InstanceOf(GetType(String)))
+            Assert.That(ints, Has.None.GreaterThan(99))
+            Assert.That(strings, Has.None.StartsWith("qu"))
+
+            ' Inherited syntax
+            Expect(ints, None.Null)
+            Expect(ints, None.InstanceOf(GetType(String)))
+            Expect(ints, None.GreaterThan(99))
+            Expect(strings, None.StartsWith("qu"))
+        End Sub
+
+        <Test()> _
+        Public Sub CollectionContainsTests()
+
+            Dim iarray As Integer() = {1, 2, 3}
+            Dim sarray As String() = {"a", "b", "c"}
+
+            ' Classic syntax
+            Assert.Contains(3, iarray)
+            Assert.Contains("b", sarray)
+            CollectionAssert.Contains(iarray, 3)
+            CollectionAssert.Contains(sarray, "b")
+            CollectionAssert.DoesNotContain(sarray, "x")
+            ' Showing that Contains uses NUnit equality
+            CollectionAssert.Contains(iarray, 1.0R)
+
+            ' Helper syntax
+            Assert.That(iarray, Has.Member(3))
+            Assert.That(sarray, Has.Member("b"))
+            Assert.That(sarray, Has.No.Member("x"))
+            ' Showing that Contains uses NUnit equality
+            Assert.That(iarray, Has.Member(1.0R))
+
+            ' Only available using the new syntax
+            ' Note that EqualTo and SameAs do NOT give
+            ' identical results to Contains because 
+            ' Contains uses Object.Equals()
+            Assert.That(iarray, Has.Some.EqualTo(3))
+            Assert.That(iarray, Has.Member(3))
+            Assert.That(sarray, Has.Some.EqualTo("b"))
+            Assert.That(sarray, Has.None.EqualTo("x"))
+            Assert.That(iarray, Has.None.SameAs(1.0R))
+            Assert.That(iarray, Has.All.LessThan(10))
+            Assert.That(sarray, Has.All.Length.EqualTo(1))
+            Assert.That(sarray, Has.None.Property("Length").GreaterThan(3))
+
+            ' Inherited syntax
+            Expect(iarray, Contains(3))
+            Expect(sarray, Contains("b"))
+            Expect(sarray, Has.No.Member("x"))
+
+            ' Only available using new syntax
+            ' Note that EqualTo and SameAs do NOT give
+            ' identical results to Contains because 
+            ' Contains uses Object.Equals()
+            Expect(iarray, Some.EqualTo(3))
+            Expect(sarray, Some.EqualTo("b"))
+            Expect(sarray, None.EqualTo("x"))
+            Expect(iarray, All.LessThan(10))
+            Expect(sarray, All.Length.EqualTo(1))
+            Expect(sarray, None.Property("Length").GreaterThan(3))
+        End Sub
+
+        <Test()> _
+        Public Sub CollectionEquivalenceTests()
+
+            Dim ints1to5 As Integer() = {1, 2, 3, 4, 5}
+            Dim twothrees As Integer() = {1, 2, 3, 3, 4, 5}
+            Dim twofours As Integer() = {1, 2, 3, 4, 4, 5}
+
+            ' Classic syntax
+            CollectionAssert.AreEquivalent(New Integer() {2, 1, 4, 3, 5}, ints1to5)
+            CollectionAssert.AreNotEquivalent(New Integer() {2, 2, 4, 3, 5}, ints1to5)
+            CollectionAssert.AreNotEquivalent(New Integer() {2, 4, 3, 5}, ints1to5)
+            CollectionAssert.AreNotEquivalent(New Integer() {2, 2, 1, 1, 4, 3, 5}, ints1to5)
+            CollectionAssert.AreNotEquivalent(twothrees, twofours)
+
+            ' Helper syntax
+            Assert.That(New Integer() {2, 1, 4, 3, 5}, Iz.EquivalentTo(ints1to5))
+            Assert.That(New Integer() {2, 2, 4, 3, 5}, Iz.Not.EquivalentTo(ints1to5))
+            Assert.That(New Integer() {2, 4, 3, 5}, Iz.Not.EquivalentTo(ints1to5))
+            Assert.That(New Integer() {2, 2, 1, 1, 4, 3, 5}, Iz.Not.EquivalentTo(ints1to5))
+            Assert.That(twothrees, Iz.Not.EquivalentTo(twofours))
+
+            ' Inherited syntax
+            Expect(New Integer() {2, 1, 4, 3, 5}, EquivalentTo(ints1to5))
+        End Sub
+
+        <Test()> _
+        Public Sub SubsetTests()
+
+            Dim ints1to5 As Integer() = {1, 2, 3, 4, 5}
+
+            ' Classic syntax
+            CollectionAssert.IsSubsetOf(New Integer() {1, 3, 5}, ints1to5)
+            CollectionAssert.IsSubsetOf(New Integer() {1, 2, 3, 4, 5}, ints1to5)
+            CollectionAssert.IsNotSubsetOf(New Integer() {2, 4, 6}, ints1to5)
+            CollectionAssert.IsNotSubsetOf(New Integer() {1, 2, 2, 2, 5}, ints1to5)
+
+            ' Helper syntax
+            Assert.That(New Integer() {1, 3, 5}, Iz.SubsetOf(ints1to5))
+            Assert.That(New Integer() {1, 2, 3, 4, 5}, Iz.SubsetOf(ints1to5))
+            Assert.That(New Integer() {2, 4, 6}, Iz.Not.SubsetOf(ints1to5))
+
+            ' Inherited syntax
+            Expect(New Integer() {1, 3, 5}, SubsetOf(ints1to5))
+            Expect(New Integer() {1, 2, 3, 4, 5}, SubsetOf(ints1to5))
+            Expect(New Integer() {2, 4, 6}, Iz.Not.SubsetOf(ints1to5))
+        End Sub
+#End Region
+
+#Region "Property Tests"
+        <Test()> _
+        Public Sub PropertyTests()
+
+            Dim array As String() = {"abc", "bca", "xyz", "qrs"}
+            Dim array2 As String() = {"a", "ab", "abc"}
+            Dim list As New ArrayList(array)
+
+            ' Not available using the classic syntax
+
+            ' Helper syntax
+            ' Assert.That(list, Has.Property("Count"))
+            ' Assert.That(list, Has.No.Property("Length"))
+
+            Assert.That("Hello", Has.Length.EqualTo(5))
+            Assert.That("Hello", Has.Property("Length").EqualTo(5))
+            Assert.That("Hello", Has.Property("Length").GreaterThan(3))
+
+            Assert.That(array, Has.Property("Length").EqualTo(4))
+            Assert.That(array, Has.Length.EqualTo(4))
+            Assert.That(array, Has.Property("Length").LessThan(10))
+
+            Assert.That(array, Has.All.Property("Length").EqualTo(3))
+            Assert.That(array, Has.All.Length.EqualTo(3))
+            Assert.That(array, Iz.All.Length.EqualTo(3))
+            Assert.That(array, Has.All.Property("Length").EqualTo(3))
+            Assert.That(array, Iz.All.Property("Length").EqualTo(3))
+
+            Assert.That(array2, Iz.Not.Property("Length").EqualTo(4))
+            Assert.That(array2, Iz.Not.Length.EqualTo(4))
+            Assert.That(array2, Has.No.Property("Length").GreaterThan(3))
+
+            ' Inherited syntax
+            ' Expect(list, Has.Property("Count"))
+            ' Expect(list, Has.No.Property("Nada"))
+
+            Expect(array, All.Property("Length").EqualTo(3))
+            Expect(array, All.Length.EqualTo(3))
+        End Sub
+#End Region
+
+#Region "Not Tests"
+        <Test()> _
+        Public Sub NotTests()
+            ' Not available using the classic syntax
+
+            ' Helper syntax
+            Assert.That(42, Iz.Not.Null)
+            Assert.That(42, Iz.Not.True)
+            Assert.That(42, Iz.Not.False)
+            Assert.That(2.5, Iz.Not.NaN)
+            Assert.That(2 + 2, Iz.Not.EqualTo(3))
+            Assert.That(2 + 2, Iz.Not.Not.EqualTo(4))
+            Assert.That(2 + 2, Iz.Not.Not.Not.EqualTo(5))
+
+            ' Inherited syntax
+            Expect(42, Iz.Not.Null)
+            Expect(42, Iz.Not.True)
+            Expect(42, Iz.Not.False)
+            Expect(2.5, Iz.Not.NaN)
+            Expect(2 + 2, Iz.Not.EqualTo(3))
+            Expect(2 + 2, Iz.Not.Not.EqualTo(4))
+            Expect(2 + 2, Iz.Not.Not.Not.EqualTo(5))
+        End Sub
+#End Region
+
+    End Class
+
+End Namespace
+
diff --git a/samples/vb/syntax/vb-syntax.build b/samples/vb/syntax/vb-syntax.build
index 0d253cf..aa0f584 100644
--- a/samples/vb/syntax/vb-syntax.build
+++ b/samples/vb/syntax/vb-syntax.build
@@ -1,11 +1,11 @@
-<?xml version="1.0"?>
-<project name="vb-syntax" default="build">
-
-  <include buildfile="../../samples.common" />
-  
-  <patternset id="source-files">
-    <include name="AssemblyInfo.vb" />
-    <include name="AssertSyntaxTests.vb" />
-  </patternset>
-
+<?xml version="1.0"?>
+<project name="vb-syntax" default="build">
+
+  <include buildfile="../../samples.common" />
+  
+  <patternset id="source-files">
+    <include name="AssemblyInfo.vb" />
+    <include name="AssertSyntaxTests.vb" />
+  </patternset>
+
 </project>
\ No newline at end of file
diff --git a/samples/vb/syntax/vb-syntax.vbproj b/samples/vb/syntax/vb-syntax.vbproj
index 5dac155..ec9e175 100644
--- a/samples/vb/syntax/vb-syntax.vbproj
+++ b/samples/vb/syntax/vb-syntax.vbproj
@@ -1,29 +1,136 @@
-<VisualStudioProject>
-  <VisualBasic ProjectType="Local" ProductVersion="7.10.3077" SchemaVersion="2.0" ProjectGuid="{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}">
-    <Build>
-      <Settings ApplicationIcon="" AssemblyKeyContainerName="" AssemblyName="vb-syntax" AssemblyOriginatorKeyFile="" AssemblyOriginatorKeyMode="None" DefaultClientScript="JScript" DefaultHTMLPageLayout="Grid" DefaultTargetSchema="IE50" DelaySign="false" OutputType="Library" OptionCompare="Binary" OptionExplicit="On" OptionStrict="Off" RootNamespace="NUnit.Samples" StartupObject="NUnit.Samples.(None)">
-        <Config Name="Debug" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="" DefineDebug="true" DefineTrace="true" DebugSymbols="true" IncrementalBuild="true" Optimize="false" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="1" />
-        <Config Name="Release" BaseAddress="285212672" ConfigurationOverrideFile="" DefineConstants="" DefineDebug="false" DefineTrace="true" DebugSymbols="false" IncrementalBuild="false" Optimize="true" OutputPath="bin\" RegisterForComInterop="false" RemoveIntegerChecks="false" TreatWarningsAsErrors="false" WarningLevel="1" />
-      </Settings>
-      <References>
-        <Reference Name="System" AssemblyName="System" />
-        <Reference Name="System.Data" AssemblyName="System.Data" />
-        <Reference Name="System.XML" AssemblyName="System.Xml" />
-        <Reference Name="nunit.framework" AssemblyName="nunit.framework, Version=2.5, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" HintPath="..\..\..\bin\net-1.1\framework\nunit.framework.dll" />
-      </References>
-      <Imports>
-        <Import Namespace="Microsoft.VisualBasic" />
-        <Import Namespace="System" />
-        <Import Namespace="System.Collections" />
-        <Import Namespace="System.Data" />
-        <Import Namespace="System.Diagnostics" />
-      </Imports>
-    </Build>
-    <Files>
-      <Include>
-        <File RelPath="AssemblyInfo.vb" SubType="Code" BuildAction="Compile" />
-        <File RelPath="AssertSyntaxTests.vb" SubType="Code" BuildAction="Compile" />
-      </Include>
-    </Files>
-  </VisualBasic>
-</VisualStudioProject>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>7.10.3077</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon />
+    <AssemblyKeyContainerName />
+    <AssemblyName>vb-syntax</AssemblyName>
+    <AssemblyOriginatorKeyFile />
+    <AssemblyOriginatorKeyMode>None</AssemblyOriginatorKeyMode>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <OptionCompare>Binary</OptionCompare>
+    <OptionExplicit>On</OptionExplicit>
+    <OptionStrict>Off</OptionStrict>
+    <RootNamespace>NUnit.Samples</RootNamespace>
+    <StartupObject>NUnit.Samples.%28None%29</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <MyType>Windows</MyType>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>0.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <DocumentationFile>vb-syntax.xml</DocumentationFile>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile />
+    <DefineConstants />
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <DocumentationFile>vb-syntax.xml</DocumentationFile>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile />
+    <DefineConstants />
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>false</DebugSymbols>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
+    <DebugType>none</DebugType>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.1.12217, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssertSyntaxTests.vb">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="My Project\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <PropertyGroup>
+    <PreBuildEvent />
+    <PostBuildEvent />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/samples/vb/vb-samples.sln b/samples/vb/vb-samples.sln
index f216509..6c83f8e 100644
--- a/samples/vb/vb-samples.sln
+++ b/samples/vb/vb-samples.sln
@@ -1,37 +1,31 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-failures", "failures\vb-failures.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-money", "money\vb-money.vbproj", "{95394B96-A794-48EA-9879-0E4EC79C5724}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-syntax", "syntax\vb-syntax.vbproj", "{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.ActiveCfg = Debug|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.Build.0 = Debug|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.ActiveCfg = Release|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.Build.0 = Release|.NET
-		{95394B96-A794-48EA-9879-0E4EC79C5724}.Debug.ActiveCfg = Debug|.NET
-		{95394B96-A794-48EA-9879-0E4EC79C5724}.Debug.Build.0 = Debug|.NET
-		{95394B96-A794-48EA-9879-0E4EC79C5724}.Release.ActiveCfg = Release|.NET
-		{95394B96-A794-48EA-9879-0E4EC79C5724}.Release.Build.0 = Release|.NET
-		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Debug.ActiveCfg = Debug|.NET
-		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Debug.Build.0 = Debug|.NET
-		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Release.ActiveCfg = Release|.NET
-		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Release.Build.0 = Release|.NET
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-failures", "failures\vb-failures.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-money", "money\vb-money.vbproj", "{95394B96-A794-48EA-9879-0E4EC79C5724}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-syntax", "syntax\vb-syntax.vbproj", "{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Any CPU.Build.0 = Release|Any CPU
+		{95394B96-A794-48EA-9879-0E4EC79C5724}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{95394B96-A794-48EA-9879-0E4EC79C5724}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{95394B96-A794-48EA-9879-0E4EC79C5724}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{95394B96-A794-48EA-9879-0E4EC79C5724}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6BEF566A-2691-4EE8-91AF-0390CCCDDAF1}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/scripts/nunit.build.targets b/scripts/nunit.build.targets
new file mode 100644
index 0000000..396a658
--- /dev/null
+++ b/scripts/nunit.build.targets
@@ -0,0 +1,504 @@
+<?xml version="1.0"?>
+<project name="NUnit" default="build" basedir="..">
+
+<!-- ***************************************************************** -->
+<!-- This script has been tested with the NAnt 0.92 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.  -->
+<!--                                                                   -->
+<!-- ***************************************************************** -->
+
+<!-- ***************************************************************** -->
+<!-- ***  Include common targets and initialize property settings  *** -->
+<!-- ***************************************************************** -->
+
+  <include buildfile="scripts/nunit.common.targets"/>
+
+  <call target="set-common-properties"/>
+
+<!-- ***************************************************************** -->
+<!-- ***             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>
+
+<!-- ***************************************************************** -->
+<!-- ***              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-2012 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="${internal.version}"/>
+        <attribute type="AssemblyInformationalVersionAttribute" value="${internal.version}"/>
+        <attribute type="AssemblyConfigurationAttribute" value="${package.configuration}"/>
+      </attributes>
+    </asminfo>
+
+  </target>
+
+
+<!-- ***************************************************************** -->
+<!-- ***              Targets that perform builds                  *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Build NUnit for default runtime version and config -->
+  <target name="build" depends="build-init"
+    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 -->
+    <copy todir="${current.lib.dir}" flatten="true">
+      <fileset basedir="${project.lib.dir}">
+        <include name="*"/>
+        <include name="3.5/*" if="${runtime.version >= '3.5'}"/>
+      </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="${runtime.version >= '2.0'}" />
+
+    <!-- Copy test project for this runtime framework -->
+    <property name="runtime.testproj" value="NUnitTests.v2.nunit"
+      if="${runtime.version >= '2.0'}"/>
+    <property name="runtime.testproj" value="NUnitTests.v1.nunit"
+      unless="${runtime.version >= '2.0'}"/>
+
+    <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="${runtime.version >= '2.0'}" 
+      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" />
+
+    <call target="run-test45" if="${framework::exists('net-4.5') and runtime.version >= '2.0'}"/>
+
+  </target>
+
+  <target name="test45" depends="build,run-test45"
+      description="Build and run tests of .NET 4.5 features"/>
+
+  <target name="run-test45"
+      description="Run tests of .NET 4.5 features">
+
+    <echo message="*"/>
+    <echo message="* Testing ${runtime.config} ${build.config} build"/>
+    <echo message="*    Running nunit.core.tests.net45.dll and nunit.framework.tests.net45.dll"/>
+    <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 -->
+
+    <exec basedir="${current.build.dir}"
+      workingdir="${current.build.dir}/tests" 
+	  program="nunit-console.exe" 
+      managed="strict"
+	  commandline="nunit.core.tests.net45.dll nunit.framework.tests.net45.dll ${nunit.options} -noxml:" />
+
+  </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.">
+
+    <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 used internally              ******** -->
+<!-- ***************************************************************** -->
+
+  <target name="build-init" depends="make-build-dir,gen-assembly-info">
+
+    <property name="build.debug" value="${build.config == 'debug'}"/>
+
+    <property name="build.defines" value="DEBUG,TRACE,${runtime.defines}"
+        dynamic="true" if="${build.config == 'debug'}"/>
+    <property name="build.defines" value="TRACE,${runtime.defines}"
+        dynamic="true" unless="${build.config == 'debug'}"/>
+
+  </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-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-assembly-net45/test-assembly-net45.build" />
+    <include name="tests/test-utilities/test-utilities.build" />
+
+    <!-- NUnit Base Tests -->
+    <include name="NUnitFramework/tests/nunit.framework.tests.build" />
+    <include name="NUnitFramework/tests-net45/nunit.framework.tests.net45.build" />
+    <include name="NUnitCore/tests/nunit.core.tests.build" />
+    <include name="NUnitCore/tests-net45/nunit.core.tests.net45.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"/>
+
+  </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" />
+
+    <!-- Project Editor -->
+    <include name="ProjectEditor/editor/nunit-editor.build" />
+
+    <!-- Project Editor Tests -->
+    <include name="ProjectEditor/tests/nunit-editor.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" />
+
+    <!-- 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()}" />
+
+    <!-- C++/CLI Samples -->
+    <include name="cpp/failures/cpp-cli-failures.build"
+      if="${platform::is-windows()}" />
+    <include name="cpp/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>
+
+</project>
diff --git a/scripts/nunit.common.targets b/scripts/nunit.common.targets
new file mode 100644
index 0000000..f468a2d
--- /dev/null
+++ b/scripts/nunit.common.targets
@@ -0,0 +1,440 @@
+<?xml version="1.0"?>
+<project name="NUnit" default="build" basedir=".">
+
+  <!-- ***************************************************************** -->
+  <!-- *********           Set Common Properties          ************** -->
+  <!-- ***************************************************************** -->
+
+  <target name="set-common-properties">
+
+  <!-- ***************************************************************** -->
+  <!-- ***        Properties to change for each new release          *** -->
+  <!-- ***************************************************************** -->
+
+    <!-- The nominal version has three components and is used for the name
+       of the install directory and on the program files menu. -->
+    <property name="nominal.version" value="2.6.3" />
+
+    <!-- The package version may include a prerelease suffix following
+       the three-component nominal version -->
+    <property name="package.version" value="${nominal.version}"/>
+
+    <!-- Package Configuration (Release, Alpha, Beta, etc.) -->
+    <property name="package.configuration" value=""/>
+
+  <!-- ***************************************************************** -->
+  <!-- ***   End of properties to change for each new release        *** -->
+  <!-- ***************************************************************** -->
+
+    <!-- Project name - used as a prefix for packages -->
+    <property name="project.name" value="NUnit"/>
+
+    <!-- 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}"/>
+
+    <!-- The internal version has four components and is used for assemblies and 
+       as the ProductVersion in the msi -->
+    <property name="internal.version" value="${nominal.version}.${package.build.number}"/>
+
+    <!-- Base name for packages - add suffix for Alpha, Beta, RC -->
+  <property name="package.base.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-3.5,net-4.0,net-4.5,net-1.1,mono-3.5,mono-4.0"/>
+
+  <!-- Packages we normally create -->
+  <property name="standard.packages" value="net-3.5,net-1.1" 
+      if="${platform::is-windows()}"/>
+  <property name="standard.packages" value="mono-3.5,mono-1.0"
+      unless="${platform::is-windows()}"/>
+
+  <!-- NuGet packages we create -->
+  <property name="nuget.packages"
+    value="nunit,nunit.mocks,pnunit,nunit.runners,nunit.editor"/>
+
+  <!-- Our standard package for general distribution -->
+  <property name="default.package.config" value="net-3.5" />
+
+  <!-- Options for runing the NUnit tests -->
+  <property name="nunit.options" value=""/>
+
+  <!-- Options for running light to create the msi -->
+  <property name="light.suppressices" value=""/>
+
+<!-- ***************************************************************** -->
+<!-- **********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,'builds')}"/>
+  <property name="project.package.dir" 
+    value="${path::combine(project.base.dir,'packages')}"/>
+  <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')}"/>
+  <property name="project.nuget.dir"
+    value="${path::combine(project.base.dir, 'nuget')}"/>
+
+  <!-- Set paths to various package directories -->
+  <property name="package.working.dir" 
+    value="${path::combine(project.package.dir,package.base.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.resource.dir"
+    value="${path::combine(package.working.dir,'resources')}"/>
+  <property name="package.install.dir"
+    value="${path::combine(package.working.dir,'install')}"/>
+
+  <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 )}">
+      <property name="installed.frameworks" value="${installed.frameworks},${framework}"
+        if="${property::exists('installed.frameworks')}"/>
+      <property name="installed.frameworks" value="${framework}"
+        unless="${property::exists('installed.frameworks')}"/>
+      <if test="${framework::sdk-exists( framework )}">
+        <property name="installed.sdks" value="${installed.sdks},${framework}"
+          if="${property::exists('installed.sdks')}"/>
+        <property name="installed.sdks" value="${framework}"
+          unless="${property::exists('installed.sdks')}"/>
+        <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-default-package-config" />
+
+</target>
+
+<!-- ***************************************************************** -->
+<!-- ***    Targets for setting the runtime configuration          *** -->
+<!-- ***************************************************************** -->
+
+  <target name="set-runtime-config">   
+
+    <property name="runtime.config" value="${default.runtime}"
+      unless="${property::exists('runtime.config')}"/>
+
+    <call target="check-sdk-exists"/>
+
+    <call target="set-${runtime.config}-runtime-config"/>
+
+    <property name="nant.settings.currentframework" value="${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">
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="1.0"/>
+    <property name="target.version" value="1.0"/>
+    <property name="runtime.defines" value="MSNET,CLR_1_0,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">
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="1.1"/>
+    <property name="target.version" value="1.1"/>
+    <property name="runtime.defines" value="MSNET,CLR_1_1,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">
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="2.0"/>
+    <property name="target.version" value="2.0"/>
+    <property name="runtime.defines" value="MSNET,CLR_2_0,NET_2_0"/>
+    <property name="supported.test.platforms" value="net-2.0,mono-2.0"/>
+
+  </target>-->
+   
+  <target name="set-net-3.5-runtime-config">
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="3.5"/>
+    <property name="target.version" value="2.0"/>
+    <property name="runtime.defines" value="MSNET,CLR_2_0,NET_3_5,CS_3_0"/>
+    <property name="supported.test.platforms" value="net-3.5,mono-3.5"/>
+
+  </target>
+ 	
+  <target name="set-net-4.0-runtime-config">
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="4.0"/>
+    <property name="target.version" value="2.0"/>
+    <property name="runtime.defines" value="MSNET,CLR_4_0,NET_4_0,CS_4_0"/>
+    <property name="supported.test.platforms" value="net-4.0"/>
+
+  </target>
+  
+  <target name="set-net-4.5-runtime-config">
+
+    <property name="runtime.platform" value="net"/>
+    <property name="runtime.version" value="4.5"/>
+    <property name="target.version" value="2.0"/>
+    <property name="runtime.defines" value="MSNET,CLR_4_0,NET_4_5,CS_5_0"/>
+    <property name="supported.test.platforms" value="net-4.5"/>
+
+  </target>
+ 	
+  <!--<target name="set-mono-1.0-runtime-config">
+
+    <property name="runtime.platform" value="mono"/>
+    <property name="runtime.version" value="1.0"/>
+    <property name="target.version" value="1.0"/>
+    <property name="runtime.defines" value="MONO,CLR_1_1,NET_1_1"/>
+    <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">
+
+    <property name="runtime.platform" value="mono"/>
+    <property name="runtime.version" value="2.0"/>
+    <property name="target.version" value="2.0"/>
+    <property name="runtime.defines" value="MONO,CLR_2_0,NET_2_0"/>
+    <property name="supported.test.platforms" value="mono-2.0,net-2.0"/>
+
+  </target>-->
+
+	<target name="set-mono-3.5-runtime-config">
+
+		<property name="runtime.platform" value="mono"/>
+		<property name="runtime.version" value="3.5"/>
+		<property name="target.version" value="2.0"/>
+		<property name="runtime.defines" value="MONO,CLR_2_0,NET_3_5,CS_3_0"/>
+		<property name="supported.test.platforms" value="mono-3.5,net-3.5,mono-2.0,net-2.0"/>
+
+	</target>
+
+	<target name="set-mono-4.0-runtime-config">
+
+		<property name="runtime.platform" value="mono"/>
+		<property name="runtime.version" value="4.0"/>
+		<property name="target.version" value="2.0"/>
+		<property name="runtime.defines" value="MONO,CLR_4_0,NET_4_0,CS_4_0"/>
+		<property name="supported.test.platforms" value="mono-4.0,net-4.0,mono-3.5,net-3.5,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-net-3.5-package-config">
+    <property name="package.config" value="net-3.5"/>
+  </target>
+
+  <target name="set-net-2.0-package-config">
+    <property name="package.config" value="net-2.0"/>
+  </target>
+
+  <target name="set-net-1.1-package-config">
+    <property name="package.config" value="net-1.1"/>
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- **************** Internally used targets ************************ -->
+<!-- ***************************************************************** -->
+
+  <!-- Check that current runtime is installed -->
+  <target name="check-runtime-exists">
+
+    <fail unless="${framework::exists(runtime.config)}"
+      message="The ${runtime.config} runtime is not installed"/>
+
+  </target>
+
+  <!-- Check that current runtime sdk is installed -->
+  <target name="check-sdk-exists" depends="check-runtime-exists">
+
+    <fail unless="${framework::sdk-exists(runtime.config)}"
+      message="The ${runtime.config} SDK is not configured or not installed"/>
+
+  </target>
+
+  <!-- Set up the build directory -->
+  <target name="set-build-dir" depends="set-runtime-config">
+
+    <property name="build.config" value="debug" 
+      unless="${property::exists('build.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>Runtimes Supported:</echo>
+    <echo>  ${supported.frameworks}</echo>
+    <echo>Runtimes Installed:</echo>
+    <echo>  ${installed.frameworks}</echo>
+    <echo>Framework SDKs Installed:</echo>
+    <echo>  ${installed.sdks}</echo>
+    <echo></echo>
+    <if test="${property::exists('default.net.runtime')}">
+    <echo>Default .Net Runtime: ${default.net.runtime}</echo>
+    </if>
+    <if test="${not property::exists('default.net.runtime')}">
+    <echo>Default .Net Runtime: (none)</echo>
+    </if>
+    <if test="${property::exists('default.mono.runtime')}">
+    <echo>Default Mono Runtime: ${default.mono.runtime}</echo>
+    </if>
+    <if test="${not property::exists('default.mono.runtime')}">
+    <echo>Default Mono Runtime: (none)</echo>
+    </if>
+    <echo>     General Default: ${default.runtime}</echo>
+    <echo></echo>
+    <echo>Current Build Info</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>  Base Name: ${package.base.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/scripts/nunit.package.targets b/scripts/nunit.package.targets
new file mode 100644
index 0000000..334a2ea
--- /dev/null
+++ b/scripts/nunit.package.targets
@@ -0,0 +1,638 @@
+<?xml version="1.0"?>
+<project name="NUnit" default="help" basedir="..">
+
+<!-- ***************************************************************** -->
+<!-- This script has been tested with the NAnt 0.92 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.  -->
+<!--                                                                   -->
+<!-- ***************************************************************** -->
+
+<!-- ***************************************************************** -->
+<!-- ***  Include common targets and initialize property settings  *** -->
+<!-- ***************************************************************** -->
+
+  <include buildfile="scripts/nunit.common.targets"/>
+
+  <call target="set-common-properties"/>
+
+<!-- ***************************************************************** -->
+<!-- ***             Targets that clean directories                *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Removes the current package working directory -->
+  <target name="clean-package-dir">
+
+        <delete dir="${package.working.dir}" 
+            if="${directory::exists( package.working.dir )}"/>
+
+  </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"/>
+
+    <call target="package-samples"/>
+
+    <call target="package-nuget"/>
+
+    <foreach item="String" delim="," 
+        property="runtime.config" in="${standard.packages}">
+
+      <call target="set-runtime-config"/>
+      <call target="package"/>
+
+    </foreach>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***            Package Binaries From Current Build            *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-build" depends="set-build-dir, set-package-name"
+      description="Create a zip of the current build (not a full installation)">
+
+    <zip ziplevel="9"
+        zipfile="${project.package.dir}/${package.name}.zip">
+      <fileset basedir="${current.build.dir}" prefix="${package.base.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,set-package-name"
+      description="Create a package using the current or default config">
+
+    <call target="create-zip"/>
+    <call target="create-msi" if="${platform::is-windows()}"/>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                    Package as a zip                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-zip" 
+    depends="build-install-image,set-package-name,create-zip"
+    description="Create zip binary distribution package"/>
+
+<!-- ***************************************************************** -->
+<!-- ***                   Package as an msi                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-msi" 
+    depends="build-install-image,set-package-name,create-msi" 
+    description="Build standard msi file and deploy it to the package dir"/>
+
+<!-- ***************************************************************** -->
+<!-- ***                     Install the msi                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="install-msi" depends="set-package-name"
+      description="Install msi file on system" >
+
+      <exec program="msiexec" workingdir="${project.package.dir}"
+        commandline="/i ${package.name}.msi /passive" />
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                   Uninstall the msi                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="remove-msi" depends="set-package-name"
+    description="Uninstall an msi" >
+
+        <exec program="msiexec" workingdir="${project.package.dir}"
+          commandline="/x ${package.name}.msi /passive" /> 
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                    Create the zip                         *** -->
+<!-- ***************************************************************** -->
+
+  <!-- Create zip from existing install image -->
+  <target name="create-zip">
+
+    <!--<call target="set-package-name"/>-->
+
+    <zip ziplevel="9"
+        zipfile="${project.package.dir}/${package.name}.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.base.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()}"/>
+
+    <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"/>
+
+    <!--<call target="set-package-name"/>-->
+
+    <candle out="${work.dir}/" exedir="${wix.dir}">
+      <defines>
+        <define name="ProductVersion" value="${internal.version}" />
+        <define name="NominalVersion" value="${nominal.version}" />
+        <define name="TargetRuntime" value="${runtime.version}" />
+        <define name="InstallImage" value="packages\NUnit-${package.version}" />
+      </defines>
+      <sources basedir="${install.dir}">
+        <include name="NUnit.wxs" if="${runtime.version >= '2.0'}"/>
+        <include name="NUnit-net-1.1.wxs" unless="${runtime.version >= '2.0'}"/>
+        <include name="base.wxs" if="${runtime.version >= '2.0'}"/>
+        <include name="base-net-1.1.wxs" unless="${runtime.version >= '2.0'}"/>
+        <include name="tests.wxs" />
+        <include name="pnunit.wxs" />
+        <include name="doc.wxs"  if="${runtime.version >= '2.0'}"/>
+        <include name="nunit-gui.wxs" if="${runtime.version >= '2.0'}"/>
+        <include name="net45-tests.wxs" if="${runtime.version >= '2.0'}"/>
+        <include name="NSubstitute.wxs" if="${runtime.version >= '2.0'}"/>
+      </sources>
+    </candle>
+
+    <light exedir="${wix.dir}"
+      out="${project.package.dir}/${package.name}.msi"
+      suppressices="${light.suppressices}"
+      extensions="WixUIExtension">
+      <sources>
+        <include name="${work.dir}/NUnit.wixobj" if="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/NUnit-net-1.1.wixobj" unless="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/base.wixobj" if="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/base-net-1.1.wixobj" unless="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/tests.wixobj" />
+        <include name="${work.dir}/pnunit.wixobj" />
+        <include name="${work.dir}/doc.wixobj"  if="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/samples.wixobj"  if="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/nunit-gui.wixobj" if="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/net45-tests.wixobj" if="${runtime.version >= '2.0'}"/>
+        <include name="${work.dir}/NSubstitute.wixobj" if="${runtime.version >= '2.0'}"/>
+        <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"/>
+
+    <copy file="license.txt" todir="${package.working.dir}" />
+
+    <!-- Create the zip file -->
+    <zip  ziplevel="9"
+        zipfile="${project.package.dir}/${package.base.name}-src.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.base.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.base.name}-docs.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.base.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+    
+  </target>
+  
+<!-- ***************************************************************** -->
+<!-- ***                     Package samples                       *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-samples" depends="clean-package-dir"
+      description="Create a zip file of the samples.">
+
+    <call target="copy-samples"/>
+
+    <!-- Create the zip file -->
+    <zip ziplevel="9"
+        zipfile="${project.package.dir}/${package.base.name}-samples.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.base.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.base.name}-resources.zip">
+      <fileset basedir="${package.working.dir}" prefix="${package.base.name}">
+        <include name="**"/>
+      </fileset>
+    </zip>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***                    Package for NuGet                      *** -->
+<!-- ***************************************************************** -->
+
+  <target name="package-nuget" depends="set-build-dir, clean-package-dir"
+      description="Create all nuget packages">
+
+    <foreach item="String" delim="," 
+        property="nuget.package.name" in="${nuget.packages}">
+
+      <call target="create-nuget-package" />
+
+    </foreach>
+
+  </target>
+
+  <target name="create-nuget-package">
+
+    <echo message="Creating ${nuget.package.name} nuget package"/>
+
+    <copy file="${project.nuget.dir}/${nuget.package.name}.nuspec"
+        tofile="${project.nuget.dir}/_${nuget.package.name}.nuspec"
+        overwrite="true">
+      <filterchain>
+        <expandproperties/>
+      </filterchain>
+    </copy>
+
+    <exec program="NuGet.exe"
+      workingdir="${project.nuget.dir}"
+      commandline="pack _${nuget.package.name}.nuspec -o ${project.package.dir}" />
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***            Helper targets used for packaging              *** -->
+<!-- ***************************************************************** -->
+
+  <target name="set-package-name">
+
+    <property name="package.name" value="${package.base.name}"/>
+    <property name="package.name" value="${package.name}-${runtime.config}"
+      unless="${runtime.config == default.package.config}"/>
+    <property name="package.name" value="${package.name}-dbg"
+      if="${build.config == 'debug'}"/>
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***            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" />
+
+    <call target="copy-bins" />
+    <call target="copy-docs" />
+
+  </target>
+
+  <target name="copy-top-level-files">
+
+    <copy file="license.txt" todir="${package.working.dir}" />
+    <copy file="${project.src.dir}/GuiRunner/nunit-gui/Logo.ico"
+          todir="${package.working.dir}" />
+
+  </target>
+
+<!-- ***************************************************************** -->
+<!-- ***           Copy a set of binaries for a package            *** -->
+<!-- ***************************************************************** -->
+
+  <target name="copy-bins" depends="set-build-dir">
+
+    <mkdir dir="${package.bin.dir}"/>
+    <copy todir="${package.bin.dir}">
+      <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="fsharp/FSharp.sln" />
+        <include name="vb/vb-samples.sln" />
+        <include name="cpp/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="build"/>
+	<include name="build.bat"/>
+        <include name="license.rtf"/>
+	<include name="license.txt"/>
+	<include name="nant"/>
+	<include name="nant.bat"/>
+        <include name="nunit.build"/>
+        <include name="nunit.build.include"/>
+	<include name="nunit.sln"/>
+	<include name="nunit2012.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"/>
+	<include name="package"/>
+	<include name="package.bat"/>
+	<include name="install/*.wxs" />
+	<include name="lib/**"/>
+	<include name="nuget/nunit.nuspec"/>
+	<include name="nuget/nunit.editor.nuspec"/>
+	<include name="nuget/nunit.mocks.nuspec"/>
+	<include name="nuget/nunit.runners.nuspec"/>
+	<include name="nuget/pnunit.nuspec"/>
+	<include name="scripts/nunit.build.targets"/>
+	<include name="scripts/nunit.common.targets"/>
+	<include name="scripts/nunit.package.targets"/>
+	<include name="src/nunit.snk"/>
+	<include name="src/CommonAssemblyInfo.cs"/>
+	<include name="src/nunit20under21.config"/>
+	<include name="src/nunit20under22.config"/>
+	<include name="src/nunit21under22.config"/>
+	<include name="src/PNUnit/*.conf"/>
+	<include name="src/PNUnit/runpnunit.bat"/>
+	<include name="tools/nant"/>
+      </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>
+
+<!-- ***************************************************************** -->
+<!-- ***        Targets for installing the NUnit distribution      *** -->
+<!-- ***************************************************************** -->
+
+  <target name="install" depends="build-install-image"
+      description="Install NUnit directly from the 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-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-assembly-net45/test-assembly-net45.build" if="${framework::exists('net-4.5')}" />
+    <include name="tests/test-utilities/test-utilities.build" />
+
+    <!-- NUnit Base Tests -->
+    <include name="NUnitFramework/tests/nunit.framework.tests.build" />
+    <include name="NUnitFramework/tests-net45/nunit.framework.tests.net45.build" if="${framework::exists('net-4.5')}" />
+    <include name="NUnitCore/tests/nunit.core.tests.build" />
+    <include name="NUnitCore/tests-net45/nunit.core.tests.net45.build" if="${framework::exists('net-4.5')}" />
+    <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"/>
+
+  </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" />
+    <include name="ProjectEditor/editor/nunit-editor.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" />
+    <include name="ProjectEditor/tests/nunit-editor.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}">
+
+    <!-- C# Samples -->
+    <include name="csharp/failures/cs-failures.build" />
+    <include name="csharp/money/cs-money.build" />
+    <include name="csharp/syntax/cs-syntax.build" />
+
+    <!-- F# Samples -->
+    <include name="fsharp/failures/fs-failures.build" />
+    <include name="fsharp/money/fs-money.build" />
+    <include name="fsharp/syntax/fs-syntax.build" />
+
+	  <!-- 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()}" />
+
+    <!-- C++/CLI Samples -->
+    <include name="cpp/failures/cpp-cli-failures.build"
+      if="${platform::is-windows()}" />
+    <include name="cpp/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>
+
+</project>
diff --git a/src/ClientUtilities/tests/AssemblyListTests.cs b/src/ClientUtilities/tests/AssemblyListTests.cs
index abda24d..b4c3702 100644
--- a/src/ClientUtilities/tests/AssemblyListTests.cs
+++ b/src/ClientUtilities/tests/AssemblyListTests.cs
@@ -1,119 +1,119 @@
-// ****************************************************************
-// 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.Collections;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// This fixture tests both AssemblyList and AssemblyListItem
-	/// </summary>
-	[TestFixture]
-	public class AssemblyListTests
-	{
-		private AssemblyList assemblies;
-
-        private string path1;
-        private string path2;
-        private string path3;
-
-		private int events = 0;
-
-		[SetUp]
-		public void CreateAssemblyList()
-		{
-			assemblies = new AssemblyList();
-
-            path1 = CleanPath("/tests/bin/debug/assembly1.dll");
-            path2 = CleanPath("/tests/bin/debug/assembly2.dll");
-            path3 = CleanPath("/tests/bin/debug/assembly3.dll");
-
-			events = 0;
-
-			assemblies.Changed += new EventHandler( assemblies_Changed );
-        }
-
-		private void assemblies_Changed( object sender, EventArgs e )
-		{
-			++events;
-		}
-
-		[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, ExpectedException( typeof( ArgumentException ) )]
-		public void MustAddAbsolutePath()
-		{
-			assemblies.Add( CleanPath( "bin/debug/assembly1.dll" ) );
-		}
-
-		[Test]
-		public void AddFiresChangedEvent()
-		{
-			assemblies.Add( path1 );
-			Assert.AreEqual( 1, events );
-		}
-
-		[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 RemoveAtFiresChangedEvent()
-		{
-			assemblies.Add( path1 );
-			assemblies.RemoveAt(0);
-			Assert.AreEqual( 2, events );
-		}
-
-		[Test]
-		public void RemoveFiresChangedEvent()
-		{
-			assemblies.Add( path1 );
-			assemblies.Remove( path1 );
-			Assert.AreEqual( 2, events );
-		}
-
-		[Test]
-		public void SettingFullPathFiresChangedEvent()
-		{
-			assemblies.Add( path1 );
-			assemblies[0] = path2;
-			Assert.AreEqual( 2, events );
-		}
-		
-        private string CleanPath( string path )
-        {
-            return path.Replace( '/', Path.DirectorySeparatorChar );
-        }
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// This fixture tests both AssemblyList and AssemblyListItem
+	/// </summary>
+	[TestFixture]
+	public class AssemblyListTests
+	{
+		private AssemblyList assemblies;
+
+        private string path1;
+        private string path2;
+        private string path3;
+
+		private int events = 0;
+
+		[SetUp]
+		public void CreateAssemblyList()
+		{
+			assemblies = new AssemblyList();
+
+            path1 = CleanPath("/tests/bin/debug/assembly1.dll");
+            path2 = CleanPath("/tests/bin/debug/assembly2.dll");
+            path3 = CleanPath("/tests/bin/debug/assembly3.dll");
+
+			events = 0;
+
+			assemblies.Changed += new EventHandler( assemblies_Changed );
+        }
+
+		private void assemblies_Changed( object sender, EventArgs e )
+		{
+			++events;
+		}
+
+		[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, ExpectedException( typeof( ArgumentException ) )]
+		public void MustAddAbsolutePath()
+		{
+			assemblies.Add( CleanPath( "bin/debug/assembly1.dll" ) );
+		}
+
+		[Test]
+		public void AddFiresChangedEvent()
+		{
+			assemblies.Add( path1 );
+			Assert.AreEqual( 1, events );
+		}
+
+		[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 RemoveAtFiresChangedEvent()
+		{
+			assemblies.Add( path1 );
+			assemblies.RemoveAt(0);
+			Assert.AreEqual( 2, events );
+		}
+
+		[Test]
+		public void RemoveFiresChangedEvent()
+		{
+			assemblies.Add( path1 );
+			assemblies.Remove( path1 );
+			Assert.AreEqual( 2, events );
+		}
+
+		[Test]
+		public void SettingFullPathFiresChangedEvent()
+		{
+			assemblies.Add( path1 );
+			assemblies[0] = path2;
+			Assert.AreEqual( 2, events );
+		}
+		
+        private string CleanPath( string path )
+        {
+            return path.Replace( '/', Path.DirectorySeparatorChar );
+        }
+	}
+}
diff --git a/src/ClientUtilities/tests/AssemblyWatcherTests.cs b/src/ClientUtilities/tests/AssemblyWatcherTests.cs
index bd4a5a0..178c9b1 100644
--- a/src/ClientUtilities/tests/AssemblyWatcherTests.cs
+++ b/src/ClientUtilities/tests/AssemblyWatcherTests.cs
@@ -1,133 +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++;
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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/CategoryManagerTest.cs b/src/ClientUtilities/tests/CategoryManagerTest.cs
index 2a03498..1ed6541 100644
--- a/src/ClientUtilities/tests/CategoryManagerTest.cs
+++ b/src/ClientUtilities/tests/CategoryManagerTest.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.TestUtilities;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class CategoryManagerTest
-	{
-		private CategoryManager categoryManager;
-        string mockDll = MockAssembly.AssemblyPath;
-
-		[SetUp]
-		public void CreateCategoryManager()
-		{
-			categoryManager = new CategoryManager();
-		}
-
-		[Test]
-		public void CanAddStringsWithoutDuplicating() 
-		{
-			categoryManager.Clear();
-			string name1 = "Name1";
-			string name2 = "Name2";
-			string duplicate1 = "Name1";
-
-			categoryManager.Add(name1);
-			categoryManager.Add(name2);
-			categoryManager.Add(duplicate1);
-
-			Assert.AreEqual(2, categoryManager.Categories.Count);
-		}
-
-		[Test]
-		public void CanAddStrings()
-		{
-			categoryManager.Add( "one" );
-			categoryManager.Add( "two" );
-			Assert.AreEqual( 2, categoryManager.Categories.Count );
-		}
-
-		[Test]
-		public void CanClearEntries()
-		{
-			categoryManager.Add( "one" );
-			categoryManager.Add( "two" );
-			categoryManager.Clear();
-			Assert.AreEqual( 0, categoryManager.Categories.Count );
-		}
-
-		[Test]
-		public void CanAddTestCategories()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( mockDll ) );
-			
-			Test test = TestFinder.Find( "MockTest3", suite, true );
-			categoryManager.AddCategories( test );
-			Assert.AreEqual( 2, categoryManager.Categories.Count );
-		}
-
-		[Test]
-		public void CanAddAllAvailableCategoriesInTestTree()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( mockDll ) );
-			
-			categoryManager.AddAllCategories( suite );
-			Assert.AreEqual( MockAssembly.Categories, categoryManager.Categories.Count );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.TestUtilities;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class CategoryManagerTest
+	{
+		private CategoryManager categoryManager;
+        string mockDll = MockAssembly.AssemblyPath;
+
+		[SetUp]
+		public void CreateCategoryManager()
+		{
+			categoryManager = new CategoryManager();
+		}
+
+		[Test]
+		public void CanAddStringsWithoutDuplicating() 
+		{
+			categoryManager.Clear();
+			string name1 = "Name1";
+			string name2 = "Name2";
+			string duplicate1 = "Name1";
+
+			categoryManager.Add(name1);
+			categoryManager.Add(name2);
+			categoryManager.Add(duplicate1);
+
+			Assert.AreEqual(2, categoryManager.Categories.Count);
+		}
+
+		[Test]
+		public void CanAddStrings()
+		{
+			categoryManager.Add( "one" );
+			categoryManager.Add( "two" );
+			Assert.AreEqual( 2, categoryManager.Categories.Count );
+		}
+
+		[Test]
+		public void CanClearEntries()
+		{
+			categoryManager.Add( "one" );
+			categoryManager.Add( "two" );
+			categoryManager.Clear();
+			Assert.AreEqual( 0, categoryManager.Categories.Count );
+		}
+
+		[Test]
+		public void CanAddTestCategories()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( mockDll ) );
+			
+			Test test = TestFinder.Find( "MockTest3", suite, true );
+			categoryManager.AddCategories( test );
+			Assert.AreEqual( 2, categoryManager.Categories.Count );
+		}
+
+		[Test]
+		public void CanAddAllAvailableCategoriesInTestTree()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( mockDll ) );
+			
+			categoryManager.AddAllCategories( suite );
+			Assert.AreEqual( MockAssembly.Categories, categoryManager.Categories.Count );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/CategoryParseTests.cs b/src/ClientUtilities/tests/CategoryParseTests.cs
index 3848b98..c777ec9 100644
--- a/src/ClientUtilities/tests/CategoryParseTests.cs
+++ b/src/ClientUtilities/tests/CategoryParseTests.cs
@@ -1,144 +1,144 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Core.Filters;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class CategoryParseTests
-	{
-		[Test]
-		public void EmptyStringReturnsEmptyFilter()
-		{
-			CategoryExpression expr = new CategoryExpression( "" );
-			Assert.That( expr.Filter.IsEmpty );
-		}
-
-		[Test]
-		public void CanParseSimpleCategory()
-		{
-			CategoryExpression expr = new CategoryExpression( "Data" );
-			CategoryFilter filter = (CategoryFilter)expr.Filter;
-			Assert.That( filter.Categories, Is.EqualTo( new string[] { "Data" } ) );
-		}
-
-		[Test]
-		public void CanParseCompoundCategory()
-		{
-			CategoryExpression expr = new CategoryExpression( "One , Two; Three,Four" );
-			CategoryFilter filter = (CategoryFilter)expr.Filter;
-			Assert.That( filter.Categories, Is.EqualTo( new string[] { "One", "Two", "Three", "Four" } ) );
-		}
-
-		[Test]
-		public void CanParseExcludedCategories()
-		{
-			CategoryExpression expr = new CategoryExpression( "-One,Two,Three" );
-			NotFilter notFilter = (NotFilter)expr.Filter;
-			CategoryFilter catFilter = (CategoryFilter)notFilter.BaseFilter;
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "One", "Two", "Three" } ) );
-		}
-
-		[Test]
-		public void CanParseMultipleCategoriesWithAnd()
-		{
-			CategoryExpression expr = new CategoryExpression( "One + Two+Three" );
-			AndFilter andFilter = (AndFilter)expr.Filter;
-			Assert.That( andFilter.Filters.Length, Is.EqualTo( 3 ) );
-			CategoryFilter catFilter = (CategoryFilter)andFilter.Filters[0];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "One"  } ) );
-			catFilter = (CategoryFilter)andFilter.Filters[1];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Two"  } ) );
-			catFilter = (CategoryFilter)andFilter.Filters[2];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Three"  } ) );
-		}
-
-		[Test]
-		public void CanParseMultipleAlternatives()
-		{
-			CategoryExpression expr = new CategoryExpression( "One|Two|Three" );
-			OrFilter orFilter = (OrFilter)expr.Filter;
-			Assert.That( orFilter.Filters.Length, Is.EqualTo( 3 ) );
-			CategoryFilter catFilter = (CategoryFilter)orFilter.Filters[0];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "One"  } ) );
-			catFilter = (CategoryFilter)orFilter.Filters[1];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Two"  } ) );
-			catFilter = (CategoryFilter)orFilter.Filters[2];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Three"  } ) );
-		}
-
-		[Test]
-		public void PrecedenceTest()
-		{
-			CategoryExpression expr = new CategoryExpression( "A + B | C + -D,E,F" );
-			OrFilter orFilter = (OrFilter)expr.Filter;
-
-			AndFilter andFilter = (AndFilter)orFilter.Filters[0];
-			CategoryFilter catFilter = (CategoryFilter)andFilter.Filters[0];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "A" } ) );
-			catFilter = (CategoryFilter)andFilter.Filters[1];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "B" } ) );
-
-			andFilter = (AndFilter)orFilter.Filters[1];
-			catFilter = (CategoryFilter)andFilter.Filters[0];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "C" } ) );
-			NotFilter notFilter = (NotFilter)andFilter.Filters[1];
-			catFilter = (CategoryFilter)notFilter.BaseFilter;
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "D", "E", "F" } ) );
-		}
-
-		[Test]
-		public void PrecedenceTestWithParentheses()
-		{
-			CategoryExpression expr = new CategoryExpression( "A + (B | C) - D,E,F" );
-			AndFilter andFilter = (AndFilter)expr.Filter;
-			Assert.That( andFilter.Filters.Length, Is.EqualTo( 3 ) );
-
-			CategoryFilter catFilter = (CategoryFilter)andFilter.Filters[0];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "A" } ) );
-
-			OrFilter orFilter = (OrFilter)andFilter.Filters[1];
-			catFilter = (CategoryFilter)orFilter.Filters[0];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "B" } ) );
-			catFilter = (CategoryFilter)orFilter.Filters[1];
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "C" } ) );
-
-			NotFilter notFilter = (NotFilter)andFilter.Filters[2];
-			catFilter = (CategoryFilter)notFilter.BaseFilter;
-			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "D", "E", "F" } ) );
-		}
-
-		[Test]
-		public void OrAndMinusCombined()
-		{
-			CategoryExpression expr = new CategoryExpression( "A|B-C-D|E" );
-			OrFilter orFilter = (OrFilter)expr.Filter;
-			Assert.That( orFilter.Filters.Length, Is.EqualTo( 3 ) );
-			AndFilter andFilter = (AndFilter)orFilter.Filters[1];
-			Assert.That( andFilter.Filters.Length, Is.EqualTo( 3 ) );
-			Assert.That( andFilter.Filters[0], Is.TypeOf( typeof( CategoryFilter) ) );
-			Assert.That( andFilter.Filters[1], Is.TypeOf( typeof( NotFilter) ) );
-			Assert.That( andFilter.Filters[2], Is.TypeOf( typeof( NotFilter) ) );
-		}
-
-		[Test]
-		public void PlusAndMinusCombined()
-		{
-			CategoryExpression expr = new CategoryExpression( "A+B-C-D+E" );
-			AndFilter andFilter = (AndFilter)expr.Filter;
-			Assert.That( andFilter.Filters.Length, Is.EqualTo( 5 ) );
-			Assert.That( andFilter.Filters[0], Is.TypeOf( typeof( CategoryFilter) ) );
-			Assert.That( andFilter.Filters[1], Is.TypeOf( typeof( CategoryFilter) ) );
-			Assert.That( andFilter.Filters[2], Is.TypeOf( typeof( NotFilter) ) );
-			Assert.That( andFilter.Filters[3], Is.TypeOf( typeof( NotFilter) ) );
-			Assert.That( andFilter.Filters[4], Is.TypeOf( typeof( CategoryFilter) ) );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Core.Filters;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class CategoryParseTests
+	{
+		[Test]
+		public void EmptyStringReturnsEmptyFilter()
+		{
+			CategoryExpression expr = new CategoryExpression( "" );
+			Assert.That( expr.Filter.IsEmpty );
+		}
+
+		[Test]
+		public void CanParseSimpleCategory()
+		{
+			CategoryExpression expr = new CategoryExpression( "Data" );
+			CategoryFilter filter = (CategoryFilter)expr.Filter;
+			Assert.That( filter.Categories, Is.EqualTo( new string[] { "Data" } ) );
+		}
+
+		[Test]
+		public void CanParseCompoundCategory()
+		{
+			CategoryExpression expr = new CategoryExpression( "One , Two; Three,Four" );
+			CategoryFilter filter = (CategoryFilter)expr.Filter;
+			Assert.That( filter.Categories, Is.EqualTo( new string[] { "One", "Two", "Three", "Four" } ) );
+		}
+
+		[Test]
+		public void CanParseExcludedCategories()
+		{
+			CategoryExpression expr = new CategoryExpression( "-One,Two,Three" );
+			NotFilter notFilter = (NotFilter)expr.Filter;
+			CategoryFilter catFilter = (CategoryFilter)notFilter.BaseFilter;
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "One", "Two", "Three" } ) );
+		}
+
+		[Test]
+		public void CanParseMultipleCategoriesWithAnd()
+		{
+			CategoryExpression expr = new CategoryExpression( "One + Two+Three" );
+			AndFilter andFilter = (AndFilter)expr.Filter;
+			Assert.That( andFilter.Filters.Length, Is.EqualTo( 3 ) );
+			CategoryFilter catFilter = (CategoryFilter)andFilter.Filters[0];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "One"  } ) );
+			catFilter = (CategoryFilter)andFilter.Filters[1];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Two"  } ) );
+			catFilter = (CategoryFilter)andFilter.Filters[2];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Three"  } ) );
+		}
+
+		[Test]
+		public void CanParseMultipleAlternatives()
+		{
+			CategoryExpression expr = new CategoryExpression( "One|Two|Three" );
+			OrFilter orFilter = (OrFilter)expr.Filter;
+			Assert.That( orFilter.Filters.Length, Is.EqualTo( 3 ) );
+			CategoryFilter catFilter = (CategoryFilter)orFilter.Filters[0];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "One"  } ) );
+			catFilter = (CategoryFilter)orFilter.Filters[1];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Two"  } ) );
+			catFilter = (CategoryFilter)orFilter.Filters[2];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "Three"  } ) );
+		}
+
+		[Test]
+		public void PrecedenceTest()
+		{
+			CategoryExpression expr = new CategoryExpression( "A + B | C + -D,E,F" );
+			OrFilter orFilter = (OrFilter)expr.Filter;
+
+			AndFilter andFilter = (AndFilter)orFilter.Filters[0];
+			CategoryFilter catFilter = (CategoryFilter)andFilter.Filters[0];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "A" } ) );
+			catFilter = (CategoryFilter)andFilter.Filters[1];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "B" } ) );
+
+			andFilter = (AndFilter)orFilter.Filters[1];
+			catFilter = (CategoryFilter)andFilter.Filters[0];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "C" } ) );
+			NotFilter notFilter = (NotFilter)andFilter.Filters[1];
+			catFilter = (CategoryFilter)notFilter.BaseFilter;
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "D", "E", "F" } ) );
+		}
+
+		[Test]
+		public void PrecedenceTestWithParentheses()
+		{
+			CategoryExpression expr = new CategoryExpression( "A + (B | C) - D,E,F" );
+			AndFilter andFilter = (AndFilter)expr.Filter;
+			Assert.That( andFilter.Filters.Length, Is.EqualTo( 3 ) );
+
+			CategoryFilter catFilter = (CategoryFilter)andFilter.Filters[0];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "A" } ) );
+
+			OrFilter orFilter = (OrFilter)andFilter.Filters[1];
+			catFilter = (CategoryFilter)orFilter.Filters[0];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "B" } ) );
+			catFilter = (CategoryFilter)orFilter.Filters[1];
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "C" } ) );
+
+			NotFilter notFilter = (NotFilter)andFilter.Filters[2];
+			catFilter = (CategoryFilter)notFilter.BaseFilter;
+			Assert.That( catFilter.Categories, Is.EqualTo( new string[] { "D", "E", "F" } ) );
+		}
+
+		[Test]
+		public void OrAndMinusCombined()
+		{
+			CategoryExpression expr = new CategoryExpression( "A|B-C-D|E" );
+			OrFilter orFilter = (OrFilter)expr.Filter;
+			Assert.That( orFilter.Filters.Length, Is.EqualTo( 3 ) );
+			AndFilter andFilter = (AndFilter)orFilter.Filters[1];
+			Assert.That( andFilter.Filters.Length, Is.EqualTo( 3 ) );
+			Assert.That( andFilter.Filters[0], Is.TypeOf( typeof( CategoryFilter) ) );
+			Assert.That( andFilter.Filters[1], Is.TypeOf( typeof( NotFilter) ) );
+			Assert.That( andFilter.Filters[2], Is.TypeOf( typeof( NotFilter) ) );
+		}
+
+		[Test]
+		public void PlusAndMinusCombined()
+		{
+			CategoryExpression expr = new CategoryExpression( "A+B-C-D+E" );
+			AndFilter andFilter = (AndFilter)expr.Filter;
+			Assert.That( andFilter.Filters.Length, Is.EqualTo( 5 ) );
+			Assert.That( andFilter.Filters[0], Is.TypeOf( typeof( CategoryFilter) ) );
+			Assert.That( andFilter.Filters[1], Is.TypeOf( typeof( CategoryFilter) ) );
+			Assert.That( andFilter.Filters[2], Is.TypeOf( typeof( NotFilter) ) );
+			Assert.That( andFilter.Filters[3], Is.TypeOf( typeof( NotFilter) ) );
+			Assert.That( andFilter.Filters[4], Is.TypeOf( typeof( CategoryFilter) ) );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/DomainManagerTests.cs b/src/ClientUtilities/tests/DomainManagerTests.cs
index fb7fe3f..f97b85b 100644
--- a/src/ClientUtilities/tests/DomainManagerTests.cs
+++ b/src/ClientUtilities/tests/DomainManagerTests.cs
@@ -1,96 +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
-// ****************************************************************
-using System;
-using System.Collections;
-using System.IO;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-    public class DomainManagerTests
-    {
-        static string path1 = TestPath("/test/bin/debug/test1.dll");
-        static string path2 = TestPath("/test/bin/debug/test2.dll");
-        static string path3 = TestPath("/test/utils/test3.dll");
-
-        [Test]
-        public void GetPrivateBinPath()
-        {
-            string[] assemblies = new string[] { path1, path2, path3 };
-
-            Assert.AreEqual(
-                TestPath("bin/debug") + Path.PathSeparator + TestPath("utils"),
-                DomainManager.GetPrivateBinPath(TestPath("/test"), assemblies));
-        }
-
-        [Test]
-        public void GetCommonAppBase_OneElement()
-        {
-            string[] assemblies = new string[] { path1 };
-
-            Assert.AreEqual(
-                TestPath("/test/bin/debug"),
-                DomainManager.GetCommonAppBase(assemblies));
-        }
-
-        [Test]
-        public void GetCommonAppBase_TwoElements_SameDirectory()
-        {
-            string[] assemblies = new string[] { path1, path2 };
-
-            Assert.AreEqual(
-                TestPath("/test/bin/debug"),
-                DomainManager.GetCommonAppBase(assemblies));
-        }
-
-        [Test]
-        public void GetCommonAppBase_TwoElements_DifferentDirectories()
-        {
-            string[] assemblies = new string[] { path1, path3 };
-
-            Assert.AreEqual(
-                TestPath("/test"),
-                DomainManager.GetCommonAppBase(assemblies));
-        }
-
-        [Test]
-        public void GetCommonAppBase_ThreeElements_DiferentDirectories()
-        {
-            string[] assemblies = new string[] { path1, path2, path3 };
-
-            Assert.AreEqual(
-                TestPath("/test"),
-                DomainManager.GetCommonAppBase(assemblies));
-        }
-
-        [Test]
-        public void UnloadUnloadedDomain()
-        {
-            AppDomain domain = AppDomain.CreateDomain("DomainManagerTests-domain");
-            AppDomain.Unload(domain);
-
-            DomainManager manager = new DomainManager();
-            manager.Unload(domain);
-        }
-
-        /// <summary>
-        /// Take a valid Linux filePath and make a valid windows filePath out of it
-        /// if we are on Windows. Change slashes to backslashes and, if the
-        /// filePath starts with a slash, add C: in front of it.
-        /// </summary>
-        private static string TestPath(string path)
-        {
-            if (Path.DirectorySeparatorChar != '/')
-            {
-                path = path.Replace('/', Path.DirectorySeparatorChar);
-                if (path[0] == Path.DirectorySeparatorChar)
-                    path = "C:" + path;
-            }
-
-            return path;
-        }
-    }
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util.Tests
+{
+    public class DomainManagerTests
+    {
+        static string path1 = TestPath("/test/bin/debug/test1.dll");
+        static string path2 = TestPath("/test/bin/debug/test2.dll");
+        static string path3 = TestPath("/test/utils/test3.dll");
+
+        [Test]
+        public void GetPrivateBinPath()
+        {
+            string[] assemblies = new string[] { path1, path2, path3 };
+
+            Assert.AreEqual(
+                TestPath("bin/debug") + Path.PathSeparator + TestPath("utils"),
+                DomainManager.GetPrivateBinPath(TestPath("/test"), assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_OneElement()
+        {
+            string[] assemblies = new string[] { path1 };
+
+            Assert.AreEqual(
+                TestPath("/test/bin/debug"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_TwoElements_SameDirectory()
+        {
+            string[] assemblies = new string[] { path1, path2 };
+
+            Assert.AreEqual(
+                TestPath("/test/bin/debug"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_TwoElements_DifferentDirectories()
+        {
+            string[] assemblies = new string[] { path1, path3 };
+
+            Assert.AreEqual(
+                TestPath("/test"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void GetCommonAppBase_ThreeElements_DiferentDirectories()
+        {
+            string[] assemblies = new string[] { path1, path2, path3 };
+
+            Assert.AreEqual(
+                TestPath("/test"),
+                DomainManager.GetCommonAppBase(assemblies));
+        }
+
+        [Test]
+        public void UnloadUnloadedDomain()
+        {
+            AppDomain domain = AppDomain.CreateDomain("DomainManagerTests-domain");
+            AppDomain.Unload(domain);
+
+            DomainManager manager = new DomainManager();
+            manager.Unload(domain);
+        }
+
+        /// <summary>
+        /// Take a valid Linux filePath and make a valid windows filePath out of it
+        /// if we are on Windows. Change slashes to backslashes and, if the
+        /// filePath starts with a slash, add C: in front of it.
+        /// </summary>
+        private static string TestPath(string path)
+        {
+            if (Path.DirectorySeparatorChar != '/')
+            {
+                path = path.Replace('/', Path.DirectorySeparatorChar);
+                if (path[0] == Path.DirectorySeparatorChar)
+                    path = "C:" + path;
+            }
+
+            return path;
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/EventDispatcherTests.cs b/src/ClientUtilities/tests/EventDispatcherTests.cs
index 791a94d..8de0de4 100644
--- a/src/ClientUtilities/tests/EventDispatcherTests.cs
+++ b/src/ClientUtilities/tests/EventDispatcherTests.cs
@@ -1,239 +1,239 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class EventDispatcherTests
-	{
-		private TestEventDispatcher dispatcher;
-		private TestEventCatcher catcher;
-		private TestInfo test;
-		private TestResult result;
-		private Exception exception;
-
-		private readonly string FILENAME = "MyTestFileName";
-		private readonly string TESTNAME = "MyTestName";
-		private readonly string MESSAGE = "My message!";
-
-		[SetUp]
-		public void SetUp()
-		{
-			dispatcher = new TestEventDispatcher();
-			catcher = new TestEventCatcher( dispatcher );
-			test = new TestInfo( new TestSuite( TESTNAME ) );
-			result = new TestResult( test );
-			exception = new Exception( MESSAGE );
-		}
-
-		[Test]
-		public void ProjectLoading()
-		{
-			dispatcher.FireProjectLoading( FILENAME );
-			CheckEvent( TestAction.ProjectLoading, FILENAME );
-		}
-
-		[Test]
-		public void ProjectLoaded()
-		{
-			dispatcher.FireProjectLoaded( FILENAME );
-			CheckEvent( TestAction.ProjectLoaded, FILENAME );
-		}
-
-		[Test]
-		public void ProjectLoadFailed()
-		{
-			dispatcher.FireProjectLoadFailed( FILENAME, exception );
-			CheckEvent( TestAction.ProjectLoadFailed, FILENAME, exception );
-		}
-
-		[Test]
-		public void ProjectUnloading()
-		{
-			dispatcher.FireProjectUnloading( FILENAME );
-			CheckEvent( TestAction.ProjectUnloading, FILENAME );
-		}
-
-		[Test]
-		public void ProjectUnloaded()
-		{
-			dispatcher.FireProjectUnloaded( FILENAME );
-			CheckEvent( TestAction.ProjectUnloaded, FILENAME );
-		}
-
-		[Test]
-		public void ProjectUnloadFailed()
-		{
-			dispatcher.FireProjectUnloadFailed( FILENAME, exception );
-			CheckEvent( TestAction.ProjectUnloadFailed, FILENAME, exception );
-		}
-
-		[Test]
-		public void TestLoading()
-		{
-			dispatcher.FireTestLoading( FILENAME );
-			CheckEvent( TestAction.TestLoading, FILENAME );
-		}
-
-		[Test]
-		public void TestLoaded()
-		{
-			dispatcher.FireTestLoaded( FILENAME, test );
-			CheckEvent( TestAction.TestLoaded, FILENAME, test );
-		}
-
-		[Test]
-		public void TestLoadFailed()
-		{
-			dispatcher.FireTestLoadFailed( FILENAME, exception );
-			CheckEvent( TestAction.TestLoadFailed, FILENAME, exception );
-		}
-
-		[Test]
-		public void TestUnloading()
-		{
-			dispatcher.FireTestUnloading( FILENAME );
-			CheckEvent( TestAction.TestUnloading, FILENAME );
-		}
-
-		[Test]
-		public void TestUnloaded()
-		{
-			dispatcher.FireTestUnloaded( FILENAME );
-			CheckEvent( TestAction.TestUnloaded, FILENAME );
-		}
-
-		[Test]
-		public void TestUnloadFailed()
-		{
-			dispatcher.FireTestUnloadFailed( FILENAME, exception );
-			CheckEvent( TestAction.TestUnloadFailed, FILENAME, exception );
-		}
-
-		[Test]
-		public void TestReloading()
-		{
-			dispatcher.FireTestReloading( FILENAME );
-			CheckEvent( TestAction.TestReloading, FILENAME );
-		}
-
-		[Test]
-		public void TestReloaded()
-		{
-			dispatcher.FireTestReloaded( FILENAME, test );
-			CheckEvent( TestAction.TestReloaded, FILENAME, test );
-		}
-
-		[Test]
-		public void TestReloadFailed()
-		{
-			dispatcher.FireTestReloadFailed( FILENAME, exception );
-			CheckEvent( TestAction.TestReloadFailed, FILENAME, exception );
-		}
-
-		[Test]
-		public void RunStarting()
-		{
-			dispatcher.FireRunStarting( test.TestName.FullName, test.TestCount );
-			CheckEvent( TestAction.RunStarting, test.TestName.FullName, test.TestCount );
-		}
-
-		[Test]
-		public void RunFinished()
-		{
-			dispatcher.FireRunFinished( result );
-			CheckEvent( TestAction.RunFinished, result );
-		}
-
-		[Test]
-		public void RunFailed()
-		{
-			dispatcher.FireRunFinished( exception );
-			CheckEvent( TestAction.RunFinished, exception );
-		}
-
-		[Test]
-		public void SuiteStarting()
-		{
-			dispatcher.FireSuiteStarting( test.TestName );
-			CheckEvent( TestAction.SuiteStarting, test.TestName );
-		}
-
-		[Test]
-		public void SuiteFinished()
-		{
-			dispatcher.FireSuiteFinished( result );
-			CheckEvent( TestAction.SuiteFinished, result );
-		}
-
-		[Test]
-		public void TestStarting()
-		{
-			dispatcher.FireTestStarting( test.TestName );
-			CheckEvent( TestAction.TestStarting, test.TestName );
-		}
-
-		[Test]
-		public void TestFinished()
-		{
-			dispatcher.FireTestFinished( result );
-			CheckEvent( TestAction.TestFinished, result );
-		}
-
-		private void CheckEvent( TestAction action )
-		{
-			Assert.AreEqual( 1, catcher.Events.Count );
-			Assert.AreEqual( action, ((TestEventArgs)catcher.Events[0]).Action );
-		}
-
-		private void CheckEvent( TestAction action, string fileName )
-		{
-			CheckEvent( action );
-			Assert.AreEqual( fileName, ((TestEventArgs)catcher.Events[0]).Name );
-		}
-
-		private void CheckEvent( TestAction action, string fileName, int testCount )
-		{
-			CheckEvent( action, fileName );
-			Assert.AreEqual( testCount, ((TestEventArgs)catcher.Events[0]).TestCount );
-		}
-
-		private void CheckEvent( TestAction action, string fileName, TestInfo test )
-		{
-			CheckEvent( action, fileName );
-			Assert.AreEqual( TESTNAME, ((TestEventArgs)catcher.Events[0]).Test.TestName.Name );
-		}
-
-		private void CheckEvent( TestAction action, string fileName, Exception exception )
-		{
-			CheckEvent( action, fileName );
-			Assert.AreEqual( MESSAGE, ((TestEventArgs)catcher.Events[0]).Exception.Message );
-		}
-
-		private void CheckEvent( TestAction action, TestName testName )
-		{
-			CheckEvent( action );
-			Assert.AreEqual( TESTNAME, ((TestEventArgs)catcher.Events[0]).TestName.Name );
-		}
-
-		private void CheckEvent( TestAction action, TestResult result )
-		{
-			CheckEvent( action );
-			Assert.AreEqual( TESTNAME, result.Name );
-		}
-
-		private void CheckEvent( TestAction action, Exception exception )
-		{
-			CheckEvent( TestAction.RunFinished );
-			Assert.AreEqual( MESSAGE, ((TestEventArgs)catcher.Events[0]).Exception.Message );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class EventDispatcherTests
+	{
+		private TestEventDispatcher dispatcher;
+		private TestEventCatcher catcher;
+		private TestInfo test;
+		private TestResult result;
+		private Exception exception;
+
+		private readonly string FILENAME = "MyTestFileName";
+		private readonly string TESTNAME = "MyTestName";
+		private readonly string MESSAGE = "My message!";
+
+		[SetUp]
+		public void SetUp()
+		{
+			dispatcher = new TestEventDispatcher();
+			catcher = new TestEventCatcher( dispatcher );
+			test = new TestInfo( new TestSuite( TESTNAME ) );
+			result = new TestResult( test );
+			exception = new Exception( MESSAGE );
+		}
+
+		[Test]
+		public void ProjectLoading()
+		{
+			dispatcher.FireProjectLoading( FILENAME );
+			CheckEvent( TestAction.ProjectLoading, FILENAME );
+		}
+
+		[Test]
+		public void ProjectLoaded()
+		{
+			dispatcher.FireProjectLoaded( FILENAME );
+			CheckEvent( TestAction.ProjectLoaded, FILENAME );
+		}
+
+		[Test]
+		public void ProjectLoadFailed()
+		{
+			dispatcher.FireProjectLoadFailed( FILENAME, exception );
+			CheckEvent( TestAction.ProjectLoadFailed, FILENAME, exception );
+		}
+
+		[Test]
+		public void ProjectUnloading()
+		{
+			dispatcher.FireProjectUnloading( FILENAME );
+			CheckEvent( TestAction.ProjectUnloading, FILENAME );
+		}
+
+		[Test]
+		public void ProjectUnloaded()
+		{
+			dispatcher.FireProjectUnloaded( FILENAME );
+			CheckEvent( TestAction.ProjectUnloaded, FILENAME );
+		}
+
+		[Test]
+		public void ProjectUnloadFailed()
+		{
+			dispatcher.FireProjectUnloadFailed( FILENAME, exception );
+			CheckEvent( TestAction.ProjectUnloadFailed, FILENAME, exception );
+		}
+
+		[Test]
+		public void TestLoading()
+		{
+			dispatcher.FireTestLoading( FILENAME );
+			CheckEvent( TestAction.TestLoading, FILENAME );
+		}
+
+		[Test]
+		public void TestLoaded()
+		{
+			dispatcher.FireTestLoaded( FILENAME, test );
+			CheckEvent( TestAction.TestLoaded, FILENAME, test );
+		}
+
+		[Test]
+		public void TestLoadFailed()
+		{
+			dispatcher.FireTestLoadFailed( FILENAME, exception );
+			CheckEvent( TestAction.TestLoadFailed, FILENAME, exception );
+		}
+
+		[Test]
+		public void TestUnloading()
+		{
+			dispatcher.FireTestUnloading( FILENAME );
+			CheckEvent( TestAction.TestUnloading, FILENAME );
+		}
+
+		[Test]
+		public void TestUnloaded()
+		{
+			dispatcher.FireTestUnloaded( FILENAME );
+			CheckEvent( TestAction.TestUnloaded, FILENAME );
+		}
+
+		[Test]
+		public void TestUnloadFailed()
+		{
+			dispatcher.FireTestUnloadFailed( FILENAME, exception );
+			CheckEvent( TestAction.TestUnloadFailed, FILENAME, exception );
+		}
+
+		[Test]
+		public void TestReloading()
+		{
+			dispatcher.FireTestReloading( FILENAME );
+			CheckEvent( TestAction.TestReloading, FILENAME );
+		}
+
+		[Test]
+		public void TestReloaded()
+		{
+			dispatcher.FireTestReloaded( FILENAME, test );
+			CheckEvent( TestAction.TestReloaded, FILENAME, test );
+		}
+
+		[Test]
+		public void TestReloadFailed()
+		{
+			dispatcher.FireTestReloadFailed( FILENAME, exception );
+			CheckEvent( TestAction.TestReloadFailed, FILENAME, exception );
+		}
+
+		[Test]
+		public void RunStarting()
+		{
+			dispatcher.FireRunStarting( test.TestName.FullName, test.TestCount );
+			CheckEvent( TestAction.RunStarting, test.TestName.FullName, test.TestCount );
+		}
+
+		[Test]
+		public void RunFinished()
+		{
+			dispatcher.FireRunFinished( result );
+			CheckEvent( TestAction.RunFinished, result );
+		}
+
+		[Test]
+		public void RunFailed()
+		{
+			dispatcher.FireRunFinished( exception );
+			CheckEvent( TestAction.RunFinished, exception );
+		}
+
+		[Test]
+		public void SuiteStarting()
+		{
+			dispatcher.FireSuiteStarting( test.TestName );
+			CheckEvent( TestAction.SuiteStarting, test.TestName );
+		}
+
+		[Test]
+		public void SuiteFinished()
+		{
+			dispatcher.FireSuiteFinished( result );
+			CheckEvent( TestAction.SuiteFinished, result );
+		}
+
+		[Test]
+		public void TestStarting()
+		{
+			dispatcher.FireTestStarting( test.TestName );
+			CheckEvent( TestAction.TestStarting, test.TestName );
+		}
+
+		[Test]
+		public void TestFinished()
+		{
+			dispatcher.FireTestFinished( result );
+			CheckEvent( TestAction.TestFinished, result );
+		}
+
+		private void CheckEvent( TestAction action )
+		{
+			Assert.AreEqual( 1, catcher.Events.Count );
+			Assert.AreEqual( action, ((TestEventArgs)catcher.Events[0]).Action );
+		}
+
+		private void CheckEvent( TestAction action, string fileName )
+		{
+			CheckEvent( action );
+			Assert.AreEqual( fileName, ((TestEventArgs)catcher.Events[0]).Name );
+		}
+
+		private void CheckEvent( TestAction action, string fileName, int testCount )
+		{
+			CheckEvent( action, fileName );
+			Assert.AreEqual( testCount, ((TestEventArgs)catcher.Events[0]).TestCount );
+		}
+
+		private void CheckEvent( TestAction action, string fileName, TestInfo test )
+		{
+			CheckEvent( action, fileName );
+			Assert.AreEqual( TESTNAME, ((TestEventArgs)catcher.Events[0]).Test.TestName.Name );
+		}
+
+		private void CheckEvent( TestAction action, string fileName, Exception exception )
+		{
+			CheckEvent( action, fileName );
+			Assert.AreEqual( MESSAGE, ((TestEventArgs)catcher.Events[0]).Exception.Message );
+		}
+
+		private void CheckEvent( TestAction action, TestName testName )
+		{
+			CheckEvent( action );
+			Assert.AreEqual( TESTNAME, ((TestEventArgs)catcher.Events[0]).TestName.Name );
+		}
+
+		private void CheckEvent( TestAction action, TestResult result )
+		{
+			CheckEvent( action );
+			Assert.AreEqual( TESTNAME, result.Name );
+		}
+
+		private void CheckEvent( TestAction action, Exception exception )
+		{
+			CheckEvent( TestAction.RunFinished );
+			Assert.AreEqual( MESSAGE, ((TestEventArgs)catcher.Events[0]).Exception.Message );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/FileWatcherTests.cs b/src/ClientUtilities/tests/FileWatcherTests.cs
index a067c07..c84b182 100644
--- a/src/ClientUtilities/tests/FileWatcherTests.cs
+++ b/src/ClientUtilities/tests/FileWatcherTests.cs
@@ -1,130 +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++;
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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/MemorySettingsStorageTests.cs b/src/ClientUtilities/tests/MemorySettingsStorageTests.cs
index 6ad0b16..d610a6b 100644
--- a/src/ClientUtilities/tests/MemorySettingsStorageTests.cs
+++ b/src/ClientUtilities/tests/MemorySettingsStorageTests.cs
@@ -1,104 +1,104 @@
-// ****************************************************************
-// Copyright 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.Util.Tests
-{
-	[TestFixture]
-	public class MemorySettingsStorageTests
-	{
-		MemorySettingsStorage storage;
-
-		[SetUp]
-		public void Init()
-		{
-			storage = new MemorySettingsStorage();
-		}
-
-		[TearDown]
-		public void Cleanup()
-		{
-			storage.Dispose();
-		}
-
-		[Test]
-		public void MakeStorage()
-		{
-			Assert.IsNotNull( storage );
-		}
-
-		[Test]
-		public void SaveAndLoadSettings()
-		{
-			Assert.IsNull( storage.GetSetting( "X" ), "X is not null" );
-			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME is not null" );
-
-			storage.SaveSetting("X", 5);
-			storage.SaveSetting("NAME", "Charlie");
-
-			Assert.AreEqual( 5, storage.GetSetting("X") );
-			Assert.AreEqual( "Charlie", storage.GetSetting("NAME") );
-		}
-
-		[Test]
-		public void RemoveSettings()
-		{
-			storage.SaveSetting("X", 5);
-			storage.SaveSetting("NAME", "Charlie");
-
-			storage.RemoveSetting( "X" );
-			Assert.IsNull( storage.GetSetting( "X" ), "X not removed" );
-			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
-
-			storage.RemoveSetting( "NAME" );
-			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME not removed" );
-		}
-
-		[Test]
-		public void MakeSubStorages()
-		{
-			ISettingsStorage sub1 = storage.MakeChildStorage( "Sub1" );
-			ISettingsStorage sub2 = storage.MakeChildStorage( "Sub2" );
-
-			Assert.IsNotNull( sub1, "Sub1 is null" );
-			Assert.IsNotNull( sub2, "Sub2 is null" );
-		}
-
-		[Test]
-		public void SubstorageSettings()
-		{
-			ISettingsStorage sub = storage.MakeChildStorage( "Sub" );
-
-			sub.SaveSetting( "X", 5 );
-			sub.SaveSetting( "NAME", "Charlie" );
-
-			Assert.AreEqual( 5, sub.GetSetting( "X" ) );
-			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
-
-			sub.RemoveSetting( "X" );
-			Assert.IsNull( sub.GetSetting( "X" ), "X not removed" );
-			
-			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
-
-			sub.RemoveSetting( "NAME" );
-			Assert.IsNull( sub.GetSetting( "NAME" ), "NAME not removed" );
-		}
-
-		[Test]
-		public void TypeSafeSettings()
-		{
-			storage.SaveSetting( "X", 5);
-			storage.SaveSetting( "Y", "17" );
-			storage.SaveSetting( "NAME", "Charlie");
-
-			Assert.AreEqual( 5, storage.GetSetting("X") );
-			Assert.AreEqual( "17", storage.GetSetting( "Y" ) );
-			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Util.Tests
+{
+	[TestFixture]
+	public class MemorySettingsStorageTests
+	{
+		MemorySettingsStorage storage;
+
+		[SetUp]
+		public void Init()
+		{
+			storage = new MemorySettingsStorage();
+		}
+
+		[TearDown]
+		public void Cleanup()
+		{
+			storage.Dispose();
+		}
+
+		[Test]
+		public void MakeStorage()
+		{
+			Assert.IsNotNull( storage );
+		}
+
+		[Test]
+		public void SaveAndLoadSettings()
+		{
+			Assert.IsNull( storage.GetSetting( "X" ), "X is not null" );
+			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME is not null" );
+
+			storage.SaveSetting("X", 5);
+			storage.SaveSetting("NAME", "Charlie");
+
+			Assert.AreEqual( 5, storage.GetSetting("X") );
+			Assert.AreEqual( "Charlie", storage.GetSetting("NAME") );
+		}
+
+		[Test]
+		public void RemoveSettings()
+		{
+			storage.SaveSetting("X", 5);
+			storage.SaveSetting("NAME", "Charlie");
+
+			storage.RemoveSetting( "X" );
+			Assert.IsNull( storage.GetSetting( "X" ), "X not removed" );
+			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
+
+			storage.RemoveSetting( "NAME" );
+			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME not removed" );
+		}
+
+		[Test]
+		public void MakeSubStorages()
+		{
+			ISettingsStorage sub1 = storage.MakeChildStorage( "Sub1" );
+			ISettingsStorage sub2 = storage.MakeChildStorage( "Sub2" );
+
+			Assert.IsNotNull( sub1, "Sub1 is null" );
+			Assert.IsNotNull( sub2, "Sub2 is null" );
+		}
+
+		[Test]
+		public void SubstorageSettings()
+		{
+			ISettingsStorage sub = storage.MakeChildStorage( "Sub" );
+
+			sub.SaveSetting( "X", 5 );
+			sub.SaveSetting( "NAME", "Charlie" );
+
+			Assert.AreEqual( 5, sub.GetSetting( "X" ) );
+			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
+
+			sub.RemoveSetting( "X" );
+			Assert.IsNull( sub.GetSetting( "X" ), "X not removed" );
+			
+			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
+
+			sub.RemoveSetting( "NAME" );
+			Assert.IsNull( sub.GetSetting( "NAME" ), "NAME not removed" );
+		}
+
+		[Test]
+		public void TypeSafeSettings()
+		{
+			storage.SaveSetting( "X", 5);
+			storage.SaveSetting( "Y", "17" );
+			storage.SaveSetting( "NAME", "Charlie");
+
+			Assert.AreEqual( 5, storage.GetSetting("X") );
+			Assert.AreEqual( "17", storage.GetSetting( "Y" ) );
+			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/MockAssemblyWatcher.cs b/src/ClientUtilities/tests/MockAssemblyWatcher.cs
index 2619186..ab135ff 100644
--- a/src/ClientUtilities/tests/MockAssemblyWatcher.cs
+++ b/src/ClientUtilities/tests/MockAssemblyWatcher.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// 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.Util;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// MockAssemblyWatcher provides way of triggering change
-	/// events for test purposes.
-	/// </summary>
-	public class MockAssemblyWatcher : AssemblyWatcher
-	{
-		private bool eventPublished = false;
-
-		private DateTime triggerTime;
-		private DateTime publishTime;
-
-		public bool EventPublished
-		{
-			get { return eventPublished; }
-		}
-
-		public int ElapsedTime
-		{
-			get 
-			{ 
-				TimeSpan elapsed = publishTime - triggerTime;
-				return (int)elapsed.TotalMilliseconds;
-			}
-		}
-
-		public void TriggerEvent( int delay )
-		{
-			Delay = delay;
-			TriggerEvent( );
-		}
-
-		public void TriggerEvent( )
-		{
-			eventPublished = false;
-			triggerTime = DateTime.Now;
-
-			OnChanged( this, 
-				new FileSystemEventArgs( WatcherChangeTypes.Changed, 
-				GetFileInfo(0).DirectoryName, 
-				GetFileInfo(0).Name ) );
-		}
-
-		public int Delay
-		{
-			get { return (int)timer.Interval; }
-			set { timer.Interval = value; }
-		}
-
-		protected new void PublishEvent()
-		{
-			publishTime = DateTime.Now;
-
-			base.PublishEvent();
-			eventPublished = true;
-		}
-	}
-}
+// ****************************************************************
+// 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.Util;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// MockAssemblyWatcher provides way of triggering change
+	/// events for test purposes.
+	/// </summary>
+	public class MockAssemblyWatcher : AssemblyWatcher
+	{
+		private bool eventPublished = false;
+
+		private DateTime triggerTime;
+		private DateTime publishTime;
+
+		public bool EventPublished
+		{
+			get { return eventPublished; }
+		}
+
+		public int ElapsedTime
+		{
+			get 
+			{ 
+				TimeSpan elapsed = publishTime - triggerTime;
+				return (int)elapsed.TotalMilliseconds;
+			}
+		}
+
+		public void TriggerEvent( int delay )
+		{
+			Delay = delay;
+			TriggerEvent( );
+		}
+
+		public void TriggerEvent( )
+		{
+			eventPublished = false;
+			triggerTime = DateTime.Now;
+
+			OnChanged( this, 
+				new FileSystemEventArgs( WatcherChangeTypes.Changed, 
+				GetFileInfo(0).DirectoryName, 
+				GetFileInfo(0).Name ) );
+		}
+
+		public int Delay
+		{
+			get { return (int)timer.Interval; }
+			set { timer.Interval = value; }
+		}
+
+		protected new void PublishEvent()
+		{
+			publishTime = DateTime.Now;
+
+			base.PublishEvent();
+			eventPublished = true;
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/NUnitProjectLoad.cs b/src/ClientUtilities/tests/NUnitProjectLoad.cs
index 7f1e2cc..c647018 100644
--- a/src/ClientUtilities/tests/NUnitProjectLoad.cs
+++ b/src/ClientUtilities/tests/NUnitProjectLoad.cs
@@ -1,113 +1,113 @@
-// ****************************************************************
-// 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.IO;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-
-namespace NUnit.Util.Tests
-{
-	// TODO: Some of these tests are really tests of VSProject and should be moved there.
-
-	[TestFixture]
-	public class NUnitProjectLoad
-	{
-		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
-        static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
-
-		private ProjectService projectService;
-		private NUnitProject project;
-
-		[SetUp]
-		public void SetUp()
-		{
-			projectService = new ProjectService();
-			project = projectService.EmptyProject();
-		}
-
-		[TearDown]
-		public void TearDown()
-		{
-			if ( File.Exists( xmlfile ) )
-				File.Delete( xmlfile );
-		}
-
-		// Write a string out to our xml file and then load project from it
-		private void LoadProject( string source )
-		{
-			StreamWriter writer = new StreamWriter( xmlfile );
-			writer.Write( source );
-			writer.Close();
-
-			project.ProjectPath = Path.GetFullPath( xmlfile );
-			project.Load();
-		}
-
-		[Test]
-		public void LoadEmptyProject()
-		{
-			LoadProject( NUnitProjectXml.EmptyProject );
-			Assert.AreEqual( 0, project.Configs.Count );
-		}
-
-		[Test]
-		public void LoadEmptyConfigs()
-		{
-			LoadProject( NUnitProjectXml.EmptyConfigs );
-			Assert.AreEqual( 2, project.Configs.Count );
-			Assert.IsTrue( project.Configs.Contains( "Debug") );
-			Assert.IsTrue( project.Configs.Contains( "Release") );
-		}
-
-		[Test]
-		public void LoadNormalProject()
-		{
-			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.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.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]
-		public void LoadProjectWithManualBinPath()
-		{
-			LoadProject( NUnitProjectXml.ManualBinPathProject );
-			Assert.AreEqual( 1, project.Configs.Count );
-			ProjectConfig config1 = project.Configs["Debug"];
-			Assert.AreEqual( "bin_path_value", config1.PrivateBinPath );
-		}
-
-		[Test]
-		public void FromAssembly()
-		{
-			NUnitProject project = projectService.WrapAssembly(mockDll);
-			Assert.AreEqual( "Default", project.ActiveConfigName );
-			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" );
-		}
-
-		[Test]
-		public void SaveClearsAssemblyWrapper()
-		{
-			NUnitProject project = projectService.WrapAssembly(mockDll);
-			project.Save( xmlfile );
-			Assert.IsFalse( project.IsAssemblyWrapper,
-				"Changed project should no longer be wrapper");
-		}
-	}
-}
+// ****************************************************************
+// 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.IO;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.Util.Tests
+{
+	// TODO: Some of these tests are really tests of VSProject and should be moved there.
+
+	[TestFixture]
+	public class NUnitProjectLoad
+	{
+		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
+        static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
+
+		private ProjectService projectService;
+		private NUnitProject project;
+
+		[SetUp]
+		public void SetUp()
+		{
+			projectService = new ProjectService();
+			project = projectService.EmptyProject();
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			if ( File.Exists( xmlfile ) )
+				File.Delete( xmlfile );
+		}
+
+		// Write a string out to our xml file and then load project from it
+		private void LoadProject( string source )
+		{
+			StreamWriter writer = new StreamWriter( xmlfile );
+			writer.Write( source );
+			writer.Close();
+
+			project.ProjectPath = Path.GetFullPath( xmlfile );
+			project.Load();
+		}
+
+		[Test]
+		public void LoadEmptyProject()
+		{
+			LoadProject( NUnitProjectXml.EmptyProject );
+			Assert.AreEqual( 0, project.Configs.Count );
+		}
+
+		[Test]
+		public void LoadEmptyConfigs()
+		{
+			LoadProject( NUnitProjectXml.EmptyConfigs );
+			Assert.AreEqual( 2, project.Configs.Count );
+			Assert.IsTrue( project.Configs.Contains( "Debug") );
+			Assert.IsTrue( project.Configs.Contains( "Release") );
+		}
+
+		[Test]
+		public void LoadNormalProject()
+		{
+			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.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.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]
+		public void LoadProjectWithManualBinPath()
+		{
+			LoadProject( NUnitProjectXml.ManualBinPathProject );
+			Assert.AreEqual( 1, project.Configs.Count );
+			ProjectConfig config1 = project.Configs["Debug"];
+			Assert.AreEqual( "bin_path_value", config1.PrivateBinPath );
+		}
+
+		[Test]
+		public void FromAssembly()
+		{
+			NUnitProject project = projectService.WrapAssembly(mockDll);
+			Assert.AreEqual( "Default", project.ActiveConfigName );
+			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" );
+		}
+
+		[Test]
+		public void SaveClearsAssemblyWrapper()
+		{
+			NUnitProject project = projectService.WrapAssembly(mockDll);
+			project.Save( xmlfile );
+			Assert.IsFalse( project.IsAssemblyWrapper,
+				"Changed project should no longer be wrapper");
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/NUnitProjectSave.cs b/src/ClientUtilities/tests/NUnitProjectSave.cs
index e00a0bf..65aabb8 100644
--- a/src/ClientUtilities/tests/NUnitProjectSave.cs
+++ b/src/ClientUtilities/tests/NUnitProjectSave.cs
@@ -1,85 +1,85 @@
-// ****************************************************************
-// 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.Xml;
-using System.IO;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class NUnitProjectSave
-	{
-		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
-
-		private NUnitProject project;
-
-		[SetUp]
-		public void SetUp()
-		{
-			project = new ProjectService().EmptyProject();
-		}
-
-		[TearDown]
-		public void TearDown()
-		{
-			if ( File.Exists( xmlfile ) )
-				File.Delete( xmlfile );
-		}
-
-		private void CheckContents( string expected )
-		{
-			StreamReader reader = new StreamReader( xmlfile );
-			string contents = reader.ReadToEnd();
-			reader.Close();
-			Assert.AreEqual( expected, contents );
-		}
-
-		[Test]
-		public void SaveEmptyProject()
-		{
-			project.Save( xmlfile );
-
-			CheckContents( NUnitProjectXml.EmptyProject );
-		}
-
-		[Test]
-		public void SaveEmptyConfigs()
-		{
-			project.Configs.Add( "Debug" );
-			project.Configs.Add( "Release" );
-
-			project.Save( xmlfile );
-
-			CheckContents( NUnitProjectXml.EmptyConfigs );			
-		}
-
-		[Test]
-		public void SaveNormalProject()
-		{
-            string tempPath = Path.GetTempPath();
-
-			ProjectConfig config1 = new ProjectConfig( "Debug" );
-			config1.BasePath = "bin" + Path.DirectorySeparatorChar + "debug";
-			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.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 );
-
-			project.Save( xmlfile );
-
-			CheckContents( NUnitProjectXml.NormalProject );
-		}
-	}
-}
+// ****************************************************************
+// 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.Xml;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class NUnitProjectSave
+	{
+		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
+
+		private NUnitProject project;
+
+		[SetUp]
+		public void SetUp()
+		{
+			project = new ProjectService().EmptyProject();
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			if ( File.Exists( xmlfile ) )
+				File.Delete( xmlfile );
+		}
+
+		private void CheckContents( string expected )
+		{
+			StreamReader reader = new StreamReader( xmlfile );
+			string contents = reader.ReadToEnd();
+			reader.Close();
+			Assert.AreEqual( expected, contents );
+		}
+
+		[Test]
+		public void SaveEmptyProject()
+		{
+			project.Save( xmlfile );
+
+			CheckContents( NUnitProjectXml.EmptyProject );
+		}
+
+		[Test]
+		public void SaveEmptyConfigs()
+		{
+			project.Configs.Add( "Debug" );
+			project.Configs.Add( "Release" );
+
+			project.Save( xmlfile );
+
+			CheckContents( NUnitProjectXml.EmptyConfigs );			
+		}
+
+		[Test]
+		public void SaveNormalProject()
+		{
+            string tempPath = Path.GetTempPath();
+
+			ProjectConfig config1 = new ProjectConfig( "Debug" );
+			config1.BasePath = "bin" + Path.DirectorySeparatorChar + "debug";
+			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.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 );
+
+			project.Save( xmlfile );
+
+			CheckContents( NUnitProjectXml.NormalProject );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/NUnitProjectTests.cs b/src/ClientUtilities/tests/NUnitProjectTests.cs
index 8b046c6..a766f6e 100644
--- a/src/ClientUtilities/tests/NUnitProjectTests.cs
+++ b/src/ClientUtilities/tests/NUnitProjectTests.cs
@@ -1,296 +1,296 @@
-// ****************************************************************
-// 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.Xml;
-using System.Text;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class NUnitProjectTests
-	{
-		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
-        static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
-
-		private NUnitProject project;
-		private ProjectService projectService;
-
-		[SetUp]
-		public void SetUp()
-		{
-			projectService = new ProjectService();
-			project = projectService.EmptyProject();
-		}
-
-		[TearDown]
-		public void EraseFile()
-		{
-			if ( File.Exists( xmlfile ) )
-				File.Delete( xmlfile );
-		}
-
-		[Test]
-		public void IsProjectFile()
-		{
-			Assert.IsTrue( NUnitProject.IsNUnitProjectFile( @"\x\y\test.nunit" ) );
-			Assert.IsFalse( NUnitProject.IsNUnitProjectFile( @"\x\y\test.junit" ) );
-		}
-
-		[Test]
-		public void NewProjectIsEmpty()
-		{
-			Assert.AreEqual( 0, project.Configs.Count );
-			Assert.IsNull( project.ActiveConfig );
-		}
-
-		[Test]
-		public void NewProjectIsNotDirty()
-		{
-			Assert.IsFalse( project.IsDirty );
-		}
-
-		[Test] 
-		public void NewProjectDefaultPath()
-		{
-			Assert.AreEqual( Path.GetFullPath( "Project1" ), project.ProjectPath );
-			Assert.AreEqual( "Project1", project.Name );
-			NUnitProject another = projectService.EmptyProject();
-			Assert.AreEqual( Path.GetFullPath( "Project2" ), another.ProjectPath );
-		}
-
-		[Test]
-		public void NewProjectNotLoadable()
-		{
-			Assert.IsFalse( project.IsLoadable );
-		}
-
-		[Test]
-		public void SaveMakesProjectNotDirty()
-		{
-			project.Save( xmlfile );
-			Assert.IsFalse( project.IsDirty );
-		}
-
-		[Test]
-		public void SaveSetsProjectPath()
-		{
-			project.Save( xmlfile );
-			Assert.AreEqual( Path.GetFullPath( xmlfile ), project.ProjectPath );
-			Assert.AreEqual( "test", project.Name );
-		}
-
-		[Test]
-		public void DefaultApplicationBase()
-		{
-			project.Save( xmlfile );
-			Assert.AreEqual( Path.GetDirectoryName( project.ProjectPath ), project.BasePath );
-		}
-
-		[Test]
-		public void DefaultConfigurationFile()
-		{
-			Assert.AreEqual( "Project1.config", project.ConfigurationFile );
-			project.Save( xmlfile );
-			Assert.AreEqual( "test.config", project.ConfigurationFile );
-		}
-
-		[Test]
-		public void ConfigurationFileFromAssembly() 
-		{
-			NUnitProject project = projectService.WrapAssembly(mockDll);
-			string config = Path.GetFileName( project.ConfigurationFile );
-			Assert.That(config, Is.EqualTo("mock-assembly.dll.config").IgnoreCase);
-		}
-
-		[Test]
-		public void ConfigurationFileFromAssemblies() 
-		{
-			NUnitProject project = projectService.WrapAssemblies(new string[] {mockDll});
-			string config = Path.GetFileName( project.ConfigurationFile );
-			Assert.That(config, Is.EqualTo("mock-assembly.dll.config").IgnoreCase);
-		}
-
-		[Test]
-		public void DefaultProjectName()
-		{
-			project.Save( xmlfile );
-			Assert.AreEqual( "test", project.Name );
-		}
-
-		[Test]
-		public void LoadMakesProjectNotDirty()
-		{
-			project.Save( xmlfile );
-			NUnitProject project2 = new ProjectService().LoadProject( xmlfile );
-			Assert.IsFalse( project2.IsDirty );
-		}
-
-		[Test]
-		public void CanSetAppBase()
-		{
-			project.BasePath = "..";
-			Assert.AreEqual( Path.GetDirectoryName( Environment.CurrentDirectory ), project.BasePath  );
-		}
-
-		[Test]
-		public void CanAddConfigs()
-		{
-			project.Configs.Add("Debug");
-			project.Configs.Add("Release");
-			Assert.AreEqual( 2, project.Configs.Count );
-		}
-
-		[Test]
-		public void CanSetActiveConfig()
-		{
-			project.Configs.Add("Debug");
-			project.Configs.Add("Release");
-			project.SetActiveConfig( "Release" );
-			Assert.AreEqual( "Release", project.ActiveConfig.Name );
-		}
-
-		[Test]
-		public void CanAddAssemblies()
-		{
-			project.Configs.Add("Debug");
-			project.Configs.Add("Release");
-
-			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 AddConfigMakesProjectDirty()
-		{
-			project.Configs.Add("Debug");
-			Assert.IsTrue( project.IsDirty );
-		}
-
-		[Test]
-		public void RenameConfigMakesProjectDirty()
-		{
-			project.Configs.Add("Old");
-			project.IsDirty = false;
-			project.Configs[0].Name = "New";
-			Assert.IsTrue( project.IsDirty );
-		}
-
-		[Test]
-		public void DefaultActiveConfig()
-		{
-			project.Configs.Add("Debug");
-			Assert.AreEqual( "Debug", project.ActiveConfig.Name );
-		}
-
-		[Test]
-		public void RenameActiveConfig()
-		{
-			project.Configs.Add( "Old" );
-			project.SetActiveConfig( "Old" );
-			project.Configs[0].Name = "New";
-			Assert.AreEqual( "New", project.ActiveConfig.Name );
-		}
-
-		[Test]
-		public void RemoveConfigMakesProjectDirty()
-		{
-			project.Configs.Add("Debug");
-			project.IsDirty = false;
-			project.Configs.Remove("Debug");
-			Assert.IsTrue( project.IsDirty );
-		}
-
-		[Test]
-		public void RemoveActiveConfig()
-		{
-			project.Configs.Add("Debug");
-			project.Configs.Add("Release");
-			project.SetActiveConfig("Debug");
-			project.Configs.Remove("Debug");
-			Assert.AreEqual( "Release", project.ActiveConfig.Name );
-		}
-
-		[Test]
-		public void SettingActiveConfigMakesProjectDirty()
-		{
-			project.Configs.Add("Debug");
-			project.Configs.Add("Release");
-			project.SetActiveConfig( "Debug" );
-			project.IsDirty = false;
-			project.SetActiveConfig( "Release" );
-			Assert.IsTrue( project.IsDirty );
-		}
-
-		[Test]
-		public void SaveAndLoadEmptyProject()
-		{
-			project.Save( xmlfile );
-			Assert.IsTrue( File.Exists( xmlfile ) );
-
-			NUnitProject project2 = projectService.LoadProject( xmlfile );
-
-			Assert.AreEqual( 0, project2.Configs.Count );
-		}
-
-		[Test]
-		public void SaveAndLoadEmptyConfigs()
-		{
-			project.Configs.Add( "Debug" );
-			project.Configs.Add( "Release" );
-			project.Save( xmlfile );
-
-			Assert.IsTrue( File.Exists( xmlfile ) );
-
-			NUnitProject project2 = projectService.LoadProject( xmlfile );
-
-			Assert.AreEqual( 2, project2.Configs.Count );
-			Assert.IsTrue( project2.Configs.Contains( "Debug" ) );
-			Assert.IsTrue( project2.Configs.Contains( "Release" ) );
-		}
-
-		[Test]
-		public void SaveAndLoadConfigsWithAssemblies()
-		{
-            string tempPath = Path.GetTempPath();
-
-			ProjectConfig config1 = new ProjectConfig( "Debug" );
-            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.Combine(tempPath, @"bin\release\assembly1.dll"));
-            config2.Assemblies.Add(Path.Combine(tempPath, @"bin\release\assembly2.dll"));
-
-			project.Configs.Add( config1 );
-			project.Configs.Add( config2 );
-			project.Save( xmlfile );
-
-			Assert.IsTrue( File.Exists( xmlfile ) );
-
-			NUnitProject project2 = projectService.LoadProject( xmlfile );
-
-			Assert.AreEqual( 2, project2.Configs.Count );
-
-			config1 = project2.Configs["Debug"];
-			Assert.AreEqual( 2, config1.Assemblies.Count );
-            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.Combine(tempPath, @"bin\release\assembly1.dll"), config2.Assemblies[0]);
-            Assert.AreEqual(Path.Combine(tempPath, @"bin\release\assembly2.dll"), config2.Assemblies[1]);
-		}
-	}
-}
+// ****************************************************************
+// 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.Xml;
+using System.Text;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class NUnitProjectTests
+	{
+		static readonly string xmlfile = Path.Combine(Path.GetTempPath(), "test.nunit");
+        static readonly string mockDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
+
+		private NUnitProject project;
+		private ProjectService projectService;
+
+		[SetUp]
+		public void SetUp()
+		{
+			projectService = new ProjectService();
+			project = projectService.EmptyProject();
+		}
+
+		[TearDown]
+		public void EraseFile()
+		{
+			if ( File.Exists( xmlfile ) )
+				File.Delete( xmlfile );
+		}
+
+		[Test]
+		public void IsProjectFile()
+		{
+			Assert.IsTrue( NUnitProject.IsNUnitProjectFile( @"\x\y\test.nunit" ) );
+			Assert.IsFalse( NUnitProject.IsNUnitProjectFile( @"\x\y\test.junit" ) );
+		}
+
+		[Test]
+		public void NewProjectIsEmpty()
+		{
+			Assert.AreEqual( 0, project.Configs.Count );
+			Assert.IsNull( project.ActiveConfig );
+		}
+
+		[Test]
+		public void NewProjectIsNotDirty()
+		{
+			Assert.IsFalse( project.IsDirty );
+		}
+
+		[Test] 
+		public void NewProjectDefaultPath()
+		{
+			Assert.AreEqual( Path.GetFullPath( "Project1" ), project.ProjectPath );
+			Assert.AreEqual( "Project1", project.Name );
+			NUnitProject another = projectService.EmptyProject();
+			Assert.AreEqual( Path.GetFullPath( "Project2" ), another.ProjectPath );
+		}
+
+		[Test]
+		public void NewProjectNotLoadable()
+		{
+			Assert.IsFalse( project.IsLoadable );
+		}
+
+		[Test]
+		public void SaveMakesProjectNotDirty()
+		{
+			project.Save( xmlfile );
+			Assert.IsFalse( project.IsDirty );
+		}
+
+		[Test]
+		public void SaveSetsProjectPath()
+		{
+			project.Save( xmlfile );
+			Assert.AreEqual( Path.GetFullPath( xmlfile ), project.ProjectPath );
+			Assert.AreEqual( "test", project.Name );
+		}
+
+		[Test]
+		public void DefaultApplicationBase()
+		{
+			project.Save( xmlfile );
+			Assert.AreEqual( Path.GetDirectoryName( project.ProjectPath ), project.BasePath );
+		}
+
+		[Test]
+		public void DefaultConfigurationFile()
+		{
+			Assert.AreEqual( "Project1.config", project.ConfigurationFile );
+			project.Save( xmlfile );
+			Assert.AreEqual( "test.config", project.ConfigurationFile );
+		}
+
+		[Test]
+		public void ConfigurationFileFromAssembly() 
+		{
+			NUnitProject project = projectService.WrapAssembly(mockDll);
+			string config = Path.GetFileName( project.ConfigurationFile );
+			Assert.That(config, Is.EqualTo("mock-assembly.dll.config").IgnoreCase);
+		}
+
+		[Test]
+		public void ConfigurationFileFromAssemblies() 
+		{
+			NUnitProject project = projectService.WrapAssemblies(new string[] {mockDll});
+			string config = Path.GetFileName( project.ConfigurationFile );
+			Assert.That(config, Is.EqualTo("mock-assembly.dll.config").IgnoreCase);
+		}
+
+		[Test]
+		public void DefaultProjectName()
+		{
+			project.Save( xmlfile );
+			Assert.AreEqual( "test", project.Name );
+		}
+
+		[Test]
+		public void LoadMakesProjectNotDirty()
+		{
+			project.Save( xmlfile );
+			NUnitProject project2 = new ProjectService().LoadProject( xmlfile );
+			Assert.IsFalse( project2.IsDirty );
+		}
+
+		[Test]
+		public void CanSetAppBase()
+		{
+			project.BasePath = "..";
+			Assert.AreEqual( Path.GetDirectoryName( Environment.CurrentDirectory ), project.BasePath  );
+		}
+
+		[Test]
+		public void CanAddConfigs()
+		{
+			project.Configs.Add("Debug");
+			project.Configs.Add("Release");
+			Assert.AreEqual( 2, project.Configs.Count );
+		}
+
+		[Test]
+		public void CanSetActiveConfig()
+		{
+			project.Configs.Add("Debug");
+			project.Configs.Add("Release");
+			project.SetActiveConfig( "Release" );
+			Assert.AreEqual( "Release", project.ActiveConfig.Name );
+		}
+
+		[Test]
+		public void CanAddAssemblies()
+		{
+			project.Configs.Add("Debug");
+			project.Configs.Add("Release");
+
+			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 AddConfigMakesProjectDirty()
+		{
+			project.Configs.Add("Debug");
+			Assert.IsTrue( project.IsDirty );
+		}
+
+		[Test]
+		public void RenameConfigMakesProjectDirty()
+		{
+			project.Configs.Add("Old");
+			project.IsDirty = false;
+			project.Configs[0].Name = "New";
+			Assert.IsTrue( project.IsDirty );
+		}
+
+		[Test]
+		public void DefaultActiveConfig()
+		{
+			project.Configs.Add("Debug");
+			Assert.AreEqual( "Debug", project.ActiveConfig.Name );
+		}
+
+		[Test]
+		public void RenameActiveConfig()
+		{
+			project.Configs.Add( "Old" );
+			project.SetActiveConfig( "Old" );
+			project.Configs[0].Name = "New";
+			Assert.AreEqual( "New", project.ActiveConfig.Name );
+		}
+
+		[Test]
+		public void RemoveConfigMakesProjectDirty()
+		{
+			project.Configs.Add("Debug");
+			project.IsDirty = false;
+			project.Configs.Remove("Debug");
+			Assert.IsTrue( project.IsDirty );
+		}
+
+		[Test]
+		public void RemoveActiveConfig()
+		{
+			project.Configs.Add("Debug");
+			project.Configs.Add("Release");
+			project.SetActiveConfig("Debug");
+			project.Configs.Remove("Debug");
+			Assert.AreEqual( "Release", project.ActiveConfig.Name );
+		}
+
+		[Test]
+		public void SettingActiveConfigMakesProjectDirty()
+		{
+			project.Configs.Add("Debug");
+			project.Configs.Add("Release");
+			project.SetActiveConfig( "Debug" );
+			project.IsDirty = false;
+			project.SetActiveConfig( "Release" );
+			Assert.IsTrue( project.IsDirty );
+		}
+
+		[Test]
+		public void SaveAndLoadEmptyProject()
+		{
+			project.Save( xmlfile );
+			Assert.IsTrue( File.Exists( xmlfile ) );
+
+			NUnitProject project2 = projectService.LoadProject( xmlfile );
+
+			Assert.AreEqual( 0, project2.Configs.Count );
+		}
+
+		[Test]
+		public void SaveAndLoadEmptyConfigs()
+		{
+			project.Configs.Add( "Debug" );
+			project.Configs.Add( "Release" );
+			project.Save( xmlfile );
+
+			Assert.IsTrue( File.Exists( xmlfile ) );
+
+			NUnitProject project2 = projectService.LoadProject( xmlfile );
+
+			Assert.AreEqual( 2, project2.Configs.Count );
+			Assert.IsTrue( project2.Configs.Contains( "Debug" ) );
+			Assert.IsTrue( project2.Configs.Contains( "Release" ) );
+		}
+
+		[Test]
+		public void SaveAndLoadConfigsWithAssemblies()
+		{
+            string tempPath = Path.GetTempPath();
+
+			ProjectConfig config1 = new ProjectConfig( "Debug" );
+            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.Combine(tempPath, @"bin\release\assembly1.dll"));
+            config2.Assemblies.Add(Path.Combine(tempPath, @"bin\release\assembly2.dll"));
+
+			project.Configs.Add( config1 );
+			project.Configs.Add( config2 );
+			project.Save( xmlfile );
+
+			Assert.IsTrue( File.Exists( xmlfile ) );
+
+			NUnitProject project2 = projectService.LoadProject( xmlfile );
+
+			Assert.AreEqual( 2, project2.Configs.Count );
+
+			config1 = project2.Configs["Debug"];
+			Assert.AreEqual( 2, config1.Assemblies.Count );
+            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.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/NUnitProjectXml.cs b/src/ClientUtilities/tests/NUnitProjectXml.cs
index d44371f..239c0e0 100644
--- a/src/ClientUtilities/tests/NUnitProjectXml.cs
+++ b/src/ClientUtilities/tests/NUnitProjectXml.cs
@@ -1,45 +1,45 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Util.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>";
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util.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>";
+	}
+}
diff --git a/src/ClientUtilities/tests/NUnitRegistryTests.cs b/src/ClientUtilities/tests/NUnitRegistryTests.cs
index a4f4da1..cd90f60 100644
--- a/src/ClientUtilities/tests/NUnitRegistryTests.cs
+++ b/src/ClientUtilities/tests/NUnitRegistryTests.cs
@@ -1,75 +1,75 @@
-// ****************************************************************
-// 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.Text;
-//using System.Windows.Forms;
-using Microsoft.Win32;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for NUnitRegistryTests.
-	/// </summary>
-	[TestFixture]
-	public class NUnitRegistryTests
-	{
-		[TearDown]
-		public void RestoreRegistry()
-		{
-			NUnitRegistry.TestMode = false;
-		}
-
-		[Test]
-		public void CurrentUser()
-		{
-			NUnitRegistry.TestMode = false;
-			using( RegistryKey key = NUnitRegistry.CurrentUser )
-			{
-				Assert.IsNotNull( key );
-				Assert.AreEqual( @"HKEY_CURRENT_USER\Software\nunit.org\Nunit\2.4".ToLower(), key.Name.ToLower() );
-			}
-		}
-
-		[Test]
-		public void CurrentUserTestMode()
-		{
-
-			NUnitRegistry.TestMode = true;
-			using( RegistryKey key = NUnitRegistry.CurrentUser )
-			{
-				Assert.IsNotNull( key );
-				Assert.AreEqual( @"HKEY_CURRENT_USER\Software\nunit.org\Nunit-Test".ToLower(), key.Name.ToLower() );
-			}
-		}
-
-		[Test]
-		public void TestClearRoutines()
-		{
-			NUnitRegistry.TestMode = true;
-
-			using( RegistryKey key = NUnitRegistry.CurrentUser )
-			using( RegistryKey foo = key.CreateSubKey( "foo" ) )
-			using( RegistryKey bar = key.CreateSubKey( "bar" ) )
-			using( RegistryKey footoo = foo.CreateSubKey( "foo" ) )
-			{
-				key.SetValue("X", 5);
-				key.SetValue("NAME", "Joe");
-				foo.SetValue("Y", 17);
-				bar.SetValue("NAME", "Jennifer");
-				footoo.SetValue( "X", 5 );
-				footoo.SetValue("NAME", "Charlie" );
-				
-				NUnitRegistry.ClearTestKeys();
-
-				Assert.AreEqual( 0, key.ValueCount );
-				Assert.AreEqual( 0, key.SubKeyCount );
-			}
-		}
-	}
-}
+// ****************************************************************
+// 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.Text;
+//using System.Windows.Forms;
+using Microsoft.Win32;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for NUnitRegistryTests.
+	/// </summary>
+	[TestFixture]
+	public class NUnitRegistryTests
+	{
+		[TearDown]
+		public void RestoreRegistry()
+		{
+			NUnitRegistry.TestMode = false;
+		}
+
+		[Test]
+		public void CurrentUser()
+		{
+			NUnitRegistry.TestMode = false;
+			using( RegistryKey key = NUnitRegistry.CurrentUser )
+			{
+				Assert.IsNotNull( key );
+				Assert.AreEqual( @"HKEY_CURRENT_USER\Software\nunit.org\Nunit\2.4".ToLower(), key.Name.ToLower() );
+			}
+		}
+
+		[Test]
+		public void CurrentUserTestMode()
+		{
+
+			NUnitRegistry.TestMode = true;
+			using( RegistryKey key = NUnitRegistry.CurrentUser )
+			{
+				Assert.IsNotNull( key );
+				Assert.AreEqual( @"HKEY_CURRENT_USER\Software\nunit.org\Nunit-Test".ToLower(), key.Name.ToLower() );
+			}
+		}
+
+		[Test]
+		public void TestClearRoutines()
+		{
+			NUnitRegistry.TestMode = true;
+
+			using( RegistryKey key = NUnitRegistry.CurrentUser )
+			using( RegistryKey foo = key.CreateSubKey( "foo" ) )
+			using( RegistryKey bar = key.CreateSubKey( "bar" ) )
+			using( RegistryKey footoo = foo.CreateSubKey( "foo" ) )
+			{
+				key.SetValue("X", 5);
+				key.SetValue("NAME", "Joe");
+				foo.SetValue("Y", 17);
+				bar.SetValue("NAME", "Jennifer");
+				footoo.SetValue( "X", 5 );
+				footoo.SetValue("NAME", "Charlie" );
+				
+				NUnitRegistry.ClearTestKeys();
+
+				Assert.AreEqual( 0, key.ValueCount );
+				Assert.AreEqual( 0, key.SubKeyCount );
+			}
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/PathUtilTests.cs b/src/ClientUtilities/tests/PathUtilTests.cs
index f9f8d7a..820b4f0 100644
--- a/src/ClientUtilities/tests/PathUtilTests.cs
+++ b/src/ClientUtilities/tests/PathUtilTests.cs
@@ -1,262 +1,262 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class PathUtilTests : PathUtils
-	{
-		[Test]
-		public void CheckDefaults()
-		{
-			Assert.AreEqual( Path.DirectorySeparatorChar, PathUtils.DirectorySeparatorChar );
-			Assert.AreEqual( Path.AltDirectorySeparatorChar, PathUtils.AltDirectorySeparatorChar );
-		}
-	}
-
-	// Local Assert extension
-	internal class Assert : NUnit.Framework.Assert
-	{
-		public static void SamePath( string path1, string path2 )
-		{
-			string msg = "\r\n\texpected: Same path as <{0}>\r\n\t but was: <{1}>";
-			Assert.IsTrue( PathUtils.SamePath( path1, path2 ), msg, path1, path2 );
-		}
-
-		public static void NotSamePath( string path1, string path2 )
-		{
-			string msg = "\r\n\texpected: Not same path as <{0}>\r\n\t but was: <{1}>";
-			Assert.IsFalse( PathUtils.SamePath( path1, path2 ), msg, path1, path2 );
-		}
-
-		public static void SamePathOrUnder( string path1, string path2 )
-		{
-			string msg = "\r\n\texpected: Same path or under <{0}>\r\n\t but was: <{1}>";
-			Assert.IsTrue( PathUtils.SamePathOrUnder( path1, path2 ), msg, path1, path2 );
-		}
-
-		public static void NotSamePathOrUnder( string path1, string path2 )
-		{
-			string msg = "\r\n\texpected: Not same path or under <{0}>\r\n\t but was: <{1}>";
-			Assert.IsFalse( PathUtils.SamePathOrUnder( path1, path2 ), msg, path1, path2 );
-		}
-	}
-
-	[TestFixture]
-	public class PathUtilTests_Windows : PathUtils
-	{
-		[TestFixtureSetUp]
-		public static void SetUpUnixSeparators()
-		{
-			PathUtils.DirectorySeparatorChar = '\\';
-			PathUtils.AltDirectorySeparatorChar = '/';
-		}
-
-		[TestFixtureTearDown]
-		public static void RestoreDefaultSeparators()
-		{
-			PathUtils.DirectorySeparatorChar = System.IO.Path.DirectorySeparatorChar;
-			PathUtils.AltDirectorySeparatorChar = System.IO.Path.AltDirectorySeparatorChar;
-		}
-
-		[Test]
-		public void IsAssemblyFileType()
-		{
-			Assert.IsTrue( PathUtils.IsAssemblyFileType( @"c:\bin\test.dll" ) );
-			Assert.IsTrue( PathUtils.IsAssemblyFileType( @"test.exe" ) );
-			Assert.IsFalse( PathUtils.IsAssemblyFileType( @"c:\bin\test.nunit" ) );
-		}
-
-		[Test]
-		public void Canonicalize()
-		{
-			Assert.AreEqual( @"C:\folder1\file.tmp",
-				PathUtils.Canonicalize( @"C:\folder1\.\folder2\..\file.tmp" ) );
-			Assert.AreEqual( @"folder1\file.tmp",
-				PathUtils.Canonicalize( @"folder1\.\folder2\..\file.tmp" ) );
-			Assert.AreEqual( @"folder1\file.tmp", 
-				PathUtils.Canonicalize( @"folder1\folder2\.\..\file.tmp" ) );
-			Assert.AreEqual( @"file.tmp", 
-				PathUtils.Canonicalize( @"folder1\folder2\..\.\..\file.tmp" ) );
-			Assert.AreEqual( @"file.tmp", 
-				PathUtils.Canonicalize( @"folder1\folder2\..\..\..\file.tmp" ) );
-		}
-
-		[Test]
-		[Platform(Exclude="Linux")]
-		public void RelativePath()
-		{
-			Assert.AreEqual( @"folder2\folder3", PathUtils.RelativePath( 
-				@"c:\folder1", @"c:\folder1\folder2\folder3" ) );
-			Assert.AreEqual( @"..\folder2\folder3", PathUtils.RelativePath(
-				@"c:\folder1", @"c:\folder2\folder3" ) );
-			Assert.AreEqual( @"bin\debug", PathUtils.RelativePath(
-				@"c:\folder1", @"bin\debug" ) );
-			Assert.IsNull( PathUtils.RelativePath( @"C:\folder", @"D:\folder" ),
-				"Unrelated paths should return null" );
-            Assert.IsNull(PathUtils.RelativePath(@"C:\", @"D:\"),
-                "Unrelated roots should return null");
-            Assert.IsNull(PathUtils.RelativePath(@"C:", @"D:"),
-                "Unrelated roots (no trailing separators) should return null");
-            Assert.AreEqual(string.Empty,
-                PathUtils.RelativePath(@"C:\folder1", @"C:\folder1"));
-            Assert.AreEqual(string.Empty,
-                PathUtils.RelativePath(@"C:\", @"C:\"));
-
-            // First filePath consisting just of a root:
-            Assert.AreEqual(@"folder1\folder2", PathUtils.RelativePath(
-                @"C:\", @"C:\folder1\folder2"));
-            
-            // 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 filePath directories in result:
-            Assert.AreEqual(@"Folder2\Folder3", PathUtils.RelativePath(
-                @"C:\folder1", @"c:\folder1\Folder2\Folder3"));
-            Assert.AreEqual(@"..\Folder2\folder3", PathUtils.RelativePath(
-                @"c:\folder1", @"C:\Folder2\folder3"));
-        }
-
-		[Test]
-		public void SamePath()
-		{
-			Assert.SamePath( @"C:\folder1\file.tmp", @"c:\folder1\File.TMP" );
-			Assert.SamePath( @"C:\folder1\file.tmp", @"C:\folder1\.\folder2\..\file.tmp" );
-			Assert.NotSamePath( @"C:\folder1\file.tmp", @"C:\folder1\.\folder2\..\file.temp" );
-
-			Assert.SamePath( "D:/folder1/folder2", @"d:\Folder1\Folder2" );
-		}
-
-		[Test]
-		public void SamePathOrUnder()
-		{
-			Assert.SamePathOrUnder( @"C:\folder1\folder2\folder3", @"c:\folder1\.\folder2\junk\..\folder3" );
-			Assert.SamePathOrUnder( @"C:\folder1\folder2\", @"c:\folder1\.\folder2\junk\..\folder3" );
-			Assert.SamePathOrUnder( @"C:\folder1\folder2", @"c:\folder1\.\folder2\junk\..\folder3" );
-			Assert.SamePathOrUnder( @"C:\folder1\folder2", @"c:\folder1\.\Folder2\junk\..\folder3" );
-			Assert.NotSamePathOrUnder( @"C:\folder1\folder2", @"c:\folder1\.\folder22\junk\..\folder3" );
-			Assert.NotSamePathOrUnder( @"C:\folder1\folder2ile.tmp", @"D:\folder1\.\folder2\folder3\file.tmp" );
-			Assert.NotSamePathOrUnder( @"C:\", @"D:\" );
-			Assert.SamePathOrUnder( @"C:\", @"c:\" );
-			Assert.SamePathOrUnder( @"C:\", @"c:\bin\debug" );
-
-		}
-
-		[Test]
-		public void PathFromUri()
-		{
-			Assert.AreEqual( @"C:\a\b\c\my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file:///C:\a\b\c\my.dll" ) );
-			Assert.AreEqual( @"C:\a\b\c\my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file://C:\a\b\c\my.dll" ) );
-		}
-	}
-
-	[TestFixture]
-	public class PathUtilTests_Unix : PathUtils
-	{
-		[TestFixtureSetUp]
-		public static void SetUpUnixSeparators()
-		{
-			PathUtils.DirectorySeparatorChar = '/';
-			PathUtils.AltDirectorySeparatorChar = '\\';
-		}
-
-		[TestFixtureTearDown]
-		public static void RestoreDefaultSeparators()
-		{
-			PathUtils.DirectorySeparatorChar = System.IO.Path.DirectorySeparatorChar;
-			PathUtils.AltDirectorySeparatorChar = System.IO.Path.AltDirectorySeparatorChar;
-		}
-
-		[Test]
-		public void IsAssemblyFileType()
-		{
-			Assert.IsTrue( PathUtils.IsAssemblyFileType( "/bin/test.dll" ) );
-			Assert.IsTrue( PathUtils.IsAssemblyFileType( "test.exe" ) );
-			Assert.IsFalse( PathUtils.IsAssemblyFileType( "/bin/test.nunit" ) );
-		}
-
-		[Test]
-		public void Canonicalize()
-		{
-			Assert.AreEqual( "/folder1/file.tmp",
-				PathUtils.Canonicalize( "/folder1/./folder2/../file.tmp" ) );
-			Assert.AreEqual( "folder1/file.tmp",
-				PathUtils.Canonicalize( "folder1/./folder2/../file.tmp" ) );
-			Assert.AreEqual( "folder1/file.tmp", 
-				PathUtils.Canonicalize( "folder1/folder2/./../file.tmp" ) );
-			Assert.AreEqual( "file.tmp", 
-				PathUtils.Canonicalize( "folder1/folder2/.././../file.tmp" ) );
-			Assert.AreEqual( "file.tmp", 
-				PathUtils.Canonicalize( "folder1/folder2/../../../file.tmp" ) );
-		}
-
-		[Test]
-		public void RelativePath()
-		{
-			Assert.AreEqual( "folder2/folder3", 
-				PathUtils.RelativePath(	"/folder1", "/folder1/folder2/folder3" ) );
-			Assert.AreEqual( "../folder2/folder3", 
-				PathUtils.RelativePath( "/folder1", "/folder2/folder3" ) );
-			Assert.AreEqual( "bin/debug", 
-				PathUtils.RelativePath( "/folder1", "bin/debug" ) );
-			Assert.AreEqual( "../other/folder", 
-				PathUtils.RelativePath( "/folder", "/other/folder" ) );
-			Assert.AreEqual( "../../d",
-				PathUtils.RelativePath( "/a/b/c", "/a/d" ) );
-            Assert.AreEqual(string.Empty,
-                PathUtils.RelativePath("/a/b", "/a/b"));
-            Assert.AreEqual(string.Empty,
-                PathUtils.RelativePath("/", "/"));
-            
-            // First filePath consisting just of a root:
-            Assert.AreEqual("folder1/folder2", PathUtils.RelativePath(
-                "/", "/folder1/folder2"));
-            
-            // Trailing directory separator in first filePath shall be ignored:
-            Assert.AreEqual("folder2/folder3", PathUtils.RelativePath(
-                "/folder1/", "/folder1/folder2/folder3"));
-            
-            // Case-sensitive behaviour:
-            Assert.AreEqual("../Folder1/Folder2/folder3",
-                PathUtils.RelativePath("/folder1", "/Folder1/Folder2/folder3"),
-                "folders differing in case");
-        }
-
-		[Test]
-		public void SamePath()
-		{
-			Assert.SamePath( "/folder1/file.tmp", "/folder1/./folder2/../file.tmp" );
-			Assert.NotSamePath( "/folder1/file.tmp", "/folder1/File.TMP" );
-			Assert.NotSamePath( "/folder1/file.tmp", "/folder1/./folder2/../file.temp" );
-
-			Assert.SamePath( "/folder1/folder2", @"\folder1\folder2" );
-		}
-
-		[Test]
-		public void SamePathOrUnder()
-		{
-			Assert.SamePathOrUnder( "/folder1/folder2/folder3", "/folder1/./folder2/junk/../folder3" );
-			Assert.SamePathOrUnder( "/folder1/folder2/", "/folder1/./folder2/junk/../folder3" );
-			Assert.SamePathOrUnder( "/folder1/folder2", "/folder1/./folder2/junk/../folder3" );
-			Assert.NotSamePathOrUnder( "/folder1/folder2", "/folder1/./Folder2/junk/../folder3" );
-			Assert.NotSamePathOrUnder( "/folder1/folder2", "/folder1/./folder22/junk/../folder3" );
-			Assert.SamePathOrUnder( "/", "/" );
-			Assert.SamePathOrUnder( "/", "/bin/debug" );
-		}
-
-		[Test]
-		public void PathFromUri()
-		{
-			Assert.AreEqual( @"/a/b/c/my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file:///a/b/c/my.dll" ) );
-			Assert.AreEqual( @"/a/b/c/my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file://a/b/c/my.dll" ) );
-		}
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class PathUtilTests : PathUtils
+	{
+		[Test]
+		public void CheckDefaults()
+		{
+			Assert.AreEqual( Path.DirectorySeparatorChar, PathUtils.DirectorySeparatorChar );
+			Assert.AreEqual( Path.AltDirectorySeparatorChar, PathUtils.AltDirectorySeparatorChar );
+		}
+	}
+
+	// Local Assert extension
+	internal class Assert : NUnit.Framework.Assert
+	{
+		public static void SamePath( string path1, string path2 )
+		{
+			string msg = "\r\n\texpected: Same path as <{0}>\r\n\t but was: <{1}>";
+			Assert.IsTrue( PathUtils.SamePath( path1, path2 ), msg, path1, path2 );
+		}
+
+		public static void NotSamePath( string path1, string path2 )
+		{
+			string msg = "\r\n\texpected: Not same path as <{0}>\r\n\t but was: <{1}>";
+			Assert.IsFalse( PathUtils.SamePath( path1, path2 ), msg, path1, path2 );
+		}
+
+		public static void SamePathOrUnder( string path1, string path2 )
+		{
+			string msg = "\r\n\texpected: Same path or under <{0}>\r\n\t but was: <{1}>";
+			Assert.IsTrue( PathUtils.SamePathOrUnder( path1, path2 ), msg, path1, path2 );
+		}
+
+		public static void NotSamePathOrUnder( string path1, string path2 )
+		{
+			string msg = "\r\n\texpected: Not same path or under <{0}>\r\n\t but was: <{1}>";
+			Assert.IsFalse( PathUtils.SamePathOrUnder( path1, path2 ), msg, path1, path2 );
+		}
+	}
+
+	[TestFixture]
+	public class PathUtilTests_Windows : PathUtils
+	{
+		[TestFixtureSetUp]
+		public static void SetUpUnixSeparators()
+		{
+			PathUtils.DirectorySeparatorChar = '\\';
+			PathUtils.AltDirectorySeparatorChar = '/';
+		}
+
+		[TestFixtureTearDown]
+		public static void RestoreDefaultSeparators()
+		{
+			PathUtils.DirectorySeparatorChar = System.IO.Path.DirectorySeparatorChar;
+			PathUtils.AltDirectorySeparatorChar = System.IO.Path.AltDirectorySeparatorChar;
+		}
+
+		[Test]
+		public void IsAssemblyFileType()
+		{
+			Assert.IsTrue( PathUtils.IsAssemblyFileType( @"c:\bin\test.dll" ) );
+			Assert.IsTrue( PathUtils.IsAssemblyFileType( @"test.exe" ) );
+			Assert.IsFalse( PathUtils.IsAssemblyFileType( @"c:\bin\test.nunit" ) );
+		}
+
+		[Test]
+		public void Canonicalize()
+		{
+			Assert.AreEqual( @"C:\folder1\file.tmp",
+				PathUtils.Canonicalize( @"C:\folder1\.\folder2\..\file.tmp" ) );
+			Assert.AreEqual( @"folder1\file.tmp",
+				PathUtils.Canonicalize( @"folder1\.\folder2\..\file.tmp" ) );
+			Assert.AreEqual( @"folder1\file.tmp", 
+				PathUtils.Canonicalize( @"folder1\folder2\.\..\file.tmp" ) );
+			Assert.AreEqual( @"file.tmp", 
+				PathUtils.Canonicalize( @"folder1\folder2\..\.\..\file.tmp" ) );
+			Assert.AreEqual( @"file.tmp", 
+				PathUtils.Canonicalize( @"folder1\folder2\..\..\..\file.tmp" ) );
+		}
+
+		[Test]
+		[Platform(Exclude="Linux")]
+		public void RelativePath()
+		{
+			Assert.AreEqual( @"folder2\folder3", PathUtils.RelativePath( 
+				@"c:\folder1", @"c:\folder1\folder2\folder3" ) );
+			Assert.AreEqual( @"..\folder2\folder3", PathUtils.RelativePath(
+				@"c:\folder1", @"c:\folder2\folder3" ) );
+			Assert.AreEqual( @"bin\debug", PathUtils.RelativePath(
+				@"c:\folder1", @"bin\debug" ) );
+			Assert.IsNull( PathUtils.RelativePath( @"C:\folder", @"D:\folder" ),
+				"Unrelated paths should return null" );
+            Assert.IsNull(PathUtils.RelativePath(@"C:\", @"D:\"),
+                "Unrelated roots should return null");
+            Assert.IsNull(PathUtils.RelativePath(@"C:", @"D:"),
+                "Unrelated roots (no trailing separators) should return null");
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath(@"C:\folder1", @"C:\folder1"));
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath(@"C:\", @"C:\"));
+
+            // First filePath consisting just of a root:
+            Assert.AreEqual(@"folder1\folder2", PathUtils.RelativePath(
+                @"C:\", @"C:\folder1\folder2"));
+            
+            // 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 filePath directories in result:
+            Assert.AreEqual(@"Folder2\Folder3", PathUtils.RelativePath(
+                @"C:\folder1", @"c:\folder1\Folder2\Folder3"));
+            Assert.AreEqual(@"..\Folder2\folder3", PathUtils.RelativePath(
+                @"c:\folder1", @"C:\Folder2\folder3"));
+        }
+
+		[Test]
+		public void SamePath()
+		{
+			Assert.SamePath( @"C:\folder1\file.tmp", @"c:\folder1\File.TMP" );
+			Assert.SamePath( @"C:\folder1\file.tmp", @"C:\folder1\.\folder2\..\file.tmp" );
+			Assert.NotSamePath( @"C:\folder1\file.tmp", @"C:\folder1\.\folder2\..\file.temp" );
+
+			Assert.SamePath( "D:/folder1/folder2", @"d:\Folder1\Folder2" );
+		}
+
+		[Test]
+		public void SamePathOrUnder()
+		{
+			Assert.SamePathOrUnder( @"C:\folder1\folder2\folder3", @"c:\folder1\.\folder2\junk\..\folder3" );
+			Assert.SamePathOrUnder( @"C:\folder1\folder2\", @"c:\folder1\.\folder2\junk\..\folder3" );
+			Assert.SamePathOrUnder( @"C:\folder1\folder2", @"c:\folder1\.\folder2\junk\..\folder3" );
+			Assert.SamePathOrUnder( @"C:\folder1\folder2", @"c:\folder1\.\Folder2\junk\..\folder3" );
+			Assert.NotSamePathOrUnder( @"C:\folder1\folder2", @"c:\folder1\.\folder22\junk\..\folder3" );
+			Assert.NotSamePathOrUnder( @"C:\folder1\folder2ile.tmp", @"D:\folder1\.\folder2\folder3\file.tmp" );
+			Assert.NotSamePathOrUnder( @"C:\", @"D:\" );
+			Assert.SamePathOrUnder( @"C:\", @"c:\" );
+			Assert.SamePathOrUnder( @"C:\", @"c:\bin\debug" );
+
+		}
+
+		[Test]
+		public void PathFromUri()
+		{
+			Assert.AreEqual( @"C:\a\b\c\my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file:///C:\a\b\c\my.dll" ) );
+			Assert.AreEqual( @"C:\a\b\c\my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file://C:\a\b\c\my.dll" ) );
+		}
+	}
+
+	[TestFixture]
+	public class PathUtilTests_Unix : PathUtils
+	{
+		[TestFixtureSetUp]
+		public static void SetUpUnixSeparators()
+		{
+			PathUtils.DirectorySeparatorChar = '/';
+			PathUtils.AltDirectorySeparatorChar = '\\';
+		}
+
+		[TestFixtureTearDown]
+		public static void RestoreDefaultSeparators()
+		{
+			PathUtils.DirectorySeparatorChar = System.IO.Path.DirectorySeparatorChar;
+			PathUtils.AltDirectorySeparatorChar = System.IO.Path.AltDirectorySeparatorChar;
+		}
+
+		[Test]
+		public void IsAssemblyFileType()
+		{
+			Assert.IsTrue( PathUtils.IsAssemblyFileType( "/bin/test.dll" ) );
+			Assert.IsTrue( PathUtils.IsAssemblyFileType( "test.exe" ) );
+			Assert.IsFalse( PathUtils.IsAssemblyFileType( "/bin/test.nunit" ) );
+		}
+
+		[Test]
+		public void Canonicalize()
+		{
+			Assert.AreEqual( "/folder1/file.tmp",
+				PathUtils.Canonicalize( "/folder1/./folder2/../file.tmp" ) );
+			Assert.AreEqual( "folder1/file.tmp",
+				PathUtils.Canonicalize( "folder1/./folder2/../file.tmp" ) );
+			Assert.AreEqual( "folder1/file.tmp", 
+				PathUtils.Canonicalize( "folder1/folder2/./../file.tmp" ) );
+			Assert.AreEqual( "file.tmp", 
+				PathUtils.Canonicalize( "folder1/folder2/.././../file.tmp" ) );
+			Assert.AreEqual( "file.tmp", 
+				PathUtils.Canonicalize( "folder1/folder2/../../../file.tmp" ) );
+		}
+
+		[Test]
+		public void RelativePath()
+		{
+			Assert.AreEqual( "folder2/folder3", 
+				PathUtils.RelativePath(	"/folder1", "/folder1/folder2/folder3" ) );
+			Assert.AreEqual( "../folder2/folder3", 
+				PathUtils.RelativePath( "/folder1", "/folder2/folder3" ) );
+			Assert.AreEqual( "bin/debug", 
+				PathUtils.RelativePath( "/folder1", "bin/debug" ) );
+			Assert.AreEqual( "../other/folder", 
+				PathUtils.RelativePath( "/folder", "/other/folder" ) );
+			Assert.AreEqual( "../../d",
+				PathUtils.RelativePath( "/a/b/c", "/a/d" ) );
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath("/a/b", "/a/b"));
+            Assert.AreEqual(string.Empty,
+                PathUtils.RelativePath("/", "/"));
+            
+            // First filePath consisting just of a root:
+            Assert.AreEqual("folder1/folder2", PathUtils.RelativePath(
+                "/", "/folder1/folder2"));
+            
+            // Trailing directory separator in first filePath shall be ignored:
+            Assert.AreEqual("folder2/folder3", PathUtils.RelativePath(
+                "/folder1/", "/folder1/folder2/folder3"));
+            
+            // Case-sensitive behaviour:
+            Assert.AreEqual("../Folder1/Folder2/folder3",
+                PathUtils.RelativePath("/folder1", "/Folder1/Folder2/folder3"),
+                "folders differing in case");
+        }
+
+		[Test]
+		public void SamePath()
+		{
+			Assert.SamePath( "/folder1/file.tmp", "/folder1/./folder2/../file.tmp" );
+			Assert.NotSamePath( "/folder1/file.tmp", "/folder1/File.TMP" );
+			Assert.NotSamePath( "/folder1/file.tmp", "/folder1/./folder2/../file.temp" );
+
+			Assert.SamePath( "/folder1/folder2", @"\folder1\folder2" );
+		}
+
+		[Test]
+		public void SamePathOrUnder()
+		{
+			Assert.SamePathOrUnder( "/folder1/folder2/folder3", "/folder1/./folder2/junk/../folder3" );
+			Assert.SamePathOrUnder( "/folder1/folder2/", "/folder1/./folder2/junk/../folder3" );
+			Assert.SamePathOrUnder( "/folder1/folder2", "/folder1/./folder2/junk/../folder3" );
+			Assert.NotSamePathOrUnder( "/folder1/folder2", "/folder1/./Folder2/junk/../folder3" );
+			Assert.NotSamePathOrUnder( "/folder1/folder2", "/folder1/./folder22/junk/../folder3" );
+			Assert.SamePathOrUnder( "/", "/" );
+			Assert.SamePathOrUnder( "/", "/bin/debug" );
+		}
+
+		[Test]
+		public void PathFromUri()
+		{
+			Assert.AreEqual( @"/a/b/c/my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file:///a/b/c/my.dll" ) );
+			Assert.AreEqual( @"/a/b/c/my.dll", PathUtils.GetAssemblyPathFromFileUri( @"file://a/b/c/my.dll" ) );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/ProcessRunnerTests.cs b/src/ClientUtilities/tests/ProcessRunnerTests.cs
index a5dd37b..5894387 100644
--- a/src/ClientUtilities/tests/ProcessRunnerTests.cs
+++ b/src/ClientUtilities/tests/ProcessRunnerTests.cs
@@ -1,52 +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.Diagnostics;
-using System.IO;
-using NUnit.Core;
-using NUnit.Core.Tests;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for ProcessRunnerTests.
-	/// </summary>
-    [TestFixture, Timeout(30000)]
-    [Platform(Exclude = "Mono", Reason = "Process Start not working correctly")]
-    public class ProcessRunnerTests : BasicRunnerTests
-    {
-        private ProcessRunner myRunner;
-
-        protected override TestRunner CreateRunner(int runnerID)
-        {
-            myRunner = new ProcessRunner(runnerID);
-            return myRunner;
-        }
-
-        protected override void DestroyRunner()
-        {
-            if (myRunner != null)
-            {
-                myRunner.Unload();
-                myRunner.Dispose();
-            }
-        }
-
-        [Test]
-        public void  TestProcessIsReused()
-        {
-            TestPackage package = new TestPackage(MockAssembly.AssemblyPath);
-            myRunner.Load(package);
-            int processId = ((TestAssemblyInfo)myRunner.AssemblyInfo[0]).ProcessId;
-            Assert.AreNotEqual(Process.GetCurrentProcess().Id, processId, "Not in separate process");
-            myRunner.Unload();
-            myRunner.Load(package);
-            Assert.AreEqual(processId, ((TestAssemblyInfo)myRunner.AssemblyInfo[0]).ProcessId, "Reloaded in different process");
-        }
-    }
-}
+// ****************************************************************
+// Copyright 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.Diagnostics;
+using System.IO;
+using NUnit.Core;
+using NUnit.Core.Tests;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for ProcessRunnerTests.
+	/// </summary>
+    [TestFixture, Timeout(30000)]
+    [Platform(Exclude = "Mono", Reason = "Process Start not working correctly")]
+    public class ProcessRunnerTests : BasicRunnerTests
+    {
+        private ProcessRunner myRunner;
+
+        protected override TestRunner CreateRunner(int runnerID)
+        {
+            myRunner = new ProcessRunner(runnerID);
+            return myRunner;
+        }
+
+        protected override void DestroyRunner()
+        {
+            if (myRunner != null)
+            {
+                myRunner.Unload();
+                myRunner.Dispose();
+            }
+        }
+
+        [Test]
+        public void  TestProcessIsReused()
+        {
+            TestPackage package = new TestPackage(MockAssembly.AssemblyPath);
+            myRunner.Load(package);
+            int processId = ((TestAssemblyInfo)myRunner.AssemblyInfo[0]).ProcessId;
+            Assert.AreNotEqual(Process.GetCurrentProcess().Id, processId, "Not in separate process");
+            myRunner.Unload();
+            myRunner.Load(package);
+            Assert.AreEqual(processId, ((TestAssemblyInfo)myRunner.AssemblyInfo[0]).ProcessId, "Reloaded in different process");
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/ProjectConfigTests.cs b/src/ClientUtilities/tests/ProjectConfigTests.cs
index 737cc59..252ea55 100644
--- a/src/ClientUtilities/tests/ProjectConfigTests.cs
+++ b/src/ClientUtilities/tests/ProjectConfigTests.cs
@@ -1,393 +1,393 @@
-// ****************************************************************
-// 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.Collections;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for ProjectConfigTests.
-	/// </summary>
-	[TestFixture]
-	public class ProjectConfigTests
-	{
-		private ProjectConfig activeConfig;
-        private ProjectConfig inactiveConfig;
-		private NUnitProject project;
-
-		[SetUp]
-		public void SetUp()
-		{
-			activeConfig = new ProjectConfig( "Debug" );
-            inactiveConfig = new ProjectConfig("Release");
-			project = new NUnitProject( TestPath( "/test/myproject.nunit" ) );
-			project.Configs.Add( activeConfig );
-            project.Configs.Add(inactiveConfig);
-            project.IsDirty = false;
-            project.HasChangesRequiringReload = false;
-		}
-
-        /// <summary>
-        /// 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
-        /// filePath starts with a slash, add C: in front of it.
-        /// </summary>
-        private string TestPath(string path)
-        {
-            if (Path.DirectorySeparatorChar != '/')
-            {
-                path = path.Replace('/', Path.DirectorySeparatorChar);
-                if (path[0] == Path.DirectorySeparatorChar)
-                    path = "C:" + path;
-            }
-
-            return path;
-        }
-
-		[Test]
-		public void EmptyConfig()
-		{
-			Assert.AreEqual( "Debug", activeConfig.Name );
-			Assert.AreEqual( 0, activeConfig.Assemblies.Count );
-		}
-
-		[Test]
-		public void CanAddAssemblies()
-		{
-            string path1 = TestPath("/test/assembly1.dll");
-            string path2 = TestPath("/test/assembly2.dll");
-            activeConfig.Assemblies.Add(path1);
-			activeConfig.Assemblies.Add( path2 );
-			Assert.AreEqual( 2, activeConfig.Assemblies.Count );
-			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
-			Assert.AreEqual( path2, activeConfig.Assemblies[1] );
-		}
-
-		[Test]
-		public void ToArray()
-		{
-            string path1 = TestPath("/test/assembly1.dll");
-            string path2 = TestPath("/test/assembly2.dll");
-            activeConfig.Assemblies.Add( path1 );
-			activeConfig.Assemblies.Add( path2 );
-
-			string[] files = activeConfig.Assemblies.ToArray();
-			Assert.AreEqual( path1, files[0] );
-			Assert.AreEqual( path2, files[1] );
-		}
-
-        [Test]
-        public void AddToActiveConfigMarksProjectDirty()
-        {
-            activeConfig.Assemblies.Add(TestPath("/test/bin/debug/assembly1.dll"));
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void AddToActiveConfigRequiresReload()
-        {
-            activeConfig.Assemblies.Add(TestPath("/test/bin/debug/assembly1.dll"));
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void AddToInactiveConfigMarksProjectDirty()
-        {
-            inactiveConfig.Assemblies.Add(TestPath("/test/bin/release/assembly1.dll"));
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void AddToInactiveConfigDoesNotRequireReload()
-        {
-            inactiveConfig.Assemblies.Add(TestPath("/test/bin/release/assembly1.dll"));
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void AddingConfigMarksProjectDirty()
-        {
-            project.Configs.Add("New");
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void AddingInitialConfigRequiresReload()
-        {
-            NUnitProject newProj = new NUnitProject("/junk");
-            newProj.HasChangesRequiringReload = false;
-            newProj.Configs.Add("New");
-            Assert.That(newProj.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void AddingSubsequentConfigDoesNotRequireReload()
-        {
-            project.Configs.Add("New");
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void RenameActiveConfigMarksProjectDirty()
-        {
-            activeConfig.Name = "Renamed";
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void RenameActiveConfigRequiresReload()
-        {
-            activeConfig.Name = "Renamed";
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void RenameInctiveConfigMarksProjectDirty()
-        {
-            inactiveConfig.Name = "Renamed";
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void RenameInactiveConfigDoesNotRequireReload()
-        {
-            inactiveConfig.Name = "Renamed";
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void RemoveActiveConfigMarksProjectDirty()
-        {
-            string path1 = TestPath("/test/bin/debug/assembly1.dll");
-            activeConfig.Assemblies.Add(path1);
-            project.IsDirty = false;
-            activeConfig.Assemblies.Remove(path1);
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void RemoveActiveConfigRequiresReload()
-        {
-            string path1 = TestPath("/test/bin/debug/assembly1.dll");
-            activeConfig.Assemblies.Add(path1);
-            project.IsDirty = false;
-            activeConfig.Assemblies.Remove(path1);
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void RemoveInactiveConfigMarksProjectDirty()
-        {
-            string path1 = TestPath("/test/bin/debug/assembly1.dll");
-            inactiveConfig.Assemblies.Add(path1);
-            project.IsDirty = false;
-            inactiveConfig.Assemblies.Remove(path1);
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void RemoveInactiveConfigDoesNotRequireReload()
-        {
-            string path1 = TestPath("/test/bin/debug/assembly1.dll");
-            inactiveConfig.Assemblies.Add(path1);
-            project.HasChangesRequiringReload = false;
-            inactiveConfig.Assemblies.Remove(path1);
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void SettingActiveConfigApplicationBaseMarksProjectDirty()
-        {
-            activeConfig.BasePath = TestPath("/junk");
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingActiveConfigApplicationBaseRequiresReload()
-        {
-            activeConfig.BasePath = TestPath("/junk");
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void SettingInactiveConfigApplicationBaseMarksProjectDirty()
-        {
-            inactiveConfig.BasePath = TestPath("/junk");
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingInactiveConfigApplicationBaseDoesNotRequireReload()
-        {
-            inactiveConfig.BasePath = TestPath("/junk");
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-		public void AbsoluteBasePath()
-		{
-            activeConfig.BasePath = TestPath("/junk");
-            string path1 = TestPath( "/junk/bin/debug/assembly1.dll" );
-			activeConfig.Assemblies.Add( path1 );
-			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
-		}
-
-		[Test]
-		public void RelativeBasePath()
-		{
-			activeConfig.BasePath = @"junk";
-            string path1 = TestPath("/test/junk/bin/debug/assembly1.dll");
-            activeConfig.Assemblies.Add( path1 );
-			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
-		}
-
-		[Test]
-		public void NoBasePathSet()
-		{
-            string path1 = TestPath( "/test/bin/debug/assembly1.dll" );
-			activeConfig.Assemblies.Add( path1 );
-			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
-		}
-
-        [Test]
-        public void SettingActiveConfigConfigurationFileMarksProjectDirty()
-        {
-            activeConfig.ConfigurationFile = "MyProject.config";
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingActiveConfigConfigurationFileRequiresReload()
-        {
-            activeConfig.ConfigurationFile = "MyProject.config";
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void SettingInactiveConfigConfigurationFileMarksProjectDirty()
-        {
-            inactiveConfig.ConfigurationFile = "MyProject.config";
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingInactiveConfigConfigurationFileDoesNotRequireReload()
-        {
-            inactiveConfig.ConfigurationFile = "MyProject.config";
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-		public void DefaultConfigurationFile()
-		{
-			Assert.AreEqual( "myproject.config", activeConfig.ConfigurationFile );
-			Assert.AreEqual( TestPath( "/test/myproject.config" ), activeConfig.ConfigurationFilePath );
-		}
-
-		[Test]
-		public void AbsoluteConfigurationFile()
-		{
-            string path1 = TestPath("/configs/myconfig.config");
-			activeConfig.ConfigurationFile = path1;
-			Assert.AreEqual( path1, activeConfig.ConfigurationFilePath );
-		}
-
-		[Test]
-		public void RelativeConfigurationFile()
-		{
-			activeConfig.ConfigurationFile = "myconfig.config";
-			Assert.AreEqual( TestPath( "/test/myconfig.config" ), activeConfig.ConfigurationFilePath );
-		}
-
-        [Test]
-        public void SettingActiveConfigPrivateBinPathMarksProjectDirty()
-        {
-            activeConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingActiveConfigPrivateBinPathRequiresReload()
-        {
-            activeConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void SettingInactiveConfigPrivateBinPathMarksProjectDirty()
-        {
-            inactiveConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingInactiveConfigPrivateBinPathDoesNotRequireReload()
-        {
-            inactiveConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void SettingActiveConfigBinPathTypeMarksProjectDirty()
-        {
-            activeConfig.BinPathType = BinPathType.Manual;
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingActiveConfigBinPathTypeRequiresReload()
-        {
-            activeConfig.BinPathType = BinPathType.Manual;
-            Assert.IsTrue(project.HasChangesRequiringReload);
-        }
-
-        [Test]
-        public void SettingInactiveConfigBinPathTypeMarksProjectDirty()
-        {
-            inactiveConfig.BinPathType = BinPathType.Manual;
-            Assert.IsTrue(project.IsDirty);
-        }
-
-        [Test]
-        public void SettingInactiveConfigBinPathTypeDoesNotRequireReload()
-        {
-            inactiveConfig.BinPathType = BinPathType.Manual;
-            Assert.IsFalse(project.HasChangesRequiringReload);
-        }
-
-		[Test]
-		public void NoPrivateBinPath()
-		{
-			activeConfig.Assemblies.Add( TestPath( "/bin/assembly1.dll" ) );
-			activeConfig.Assemblies.Add( TestPath( "/bin/assembly2.dll" ) );
-			activeConfig.BinPathType = BinPathType.None;
-			Assert.IsNull( activeConfig.PrivateBinPath );
-		}
-
-		[Test]
-		public void ManualPrivateBinPath()
-		{
-			activeConfig.Assemblies.Add( TestPath( "/test/bin/assembly1.dll" ) );
-			activeConfig.Assemblies.Add( TestPath( "/test/bin/assembly2.dll" ) );
-			activeConfig.BinPathType = BinPathType.Manual;
-			activeConfig.PrivateBinPath = TestPath( "/test" );
-			Assert.AreEqual( TestPath( "/test" ), activeConfig.PrivateBinPath );
-		}
-
-// TODO: Move to DomainManagerTests
-//		[Test]
-//		public void AutoPrivateBinPath()
-//		{
-//			config.Assemblies.Add( TestPath( "/test/bin/assembly1.dll" ) );
-//			config.Assemblies.Add( TestPath( "/test/bin/assembly2.dll" ) );
-//			config.BinPathType = BinPathType.Auto;
-//			Assert.AreEqual( "bin", config.PrivateBinPath );
-//		}
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for ProjectConfigTests.
+	/// </summary>
+	[TestFixture]
+	public class ProjectConfigTests
+	{
+		private ProjectConfig activeConfig;
+        private ProjectConfig inactiveConfig;
+		private NUnitProject project;
+
+		[SetUp]
+		public void SetUp()
+		{
+			activeConfig = new ProjectConfig( "Debug" );
+            inactiveConfig = new ProjectConfig("Release");
+			project = new NUnitProject( TestPath( "/test/myproject.nunit" ) );
+			project.Configs.Add( activeConfig );
+            project.Configs.Add(inactiveConfig);
+            project.IsDirty = false;
+            project.HasChangesRequiringReload = false;
+		}
+
+        /// <summary>
+        /// 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
+        /// filePath starts with a slash, add C: in front of it.
+        /// </summary>
+        private string TestPath(string path)
+        {
+            if (Path.DirectorySeparatorChar != '/')
+            {
+                path = path.Replace('/', Path.DirectorySeparatorChar);
+                if (path[0] == Path.DirectorySeparatorChar)
+                    path = "C:" + path;
+            }
+
+            return path;
+        }
+
+		[Test]
+		public void EmptyConfig()
+		{
+			Assert.AreEqual( "Debug", activeConfig.Name );
+			Assert.AreEqual( 0, activeConfig.Assemblies.Count );
+		}
+
+		[Test]
+		public void CanAddAssemblies()
+		{
+            string path1 = TestPath("/test/assembly1.dll");
+            string path2 = TestPath("/test/assembly2.dll");
+            activeConfig.Assemblies.Add(path1);
+			activeConfig.Assemblies.Add( path2 );
+			Assert.AreEqual( 2, activeConfig.Assemblies.Count );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
+			Assert.AreEqual( path2, activeConfig.Assemblies[1] );
+		}
+
+		[Test]
+		public void ToArray()
+		{
+            string path1 = TestPath("/test/assembly1.dll");
+            string path2 = TestPath("/test/assembly2.dll");
+            activeConfig.Assemblies.Add( path1 );
+			activeConfig.Assemblies.Add( path2 );
+
+			string[] files = activeConfig.Assemblies.ToArray();
+			Assert.AreEqual( path1, files[0] );
+			Assert.AreEqual( path2, files[1] );
+		}
+
+        [Test]
+        public void AddToActiveConfigMarksProjectDirty()
+        {
+            activeConfig.Assemblies.Add(TestPath("/test/bin/debug/assembly1.dll"));
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void AddToActiveConfigRequiresReload()
+        {
+            activeConfig.Assemblies.Add(TestPath("/test/bin/debug/assembly1.dll"));
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void AddToInactiveConfigMarksProjectDirty()
+        {
+            inactiveConfig.Assemblies.Add(TestPath("/test/bin/release/assembly1.dll"));
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void AddToInactiveConfigDoesNotRequireReload()
+        {
+            inactiveConfig.Assemblies.Add(TestPath("/test/bin/release/assembly1.dll"));
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void AddingConfigMarksProjectDirty()
+        {
+            project.Configs.Add("New");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void AddingInitialConfigRequiresReload()
+        {
+            NUnitProject newProj = new NUnitProject("/junk");
+            newProj.HasChangesRequiringReload = false;
+            newProj.Configs.Add("New");
+            Assert.That(newProj.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void AddingSubsequentConfigDoesNotRequireReload()
+        {
+            project.Configs.Add("New");
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RenameActiveConfigMarksProjectDirty()
+        {
+            activeConfig.Name = "Renamed";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RenameActiveConfigRequiresReload()
+        {
+            activeConfig.Name = "Renamed";
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RenameInctiveConfigMarksProjectDirty()
+        {
+            inactiveConfig.Name = "Renamed";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RenameInactiveConfigDoesNotRequireReload()
+        {
+            inactiveConfig.Name = "Renamed";
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RemoveActiveConfigMarksProjectDirty()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            activeConfig.Assemblies.Add(path1);
+            project.IsDirty = false;
+            activeConfig.Assemblies.Remove(path1);
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RemoveActiveConfigRequiresReload()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            activeConfig.Assemblies.Add(path1);
+            project.IsDirty = false;
+            activeConfig.Assemblies.Remove(path1);
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void RemoveInactiveConfigMarksProjectDirty()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            inactiveConfig.Assemblies.Add(path1);
+            project.IsDirty = false;
+            inactiveConfig.Assemblies.Remove(path1);
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void RemoveInactiveConfigDoesNotRequireReload()
+        {
+            string path1 = TestPath("/test/bin/debug/assembly1.dll");
+            inactiveConfig.Assemblies.Add(path1);
+            project.HasChangesRequiringReload = false;
+            inactiveConfig.Assemblies.Remove(path1);
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingActiveConfigApplicationBaseMarksProjectDirty()
+        {
+            activeConfig.BasePath = TestPath("/junk");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingActiveConfigApplicationBaseRequiresReload()
+        {
+            activeConfig.BasePath = TestPath("/junk");
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigApplicationBaseMarksProjectDirty()
+        {
+            inactiveConfig.BasePath = TestPath("/junk");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigApplicationBaseDoesNotRequireReload()
+        {
+            inactiveConfig.BasePath = TestPath("/junk");
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+		public void AbsoluteBasePath()
+		{
+            activeConfig.BasePath = TestPath("/junk");
+            string path1 = TestPath( "/junk/bin/debug/assembly1.dll" );
+			activeConfig.Assemblies.Add( path1 );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
+		}
+
+		[Test]
+		public void RelativeBasePath()
+		{
+			activeConfig.BasePath = @"junk";
+            string path1 = TestPath("/test/junk/bin/debug/assembly1.dll");
+            activeConfig.Assemblies.Add( path1 );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
+		}
+
+		[Test]
+		public void NoBasePathSet()
+		{
+            string path1 = TestPath( "/test/bin/debug/assembly1.dll" );
+			activeConfig.Assemblies.Add( path1 );
+			Assert.AreEqual( path1, activeConfig.Assemblies[0] );
+		}
+
+        [Test]
+        public void SettingActiveConfigConfigurationFileMarksProjectDirty()
+        {
+            activeConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingActiveConfigConfigurationFileRequiresReload()
+        {
+            activeConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigConfigurationFileMarksProjectDirty()
+        {
+            inactiveConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigConfigurationFileDoesNotRequireReload()
+        {
+            inactiveConfig.ConfigurationFile = "MyProject.config";
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+		public void DefaultConfigurationFile()
+		{
+			Assert.AreEqual( "myproject.config", activeConfig.ConfigurationFile );
+			Assert.AreEqual( TestPath( "/test/myproject.config" ), activeConfig.ConfigurationFilePath );
+		}
+
+		[Test]
+		public void AbsoluteConfigurationFile()
+		{
+            string path1 = TestPath("/configs/myconfig.config");
+			activeConfig.ConfigurationFile = path1;
+			Assert.AreEqual( path1, activeConfig.ConfigurationFilePath );
+		}
+
+		[Test]
+		public void RelativeConfigurationFile()
+		{
+			activeConfig.ConfigurationFile = "myconfig.config";
+			Assert.AreEqual( TestPath( "/test/myconfig.config" ), activeConfig.ConfigurationFilePath );
+		}
+
+        [Test]
+        public void SettingActiveConfigPrivateBinPathMarksProjectDirty()
+        {
+            activeConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingActiveConfigPrivateBinPathRequiresReload()
+        {
+            activeConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigPrivateBinPathMarksProjectDirty()
+        {
+            inactiveConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigPrivateBinPathDoesNotRequireReload()
+        {
+            inactiveConfig.PrivateBinPath = TestPath("/junk") + Path.PathSeparator + TestPath("/bin");
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingActiveConfigBinPathTypeMarksProjectDirty()
+        {
+            activeConfig.BinPathType = BinPathType.Manual;
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingActiveConfigBinPathTypeRequiresReload()
+        {
+            activeConfig.BinPathType = BinPathType.Manual;
+            Assert.IsTrue(project.HasChangesRequiringReload);
+        }
+
+        [Test]
+        public void SettingInactiveConfigBinPathTypeMarksProjectDirty()
+        {
+            inactiveConfig.BinPathType = BinPathType.Manual;
+            Assert.IsTrue(project.IsDirty);
+        }
+
+        [Test]
+        public void SettingInactiveConfigBinPathTypeDoesNotRequireReload()
+        {
+            inactiveConfig.BinPathType = BinPathType.Manual;
+            Assert.IsFalse(project.HasChangesRequiringReload);
+        }
+
+		[Test]
+		public void NoPrivateBinPath()
+		{
+			activeConfig.Assemblies.Add( TestPath( "/bin/assembly1.dll" ) );
+			activeConfig.Assemblies.Add( TestPath( "/bin/assembly2.dll" ) );
+			activeConfig.BinPathType = BinPathType.None;
+			Assert.IsNull( activeConfig.PrivateBinPath );
+		}
+
+		[Test]
+		public void ManualPrivateBinPath()
+		{
+			activeConfig.Assemblies.Add( TestPath( "/test/bin/assembly1.dll" ) );
+			activeConfig.Assemblies.Add( TestPath( "/test/bin/assembly2.dll" ) );
+			activeConfig.BinPathType = BinPathType.Manual;
+			activeConfig.PrivateBinPath = TestPath( "/test" );
+			Assert.AreEqual( TestPath( "/test" ), activeConfig.PrivateBinPath );
+		}
+
+// TODO: Move to DomainManagerTests
+//		[Test]
+//		public void AutoPrivateBinPath()
+//		{
+//			config.Assemblies.Add( TestPath( "/test/bin/assembly1.dll" ) );
+//			config.Assemblies.Add( TestPath( "/test/bin/assembly2.dll" ) );
+//			config.BinPathType = BinPathType.Auto;
+//			Assert.AreEqual( "bin", config.PrivateBinPath );
+//		}
+	}
+}
diff --git a/src/ClientUtilities/tests/RecentFileEntryTests.cs b/src/ClientUtilities/tests/RecentFileEntryTests.cs
index 78706cf..fc3d808 100644
--- a/src/ClientUtilities/tests/RecentFileEntryTests.cs
+++ b/src/ClientUtilities/tests/RecentFileEntryTests.cs
@@ -1,82 +1,82 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Text;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-    [TestFixture]
-    public class RecentFileEntryTests
-    {
-        private RecentFileEntry entry;
-        private static readonly string entryPath = "a/b/c";
-		private static readonly string entryPathWithComma = @"D:\test\test, and further research\program1\program1.exe";
-		private static Version entryVersion = new Version("1.2");
-		private static Version currentVersion = Environment.Version;
-
-		[Test]
-		public void CanCreateFromSimpleFileName()
-		{
-			entry = new RecentFileEntry( entryPath );
-			Assert.AreEqual( entryPath, entry.Path );
-			Assert.AreEqual( currentVersion, entry.CLRVersion );
-		}
-
-		[Test]
-		public void CanCreateFromFileNameAndVersion()
-		{
-			entry = new RecentFileEntry( entryPath, entryVersion );
-			Assert.AreEqual( entryPath, entry.Path );
-			Assert.AreEqual( entryVersion, entry.CLRVersion );
-		}
-
-        [Test]
-        public void EntryCanDisplayItself()
-        {
-			entry = new RecentFileEntry( entryPath, entryVersion );
-			Assert.AreEqual(
-                entryPath + RecentFileEntry.Separator + entryVersion.ToString(),
-                entry.ToString());
-        }
-
-		[Test]
-		public void CanParseSimpleFileName()
-		{
-			entry = RecentFileEntry.Parse(entryPath);
-			Assert.AreEqual(entryPath, entry.Path);
-			Assert.AreEqual(currentVersion, entry.CLRVersion);
-		}
-
-		[Test]
-		public void CanParseSimpleFileNameWithComma()
-		{
-			entry = RecentFileEntry.Parse(entryPathWithComma);
-			Assert.AreEqual(entryPathWithComma, entry.Path);
-			Assert.AreEqual(currentVersion, entry.CLRVersion);
-		}
-
-		[Test]
-		public void CanParseFileNamePlusVersionString()
-		{
-			string text = entryPath + RecentFileEntry.Separator + entryVersion.ToString();
-			entry = RecentFileEntry.Parse(text);
-			Assert.AreEqual(entryPath, entry.Path);
-			Assert.AreEqual(entryVersion, entry.CLRVersion);
-		}
-
-		[Test]
-		public void CanParseFileNameWithCommaPlusVersionString()
-		{
-			string text = entryPathWithComma + RecentFileEntry.Separator + entryVersion.ToString();
-			entry = RecentFileEntry.Parse(text);
-			Assert.AreEqual(entryPathWithComma, entry.Path);
-			Assert.AreEqual(entryVersion, entry.CLRVersion);
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Text;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class RecentFileEntryTests
+    {
+        private RecentFileEntry entry;
+        private static readonly string entryPath = "a/b/c";
+		private static readonly string entryPathWithComma = @"D:\test\test, and further research\program1\program1.exe";
+		private static Version entryVersion = new Version("1.2");
+		private static Version currentVersion = Environment.Version;
+
+		[Test]
+		public void CanCreateFromSimpleFileName()
+		{
+			entry = new RecentFileEntry( entryPath );
+			Assert.AreEqual( entryPath, entry.Path );
+			Assert.AreEqual( currentVersion, entry.CLRVersion );
+		}
+
+		[Test]
+		public void CanCreateFromFileNameAndVersion()
+		{
+			entry = new RecentFileEntry( entryPath, entryVersion );
+			Assert.AreEqual( entryPath, entry.Path );
+			Assert.AreEqual( entryVersion, entry.CLRVersion );
+		}
+
+        [Test]
+        public void EntryCanDisplayItself()
+        {
+			entry = new RecentFileEntry( entryPath, entryVersion );
+			Assert.AreEqual(
+                entryPath + RecentFileEntry.Separator + entryVersion.ToString(),
+                entry.ToString());
+        }
+
+		[Test]
+		public void CanParseSimpleFileName()
+		{
+			entry = RecentFileEntry.Parse(entryPath);
+			Assert.AreEqual(entryPath, entry.Path);
+			Assert.AreEqual(currentVersion, entry.CLRVersion);
+		}
+
+		[Test]
+		public void CanParseSimpleFileNameWithComma()
+		{
+			entry = RecentFileEntry.Parse(entryPathWithComma);
+			Assert.AreEqual(entryPathWithComma, entry.Path);
+			Assert.AreEqual(currentVersion, entry.CLRVersion);
+		}
+
+		[Test]
+		public void CanParseFileNamePlusVersionString()
+		{
+			string text = entryPath + RecentFileEntry.Separator + entryVersion.ToString();
+			entry = RecentFileEntry.Parse(text);
+			Assert.AreEqual(entryPath, entry.Path);
+			Assert.AreEqual(entryVersion, entry.CLRVersion);
+		}
+
+		[Test]
+		public void CanParseFileNameWithCommaPlusVersionString()
+		{
+			string text = entryPathWithComma + RecentFileEntry.Separator + entryVersion.ToString();
+			entry = RecentFileEntry.Parse(text);
+			Assert.AreEqual(entryPathWithComma, entry.Path);
+			Assert.AreEqual(entryVersion, entry.CLRVersion);
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/RecentFilesTests.cs b/src/ClientUtilities/tests/RecentFilesTests.cs
index ccdc275..7b1760a 100644
--- a/src/ClientUtilities/tests/RecentFilesTests.cs
+++ b/src/ClientUtilities/tests/RecentFilesTests.cs
@@ -1,244 +1,244 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Util.Tests
-{
-	using System;
-	using System.Collections;
-	using Microsoft.Win32;
-
-	using NUnit.Framework;
-	
-	/// <summary>
-	/// This fixture is used to test both RecentProjects and
-	/// its base class RecentFiles.  If we add any other derived
-	/// classes, the tests should be refactored.
-	/// </summary>
-	[TestFixture]
-	public class RecentFilesTests
-	{
-		static readonly int MAX = RecentFilesService.MaxSize;
-		static readonly int MIN = RecentFilesService.MinSize;
-
-		RecentFilesService recentFiles;
-
-		[SetUp]
-		public void SetUp()
-		{
-			recentFiles = new RecentFilesService( new SettingsGroup( new MemorySettingsStorage() ) );
-		}
-
-		#region Helper Methods
-		// Set RecentFiles to a list of known values up
-		// to a maximum. Most recent will be "1", next 
-		// "2", and so on...
-		private void SetMockValues( int count )
-		{
-			for( int num = count; num > 0; --num )
-				recentFiles.SetMostRecent( num.ToString() );			
-		}
-
-		// Check that the list is set right: 1, 2, ...
-		private void CheckMockValues( int count )
-		{
-			RecentFilesCollection files = recentFiles.Entries;
-			Assert.AreEqual( count, files.Count, "Count" );
-			
-			for( int index = 0; index < count; index++ )
-				Assert.AreEqual( (index + 1).ToString(), files[index].Path, "Item" ); 
-		}
-
-		// Check that we can add count items correctly
-		private void CheckAddItems( int count )
-		{
-			SetMockValues( count );
-			Assert.AreEqual( "1", recentFiles.Entries[0].Path, "RecentFile" );
-
-			CheckMockValues( Math.Min( count, recentFiles.MaxFiles ) );
-		}
-
-		// Check that the list contains a set of entries
-		// in the order given and nothing else.
-		private void CheckListContains( params int[] item )
-		{
-			RecentFilesCollection files = recentFiles.Entries;
-			Assert.AreEqual( item.Length, files.Count, "Count" );
-
-			for( int index = 0; index < files.Count; index++ )
-				Assert.AreEqual( item[index].ToString(), files[index].Path, "Item" );
-		}
-		#endregion
-
-		[Test]
-		public void CountDefault()
-		{
-			Assert.AreEqual( RecentFilesService.DefaultSize, recentFiles.MaxFiles );
-		}
-
-		[Test]
-		public void CountOverMax()
-		{
-			recentFiles.MaxFiles = MAX + 1;
-			Assert.AreEqual( MAX, recentFiles.MaxFiles );
-		}
-
-		[Test]
-		public void CountUnderMin()
-		{
-			recentFiles.MaxFiles = MIN - 1;
-			Assert.AreEqual( MIN, recentFiles.MaxFiles );
-		}
-
-		[Test]
-		public void CountAtMax()
-		{
-			recentFiles.MaxFiles = MAX;
-			Assert.AreEqual( MAX, recentFiles.MaxFiles );
-		}
-
-		[Test]
-		public void CountAtMin()
-		{
-			recentFiles.MaxFiles = MIN;
-			Assert.AreEqual( MIN, recentFiles.MaxFiles );
-		}
-
-		[Test]
-		public void EmptyList()
-		{
-			Assert.IsNotNull(  recentFiles.Entries, "Entries should never be null" );
-			Assert.AreEqual( 0, recentFiles.Count );
-			Assert.AreEqual( 0, recentFiles.Entries.Count );
-		}
-
-		[Test]
-		public void AddSingleItem()
-		{
-			CheckAddItems( 1 );
-		}
-
-		[Test]
-		public void AddMaxItems()
-		{
-			CheckAddItems( 5 );
-		}
-
-		[Test]
-		public void AddTooManyItems()
-		{
-			CheckAddItems( 10 );
-		}
-
-		[Test]
-		public void IncreaseSize()
-		{
-			recentFiles.MaxFiles = 10;
-			CheckAddItems( 10 );
-		}
-
-		[Test]
-		public void ReduceSize()
-		{
-			recentFiles.MaxFiles = 3;
-			CheckAddItems( 10 );
-		}
-
-		[Test]
-		public void IncreaseSizeAfterAdd()
-		{
-			SetMockValues(5);
-			recentFiles.MaxFiles = 7;
-			recentFiles.SetMostRecent( "30" );
-			recentFiles.SetMostRecent( "20" );
-			recentFiles.SetMostRecent( "10" );
-			CheckListContains( 10, 20, 30, 1, 2, 3, 4 );
-		}
-
-		[Test]
-		public void ReduceSizeAfterAdd()
-		{
-			SetMockValues( 5 );
-			recentFiles.MaxFiles = 3;
-			CheckMockValues( 3 );
-		}
-
-		[Test]
-		public void ReorderLastProject()
-		{
-			SetMockValues( 5 );
-			recentFiles.SetMostRecent( "5" );
-			CheckListContains( 5, 1, 2, 3, 4 );
-		}
-
-		[Test]
-		public void ReorderSingleProject()
-		{
-			SetMockValues( 5 );
-			recentFiles.SetMostRecent( "3" );
-			CheckListContains( 3, 1, 2, 4, 5 );
-		}
-
-		[Test]
-		public void ReorderMultipleProjects()
-		{
-			SetMockValues( 5 );
-			recentFiles.SetMostRecent( "3" );
-			recentFiles.SetMostRecent( "5" );
-			recentFiles.SetMostRecent( "2" );
-			CheckListContains( 2, 5, 3, 1, 4 );
-		}
-
-		[Test]
-		public void ReorderSameProject()
-		{
-			SetMockValues( 5 );
-			recentFiles.SetMostRecent( "1" );
-			CheckListContains( 1, 2, 3, 4, 5 );
-		}
-
-		[Test]
-		public void ReorderWithListNotFull()
-		{
-			SetMockValues( 3 );
-			recentFiles.SetMostRecent( "3" );
-			CheckListContains( 3, 1, 2 );
-		}
-
-		[Test]
-		public void RemoveFirstProject()
-		{
-			SetMockValues( 3 );
-			recentFiles.Remove("1");
-			CheckListContains( 2, 3 );
-		}
-
-		[Test]
-		public void RemoveOneProject()
-		{
-			SetMockValues( 4 );
-			recentFiles.Remove("2");
-			CheckListContains( 1, 3, 4 );
-		}
-
-		[Test]
-		public void RemoveMultipleProjects()
-		{
-			SetMockValues( 5 );
-			recentFiles.Remove( "3" );
-			recentFiles.Remove( "1" );
-			recentFiles.Remove( "4" );
-			CheckListContains( 2, 5 );
-		}
-		
-		[Test]
-		public void RemoveLastProject()
-		{
-			SetMockValues( 5 );
-			recentFiles.Remove("5");
-			CheckListContains( 1, 2, 3, 4 );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util.Tests
+{
+	using System;
+	using System.Collections;
+	using Microsoft.Win32;
+
+	using NUnit.Framework;
+	
+	/// <summary>
+	/// This fixture is used to test both RecentProjects and
+	/// its base class RecentFiles.  If we add any other derived
+	/// classes, the tests should be refactored.
+	/// </summary>
+	[TestFixture]
+	public class RecentFilesTests
+	{
+		static readonly int MAX = RecentFilesService.MaxSize;
+		static readonly int MIN = RecentFilesService.MinSize;
+
+		RecentFilesService recentFiles;
+
+		[SetUp]
+		public void SetUp()
+		{
+			recentFiles = new RecentFilesService( new SettingsGroup( new MemorySettingsStorage() ) );
+		}
+
+		#region Helper Methods
+		// Set RecentFiles to a list of known values up
+		// to a maximum. Most recent will be "1", next 
+		// "2", and so on...
+		private void SetMockValues( int count )
+		{
+			for( int num = count; num > 0; --num )
+				recentFiles.SetMostRecent( num.ToString() );			
+		}
+
+		// Check that the list is set right: 1, 2, ...
+		private void CheckMockValues( int count )
+		{
+			RecentFilesCollection files = recentFiles.Entries;
+			Assert.AreEqual( count, files.Count, "Count" );
+			
+			for( int index = 0; index < count; index++ )
+				Assert.AreEqual( (index + 1).ToString(), files[index].Path, "Item" ); 
+		}
+
+		// Check that we can add count items correctly
+		private void CheckAddItems( int count )
+		{
+			SetMockValues( count );
+			Assert.AreEqual( "1", recentFiles.Entries[0].Path, "RecentFile" );
+
+			CheckMockValues( Math.Min( count, recentFiles.MaxFiles ) );
+		}
+
+		// Check that the list contains a set of entries
+		// in the order given and nothing else.
+		private void CheckListContains( params int[] item )
+		{
+			RecentFilesCollection files = recentFiles.Entries;
+			Assert.AreEqual( item.Length, files.Count, "Count" );
+
+			for( int index = 0; index < files.Count; index++ )
+				Assert.AreEqual( item[index].ToString(), files[index].Path, "Item" );
+		}
+		#endregion
+
+		[Test]
+		public void CountDefault()
+		{
+			Assert.AreEqual( RecentFilesService.DefaultSize, recentFiles.MaxFiles );
+		}
+
+		[Test]
+		public void CountOverMax()
+		{
+			recentFiles.MaxFiles = MAX + 1;
+			Assert.AreEqual( MAX, recentFiles.MaxFiles );
+		}
+
+		[Test]
+		public void CountUnderMin()
+		{
+			recentFiles.MaxFiles = MIN - 1;
+			Assert.AreEqual( MIN, recentFiles.MaxFiles );
+		}
+
+		[Test]
+		public void CountAtMax()
+		{
+			recentFiles.MaxFiles = MAX;
+			Assert.AreEqual( MAX, recentFiles.MaxFiles );
+		}
+
+		[Test]
+		public void CountAtMin()
+		{
+			recentFiles.MaxFiles = MIN;
+			Assert.AreEqual( MIN, recentFiles.MaxFiles );
+		}
+
+		[Test]
+		public void EmptyList()
+		{
+			Assert.IsNotNull(  recentFiles.Entries, "Entries should never be null" );
+			Assert.AreEqual( 0, recentFiles.Count );
+			Assert.AreEqual( 0, recentFiles.Entries.Count );
+		}
+
+		[Test]
+		public void AddSingleItem()
+		{
+			CheckAddItems( 1 );
+		}
+
+		[Test]
+		public void AddMaxItems()
+		{
+			CheckAddItems( 5 );
+		}
+
+		[Test]
+		public void AddTooManyItems()
+		{
+			CheckAddItems( 10 );
+		}
+
+		[Test]
+		public void IncreaseSize()
+		{
+			recentFiles.MaxFiles = 10;
+			CheckAddItems( 10 );
+		}
+
+		[Test]
+		public void ReduceSize()
+		{
+			recentFiles.MaxFiles = 3;
+			CheckAddItems( 10 );
+		}
+
+		[Test]
+		public void IncreaseSizeAfterAdd()
+		{
+			SetMockValues(5);
+			recentFiles.MaxFiles = 7;
+			recentFiles.SetMostRecent( "30" );
+			recentFiles.SetMostRecent( "20" );
+			recentFiles.SetMostRecent( "10" );
+			CheckListContains( 10, 20, 30, 1, 2, 3, 4 );
+		}
+
+		[Test]
+		public void ReduceSizeAfterAdd()
+		{
+			SetMockValues( 5 );
+			recentFiles.MaxFiles = 3;
+			CheckMockValues( 3 );
+		}
+
+		[Test]
+		public void ReorderLastProject()
+		{
+			SetMockValues( 5 );
+			recentFiles.SetMostRecent( "5" );
+			CheckListContains( 5, 1, 2, 3, 4 );
+		}
+
+		[Test]
+		public void ReorderSingleProject()
+		{
+			SetMockValues( 5 );
+			recentFiles.SetMostRecent( "3" );
+			CheckListContains( 3, 1, 2, 4, 5 );
+		}
+
+		[Test]
+		public void ReorderMultipleProjects()
+		{
+			SetMockValues( 5 );
+			recentFiles.SetMostRecent( "3" );
+			recentFiles.SetMostRecent( "5" );
+			recentFiles.SetMostRecent( "2" );
+			CheckListContains( 2, 5, 3, 1, 4 );
+		}
+
+		[Test]
+		public void ReorderSameProject()
+		{
+			SetMockValues( 5 );
+			recentFiles.SetMostRecent( "1" );
+			CheckListContains( 1, 2, 3, 4, 5 );
+		}
+
+		[Test]
+		public void ReorderWithListNotFull()
+		{
+			SetMockValues( 3 );
+			recentFiles.SetMostRecent( "3" );
+			CheckListContains( 3, 1, 2 );
+		}
+
+		[Test]
+		public void RemoveFirstProject()
+		{
+			SetMockValues( 3 );
+			recentFiles.Remove("1");
+			CheckListContains( 2, 3 );
+		}
+
+		[Test]
+		public void RemoveOneProject()
+		{
+			SetMockValues( 4 );
+			recentFiles.Remove("2");
+			CheckListContains( 1, 3, 4 );
+		}
+
+		[Test]
+		public void RemoveMultipleProjects()
+		{
+			SetMockValues( 5 );
+			recentFiles.Remove( "3" );
+			recentFiles.Remove( "1" );
+			recentFiles.Remove( "4" );
+			CheckListContains( 2, 5 );
+		}
+		
+		[Test]
+		public void RemoveLastProject()
+		{
+			SetMockValues( 5 );
+			recentFiles.Remove("5");
+			CheckListContains( 1, 2, 3, 4 );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs b/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs
index 278dc9d..711f8c5 100644
--- a/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs
+++ b/src/ClientUtilities/tests/RegistrySettingsStorageTests.cs
@@ -1,116 +1,116 @@
-// ****************************************************************
-// 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 Microsoft.Win32;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class RegistrySettingsStorageTests
-	{
-		private static readonly string testKeyName = "Software\\NUnitTest";
-
-		RegistryKey testKey;
-		RegistrySettingsStorage storage;
-
-		[SetUp]
-		public void BeforeEachTest()
-		{
-			testKey = Registry.CurrentUser.CreateSubKey( testKeyName );
-			storage = new RegistrySettingsStorage( testKey );
-		}
-
-		[TearDown]
-		public void AfterEachTest()
-		{
-			NUnitRegistry.ClearKey( testKey );
-			storage.Dispose();
-		}
-
-		[Test]
-		public void StorageHasCorrectKey()
-		{
-			StringAssert.AreEqualIgnoringCase( "HKEY_CURRENT_USER\\" + testKeyName, storage.StorageKey.Name );
-		}
-
-		[Test]
-		public void SaveAndLoadSettings()
-		{
-			Assert.IsNull( storage.GetSetting( "X" ), "X is not null" );
-			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME is not null" );
-
-			storage.SaveSetting("X", 5);
-			storage.SaveSetting("NAME", "Charlie");
-
-			Assert.AreEqual( 5, storage.GetSetting("X") );
-			Assert.AreEqual( "Charlie", storage.GetSetting("NAME") );
-
-			Assert.AreEqual( 5, testKey.GetValue( "X" ) );
-			Assert.AreEqual( "Charlie", testKey.GetValue( "NAME" ) );
-		}
-
-		[Test]
-		public void RemoveSettings()
-		{
-			storage.SaveSetting("X", 5);
-			storage.SaveSetting("NAME", "Charlie");
-
-			storage.RemoveSetting( "X" );
-			Assert.IsNull( storage.GetSetting( "X" ), "X not removed" );
-			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
-
-			storage.RemoveSetting( "NAME" );
-			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME not removed" );
-		}
-
-		[Test]
-		public void MakeSubStorages()
-		{
-			RegistrySettingsStorage sub1 = (RegistrySettingsStorage)storage.MakeChildStorage( "Sub1" );
-			RegistrySettingsStorage sub2 = (RegistrySettingsStorage)storage.MakeChildStorage( "Sub2" );
-
-			Assert.IsNotNull( sub1, "Sub1 is null" );
-			Assert.IsNotNull( sub2, "Sub2 is null" );
-
-			StringAssert.AreEqualIgnoringCase( "HKEY_CURRENT_USER\\" + testKeyName + "\\Sub1", sub1.StorageKey.Name);
-			StringAssert.AreEqualIgnoringCase( "HKEY_CURRENT_USER\\" + testKeyName + "\\Sub2", sub2.StorageKey.Name );
-		}
-
-		[Test]
-		public void SubstorageSettings()
-		{
-			ISettingsStorage sub = storage.MakeChildStorage( "Sub" );
-
-			sub.SaveSetting( "X", 5 );
-			sub.SaveSetting( "NAME", "Charlie" );
-
-			Assert.AreEqual( 5, sub.GetSetting( "X" ) );
-			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
-
-			sub.RemoveSetting( "X" );
-			Assert.IsNull( sub.GetSetting( "X" ), "X not removed" );
-			
-			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
-
-			sub.RemoveSetting( "NAME" );
-			Assert.IsNull( sub.GetSetting( "NAME" ), "NAME not removed" );
-		}
-
-		[Test]
-		public void TypeSafeSettings()
-		{
-			storage.SaveSetting( "X", 5);
-			storage.SaveSetting( "Y", "17" );
-			storage.SaveSetting( "NAME", "Charlie");
-
-			Assert.AreEqual( 5, storage.GetSetting("X") );
-			Assert.AreEqual( "17", storage.GetSetting( "Y" ) );
-			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
-		}
-	}
-}
+// ****************************************************************
+// 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 Microsoft.Win32;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class RegistrySettingsStorageTests
+	{
+		private static readonly string testKeyName = "Software\\NUnitTest";
+
+		RegistryKey testKey;
+		RegistrySettingsStorage storage;
+
+		[SetUp]
+		public void BeforeEachTest()
+		{
+			testKey = Registry.CurrentUser.CreateSubKey( testKeyName );
+			storage = new RegistrySettingsStorage( testKey );
+		}
+
+		[TearDown]
+		public void AfterEachTest()
+		{
+			NUnitRegistry.ClearKey( testKey );
+			storage.Dispose();
+		}
+
+		[Test]
+		public void StorageHasCorrectKey()
+		{
+			StringAssert.AreEqualIgnoringCase( "HKEY_CURRENT_USER\\" + testKeyName, storage.StorageKey.Name );
+		}
+
+		[Test]
+		public void SaveAndLoadSettings()
+		{
+			Assert.IsNull( storage.GetSetting( "X" ), "X is not null" );
+			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME is not null" );
+
+			storage.SaveSetting("X", 5);
+			storage.SaveSetting("NAME", "Charlie");
+
+			Assert.AreEqual( 5, storage.GetSetting("X") );
+			Assert.AreEqual( "Charlie", storage.GetSetting("NAME") );
+
+			Assert.AreEqual( 5, testKey.GetValue( "X" ) );
+			Assert.AreEqual( "Charlie", testKey.GetValue( "NAME" ) );
+		}
+
+		[Test]
+		public void RemoveSettings()
+		{
+			storage.SaveSetting("X", 5);
+			storage.SaveSetting("NAME", "Charlie");
+
+			storage.RemoveSetting( "X" );
+			Assert.IsNull( storage.GetSetting( "X" ), "X not removed" );
+			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
+
+			storage.RemoveSetting( "NAME" );
+			Assert.IsNull( storage.GetSetting( "NAME" ), "NAME not removed" );
+		}
+
+		[Test]
+		public void MakeSubStorages()
+		{
+			RegistrySettingsStorage sub1 = (RegistrySettingsStorage)storage.MakeChildStorage( "Sub1" );
+			RegistrySettingsStorage sub2 = (RegistrySettingsStorage)storage.MakeChildStorage( "Sub2" );
+
+			Assert.IsNotNull( sub1, "Sub1 is null" );
+			Assert.IsNotNull( sub2, "Sub2 is null" );
+
+			StringAssert.AreEqualIgnoringCase( "HKEY_CURRENT_USER\\" + testKeyName + "\\Sub1", sub1.StorageKey.Name);
+			StringAssert.AreEqualIgnoringCase( "HKEY_CURRENT_USER\\" + testKeyName + "\\Sub2", sub2.StorageKey.Name );
+		}
+
+		[Test]
+		public void SubstorageSettings()
+		{
+			ISettingsStorage sub = storage.MakeChildStorage( "Sub" );
+
+			sub.SaveSetting( "X", 5 );
+			sub.SaveSetting( "NAME", "Charlie" );
+
+			Assert.AreEqual( 5, sub.GetSetting( "X" ) );
+			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
+
+			sub.RemoveSetting( "X" );
+			Assert.IsNull( sub.GetSetting( "X" ), "X not removed" );
+			
+			Assert.AreEqual( "Charlie", sub.GetSetting( "NAME" ) );
+
+			sub.RemoveSetting( "NAME" );
+			Assert.IsNull( sub.GetSetting( "NAME" ), "NAME not removed" );
+		}
+
+		[Test]
+		public void TypeSafeSettings()
+		{
+			storage.SaveSetting( "X", 5);
+			storage.SaveSetting( "Y", "17" );
+			storage.SaveSetting( "NAME", "Charlie");
+
+			Assert.AreEqual( 5, storage.GetSetting("X") );
+			Assert.AreEqual( "17", storage.GetSetting( "Y" ) );
+			Assert.AreEqual( "Charlie", storage.GetSetting( "NAME" ) );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/RemoteTestResultTest.cs b/src/ClientUtilities/tests/RemoteTestResultTest.cs
index 5ee82af..1a97074 100644
--- a/src/ClientUtilities/tests/RemoteTestResultTest.cs
+++ b/src/ClientUtilities/tests/RemoteTestResultTest.cs
@@ -1,76 +1,76 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class RemoteTestResultTest
-	{
-        private static readonly string mockDll = 
-            NUnit.Tests.Assemblies.MockAssembly.AssemblyPath; 
-        private TestDomain domain;
-
-        [SetUp]
-        public void CreateRunner()
-        {
-            domain = new TestDomain();
-        }
-
-        [TearDown]
-        public void UnloadRunner()
-        {
-            if ( domain != null )
-                domain.Unload();
-        }
-
-		[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(), TestFilter.Empty, false, LoggingThreshold.Off );
-			TestResult caseResult = findCaseResult(result);
-			Assert.IsNotNull(caseResult);
-            //TestResultItem item = new TestResultItem(caseResult);
-            //string message = item.GetMessage();
-            //Assert.IsNotNull(message);
-		}
-
-        [Test, Explicit("Fails intermittently")]
-        public void AppDomainUnloadedBug()
-        {
-            TestDomain domain = new TestDomain();
-            domain.Load( new TestPackage( mockDll ) );
-            domain.Run(new NullListener(), TestFilter.Empty, false, LoggingThreshold.Off);
-            domain.Unload();
-        }
-
-		private TestResult findCaseResult(TestResult suite) 
-		{
-			foreach (TestResult r in suite.Results) 
-			{
-				if (!r.Test.IsSuite)
-				{
-					return r;
-				}
-				else 
-				{
-					TestResult result = findCaseResult(r);
-					if (result != null)
-						return result;
-				}
-
-			}
-
-			return null;
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class RemoteTestResultTest
+	{
+        private static readonly string mockDll = 
+            NUnit.Tests.Assemblies.MockAssembly.AssemblyPath; 
+        private TestDomain domain;
+
+        [SetUp]
+        public void CreateRunner()
+        {
+            domain = new TestDomain();
+        }
+
+        [TearDown]
+        public void UnloadRunner()
+        {
+            if ( domain != null )
+                domain.Unload();
+        }
+
+		[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(), TestFilter.Empty, false, LoggingThreshold.Off );
+			TestResult caseResult = findCaseResult(result);
+			Assert.IsNotNull(caseResult);
+            //TestResultItem item = new TestResultItem(caseResult);
+            //string message = item.GetMessage();
+            //Assert.IsNotNull(message);
+		}
+
+        [Test, Explicit("Fails intermittently")]
+        public void AppDomainUnloadedBug()
+        {
+            TestDomain domain = new TestDomain();
+            domain.Load( new TestPackage( mockDll ) );
+            domain.Run(new NullListener(), TestFilter.Empty, false, LoggingThreshold.Off);
+            domain.Unload();
+        }
+
+		private TestResult findCaseResult(TestResult suite) 
+		{
+			foreach (TestResult r in suite.Results) 
+			{
+				if (!r.Test.IsSuite)
+				{
+					return r;
+				}
+				else 
+				{
+					TestResult result = findCaseResult(r);
+					if (result != null)
+						return result;
+				}
+
+			}
+
+			return null;
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs b/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
index 218fc7e..d1b692b 100644
--- a/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
+++ b/src/ClientUtilities/tests/RuntimeFrameworkSelectorTests.cs
@@ -1,61 +1,61 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Util.Tests
-{
-    [TestFixture]
-    public class RuntimeFrameworkSelectorTests
-    {
-        TestPackage package = new TestPackage("/dummy.dll");
-
-        [Datapoints]
-        internal RuntimeFramework[] frameworks = new RuntimeFramework[] { 
-            RuntimeFramework.Parse("net-1.0"), 
-            RuntimeFramework.Parse("net-1.1"), 
-            RuntimeFramework.Parse("net-2.0"),
-            RuntimeFramework.Parse("net-4.0"),
-            RuntimeFramework.Parse("mono-1.0"),
-            RuntimeFramework.Parse("mono-2.0"),
-            RuntimeFramework.Parse("v1.1"),
-            RuntimeFramework.Parse("v2.0"),
-            RuntimeFramework.Parse("v4.0")
-            // TODO: Figure out a way to run these
-            //RuntimeFramework.Parse("net"),
-            //RuntimeFramework.Parse("mono"),
-            //RuntimeFramework.Parse("any")
-        };
-
-        [Theory]
-        public void RequestForSpecificFrameworkIsHonored(RuntimeFramework requestedFramework)
-        {
-            Assume.That(requestedFramework.Runtime, Is.Not.EqualTo(RuntimeType.Any));
-
-            RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
-            package.Settings["RuntimeFramework"] = requestedFramework;
-
-            RuntimeFramework selectedFramework = selector.SelectRuntimeFramework(package);
-            Assert.That(selectedFramework.Runtime, Is.EqualTo(requestedFramework.Runtime));
-            Assert.That(selectedFramework.ClrVersion, Is.EqualTo(requestedFramework.ClrVersion));
-        }
-
-        [Theory]
-        public void RequestForSpecificVersionIsHonored(RuntimeFramework requestedFramework)
-        {
-            Assume.That(requestedFramework.Runtime, Is.EqualTo(RuntimeType.Any));
-
-            RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
-            package.Settings["RuntimeFramework"] = requestedFramework;
-
-            RuntimeFramework selectedFramework = selector.SelectRuntimeFramework(package);
-            Assert.That(selectedFramework.Runtime, Is.EqualTo(RuntimeFramework.CurrentFramework.Runtime));
-            Assert.That(selectedFramework.ClrVersion, Is.EqualTo(requestedFramework.ClrVersion));
-        }
-    }
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class RuntimeFrameworkSelectorTests
+    {
+        TestPackage package = new TestPackage("/dummy.dll");
+
+        [Datapoints]
+        internal RuntimeFramework[] frameworks = new RuntimeFramework[] { 
+            RuntimeFramework.Parse("net-1.0"), 
+            RuntimeFramework.Parse("net-1.1"), 
+            RuntimeFramework.Parse("net-2.0"),
+            RuntimeFramework.Parse("net-4.0"),
+            RuntimeFramework.Parse("mono-1.0"),
+            RuntimeFramework.Parse("mono-2.0"),
+            RuntimeFramework.Parse("v1.1"),
+            RuntimeFramework.Parse("v2.0"),
+            RuntimeFramework.Parse("v4.0")
+            // TODO: Figure out a way to run these
+            //RuntimeFramework.Parse("net"),
+            //RuntimeFramework.Parse("mono"),
+            //RuntimeFramework.Parse("any")
+        };
+
+        [Theory]
+        public void RequestForSpecificFrameworkIsHonored(RuntimeFramework requestedFramework)
+        {
+            Assume.That(requestedFramework.Runtime, Is.Not.EqualTo(RuntimeType.Any));
+
+            RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
+            package.Settings["RuntimeFramework"] = requestedFramework;
+
+            RuntimeFramework selectedFramework = selector.SelectRuntimeFramework(package);
+            Assert.That(selectedFramework.Runtime, Is.EqualTo(requestedFramework.Runtime));
+            Assert.That(selectedFramework.ClrVersion, Is.EqualTo(requestedFramework.ClrVersion));
+        }
+
+        [Theory]
+        public void RequestForSpecificVersionIsHonored(RuntimeFramework requestedFramework)
+        {
+            Assume.That(requestedFramework.Runtime, Is.EqualTo(RuntimeType.Any));
+
+            RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();
+            package.Settings["RuntimeFramework"] = requestedFramework;
+
+            RuntimeFramework selectedFramework = selector.SelectRuntimeFramework(package);
+            Assert.That(selectedFramework.Runtime, Is.EqualTo(RuntimeFramework.CurrentFramework.Runtime));
+            Assert.That(selectedFramework.ClrVersion, Is.EqualTo(requestedFramework.ClrVersion));
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/ServerUtilityTests.cs b/src/ClientUtilities/tests/ServerUtilityTests.cs
index d81e748..98978e0 100644
--- a/src/ClientUtilities/tests/ServerUtilityTests.cs
+++ b/src/ClientUtilities/tests/ServerUtilityTests.cs
@@ -1,54 +1,54 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for RemotingUtilitiesTests.
-	/// </summary>
-	[TestFixture]
-	public class ServerUtilityTests
-	{
-		TcpChannel channel1;
-		TcpChannel channel2;
-
-		[TearDown]
-		public void ReleaseChannels()
-		{
-			ServerUtilities.SafeReleaseChannel( channel1 );
-			ServerUtilities.SafeReleaseChannel( channel2 );
-		}
-
-		[Test]
-		public void CanGetTcpChannelOnSpecifiedPort()
-		{
-			channel1 = ServerUtilities.GetTcpChannel( "test", 1234 );
-			Assert.AreEqual( "test", channel1.ChannelName );
-			channel2 = ServerUtilities.GetTcpChannel( "test", 4321 );
-			Assert.AreEqual( "test", channel2.ChannelName );
-			Assert.AreEqual( channel1, channel2 );
-			Assert.AreSame( channel1, channel2 );
-			ChannelDataStore cds = (ChannelDataStore)channel1.ChannelData;
-			Assert.AreEqual( "tcp://127.0.0.1:1234", cds.ChannelUris[0] );
-		}
-
-		[Test]
-		public void CanGetTcpChannelOnUnpecifiedPort()
-		{
-			channel1 = ServerUtilities.GetTcpChannel( "test", 0 );
-			Assert.AreEqual( "test", channel1.ChannelName );
-			channel2 = ServerUtilities.GetTcpChannel( "test", 0 );
-			Assert.AreEqual( "test", channel2.ChannelName );
-			Assert.AreEqual( channel1, channel2 );
-			Assert.AreSame( channel1, channel2 );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for RemotingUtilitiesTests.
+	/// </summary>
+	[TestFixture]
+	public class ServerUtilityTests
+	{
+		TcpChannel channel1;
+		TcpChannel channel2;
+
+		[TearDown]
+		public void ReleaseChannels()
+		{
+			ServerUtilities.SafeReleaseChannel( channel1 );
+			ServerUtilities.SafeReleaseChannel( channel2 );
+		}
+
+		[Test]
+		public void CanGetTcpChannelOnSpecifiedPort()
+		{
+			channel1 = ServerUtilities.GetTcpChannel( "test", 1234 );
+			Assert.AreEqual( "test", channel1.ChannelName );
+			channel2 = ServerUtilities.GetTcpChannel( "test", 4321 );
+			Assert.AreEqual( "test", channel2.ChannelName );
+			Assert.AreEqual( channel1, channel2 );
+			Assert.AreSame( channel1, channel2 );
+			ChannelDataStore cds = (ChannelDataStore)channel1.ChannelData;
+			Assert.AreEqual( "tcp://127.0.0.1:1234", cds.ChannelUris[0] );
+		}
+
+		[Test]
+		public void CanGetTcpChannelOnUnpecifiedPort()
+		{
+			channel1 = ServerUtilities.GetTcpChannel( "test", 0 );
+			Assert.AreEqual( "test", channel1.ChannelName );
+			channel2 = ServerUtilities.GetTcpChannel( "test", 0 );
+			Assert.AreEqual( "test", channel2.ChannelName );
+			Assert.AreEqual( channel1, channel2 );
+			Assert.AreSame( channel1, channel2 );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs b/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs
index 2279b92..7041ea0 100644
--- a/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs
+++ b/src/ClientUtilities/tests/ServiceManagerSetUpFixture.cs
@@ -1,62 +1,62 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// This fixture is used to set up a distinct ServiceMangager with its
-	/// own services in the test domain when testing NUnit. We start and
-	/// stop services selectively. In particular, we don't want to 
-	/// do a StopAllServices command, because that would cause any 
-	/// changes to UserSettings to be saved. 
-	/// 
-	/// TODO: Refactor SettingsService so we can use it without actually
-	/// touching the backup storage.
-	/// </summary>
-	[SetUpFixture]
-	public class ServiceManagerSetUpFixture
-	{
-		[SetUp]
-		public void CreateServicesForTestDomain()
-		{
-			ServiceManager.Services.AddService( new DummySettingsService() );
-			ServiceManager.Services.AddService( new DomainManager() );
-			ServiceManager.Services.AddService( new ProjectService() );
-			ServiceManager.Services.AddService( new TestAgency( "TestDomain_TestAgency", 0 ) );
-			Services.TestAgency.Start();
-		}
-
-		[TearDown]
-		public void ClearServices()
-		{
-			Services.TestAgency.Stop();
-			ServiceManager.Services.ClearServices();
-		}
-	}
-
-    class DummySettingsService : SettingsGroup, NUnit.Core.IService
-    {
-        public DummySettingsService()
-        {
-            this.storage = new MemorySettingsStorage();
-        }
-
-        #region IService Members
-
-        public void InitializeService()
-        {
-        }
-
-        public void UnloadService()
-        {
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// This fixture is used to set up a distinct ServiceMangager with its
+	/// own services in the test domain when testing NUnit. We start and
+	/// stop services selectively. In particular, we don't want to 
+	/// do a StopAllServices command, because that would cause any 
+	/// changes to UserSettings to be saved. 
+	/// 
+	/// TODO: Refactor SettingsService so we can use it without actually
+	/// touching the backup storage.
+	/// </summary>
+	[SetUpFixture]
+	public class ServiceManagerSetUpFixture
+	{
+		[SetUp]
+		public void CreateServicesForTestDomain()
+		{
+			ServiceManager.Services.AddService( new DummySettingsService() );
+			ServiceManager.Services.AddService( new DomainManager() );
+			ServiceManager.Services.AddService( new ProjectService() );
+			ServiceManager.Services.AddService( new TestAgency( "TestDomain_TestAgency", 0 ) );
+			Services.TestAgency.Start();
+		}
+
+		[TearDown]
+		public void ClearServices()
+		{
+			Services.TestAgency.Stop();
+			ServiceManager.Services.ClearServices();
+		}
+	}
+
+    class DummySettingsService : SettingsGroup, NUnit.Core.IService
+    {
+        public DummySettingsService()
+        {
+            this.storage = new MemorySettingsStorage();
+        }
+
+        #region IService Members
+
+        public void InitializeService()
+        {
+        }
+
+        public void UnloadService()
+        {
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ClientUtilities/tests/SettingsGroupTests.cs b/src/ClientUtilities/tests/SettingsGroupTests.cs
index f3391b1..6bfcf4a 100644
--- a/src/ClientUtilities/tests/SettingsGroupTests.cs
+++ b/src/ClientUtilities/tests/SettingsGroupTests.cs
@@ -1,100 +1,100 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using Microsoft.Win32;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class SettingsGroupTests
-	{
-		private SettingsGroup testGroup;
-
-		[SetUp]
-		public void BeforeEachTest()
-		{
-			MemorySettingsStorage storage = new MemorySettingsStorage();
-			testGroup = new SettingsGroup( storage );
-		}
-
-		[TearDown]
-		public void AfterEachTest()
-		{
-			testGroup.Dispose();
-		}
-
-		[Test]
-		public void TopLevelSettings()
-		{
-			testGroup.SaveSetting( "X", 5 );
-			testGroup.SaveSetting( "NAME", "Charlie" );
-			Assert.AreEqual( 5, testGroup.GetSetting( "X" ) );
-			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME" ) );
-
-			testGroup.RemoveSetting( "X" );
-			Assert.IsNull( testGroup.GetSetting( "X" ), "X not removed" );
-			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME" ) );
-
-			testGroup.RemoveSetting( "NAME" );
-			Assert.IsNull( testGroup.GetSetting( "NAME" ), "NAME not removed" );
-		}
-
-		[Test]
-		public void SubGroupSettings()
-		{
-			SettingsGroup subGroup = new SettingsGroup( testGroup.Storage );
-			Assert.IsNotNull( subGroup );
-			Assert.IsNotNull( subGroup.Storage );
-
-			subGroup.SaveSetting( "X", 5 );
-			subGroup.SaveSetting( "NAME", "Charlie" );
-			Assert.AreEqual( 5, subGroup.GetSetting( "X" ) );
-			Assert.AreEqual( "Charlie", subGroup.GetSetting( "NAME" ) );
-
-			subGroup.RemoveSetting( "X" );
-			Assert.IsNull( subGroup.GetSetting( "X" ), "X not removed" );
-			Assert.AreEqual( "Charlie", subGroup.GetSetting( "NAME" ) );
-
-			subGroup.RemoveSetting( "NAME" );
-			Assert.IsNull( subGroup.GetSetting( "NAME" ), "NAME not removed" );
-		}
-
-		[Test]
-		public void TypeSafeSettings()
-		{
-			testGroup.SaveSetting( "X", 5);
-			testGroup.SaveSetting( "Y", "17" );
-			testGroup.SaveSetting( "NAME", "Charlie");
-
-			Assert.AreEqual( 5, testGroup.GetSetting("X") );
-			Assert.AreEqual( "17", testGroup.GetSetting( "Y" ) );
-			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME" ) );
-		}
-
-		[Test]
-		public void DefaultSettings()
-		{
-			Assert.IsNull( testGroup.GetSetting( "X" ) );
-			Assert.IsNull( testGroup.GetSetting( "NAME" ) );
-
-			Assert.AreEqual( 5, testGroup.GetSetting( "X", 5 ) );
-			Assert.AreEqual( 6, testGroup.GetSetting( "X", 6 ) );
-			Assert.AreEqual( "7", testGroup.GetSetting( "X", "7" ) );
-
-			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME", "Charlie" ) );
-			Assert.AreEqual( "Fred", testGroup.GetSetting( "NAME", "Fred" ) );
-		}
-
-		[Test]
-		public void BadSetting()
-		{
-			testGroup.SaveSetting( "X", "1y25" );
-			Assert.AreEqual( 12, testGroup.GetSetting( "X", 12 ) );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using Microsoft.Win32;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class SettingsGroupTests
+	{
+		private SettingsGroup testGroup;
+
+		[SetUp]
+		public void BeforeEachTest()
+		{
+			MemorySettingsStorage storage = new MemorySettingsStorage();
+			testGroup = new SettingsGroup( storage );
+		}
+
+		[TearDown]
+		public void AfterEachTest()
+		{
+			testGroup.Dispose();
+		}
+
+		[Test]
+		public void TopLevelSettings()
+		{
+			testGroup.SaveSetting( "X", 5 );
+			testGroup.SaveSetting( "NAME", "Charlie" );
+			Assert.AreEqual( 5, testGroup.GetSetting( "X" ) );
+			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME" ) );
+
+			testGroup.RemoveSetting( "X" );
+			Assert.IsNull( testGroup.GetSetting( "X" ), "X not removed" );
+			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME" ) );
+
+			testGroup.RemoveSetting( "NAME" );
+			Assert.IsNull( testGroup.GetSetting( "NAME" ), "NAME not removed" );
+		}
+
+		[Test]
+		public void SubGroupSettings()
+		{
+			SettingsGroup subGroup = new SettingsGroup( testGroup.Storage );
+			Assert.IsNotNull( subGroup );
+			Assert.IsNotNull( subGroup.Storage );
+
+			subGroup.SaveSetting( "X", 5 );
+			subGroup.SaveSetting( "NAME", "Charlie" );
+			Assert.AreEqual( 5, subGroup.GetSetting( "X" ) );
+			Assert.AreEqual( "Charlie", subGroup.GetSetting( "NAME" ) );
+
+			subGroup.RemoveSetting( "X" );
+			Assert.IsNull( subGroup.GetSetting( "X" ), "X not removed" );
+			Assert.AreEqual( "Charlie", subGroup.GetSetting( "NAME" ) );
+
+			subGroup.RemoveSetting( "NAME" );
+			Assert.IsNull( subGroup.GetSetting( "NAME" ), "NAME not removed" );
+		}
+
+		[Test]
+		public void TypeSafeSettings()
+		{
+			testGroup.SaveSetting( "X", 5);
+			testGroup.SaveSetting( "Y", "17" );
+			testGroup.SaveSetting( "NAME", "Charlie");
+
+			Assert.AreEqual( 5, testGroup.GetSetting("X") );
+			Assert.AreEqual( "17", testGroup.GetSetting( "Y" ) );
+			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME" ) );
+		}
+
+		[Test]
+		public void DefaultSettings()
+		{
+			Assert.IsNull( testGroup.GetSetting( "X" ) );
+			Assert.IsNull( testGroup.GetSetting( "NAME" ) );
+
+			Assert.AreEqual( 5, testGroup.GetSetting( "X", 5 ) );
+			Assert.AreEqual( 6, testGroup.GetSetting( "X", 6 ) );
+			Assert.AreEqual( "7", testGroup.GetSetting( "X", "7" ) );
+
+			Assert.AreEqual( "Charlie", testGroup.GetSetting( "NAME", "Charlie" ) );
+			Assert.AreEqual( "Fred", testGroup.GetSetting( "NAME", "Fred" ) );
+		}
+
+		[Test]
+		public void BadSetting()
+		{
+			testGroup.SaveSetting( "X", "1y25" );
+			Assert.AreEqual( 12, testGroup.GetSetting( "X", 12 ) );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/SummaryResultFixture.cs b/src/ClientUtilities/tests/SummaryResultFixture.cs
index 24a1aa0..cf313e6 100644
--- a/src/ClientUtilities/tests/SummaryResultFixture.cs
+++ b/src/ClientUtilities/tests/SummaryResultFixture.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Tests.Assemblies;
-using NUnit.TestUtilities;
-	
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for TestResultTests.
-	/// </summary>
-	[TestFixture]
-	public class SummaryResultFixture
-	{
-		private TestResult result;
-
-		[SetUp]
-		public void CreateResult()
-		{
-			Test testFixture = TestFixtureBuilder.BuildFrom( typeof( MockTestFixture ) );
-            result = testFixture.Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		[Test]
-		public void SummaryMatchesResult()
-		{
-			ResultSummarizer summary = new ResultSummarizer( result );
-
-			Assert.AreEqual(result.Name, summary.Name);
-			Assert.AreEqual(result.Time, summary.Time);
-			Assert.AreEqual(result.IsSuccess, summary.Success, "Success");
-        
-            Assert.AreEqual(MockTestFixture.ResultCount, summary.ResultCount );
-			Assert.AreEqual(MockTestFixture.TestsRun, summary.TestsRun, "TestsRun");
-			Assert.AreEqual(MockTestFixture.Failures, summary.Failures, "Failures");
-            Assert.AreEqual(MockTestFixture.Errors, summary.Errors, "Errors");
-			Assert.AreEqual(MockTestFixture.Ignored, summary.Ignored, "Ignored");
-            Assert.AreEqual(MockTestFixture.NotRunnable, summary.NotRunnable, "NotRunnable");
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Tests.Assemblies;
+using NUnit.TestUtilities;
+	
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for TestResultTests.
+	/// </summary>
+	[TestFixture]
+	public class SummaryResultFixture
+	{
+		private TestResult result;
+
+		[SetUp]
+		public void CreateResult()
+		{
+			Test testFixture = TestFixtureBuilder.BuildFrom( typeof( MockTestFixture ) );
+            result = testFixture.Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		[Test]
+		public void SummaryMatchesResult()
+		{
+			ResultSummarizer summary = new ResultSummarizer( result );
+
+			Assert.AreEqual(result.Name, summary.Name);
+			Assert.AreEqual(result.Time, summary.Time);
+			Assert.AreEqual(result.IsSuccess, summary.Success, "Success");
+        
+            Assert.AreEqual(MockTestFixture.ResultCount, summary.ResultCount );
+			Assert.AreEqual(MockTestFixture.TestsRun, summary.TestsRun, "TestsRun");
+			Assert.AreEqual(MockTestFixture.Failures, summary.Failures, "Failures");
+            Assert.AreEqual(MockTestFixture.Errors, summary.Errors, "Errors");
+			Assert.AreEqual(MockTestFixture.Ignored, summary.Ignored, "Ignored");
+            Assert.AreEqual(MockTestFixture.NotRunnable, summary.NotRunnable, "NotRunnable");
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/TestAgencyTests.cs b/src/ClientUtilities/tests/TestAgencyTests.cs
index 350229d..e440855 100644
--- a/src/ClientUtilities/tests/TestAgencyTests.cs
+++ b/src/ClientUtilities/tests/TestAgencyTests.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Diagnostics;
-using NUnit.Framework;
-using NUnit.Core;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-
-namespace NUnit.Util.Tests
-{
-    [TestFixture]
-    public class TestAgencyTests
-    {
-        private TestAgency agency;
-
-        [SetUp]
-        public void CreateAgency()
-        {
-            agency = new TestAgency("TempTestAgency", 0);
-            agency.Start();
-        }
-
-        [TearDown]
-        public void StopAgency()
-        {
-            agency.Stop();
-        }
-
-        [Test]
-        public void CanConnectToAgency()
-        {
-            object obj = Activator.GetObject(typeof(TestAgency), agency.ServerUrl);
-            Assert.IsNotNull(obj);
-            Assert.That(obj is TestAgency);
-        }
-
-        [Test, Platform(Exclude="Mono")]
-        public void CanLaunchAndConnectToAgent()
-        {
-            TestAgent agent = null;
-            try
-            {
-                agent = agency.GetAgent(10000);
-                Assert.IsNotNull(agent);
-            }
-            finally
-            {
-                if ( agent != null )
-                    agency.ReleaseAgent(agent);
-            }
-        }
-
-        // TODO: Decide if we really want to do this
-        //[Test]
-        public void CanReuseReleasedAgents()
-        {
-            TestAgent agent1 = agency.GetAgent(20000);
-            Guid id1 = agent1.Id;
-            agency.ReleaseAgent(agent1);
-            TestAgent agent2 = agency.GetAgent(20000);
-            Assert.AreEqual(id1, agent2.Id);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Diagnostics;
+using NUnit.Framework;
+using NUnit.Core;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class TestAgencyTests
+    {
+        private TestAgency agency;
+
+        [SetUp]
+        public void CreateAgency()
+        {
+            agency = new TestAgency("TempTestAgency", 0);
+            agency.Start();
+        }
+
+        [TearDown]
+        public void StopAgency()
+        {
+            agency.Stop();
+        }
+
+        [Test]
+        public void CanConnectToAgency()
+        {
+            object obj = Activator.GetObject(typeof(TestAgency), agency.ServerUrl);
+            Assert.IsNotNull(obj);
+            Assert.That(obj is TestAgency);
+        }
+
+        [Test, Platform(Exclude="Mono")]
+        public void CanLaunchAndConnectToAgent()
+        {
+            TestAgent agent = null;
+            try
+            {
+                agent = agency.GetAgent(10000);
+                Assert.IsNotNull(agent);
+            }
+            finally
+            {
+                if ( agent != null )
+                    agency.ReleaseAgent(agent);
+            }
+        }
+
+        // TODO: Decide if we really want to do this
+        //[Test]
+        public void CanReuseReleasedAgents()
+        {
+            TestAgent agent1 = agency.GetAgent(20000);
+            Guid id1 = agent1.Id;
+            agency.ReleaseAgent(agent1);
+            TestAgent agent2 = agency.GetAgent(20000);
+            Assert.AreEqual(id1, agent2.Id);
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/TestAgentTests.cs b/src/ClientUtilities/tests/TestAgentTests.cs
index 9feb505..2db8a27 100644
--- a/src/ClientUtilities/tests/TestAgentTests.cs
+++ b/src/ClientUtilities/tests/TestAgentTests.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Diagnostics;
-using NUnit.Framework;
-
-namespace NUnit.Util.Tests
-{
-    [TestFixture]
-    public class RemoteTestAgentTests
-    {
-        [Test]
-        public void AgentReturnsProcessId()
-        {
-            RemoteTestAgent agent = new RemoteTestAgent(Guid.NewGuid(), null);
-            Assert.AreEqual(Process.GetCurrentProcess().Id, agent.ProcessId);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Diagnostics;
+using NUnit.Framework;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class RemoteTestAgentTests
+    {
+        [Test]
+        public void AgentReturnsProcessId()
+        {
+            RemoteTestAgent agent = new RemoteTestAgent(Guid.NewGuid(), null);
+            Assert.AreEqual(Process.GetCurrentProcess().Id, agent.ProcessId);
+        }
+    }
+}
diff --git a/src/ClientUtilities/tests/TestDomainFixture.cs b/src/ClientUtilities/tests/TestDomainFixture.cs
index 7104453..d65769d 100644
--- a/src/ClientUtilities/tests/TestDomainFixture.cs
+++ b/src/ClientUtilities/tests/TestDomainFixture.cs
@@ -1,230 +1,230 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class TestDomainFixture
-	{
-		private static TestDomain testDomain; 
-		private static ITest loadedTest;
-        private static readonly string mockDll = MockAssembly.AssemblyPath;
-
-		[TestFixtureSetUp]
-		public static void MakeAppDomain()
-		{
-			testDomain = new TestDomain();
-			testDomain.Load( new TestPackage(mockDll));
-			loadedTest = testDomain.Test;
-		}
-
-		[TestFixtureTearDown]
-		public static void UnloadTestDomain()
-		{
-            if ( testDomain != null )
-                testDomain.Unload();
-			loadedTest = null;
-			testDomain = null;
-		}
-			
-		[Test]
-		public void AssemblyIsLoadedCorrectly()
-		{
-			Assert.IsNotNull(loadedTest, "Test not loaded");
-			Assert.AreEqual(MockAssembly.Tests, loadedTest.TestCount );
-		}
-
-        [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.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.That(setup.ShadowCopyDirectories, Is.SamePath(Path.GetDirectoryName(mockDll)), "ShadowCopyDirectories" );
-
-			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" );
-		}	
-
-		[Test]
-		public void CanRunMockAssemblyTests()
-		{
-			TestResult result = testDomain.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
-			Assert.IsNotNull(result);
-
-            ResultSummarizer summarizer = new ResultSummarizer(result);
-            Assert.AreEqual(MockAssembly.TestsRun, summarizer.TestsRun, "TestsRun");
-            Assert.AreEqual(MockAssembly.Ignored, summarizer.Ignored, "Ignored");
-            Assert.AreEqual(MockAssembly.Errors, summarizer.Errors, "Errors");
-            Assert.AreEqual(MockAssembly.Failures, summarizer.Failures, "Failures");
-        }
-	}
-
-	[TestFixture]
-	public class TestDomainRunnerTests : NUnit.Core.Tests.BasicRunnerTests
-	{
-		protected override TestRunner CreateRunner(int runnerID)
-		{
-			return new TestDomain(runnerID);
-		}
-
-	}
-
-	[TestFixture]
-	public class TestDomainTests
-	{ 
-		private TestDomain testDomain;
-        private static readonly string mockDll = MockAssembly.AssemblyPath;
-
-		[SetUp]
-		public void SetUp()
-		{
-			testDomain = new TestDomain();
-		}
-
-		[TearDown]
-		public void TearDown()
-		{
-			testDomain.Unload();
-		}
-
-		[Test]
-		[ExpectedException(typeof(FileNotFoundException))]
-		public void FileNotFound()
-		{
-			testDomain.Load( new TestPackage( "/xxxx.dll" ) );
-		}
-
-		[Test]
-		public void InvalidTestFixture()
-		{
-			TestPackage package = new TestPackage(mockDll);
-			package.TestName = "NUnit.Tests.Assemblies.Bogus";
-			Assert.IsFalse( testDomain.Load( package ) );
-		}
-
-		// Doesn't work under .NET 2.0 Beta 2
-		//[Test]
-		//[ExpectedException(typeof(BadImageFormatException))]
-		public void FileFoundButNotValidAssembly()
-		{
-			string badfile = Path.GetFullPath("x.dll");
-			try
-			{
-				StreamWriter sw = new StreamWriter( badfile );
-				//StreamWriter sw = file.AppendText();
-
-				sw.WriteLine("This is a new entry to add to the file");
-				sw.WriteLine("This is yet another line to add...");
-				sw.Flush();
-				sw.Close();
-				testDomain.Load( new TestPackage( badfile ) );
-			}
-			finally
-			{
-				if ( File.Exists( badfile ) )
-					File.Delete( badfile );
-			}
-
-		}
-
-		[Test]
-		public void SpecificTestFixture()
-		{
-			TestPackage package = new TestPackage(mockDll);
-			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-			testDomain.Load( package );
-
-			TestResult result = testDomain.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
-
-            ResultSummarizer summarizer = new ResultSummarizer(result);
-            Assert.AreEqual(MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun");
-            Assert.AreEqual(MockTestFixture.Ignored, summarizer.Ignored, "Ignored");
-            Assert.AreEqual(MockTestFixture.Errors, summarizer.Errors, "Errors");
-            Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
-        }
-
-        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
-		public void ConfigFileOverrideIsHonored()
-		{
-			TestPackage package = new TestPackage( "MyProject.nunit" );
-			package.Assemblies.Add(mockDll);
-			package.ConfigurationFile = "override.config";
-
-			testDomain.Load( package );
-
-			Assert.AreEqual( "override.config", 
-				Path.GetFileName( testDomain.AppDomain.SetupInformation.ConfigurationFile ) );
-		}
-
-		[Test]
-		public void BasePathOverrideIsHonored()
-		{
-			TestPackage package = new TestPackage( "MyProject.nunit" );
-			package.Assemblies.Add( MockAssembly.AssemblyPath );
-			package.BasePath = Path.GetDirectoryName( Environment.CurrentDirectory );
-			package.PrivateBinPath = Path.GetFileName( Environment.CurrentDirectory );
-
-			testDomain.Load( package );
-
-			Assert.That(testDomain.AppDomain.BaseDirectory, Is.SamePath(package.BasePath));
-		}
-
-        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
-		public void BinPathOverrideIsHonored()
-		{
-			TestPackage package = new TestPackage( "MyProject.nunit" );
-			package.Assemblies.Add( MockAssembly.AssemblyPath );
-			package.PrivateBinPath = "dummy;junk";
-
-			testDomain.Load( package );
-
-			Assert.AreEqual( "dummy;junk", 
-				testDomain.AppDomain.SetupInformation.PrivateBinPath );
-		}
-
-		// Turning off shadow copy only works when done for the primary app domain
-		// So this test can only work if it's already off
-		// This doesn't seem to be documented anywhere
-		[Test, Platform(Exclude="mono-1.0", Reason="Test hangs under the 1.0 profile")]
-		public void TurnOffShadowCopy()
-		{
-			TestPackage package = new TestPackage(mockDll);
-			package.Settings["ShadowCopyFiles"] = false;
-			testDomain.Load( package );
-			Assert.IsFalse( testDomain.AppDomain.ShadowCopyFiles );
-					
-			// Prove that shadow copy is really off
-//			string location = "NOT_FOUND";
-//			foreach( Assembly assembly in testDomain.AppDomain.GetAssemblies() )
-//			{
-//				if ( assembly.FullName.StartsWith( "mock-assembly" ) )
-//				{
-//					location = Path.GetDirectoryName( assembly.Location );
-//					break;
-//				}
-//			}
-//		
-//			StringAssert.StartsWith( AppDomain.CurrentDomain.BaseDirectory.ToLower(), location.ToLower() );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class TestDomainFixture
+	{
+		private static TestDomain testDomain; 
+		private static ITest loadedTest;
+        private static readonly string mockDll = MockAssembly.AssemblyPath;
+
+		[TestFixtureSetUp]
+		public static void MakeAppDomain()
+		{
+			testDomain = new TestDomain();
+			testDomain.Load( new TestPackage(mockDll));
+			loadedTest = testDomain.Test;
+		}
+
+		[TestFixtureTearDown]
+		public static void UnloadTestDomain()
+		{
+            if ( testDomain != null )
+                testDomain.Unload();
+			loadedTest = null;
+			testDomain = null;
+		}
+			
+		[Test]
+		public void AssemblyIsLoadedCorrectly()
+		{
+			Assert.IsNotNull(loadedTest, "Test not loaded");
+			Assert.AreEqual(MockAssembly.Tests, loadedTest.TestCount );
+		}
+
+        [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.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.That(setup.ShadowCopyDirectories, Is.SamePath(Path.GetDirectoryName(mockDll)), "ShadowCopyDirectories" );
+
+			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" );
+		}	
+
+		[Test]
+		public void CanRunMockAssemblyTests()
+		{
+			TestResult result = testDomain.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
+			Assert.IsNotNull(result);
+
+            ResultSummarizer summarizer = new ResultSummarizer(result);
+            Assert.AreEqual(MockAssembly.TestsRun, summarizer.TestsRun, "TestsRun");
+            Assert.AreEqual(MockAssembly.Ignored, summarizer.Ignored, "Ignored");
+            Assert.AreEqual(MockAssembly.Errors, summarizer.Errors, "Errors");
+            Assert.AreEqual(MockAssembly.Failures, summarizer.Failures, "Failures");
+        }
+	}
+
+	[TestFixture]
+	public class TestDomainRunnerTests : NUnit.Core.Tests.BasicRunnerTests
+	{
+		protected override TestRunner CreateRunner(int runnerID)
+		{
+			return new TestDomain(runnerID);
+		}
+
+	}
+
+	[TestFixture]
+	public class TestDomainTests
+	{ 
+		private TestDomain testDomain;
+        private static readonly string mockDll = MockAssembly.AssemblyPath;
+
+		[SetUp]
+		public void SetUp()
+		{
+			testDomain = new TestDomain();
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			testDomain.Unload();
+		}
+
+		[Test]
+		[ExpectedException(typeof(FileNotFoundException))]
+		public void FileNotFound()
+		{
+			testDomain.Load( new TestPackage( "/xxxx.dll" ) );
+		}
+
+		[Test]
+		public void InvalidTestFixture()
+		{
+			TestPackage package = new TestPackage(mockDll);
+			package.TestName = "NUnit.Tests.Assemblies.Bogus";
+			Assert.IsFalse( testDomain.Load( package ) );
+		}
+
+		// Doesn't work under .NET 2.0 Beta 2
+		//[Test]
+		//[ExpectedException(typeof(BadImageFormatException))]
+		public void FileFoundButNotValidAssembly()
+		{
+			string badfile = Path.GetFullPath("x.dll");
+			try
+			{
+				StreamWriter sw = new StreamWriter( badfile );
+				//StreamWriter sw = file.AppendText();
+
+				sw.WriteLine("This is a new entry to add to the file");
+				sw.WriteLine("This is yet another line to add...");
+				sw.Flush();
+				sw.Close();
+				testDomain.Load( new TestPackage( badfile ) );
+			}
+			finally
+			{
+				if ( File.Exists( badfile ) )
+					File.Delete( badfile );
+			}
+
+		}
+
+		[Test]
+		public void SpecificTestFixture()
+		{
+			TestPackage package = new TestPackage(mockDll);
+			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			testDomain.Load( package );
+
+			TestResult result = testDomain.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
+
+            ResultSummarizer summarizer = new ResultSummarizer(result);
+            Assert.AreEqual(MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun");
+            Assert.AreEqual(MockTestFixture.Ignored, summarizer.Ignored, "Ignored");
+            Assert.AreEqual(MockTestFixture.Errors, summarizer.Errors, "Errors");
+            Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
+        }
+
+        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
+		public void ConfigFileOverrideIsHonored()
+		{
+			TestPackage package = new TestPackage( "MyProject.nunit" );
+			package.Assemblies.Add(mockDll);
+			package.ConfigurationFile = "override.config";
+
+			testDomain.Load( package );
+
+			Assert.AreEqual( "override.config", 
+				Path.GetFileName( testDomain.AppDomain.SetupInformation.ConfigurationFile ) );
+		}
+
+		[Test]
+		public void BasePathOverrideIsHonored()
+		{
+			TestPackage package = new TestPackage( "MyProject.nunit" );
+			package.Assemblies.Add( MockAssembly.AssemblyPath );
+			package.BasePath = Path.GetDirectoryName( Environment.CurrentDirectory );
+			package.PrivateBinPath = Path.GetFileName( Environment.CurrentDirectory );
+
+			testDomain.Load( package );
+
+			Assert.That(testDomain.AppDomain.BaseDirectory, Is.SamePath(package.BasePath));
+		}
+
+        [Test, Platform("Linux,Net", Reason = "get_SetupInformation() fails on Windows+Mono")]
+		public void BinPathOverrideIsHonored()
+		{
+			TestPackage package = new TestPackage( "MyProject.nunit" );
+			package.Assemblies.Add( MockAssembly.AssemblyPath );
+			package.PrivateBinPath = "dummy;junk";
+
+			testDomain.Load( package );
+
+			Assert.AreEqual( "dummy;junk", 
+				testDomain.AppDomain.SetupInformation.PrivateBinPath );
+		}
+
+		// Turning off shadow copy only works when done for the primary app domain
+		// So this test can only work if it's already off
+		// This doesn't seem to be documented anywhere
+		[Test, Platform(Exclude="mono-1.0", Reason="Test hangs under the 1.0 profile")]
+		public void TurnOffShadowCopy()
+		{
+			TestPackage package = new TestPackage(mockDll);
+			package.Settings["ShadowCopyFiles"] = false;
+			testDomain.Load( package );
+			Assert.IsFalse( testDomain.AppDomain.ShadowCopyFiles );
+					
+			// Prove that shadow copy is really off
+//			string location = "NOT_FOUND";
+//			foreach( Assembly assembly in testDomain.AppDomain.GetAssemblies() )
+//			{
+//				if ( assembly.FullName.StartsWith( "mock-assembly" ) )
+//				{
+//					location = Path.GetDirectoryName( assembly.Location );
+//					break;
+//				}
+//			}
+//		
+//			StringAssert.StartsWith( AppDomain.CurrentDomain.BaseDirectory.ToLower(), location.ToLower() );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/TestDomainTests_Multiple.cs b/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
index 7c70195..95df2ad 100644
--- a/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
+++ b/src/ClientUtilities/tests/TestDomainTests_Multiple.cs
@@ -1,107 +1,107 @@
-// ****************************************************************
-// 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.IO;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for MultipleAssembliesDomain.
-	/// </summary>
-	[TestFixture]
-	public class TestDomainTests_Multiple
-	{
-		private TestDomain domain; 
-		private ITest loadedSuite;
-
-		private static string path1 = NoNamespaceTestFixture.AssemblyPath;
-		private static string path2 = MockAssembly.AssemblyPath;
-
-		private string name = "Multiple Assemblies Test";
-
-		[TestFixtureSetUp]
-		public void Init()
-		{
-			domain = new TestDomain();
-			TestPackage package = new TestPackage( name );
-			package.Assemblies.Add( path1 );
-			package.Assemblies.Add( path2 );
-			domain.Load( package );
-			loadedSuite = domain.Test;
-		}
-
-		[TestFixtureTearDown]
-		public void UnloadTestDomain()
-		{
-			domain.Unload();
-			domain = null;
-		}
-			
-		[Test]
-		public void BuildSuite()
-		{
-			Assert.IsNotNull(loadedSuite);
-		}
-
-		[Test]
-		public void RootNode()
-		{
-			Assert.AreEqual( name, loadedSuite.TestName.Name );
-		}
-
-		[Test]
-		public void AssemblyNodes()
-		{
-			TestNode test0 = (TestNode)loadedSuite.Tests[0];
-			TestNode test1 = (TestNode)loadedSuite.Tests[1];
-			Assert.AreEqual( path1, test0.TestName.Name );
-			Assert.AreEqual( path2, test1.TestName.Name );
-		}
-
-		[Test]
-		public void TestCaseCount()
-		{
-			Assert.AreEqual(NoNamespaceTestFixture.Tests + MockAssembly.Tests, 
-				loadedSuite.TestCount );
-		}
-
-		[Test]
-		public void RunMultipleAssemblies()
-		{
-			TestResult result = domain.Run(NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off);
-			ResultSummarizer summary = new ResultSummarizer(result);
-			Assert.AreEqual(
-				NoNamespaceTestFixture.Tests + MockAssembly.TestsRun, 
-				summary.TestsRun);
-		}
-	}
-
-	[TestFixture]
-	public class TestDomainTests_MultipleFixture
-	{
-		[Test]
-		public void LoadFixture()
-		{
-			TestDomain domain = new TestDomain();
-			TestPackage package = new TestPackage( "Multiple Assemblies Test" );
-			package.Assemblies.Add(NoNamespaceTestFixture.AssemblyPath);
-			package.Assemblies.Add(MockAssembly.AssemblyPath);
-            package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-            try
-            {
-                domain.Load(package);
-                Assert.AreEqual(MockTestFixture.Tests, domain.Test.TestCount);
-            }
-            finally
-            {
-                domain.Unload();
-            }
-		}
-	}
-}
+// ****************************************************************
+// 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.IO;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for MultipleAssembliesDomain.
+	/// </summary>
+	[TestFixture]
+	public class TestDomainTests_Multiple
+	{
+		private TestDomain domain; 
+		private ITest loadedSuite;
+
+		private static string path1 = NoNamespaceTestFixture.AssemblyPath;
+		private static string path2 = MockAssembly.AssemblyPath;
+
+		private string name = "Multiple Assemblies Test";
+
+		[TestFixtureSetUp]
+		public void Init()
+		{
+			domain = new TestDomain();
+			TestPackage package = new TestPackage( name );
+			package.Assemblies.Add( path1 );
+			package.Assemblies.Add( path2 );
+			domain.Load( package );
+			loadedSuite = domain.Test;
+		}
+
+		[TestFixtureTearDown]
+		public void UnloadTestDomain()
+		{
+			domain.Unload();
+			domain = null;
+		}
+			
+		[Test]
+		public void BuildSuite()
+		{
+			Assert.IsNotNull(loadedSuite);
+		}
+
+		[Test]
+		public void RootNode()
+		{
+			Assert.AreEqual( name, loadedSuite.TestName.Name );
+		}
+
+		[Test]
+		public void AssemblyNodes()
+		{
+			TestNode test0 = (TestNode)loadedSuite.Tests[0];
+			TestNode test1 = (TestNode)loadedSuite.Tests[1];
+			Assert.AreEqual( path1, test0.TestName.Name );
+			Assert.AreEqual( path2, test1.TestName.Name );
+		}
+
+		[Test]
+		public void TestCaseCount()
+		{
+			Assert.AreEqual(NoNamespaceTestFixture.Tests + MockAssembly.Tests, 
+				loadedSuite.TestCount );
+		}
+
+		[Test]
+		public void RunMultipleAssemblies()
+		{
+			TestResult result = domain.Run(NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off);
+			ResultSummarizer summary = new ResultSummarizer(result);
+			Assert.AreEqual(
+				NoNamespaceTestFixture.Tests + MockAssembly.TestsRun, 
+				summary.TestsRun);
+		}
+	}
+
+	[TestFixture]
+	public class TestDomainTests_MultipleFixture
+	{
+		[Test]
+		public void LoadFixture()
+		{
+			TestDomain domain = new TestDomain();
+			TestPackage package = new TestPackage( "Multiple Assemblies Test" );
+			package.Assemblies.Add(NoNamespaceTestFixture.AssemblyPath);
+			package.Assemblies.Add(MockAssembly.AssemblyPath);
+            package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+            try
+            {
+                domain.Load(package);
+                Assert.AreEqual(MockTestFixture.Tests, domain.Test.TestCount);
+            }
+            finally
+            {
+                domain.Unload();
+            }
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/TestEventCatcher.cs b/src/ClientUtilities/tests/TestEventCatcher.cs
index b42da34..de77d2f 100644
--- a/src/ClientUtilities/tests/TestEventCatcher.cs
+++ b/src/ClientUtilities/tests/TestEventCatcher.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for TestEventCatcher.
-	/// </summary>
-	public class TestEventCatcher
-	{
-		public class TestEventArgsCollection : ReadOnlyCollectionBase
-		{
-			public EventArgs this[int index]
-			{
-				get { return (EventArgs)InnerList[index]; }
-			}
-
-			public void Add( EventArgs e )
-			{
-				InnerList.Add( e );
-			}
-		}
-
-		private TestEventArgsCollection events;
-
-        public bool GotRunFinished = false;
-
-		public TestEventCatcher( ITestEvents source )
-		{
-			events = new TestEventArgsCollection();
-
-			source.ProjectLoading	+= new TestEventHandler( OnTestEvent );
-			source.ProjectLoaded	+= new TestEventHandler( OnTestEvent );
-			source.ProjectLoadFailed+= new TestEventHandler( OnTestEvent );
-			source.ProjectUnloading	+= new TestEventHandler( OnTestEvent );
-			source.ProjectUnloaded	+= new TestEventHandler( OnTestEvent );
-			source.ProjectUnloadFailed+= new TestEventHandler( OnTestEvent );
-
-			source.TestLoading		+= new TestEventHandler( OnTestEvent );
-			source.TestLoaded		+= new TestEventHandler( OnTestEvent );
-			source.TestLoadFailed	+= new TestEventHandler( OnTestEvent );
-
-			source.TestUnloading	+= new TestEventHandler( OnTestEvent );
-			source.TestUnloaded		+= new TestEventHandler( OnTestEvent );
-			source.TestUnloadFailed	+= new TestEventHandler( OnTestEvent );
-		
-			source.TestReloading	+= new TestEventHandler( OnTestEvent );
-			source.TestReloaded		+= new TestEventHandler( OnTestEvent );
-			source.TestReloadFailed	+= new TestEventHandler( OnTestEvent );
-
-			source.RunStarting		+= new TestEventHandler( OnTestEvent );
-			source.RunFinished		+= new TestEventHandler( OnTestEvent );
-
-			source.TestStarting		+= new TestEventHandler( OnTestEvent );
-			source.TestFinished		+= new TestEventHandler( OnTestEvent );
-		
-			source.SuiteStarting	+= new TestEventHandler( OnTestEvent );
-			source.SuiteFinished	+= new TestEventHandler( OnTestEvent );
-		}
-
-		public TestEventArgsCollection Events
-		{
-			get { return events; }
-		}
-
-		private void OnTestEvent( object sender, TestEventArgs e )
-		{
-			events.Add( e );
-            if (e.Action == TestAction.RunFinished)
-                GotRunFinished = true;
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for TestEventCatcher.
+	/// </summary>
+	public class TestEventCatcher
+	{
+		public class TestEventArgsCollection : ReadOnlyCollectionBase
+		{
+			public EventArgs this[int index]
+			{
+				get { return (EventArgs)InnerList[index]; }
+			}
+
+			public void Add( EventArgs e )
+			{
+				InnerList.Add( e );
+			}
+		}
+
+		private TestEventArgsCollection events;
+
+        public bool GotRunFinished = false;
+
+		public TestEventCatcher( ITestEvents source )
+		{
+			events = new TestEventArgsCollection();
+
+			source.ProjectLoading	+= new TestEventHandler( OnTestEvent );
+			source.ProjectLoaded	+= new TestEventHandler( OnTestEvent );
+			source.ProjectLoadFailed+= new TestEventHandler( OnTestEvent );
+			source.ProjectUnloading	+= new TestEventHandler( OnTestEvent );
+			source.ProjectUnloaded	+= new TestEventHandler( OnTestEvent );
+			source.ProjectUnloadFailed+= new TestEventHandler( OnTestEvent );
+
+			source.TestLoading		+= new TestEventHandler( OnTestEvent );
+			source.TestLoaded		+= new TestEventHandler( OnTestEvent );
+			source.TestLoadFailed	+= new TestEventHandler( OnTestEvent );
+
+			source.TestUnloading	+= new TestEventHandler( OnTestEvent );
+			source.TestUnloaded		+= new TestEventHandler( OnTestEvent );
+			source.TestUnloadFailed	+= new TestEventHandler( OnTestEvent );
+		
+			source.TestReloading	+= new TestEventHandler( OnTestEvent );
+			source.TestReloaded		+= new TestEventHandler( OnTestEvent );
+			source.TestReloadFailed	+= new TestEventHandler( OnTestEvent );
+
+			source.RunStarting		+= new TestEventHandler( OnTestEvent );
+			source.RunFinished		+= new TestEventHandler( OnTestEvent );
+
+			source.TestStarting		+= new TestEventHandler( OnTestEvent );
+			source.TestFinished		+= new TestEventHandler( OnTestEvent );
+		
+			source.SuiteStarting	+= new TestEventHandler( OnTestEvent );
+			source.SuiteFinished	+= new TestEventHandler( OnTestEvent );
+		}
+
+		public TestEventArgsCollection Events
+		{
+			get { return events; }
+		}
+
+		private void OnTestEvent( object sender, TestEventArgs e )
+		{
+			events.Add( e );
+            if (e.Action == TestAction.RunFinished)
+                GotRunFinished = true;
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs b/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
index 2a8b0ae..13835a1 100644
--- a/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
+++ b/src/ClientUtilities/tests/TestLoaderAssemblyTests.cs
@@ -1,192 +1,192 @@
-// ****************************************************************
-// 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.Threading;
-using NUnit.Core;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// 
-	/// </summary>
-	[TestFixture]
-	public class TestLoaderAssemblyTests
-	{
-		private readonly string assembly = MockAssembly.AssemblyPath;
-		private readonly string badFile = "/x.dll";
-
-		private TestLoader loader;
-		private TestEventCatcher catcher;
-
-		private void LoadTest( string assembly )
-		{
-			loader.LoadProject( assembly );
-			if (loader.IsProjectLoaded && loader.TestProject.IsLoadable)
-				loader.LoadTest();
-		}
-		
-		[SetUp]
-		public void SetUp()
-		{
-			loader = new TestLoader( );
-			catcher = new TestEventCatcher( loader.Events );
-		}
-
-		[TearDown]
-		public void TearDown()
-		{
-			if ( loader.IsTestLoaded )
-				loader.UnloadTest();
-
-			if ( loader.IsProjectLoaded )
-				loader.UnloadProject();
-		}
-
-		[Test]
-		public void LoadProject()
-		{
-			loader.LoadProject( assembly );
-			Assert.IsTrue(loader.IsProjectLoaded,  "Project not loaded");
-			Assert.IsFalse(loader.IsTestLoaded,  "Test should not be loaded");
-			Assert.AreEqual( 2, catcher.Events.Count );
-			Assert.AreEqual( TestAction.ProjectLoading, ((TestEventArgs)catcher.Events[0]).Action );
-			Assert.AreEqual( TestAction.ProjectLoaded, ((TestEventArgs)catcher.Events[1]).Action );
-		}
-
-		[Test]
-		public void UnloadProject()
-		{
-			loader.LoadProject( assembly );
-			loader.UnloadProject();
-			Assert.IsFalse( loader.IsProjectLoaded, "Project not unloaded" );
-			Assert.IsFalse( loader.IsTestLoaded, "Test not unloaded" );
-			Assert.AreEqual( 4, catcher.Events.Count );
-			Assert.AreEqual( TestAction.ProjectUnloading, ((TestEventArgs)catcher.Events[2]).Action );
-			Assert.AreEqual( TestAction.ProjectUnloaded, ((TestEventArgs)catcher.Events[3]).Action );
-		}
-
-		[Test]
-		public void LoadTest()
-		{
-			LoadTest( assembly );
-			Assert.IsTrue( loader.IsProjectLoaded, "Project not loaded" );
-			Assert.IsTrue( loader.IsTestLoaded, "Test not loaded" );
-			Assert.AreEqual( 4, catcher.Events.Count );
-			Assert.AreEqual( TestAction.TestLoading, ((TestEventArgs)catcher.Events[2]).Action );
-			Assert.AreEqual( TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action );
-			Assert.AreEqual( MockAssembly.Tests, ((TestEventArgs)catcher.Events[3]).TestCount );
-		}
-
-		[Test]
-		public void UnloadTest()
-		{
-			LoadTest( assembly );
-			loader.UnloadTest();
-			Assert.AreEqual( 6, catcher.Events.Count );
-			Assert.AreEqual( TestAction.TestUnloading, ((TestEventArgs)catcher.Events[4]).Action );
-			Assert.AreEqual( TestAction.TestUnloaded, ((TestEventArgs)catcher.Events[5]).Action );
-		}
-
-		[Test]
-		public void FileNotFound()
-		{
-			LoadTest( "xxxxx" );
-			Assert.IsFalse( loader.IsProjectLoaded, "Project should not load" );
-			Assert.IsFalse( loader.IsTestLoaded, "Test should not load" );
-			Assert.AreEqual( 2, catcher.Events.Count );
-			Assert.AreEqual( TestAction.ProjectLoadFailed, ((TestEventArgs)catcher.Events[1]).Action );
-			Assert.AreEqual( typeof( FileNotFoundException ), ((TestEventArgs)catcher.Events[1]).Exception.GetType() );
-		}
-
-		// Doesn't work under .NET 2.0 Beta 2
-		//[Test]
-		public void InvalidAssembly()
-		{
-			FileInfo file = new FileInfo(badFile);
-			try
-			{
-				StreamWriter sw = file.AppendText();
-				sw.WriteLine("This is a new entry to add to the file");
-				sw.WriteLine("This is yet another line to add...");
-				sw.Flush();
-				sw.Close();
-
-				LoadTest(badFile);
-				Assert.IsTrue(loader.IsProjectLoaded, "Project not loaded");
-				Assert.IsFalse(loader.IsTestLoaded, "Test should not be loaded");
-				Assert.AreEqual(4, catcher.Events.Count);
-				Assert.AreEqual(TestAction.TestLoadFailed, ((TestEventArgs)catcher.Events[3]).Action);
-				Assert.AreEqual(typeof(BadImageFormatException), ((TestEventArgs)catcher.Events[3]).Exception.GetType());
-			}
-			finally
-			{
-				if ( file.Exists )
-				    file.Delete();
-			}
-		}
-
-		[Test]
-		public void AssemblyWithNoTests()
-		{
-			LoadTest( "nunit.framework.dll" );
-			Assert.IsTrue( loader.IsProjectLoaded, "Project not loaded" );
-			Assert.IsTrue( loader.IsTestLoaded, "Test not loaded" );
-			Assert.AreEqual( 4, catcher.Events.Count );
-			Assert.AreEqual( TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action );
-		}
-
-		// TODO: Should wrapper project be unloaded on failure?
-
-		[Test]
-		public void RunTest()
-		{
-            //loader.ReloadOnRun = false;
-			
-			LoadTest( assembly );
-			loader.RunTests(TestFilter.Empty);
-			do 
-			{
-				// TODO: Find a more robust way of handling this
-				Thread.Sleep( 500 );
-			}
-			while( !catcher.GotRunFinished );
-
-            Assert.AreEqual(TestAction.ProjectLoading, ((TestEventArgs)catcher.Events[0]).Action);
-            Assert.AreEqual(TestAction.ProjectLoaded, ((TestEventArgs)catcher.Events[1]).Action);
-            Assert.AreEqual(TestAction.TestLoading, ((TestEventArgs)catcher.Events[2]).Action);
-            Assert.AreEqual(TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action);
-            Assert.AreEqual(TestAction.RunStarting, ((TestEventArgs)catcher.Events[4]).Action);
-
-            int eventCount = 4 /* for loading */+ 2 * (MockAssembly.Nodes - MockAssembly.Explicit);
-            if (eventCount != catcher.Events.Count)
-                foreach (TestEventArgs e in catcher.Events)
-                    Console.WriteLine(e.Action);
-            Assert.AreEqual(eventCount, catcher.Events.Count);
-
-            Assert.AreEqual(TestAction.RunFinished, ((TestEventArgs)catcher.Events[eventCount - 1]).Action);
-
-			int nTests = 0;
-			int nRun = 0;
-			foreach( object o in catcher.Events )
-			{
-				TestEventArgs e = o as TestEventArgs;
-
-				if ( e != null && e.Action == TestAction.TestFinished )
-				{
-					++nTests;
-					if ( e.Result.Executed )
-						++nRun;
-				}
-			}
-			Assert.AreEqual( MockAssembly.ResultCount, nTests );
-			Assert.AreEqual( MockAssembly.TestsRun, nRun );
-		}
-	}
-}
+// ****************************************************************
+// 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.Threading;
+using NUnit.Core;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// 
+	/// </summary>
+	[TestFixture]
+	public class TestLoaderAssemblyTests
+	{
+		private readonly string assembly = MockAssembly.AssemblyPath;
+		private readonly string badFile = "/x.dll";
+
+		private TestLoader loader;
+		private TestEventCatcher catcher;
+
+		private void LoadTest( string assembly )
+		{
+			loader.LoadProject( assembly );
+			if (loader.IsProjectLoaded && loader.TestProject.IsLoadable)
+				loader.LoadTest();
+		}
+		
+		[SetUp]
+		public void SetUp()
+		{
+			loader = new TestLoader( );
+			catcher = new TestEventCatcher( loader.Events );
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			if ( loader.IsTestLoaded )
+				loader.UnloadTest();
+
+			if ( loader.IsProjectLoaded )
+				loader.UnloadProject();
+		}
+
+		[Test]
+		public void LoadProject()
+		{
+			loader.LoadProject( assembly );
+			Assert.IsTrue(loader.IsProjectLoaded,  "Project not loaded");
+			Assert.IsFalse(loader.IsTestLoaded,  "Test should not be loaded");
+			Assert.AreEqual( 2, catcher.Events.Count );
+			Assert.AreEqual( TestAction.ProjectLoading, ((TestEventArgs)catcher.Events[0]).Action );
+			Assert.AreEqual( TestAction.ProjectLoaded, ((TestEventArgs)catcher.Events[1]).Action );
+		}
+
+		[Test]
+		public void UnloadProject()
+		{
+			loader.LoadProject( assembly );
+			loader.UnloadProject();
+			Assert.IsFalse( loader.IsProjectLoaded, "Project not unloaded" );
+			Assert.IsFalse( loader.IsTestLoaded, "Test not unloaded" );
+			Assert.AreEqual( 4, catcher.Events.Count );
+			Assert.AreEqual( TestAction.ProjectUnloading, ((TestEventArgs)catcher.Events[2]).Action );
+			Assert.AreEqual( TestAction.ProjectUnloaded, ((TestEventArgs)catcher.Events[3]).Action );
+		}
+
+		[Test]
+		public void LoadTest()
+		{
+			LoadTest( assembly );
+			Assert.IsTrue( loader.IsProjectLoaded, "Project not loaded" );
+			Assert.IsTrue( loader.IsTestLoaded, "Test not loaded" );
+			Assert.AreEqual( 4, catcher.Events.Count );
+			Assert.AreEqual( TestAction.TestLoading, ((TestEventArgs)catcher.Events[2]).Action );
+			Assert.AreEqual( TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action );
+			Assert.AreEqual( MockAssembly.Tests, ((TestEventArgs)catcher.Events[3]).TestCount );
+		}
+
+		[Test]
+		public void UnloadTest()
+		{
+			LoadTest( assembly );
+			loader.UnloadTest();
+			Assert.AreEqual( 6, catcher.Events.Count );
+			Assert.AreEqual( TestAction.TestUnloading, ((TestEventArgs)catcher.Events[4]).Action );
+			Assert.AreEqual( TestAction.TestUnloaded, ((TestEventArgs)catcher.Events[5]).Action );
+		}
+
+		[Test]
+		public void FileNotFound()
+		{
+			LoadTest( "xxxxx" );
+			Assert.IsFalse( loader.IsProjectLoaded, "Project should not load" );
+			Assert.IsFalse( loader.IsTestLoaded, "Test should not load" );
+			Assert.AreEqual( 2, catcher.Events.Count );
+			Assert.AreEqual( TestAction.ProjectLoadFailed, ((TestEventArgs)catcher.Events[1]).Action );
+			Assert.AreEqual( typeof( FileNotFoundException ), ((TestEventArgs)catcher.Events[1]).Exception.GetType() );
+		}
+
+		// Doesn't work under .NET 2.0 Beta 2
+		//[Test]
+		public void InvalidAssembly()
+		{
+			FileInfo file = new FileInfo(badFile);
+			try
+			{
+				StreamWriter sw = file.AppendText();
+				sw.WriteLine("This is a new entry to add to the file");
+				sw.WriteLine("This is yet another line to add...");
+				sw.Flush();
+				sw.Close();
+
+				LoadTest(badFile);
+				Assert.IsTrue(loader.IsProjectLoaded, "Project not loaded");
+				Assert.IsFalse(loader.IsTestLoaded, "Test should not be loaded");
+				Assert.AreEqual(4, catcher.Events.Count);
+				Assert.AreEqual(TestAction.TestLoadFailed, ((TestEventArgs)catcher.Events[3]).Action);
+				Assert.AreEqual(typeof(BadImageFormatException), ((TestEventArgs)catcher.Events[3]).Exception.GetType());
+			}
+			finally
+			{
+				if ( file.Exists )
+				    file.Delete();
+			}
+		}
+
+		[Test]
+		public void AssemblyWithNoTests()
+		{
+			LoadTest( "nunit.framework.dll" );
+			Assert.IsTrue( loader.IsProjectLoaded, "Project not loaded" );
+			Assert.IsTrue( loader.IsTestLoaded, "Test not loaded" );
+			Assert.AreEqual( 4, catcher.Events.Count );
+			Assert.AreEqual( TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action );
+		}
+
+		// TODO: Should wrapper project be unloaded on failure?
+
+		[Test]
+		public void RunTest()
+		{
+            //loader.ReloadOnRun = false;
+			
+			LoadTest( assembly );
+			loader.RunTests(TestFilter.Empty);
+			do 
+			{
+				// TODO: Find a more robust way of handling this
+				Thread.Sleep( 500 );
+			}
+			while( !catcher.GotRunFinished );
+
+            Assert.AreEqual(TestAction.ProjectLoading, ((TestEventArgs)catcher.Events[0]).Action);
+            Assert.AreEqual(TestAction.ProjectLoaded, ((TestEventArgs)catcher.Events[1]).Action);
+            Assert.AreEqual(TestAction.TestLoading, ((TestEventArgs)catcher.Events[2]).Action);
+            Assert.AreEqual(TestAction.TestLoaded, ((TestEventArgs)catcher.Events[3]).Action);
+            Assert.AreEqual(TestAction.RunStarting, ((TestEventArgs)catcher.Events[4]).Action);
+
+            int eventCount = 4 /* for loading */+ 2 * (MockAssembly.Nodes - MockAssembly.Explicit);
+            if (eventCount != catcher.Events.Count)
+                foreach (TestEventArgs e in catcher.Events)
+                    Console.WriteLine(e.Action);
+            Assert.AreEqual(eventCount, catcher.Events.Count);
+
+            Assert.AreEqual(TestAction.RunFinished, ((TestEventArgs)catcher.Events[eventCount - 1]).Action);
+
+			int nTests = 0;
+			int nRun = 0;
+			foreach( object o in catcher.Events )
+			{
+				TestEventArgs e = o as TestEventArgs;
+
+				if ( e != null && e.Action == TestAction.TestFinished )
+				{
+					++nTests;
+					if ( e.Result.Executed )
+						++nRun;
+				}
+			}
+			Assert.AreEqual( MockAssembly.ResultCount, nTests );
+			Assert.AreEqual( MockAssembly.TestsRun, nRun );
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/TestLoaderWatcherTests.cs b/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
index d0b2c61..e7c7982 100644
--- a/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
+++ b/src/ClientUtilities/tests/TestLoaderWatcherTests.cs
@@ -1,167 +1,167 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class TestLoaderWatcherTests
-	{
-		private readonly string assembly = MockAssembly.AssemblyPath;
-		private MockAssemblyWatcher2 mockWatcher;
-		private ITestLoader testLoader;
-		private const string ReloadOnChangeSetting = "Options.TestLoader.ReloadOnChange";
-
-		[SetUp]
-		public void PreprareTestLoader()
-		{
-			// arrange
-			mockWatcher = new MockAssemblyWatcher2();
-			testLoader = new TestLoader(mockWatcher);
-			testLoader.LoadProject(assembly);
-		}
-
-		[TearDown]
-		public void CleanUpSettings()
-		{
-			Services.UserSettings.RemoveSetting(ReloadOnChangeSetting);
-		}
-
-		private void AssertWatcherIsPrepared()
-		{
-			Assert.IsTrue(mockWatcher.IsWatching);
-			Assert.SamePath(assembly, mockWatcher.AssembliesToWatch[0]);
-		}
-
-		[Test]
-		public void LoadShouldStartWatcher()
-		{
-			// act
-			testLoader.LoadTest();
-
-			// assert
-			AssertWatcherIsPrepared();
-            Assert.AreEqual(1, mockWatcher.DelegateCount);
-        }
-
-		[Test]
-		public void ReloadShouldStartWatcher()
-		{
-			// arrange
-			testLoader.LoadTest();
-			mockWatcher.AssembliesToWatch = null;
-			mockWatcher.IsWatching = false;
-
-			// act
-			testLoader.ReloadTest();
-
-			// assert
-			AssertWatcherIsPrepared();
-            Assert.AreEqual(1, mockWatcher.DelegateCount);
-        }
-
-		[Test]
-		public void UnloadShouldStopWatcherAndFreeResources()
-		{
-			// act
-			testLoader.LoadTest();
-			testLoader.UnloadTest();
-
-			// assert
-			Assert.IsFalse(mockWatcher.IsWatching);
-			Assert.IsTrue(mockWatcher.AreResourcesFreed);
-            Assert.AreEqual(0, mockWatcher.DelegateCount);
-        }
-
-		[Test]
-		public void LoadShouldStartWatcherDependingOnSettings()
-		{
-			// arrange
-			Services.UserSettings.SaveSetting(ReloadOnChangeSetting, false);
-			testLoader.LoadTest();
-
-			// assert
-			Assert.IsFalse(mockWatcher.IsWatching);
-            Assert.AreEqual(0, mockWatcher.DelegateCount);
-        }
-
-		[Test]
-		public void ReloadShouldStartWatcherDependingOnSettings()
-		{
-			// arrange
-			Services.UserSettings.SaveSetting(ReloadOnChangeSetting, false);
-			testLoader.LoadTest();
-			testLoader.ReloadTest();
-
-			// assert
-			Assert.IsFalse(mockWatcher.IsWatching);
-            Assert.AreEqual(0, mockWatcher.DelegateCount);
-        }
-	}
-
-	internal class MockAssemblyWatcher2 : IAssemblyWatcher
-	{
-		public bool IsWatching;
-#if CLR_2_0 || CLR_4_0 || CLR_4_0
-        public System.Collections.Generic.IList<string> AssembliesToWatch;
-#else
-		public System.Collections.IList AssembliesToWatch;
-#endif
-		public bool AreResourcesFreed;
-
-		public void Stop()
-		{
-			IsWatching = false;
-		}
-
-		public void Start()
-		{
-			IsWatching = true;
-		}
-
-#if 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)
-#endif
-		{
-			AssembliesToWatch = assemblies;
-		}
-
-		public void Setup(int delayInMs, string assemblyFileName)
-		{
-			Setup(delayInMs, new string[] {assemblyFileName});
-		}
-
-		public void FreeResources()
-		{
-			AreResourcesFreed = true;
-		}
-
-        // This method is not used. It exists only to supress a 
-        // warning about AssemblyChanged never being used
-        public void FireAssemblyChanged(string path)
-        {
-            if (AssemblyChanged != null)
-                AssemblyChanged(path);
-        }
-
-        public int DelegateCount
-        {
-            get 
-            { 
-                return AssemblyChanged == null
-                    ? 0
-                    : AssemblyChanged.GetInvocationList().Length; 
-            }
-        }
-
-		public event AssemblyChangedHandler AssemblyChanged;
-    }
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class TestLoaderWatcherTests
+	{
+		private readonly string assembly = MockAssembly.AssemblyPath;
+		private MockAssemblyWatcher2 mockWatcher;
+		private ITestLoader testLoader;
+		private const string ReloadOnChangeSetting = "Options.TestLoader.ReloadOnChange";
+
+		[SetUp]
+		public void PreprareTestLoader()
+		{
+			// arrange
+			mockWatcher = new MockAssemblyWatcher2();
+			testLoader = new TestLoader(mockWatcher);
+			testLoader.LoadProject(assembly);
+		}
+
+		[TearDown]
+		public void CleanUpSettings()
+		{
+			Services.UserSettings.RemoveSetting(ReloadOnChangeSetting);
+		}
+
+		private void AssertWatcherIsPrepared()
+		{
+			Assert.IsTrue(mockWatcher.IsWatching);
+			Assert.SamePath(assembly, mockWatcher.AssembliesToWatch[0]);
+		}
+
+		[Test]
+		public void LoadShouldStartWatcher()
+		{
+			// act
+			testLoader.LoadTest();
+
+			// assert
+			AssertWatcherIsPrepared();
+            Assert.AreEqual(1, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void ReloadShouldStartWatcher()
+		{
+			// arrange
+			testLoader.LoadTest();
+			mockWatcher.AssembliesToWatch = null;
+			mockWatcher.IsWatching = false;
+
+			// act
+			testLoader.ReloadTest();
+
+			// assert
+			AssertWatcherIsPrepared();
+            Assert.AreEqual(1, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void UnloadShouldStopWatcherAndFreeResources()
+		{
+			// act
+			testLoader.LoadTest();
+			testLoader.UnloadTest();
+
+			// assert
+			Assert.IsFalse(mockWatcher.IsWatching);
+			Assert.IsTrue(mockWatcher.AreResourcesFreed);
+            Assert.AreEqual(0, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void LoadShouldStartWatcherDependingOnSettings()
+		{
+			// arrange
+			Services.UserSettings.SaveSetting(ReloadOnChangeSetting, false);
+			testLoader.LoadTest();
+
+			// assert
+			Assert.IsFalse(mockWatcher.IsWatching);
+            Assert.AreEqual(0, mockWatcher.DelegateCount);
+        }
+
+		[Test]
+		public void ReloadShouldStartWatcherDependingOnSettings()
+		{
+			// arrange
+			Services.UserSettings.SaveSetting(ReloadOnChangeSetting, false);
+			testLoader.LoadTest();
+			testLoader.ReloadTest();
+
+			// assert
+			Assert.IsFalse(mockWatcher.IsWatching);
+            Assert.AreEqual(0, mockWatcher.DelegateCount);
+        }
+	}
+
+	internal class MockAssemblyWatcher2 : IAssemblyWatcher
+	{
+		public bool IsWatching;
+#if CLR_2_0 || CLR_4_0 || CLR_4_0
+        public System.Collections.Generic.IList<string> AssembliesToWatch;
+#else
+		public System.Collections.IList AssembliesToWatch;
+#endif
+		public bool AreResourcesFreed;
+
+		public void Stop()
+		{
+			IsWatching = false;
+		}
+
+		public void Start()
+		{
+			IsWatching = true;
+		}
+
+#if 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)
+#endif
+		{
+			AssembliesToWatch = assemblies;
+		}
+
+		public void Setup(int delayInMs, string assemblyFileName)
+		{
+			Setup(delayInMs, new string[] {assemblyFileName});
+		}
+
+		public void FreeResources()
+		{
+			AreResourcesFreed = true;
+		}
+
+        // This method is not used. It exists only to supress a 
+        // warning about AssemblyChanged never being used
+        public void FireAssemblyChanged(string path)
+        {
+            if (AssemblyChanged != null)
+                AssemblyChanged(path);
+        }
+
+        public int DelegateCount
+        {
+            get 
+            { 
+                return AssemblyChanged == null
+                    ? 0
+                    : AssemblyChanged.GetInvocationList().Length; 
+            }
+        }
+
+		public event AssemblyChangedHandler AssemblyChanged;
+    }
 }
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/TestRunnerFactoryTests.cs b/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
index 2d7639e..e4567be 100644
--- a/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
+++ b/src/ClientUtilities/tests/TestRunnerFactoryTests.cs
@@ -1,53 +1,53 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Util.Tests
-{
-    [TestFixture]
-    public class TestRunnerFactoryTests
-    {
-        private RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
-        private string testDll = "/test.dll";
-        private DefaultTestRunnerFactory factory;
-        private TestPackage package;
-
-        [SetUp]
-        public void Init()
-        {
-            factory = new DefaultTestRunnerFactory();
-            package = new TestPackage(testDll);
-        }
-
-        [Test]
-        public void SameFrameworkUsesTestDomain()
-        {
-            package.Settings["RuntimeFramework"] = currentFramework;
-            Assert.That( factory.MakeTestRunner(package), Is.TypeOf(typeof(TestDomain)));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void DifferentRuntimeUsesProcessRunner()
-        {
-            RuntimeType runtime = currentFramework.Runtime == RuntimeType.Net
-                ? RuntimeType.Mono : RuntimeType.Net;
-            package.Settings["RuntimeFramework"] = new RuntimeFramework(runtime, currentFramework.ClrVersion);
-            Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
-        }
-
-        [Test]
-        public void DifferentVersionUsesProcessRunner()
-        {
-            int major = currentFramework.ClrVersion.Major == 2 ? 4 : 2;
-            package.Settings["RuntimeFramework"] = new RuntimeFramework(currentFramework.Runtime, new Version(major,0));
-            Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
-        }
-#endif
-    }
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util.Tests
+{
+    [TestFixture]
+    public class TestRunnerFactoryTests
+    {
+        private RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+        private string testDll = "/test.dll";
+        private DefaultTestRunnerFactory factory;
+        private TestPackage package;
+
+        [SetUp]
+        public void Init()
+        {
+            factory = new DefaultTestRunnerFactory();
+            package = new TestPackage(testDll);
+        }
+
+        [Test]
+        public void SameFrameworkUsesTestDomain()
+        {
+            package.Settings["RuntimeFramework"] = currentFramework;
+            Assert.That( factory.MakeTestRunner(package), Is.TypeOf(typeof(TestDomain)));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void DifferentRuntimeUsesProcessRunner()
+        {
+            RuntimeType runtime = currentFramework.Runtime == RuntimeType.Net
+                ? RuntimeType.Mono : RuntimeType.Net;
+            package.Settings["RuntimeFramework"] = new RuntimeFramework(runtime, currentFramework.ClrVersion);
+            Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
+        }
+
+        [Test]
+        public void DifferentVersionUsesProcessRunner()
+        {
+            int major = currentFramework.ClrVersion.Major == 2 ? 4 : 2;
+            package.Settings["RuntimeFramework"] = new RuntimeFramework(currentFramework.Runtime, new Version(major,0));
+            Assert.That(factory.MakeTestRunner(package), Is.TypeOf(typeof(ProcessRunner)));
+        }
+#endif
+    }
+}
diff --git a/src/ClientUtilities/tests/TestServerTests.cs b/src/ClientUtilities/tests/TestServerTests.cs
index 50d1c73..5111eaa 100644
--- a/src/ClientUtilities/tests/TestServerTests.cs
+++ b/src/ClientUtilities/tests/TestServerTests.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using System.Diagnostics;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Framework;
-using NUnit.Core;
-
-namespace NUnit.Util.Tests
-{
-	/// <summary>
-	/// Summary description for TestServerTests.
-	/// </summary>
-	// Exclude for release [TestFixture,Platform(Exclude="Mono")]
-    //public class TestServerTests
-    //{
-    //    private string serverPath = "nunit-server.exe";
-
-    //    [TestFixtureSetUp]
-    //    public void SetServerPath()
-    //    {
-    //        if ( File.Exists(serverPath) )
-    //            return;
-
-    //        DirectoryInfo cwd = new DirectoryInfo( Environment.CurrentDirectory );
-    //        if( cwd.Parent.Name == "bin" )
-    //        {
-    //            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 = filePath;
-    //                return;
-    //            }
-    //        }
-
-    //        Assert.Fail( "Unable to find server" );
-    //    }
-
-    //    [Test]
-    //    public void CanConnect()
-    //    {
-    //        using( TestServer server = new TestServer( "TestServer", 9000 ) )
-    //        {
-    //            server.Start();
-    //            object obj = Activator.GetObject( typeof(TestRunner), ServerUtilities.MakeUrl("TestServer", 9000) );
-    //            Assert.IsNotNull( obj, "Unable to connect" );
-    //        }
-    //    }
-
-    //    [Test]
-    //    public void CanConnectOutOfProcess()
-    //    {
-    //        Process process = null;
-    //        try
-    //        {
-    //            process = Process.Start( serverPath, "TestServer" );
-    //            System.Threading.Thread.Sleep( 1000 );
-    //            TestServer server = (TestServer)Activator.GetObject( typeof(TestRunner), "tcp://localhost:9000/TestServer" );
-    //            Assert.IsNotNull( server, "Unable to connect" );
-    //            server.Stop();
-    //        }
-    //        finally
-    //        {
-    //            if ( process != null && !process.HasExited )
-    //                process.Kill();
-    //        }
-    //    }
-    //}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Framework;
+using NUnit.Core;
+
+namespace NUnit.Util.Tests
+{
+	/// <summary>
+	/// Summary description for TestServerTests.
+	/// </summary>
+	// Exclude for release [TestFixture,Platform(Exclude="Mono")]
+    //public class TestServerTests
+    //{
+    //    private string serverPath = "nunit-server.exe";
+
+    //    [TestFixtureSetUp]
+    //    public void SetServerPath()
+    //    {
+    //        if ( File.Exists(serverPath) )
+    //            return;
+
+    //        DirectoryInfo cwd = new DirectoryInfo( Environment.CurrentDirectory );
+    //        if( cwd.Parent.Name == "bin" )
+    //        {
+    //            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 = filePath;
+    //                return;
+    //            }
+    //        }
+
+    //        Assert.Fail( "Unable to find server" );
+    //    }
+
+    //    [Test]
+    //    public void CanConnect()
+    //    {
+    //        using( TestServer server = new TestServer( "TestServer", 9000 ) )
+    //        {
+    //            server.Start();
+    //            object obj = Activator.GetObject( typeof(TestRunner), ServerUtilities.MakeUrl("TestServer", 9000) );
+    //            Assert.IsNotNull( obj, "Unable to connect" );
+    //        }
+    //    }
+
+    //    [Test]
+    //    public void CanConnectOutOfProcess()
+    //    {
+    //        Process process = null;
+    //        try
+    //        {
+    //            process = Process.Start( serverPath, "TestServer" );
+    //            System.Threading.Thread.Sleep( 1000 );
+    //            TestServer server = (TestServer)Activator.GetObject( typeof(TestRunner), "tcp://localhost:9000/TestServer" );
+    //            Assert.IsNotNull( server, "Unable to connect" );
+    //            server.Stop();
+    //        }
+    //        finally
+    //        {
+    //            if ( process != null && !process.HasExited )
+    //                process.Kill();
+    //        }
+    //    }
+    //}
+}
diff --git a/src/ClientUtilities/tests/VSProjectTests.cs b/src/ClientUtilities/tests/VSProjectTests.cs
index 32fe486..620f10c 100644
--- a/src/ClientUtilities/tests/VSProjectTests.cs
+++ b/src/ClientUtilities/tests/VSProjectTests.cs
@@ -1,224 +1,224 @@
-// ****************************************************************
-// 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.Collections;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.Util.Tests.resources;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class VSProjectTests
-	{
-		private string invalidFile = Path.Combine(Path.GetTempPath(), "invalid.csproj");
-
-		private void WriteInvalidFile( string text )
-		{
-			StreamWriter writer = new StreamWriter( invalidFile );
-			writer.WriteLine( text );
-			writer.Close();
-		}
-
-		[TearDown]
-		public void EraseInvalidFile()
-		{
-			if ( File.Exists( invalidFile ) )
-				File.Delete( invalidFile );
-		}
-
-		[Test]
-		public void SolutionExtension()
-		{
-			Assert.IsTrue( VSProject.IsSolutionFile( TestPath( @"/x/y/project.sln" ) ) );
-			Assert.IsFalse( VSProject.IsSolutionFile( TestPath( @"/x/y/project.sol" ) ) );
-		}
-
-		[Test]
-		public void ProjectExtensions()
-		{
-			Assert.IsTrue( VSProject.IsProjectFile( TestPath( @"/x/y/project.csproj" ) ) );
-			Assert.IsTrue( VSProject.IsProjectFile( TestPath( @"/x/y/project.vbproj" ) ) );
-			Assert.IsTrue( VSProject.IsProjectFile( TestPath( @"/x/y/project.vcproj" ) ) );
-			Assert.IsFalse( VSProject.IsProjectFile( TestPath( @"/x/y/project.xyproj" ) ) );
-		}
-
-		[Test]
-		public void NotWebProject()
-		{
-			Assert.IsFalse(VSProject.IsProjectFile( @"http://localhost/web.csproj") );
-			Assert.IsFalse(VSProject.IsProjectFile( @"\MyProject\http://localhost/web.csproj") );
-		}
-
-		private void AssertCanLoadProject( string resourceName )
-		{
-			string fileName = Path.GetFileNameWithoutExtension( resourceName );
-
-            using (TestResource file = new TestResource(resourceName))
-			{
-				VSProject project = new VSProject( file.Path );
-				Assert.AreEqual( fileName, project.Name );
-				Assert.AreEqual( Path.GetFullPath( file.Path ), project.ProjectPath );
-				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToString().ToLower() ) );
-			}
-		}
-
-		[Test]
-		public void LoadCsharpProject()
-		{
-			AssertCanLoadProject( "csharp-sample.csproj" );
-		}
-
-		[Test]
-		public void LoadCsharpProjectVS2005()
-		{
-			AssertCanLoadProject( "csharp-sample_VS2005.csproj" );
-		}
-
-		[Test]
-		public void LoadVbProject()
-		{
-			AssertCanLoadProject( "vb-sample.vbproj" );
-		}
-
-
-		[Test]
-		public void LoadVbProjectVS2005()
-		{
-			AssertCanLoadProject( "vb-sample_VS2005.vbproj" );
-		}
-
-		[Test]
-		public void LoadJsharpProject()
-		{
-			AssertCanLoadProject( "jsharp.vjsproj" );
-		}
-
-		[Test]
-		public void LoadJsharpProjectVS2005()
-		{
-			AssertCanLoadProject( "jsharp_VS2005.vjsproj" );
-		}
-
-		[Test]
-		public void LoadCppProject()
-		{
-			AssertCanLoadProject( "cpp-sample.vcproj" );
-		}
-
-		[Test]
-		public void LoadCppProjectVS2005()
-		{
-			AssertCanLoadProject( "cpp-sample_VS2005.vcproj" );
-		}
-
-		[Test]
-		public void LoadProjectWithHebrewFileIncluded()
-		{
-			AssertCanLoadProject( "HebrewFileProblem.csproj" );
-		}
-
-        [Test]
-        public void LoadProjectWithMissingOutputPath()
-        {
-            AssertCanLoadProject("MissingOutputPath.csproj");
-        }
-
-		[Test]
-		public void LoadCppProjectWithMacros()
-		{
-            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.Combine(Path.GetTempPath(), @"debug\cpplibrary.dll" ).ToLower(), 
-					project.Configs["Debug|Win32"].Assemblies[0].ToString().ToLower());
-				Assert.AreEqual( 
-                    Path.Combine(Path.GetTempPath(), @"release\cpplibrary.dll" ).ToLower(), 
-					project.Configs["Release|Win32"].Assemblies[0].ToString().ToLower());
-			}
-		}
-
-        [Test]
-        public void GenerateCorrectExtensionsFromVCProjectVS2005()     
-		{
-            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.Combine(Path.GetTempPath(), TestPath( @"debug/cpp-default-library_VS2005.dll" ) ).ToLower(),
-                    project.Configs["Debug|Win32"].Assemblies[0].ToString().ToLower());
-                Assert.AreEqual(
-                    Path.Combine(Path.GetTempPath(), TestPath( @"release/cpp-default-library_VS2005.dll" ) ).ToLower(),
-                    project.Configs["Release|Win32"].Assemblies[0].ToString().ToLower());
-            }
-        }
-
-		[Test, ExpectedException( typeof ( ArgumentException ) ) ]
-		public void LoadInvalidFileType()
-		{
-			new VSProject( @"/test.junk" );
-		}
-
-		[Test, ExpectedException( typeof ( FileNotFoundException ) ) ]
-		public void FileNotFoundError()
-		{
-			new VSProject( @"/junk.csproj" );
-		}
-
-		[Test, ExpectedException( typeof( ArgumentException ) )]
-		public void InvalidXmlFormat()
-		{
-			WriteInvalidFile( "<VisualStudioProject><junk></VisualStudioProject>" );
-			new VSProject( Path.Combine(Path.GetTempPath(), "invalid.csproj" ));
-		}
-
-		[Test, ExpectedException( typeof( ArgumentException ) )]
-		public void InvalidProjectFormat()
-		{
-			WriteInvalidFile( "<VisualStudioProject><junk></junk></VisualStudioProject>" );
-			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( 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( Path.Combine(Path.GetTempPath(),"invalid.csproj" ));
-			Assert.AreEqual( 0, project.Configs.Count );
-		}
-
-		/// <summary>
-		/// 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
-		/// filePath starts with a slash, add C: in front of it.
-		/// </summary>
-		private string TestPath(string path)
-		{
-			if (Path.DirectorySeparatorChar != '/')
-			{
-				path = path.Replace('/', Path.DirectorySeparatorChar);
-				if (path[0] == Path.DirectorySeparatorChar)
-					path = "C:" + path;
-			}
-
-			return path;
-		}
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.Util.Tests.resources;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class VSProjectTests
+	{
+		private string invalidFile = Path.Combine(Path.GetTempPath(), "invalid.csproj");
+
+		private void WriteInvalidFile( string text )
+		{
+			StreamWriter writer = new StreamWriter( invalidFile );
+			writer.WriteLine( text );
+			writer.Close();
+		}
+
+		[TearDown]
+		public void EraseInvalidFile()
+		{
+			if ( File.Exists( invalidFile ) )
+				File.Delete( invalidFile );
+		}
+
+		[Test]
+		public void SolutionExtension()
+		{
+			Assert.IsTrue( VSProject.IsSolutionFile( TestPath( @"/x/y/project.sln" ) ) );
+			Assert.IsFalse( VSProject.IsSolutionFile( TestPath( @"/x/y/project.sol" ) ) );
+		}
+
+		[Test]
+		public void ProjectExtensions()
+		{
+			Assert.IsTrue( VSProject.IsProjectFile( TestPath( @"/x/y/project.csproj" ) ) );
+			Assert.IsTrue( VSProject.IsProjectFile( TestPath( @"/x/y/project.vbproj" ) ) );
+			Assert.IsTrue( VSProject.IsProjectFile( TestPath( @"/x/y/project.vcproj" ) ) );
+			Assert.IsFalse( VSProject.IsProjectFile( TestPath( @"/x/y/project.xyproj" ) ) );
+		}
+
+		[Test]
+		public void NotWebProject()
+		{
+			Assert.IsFalse(VSProject.IsProjectFile( @"http://localhost/web.csproj") );
+			Assert.IsFalse(VSProject.IsProjectFile( @"\MyProject\http://localhost/web.csproj") );
+		}
+
+		private void AssertCanLoadProject( string resourceName )
+		{
+			string fileName = Path.GetFileNameWithoutExtension( resourceName );
+
+            using (TestResource file = new TestResource(resourceName))
+			{
+				VSProject project = new VSProject( file.Path );
+				Assert.AreEqual( fileName, project.Name );
+				Assert.AreEqual( Path.GetFullPath( file.Path ), project.ProjectPath );
+				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToString().ToLower() ) );
+			}
+		}
+
+		[Test]
+		public void LoadCsharpProject()
+		{
+			AssertCanLoadProject( "csharp-sample.csproj" );
+		}
+
+		[Test]
+		public void LoadCsharpProjectVS2005()
+		{
+			AssertCanLoadProject( "csharp-sample_VS2005.csproj" );
+		}
+
+		[Test]
+		public void LoadVbProject()
+		{
+			AssertCanLoadProject( "vb-sample.vbproj" );
+		}
+
+
+		[Test]
+		public void LoadVbProjectVS2005()
+		{
+			AssertCanLoadProject( "vb-sample_VS2005.vbproj" );
+		}
+
+		[Test]
+		public void LoadJsharpProject()
+		{
+			AssertCanLoadProject( "jsharp.vjsproj" );
+		}
+
+		[Test]
+		public void LoadJsharpProjectVS2005()
+		{
+			AssertCanLoadProject( "jsharp_VS2005.vjsproj" );
+		}
+
+		[Test]
+		public void LoadCppProject()
+		{
+			AssertCanLoadProject( "cpp-sample.vcproj" );
+		}
+
+		[Test]
+		public void LoadCppProjectVS2005()
+		{
+			AssertCanLoadProject( "cpp-sample_VS2005.vcproj" );
+		}
+
+		[Test]
+		public void LoadProjectWithHebrewFileIncluded()
+		{
+			AssertCanLoadProject( "HebrewFileProblem.csproj" );
+		}
+
+        [Test]
+        public void LoadProjectWithMissingOutputPath()
+        {
+            AssertCanLoadProject("MissingOutputPath.csproj");
+        }
+
+		[Test]
+		public void LoadCppProjectWithMacros()
+		{
+            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.Combine(Path.GetTempPath(), @"debug\cpplibrary.dll" ).ToLower(), 
+					project.Configs["Debug|Win32"].Assemblies[0].ToString().ToLower());
+				Assert.AreEqual( 
+                    Path.Combine(Path.GetTempPath(), @"release\cpplibrary.dll" ).ToLower(), 
+					project.Configs["Release|Win32"].Assemblies[0].ToString().ToLower());
+			}
+		}
+
+        [Test]
+        public void GenerateCorrectExtensionsFromVCProjectVS2005()     
+		{
+            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.Combine(Path.GetTempPath(), TestPath( @"debug/cpp-default-library_VS2005.dll" ) ).ToLower(),
+                    project.Configs["Debug|Win32"].Assemblies[0].ToString().ToLower());
+                Assert.AreEqual(
+                    Path.Combine(Path.GetTempPath(), TestPath( @"release/cpp-default-library_VS2005.dll" ) ).ToLower(),
+                    project.Configs["Release|Win32"].Assemblies[0].ToString().ToLower());
+            }
+        }
+
+		[Test, ExpectedException( typeof ( ArgumentException ) ) ]
+		public void LoadInvalidFileType()
+		{
+			new VSProject( @"/test.junk" );
+		}
+
+		[Test, ExpectedException( typeof ( FileNotFoundException ) ) ]
+		public void FileNotFoundError()
+		{
+			new VSProject( @"/junk.csproj" );
+		}
+
+		[Test, ExpectedException( typeof( ArgumentException ) )]
+		public void InvalidXmlFormat()
+		{
+			WriteInvalidFile( "<VisualStudioProject><junk></VisualStudioProject>" );
+			new VSProject( Path.Combine(Path.GetTempPath(), "invalid.csproj" ));
+		}
+
+		[Test, ExpectedException( typeof( ArgumentException ) )]
+		public void InvalidProjectFormat()
+		{
+			WriteInvalidFile( "<VisualStudioProject><junk></junk></VisualStudioProject>" );
+			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( 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( Path.Combine(Path.GetTempPath(),"invalid.csproj" ));
+			Assert.AreEqual( 0, project.Configs.Count );
+		}
+
+		/// <summary>
+		/// 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
+		/// filePath starts with a slash, add C: in front of it.
+		/// </summary>
+		private string TestPath(string path)
+		{
+			if (Path.DirectorySeparatorChar != '/')
+			{
+				path = path.Replace('/', Path.DirectorySeparatorChar);
+				if (path[0] == Path.DirectorySeparatorChar)
+					path = "C:" + path;
+			}
+
+			return path;
+		}
+	}
+}
diff --git a/src/ClientUtilities/tests/VisualStudioConverterTests.cs b/src/ClientUtilities/tests/VisualStudioConverterTests.cs
index 8143481..2a5ffc1 100644
--- a/src/ClientUtilities/tests/VisualStudioConverterTests.cs
+++ b/src/ClientUtilities/tests/VisualStudioConverterTests.cs
@@ -1,199 +1,199 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.Util.ProjectConverters;
-using NUnit.Util.Tests.resources;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class VisualStudioConverterTests
-	{
-		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( TestResource file = new TestResource(resourceName) ) 
-			{
-				NUnitProject project = converter.ConvertFrom( file.Path );
-				Assert.AreEqual( fileName, project.Name );
-				Assert.AreEqual( project.Configs[0].Name, project.ActiveConfigName );
-				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToLower() ) );
-				Assert.IsTrue( project.IsLoadable, "Not loadable" );
-				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
-			}
-		}
-
-		[SetUp]
-		public void CreateImporter()
-		{
-			converter = new VisualStudioConverter();
-		}
-
-		[Test]
-		public void FromCSharpProject()
-		{
-			AssertCanLoadVsProject( "csharp-sample.csproj" );
-		}
-
-		[Test]
-		public void FromVBProject()
-		{
-			AssertCanLoadVsProject( "vb-sample.vbproj" );
-		}
-
-		[Test]
-		public void FromJsharpProject()
-		{
-			AssertCanLoadVsProject( "jsharp.vjsproj" );
-		}
-
-		[Test]
-		public void FromCppProject()
-		{
-			AssertCanLoadVsProject( "cpp-sample.vcproj" );
-		}
-
-		[Test]
-		public void FromProjectWithHebrewFileIncluded()
-		{
-			AssertCanLoadVsProject( "HebrewFileProblem.csproj" );
-		}
-
-		[Test]
-		public void FromVSSolution2003()
-		{
-			using(new 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 );
-                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" );
-			}
-		}
-
-		[Test]
-		public void FromVSSolution2005()
-		{
-            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 );
-                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" );
-			}
-		}
-
-		[Test]
-		public void FromWebApplication()
-		{
-            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 );
-				Assert.AreEqual( 1, project.Configs["Debug"].Assemblies.Count );
-				Assert.AreEqual( 1, project.Configs["Release"].Assemblies.Count );
-			}
-		}
-
-		[Test]
-		public void WithUnmanagedCpp()
-		{
-            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 );
-                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 (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);
-            }
-		}
-
-        [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");
-            }
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.Util.ProjectConverters;
+using NUnit.Util.Tests.resources;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class VisualStudioConverterTests
+	{
+		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( TestResource file = new TestResource(resourceName) ) 
+			{
+				NUnitProject project = converter.ConvertFrom( file.Path );
+				Assert.AreEqual( fileName, project.Name );
+				Assert.AreEqual( project.Configs[0].Name, project.ActiveConfigName );
+				Assert.AreEqual( fileName.ToLower(), Path.GetFileNameWithoutExtension( project.Configs[0].Assemblies[0].ToLower() ) );
+				Assert.IsTrue( project.IsLoadable, "Not loadable" );
+				Assert.IsFalse( project.IsDirty, "Project should not be dirty" );
+			}
+		}
+
+		[SetUp]
+		public void CreateImporter()
+		{
+			converter = new VisualStudioConverter();
+		}
+
+		[Test]
+		public void FromCSharpProject()
+		{
+			AssertCanLoadVsProject( "csharp-sample.csproj" );
+		}
+
+		[Test]
+		public void FromVBProject()
+		{
+			AssertCanLoadVsProject( "vb-sample.vbproj" );
+		}
+
+		[Test]
+		public void FromJsharpProject()
+		{
+			AssertCanLoadVsProject( "jsharp.vjsproj" );
+		}
+
+		[Test]
+		public void FromCppProject()
+		{
+			AssertCanLoadVsProject( "cpp-sample.vcproj" );
+		}
+
+		[Test]
+		public void FromProjectWithHebrewFileIncluded()
+		{
+			AssertCanLoadVsProject( "HebrewFileProblem.csproj" );
+		}
+
+		[Test]
+		public void FromVSSolution2003()
+		{
+			using(new 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 );
+                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" );
+			}
+		}
+
+		[Test]
+		public void FromVSSolution2005()
+		{
+            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 );
+                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" );
+			}
+		}
+
+		[Test]
+		public void FromWebApplication()
+		{
+            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 );
+				Assert.AreEqual( 1, project.Configs["Debug"].Assemblies.Count );
+				Assert.AreEqual( 1, project.Configs["Release"].Assemblies.Count );
+			}
+		}
+
+		[Test]
+		public void WithUnmanagedCpp()
+		{
+            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 );
+                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 (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);
+            }
+		}
+
+        [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/XmlResultWriterTest.cs b/src/ClientUtilities/tests/XmlResultWriterTest.cs
index b6f4d49..fdcf081 100644
--- a/src/ClientUtilities/tests/XmlResultWriterTest.cs
+++ b/src/ClientUtilities/tests/XmlResultWriterTest.cs
@@ -1,200 +1,200 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core;
-using System.IO;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Xml;
-using System.Globalization;
-
-namespace NUnit.Util.Tests
-{
-	[TestFixture]
-	public class XmlResultWriterTest
-	{
-		private XmlDocument resultDoc;
-
-		[TestFixtureSetUp]
-		public void RunMockTests()
-		{
-			string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
-			TestSuiteBuilder suiteBuilder = new TestSuiteBuilder();
-			Test suite = suiteBuilder.Build( new TestPackage( testsDll ) );
-
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-			StringBuilder builder = new StringBuilder();
-			new XmlResultWriter(new StringWriter(builder)).SaveTestResult(result);
-
-			string resultXml = builder.ToString();
-
-			resultDoc = new XmlDocument();
-			resultDoc.LoadXml(resultXml);
-		}
-
-        [Test, Explicit]
-        public void DemonstrateIllegalSequenceInMessage()
-        {
-            Assert.Fail("Deliberate failure to illustrate ]]> in message ");
-        }
-
-        [Test, Explicit]
-        public void DemonstrateIllegalSequenceAtEndOfMessage()
-        {
-            Assert.Fail("The CDATA was: <![CDATA[ My <xml> ]]>");
-        }
-
-        [Test]
-		public void SuiteResultHasCategories()
-		{
-			XmlNodeList categories = resultDoc.SelectNodes("//test-suite[@name=\"MockTestFixture\"]/categories/category");
-			Assert.IsNotNull(categories);
-			Assert.AreEqual(1, categories.Count);
-			Assert.AreEqual("FixtureCategory", categories[0].Attributes["name"].Value);
-		}
-
-		[Test]
-		public void HasSingleCategory()
-		{
-			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/categories/category");
-			Assert.IsNotNull(categories);
-			Assert.AreEqual(1, categories.Count);
-			Assert.AreEqual("MockCategory", categories[0].Attributes["name"].Value);
-		}
-
-		[Test]
-		public void HasSingleProperty()
-		{
-			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/properties/property[@name=\"Severity\"]");
-			Assert.IsNotNull(properties);
-			Assert.AreEqual(1, properties.Count);
-			Assert.AreEqual("Critical",properties[0].Attributes["value"].Value);
-		}
-
-		[Test]
-		public void HasMultipleCategories()
-		{
-			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category[@name=\"MockCategory\"]");
-			Assert.IsNotNull(categories, "MockCategory not found");
-			categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category[@name=\"AnotherCategory\"]");
-			Assert.IsNotNull(categories, "AnotherCategory not found");
-		}
-
-		[Test]
-		public void HasMultipleProperties()
-		{
-			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"TargetMethod\"]");
-			Assert.AreEqual("SomeClassName", properties[0].Attributes["value"].Value);
-            //properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"TargetType\"]");
-            //Assert.AreEqual("System.Threading.Thread", properties[0].Attributes["value"].Value);
-			properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"Size\"]");
-			Assert.AreEqual("5", properties[0].Attributes["value"].Value);
-		}
-
-		[Test]
-		public void TestHasEnvironmentInfo() 
-		{
-            XmlNode sysinfo = resultDoc.SelectSingleNode("//environment");
-            Assert.IsNotNull(sysinfo);
-			// In theory, we could do some validity checking on the values
-			// of the attributes, but that seems redundant.
-			Assert.IsNotNull(sysinfo.Attributes["nunit-version"]);
-			Assert.IsNotNull(sysinfo.Attributes["clr-version"]);
-			Assert.IsNotNull(sysinfo.Attributes["os-version"]);
-			Assert.IsNotNull(sysinfo.Attributes["platform"]);
-			Assert.IsNotNull(sysinfo.Attributes["cwd"]);
-			Assert.IsNotNull(sysinfo.Attributes["machine-name"]);
-			Assert.IsNotNull(sysinfo.Attributes["user"]);
-			Assert.IsNotNull(sysinfo.Attributes["user-domain"]);
-			
-		}
-
-		[Test]
-		public void TestHasCultureInfo() 
-		{
-			XmlNode cultureInfo = resultDoc.SelectSingleNode("//culture-info");
-			Assert.IsNotNull(cultureInfo);
-			Assert.IsNotNull(cultureInfo.Attributes["current-culture"]);
-			Assert.IsNotNull(cultureInfo.Attributes["current-uiculture"]);
-
-			String currentCulture = cultureInfo.Attributes["current-culture"].Value;
-			String currentUiCulture = cultureInfo.Attributes["current-uiculture"].Value;
-
-			String currentCultureOnMachine = CultureInfo.CurrentCulture.ToString();
-			String currentUiCultureOnMachine = CultureInfo.CurrentUICulture.ToString();
-			Assert.AreEqual(currentCultureOnMachine, currentCulture,
-				"Current Culture node did not contain the same culture name as the machine");
-			Assert.AreEqual(currentUiCultureOnMachine, currentUiCulture,
-				"Current UI Culture node did not contain the same Culture UI name as the machine");
-		}
-
-        [Test]
-        public void FailingTestHasCorrectInformation()
-        {
-            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.FailingTest\"]");
-            Assert.AreEqual("Failure", testNode.Attributes["result"].Value);
-            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
-            Assert.AreEqual("False", testNode.Attributes["success"].Value);
-
-            XmlNode failureNode = testNode.SelectSingleNode("failure");
-            Assert.NotNull(failureNode, "No <failure> element");
-
-            XmlNode msgNode = failureNode.SelectSingleNode("message");
-            Assert.NotNull(msgNode, "No <message> element");
-            Assert.AreEqual("Intentional failure", msgNode.InnerText);
-
-            XmlNode stackNode = failureNode.SelectSingleNode("stack-trace");
-            Assert.NotNull(stackNode, "No <stack-trace> element");
-        }
-
-        [Test]
-        public void IgnoredTestHasCorrectInformation()
-        {
-            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest4\"]");
-            Assert.AreEqual("Ignored", testNode.Attributes["result"].Value);
-            Assert.AreEqual("False", testNode.Attributes["executed"].Value);
-
-            XmlNode reasonNode = testNode.SelectSingleNode("reason");
-            Assert.NotNull(reasonNode, "No <reason> element");
-            XmlNode msgNode = reasonNode.SelectSingleNode("message");
-            Assert.NotNull(msgNode, "No <message> element");
-            Assert.AreEqual("ignoring this test method for now", msgNode.InnerText);
-        }
-
-        [Test]
-        public void PassingTestHasCorrectInformation()
-        {
-            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]");
-            Assert.AreEqual("Success", testNode.Attributes["result"].Value);
-            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
-            Assert.AreEqual("True", testNode.Attributes["success"].Value);
-
-            XmlNode reasonNode = testNode.SelectSingleNode("reason");
-            Assert.NotNull(reasonNode, "No <reason> element");
-            XmlNode msgNode = reasonNode.SelectSingleNode("message");
-            Assert.NotNull(msgNode, "No <message> element");
-            Assert.AreEqual("Succeeded!", msgNode.InnerText);
-        }
-
-        [Test]
-        public void InconclusiveTestHasCorrectInformation()
-        {
-            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.InconclusiveTest\"]");
-            Assert.AreEqual("Inconclusive", testNode.Attributes["result"].Value);
-            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
-            Assert.AreEqual("False", testNode.Attributes["success"].Value);
-
-            XmlNode reasonNode = testNode.SelectSingleNode("reason");
-            Assert.NotNull(reasonNode, "No <reason> element");
-            XmlNode msgNode = reasonNode.SelectSingleNode("message");
-            Assert.NotNull(msgNode, "No <message> element");
-            Assert.AreEqual("No valid data", msgNode.InnerText);
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Globalization;
+
+namespace NUnit.Util.Tests
+{
+	[TestFixture]
+	public class XmlResultWriterTest
+	{
+		private XmlDocument resultDoc;
+
+		[TestFixtureSetUp]
+		public void RunMockTests()
+		{
+			string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
+			TestSuiteBuilder suiteBuilder = new TestSuiteBuilder();
+			Test suite = suiteBuilder.Build( new TestPackage( testsDll ) );
+
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+			StringBuilder builder = new StringBuilder();
+			new XmlResultWriter(new StringWriter(builder)).SaveTestResult(result);
+
+			string resultXml = builder.ToString();
+
+			resultDoc = new XmlDocument();
+			resultDoc.LoadXml(resultXml);
+		}
+
+        [Test, Explicit]
+        public void DemonstrateIllegalSequenceInMessage()
+        {
+            Assert.Fail("Deliberate failure to illustrate ]]> in message ");
+        }
+
+        [Test, Explicit]
+        public void DemonstrateIllegalSequenceAtEndOfMessage()
+        {
+            Assert.Fail("The CDATA was: <![CDATA[ My <xml> ]]>");
+        }
+
+        [Test]
+		public void SuiteResultHasCategories()
+		{
+			XmlNodeList categories = resultDoc.SelectNodes("//test-suite[@name=\"MockTestFixture\"]/categories/category");
+			Assert.IsNotNull(categories);
+			Assert.AreEqual(1, categories.Count);
+			Assert.AreEqual("FixtureCategory", categories[0].Attributes["name"].Value);
+		}
+
+		[Test]
+		public void HasSingleCategory()
+		{
+			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/categories/category");
+			Assert.IsNotNull(categories);
+			Assert.AreEqual(1, categories.Count);
+			Assert.AreEqual("MockCategory", categories[0].Attributes["name"].Value);
+		}
+
+		[Test]
+		public void HasSingleProperty()
+		{
+			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest2\"]/properties/property[@name=\"Severity\"]");
+			Assert.IsNotNull(properties);
+			Assert.AreEqual(1, properties.Count);
+			Assert.AreEqual("Critical",properties[0].Attributes["value"].Value);
+		}
+
+		[Test]
+		public void HasMultipleCategories()
+		{
+			XmlNodeList categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category[@name=\"MockCategory\"]");
+			Assert.IsNotNull(categories, "MockCategory not found");
+			categories = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]/categories/category[@name=\"AnotherCategory\"]");
+			Assert.IsNotNull(categories, "AnotherCategory not found");
+		}
+
+		[Test]
+		public void HasMultipleProperties()
+		{
+			XmlNodeList properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"TargetMethod\"]");
+			Assert.AreEqual("SomeClassName", properties[0].Attributes["value"].Value);
+            //properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"TargetType\"]");
+            //Assert.AreEqual("System.Threading.Thread", properties[0].Attributes["value"].Value);
+			properties = resultDoc.SelectNodes("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.TestWithManyProperties\"]/properties/property[@name=\"Size\"]");
+			Assert.AreEqual("5", properties[0].Attributes["value"].Value);
+		}
+
+		[Test]
+		public void TestHasEnvironmentInfo() 
+		{
+            XmlNode sysinfo = resultDoc.SelectSingleNode("//environment");
+            Assert.IsNotNull(sysinfo);
+			// In theory, we could do some validity checking on the values
+			// of the attributes, but that seems redundant.
+			Assert.IsNotNull(sysinfo.Attributes["nunit-version"]);
+			Assert.IsNotNull(sysinfo.Attributes["clr-version"]);
+			Assert.IsNotNull(sysinfo.Attributes["os-version"]);
+			Assert.IsNotNull(sysinfo.Attributes["platform"]);
+			Assert.IsNotNull(sysinfo.Attributes["cwd"]);
+			Assert.IsNotNull(sysinfo.Attributes["machine-name"]);
+			Assert.IsNotNull(sysinfo.Attributes["user"]);
+			Assert.IsNotNull(sysinfo.Attributes["user-domain"]);
+			
+		}
+
+		[Test]
+		public void TestHasCultureInfo() 
+		{
+			XmlNode cultureInfo = resultDoc.SelectSingleNode("//culture-info");
+			Assert.IsNotNull(cultureInfo);
+			Assert.IsNotNull(cultureInfo.Attributes["current-culture"]);
+			Assert.IsNotNull(cultureInfo.Attributes["current-uiculture"]);
+
+			String currentCulture = cultureInfo.Attributes["current-culture"].Value;
+			String currentUiCulture = cultureInfo.Attributes["current-uiculture"].Value;
+
+			String currentCultureOnMachine = CultureInfo.CurrentCulture.ToString();
+			String currentUiCultureOnMachine = CultureInfo.CurrentUICulture.ToString();
+			Assert.AreEqual(currentCultureOnMachine, currentCulture,
+				"Current Culture node did not contain the same culture name as the machine");
+			Assert.AreEqual(currentUiCultureOnMachine, currentUiCulture,
+				"Current UI Culture node did not contain the same Culture UI name as the machine");
+		}
+
+        [Test]
+        public void FailingTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.FailingTest\"]");
+            Assert.AreEqual("Failure", testNode.Attributes["result"].Value);
+            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
+            Assert.AreEqual("False", testNode.Attributes["success"].Value);
+
+            XmlNode failureNode = testNode.SelectSingleNode("failure");
+            Assert.NotNull(failureNode, "No <failure> element");
+
+            XmlNode msgNode = failureNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("Intentional failure", msgNode.InnerText);
+
+            XmlNode stackNode = failureNode.SelectSingleNode("stack-trace");
+            Assert.NotNull(stackNode, "No <stack-trace> element");
+        }
+
+        [Test]
+        public void IgnoredTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest4\"]");
+            Assert.AreEqual("Ignored", testNode.Attributes["result"].Value);
+            Assert.AreEqual("False", testNode.Attributes["executed"].Value);
+
+            XmlNode reasonNode = testNode.SelectSingleNode("reason");
+            Assert.NotNull(reasonNode, "No <reason> element");
+            XmlNode msgNode = reasonNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("ignoring this test method for now", msgNode.InnerText);
+        }
+
+        [Test]
+        public void PassingTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.MockTest3\"]");
+            Assert.AreEqual("Success", testNode.Attributes["result"].Value);
+            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
+            Assert.AreEqual("True", testNode.Attributes["success"].Value);
+
+            XmlNode reasonNode = testNode.SelectSingleNode("reason");
+            Assert.NotNull(reasonNode, "No <reason> element");
+            XmlNode msgNode = reasonNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("Succeeded!", msgNode.InnerText);
+        }
+
+        [Test]
+        public void InconclusiveTestHasCorrectInformation()
+        {
+            XmlNode testNode = resultDoc.SelectSingleNode("//test-case[@name=\"NUnit.Tests.Assemblies.MockTestFixture.InconclusiveTest\"]");
+            Assert.AreEqual("Inconclusive", testNode.Attributes["result"].Value);
+            Assert.AreEqual("True", testNode.Attributes["executed"].Value);
+            Assert.AreEqual("False", testNode.Attributes["success"].Value);
+
+            XmlNode reasonNode = testNode.SelectSingleNode("reason");
+            Assert.NotNull(reasonNode, "No <reason> element");
+            XmlNode msgNode = reasonNode.SelectSingleNode("message");
+            Assert.NotNull(msgNode, "No <message> element");
+            Assert.AreEqual("No valid data", msgNode.InnerText);
+        }
+	}
+}
diff --git a/src/ClientUtilities/tests/nunit.util.tests.build b/src/ClientUtilities/tests/nunit.util.tests.build
index 98b3da0..a1bf360 100644
--- a/src/ClientUtilities/tests/nunit.util.tests.build
+++ b/src/ClientUtilities/tests/nunit.util.tests.build
@@ -1,89 +1,89 @@
-<?xml version="1.0"?>
-<project name="NUnit.Util.Tests" default="build">
-
-  <patternset id="source-files">
-    <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">
-    <include name="resources/*"/>
-  </patternset>
-
-  <target name="build">
-
-    <csc target="library" 
-       output="${current.test.dir}/nunit.util.tests.dll"
-       debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <resources prefix="NUnit.Util.Tests.resources">
-        <patternset refid="resource-files"/>
-      </resources>
-      <references>
-        <include name="System.Runtime.Remoting.dll"/>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.framework.dir}/nunit.mocks.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.lib.dir}/nunit-server.dll"/>
-        <include name="${current.test.dir}/nunit.core.tests.dll"/>
-        <include name="${current.test.dir}/test-utilities.dll"/>
-        <include name="${current.test.dir}/mock-assembly.dll"/>
-        <include name="${current.test.dir}/nonamespace-assembly.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/ClientUtilities/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <include name="nunit.util.tests.csproj"/>
-        <include name="nunit.util.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnit.Util.Tests" default="build">
+
+  <patternset id="source-files">
+    <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">
+    <include name="resources/*"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="library" 
+       output="${current.test.dir}/nunit.util.tests.dll"
+       debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <resources prefix="NUnit.Util.Tests.resources">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.mocks.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit-server.dll"/>
+        <include name="${current.test.dir}/nunit.core.tests.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+        <include name="${current.test.dir}/nonamespace-assembly.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/ClientUtilities/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.util.tests.csproj"/>
+        <include name="nunit.util.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/ClientUtilities/tests/nunit.util.tests.csproj b/src/ClientUtilities/tests/nunit.util.tests.csproj
index d7b58b2..f77c6f5 100644
--- a/src/ClientUtilities/tests/nunit.util.tests.csproj
+++ b/src/ClientUtilities/tests/nunit.util.tests.csproj
@@ -1,202 +1,238 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{74EF7165-117E-48ED-98EA-068EAE438E53}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.util.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Util.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0;CLR_2_0;CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0;CLR_2_0;CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Runtime.Remoting">
-      <Name>System.Runtime.Remoting</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
-      <Name>nunit.core.tests</Name>
-      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
-      <Name>mock-assembly</Name>
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
-      <Name>nonamespace-assembly</Name>
-      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
-      <Name>test-utilities</Name>
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="resources\ClassLibrary1.csproj" />
-    <EmbeddedResource Include="resources\csharp-sample.csproj" />
-    <EmbeddedResource Include="resources\csharp-sample_VS2005.csproj" />
-    <EmbeddedResource Include="resources\csharp-sample_VS2005_noplatform.csproj" />
-    <EmbeddedResource Include="resources\HebrewFileProblem.csproj" />
-    <EmbeddedResource Include="resources\jsharp.vjsproj" />
-    <EmbeddedResource Include="resources\jsharp_VS2005.vjsproj" />
-    <EmbeddedResource Include="resources\MultiplePlatformProject.csproj" />
-    <EmbeddedResource Include="resources\samples.sln" />
-    <EmbeddedResource Include="resources\samples_VS2005.sln" />
-    <EmbeddedResource Include="resources\Solution1.sln" />
-    <EmbeddedResource Include="resources\vb-sample.vbproj" />
-    <EmbeddedResource Include="resources\vb-sample_VS2005.vbproj" />
-    <EmbeddedResource Include="resources\WebApplication1.sln" />
-    <EmbeddedResource Include="resources\XNAWindowsProject.csproj" />
-    <EmbeddedResource Include="resources\MissingOutputPath.csproj" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="resources\cpp-default-library_VS2005.vcproj" />
-    <EmbeddedResource Include="resources\cpp-sample.vcproj" />
-    <EmbeddedResource Include="resources\cpp-sample_VS2005.vcproj" />
-    <EmbeddedResource Include="resources\CPPLibrary.vcproj" />
-    <EmbeddedResource Include="resources\MakeFileProject.vcproj" />
-    <EmbeddedResource Include="resources\Unmanaged.vcproj" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyListTests.cs" />
-    <Compile Include="AssemblyWatcherTests.cs" />
-    <Compile Include="CategoryManagerTest.cs" />
-    <Compile Include="CategoryParseTests.cs" />
-    <Compile Include="DomainManagerTests.cs" />
-    <Compile Include="EventDispatcherTests.cs" />
-    <Compile Include="FileWatcherTests.cs" />
-    <Compile Include="MemorySettingsStorageTests.cs" />
-    <Compile Include="MockAssemblyWatcher.cs" />
-    <Compile Include="NUnitProjectLoad.cs" />
-    <Compile Include="NUnitProjectSave.cs" />
-    <Compile Include="NUnitProjectTests.cs" />
-    <Compile Include="NUnitProjectXml.cs" />
-    <Compile Include="NUnitRegistryTests.cs" />
-    <Compile Include="PathUtilTests.cs" />
-    <Compile Include="ProcessRunnerTests.cs" />
-    <Compile Include="ProjectConfigTests.cs" />
-    <Compile Include="RecentFileEntryTests.cs" />
-    <Compile Include="RecentFilesTests.cs" />
-    <Compile Include="RegistrySettingsStorageTests.cs" />
-    <Compile Include="RemoteTestResultTest.cs" />
-    <Compile Include="resources\TestResource.cs" />
-    <Compile Include="RuntimeFrameworkSelectorTests.cs" />
-    <Compile Include="ServerUtilityTests.cs" />
-    <Compile Include="ServiceManagerSetUpFixture.cs" />
-    <Compile Include="SettingsGroupTests.cs" />
-    <Compile Include="SummaryResultFixture.cs" />
-    <Compile Include="TestAgencyTests.cs" />
-    <Compile Include="TestAgentTests.cs" />
-    <Compile Include="TestDomainFixture.cs" />
-    <Compile Include="TestDomainTests_Multiple.cs" />
-    <Compile Include="TestEventCatcher.cs" />
-    <Compile Include="TestLoaderAssemblyTests.cs" />
-    <Compile Include="TestLoaderWatcherTests.cs" />
-    <Compile Include="TestRunnerFactoryTests.cs" />
-    <Compile Include="TestServerTests.cs" />
-    <Compile Include="VisualStudioConverterTests.cs" />
-    <Compile Include="VSProjectTests.cs" />
-    <Compile Include="XmlResultWriterTest.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.util.tests.build" />
-  </ItemGroup>
-  <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>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{74EF7165-117E-48ED-98EA-068EAE438E53}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.util.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Util.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;CLR_2_0;CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0;CLR_2_0;CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
+      <Name>nunit.core.tests</Name>
+      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Name>nonamespace-assembly</Name>
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\ClassLibrary1.csproj" />
+    <EmbeddedResource Include="resources\csharp-sample.csproj" />
+    <EmbeddedResource Include="resources\csharp-sample_VS2005.csproj" />
+    <EmbeddedResource Include="resources\csharp-sample_VS2005_noplatform.csproj" />
+    <EmbeddedResource Include="resources\HebrewFileProblem.csproj" />
+    <EmbeddedResource Include="resources\jsharp.vjsproj" />
+    <EmbeddedResource Include="resources\jsharp_VS2005.vjsproj" />
+    <EmbeddedResource Include="resources\MultiplePlatformProject.csproj" />
+    <EmbeddedResource Include="resources\samples.sln" />
+    <EmbeddedResource Include="resources\samples_VS2005.sln" />
+    <EmbeddedResource Include="resources\Solution1.sln" />
+    <EmbeddedResource Include="resources\vb-sample.vbproj" />
+    <EmbeddedResource Include="resources\vb-sample_VS2005.vbproj" />
+    <EmbeddedResource Include="resources\WebApplication1.sln" />
+    <EmbeddedResource Include="resources\XNAWindowsProject.csproj" />
+    <EmbeddedResource Include="resources\MissingOutputPath.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\cpp-default-library_VS2005.vcproj" />
+    <EmbeddedResource Include="resources\cpp-sample.vcproj" />
+    <EmbeddedResource Include="resources\cpp-sample_VS2005.vcproj" />
+    <EmbeddedResource Include="resources\CPPLibrary.vcproj" />
+    <EmbeddedResource Include="resources\MakeFileProject.vcproj" />
+    <EmbeddedResource Include="resources\Unmanaged.vcproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyListTests.cs" />
+    <Compile Include="AssemblyWatcherTests.cs" />
+    <Compile Include="CategoryManagerTest.cs" />
+    <Compile Include="CategoryParseTests.cs" />
+    <Compile Include="DomainManagerTests.cs" />
+    <Compile Include="EventDispatcherTests.cs" />
+    <Compile Include="FileWatcherTests.cs" />
+    <Compile Include="MemorySettingsStorageTests.cs" />
+    <Compile Include="MockAssemblyWatcher.cs" />
+    <Compile Include="NUnitProjectLoad.cs" />
+    <Compile Include="NUnitProjectSave.cs" />
+    <Compile Include="NUnitProjectTests.cs" />
+    <Compile Include="NUnitProjectXml.cs" />
+    <Compile Include="NUnitRegistryTests.cs" />
+    <Compile Include="PathUtilTests.cs" />
+    <Compile Include="ProcessRunnerTests.cs" />
+    <Compile Include="ProjectConfigTests.cs" />
+    <Compile Include="RecentFileEntryTests.cs" />
+    <Compile Include="RecentFilesTests.cs" />
+    <Compile Include="RegistrySettingsStorageTests.cs" />
+    <Compile Include="RemoteTestResultTest.cs" />
+    <Compile Include="resources\TestResource.cs" />
+    <Compile Include="RuntimeFrameworkSelectorTests.cs" />
+    <Compile Include="ServerUtilityTests.cs" />
+    <Compile Include="ServiceManagerSetUpFixture.cs" />
+    <Compile Include="SettingsGroupTests.cs" />
+    <Compile Include="SummaryResultFixture.cs" />
+    <Compile Include="TestAgencyTests.cs" />
+    <Compile Include="TestAgentTests.cs" />
+    <Compile Include="TestDomainFixture.cs" />
+    <Compile Include="TestDomainTests_Multiple.cs" />
+    <Compile Include="TestEventCatcher.cs" />
+    <Compile Include="TestLoaderAssemblyTests.cs" />
+    <Compile Include="TestLoaderWatcherTests.cs" />
+    <Compile Include="TestRunnerFactoryTests.cs" />
+    <Compile Include="TestServerTests.cs" />
+    <Compile Include="VisualStudioConverterTests.cs" />
+    <Compile Include="VSProjectTests.cs" />
+    <Compile Include="XmlResultWriterTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.util.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\DisabledProject.sln" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\DisabledProject.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="resources\DebugOnly.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/ClientUtilities/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..d05f4cc
Binary files /dev/null and b/src/ClientUtilities/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.csproj.FileListAbsolute.txt b/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..426764c
--- /dev/null
+++ b/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.util.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.util.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\ClientUtilities\tests\obj\Debug\nunit.util.tests.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\ClientUtilities\tests\obj\Debug\nunit.util.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\ClientUtilities\tests\obj\Debug\nunit.util.tests.pdb
diff --git a/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.csprojResolveAssemblyReference.cache b/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..4707ff9
Binary files /dev/null and b/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.pdb b/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.pdb
new file mode 100644
index 0000000..131fc19
Binary files /dev/null and b/src/ClientUtilities/tests/obj/Debug/nunit.util.tests.pdb differ
diff --git a/src/ClientUtilities/tests/resources/CPPLibrary.vcproj b/src/ClientUtilities/tests/resources/CPPLibrary.vcproj
index d60026a..19108c9 100644
--- a/src/ClientUtilities/tests/resources/CPPLibrary.vcproj
+++ b/src/ClientUtilities/tests/resources/CPPLibrary.vcproj
@@ -1,176 +1,176 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="CPPLibrary"
-	ProjectGUID="{B6F3498B-4951-4F97-BB6F-6594D6394A87}"
-	RootNamespace="CPPLibrary"
-	Keyword="ManagedCProj">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="TRUE">
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalOptions="/Zl"
-				Optimization="0"
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				MinimalRebuild="FALSE"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="3"
-				WarningLevel="3"
-				DebugInformationFormat="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalOptions="/noentry"
-				AdditionalDependencies="nochkclr.obj mscoree.lib"
-				OutputFile="$(OutDir)\$(ProjectName).dll"
-				LinkIncremental="2"
-				GenerateDebugInformation="TRUE"
-				AssemblyDebug="1"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="TRUE">
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalOptions="/Zl"
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				MinimalRebuild="FALSE"
-				RuntimeLibrary="0"
-				UsePrecompiledHeader="3"
-				WarningLevel="3"
-				DebugInformationFormat="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalOptions="/noentry"
-				AdditionalDependencies="nochkclr.obj mscoree.lib"
-				OutputFile="$(OutDir)\$(ProjectName).dll"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath="mscorlib.dll"/>
-		<AssemblyReference
-			RelativePath="System.dll"/>
-		<AssemblyReference
-			RelativePath="System.Data.dll"/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-			<File
-				RelativePath=".\AssemblyInfo.cpp">
-			</File>
-			<File
-				RelativePath=".\CPPLibrary.cpp">
-			</File>
-			<File
-				RelativePath=".\Stdafx.cpp">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-			<File
-				RelativePath=".\CPPLibrary.h">
-			</File>
-			<File
-				RelativePath=".\resource.h">
-			</File>
-			<File
-				RelativePath=".\Stdafx.h">
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
-			<File
-				RelativePath=".\app.ico">
-			</File>
-			<File
-				RelativePath=".\app.rc">
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\ReadMe.txt">
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="CPPLibrary"
+	ProjectGUID="{B6F3498B-4951-4F97-BB6F-6594D6394A87}"
+	RootNamespace="CPPLibrary"
+	Keyword="ManagedCProj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2"
+			ManagedExtensions="TRUE">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/Zl"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG"
+				MinimalRebuild="FALSE"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/noentry"
+				AdditionalDependencies="nochkclr.obj mscoree.lib"
+				OutputFile="$(OutDir)\$(ProjectName).dll"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				AssemblyDebug="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="2"
+			ManagedExtensions="TRUE">
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/Zl"
+				PreprocessorDefinitions="WIN32;NDEBUG"
+				MinimalRebuild="FALSE"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/noentry"
+				AdditionalDependencies="nochkclr.obj mscoree.lib"
+				OutputFile="$(OutDir)\$(ProjectName).dll"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<AssemblyReference
+			RelativePath="mscorlib.dll"/>
+		<AssemblyReference
+			RelativePath="System.dll"/>
+		<AssemblyReference
+			RelativePath="System.Data.dll"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath=".\AssemblyInfo.cpp">
+			</File>
+			<File
+				RelativePath=".\CPPLibrary.cpp">
+			</File>
+			<File
+				RelativePath=".\Stdafx.cpp">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath=".\CPPLibrary.h">
+			</File>
+			<File
+				RelativePath=".\resource.h">
+			</File>
+			<File
+				RelativePath=".\Stdafx.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+			<File
+				RelativePath=".\app.ico">
+			</File>
+			<File
+				RelativePath=".\app.rc">
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\ReadMe.txt">
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/src/ClientUtilities/tests/resources/ClassLibrary1.csproj b/src/ClientUtilities/tests/resources/ClassLibrary1.csproj
index 10f4fc6..7397fe1 100644
--- a/src/ClientUtilities/tests/resources/ClassLibrary1.csproj
+++ b/src/ClientUtilities/tests/resources/ClassLibrary1.csproj
@@ -1,93 +1,93 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.0.9466"
-        SchemaVersion = "1.0"
-        ProjectGuid = "{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "ClassLibrary1"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                RootNamespace = "ClassLibrary1"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.XML"
-                    HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.0.9466"
+        SchemaVersion = "1.0"
+        ProjectGuid = "{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "ClassLibrary1"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                RootNamespace = "ClassLibrary1"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "true"
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.XML"
+                    HintPath = "..\..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Class1.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/src/ClientUtilities/tests/resources/DebugOnly.csproj b/src/ClientUtilities/tests/resources/DebugOnly.csproj
index 1f034a7..f50b55a 100644
--- a/src/ClientUtilities/tests/resources/DebugOnly.csproj
+++ b/src/ClientUtilities/tests/resources/DebugOnly.csproj
@@ -1,59 +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>
-  -->
+<?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
index 1fd4aea..b04a372 100644
--- a/src/ClientUtilities/tests/resources/DisabledProject.csproj
+++ b/src/ClientUtilities/tests/resources/DisabledProject.csproj
@@ -1,59 +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>
-  -->
+<?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
index bfca6c9..9b5837f 100644
--- a/src/ClientUtilities/tests/resources/DisabledProject.sln
+++ b/src/ClientUtilities/tests/resources/DisabledProject.sln
@@ -1,25 +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
+
+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/HebrewFileProblem.csproj b/src/ClientUtilities/tests/resources/HebrewFileProblem.csproj
index 8dea116..7b66175 100644
--- a/src/ClientUtilities/tests/resources/HebrewFileProblem.csproj
+++ b/src/ClientUtilities/tests/resources/HebrewFileProblem.csproj
@@ -1,125 +1,125 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{F848EF9E-5D1D-4785-9CCC-D529CD5728F0}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = "App.ico"
-                AssemblyKeyContainerName = ""
-                AssemblyName = "HebrewFileProblem"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = 'copy "$(ProjectDir)\UnitTests\*.txt" "$(TargetDir)" > nul&#xd;&#xa;'
-                RootNamespace = "SomeApp"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.XML"
-                    HintPath = "..\..\..\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework"
-                    AssemblyName = "nunit.framework"
-                    HintPath = "..\..\..\Program Files\NUnit 2.2.2\bin\nunit.framework.dll"
-                    AssemblyFolderKey = "hklm\dn\nunit.framework"
-                />
-                <Reference
-                    Name = "nunit.core"
-                    AssemblyName = "nunit.core"
-                    HintPath = "..\..\..\Program Files\NUnit 2.2.2\bin\nunit.core.dll"
-                    AssemblyFolderKey = "hklm\dn\nunit.framework"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "App.ico"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "Class1.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "UnitTests\SomeTestFixture.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "UnitTests\�����hebrewFile.txt"
-                    BuildAction = "Content"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{F848EF9E-5D1D-4785-9CCC-D529CD5728F0}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = "App.ico"
+                AssemblyKeyContainerName = ""
+                AssemblyName = "HebrewFileProblem"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = 'copy "$(ProjectDir)\UnitTests\*.txt" "$(TargetDir)" > nul&#xd;&#xa;'
+                RootNamespace = "SomeApp"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.XML"
+                    HintPath = "..\..\..\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = "..\..\..\Program Files\NUnit 2.2.2\bin\nunit.framework.dll"
+                    AssemblyFolderKey = "hklm\dn\nunit.framework"
+                />
+                <Reference
+                    Name = "nunit.core"
+                    AssemblyName = "nunit.core"
+                    HintPath = "..\..\..\Program Files\NUnit 2.2.2\bin\nunit.core.dll"
+                    AssemblyFolderKey = "hklm\dn\nunit.framework"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "App.ico"
+                    BuildAction = "Content"
+                />
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "Class1.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "UnitTests\SomeTestFixture.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "UnitTests\�����hebrewFile.txt"
+                    BuildAction = "Content"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/src/ClientUtilities/tests/resources/MakeFileProject.vcproj b/src/ClientUtilities/tests/resources/MakeFileProject.vcproj
index 600b9af..c14395e 100644
--- a/src/ClientUtilities/tests/resources/MakeFileProject.vcproj
+++ b/src/ClientUtilities/tests/resources/MakeFileProject.vcproj
@@ -1,56 +1,56 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="MakeFileProject"
-	ProjectGUID="{69F9692E-8BEA-4C1B-AE8D-A619C251E0D3}"
-	Keyword="MakeFileProj">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="0">
-			<Tool
-				Name="VCNMakeTool"
-				Output="MakeFileProject.exe"/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="0">
-			<Tool
-				Name="VCNMakeTool"
-				Output="MakeFileProject.exe"/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
-		</Filter>
-		<File
-			RelativePath=".\readme.txt">
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="MakeFileProject"
+	ProjectGUID="{69F9692E-8BEA-4C1B-AE8D-A619C251E0D3}"
+	Keyword="MakeFileProj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="0">
+			<Tool
+				Name="VCNMakeTool"
+				Output="MakeFileProject.exe"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="0">
+			<Tool
+				Name="VCNMakeTool"
+				Output="MakeFileProject.exe"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+		</Filter>
+		<File
+			RelativePath=".\readme.txt">
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/src/ClientUtilities/tests/resources/MissingOutputPath.csproj b/src/ClientUtilities/tests/resources/MissingOutputPath.csproj
index 73af5d6..7481c63 100644
--- a/src/ClientUtilities/tests/resources/MissingOutputPath.csproj
+++ b/src/ClientUtilities/tests/resources/MissingOutputPath.csproj
@@ -1,51 +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>
-  -->
+<?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/MultiplePlatformProject.csproj b/src/ClientUtilities/tests/resources/MultiplePlatformProject.csproj
index 9db1102..b6abe2d 100644
--- a/src/ClientUtilities/tests/resources/MultiplePlatformProject.csproj
+++ b/src/ClientUtilities/tests/resources/MultiplePlatformProject.csproj
@@ -1,91 +1,91 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{23FF0E4C-DA55-4CC7-A948-09877A66001F}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>MultiplePlatformProject</RootNamespace>
-    <AssemblyName>MultiplePlatformProject</AssemblyName>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </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>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x64\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x64</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
-    <OutputPath>bin\x64\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x64</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
-    <OutputPath>bin\x86\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Class1.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </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 DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{23FF0E4C-DA55-4CC7-A948-09877A66001F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>MultiplePlatformProject</RootNamespace>
+    <AssemblyName>MultiplePlatformProject</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </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>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisRuleAssemblies>\rules</CodeAnalysisRuleAssemblies>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Class1.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </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/ClientUtilities/tests/resources/Solution1.sln b/src/ClientUtilities/tests/resources/Solution1.sln
index 2f0099c..81b64b6 100644
--- a/src/ClientUtilities/tests/resources/Solution1.sln
+++ b/src/ClientUtilities/tests/resources/Solution1.sln
@@ -1,29 +1,29 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary1", "ClassLibrary1\ClassLibrary1.csproj", "{2F5189E6-19B3-465F-AF2D-41231B38A64E}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Unmanaged", "Unmanaged\Unmanaged.vcproj", "{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Debug.ActiveCfg = Debug|.NET
-		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Debug.Build.0 = Debug|.NET
-		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Release.ActiveCfg = Release|.NET
-		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Release.Build.0 = Release|.NET
-		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Debug.ActiveCfg = Debug|Win32
-		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Debug.Build.0 = Debug|Win32
-		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Release.ActiveCfg = Release|Win32
-		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Release.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary1", "ClassLibrary1\ClassLibrary1.csproj", "{2F5189E6-19B3-465F-AF2D-41231B38A64E}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Unmanaged", "Unmanaged\Unmanaged.vcproj", "{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Debug.ActiveCfg = Debug|.NET
+		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Debug.Build.0 = Debug|.NET
+		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Release.ActiveCfg = Release|.NET
+		{2F5189E6-19B3-465F-AF2D-41231B38A64E}.Release.Build.0 = Release|.NET
+		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Debug.ActiveCfg = Debug|Win32
+		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Debug.Build.0 = Debug|Win32
+		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Release.ActiveCfg = Release|Win32
+		{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/src/ClientUtilities/tests/resources/TestResource.cs b/src/ClientUtilities/tests/resources/TestResource.cs
index 1aad572..cbc3783 100644
--- a/src/ClientUtilities/tests/resources/TestResource.cs
+++ b/src/ClientUtilities/tests/resources/TestResource.cs
@@ -1,17 +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)
-        {
-        }
-    }
-}
+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/tests/resources/Unmanaged.vcproj b/src/ClientUtilities/tests/resources/Unmanaged.vcproj
index a3d867e..9111c62 100644
--- a/src/ClientUtilities/tests/resources/Unmanaged.vcproj
+++ b/src/ClientUtilities/tests/resources/Unmanaged.vcproj
@@ -1,131 +1,131 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="Unmanaged"
-	ProjectGUID="{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}"
-	Keyword="Win32Proj">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="2"
-			CharacterSet="2">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;UNMANAGED_EXPORTS"
-				MinimalRebuild="TRUE"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="TRUE"
-				DebugInformationFormat="4"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/Unmanaged.dll"
-				LinkIncremental="2"
-				GenerateDebugInformation="TRUE"
-				ProgramDatabaseFile="$(OutDir)/Unmanaged.pdb"
-				SubSystem="2"
-				ImportLibrary="$(OutDir)/Unmanaged.lib"
-				TargetMachine="1"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="2"
-			CharacterSet="2">
-			<Tool
-				Name="VCCLCompilerTool"
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;UNMANAGED_EXPORTS"
-				RuntimeLibrary="0"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="TRUE"
-				DebugInformationFormat="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/Unmanaged.dll"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				ImportLibrary="$(OutDir)/Unmanaged.lib"
-				TargetMachine="1"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="Unmanaged"
+	ProjectGUID="{FDBEFC64-EDEF-4645-81EB-C6EA9597170D}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;UNMANAGED_EXPORTS"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/Unmanaged.dll"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/Unmanaged.pdb"
+				SubSystem="2"
+				ImportLibrary="$(OutDir)/Unmanaged.lib"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="2"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;UNMANAGED_EXPORTS"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="TRUE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/Unmanaged.dll"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				ImportLibrary="$(OutDir)/Unmanaged.lib"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/src/ClientUtilities/tests/resources/WebApplication1.sln b/src/ClientUtilities/tests/resources/WebApplication1.sln
index b18f450..1fa52ee 100644
--- a/src/ClientUtilities/tests/resources/WebApplication1.sln
+++ b/src/ClientUtilities/tests/resources/WebApplication1.sln
@@ -1,27 +1,27 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "http://localhost/WebApplication1/WebApplication1.csproj", "{7123B53C-8003-454D-92D1-E9E8C533CBED}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary1", "ClassLibrary1\ClassLibrary1.csproj", "{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}"
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		ConfigName.0 = Debug
-		ConfigName.1 = Release
-	EndGlobalSection
-	GlobalSection(ProjectDependencies) = postSolution
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Debug.ActiveCfg = Debug|.NET
-		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Debug.Build.0 = Debug|.NET
-		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Release.ActiveCfg = Release|.NET
-		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Release.Build.0 = Release|.NET
-		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Debug.ActiveCfg = Debug|.NET
-		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Debug.Build.0 = Debug|.NET
-		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Release.ActiveCfg = Release|.NET
-		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Release.Build.0 = Release|.NET
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 7.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "http://localhost/WebApplication1/WebApplication1.csproj", "{7123B53C-8003-454D-92D1-E9E8C533CBED}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassLibrary1", "ClassLibrary1\ClassLibrary1.csproj", "{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}"
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		ConfigName.0 = Debug
+		ConfigName.1 = Release
+	EndGlobalSection
+	GlobalSection(ProjectDependencies) = postSolution
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Debug.ActiveCfg = Debug|.NET
+		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Debug.Build.0 = Debug|.NET
+		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Release.ActiveCfg = Release|.NET
+		{7123B53C-8003-454D-92D1-E9E8C533CBED}.Release.Build.0 = Release|.NET
+		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Debug.ActiveCfg = Debug|.NET
+		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Debug.Build.0 = Debug|.NET
+		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Release.ActiveCfg = Release|.NET
+		{48E7F6A7-5E5C-4046-AD8E-5381D98D55B8}.Release.Build.0 = Release|.NET
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/src/ClientUtilities/tests/resources/XNAWindowsProject.csproj b/src/ClientUtilities/tests/resources/XNAWindowsProject.csproj
index 6f0c174..f944ffd 100644
--- a/src/ClientUtilities/tests/resources/XNAWindowsProject.csproj
+++ b/src/ClientUtilities/tests/resources/XNAWindowsProject.csproj
@@ -1,81 +1,81 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectGuid>{1BAC9824-B0E8-448F-B91A-80B93B9AB0F6}</ProjectGuid>
-    <ProjectTypeGuids>{6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
-    <OutputType>WinExe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>XNAWindowsProject</RootNamespace>
-    <AssemblyName>XNAWindowsProject</AssemblyName>
-    <XnaFrameworkVersion>v2.0</XnaFrameworkVersion>
-    <XnaPlatform>Windows</XnaPlatform>
-    <XnaCrossPlatformGroupID>587ca330-4151-41aa-a721-18cbd58d91ce</XnaCrossPlatformGroupID>
-    <ApplicationIcon>Game.ico</ApplicationIcon>
-    <Thumbnail>GameThumbnail.png</Thumbnail>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\x86\Debug</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <NoStdLib>true</NoStdLib>
-    <UseVSHostingProcess>false</UseVSHostingProcess>
-    <PlatformTarget>x86</PlatformTarget>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\x86\Release</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <NoStdLib>true</NoStdLib>
-    <UseVSHostingProcess>false</UseVSHostingProcess>
-    <PlatformTarget>x86</PlatformTarget>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Microsoft.Xna.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=x86">
-      <Private>False</Private>
-      <SpecificVersion>True</SpecificVersion>
-    </Reference>
-    <Reference Include="Microsoft.Xna.Framework.Game, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=MSIL">
-      <Private>False</Private>
-      <SpecificVersion>True</SpecificVersion>
-    </Reference>
-    <Reference Include="mscorlib">
-      <Private>False</Private>
-    </Reference>
-    <Reference Include="System">
-      <Private>False</Private>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Program.cs" />
-    <Compile Include="Game1.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="Game.ico" />
-    <Content Include="GameThumbnail.png" />
-  </ItemGroup>
-  <ItemGroup>
-    <NestedContentProject Include="Content\Content.contentproj">
-      <Project>04ff7472-dfb8-4502-90ea-a99a54be6748</Project>
-      <Visible>False</Visible>
-    </NestedContentProject>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\v2.0\Microsoft.Xna.GameStudio.Common.targets" />
-  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\v2.0\Microsoft.Xna.GameStudio.NestedContent.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 DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{1BAC9824-B0E8-448F-B91A-80B93B9AB0F6}</ProjectGuid>
+    <ProjectTypeGuids>{6D335F3A-9D43-41b4-9D22-F6F17C4BE596};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>XNAWindowsProject</RootNamespace>
+    <AssemblyName>XNAWindowsProject</AssemblyName>
+    <XnaFrameworkVersion>v2.0</XnaFrameworkVersion>
+    <XnaPlatform>Windows</XnaPlatform>
+    <XnaCrossPlatformGroupID>587ca330-4151-41aa-a721-18cbd58d91ce</XnaCrossPlatformGroupID>
+    <ApplicationIcon>Game.ico</ApplicationIcon>
+    <Thumbnail>GameThumbnail.png</Thumbnail>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\x86\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\x86\Release</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoStdLib>true</NoStdLib>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Xna.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=x86">
+      <Private>False</Private>
+      <SpecificVersion>True</SpecificVersion>
+    </Reference>
+    <Reference Include="Microsoft.Xna.Framework.Game, Version=2.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=MSIL">
+      <Private>False</Private>
+      <SpecificVersion>True</SpecificVersion>
+    </Reference>
+    <Reference Include="mscorlib">
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System">
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Game1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Game.ico" />
+    <Content Include="GameThumbnail.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <NestedContentProject Include="Content\Content.contentproj">
+      <Project>04ff7472-dfb8-4502-90ea-a99a54be6748</Project>
+      <Visible>False</Visible>
+    </NestedContentProject>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\v2.0\Microsoft.Xna.GameStudio.Common.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\v2.0\Microsoft.Xna.GameStudio.NestedContent.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/cpp-default-library_VS2005.vcproj b/src/ClientUtilities/tests/resources/cpp-default-library_VS2005.vcproj
index 7bf3fad..fa0844f 100644
--- a/src/ClientUtilities/tests/resources/cpp-default-library_VS2005.vcproj
+++ b/src/ClientUtilities/tests/resources/cpp-default-library_VS2005.vcproj
@@ -1,254 +1,254 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="cpp-default-library_VS2005"
-	ProjectGUID="{78092255-BD15-4D67-B3AF-1440FD498760}"
-	RootNamespace="cppdefaultlibrary_VS2005"
-	Keyword="ManagedCProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="1"
-			ManagedExtensions="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="2"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="$(NoInherit)"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				AssemblyDebug="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="1"
-			ManagedExtensions="1"
-			WholeProgramOptimization="1"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="2"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="$(NoInherit)"
-				LinkIncremental="1"
-				GenerateDebugInformation="true"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath="System.dll"
-			AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
-		/>
-		<AssemblyReference
-			RelativePath="System.Data.dll"
-			AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
-		/>
-		<AssemblyReference
-			RelativePath="System.XML.dll"
-			AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
-		/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\AssemblyInfo.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\cpp-default-library_VS2005.cpp"
-				>
-			</File>
-			<File
-				RelativePath=".\Stdafx.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath=".\cpp-default-library_VS2005.h"
-				>
-			</File>
-			<File
-				RelativePath=".\resource.h"
-				>
-			</File>
-			<File
-				RelativePath=".\Stdafx.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
-			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
-			>
-			<File
-				RelativePath=".\app.ico"
-				>
-			</File>
-			<File
-				RelativePath=".\app.rc"
-				>
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\ReadMe.txt"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="cpp-default-library_VS2005"
+	ProjectGUID="{78092255-BD15-4D67-B3AF-1440FD498760}"
+	RootNamespace="cppdefaultlibrary_VS2005"
+	Keyword="ManagedCProj"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="1"
+			ManagedExtensions="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="$(NoInherit)"
+				LinkIncremental="2"
+				GenerateDebugInformation="true"
+				AssemblyDebug="1"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="2"
+			CharacterSet="1"
+			ManagedExtensions="1"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="$(NoInherit)"
+				LinkIncremental="1"
+				GenerateDebugInformation="true"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<AssemblyReference
+			RelativePath="System.dll"
+			AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+		/>
+		<AssemblyReference
+			RelativePath="System.Data.dll"
+			AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
+		/>
+		<AssemblyReference
+			RelativePath="System.XML.dll"
+			AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+		/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\AssemblyInfo.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\cpp-default-library_VS2005.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\Stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath=".\cpp-default-library_VS2005.h"
+				>
+			</File>
+			<File
+				RelativePath=".\resource.h"
+				>
+			</File>
+			<File
+				RelativePath=".\Stdafx.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath=".\app.ico"
+				>
+			</File>
+			<File
+				RelativePath=".\app.rc"
+				>
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\ReadMe.txt"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/src/ClientUtilities/tests/resources/cpp-sample.vcproj b/src/ClientUtilities/tests/resources/cpp-sample.vcproj
index 5b486ca..9f1a215 100644
--- a/src/ClientUtilities/tests/resources/cpp-sample.vcproj
+++ b/src/ClientUtilities/tests/resources/cpp-sample.vcproj
@@ -1,154 +1,154 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="cpp-sample"
-	ProjectGUID="{7E5849C7-0469-4AD2-91B9-C87203934254}"
-	Keyword="ManagedCProj">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="TRUE">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Debug"
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				MinimalRebuild="FALSE"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="3"
-				WarningLevel="3"
-				DebugInformationFormat="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-sample.dll"
-				LinkIncremental="2"
-				GenerateDebugInformation="TRUE"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="TRUE">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Release;..\..\src\NUnitFramework\framework\bin\Debug"
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				MinimalRebuild="FALSE"
-				UsePrecompiledHeader="3"
-				WarningLevel="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-sample.dll"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath="{ReferencesPath}\nunit.framework.dll"/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
-			<File
-				RelativePath="AssemblyInfo.cpp">
-			</File>
-			<File
-				RelativePath="cppsample.cpp">
-			</File>
-			<File
-				RelativePath="Stdafx.cpp">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc">
-			<File
-				RelativePath="cppsample.h">
-			</File>
-			<File
-				RelativePath="Stdafx.h">
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r">
-		</Filter>
-		<File
-			RelativePath="ReadMe.txt">
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="cpp-sample"
+	ProjectGUID="{7E5849C7-0469-4AD2-91B9-C87203934254}"
+	Keyword="ManagedCProj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="2"
+			CharacterSet="2"
+			ManagedExtensions="TRUE">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Debug"
+				PreprocessorDefinitions="WIN32;_DEBUG"
+				MinimalRebuild="FALSE"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/cpp-sample.dll"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="2"
+			CharacterSet="2"
+			ManagedExtensions="TRUE">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				AdditionalUsingDirectories="..\..\src\NUnitFramework\framework\bin\Release;..\..\src\NUnitFramework\framework\bin\Debug"
+				PreprocessorDefinitions="WIN32;NDEBUG"
+				MinimalRebuild="FALSE"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/cpp-sample.dll"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<AssemblyReference
+			RelativePath="{ReferencesPath}\nunit.framework.dll"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
+			<File
+				RelativePath="AssemblyInfo.cpp">
+			</File>
+			<File
+				RelativePath="cppsample.cpp">
+			</File>
+			<File
+				RelativePath="Stdafx.cpp">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc">
+			<File
+				RelativePath="cppsample.h">
+			</File>
+			<File
+				RelativePath="Stdafx.h">
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r">
+		</Filter>
+		<File
+			RelativePath="ReadMe.txt">
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/src/ClientUtilities/tests/resources/cpp-sample_VS2005.vcproj b/src/ClientUtilities/tests/resources/cpp-sample_VS2005.vcproj
index 610df65..72ad4a6 100644
--- a/src/ClientUtilities/tests/resources/cpp-sample_VS2005.vcproj
+++ b/src/ClientUtilities/tests/resources/cpp-sample_VS2005.vcproj
@@ -1,229 +1,229 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="cpp-sample_VS2005"
-	ProjectGUID="{7E5849C7-0469-4AD2-91B9-C87203934254}"
-	Keyword="ManagedCProj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="4"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalUsingDirectories="..\..\framework\bin\Debug"
-				PreprocessorDefinitions="WIN32;_DEBUG"
-				MinimalRebuild="FALSE"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="3"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-sample_VS2005.dll"
-				LinkIncremental="2"
-				GenerateDebugInformation="TRUE"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="2"
-			CharacterSet="2"
-			ManagedExtensions="4"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				AdditionalUsingDirectories="..\..\framework\bin\Release;..\..\framework\bin\Debug"
-				PreprocessorDefinitions="WIN32;NDEBUG"
-				MinimalRebuild="FALSE"
-				UsePrecompiledHeader="3"
-				WarningLevel="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				OutputFile="$(OutDir)/cpp-sample_VS2005.dll"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-		<AssemblyReference
-			RelativePath=""
-			AssemblyName=""
-		/>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
-			>
-			<File
-				RelativePath="AssemblyInfo.cpp"
-				>
-			</File>
-			<File
-				RelativePath="cppsample.cpp"
-				>
-			</File>
-			<File
-				RelativePath="Stdafx.cpp"
-				>
-				<FileConfiguration
-					Name="Debug|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32"
-					>
-					<Tool
-						Name="VCCLCompilerTool"
-						UsePrecompiledHeader="1"
-					/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc"
-			>
-			<File
-				RelativePath="cppsample.h"
-				>
-			</File>
-			<File
-				RelativePath="Stdafx.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Resource Files"
-			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r"
-			>
-		</Filter>
-		<File
-			RelativePath="ReadMe.txt"
-			>
-		</File>
-	</Files>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="cpp-sample_VS2005"
+	ProjectGUID="{7E5849C7-0469-4AD2-91B9-C87203934254}"
+	Keyword="ManagedCProj"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="2"
+			CharacterSet="2"
+			ManagedExtensions="4"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalUsingDirectories="..\..\framework\bin\Debug"
+				PreprocessorDefinitions="WIN32;_DEBUG"
+				MinimalRebuild="FALSE"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/cpp-sample_VS2005.dll"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="2"
+			CharacterSet="2"
+			ManagedExtensions="4"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				AdditionalUsingDirectories="..\..\framework\bin\Release;..\..\framework\bin\Debug"
+				PreprocessorDefinitions="WIN32;NDEBUG"
+				MinimalRebuild="FALSE"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/cpp-sample_VS2005.dll"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<AssemblyReference
+			RelativePath=""
+			AssemblyName=""
+		/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
+			>
+			<File
+				RelativePath="AssemblyInfo.cpp"
+				>
+			</File>
+			<File
+				RelativePath="cppsample.cpp"
+				>
+			</File>
+			<File
+				RelativePath="Stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc"
+			>
+			<File
+				RelativePath="cppsample.h"
+				>
+			</File>
+			<File
+				RelativePath="Stdafx.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;r"
+			>
+		</Filter>
+		<File
+			RelativePath="ReadMe.txt"
+			>
+		</File>
+	</Files>
+</VisualStudioProject>
diff --git a/src/ClientUtilities/tests/resources/csharp-sample.csproj b/src/ClientUtilities/tests/resources/csharp-sample.csproj
index 2f071aa..28a7a79 100644
--- a/src/ClientUtilities/tests/resources/csharp-sample.csproj
+++ b/src/ClientUtilities/tests/resources/csharp-sample.csproj
@@ -1,110 +1,110 @@
-<VisualStudioProject>
-    <CSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "csharp-sample"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "csharp_sample"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "true"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "true"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-                <Config
-                    Name = "Release"
-                    AllowUnsafeBlocks = "false"
-                    BaseAddress = "285212672"
-                    CheckForOverflowUnderflow = "false"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DocumentationFile = ""
-                    DebugSymbols = "false"
-                    FileAlignment = "4096"
-                    IncrementalBuild = "false"
-                    NoStdLib = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework"
-                    AssemblyName = "nunit.framework"
-                    HintPath = "E:\Program Files\NUnit 2.2\bin\nunit.framework.dll"
-                    AssemblyFolderKey = "hklm\dn\nunit.framework"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "CSharpTest.cs"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ReadMe.txt"
-                    BuildAction = "Content"
-                />
-            </Include>
-        </Files>
-    </CSHARP>
-</VisualStudioProject>
-
+<VisualStudioProject>
+    <CSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "csharp-sample"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "csharp_sample"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "true"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "true"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+                <Config
+                    Name = "Release"
+                    AllowUnsafeBlocks = "false"
+                    BaseAddress = "285212672"
+                    CheckForOverflowUnderflow = "false"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DocumentationFile = ""
+                    DebugSymbols = "false"
+                    FileAlignment = "4096"
+                    IncrementalBuild = "false"
+                    NoStdLib = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = "E:\Program Files\NUnit 2.2\bin\nunit.framework.dll"
+                    AssemblyFolderKey = "hklm\dn\nunit.framework"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "CSharpTest.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ReadMe.txt"
+                    BuildAction = "Content"
+                />
+            </Include>
+        </Files>
+    </CSHARP>
+</VisualStudioProject>
+
diff --git a/src/ClientUtilities/tests/resources/csharp-sample_VS2005.csproj b/src/ClientUtilities/tests/resources/csharp-sample_VS2005.csproj
index 0285b6f..a92c4df 100644
--- a/src/ClientUtilities/tests/resources/csharp-sample_VS2005.csproj
+++ b/src/ClientUtilities/tests/resources/csharp-sample_VS2005.csproj
@@ -1,106 +1,106 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.40607</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{15D66EEE-A852-4A52-89C2-83E74ECF3770}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>csharp-sample_VS2005</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>csharp_sample</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|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>
-  </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>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="nunit.framework">
-      <Name>nunit.framework</Name>
-      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
-      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
-    </Reference>
-    <Reference Include="System">
-      <Name>System</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CSharpTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Content Include="ReadMe.txt" />
-    <AppDesigner Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>8.0.40607</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{15D66EEE-A852-4A52-89C2-83E74ECF3770}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>csharp-sample_VS2005</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>csharp_sample</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|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>
+  </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>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
+      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CSharpTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Content Include="ReadMe.txt" />
+    <AppDesigner Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/resources/csharp-sample_VS2005_noplatform.csproj b/src/ClientUtilities/tests/resources/csharp-sample_VS2005_noplatform.csproj
index b8e388a..07ed7be 100644
--- a/src/ClientUtilities/tests/resources/csharp-sample_VS2005_noplatform.csproj
+++ b/src/ClientUtilities/tests/resources/csharp-sample_VS2005_noplatform.csproj
@@ -1,106 +1,106 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.40607</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{15D66EEE-A852-4A52-89C2-83E74ECF3770}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>csharp-sample_VS2005_noplatform</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>csharp_sample</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <OutputPath>bin\Debug\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
-    <OutputPath>bin\Release\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="nunit.framework">
-      <Name>nunit.framework</Name>
-      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
-      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
-    </Reference>
-    <Reference Include="System">
-      <Name>System</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="CSharpTest.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Content Include="ReadMe.txt" />
-    <AppDesigner Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>8.0.40607</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{15D66EEE-A852-4A52-89C2-83E74ECF3770}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>csharp-sample_VS2005_noplatform</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>csharp_sample</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <OutputPath>bin\Debug\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
+      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CSharpTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Content Include="ReadMe.txt" />
+    <AppDesigner Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/resources/jsharp.vjsproj b/src/ClientUtilities/tests/resources/jsharp.vjsproj
index ce42dcc..792fce5 100644
--- a/src/ClientUtilities/tests/resources/jsharp.vjsproj
+++ b/src/ClientUtilities/tests/resources/jsharp.vjsproj
@@ -1,101 +1,101 @@
-<VisualStudioProject>
-    <VISUALJSHARP
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
-    >
-        <Build>
-            <Settings
-                AssemblyKeyContainerName = ""
-                AssemblyName = "jsharp"
-                AssemblyOriginatorKeyFile = ""
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                OutputType = "Library"
-                PreBuildEvent = ""
-                PostBuildEvent = ""
-                RootNamespace = "jsharp"
-                RunPostBuildEvent = "OnBuildSuccess"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    BaseAddress = "285212672"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "DEBUG;TRACE"
-                    DebugSymbols = "true"
-                    NoWarn = ""
-                    Optimize = "false"
-                    OutputPath = "bin\Debug\"
-                    RegisterForComInterop = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                    AdditionalOptions = ""
-                />
-                <Config
-                    Name = "Release"
-                    BaseAddress = "285212672"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = "TRACE"
-                    DebugSymbols = "false"
-                    NoWarn = ""
-                    Optimize = "true"
-                    OutputPath = "bin\Release\"
-                    RegisterForComInterop = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "4"
-                    AdditionalOptions = ""
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "vjslib"
-                    AssemblyName = "vjslib"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft Visual JSharp .NET\Framework\v1.0.4205\vjslib.dll"
-                />
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
-                />
-                <Reference
-                    Name = "nunit.framework"
-                    AssemblyName = "nunit.framework"
-                    HintPath = "E:\Program Files\NUnit 2.2\bin\nunit.framework.dll"
-                    AssemblyFolderKey = "hklm\dn\nunit.framework"
-                />
-            </References>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.jsl"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "JSharpTest.jsl"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ReadMe.txt"
-                    BuildAction = "Content"
-                />
-            </Include>
-        </Files>
-    </VISUALJSHARP>
-</VisualStudioProject>
-
+<VisualStudioProject>
+    <VISUALJSHARP
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
+    >
+        <Build>
+            <Settings
+                AssemblyKeyContainerName = ""
+                AssemblyName = "jsharp"
+                AssemblyOriginatorKeyFile = ""
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                OutputType = "Library"
+                PreBuildEvent = ""
+                PostBuildEvent = ""
+                RootNamespace = "jsharp"
+                RunPostBuildEvent = "OnBuildSuccess"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    BaseAddress = "285212672"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "DEBUG;TRACE"
+                    DebugSymbols = "true"
+                    NoWarn = ""
+                    Optimize = "false"
+                    OutputPath = "bin\Debug\"
+                    RegisterForComInterop = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                    AdditionalOptions = ""
+                />
+                <Config
+                    Name = "Release"
+                    BaseAddress = "285212672"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = "TRACE"
+                    DebugSymbols = "false"
+                    NoWarn = ""
+                    Optimize = "true"
+                    OutputPath = "bin\Release\"
+                    RegisterForComInterop = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "4"
+                    AdditionalOptions = ""
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "vjslib"
+                    AssemblyName = "vjslib"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft Visual JSharp .NET\Framework\v1.0.4205\vjslib.dll"
+                />
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                    HintPath = "..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = "E:\Program Files\NUnit 2.2\bin\nunit.framework.dll"
+                    AssemblyFolderKey = "hklm\dn\nunit.framework"
+                />
+            </References>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.jsl"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "JSharpTest.jsl"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ReadMe.txt"
+                    BuildAction = "Content"
+                />
+            </Include>
+        </Files>
+    </VISUALJSHARP>
+</VisualStudioProject>
+
diff --git a/src/ClientUtilities/tests/resources/jsharp_VS2005.vjsproj b/src/ClientUtilities/tests/resources/jsharp_VS2005.vjsproj
index 4247466..0f2dce0 100644
--- a/src/ClientUtilities/tests/resources/jsharp_VS2005.vjsproj
+++ b/src/ClientUtilities/tests/resources/jsharp_VS2005.vjsproj
@@ -1,93 +1,93 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.40607</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{B55A6E53-57A9-4205-B396-C9983B3AF46A}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>jsharp_VS2005</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <OutputType>Library</OutputType>
-    <RootNamespace>jsharp</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>bin\Debug\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugSymbols>true</DebugSymbols>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>bin\Release\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DebugSymbols>false</DebugSymbols>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="nunit.framework">
-      <Name>nunit.framework</Name>
-      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
-      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
-    </Reference>
-    <Reference Include="System">
-      <Name>System</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
-    </Reference>
-    <Reference Include="vjslib">
-      <Name>vjslib</Name>
-      <HintPath>..\..\..\..\..\WINDOWS\Microsoft Visual JSharp .NET\Framework\v1.0.4205\vjslib.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.jsl">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="JSharpTest.jsl">
-      <SubType>Code</SubType>
-    </Compile>
-    <Content Include="ReadMe.txt" />
-    <AppDesigner Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.VISUALJSHARP.Targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>8.0.40607</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B55A6E53-57A9-4205-B396-C9983B3AF46A}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>jsharp_VS2005</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <OutputType>Library</OutputType>
+    <RootNamespace>jsharp</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugSymbols>true</DebugSymbols>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DebugSymbols>false</DebugSymbols>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
+      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll</HintPath>
+    </Reference>
+    <Reference Include="vjslib">
+      <Name>vjslib</Name>
+      <HintPath>..\..\..\..\..\WINDOWS\Microsoft Visual JSharp .NET\Framework\v1.0.4205\vjslib.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.jsl">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="JSharpTest.jsl">
+      <SubType>Code</SubType>
+    </Compile>
+    <Content Include="ReadMe.txt" />
+    <AppDesigner Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.VISUALJSHARP.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/tests/resources/samples.sln b/src/ClientUtilities/tests/resources/samples.sln
index c8b778b..87121e4 100644
--- a/src/ClientUtilities/tests/resources/samples.sln
+++ b/src/ClientUtilities/tests/resources/samples.sln
@@ -1,45 +1,45 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp-sample", "csharp\csharp-sample.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "jsharp", "jsharp\jsharp.vjsproj", "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-sample", "vb\vb-sample.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-sample", "cpp-sample\cpp-sample.vcproj", "{7E5849C7-0469-4AD2-91B9-C87203934254}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Debug = Debug
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.ActiveCfg = Debug|.NET
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.Build.0 = Debug|.NET
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.ActiveCfg = Release|.NET
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.Build.0 = Release|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.ActiveCfg = Debug|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.Build.0 = Debug|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.ActiveCfg = Release|.NET
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.Build.0 = Release|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.ActiveCfg = Debug|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.Build.0 = Debug|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.ActiveCfg = Release|.NET
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.Build.0 = Release|.NET
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.ActiveCfg = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.Build.0 = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release.ActiveCfg = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp-sample", "csharp\csharp-sample.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "jsharp", "jsharp\jsharp.vjsproj", "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-sample", "vb\vb-sample.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-sample", "cpp-sample\cpp-sample.vcproj", "{7E5849C7-0469-4AD2-91B9-C87203934254}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.ActiveCfg = Debug|.NET
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.Build.0 = Debug|.NET
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.ActiveCfg = Release|.NET
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.Build.0 = Release|.NET
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.ActiveCfg = Debug|.NET
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.Build.0 = Debug|.NET
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.ActiveCfg = Release|.NET
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.Build.0 = Release|.NET
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.ActiveCfg = Debug|.NET
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.Build.0 = Debug|.NET
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.ActiveCfg = Release|.NET
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.Build.0 = Release|.NET
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.ActiveCfg = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.Build.0 = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release.ActiveCfg = Release|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/src/ClientUtilities/tests/resources/samples_VS2005.sln b/src/ClientUtilities/tests/resources/samples_VS2005.sln
index 5421e28..7ca78d0 100644
--- a/src/ClientUtilities/tests/resources/samples_VS2005.sln
+++ b/src/ClientUtilities/tests/resources/samples_VS2005.sln
@@ -1,73 +1,73 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp-sample", "csharp\csharp-sample_VS2005.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
-EndProject
-Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "jsharp", "jsharp\jsharp_VS2005.vjsproj", "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
-EndProject
-Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-sample", "vb\vb-sample_VS2005.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-sample", "cpp-sample\cpp-sample_VS2005.vcproj", "{7E5849C7-0469-4AD2-91B9-C87203934254}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Debug|Mixed platforms = Debug|Mixed platforms
-		Debug|Win32 = Debug|Win32
-		Release|Any CPU = Release|Any CPU
-		Release|Mixed platforms = Release|Mixed platforms
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Mixed platforms.ActiveCfg = Debug|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Mixed platforms.Build.0 = Debug|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Win32.ActiveCfg = Debug|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Win32.Build.0 = Debug|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Any CPU.Build.0 = Release|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Mixed platforms.ActiveCfg = Release|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Mixed platforms.Build.0 = Release|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Win32.ActiveCfg = Release|Any CPU
-		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Win32.Build.0 = Release|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Mixed platforms.ActiveCfg = Debug|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Mixed platforms.Build.0 = Debug|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Win32.ActiveCfg = Debug|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Win32.Build.0 = Debug|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Mixed platforms.ActiveCfg = Release|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Mixed platforms.Build.0 = Release|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Win32.ActiveCfg = Release|Any CPU
-		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Win32.Build.0 = Release|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Mixed platforms.ActiveCfg = Debug|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Mixed platforms.Build.0 = Debug|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Win32.ActiveCfg = Debug|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Win32.Build.0 = Debug|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Mixed platforms.ActiveCfg = Release|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Mixed platforms.Build.0 = Release|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Win32.ActiveCfg = Release|Any CPU
-		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Win32.Build.0 = Release|Any CPU
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Any CPU.ActiveCfg = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Any CPU.Build.0 = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Mixed platforms.ActiveCfg = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Mixed platforms.Build.0 = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Win32.ActiveCfg = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Win32.Build.0 = Debug|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Any CPU.ActiveCfg = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Any CPU.Build.0 = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Mixed platforms.ActiveCfg = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Mixed platforms.Build.0 = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Win32.ActiveCfg = Release|Win32
-		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp-sample", "csharp\csharp-sample_VS2005.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}"
+EndProject
+Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "jsharp", "jsharp\jsharp_VS2005.vjsproj", "{B55A6E53-57A9-4205-B396-C9983B3AF46A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-sample", "vb\vb-sample_VS2005.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-sample", "cpp-sample\cpp-sample_VS2005.vcproj", "{7E5849C7-0469-4AD2-91B9-C87203934254}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed platforms = Debug|Mixed platforms
+		Debug|Win32 = Debug|Win32
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed platforms = Release|Mixed platforms
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Mixed platforms.ActiveCfg = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Mixed platforms.Build.0 = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug|Win32.Build.0 = Debug|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Any CPU.Build.0 = Release|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Mixed platforms.ActiveCfg = Release|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Mixed platforms.Build.0 = Release|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Win32.ActiveCfg = Release|Any CPU
+		{15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release|Win32.Build.0 = Release|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Mixed platforms.ActiveCfg = Debug|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Mixed platforms.Build.0 = Debug|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug|Win32.Build.0 = Debug|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Mixed platforms.ActiveCfg = Release|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Mixed platforms.Build.0 = Release|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Win32.ActiveCfg = Release|Any CPU
+		{B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release|Win32.Build.0 = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Mixed platforms.ActiveCfg = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Mixed platforms.Build.0 = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug|Win32.Build.0 = Debug|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Mixed platforms.ActiveCfg = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Mixed platforms.Build.0 = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Win32.ActiveCfg = Release|Any CPU
+		{F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release|Win32.Build.0 = Release|Any CPU
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Any CPU.Build.0 = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Mixed platforms.ActiveCfg = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Mixed platforms.Build.0 = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Win32.ActiveCfg = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Debug|Win32.Build.0 = Debug|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Any CPU.ActiveCfg = Release|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Any CPU.Build.0 = Release|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Mixed platforms.ActiveCfg = Release|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Mixed platforms.Build.0 = Release|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Win32.ActiveCfg = Release|Win32
+		{7E5849C7-0469-4AD2-91B9-C87203934254}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/src/ClientUtilities/tests/resources/vb-sample.vbproj b/src/ClientUtilities/tests/resources/vb-sample.vbproj
index 0392576..96d0298 100644
--- a/src/ClientUtilities/tests/resources/vb-sample.vbproj
+++ b/src/ClientUtilities/tests/resources/vb-sample.vbproj
@@ -1,107 +1,107 @@
-<VisualStudioProject>
-    <VisualBasic
-        ProjectType = "Local"
-        ProductVersion = "7.10.3077"
-        SchemaVersion = "2.0"
-        ProjectGuid = "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
-    >
-        <Build>
-            <Settings
-                ApplicationIcon = ""
-                AssemblyKeyContainerName = ""
-                AssemblyName = "vb-sample"
-                AssemblyOriginatorKeyFile = ""
-                AssemblyOriginatorKeyMode = "None"
-                DefaultClientScript = "JScript"
-                DefaultHTMLPageLayout = "Grid"
-                DefaultTargetSchema = "IE50"
-                DelaySign = "false"
-                OutputType = "Library"
-                OptionCompare = "Binary"
-                OptionExplicit = "On"
-                OptionStrict = "Off"
-                RootNamespace = "vb_sample"
-                StartupObject = ""
-            >
-                <Config
-                    Name = "Debug"
-                    BaseAddress = "285212672"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = ""
-                    DefineDebug = "true"
-                    DefineTrace = "true"
-                    DebugSymbols = "true"
-                    IncrementalBuild = "true"
-                    Optimize = "false"
-                    OutputPath = "bin\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "1"
-                />
-                <Config
-                    Name = "Release"
-                    BaseAddress = "285212672"
-                    ConfigurationOverrideFile = ""
-                    DefineConstants = ""
-                    DefineDebug = "false"
-                    DefineTrace = "true"
-                    DebugSymbols = "false"
-                    IncrementalBuild = "false"
-                    Optimize = "true"
-                    OutputPath = "bin\"
-                    RegisterForComInterop = "false"
-                    RemoveIntegerChecks = "false"
-                    TreatWarningsAsErrors = "false"
-                    WarningLevel = "1"
-                />
-            </Settings>
-            <References>
-                <Reference
-                    Name = "System"
-                    AssemblyName = "System"
-                />
-                <Reference
-                    Name = "System.Data"
-                    AssemblyName = "System.Data"
-                />
-                <Reference
-                    Name = "System.XML"
-                    AssemblyName = "System.Xml"
-                />
-                <Reference
-                    Name = "nunit.framework"
-                    AssemblyName = "nunit.framework"
-                    HintPath = "E:\Program Files\NUnit 2.2\bin\nunit.framework.dll"
-                    AssemblyFolderKey = "hklm\dn\nunit.framework"
-                />
-            </References>
-            <Imports>
-                <Import Namespace = "Microsoft.VisualBasic" />
-                <Import Namespace = "System" />
-                <Import Namespace = "System.Collections" />
-                <Import Namespace = "System.Data" />
-                <Import Namespace = "System.Diagnostics" />
-            </Imports>
-        </Build>
-        <Files>
-            <Include>
-                <File
-                    RelPath = "AssemblyInfo.vb"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-                <File
-                    RelPath = "ReadMe.txt"
-                    BuildAction = "Content"
-                />
-                <File
-                    RelPath = "SimpleVBTest.vb"
-                    SubType = "Code"
-                    BuildAction = "Compile"
-                />
-            </Include>
-        </Files>
-    </VisualBasic>
-</VisualStudioProject>
-
+<VisualStudioProject>
+    <VisualBasic
+        ProjectType = "Local"
+        ProductVersion = "7.10.3077"
+        SchemaVersion = "2.0"
+        ProjectGuid = "{F199991B-6C8E-4AB0-9AAA-703CD4897700}"
+    >
+        <Build>
+            <Settings
+                ApplicationIcon = ""
+                AssemblyKeyContainerName = ""
+                AssemblyName = "vb-sample"
+                AssemblyOriginatorKeyFile = ""
+                AssemblyOriginatorKeyMode = "None"
+                DefaultClientScript = "JScript"
+                DefaultHTMLPageLayout = "Grid"
+                DefaultTargetSchema = "IE50"
+                DelaySign = "false"
+                OutputType = "Library"
+                OptionCompare = "Binary"
+                OptionExplicit = "On"
+                OptionStrict = "Off"
+                RootNamespace = "vb_sample"
+                StartupObject = ""
+            >
+                <Config
+                    Name = "Debug"
+                    BaseAddress = "285212672"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = ""
+                    DefineDebug = "true"
+                    DefineTrace = "true"
+                    DebugSymbols = "true"
+                    IncrementalBuild = "true"
+                    Optimize = "false"
+                    OutputPath = "bin\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "1"
+                />
+                <Config
+                    Name = "Release"
+                    BaseAddress = "285212672"
+                    ConfigurationOverrideFile = ""
+                    DefineConstants = ""
+                    DefineDebug = "false"
+                    DefineTrace = "true"
+                    DebugSymbols = "false"
+                    IncrementalBuild = "false"
+                    Optimize = "true"
+                    OutputPath = "bin\"
+                    RegisterForComInterop = "false"
+                    RemoveIntegerChecks = "false"
+                    TreatWarningsAsErrors = "false"
+                    WarningLevel = "1"
+                />
+            </Settings>
+            <References>
+                <Reference
+                    Name = "System"
+                    AssemblyName = "System"
+                />
+                <Reference
+                    Name = "System.Data"
+                    AssemblyName = "System.Data"
+                />
+                <Reference
+                    Name = "System.XML"
+                    AssemblyName = "System.Xml"
+                />
+                <Reference
+                    Name = "nunit.framework"
+                    AssemblyName = "nunit.framework"
+                    HintPath = "E:\Program Files\NUnit 2.2\bin\nunit.framework.dll"
+                    AssemblyFolderKey = "hklm\dn\nunit.framework"
+                />
+            </References>
+            <Imports>
+                <Import Namespace = "Microsoft.VisualBasic" />
+                <Import Namespace = "System" />
+                <Import Namespace = "System.Collections" />
+                <Import Namespace = "System.Data" />
+                <Import Namespace = "System.Diagnostics" />
+            </Imports>
+        </Build>
+        <Files>
+            <Include>
+                <File
+                    RelPath = "AssemblyInfo.vb"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
+                    RelPath = "ReadMe.txt"
+                    BuildAction = "Content"
+                />
+                <File
+                    RelPath = "SimpleVBTest.vb"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+            </Include>
+        </Files>
+    </VisualBasic>
+</VisualStudioProject>
+
diff --git a/src/ClientUtilities/tests/resources/vb-sample_VS2005.vbproj b/src/ClientUtilities/tests/resources/vb-sample_VS2005.vbproj
index c46c674..bd949a7 100644
--- a/src/ClientUtilities/tests/resources/vb-sample_VS2005.vbproj
+++ b/src/ClientUtilities/tests/resources/vb-sample_VS2005.vbproj
@@ -1,105 +1,105 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.40607</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{F199991B-6C8E-4AB0-9AAA-703CD4897700}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>vb-sample_VS2005</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <AssemblyOriginatorKeyMode>None</AssemblyOriginatorKeyMode>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <OptionCompare>Binary</OptionCompare>
-    <OptionExplicit>On</OptionExplicit>
-    <OptionStrict>Off</OptionStrict>
-    <RootNamespace>vb_sample</RootNamespace>
-    <StartupObject>
-    </StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>bin\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>
-    </DefineConstants>
-    <DefineDebug>true</DefineDebug>
-    <DefineTrace>true</DefineTrace>
-    <DebugSymbols>true</DebugSymbols>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>1</WarningLevel>
-    <NoWarn>42016,42017,42018,42019,42032</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>bin\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>
-    </DefineConstants>
-    <DefineDebug>false</DefineDebug>
-    <DefineTrace>true</DefineTrace>
-    <DebugSymbols>false</DebugSymbols>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>1</WarningLevel>
-    <NoWarn>42016,42017,42018,42019,42032</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="nunit.framework">
-      <Name>nunit.framework</Name>
-      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
-      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
-    </Reference>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Import Include="Microsoft.VisualBasic" />
-    <Import Include="System" />
-    <Import Include="System.Collections" />
-    <Import Include="System.Data" />
-    <Import Include="System.Diagnostics" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="AssemblyInfo.vb">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="SimpleVBTest.vb">
-      <SubType>Code</SubType>
-    </Compile>
-    <Content Include="ReadMe.txt" />
-    <AppDesigner Include="My Project\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.Targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>8.0.40607</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F199991B-6C8E-4AB0-9AAA-703CD4897700}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>vb-sample_VS2005</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <AssemblyOriginatorKeyMode>None</AssemblyOriginatorKeyMode>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <OptionCompare>Binary</OptionCompare>
+    <OptionExplicit>On</OptionExplicit>
+    <OptionStrict>Off</OptionStrict>
+    <RootNamespace>vb_sample</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>
+    </DefineConstants>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>true</DebugSymbols>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>
+    </DefineConstants>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <DebugSymbols>false</DebugSymbols>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>1</WarningLevel>
+    <NoWarn>42016,42017,42018,42019,42032</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <Name>nunit.framework</Name>
+      <HintPath>E:\Program Files\NUnit 2.2\bin\nunit.framework.dll</HintPath>
+      <AssemblyFolderKey>hklm\dn\nunit.framework</AssemblyFolderKey>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssemblyInfo.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="SimpleVBTest.vb">
+      <SubType>Code</SubType>
+    </Compile>
+    <Content Include="ReadMe.txt" />
+    <AppDesigner Include="My Project\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.Targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ClientUtilities/util/AggregatingTestRunner.cs b/src/ClientUtilities/util/AggregatingTestRunner.cs
index 85ffd86..9457885 100644
--- a/src/ClientUtilities/util/AggregatingTestRunner.cs
+++ b/src/ClientUtilities/util/AggregatingTestRunner.cs
@@ -1,446 +1,456 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.Collections;
-	using System.IO;
-	using NUnit.Core;
-
-    #region AggregatingTestRunner
-    /// <summary>
-	/// AggregatingTestRunner allows running multiple TestRunners
-	/// and combining the results.
-	/// </summary>
-    
-	public abstract class AggregatingTestRunner : MarshalByRefObject, TestRunner, EventListener
-	{
-        private Logger log;
-        private Logger Log
-        {
-            get
-            {
-                if (log == null)
-                    log = InternalTrace.GetLogger(this.GetType());
-
-                return log;
-            }
-        }
-
-		static int AggregateTestID = 1000;
-
-		#region Instance Variables
-
-		/// <summary>
-		/// Our runner ID
-		/// </summary>
-		protected int runnerID;
-
-		/// <summary>
-		/// The downstream TestRunners
-		/// </summary>
-		protected ArrayList runners;
-
-        /// <summary>
-        /// Indicates whether we should run test assemblies in parallel
-        /// </summary>
-        private bool runInParallel;
-
-		/// <summary>
-		/// The loaded test suite
-		/// </summary>
-		protected TestNode aggregateTest;
-
-		/// <summary>
-		/// The result of the last run
-		/// </summary>
-		private TestResult testResult;
-
-		/// <summary>
-		/// The event listener for the currently running test
-		/// </summary>
-		protected EventListener listener;
-
-		protected TestName testName;
-
-		#endregion
-
-		#region Constructors
-		public AggregatingTestRunner() : this( 0 ) { }
-		public AggregatingTestRunner( int runnerID )
-		{
-			this.runnerID = runnerID;
-			this.testName = new TestName();
-			testName.TestID = new TestID( AggregateTestID );
-			testName.RunnerID = this.runnerID;
-			testName.FullName = testName.Name = "Not Loaded";
-		}
-		#endregion
-
-		#region Properties
-
-		public virtual int ID
-		{
-			get { return runnerID; }
-		}
-
-		public virtual bool Running
-		{
-			get 
-			{ 
-				foreach( TestRunner runner in runners )
-					if ( runner.Running )
-						return true;
-			
-				return false;
-			}
-		}
-
-		public virtual IList AssemblyInfo
-		{
-			get
-			{
-				ArrayList info = new ArrayList();
-				foreach( TestRunner runner in runners )
-					info.AddRange( runner.AssemblyInfo );
-				return info;
-			}
-		}
-
-		public virtual ITest Test
-		{
-			get
-			{
-				if ( aggregateTest == null && runners != null )
-				{
-					// Count non-null tests, in case we specified a fixture
-					int count = 0;
-					foreach( TestRunner runner in runners )
-						if ( runner.Test != null )
-							++count;  
-
-					// Copy non-null tests to an array
-					int index = 0;
-					ITest[] tests = new ITest[count];
-					foreach( TestRunner runner in runners )
-						if ( runner.Test != null )
-							tests[index++] = runner.Test;
-
-					// Return master node containing all the tests
-					aggregateTest = new TestNode( testName, tests );
-				}
-
-				return aggregateTest;
-			}
-		}
-
-		public virtual TestResult TestResult
-		{
-			get { return testResult; }
-		}
-		#endregion
-
-		#region Load and Unload Methods
-        public bool Load(TestPackage package)
-        {
-            Log.Info("Loading " + package.Name);
-
-            this.testName.FullName = this.testName.Name = package.FullName;
-            runners = new ArrayList();
-
-            int nfound = 0;
-            int index = 0;
-
-            string targetAssemblyName = null;
-            if (package.TestName != null && package.Assemblies.Contains(package.TestName))
-            {
-                targetAssemblyName = package.TestName;
-                package.TestName = null;
-            }
-
-            // NOTE: This is experimental. A normally created test package
-            // will never have this setting.
-            if (package.Settings.Contains("RunInParallel"))
-            {
-                this.runInParallel = true;
-                package.Settings.Remove("RunInParallel");
-            }
-
-            //string basePath = package.BasePath;
-            //if (basePath == null)
-            //    basePath = Path.GetDirectoryName(package.FullName);
-
-            //string configFile = package.ConfigurationFile;
-            //if (configFile == null && package.Name != null && !package.IsSingleAssembly)
-            //    configFile = Path.ChangeExtension(package.Name, ".config");
-
-            foreach (string assembly in package.Assemblies)
-            {
-                if (targetAssemblyName == null || targetAssemblyName == assembly)
-                {
-                    TestRunner runner = CreateRunner(this.runnerID * 100 + index + 1);
-
-                    TestPackage p = new TestPackage(assembly);
-                    p.AutoBinPath = package.AutoBinPath;
-                    p.ConfigurationFile = package.ConfigurationFile;
-                    p.BasePath = package.BasePath;
-                    p.PrivateBinPath = package.PrivateBinPath;
-                    p.TestName = package.TestName;
-                    foreach (object key in package.Settings.Keys)
-                        p.Settings[key] = package.Settings[key];
-
-                    if (package.TestName == null)
-                    {
-                        runners.Add(runner);
-                        if (runner.Load(p))
-                            nfound++;
-                    }
-                    else if (runner.Load(p))
-                    {
-                        runners.Add(runner);
-                        nfound++;
-                    }
-                }
-            }
-
-            Log.Info("Load complete");
-
-            if (package.TestName == null && targetAssemblyName == null)
-                return nfound == package.Assemblies.Count;
-            else
-                return nfound > 0;
-        }
-
-        protected abstract TestRunner CreateRunner(int runnerID);
-
-		public virtual void Unload()
-		{
-            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");
-		}
-		#endregion
-
-		#region CountTestCases
-		public virtual int CountTestCases( ITestFilter filter )
-		{
-			int count = 0;
-			foreach( TestRunner runner in runners )
-				count += runner.CountTestCases( filter );
-			return count;
-		}
-		#endregion
-
-		#region Methods for Running Tests
-
-		public virtual TestResult Run(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
-		{
-            Log.Info("Run - EventListener={0}", listener.GetType().Name);
-
-			// Save active listener for derived classes
-			this.listener = listener;
-
-			ITest[] tests = new ITest[runners.Count];
-			for( int index = 0; index < runners.Count; index++ )
-				tests[index] = ((TestRunner)runners[index]).Test;
-
-            string name = this.testName.Name;
-            int count = this.CountTestCases(filter);
-            Log.Info("Signalling RunStarted({0},{1})", name, count);
-            this.listener.RunStarted(name, count);
-
-			long startTime = DateTime.Now.Ticks;
-
-		    TestResult result = new TestResult(new TestInfo(testName, tests));
-
-            if (this.runInParallel)
-            {
-                foreach (TestRunner runner in runners)
-                    if (filter.Pass(runner.Test))
-                        runner.BeginRun(this, filter, tracing, logLevel);
-
-                result = this.EndRun();
-            }
-            else
-            {
-                foreach (TestRunner runner in runners)
-                    if (filter.Pass(runner.Test))
-                        result.AddResult(runner.Run(this, filter, tracing, logLevel));
-            }
-			
-			long stopTime = DateTime.Now.Ticks;
-			double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
-			result.Time = time;
-
-			this.listener.RunFinished( result );
-
-			this.testResult = result;
-
-			return result;
-		}
-
-		public virtual void BeginRun( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
-		{
-			// Save active listener for derived classes
-			this.listener = listener;
-
-            Log.Info("BeginRun");
-
-            // ThreadedTestRunner will call our Run method on a separate thread
-            ThreadedTestRunner threadedRunner = new ThreadedTestRunner(this);
-            threadedRunner.BeginRun(listener, filter, tracing, logLevel);
-		}
-
-		public virtual TestResult EndRun()
-		{
-            Log.Info("EndRun");
-            TestResult suiteResult = new TestResult(Test as TestInfo);
-			foreach( TestRunner runner in runners )
-				suiteResult.Results.Add( runner.EndRun() );
-
-			return suiteResult;
-		}
-
-		public virtual void CancelRun()
-		{
-			foreach( TestRunner runner in runners )
-				runner.CancelRun();
-		}
-
-		public virtual void Wait()
-		{
-			foreach( TestRunner runner in runners )
-				runner.Wait();
-		}
-        #endregion
-
-		#region EventListener Members
-		public void TestStarted(TestName testName)
-		{
-			this.listener.TestStarted( testName );
-		}
-
-		public void RunStarted(string name, int testCount)
-		{
-			// TODO: We may want to count how many runs are started
-			// Ignore - we provide our own
-		}
-
-		public void RunFinished(Exception exception)
-		{
-			// Ignore - we provide our own
-		}
-
-		void NUnit.Core.EventListener.RunFinished(TestResult result)
-		{
-            if (this.runInParallel)
-            {
-                foreach (TestRunner runner in runners)
-                    if (runner.Running)
-                        return;
-
-                this.testResult = new TestResult(this.aggregateTest);
-                foreach (TestRunner runner in runners)
-                    this.testResult.AddResult(runner.TestResult);
-
-                listener.RunFinished(this.TestResult);
-            }
-		}
-
-		public void SuiteFinished(TestResult result)
-		{
-			this.listener.SuiteFinished( result );
-		}
-
-		public void TestFinished(TestResult result)
-		{
-			this.listener.TestFinished( result );
-		}
-
-		public void UnhandledException(Exception exception)
-		{
-			this.listener.UnhandledException( exception );
-		}
-
-		public void TestOutput(TestOutput testOutput)
-		{
-			this.listener.TestOutput( testOutput );
-		}
-
-		public void SuiteStarted(TestName suiteName)
-		{
-			this.listener.SuiteStarted( suiteName );
-		}
-		#endregion
-
-		#region InitializeLifetimeService Override
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-		#endregion
-
-        #region IDisposable Members
-
-        public void Dispose()
-        {
-            foreach (TestRunner runner in runners)
-                if (runner != null)
-                    runner.Dispose();
-        }
-
-        #endregion
-    }
-    #endregion
-
-    #region MultipleTestDomainRunner
-    /// <summary>
-    /// Summary description for MultipleTestDomainRunner.
-    /// </summary>
-    public class MultipleTestDomainRunner : AggregatingTestRunner
-    {
-        #region Constructors
-        public MultipleTestDomainRunner() : base(0) { }
-
-        public MultipleTestDomainRunner(int runnerID) : base(runnerID) { }
-        #endregion
-
-        #region CreateRunner
-        protected override TestRunner CreateRunner(int runnerID)
-        {
-            return new TestDomain(runnerID);
-        }
-        #endregion
-    }
-    #endregion
-
-    #region MultipleTestProcessRunner
-#if CLR_2_0 || CLR_4_0
-    public class MultipleTestProcessRunner : AggregatingTestRunner
-    {
-        #region Constructors
-        public MultipleTestProcessRunner() : base(0) { }
-
-        public MultipleTestProcessRunner(int runnerID) : base(runnerID) { }
-        #endregion
-
-        #region CreateRunner
-        protected override TestRunner CreateRunner(int runnerID)
-        {
-            return new ProcessRunner(runnerID);
-        }
-        #endregion
-    }
-#endif
-    #endregion
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.Collections;
+	using System.IO;
+	using NUnit.Core;
+    using System.Diagnostics;
+
+    #region AggregatingTestRunner
+    /// <summary>
+	/// AggregatingTestRunner allows running multiple TestRunners
+	/// and combining the results.
+	/// </summary>
+    
+	public abstract class AggregatingTestRunner : MarshalByRefObject, TestRunner, EventListener
+	{
+        private Logger log;
+        private Logger Log
+        {
+            get
+            {
+                if (log == null)
+                    log = InternalTrace.GetLogger(this.GetType());
+
+                return log;
+            }
+        }
+
+		static int AggregateTestID = 1000;
+
+		#region Instance Variables
+
+		/// <summary>
+		/// Our runner ID
+		/// </summary>
+		protected int runnerID;
+
+		/// <summary>
+		/// The downstream TestRunners
+		/// </summary>
+		protected ArrayList runners;
+
+        /// <summary>
+        /// Indicates whether we should run test assemblies in parallel
+        /// </summary>
+        private bool runInParallel;
+
+		/// <summary>
+		/// The loaded test suite
+		/// </summary>
+		protected TestNode aggregateTest;
+
+		/// <summary>
+		/// The result of the last run
+		/// </summary>
+		private TestResult testResult;
+
+		/// <summary>
+		/// The event listener for the currently running test
+		/// </summary>
+		protected EventListener listener;
+
+		protected TestName testName;
+
+		#endregion
+
+		#region Constructors
+		public AggregatingTestRunner() : this( 0 ) { }
+		public AggregatingTestRunner( int runnerID )
+		{
+			this.runnerID = runnerID;
+			this.testName = new TestName();
+			testName.TestID = new TestID( AggregateTestID );
+			testName.RunnerID = this.runnerID;
+			testName.FullName = testName.Name = "Not Loaded";
+		}
+		#endregion
+
+		#region Properties
+
+		public virtual int ID
+		{
+			get { return runnerID; }
+		}
+
+		public virtual bool Running
+		{
+			get 
+			{ 
+				foreach( TestRunner runner in runners )
+					if ( runner.Running )
+						return true;
+			
+				return false;
+			}
+		}
+
+		public virtual IList AssemblyInfo
+		{
+			get
+			{
+				ArrayList info = new ArrayList();
+				foreach( TestRunner runner in runners )
+					info.AddRange( runner.AssemblyInfo );
+				return info;
+			}
+		}
+
+		public virtual ITest Test
+		{
+			get
+			{
+				if ( aggregateTest == null && runners != null )
+				{
+					// Count non-null tests, in case we specified a fixture
+					int count = 0;
+					foreach( TestRunner runner in runners )
+						if ( runner.Test != null )
+							++count;  
+
+					// Copy non-null tests to an array
+					int index = 0;
+					ITest[] tests = new ITest[count];
+					foreach( TestRunner runner in runners )
+						if ( runner.Test != null )
+							tests[index++] = runner.Test;
+
+					// Return master node containing all the tests
+					aggregateTest = new TestNode( testName, tests );
+				}
+
+				return aggregateTest;
+			}
+		}
+
+		public virtual TestResult TestResult
+		{
+			get { return testResult; }
+		}
+		#endregion
+
+		#region Load and Unload Methods
+        public bool Load(TestPackage package)
+        {
+            Log.Info("Loading " + package.Name);
+
+            this.testName.FullName = this.testName.Name = package.FullName;
+            runners = new ArrayList();
+
+            int nfound = 0;
+            int index = 0;
+
+            string targetAssemblyName = null;
+            if (package.TestName != null && package.Assemblies.Contains(package.TestName))
+            {
+                targetAssemblyName = package.TestName;
+                package.TestName = null;
+            }
+
+            // NOTE: This is experimental. A normally created test package
+            // will never have this setting.
+            if (package.Settings.Contains("RunInParallel"))
+            {
+                this.runInParallel = true;
+                package.Settings.Remove("RunInParallel");
+            }
+
+            //string basePath = package.BasePath;
+            //if (basePath == null)
+            //    basePath = Path.GetDirectoryName(package.FullName);
+
+            //string configFile = package.ConfigurationFile;
+            //if (configFile == null && package.Name != null && !package.IsSingleAssembly)
+            //    configFile = Path.ChangeExtension(package.Name, ".config");
+
+            foreach (string assembly in package.Assemblies)
+            {
+                if (targetAssemblyName == null || targetAssemblyName == assembly)
+                {
+                    TestRunner runner = CreateRunner(this.runnerID * 100 + index + 1);
+
+                    TestPackage p = new TestPackage(assembly);
+                    p.AutoBinPath = package.AutoBinPath;
+                    p.ConfigurationFile = package.ConfigurationFile;
+                    p.BasePath = package.BasePath;
+                    p.PrivateBinPath = package.PrivateBinPath;
+                    p.TestName = package.TestName;
+                    foreach (object key in package.Settings.Keys)
+                        p.Settings[key] = package.Settings[key];
+
+                    if (package.TestName == null)
+                    {
+                        runners.Add(runner);
+                        if (runner.Load(p))
+                            nfound++;
+                    }
+                    else if (runner.Load(p))
+                    {
+                        runners.Add(runner);
+                        nfound++;
+                    }
+                }
+            }
+
+            Log.Info("Load complete");
+
+            if (package.TestName == null && targetAssemblyName == null)
+                return nfound == package.Assemblies.Count;
+            else
+                return nfound > 0;
+        }
+
+        protected abstract TestRunner CreateRunner(int runnerID);
+
+		public virtual void Unload()
+		{
+            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");
+		}
+		#endregion
+
+		#region CountTestCases
+		public virtual int CountTestCases( ITestFilter filter )
+		{
+			int count = 0;
+			foreach( TestRunner runner in runners )
+				count += runner.CountTestCases( filter );
+			return count;
+		}
+		#endregion
+
+		#region Methods for Running Tests
+
+		public virtual TestResult Run(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+		{
+            Log.Info("Run - EventListener={0}", listener.GetType().Name);
+
+			// Save active listener for derived classes
+			this.listener = listener;
+
+			ITest[] tests = new ITest[runners.Count];
+			for( int index = 0; index < runners.Count; index++ )
+				tests[index] = ((TestRunner)runners[index]).Test;
+
+            string name = this.testName.Name;
+            int count = this.CountTestCases(filter);
+            Log.Info("Signalling RunStarted({0},{1})", name, count);
+            this.listener.RunStarted(name, count);
+
+#if CLR_2_0 || CLR_4_0
+            long startTime = Stopwatch.GetTimestamp();
+#else
+			long startTime = DateTime.Now.Ticks;
+#endif
+
+		    TestResult result = new TestResult(new TestInfo(testName, tests));
+
+            if (this.runInParallel)
+            {
+                foreach (TestRunner runner in runners)
+                    if (filter.Pass(runner.Test))
+                        runner.BeginRun(this, filter, tracing, logLevel);
+
+                result = this.EndRun();
+            }
+            else
+            {
+                foreach (TestRunner runner in runners)
+                    if (filter.Pass(runner.Test))
+                        result.AddResult(runner.Run(this, filter, tracing, logLevel));
+            }
+			
+#if CLR_2_0 || CLR_4_0
+            long stopTime = Stopwatch.GetTimestamp();
+            double time = ((double)(stopTime - startTime)) / (double)Stopwatch.Frequency;
+#else
+			long stopTime = DateTime.Now.Ticks;
+			double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
+#endif
+			result.Time = time;
+
+			this.listener.RunFinished( result );
+
+			this.testResult = result;
+
+			return result;
+		}
+
+		public virtual void BeginRun( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
+		{
+			// Save active listener for derived classes
+			this.listener = listener;
+
+            Log.Info("BeginRun");
+
+            // ThreadedTestRunner will call our Run method on a separate thread
+            ThreadedTestRunner threadedRunner = new ThreadedTestRunner(this);
+            threadedRunner.BeginRun(listener, filter, tracing, logLevel);
+		}
+
+		public virtual TestResult EndRun()
+		{
+            Log.Info("EndRun");
+            TestResult suiteResult = new TestResult(Test as TestInfo);
+			foreach( TestRunner runner in runners )
+				suiteResult.Results.Add( runner.EndRun() );
+
+			return suiteResult;
+		}
+
+		public virtual void CancelRun()
+		{
+			foreach( TestRunner runner in runners )
+				runner.CancelRun();
+		}
+
+		public virtual void Wait()
+		{
+			foreach( TestRunner runner in runners )
+				runner.Wait();
+		}
+        #endregion
+
+		#region EventListener Members
+		public void TestStarted(TestName testName)
+		{
+			this.listener.TestStarted( testName );
+		}
+
+		public void RunStarted(string name, int testCount)
+		{
+			// TODO: We may want to count how many runs are started
+			// Ignore - we provide our own
+		}
+
+		public void RunFinished(Exception exception)
+		{
+			// Ignore - we provide our own
+		}
+
+		void NUnit.Core.EventListener.RunFinished(TestResult result)
+		{
+            if (this.runInParallel)
+            {
+                foreach (TestRunner runner in runners)
+                    if (runner.Running)
+                        return;
+
+                this.testResult = new TestResult(this.aggregateTest);
+                foreach (TestRunner runner in runners)
+                    this.testResult.AddResult(runner.TestResult);
+
+                listener.RunFinished(this.TestResult);
+            }
+		}
+
+		public void SuiteFinished(TestResult result)
+		{
+			this.listener.SuiteFinished( result );
+		}
+
+		public void TestFinished(TestResult result)
+		{
+			this.listener.TestFinished( result );
+		}
+
+		public void UnhandledException(Exception exception)
+		{
+			this.listener.UnhandledException( exception );
+		}
+
+		public void TestOutput(TestOutput testOutput)
+		{
+			this.listener.TestOutput( testOutput );
+		}
+
+		public void SuiteStarted(TestName suiteName)
+		{
+			this.listener.SuiteStarted( suiteName );
+		}
+		#endregion
+
+		#region InitializeLifetimeService Override
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            foreach (TestRunner runner in runners)
+                if (runner != null)
+                    runner.Dispose();
+        }
+
+        #endregion
+    }
+    #endregion
+
+    #region MultipleTestDomainRunner
+    /// <summary>
+    /// Summary description for MultipleTestDomainRunner.
+    /// </summary>
+    public class MultipleTestDomainRunner : AggregatingTestRunner
+    {
+        #region Constructors
+        public MultipleTestDomainRunner() : base(0) { }
+
+        public MultipleTestDomainRunner(int runnerID) : base(runnerID) { }
+        #endregion
+
+        #region CreateRunner
+        protected override TestRunner CreateRunner(int runnerID)
+        {
+            return new TestDomain(runnerID);
+        }
+        #endregion
+    }
+    #endregion
+
+    #region MultipleTestProcessRunner
+#if CLR_2_0 || CLR_4_0
+    public class MultipleTestProcessRunner : AggregatingTestRunner
+    {
+        #region Constructors
+        public MultipleTestProcessRunner() : base(0) { }
+
+        public MultipleTestProcessRunner(int runnerID) : base(runnerID) { }
+        #endregion
+
+        #region CreateRunner
+        protected override TestRunner CreateRunner(int runnerID)
+        {
+            return new ProcessRunner(runnerID);
+        }
+        #endregion
+    }
+#endif
+    #endregion
+}
diff --git a/src/ClientUtilities/util/AssemblyInfo.cs b/src/ClientUtilities/util/AssemblyInfo.cs
index 4835bf6..a676cbf 100644
--- a/src/ClientUtilities/util/AssemblyInfo.cs
+++ b/src/ClientUtilities/util/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/ClientUtilities/util/AssemblyList.cs b/src/ClientUtilities/util/AssemblyList.cs
index 11e5834..7e1ed54 100644
--- a/src/ClientUtilities/util/AssemblyList.cs
+++ b/src/ClientUtilities/util/AssemblyList.cs
@@ -1,90 +1,90 @@
-// ****************************************************************
-// 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.Collections;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Represents a list of assemblies. It stores paths 
-	/// that are added and fires an event whenevever it
-	/// changes. All paths must be added as absolute paths.
-	/// </summary>
-	public class AssemblyList : CollectionBase
-	{
-		#region Properties and Events
-		public string this[int index]
-		{
-			get { return (string)List[index]; }
-			set 
-			{ 
-				if ( !Path.IsPathRooted( value ) )
-					throw new ArgumentException( "Assembly path must be absolute" );
-				List[index] = value; 
-			}
-		}
-
-		public event EventHandler Changed;
-		#endregion
-
-		#region Methods
-		public string[] ToArray()
-		{
-			return (string[])InnerList.ToArray( typeof( string ) );
-		}
-
-		public void Add( string assemblyPath )
-		{
-			if ( !Path.IsPathRooted( assemblyPath ) )
-				throw new ArgumentException( "Assembly path must be absolute" );
-			List.Add( assemblyPath );
-		}
-
-		public void Remove( string assemblyPath )
-		{
-			for( int index = 0; index < this.Count; index++ )
-			{
-				if ( this[index] == assemblyPath )
-					RemoveAt( index );
-			}
-		}
-
-        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();
-		}
-
-		protected override void OnInsertComplete(int index, object value)
-		{
-			FireChangedEvent();
-		}
-
-		protected override void OnSetComplete(int index, object oldValue, object newValue)
-		{
-			FireChangedEvent();
-		}
-
-		private void FireChangedEvent()
-		{
-			if ( Changed != null )
-				Changed( this, EventArgs.Empty );
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Collections;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Represents a list of assemblies. It stores paths 
+	/// that are added and fires an event whenevever it
+	/// changes. All paths must be added as absolute paths.
+	/// </summary>
+	public class AssemblyList : CollectionBase
+	{
+		#region Properties and Events
+		public string this[int index]
+		{
+			get { return (string)List[index]; }
+			set 
+			{ 
+				if ( !Path.IsPathRooted( value ) )
+					throw new ArgumentException( "Assembly path must be absolute" );
+				List[index] = value; 
+			}
+		}
+
+		public event EventHandler Changed;
+		#endregion
+
+		#region Methods
+		public string[] ToArray()
+		{
+			return (string[])InnerList.ToArray( typeof( string ) );
+		}
+
+		public void Add( string assemblyPath )
+		{
+			if ( !Path.IsPathRooted( assemblyPath ) )
+				throw new ArgumentException( "Assembly path must be absolute" );
+			List.Add( assemblyPath );
+		}
+
+		public void Remove( string assemblyPath )
+		{
+			for( int index = 0; index < this.Count; index++ )
+			{
+				if ( this[index] == assemblyPath )
+					RemoveAt( index );
+			}
+		}
+
+        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();
+		}
+
+		protected override void OnInsertComplete(int index, object value)
+		{
+			FireChangedEvent();
+		}
+
+		protected override void OnSetComplete(int index, object oldValue, object newValue)
+		{
+			FireChangedEvent();
+		}
+
+		private void FireChangedEvent()
+		{
+			if ( Changed != null )
+				Changed( this, EventArgs.Empty );
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/AssemblyWatcher.cs b/src/ClientUtilities/util/AssemblyWatcher.cs
index d274a57..3ec1377 100644
--- a/src/ClientUtilities/util/AssemblyWatcher.cs
+++ b/src/ClientUtilities/util/AssemblyWatcher.cs
@@ -1,160 +1,160 @@
-// ****************************************************************
-// 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.Timers;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// AssemblyWatcher keeps track of one or more assemblies to 
-	/// see if they have changed. It incorporates a delayed notification
-	/// and uses a standard event to notify any interested parties
-	/// about the change. The path to the assembly is provided as
-	/// an argument to the event handler so that one routine can
-	/// be used to handle events from multiple watchers.
-	/// </summary>
-	public class AssemblyWatcher : IAssemblyWatcher
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(AssemblyWatcher));
-
-        private FileSystemWatcher[] fileWatchers;
-		private FileInfo[] files;
-
-		protected System.Timers.Timer timer;
-		protected string changedAssemblyPath;
-
-		protected FileInfo GetFileInfo(int index)
-		{
-			return files[index];
-		}
-
-		public void Setup(int delay, string assemblyFileName)
-		{
-			Setup(delay, new string[] {assemblyFileName});
-		}
-
-#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)
-#endif
-		{
-            log.Info("Setting up watcher");
-
-			files = new FileInfo[assemblies.Count];
-			fileWatchers = new FileSystemWatcher[assemblies.Count];
-
-			for (int i = 0; i < assemblies.Count; i++)
-			{
-                log.Debug("Setting up FileSystemWatcher for {0}", assemblies[i]);
-                
-				files[i] = new FileInfo((string)assemblies[i]);
-
-				fileWatchers[i] = new FileSystemWatcher();
-				fileWatchers[i].Path = files[i].DirectoryName;
-				fileWatchers[i].Filter = files[i].Name;
-				fileWatchers[i].NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
-				fileWatchers[i].Changed += new FileSystemEventHandler(OnChanged);
-				fileWatchers[i].EnableRaisingEvents = false;
-			}
-
-			timer = new System.Timers.Timer(delay);
-			timer.AutoReset = false;
-			timer.Enabled = false;
-			timer.Elapsed += new ElapsedEventHandler(OnTimer);
-		}
-
-		public void Start()
-		{
-			EnableWatchers( true );
-		}
-
-		public void Stop()
-		{
-			EnableWatchers( false );
-		}
-
-		private void EnableWatchers( bool enable )
-		{
-            if (fileWatchers != null)
-    			foreach( FileSystemWatcher watcher in fileWatchers )
-	    			watcher.EnableRaisingEvents = enable;
-		}
-
-		public void FreeResources()
-		{
-            log.Info("FreeResources");
-
-            Stop();
-
-			if (fileWatchers != null)
-			{
-				foreach (FileSystemWatcher watcher in fileWatchers)
-				{
-                    if (watcher != null)
-                    {
-                        watcher.Changed -= new FileSystemEventHandler(OnChanged);
-                        watcher.Dispose();
-                    }
-				}
-			}
-
-			if (timer != null)
-			{
-				timer.Stop();
-				timer.Close();
-			}
-
-			fileWatchers = null;
-			timer = null;
-		}
-
-		public event AssemblyChangedHandler AssemblyChanged;
-
-		protected void OnTimer(Object source, ElapsedEventArgs e)
-		{
-			lock(this)
-			{
-                log.Info("Timer expired");
-				PublishEvent();
-				timer.Enabled=false;
-			}
-		}
-		
-		protected void OnChanged(object source, FileSystemEventArgs e)
-		{
-            log.Info("File {0} changed", e.Name);
-
-			changedAssemblyPath = e.FullPath;
-			if ( timer != null )
-			{
-				lock(this)
-				{
-					if(!timer.Enabled)
-						timer.Enabled=true;
-                    log.Info("Setting timer");
-					timer.Start();
-				}
-			}
-			else
-			{
-				PublishEvent();
-			}
-		}
-	
-		protected void PublishEvent()
-		{
-            if (AssemblyChanged != null)
-            {
-                log.Debug("Publishing Event to {0} listeners", AssemblyChanged.GetInvocationList().Length);
-                AssemblyChanged(changedAssemblyPath);
-            }
-		}
-	}
+// ****************************************************************
+// 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.Timers;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// AssemblyWatcher keeps track of one or more assemblies to 
+	/// see if they have changed. It incorporates a delayed notification
+	/// and uses a standard event to notify any interested parties
+	/// about the change. The path to the assembly is provided as
+	/// an argument to the event handler so that one routine can
+	/// be used to handle events from multiple watchers.
+	/// </summary>
+	public class AssemblyWatcher : IAssemblyWatcher
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(AssemblyWatcher));
+
+        private FileSystemWatcher[] fileWatchers;
+		private FileInfo[] files;
+
+		protected System.Timers.Timer timer;
+		protected string changedAssemblyPath;
+
+		protected FileInfo GetFileInfo(int index)
+		{
+			return files[index];
+		}
+
+		public void Setup(int delay, string assemblyFileName)
+		{
+			Setup(delay, new string[] {assemblyFileName});
+		}
+
+#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)
+#endif
+		{
+            log.Info("Setting up watcher");
+
+			files = new FileInfo[assemblies.Count];
+			fileWatchers = new FileSystemWatcher[assemblies.Count];
+
+			for (int i = 0; i < assemblies.Count; i++)
+			{
+                log.Debug("Setting up FileSystemWatcher for {0}", assemblies[i]);
+                
+				files[i] = new FileInfo((string)assemblies[i]);
+
+				fileWatchers[i] = new FileSystemWatcher();
+				fileWatchers[i].Path = files[i].DirectoryName;
+				fileWatchers[i].Filter = files[i].Name;
+				fileWatchers[i].NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
+				fileWatchers[i].Changed += new FileSystemEventHandler(OnChanged);
+				fileWatchers[i].EnableRaisingEvents = false;
+			}
+
+			timer = new System.Timers.Timer(delay);
+			timer.AutoReset = false;
+			timer.Enabled = false;
+			timer.Elapsed += new ElapsedEventHandler(OnTimer);
+		}
+
+		public void Start()
+		{
+			EnableWatchers( true );
+		}
+
+		public void Stop()
+		{
+			EnableWatchers( false );
+		}
+
+		private void EnableWatchers( bool enable )
+		{
+            if (fileWatchers != null)
+    			foreach( FileSystemWatcher watcher in fileWatchers )
+	    			watcher.EnableRaisingEvents = enable;
+		}
+
+		public void FreeResources()
+		{
+            log.Info("FreeResources");
+
+            Stop();
+
+			if (fileWatchers != null)
+			{
+				foreach (FileSystemWatcher watcher in fileWatchers)
+				{
+                    if (watcher != null)
+                    {
+                        watcher.Changed -= new FileSystemEventHandler(OnChanged);
+                        watcher.Dispose();
+                    }
+				}
+			}
+
+			if (timer != null)
+			{
+				timer.Stop();
+				timer.Close();
+			}
+
+			fileWatchers = null;
+			timer = null;
+		}
+
+		public event AssemblyChangedHandler AssemblyChanged;
+
+		protected void OnTimer(Object source, ElapsedEventArgs e)
+		{
+			lock(this)
+			{
+                log.Info("Timer expired");
+				PublishEvent();
+				timer.Enabled=false;
+			}
+		}
+		
+		protected void OnChanged(object source, FileSystemEventArgs e)
+		{
+            log.Info("File {0} changed", e.Name);
+
+			changedAssemblyPath = e.FullPath;
+			if ( timer != null )
+			{
+				lock(this)
+				{
+					if(!timer.Enabled)
+						timer.Enabled=true;
+                    log.Info("Setting timer");
+					timer.Start();
+				}
+			}
+			else
+			{
+				PublishEvent();
+			}
+		}
+	
+		protected void PublishEvent()
+		{
+            if (AssemblyChanged != null)
+            {
+                log.Debug("Publishing Event to {0} listeners", AssemblyChanged.GetInvocationList().Length);
+                AssemblyChanged(changedAssemblyPath);
+            }
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/ClientUtilities/util/CategoryExpression.cs b/src/ClientUtilities/util/CategoryExpression.cs
index 642e282..f7ac3fe 100644
--- a/src/ClientUtilities/util/CategoryExpression.cs
+++ b/src/ClientUtilities/util/CategoryExpression.cs
@@ -1,157 +1,157 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using NUnit.Core;
-using NUnit.Core.Filters;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// CategoryExpression parses strings representing boolean
-	/// combinations of categories according to the following
-	/// grammar:
-	///   CategoryName ::= string not containing any of ',', '&', '+', '-'
-	///   CategoryFilter ::= CategoryName | CategoryFilter ',' CategoryName
-	///   CategoryPrimitive ::= CategoryFilter | '-' CategoryPrimitive
-	///   CategoryTerm ::= CategoryPrimitive | CategoryTerm '&' CategoryPrimitive
-	/// </summary>
-	public class CategoryExpression
-	{
-		static readonly char[] ops = new char[] { ',', ';', '-', '|', '+', '(', ')' };
-
-		private string text;
-		private int next;
-		private string token;
-
-		private TestFilter filter;
-
-		public CategoryExpression(string text) 
-		{
-			this.text =  text;
-			this.next = 0;
-		}
-
-		public TestFilter Filter
-		{
-			get
-			{
-				if( filter == null )
-				{
-					filter = GetToken() == null
-						? TestFilter.Empty
-						: GetExpression();
-				}
-
-				return filter;
-			}
-		}
-
-		private TestFilter GetExpression()
-		{
-			TestFilter term = GetTerm();
-			if ( token != "|" )
-				return term;
-
-			OrFilter filter = new OrFilter( term );
-			
-			while ( token == "|" )
-			{
-				GetToken();
-				filter.Add( GetTerm() );
-			}
-
-			return filter;
-		}
-
-		private TestFilter GetTerm()
-		{
-			TestFilter prim = GetPrimitive();
-			if ( token != "+" && token != "-" )
-				return prim;
-
-			AndFilter filter = new AndFilter( prim );
-			
-			while ( token == "+"|| token == "-" )
-			{
-				string tok = token;
-				GetToken();
-				prim = GetPrimitive();
-				filter.Add( tok == "-" ? new NotFilter( prim ) : prim );
-			}
-
-			return filter;
-		}
-
-		private TestFilter GetPrimitive()
-		{
-			if( token == "-" )
-			{
-				GetToken();
-				return new NotFilter( GetPrimitive() );
-			}
-			else if( token == "(" )
-			{
-				GetToken();
-				TestFilter expr = GetExpression();
-				GetToken(); // Skip ')'
-				return expr;
-			}
-
-			return GetCategoryFilter();
-		}
-
-		private CategoryFilter GetCategoryFilter()
-		{
-			CategoryFilter filter = new CategoryFilter( token );
-
-			while( GetToken() == "," || token == ";" )
-				filter.AddCategory( GetToken() );
-
-			return filter;
-		}
-
-		public string GetToken()
-		{
-			SkipWhiteSpace();
-
-			if ( EndOfText() ) 
-				token = null;
-			else if ( NextIsOperator() )
-				token = text.Substring(next++, 1);
-			else
-			{
-				int index2 = text.IndexOfAny( ops, next );
-				if ( index2 < 0 ) index2 = text.Length;
-
-				token = text.Substring( next, index2 - next ).TrimEnd();
-				next = index2;
-			}
-
-			return token;
-		}
-
-		private void SkipWhiteSpace()
-		{
-			while( next < text.Length && Char.IsWhiteSpace( text[next] ) )
-				++next;
-		}
-
-		private bool EndOfText()
-		{
-			return next >= text.Length;
-		}
-
-		private bool NextIsOperator()
-		{
-			foreach( char op in ops )
-				if( op == text[next] )
-					return true;
-
-			return false;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Core;
+using NUnit.Core.Filters;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// CategoryExpression parses strings representing boolean
+	/// combinations of categories according to the following
+	/// grammar:
+	///   CategoryName ::= string not containing any of ',', '&', '+', '-'
+	///   CategoryFilter ::= CategoryName | CategoryFilter ',' CategoryName
+	///   CategoryPrimitive ::= CategoryFilter | '-' CategoryPrimitive
+	///   CategoryTerm ::= CategoryPrimitive | CategoryTerm '&' CategoryPrimitive
+	/// </summary>
+	public class CategoryExpression
+	{
+		static readonly char[] ops = new char[] { ',', ';', '-', '|', '+', '(', ')' };
+
+		private string text;
+		private int next;
+		private string token;
+
+		private TestFilter filter;
+
+		public CategoryExpression(string text) 
+		{
+			this.text =  text;
+			this.next = 0;
+		}
+
+		public TestFilter Filter
+		{
+			get
+			{
+				if( filter == null )
+				{
+					filter = GetToken() == null
+						? TestFilter.Empty
+						: GetExpression();
+				}
+
+				return filter;
+			}
+		}
+
+		private TestFilter GetExpression()
+		{
+			TestFilter term = GetTerm();
+			if ( token != "|" )
+				return term;
+
+			OrFilter filter = new OrFilter( term );
+			
+			while ( token == "|" )
+			{
+				GetToken();
+				filter.Add( GetTerm() );
+			}
+
+			return filter;
+		}
+
+		private TestFilter GetTerm()
+		{
+			TestFilter prim = GetPrimitive();
+			if ( token != "+" && token != "-" )
+				return prim;
+
+			AndFilter filter = new AndFilter( prim );
+			
+			while ( token == "+"|| token == "-" )
+			{
+				string tok = token;
+				GetToken();
+				prim = GetPrimitive();
+				filter.Add( tok == "-" ? new NotFilter( prim ) : prim );
+			}
+
+			return filter;
+		}
+
+		private TestFilter GetPrimitive()
+		{
+			if( token == "-" )
+			{
+				GetToken();
+				return new NotFilter( GetPrimitive() );
+			}
+			else if( token == "(" )
+			{
+				GetToken();
+				TestFilter expr = GetExpression();
+				GetToken(); // Skip ')'
+				return expr;
+			}
+
+			return GetCategoryFilter();
+		}
+
+		private CategoryFilter GetCategoryFilter()
+		{
+			CategoryFilter filter = new CategoryFilter( token );
+
+			while( GetToken() == "," || token == ";" )
+				filter.AddCategory( GetToken() );
+
+			return filter;
+		}
+
+		public string GetToken()
+		{
+			SkipWhiteSpace();
+
+			if ( EndOfText() ) 
+				token = null;
+			else if ( NextIsOperator() )
+				token = text.Substring(next++, 1);
+			else
+			{
+				int index2 = text.IndexOfAny( ops, next );
+				if ( index2 < 0 ) index2 = text.Length;
+
+				token = text.Substring( next, index2 - next ).TrimEnd();
+				next = index2;
+			}
+
+			return token;
+		}
+
+		private void SkipWhiteSpace()
+		{
+			while( next < text.Length && Char.IsWhiteSpace( text[next] ) )
+				++next;
+		}
+
+		private bool EndOfText()
+		{
+			return next >= text.Length;
+		}
+
+		private bool NextIsOperator()
+		{
+			foreach( char op in ops )
+				if( op == text[next] )
+					return true;
+
+			return false;
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/CategoryManager.cs b/src/ClientUtilities/util/CategoryManager.cs
index cce4d49..8efe1e5 100644
--- a/src/ClientUtilities/util/CategoryManager.cs
+++ b/src/ClientUtilities/util/CategoryManager.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	public class CategoryManager
-	{
-		private Hashtable categories = new Hashtable();
-
-		public void Add(string name) 
-		{
-			categories[name] = name;
-		}
-
-		public void AddCategories( ITest test )
-		{
-            if (test.Categories != null)
-                foreach (string name in test.Categories)
-                    if (NUnitFramework.IsValidCategoryName(name))
-                        Add(name);
-		}
-
-		public void AddAllCategories( ITest test )
-		{
-			AddCategories( test );
-			if ( test.IsSuite )
-				foreach( ITest child in test.Tests )
-					AddAllCategories( child );
-		}
-
-		public ICollection Categories 
-		{
-			get { return categories.Values; }
-		}
-
-		public void Clear() 
-		{
-			categories = new Hashtable();
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	public class CategoryManager
+	{
+		private Hashtable categories = new Hashtable();
+
+		public void Add(string name) 
+		{
+			categories[name] = name;
+		}
+
+		public void AddCategories( ITest test )
+		{
+            if (test.Categories != null)
+                foreach (string name in test.Categories)
+                    if (NUnitFramework.IsValidCategoryName(name))
+                        Add(name);
+		}
+
+		public void AddAllCategories( ITest test )
+		{
+			AddCategories( test );
+			if ( test.IsSuite )
+				foreach( ITest child in test.Tests )
+					AddAllCategories( child );
+		}
+
+		public ICollection Categories 
+		{
+			get { return categories.Values; }
+		}
+
+		public void Clear() 
+		{
+			categories = new Hashtable();
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/CommandLineOptions.cs b/src/ClientUtilities/util/CommandLineOptions.cs
index 004ccee..5ee1fab 100644
--- a/src/ClientUtilities/util/CommandLineOptions.cs
+++ b/src/ClientUtilities/util/CommandLineOptions.cs
@@ -1,316 +1,316 @@
-// File: CommandLineOptions.cs
-//
-// This is a re-usable component to be used when you 
-// need to parse command-line options/parameters.
-//
-// Separates command line parameters from command line options.
-// Uses reflection to populate member variables the derived class with the values 
-// of the options.
-//
-// An option can start with "-" or "--". On Windows systems, it can start with "/" as well.
-//
-// I define 3 types of "options":
-//   1. Boolean options (yes/no values), e.g: /r to recurse
-//   2. Value options, e.g: /loglevel=3
-//   2. Parameters: standalone strings like file names
-//
-// An example to explain:
-//   csc /nologo /t:exe myfile.cs
-//       |       |      |
-//       |       |      + parameter
-//       |       |
-//       |       + value option
-//       |
-//       + boolean option
-//
-// Please see a short description of the CommandLineOptions class
-// at http://codeblast.com/~gert/dotnet/sells.html
-// 
-// Gert Lombard (gert at codeblast.com)
-// James Newkirk (jim at nunit.org)
-
-namespace Codeblast
-{
-	using System;
-	using System.Reflection;
-	using System.Collections;
-	using System.Text;
-
-	//
-	// The Attributes
-	//
-
-	[AttributeUsage(AttributeTargets.Field)]
-	public class OptionAttribute : Attribute 
-	{
-		protected object optValue;
-		protected string optName;
-		protected string description;
-
-		public string Short 
-		{
-			get { return optName; }
-			set { optName = value; }
-		}
-
-		public object Value
-		{
-			get { return optValue; }
-			set { optValue = value; }
-		}
-
-		public string Description 
-		{
-			get { return description; }
-			set { description = value; }
-		}
-	}
-
-	//
-	// The CommandLineOptions members
-	//
-
-	public abstract class CommandLineOptions
-	{
-		protected ArrayList parameters;
-		protected bool isInvalid = false; 
-
-		private int optionCount;
-		private ArrayList invalidArguments = new ArrayList();
-		private bool allowForwardSlash;
-
-		public CommandLineOptions( string[] args )
-			: this( System.IO.Path.DirectorySeparatorChar != '/', args ) {}
-
-		public CommandLineOptions( bool allowForwardSlash, string[] args )
-		{
-			this.allowForwardSlash = allowForwardSlash;
-			optionCount = Init( args );
-		}
-
-		public IList InvalidArguments
-		{
-			get { return invalidArguments; }
-		}
-
-		public bool NoArgs
-		{
-			get 
-			{ 
-				return ParameterCount == 0 && optionCount == 0;
-			}
-		}
-
-		public bool AllowForwardSlash
-		{
-			get { return allowForwardSlash; }
-		}
-
-		public int Init(params string[] args)
-		{
-			int count = 0;
-			int n = 0;
-			while (n < args.Length)
-			{
-				int pos = IsOption(args[n]);
-				if (pos > 0)
-				{
-					// It's an option:
-					if (GetOption(args, ref n, pos))
-						count++;
-					else
-						InvalidOption(args[Math.Min(n, args.Length-1)]);
-				}
-				else
-				{
-					if (parameters == null) parameters = new ArrayList();
-					parameters.Add(args[n]);
-					if ( !IsValidParameter(args[n]) )
-						InvalidOption( args[n] );
-				}
-				n++;
-			}
-			return count;
-		}
-
-		// An option starts with "/", "-" or "--":
-		protected virtual int IsOption(string opt)
-		{
-			char[] c = null;
-			if (opt.Length < 2) 
-			{
-				return 0;
-			}
-			else if (opt.Length > 2)
-			{
-				c = opt.ToCharArray(0, 3);
-				if (c[0] == '-' && c[1] == '-' && IsOptionNameChar(c[2])) return 2;
-			}
-			else
-			{
-				c = opt.ToCharArray(0, 2);
-			}
-			if ((c[0] == '-' || c[0] == '/' && AllowForwardSlash) && IsOptionNameChar(c[1])) return 1;
-			return 0; 
-		}
-
-		protected virtual bool IsOptionNameChar(char c)
-		{
-			return Char.IsLetterOrDigit(c) || c == '?';
-		}
-
-		protected virtual void InvalidOption(string name)
-		{
-			invalidArguments.Add( name );
-			isInvalid = true;
-		}
-
-		protected virtual bool IsValidParameter(string param)
-		{
-			return true;
-		}
-
-		protected virtual bool MatchShortName(FieldInfo field, string name)
-		{
-			object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
-			foreach (OptionAttribute att in atts)
-			{
-				if (string.Compare(att.Short, name, true) == 0) return true;
-			}
-			return false;
-		}
-
-		protected virtual FieldInfo GetMemberField(string name)
-		{
-			Type t = this.GetType();
-			FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public);
-			foreach (FieldInfo field in fields)
-			{
-				if (string.Compare(field.Name, name, true) == 0) return field;
-				if (MatchShortName(field, name)) return field;
-			}
-			return null;
-		}
-
-		protected virtual object GetOptionValue(FieldInfo field)
-		{
-			object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
-			if (atts.Length > 0)
-			{
-				OptionAttribute att = (OptionAttribute)atts[0];
-				return att.Value;
-			}
-			return null;
-		}
-
-		protected virtual bool GetOption(string[] args, ref int index, int pos)
-		{
-			try
-			{
-				object cmdLineVal = null;
-				string opt = args[index].Substring(pos, args[index].Length-pos);
-				SplitOptionAndValue(ref opt, ref cmdLineVal);
-				FieldInfo field = GetMemberField(opt);
-				if (field != null)
-				{
-					object value = GetOptionValue(field);
-					if (value == null)
-					{
-						if (field.FieldType == typeof(bool))
-							value = true; // default for bool values is true
-						else if(field.FieldType == typeof(string))
-						{
-							value = cmdLineVal != null ? cmdLineVal : args[++index];
-							field.SetValue(this, Convert.ChangeType(value, field.FieldType));
-							string stringValue = (string)value;
-							if(stringValue == null || stringValue.Length == 0) return false; 
-							return true;
-						}
-						else if(field.FieldType.IsEnum)
-							value = Enum.Parse( field.FieldType, (string)cmdLineVal, true );
-						else
-							value = cmdLineVal != null ? cmdLineVal : args[++index];
-					}
-					field.SetValue(this, Convert.ChangeType(value, field.FieldType));
-					return true;
-				}
-			}
-			catch (Exception) 
-			{
-				// Ignore exceptions like type conversion errors.
-			}
-			return false;
-		}
-
-		protected virtual void SplitOptionAndValue(ref string opt, ref object val)
-		{
-			// Look for ":" or "=" separator in the option:
-			int pos = opt.IndexOfAny( new char[] { ':', '=' } );
-			if (pos < 1) return;
-
-			val = opt.Substring(pos+1);
-			opt = opt.Substring(0, pos);
-		}
-
-		// Parameter accessor:
-		public string this[int index]
-		{
-			get
-			{
-				if (parameters != null) return (string)parameters[index];
-				return null;
-			}
-		}
-
-		public ArrayList Parameters
-		{
-			get { return parameters; }
-		}
-
-		public int ParameterCount
-		{
-			get
-			{
-				return parameters == null ? 0 : parameters.Count;
-			}
-		}
-
-		public virtual void Help()
-		{
-			Console.WriteLine(GetHelpText());
-		}
-
-		public virtual string GetHelpText()
-		{
-			StringBuilder helpText = new StringBuilder();
-
-			Type t = this.GetType();
-			FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public);
-            char optChar = allowForwardSlash ? '/' : '-';
-			foreach (FieldInfo field in fields)
-			{
-				object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
-				if (atts.Length > 0)
-				{
-					OptionAttribute att = (OptionAttribute)atts[0];
-					if (att.Description != null)
-					{
-						string valType = "";
-						if (att.Value == null)
-						{
-							if (field.FieldType == typeof(float)) valType = "=FLOAT";
-							else if (field.FieldType == typeof(string)) valType = "=STR";
-							else if (field.FieldType != typeof(bool)) valType = "=X";
-						}
-
-						helpText.AppendFormat("{0}{1,-20}\t{2}", optChar, field.Name+valType, att.Description);
-						if (att.Short != null) 
-							helpText.AppendFormat(" (Short format: {0}{1}{2})", optChar, att.Short, valType);
-						helpText.Append( Environment.NewLine );
-					}
-				}
-			}
-			return helpText.ToString();
-		}
-	}
-}
+// File: CommandLineOptions.cs
+//
+// This is a re-usable component to be used when you 
+// need to parse command-line options/parameters.
+//
+// Separates command line parameters from command line options.
+// Uses reflection to populate member variables the derived class with the values 
+// of the options.
+//
+// An option can start with "-" or "--". On Windows systems, it can start with "/" as well.
+//
+// I define 3 types of "options":
+//   1. Boolean options (yes/no values), e.g: /r to recurse
+//   2. Value options, e.g: /loglevel=3
+//   2. Parameters: standalone strings like file names
+//
+// An example to explain:
+//   csc /nologo /t:exe myfile.cs
+//       |       |      |
+//       |       |      + parameter
+//       |       |
+//       |       + value option
+//       |
+//       + boolean option
+//
+// Please see a short description of the CommandLineOptions class
+// at http://codeblast.com/~gert/dotnet/sells.html
+// 
+// Gert Lombard (gert at codeblast.com)
+// James Newkirk (jim at nunit.org)
+
+namespace Codeblast
+{
+	using System;
+	using System.Reflection;
+	using System.Collections;
+	using System.Text;
+
+	//
+	// The Attributes
+	//
+
+	[AttributeUsage(AttributeTargets.Field)]
+	public class OptionAttribute : Attribute 
+	{
+		protected object optValue;
+		protected string optName;
+		protected string description;
+
+		public string Short 
+		{
+			get { return optName; }
+			set { optName = value; }
+		}
+
+		public object Value
+		{
+			get { return optValue; }
+			set { optValue = value; }
+		}
+
+		public string Description 
+		{
+			get { return description; }
+			set { description = value; }
+		}
+	}
+
+	//
+	// The CommandLineOptions members
+	//
+
+	public abstract class CommandLineOptions
+	{
+		protected ArrayList parameters;
+		protected bool isInvalid = false; 
+
+		private int optionCount;
+		private ArrayList invalidArguments = new ArrayList();
+		private bool allowForwardSlash;
+
+		public CommandLineOptions( string[] args )
+			: this( System.IO.Path.DirectorySeparatorChar != '/', args ) {}
+
+		public CommandLineOptions( bool allowForwardSlash, string[] args )
+		{
+			this.allowForwardSlash = allowForwardSlash;
+			optionCount = Init( args );
+		}
+
+		public IList InvalidArguments
+		{
+			get { return invalidArguments; }
+		}
+
+		public bool NoArgs
+		{
+			get 
+			{ 
+				return ParameterCount == 0 && optionCount == 0;
+			}
+		}
+
+		public bool AllowForwardSlash
+		{
+			get { return allowForwardSlash; }
+		}
+
+		public int Init(params string[] args)
+		{
+			int count = 0;
+			int n = 0;
+			while (n < args.Length)
+			{
+				int pos = IsOption(args[n]);
+				if (pos > 0)
+				{
+					// It's an option:
+					if (GetOption(args, ref n, pos))
+						count++;
+					else
+						InvalidOption(args[Math.Min(n, args.Length-1)]);
+				}
+				else
+				{
+					if (parameters == null) parameters = new ArrayList();
+					parameters.Add(args[n]);
+					if ( !IsValidParameter(args[n]) )
+						InvalidOption( args[n] );
+				}
+				n++;
+			}
+			return count;
+		}
+
+		// An option starts with "/", "-" or "--":
+		protected virtual int IsOption(string opt)
+		{
+			char[] c = null;
+			if (opt.Length < 2) 
+			{
+				return 0;
+			}
+			else if (opt.Length > 2)
+			{
+				c = opt.ToCharArray(0, 3);
+				if (c[0] == '-' && c[1] == '-' && IsOptionNameChar(c[2])) return 2;
+			}
+			else
+			{
+				c = opt.ToCharArray(0, 2);
+			}
+			if ((c[0] == '-' || c[0] == '/' && AllowForwardSlash) && IsOptionNameChar(c[1])) return 1;
+			return 0; 
+		}
+
+		protected virtual bool IsOptionNameChar(char c)
+		{
+			return Char.IsLetterOrDigit(c) || c == '?';
+		}
+
+		protected virtual void InvalidOption(string name)
+		{
+			invalidArguments.Add( name );
+			isInvalid = true;
+		}
+
+		protected virtual bool IsValidParameter(string param)
+		{
+			return true;
+		}
+
+		protected virtual bool MatchShortName(FieldInfo field, string name)
+		{
+			object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
+			foreach (OptionAttribute att in atts)
+			{
+				if (string.Compare(att.Short, name, true) == 0) return true;
+			}
+			return false;
+		}
+
+		protected virtual FieldInfo GetMemberField(string name)
+		{
+			Type t = this.GetType();
+			FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public);
+			foreach (FieldInfo field in fields)
+			{
+				if (string.Compare(field.Name, name, true) == 0) return field;
+				if (MatchShortName(field, name)) return field;
+			}
+			return null;
+		}
+
+		protected virtual object GetOptionValue(FieldInfo field)
+		{
+			object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
+			if (atts.Length > 0)
+			{
+				OptionAttribute att = (OptionAttribute)atts[0];
+				return att.Value;
+			}
+			return null;
+		}
+
+		protected virtual bool GetOption(string[] args, ref int index, int pos)
+		{
+			try
+			{
+				object cmdLineVal = null;
+				string opt = args[index].Substring(pos, args[index].Length-pos);
+				SplitOptionAndValue(ref opt, ref cmdLineVal);
+				FieldInfo field = GetMemberField(opt);
+				if (field != null)
+				{
+					object value = GetOptionValue(field);
+					if (value == null)
+					{
+						if (field.FieldType == typeof(bool))
+							value = true; // default for bool values is true
+						else if(field.FieldType == typeof(string))
+						{
+							value = cmdLineVal != null ? cmdLineVal : args[++index];
+							field.SetValue(this, Convert.ChangeType(value, field.FieldType));
+							string stringValue = (string)value;
+							if(stringValue == null || stringValue.Length == 0) return false; 
+							return true;
+						}
+						else if(field.FieldType.IsEnum)
+							value = Enum.Parse( field.FieldType, (string)cmdLineVal, true );
+						else
+							value = cmdLineVal != null ? cmdLineVal : args[++index];
+					}
+					field.SetValue(this, Convert.ChangeType(value, field.FieldType));
+					return true;
+				}
+			}
+			catch (Exception) 
+			{
+				// Ignore exceptions like type conversion errors.
+			}
+			return false;
+		}
+
+		protected virtual void SplitOptionAndValue(ref string opt, ref object val)
+		{
+			// Look for ":" or "=" separator in the option:
+			int pos = opt.IndexOfAny( new char[] { ':', '=' } );
+			if (pos < 1) return;
+
+			val = opt.Substring(pos+1);
+			opt = opt.Substring(0, pos);
+		}
+
+		// Parameter accessor:
+		public string this[int index]
+		{
+			get
+			{
+				if (parameters != null) return (string)parameters[index];
+				return null;
+			}
+		}
+
+		public ArrayList Parameters
+		{
+			get { return parameters; }
+		}
+
+		public int ParameterCount
+		{
+			get
+			{
+				return parameters == null ? 0 : parameters.Count;
+			}
+		}
+
+		public virtual void Help()
+		{
+			Console.WriteLine(GetHelpText());
+		}
+
+		public virtual string GetHelpText()
+		{
+			StringBuilder helpText = new StringBuilder();
+
+			Type t = this.GetType();
+			FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public);
+            char optChar = allowForwardSlash ? '/' : '-';
+			foreach (FieldInfo field in fields)
+			{
+				object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true);
+				if (atts.Length > 0)
+				{
+					OptionAttribute att = (OptionAttribute)atts[0];
+					if (att.Description != null)
+					{
+						string valType = "";
+						if (att.Value == null)
+						{
+							if (field.FieldType == typeof(float)) valType = "=FLOAT";
+							else if (field.FieldType == typeof(string)) valType = "=STR";
+							else if (field.FieldType != typeof(bool)) valType = "=X";
+						}
+
+						helpText.AppendFormat("{0}{1,-20}\t{2}", optChar, field.Name+valType, att.Description);
+						if (att.Short != null) 
+							helpText.AppendFormat(" (Short format: {0}{1}{2})", optChar, att.Short, valType);
+						helpText.Append( Environment.NewLine );
+					}
+				}
+			}
+			return helpText.ToString();
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/ConsoleWriter.cs b/src/ClientUtilities/util/ConsoleWriter.cs
index 102bd07..cb32e63 100644
--- a/src/ClientUtilities/util/ConsoleWriter.cs
+++ b/src/ClientUtilities/util/ConsoleWriter.cs
@@ -1,73 +1,73 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.IO;
-	using System.Text;
-
-	/// <summary>
-	/// Class used for receiving console output from the running test and displaying it.
-	/// </summary>
-	public class ConsoleWriter : TextWriter
-	{
-		#region Private Fields
-
-		private TextWriter console;
-
-		#endregion
-
-		#region Constructors
-    			
-		public ConsoleWriter(TextWriter console)
-		{
-			this.console = console;
-		}
-
-		#endregion
-    			
-		#region TextWriter Overrides
-
-		public override void Close()
-		{
-			//console.Close ();
-		}
-
-		public override void Flush()
-		{
-			console.Flush ();
-		}
-
-
-		public override void Write(char c)
-		{
-			console.Write(c);
-		}
-
-		public override void Write(String s)
-		{
-			console.Write(s);
-		}
-
-		public override void WriteLine(string s)
-		{
-			console.WriteLine(s);
-		}
-
-		public override Encoding Encoding
-		{
-			get { return Encoding.Default; }
-		}
-
-		public override Object InitializeLifetimeService()
-		{
-			return null;
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.IO;
+	using System.Text;
+
+	/// <summary>
+	/// Class used for receiving console output from the running test and displaying it.
+	/// </summary>
+	public class ConsoleWriter : TextWriter
+	{
+		#region Private Fields
+
+		private TextWriter console;
+
+		#endregion
+
+		#region Constructors
+    			
+		public ConsoleWriter(TextWriter console)
+		{
+			this.console = console;
+		}
+
+		#endregion
+    			
+		#region TextWriter Overrides
+
+		public override void Close()
+		{
+			//console.Close ();
+		}
+
+		public override void Flush()
+		{
+			console.Flush ();
+		}
+
+
+		public override void Write(char c)
+		{
+			console.Write(c);
+		}
+
+		public override void Write(String s)
+		{
+			console.Write(s);
+		}
+
+		public override void WriteLine(string s)
+		{
+			console.WriteLine(s);
+		}
+
+		public override Encoding Encoding
+		{
+			get { return Encoding.Default; }
+		}
+
+		public override Object InitializeLifetimeService()
+		{
+			return null;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/DefaultTestRunnerFactory.cs b/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
index 490ef34..8ecda2b 100644
--- a/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
+++ b/src/ClientUtilities/util/DefaultTestRunnerFactory.cs
@@ -1,82 +1,82 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-    /// <summary>
-    /// DefaultTestRunnerFactory handles creation of a suitable test 
-    /// runner for a given package to be loaded and run either in a 
-    /// separate process or within the same process. 
-    /// </summary>
-    public class DefaultTestRunnerFactory : InProcessTestRunnerFactory, ITestRunnerFactory
-    {
-#if CLR_2_0 || CLR_4_0
-        private RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();        
-        
-        /// <summary>
-        /// Returns a test runner based on the settings in a TestPackage.
-        /// Any setting that is "consumed" by the factory is removed, so
-        /// that downstream runners using the factory will not repeatedly
-        /// create the same type of runner.
-        /// </summary>
-        /// <param name="package">The TestPackage to be loaded and run</param>
-        /// <returns>A TestRunner</returns>
-        public override TestRunner MakeTestRunner(TestPackage package)
-        {
-            ProcessModel processModel = GetTargetProcessModel(package);
-
-            switch (processModel)
-            {
-                case ProcessModel.Multiple:
-                    package.Settings.Remove("ProcessModel");
-                    return new MultipleTestProcessRunner();
-                case ProcessModel.Separate:
-                    package.Settings.Remove("ProcessModel");
-                    return new ProcessRunner();
-                default:
-                    return base.MakeTestRunner(package);
-            }
-        }
-
-        public override bool CanReuse(TestRunner runner, TestPackage package)
-        {
-            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
-            RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
-
-            ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
-            if (processModel == ProcessModel.Default)
-                if (!currentFramework.Supports(targetFramework))
-                    processModel = ProcessModel.Separate;
-
-            switch (processModel)
-            {
-                case ProcessModel.Multiple:
-                    return runner is MultipleTestProcessRunner;
-                case ProcessModel.Separate:
-                    ProcessRunner processRunner = runner as ProcessRunner;
-                    return processRunner != null && processRunner.RuntimeFramework == targetFramework;
-                default:
-                    return base.CanReuse(runner, package);
-            }
-        }
-
-        private ProcessModel GetTargetProcessModel(TestPackage package)
-        {
-            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
-            RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
-
-            ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
-            if (processModel == ProcessModel.Default)
-                if (!currentFramework.Supports(targetFramework))
-                    processModel = ProcessModel.Separate;
-            return processModel;
-        }
-#endif
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    /// <summary>
+    /// DefaultTestRunnerFactory handles creation of a suitable test 
+    /// runner for a given package to be loaded and run either in a 
+    /// separate process or within the same process. 
+    /// </summary>
+    public class DefaultTestRunnerFactory : InProcessTestRunnerFactory, ITestRunnerFactory
+    {
+#if CLR_2_0 || CLR_4_0
+        private RuntimeFrameworkSelector selector = new RuntimeFrameworkSelector();        
+        
+        /// <summary>
+        /// Returns a test runner based on the settings in a TestPackage.
+        /// Any setting that is "consumed" by the factory is removed, so
+        /// that downstream runners using the factory will not repeatedly
+        /// create the same type of runner.
+        /// </summary>
+        /// <param name="package">The TestPackage to be loaded and run</param>
+        /// <returns>A TestRunner</returns>
+        public override TestRunner MakeTestRunner(TestPackage package)
+        {
+            ProcessModel processModel = GetTargetProcessModel(package);
+
+            switch (processModel)
+            {
+                case ProcessModel.Multiple:
+                    package.Settings.Remove("ProcessModel");
+                    return new MultipleTestProcessRunner();
+                case ProcessModel.Separate:
+                    package.Settings.Remove("ProcessModel");
+                    return new ProcessRunner();
+                default:
+                    return base.MakeTestRunner(package);
+            }
+        }
+
+        public override bool CanReuse(TestRunner runner, TestPackage package)
+        {
+            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+            RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
+
+            ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
+            if (processModel == ProcessModel.Default)
+                if (!currentFramework.Supports(targetFramework))
+                    processModel = ProcessModel.Separate;
+
+            switch (processModel)
+            {
+                case ProcessModel.Multiple:
+                    return runner is MultipleTestProcessRunner;
+                case ProcessModel.Separate:
+                    ProcessRunner processRunner = runner as ProcessRunner;
+                    return processRunner != null && processRunner.RuntimeFramework == targetFramework;
+                default:
+                    return base.CanReuse(runner, package);
+            }
+        }
+
+        private ProcessModel GetTargetProcessModel(TestPackage package)
+        {
+            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+            RuntimeFramework targetFramework = selector.SelectRuntimeFramework(package);
+
+            ProcessModel processModel = (ProcessModel)package.GetSetting("ProcessModel", ProcessModel.Default);
+            if (processModel == ProcessModel.Default)
+                if (!currentFramework.Supports(targetFramework))
+                    processModel = ProcessModel.Separate;
+            return processModel;
+        }
+#endif
+    }
+}
diff --git a/src/ClientUtilities/util/Extensibility/IProjectConverter.cs b/src/ClientUtilities/util/Extensibility/IProjectConverter.cs
index 43f5955..bb3f823 100644
--- a/src/ClientUtilities/util/Extensibility/IProjectConverter.cs
+++ b/src/ClientUtilities/util/Extensibility/IProjectConverter.cs
@@ -1,32 +1,32 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Util.Extensibility
-{
-	/// <summary>
-	/// The IProjectConverter interface is implemented by any class
-	/// that knows how to convert a foreign project format to an
-	/// NUnitProject.
-	/// </summary>
-	public interface IProjectConverter
-	{
-		/// <summary>
-		/// Returns true if the file indicated is one that this
-		/// converter knows how to convert.
-		/// </summary>
-		/// <param name="path"></param>
-		/// <returns></returns>
-		bool CanConvertFrom( string path );
-
-		/// <summary>
-		/// Converts an external project returning an NUnitProject
-		/// </summary>
-		/// <param name="path"></param>
-		/// <returns></returns>
-		NUnitProject ConvertFrom( string path );
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Util.Extensibility
+{
+	/// <summary>
+	/// The IProjectConverter interface is implemented by any class
+	/// that knows how to convert a foreign project format to an
+	/// NUnitProject.
+	/// </summary>
+	public interface IProjectConverter
+	{
+		/// <summary>
+		/// Returns true if the file indicated is one that this
+		/// converter knows how to convert.
+		/// </summary>
+		/// <param name="path"></param>
+		/// <returns></returns>
+		bool CanConvertFrom( string path );
+
+		/// <summary>
+		/// Converts an external project returning an NUnitProject
+		/// </summary>
+		/// <param name="path"></param>
+		/// <returns></returns>
+		NUnitProject ConvertFrom( string path );
+	}
+}
diff --git a/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs b/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs
index 0a93bef..6122b88 100644
--- a/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs
+++ b/src/ClientUtilities/util/Extensibility/ProjectConverterCollection.cs
@@ -1,84 +1,84 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Util.Extensibility
-{
-	/// <summary>
-	/// Summary description for ProjectConverterCollection.
-	/// </summary>
-	public class ProjectConverterCollection : IProjectConverter, IExtensionPoint
-	{
-		private ArrayList converters = new ArrayList();
-
-		public ProjectConverterCollection()
-		{
-			//
-			// TODO: Add constructor logic here
-			//
-		}
-
-		#region IProjectConverter Members
-
-		public bool CanConvertFrom(string path)
-		{
-			foreach( IProjectConverter converter in converters )
-				if ( converter.CanConvertFrom( path ) )
-					return true;
-
-			return false;
-		}
-
-		public NUnitProject ConvertFrom(string path)
-		{
-			foreach( IProjectConverter converter in converters )
-				if ( converter.CanConvertFrom( path ) )
-					return converter.ConvertFrom( path );
-			
-			return null;
-		}
-
-		#endregion
-
-		#region IExtensionPoint Members
-
-		public void Remove(object extension)
-		{
-			// TODO:  Add ProjectConverterCollection.Remove implementation
-		}
-
-        public void Install(object extension)
-        {
-            // TODO:  Add ProjectConverterCollection.Install implementation
-        }
-
-        public void Install(object extension, int priority)
-        {
-            // TODO:  Add ProjectConverterCollection.Install implementation
-        }
-
-		public IExtensionHost Host
-		{
-			get
-			{
-				// TODO:  Add ProjectConverterCollection.Host getter implementation
-				return null;
-			}
-		}
-
-		public string Name
-		{
-			get
-			{
-				return "Converters";
-			}
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Util.Extensibility
+{
+	/// <summary>
+	/// Summary description for ProjectConverterCollection.
+	/// </summary>
+	public class ProjectConverterCollection : IProjectConverter, IExtensionPoint
+	{
+		private ArrayList converters = new ArrayList();
+
+		public ProjectConverterCollection()
+		{
+			//
+			// TODO: Add constructor logic here
+			//
+		}
+
+		#region IProjectConverter Members
+
+		public bool CanConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+				if ( converter.CanConvertFrom( path ) )
+					return true;
+
+			return false;
+		}
+
+		public NUnitProject ConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+				if ( converter.CanConvertFrom( path ) )
+					return converter.ConvertFrom( path );
+			
+			return null;
+		}
+
+		#endregion
+
+		#region IExtensionPoint Members
+
+		public void Remove(object extension)
+		{
+			// TODO:  Add ProjectConverterCollection.Remove implementation
+		}
+
+        public void Install(object extension)
+        {
+            // TODO:  Add ProjectConverterCollection.Install implementation
+        }
+
+        public void Install(object extension, int priority)
+        {
+            // TODO:  Add ProjectConverterCollection.Install implementation
+        }
+
+		public IExtensionHost Host
+		{
+			get
+			{
+				// TODO:  Add ProjectConverterCollection.Host getter implementation
+				return null;
+			}
+		}
+
+		public string Name
+		{
+			get
+			{
+				return "Converters";
+			}
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/FileWatcher.cs b/src/ClientUtilities/util/FileWatcher.cs
index cc80084..ea14026 100644
--- a/src/ClientUtilities/util/FileWatcher.cs
+++ b/src/ClientUtilities/util/FileWatcher.cs
@@ -1,80 +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;
-    }
-}
+// ****************************************************************
+// 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
index d2c8240..cdc5400 100644
--- a/src/ClientUtilities/util/Guard.cs
+++ b/src/ClientUtilities/util/Guard.cs
@@ -1,49 +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; }
-    }
-}
+// ****************************************************************
+// 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 b2ebbc0..9f1b63e 100644
--- a/src/ClientUtilities/util/IAssemblyWatcher.cs
+++ b/src/ClientUtilities/util/IAssemblyWatcher.cs
@@ -1,63 +1,63 @@
-// ****************************************************************
-// 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
-{
-	public delegate void AssemblyChangedHandler(string fullPath);
-
-	/// <summary>
-	/// AssemblyWatcher keeps track of one or more assemblies to 
-	/// see if they have changed. It incorporates a delayed notification
-	/// and uses a standard event to notify any interested parties
-	/// about the change. The path to the assembly is provided as
-	/// an argument to the event handler so that one routine can
-	/// be used to handle events from multiple watchers.
-	/// </summary>
-	public interface IAssemblyWatcher
-	{
-		/// <summary>
-		/// Stops watching for changes.
-		/// To release resources call FreeResources.
-		/// </summary>
-		void Stop();
-
-		/// <summary>
-		/// Starts watching for assembly changes.
-		/// You need to call Setup before start watching.
-		/// </summary>
-		void Start();
-
-		/// <summary>
-		/// Initializes the watcher with assemblies to observe for changes.
-		/// </summary>
-		/// <param name="delayInMs">The delay in ms.</param>
-		/// <param name="assemblies">The assemblies.</param>
-#if 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);
-#endif
-
-		/// <summary>
-		/// Initializes the watcher with assemblies to observe for changes.
-		/// </summary>
-		/// <param name="delayInMs">The delay in ms.</param>
-		/// <param name="assemblyFileName">Name of the assembly file.</param>
-		void Setup(int delayInMs, string assemblyFileName);
-
-		/// <summary>
-		/// Releases all resources held by the watcher.
-		/// </summary>
-		void FreeResources();
-
-		/// <summary>
-		/// Occurs when an assembly being watched has changed.
-		/// </summary>
-		event AssemblyChangedHandler AssemblyChanged;
-	}
+// ****************************************************************
+// 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
+{
+	public delegate void AssemblyChangedHandler(string fullPath);
+
+	/// <summary>
+	/// AssemblyWatcher keeps track of one or more assemblies to 
+	/// see if they have changed. It incorporates a delayed notification
+	/// and uses a standard event to notify any interested parties
+	/// about the change. The path to the assembly is provided as
+	/// an argument to the event handler so that one routine can
+	/// be used to handle events from multiple watchers.
+	/// </summary>
+	public interface IAssemblyWatcher
+	{
+		/// <summary>
+		/// Stops watching for changes.
+		/// To release resources call FreeResources.
+		/// </summary>
+		void Stop();
+
+		/// <summary>
+		/// Starts watching for assembly changes.
+		/// You need to call Setup before start watching.
+		/// </summary>
+		void Start();
+
+		/// <summary>
+		/// Initializes the watcher with assemblies to observe for changes.
+		/// </summary>
+		/// <param name="delayInMs">The delay in ms.</param>
+		/// <param name="assemblies">The assemblies.</param>
+#if 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);
+#endif
+
+		/// <summary>
+		/// Initializes the watcher with assemblies to observe for changes.
+		/// </summary>
+		/// <param name="delayInMs">The delay in ms.</param>
+		/// <param name="assemblyFileName">Name of the assembly file.</param>
+		void Setup(int delayInMs, string assemblyFileName);
+
+		/// <summary>
+		/// Releases all resources held by the watcher.
+		/// </summary>
+		void FreeResources();
+
+		/// <summary>
+		/// Occurs when an assembly being watched has changed.
+		/// </summary>
+		event AssemblyChangedHandler AssemblyChanged;
+	}
 }
\ No newline at end of file
diff --git a/src/ClientUtilities/util/InProcessTestRunnerFactory.cs b/src/ClientUtilities/util/InProcessTestRunnerFactory.cs
index daa154c..dedcf1a 100644
--- a/src/ClientUtilities/util/InProcessTestRunnerFactory.cs
+++ b/src/ClientUtilities/util/InProcessTestRunnerFactory.cs
@@ -1,54 +1,54 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-    /// <summary>
-    /// InProcessTestRunnerFactory handles creation of a suitable test 
-    /// runner for a given package to be loaded and run within the
-    /// same process.
-    /// </summary>
-    public class InProcessTestRunnerFactory : ITestRunnerFactory
-    {
-        #region ITestRunnerFactory Members
-
-        /// <summary>
-        /// Returns a test runner based on the settings in a TestPackage.
-        /// Any setting that is "consumed" by the factory is removed, so
-        /// that downstream runners using the factory will not repeatedly
-        /// create the same type of runner.
-        /// </summary>
-        /// <param name="package">The TestPackage to be loaded and run</param>
-        /// <returns>A TestRunner</returns>
-        public virtual TestRunner MakeTestRunner(TestPackage package)
-        {
-            DomainUsage domainUsage = 
-                (DomainUsage)package.GetSetting("DomainUsage", DomainUsage.Default);
-
-            switch (domainUsage)
-            {
-                case DomainUsage.Multiple:
-                    package.Settings.Remove("DomainUsage");
-                    return new MultipleTestDomainRunner();
-                case DomainUsage.None:
-                    return new RemoteTestRunner();
-                case DomainUsage.Single:
-                default:
-                    return new TestDomain();
-            }
-        }
-
-        public virtual bool CanReuse(TestRunner runner, TestPackage package)
-        {
-            return false;
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    /// <summary>
+    /// InProcessTestRunnerFactory handles creation of a suitable test 
+    /// runner for a given package to be loaded and run within the
+    /// same process.
+    /// </summary>
+    public class InProcessTestRunnerFactory : ITestRunnerFactory
+    {
+        #region ITestRunnerFactory Members
+
+        /// <summary>
+        /// Returns a test runner based on the settings in a TestPackage.
+        /// Any setting that is "consumed" by the factory is removed, so
+        /// that downstream runners using the factory will not repeatedly
+        /// create the same type of runner.
+        /// </summary>
+        /// <param name="package">The TestPackage to be loaded and run</param>
+        /// <returns>A TestRunner</returns>
+        public virtual TestRunner MakeTestRunner(TestPackage package)
+        {
+            DomainUsage domainUsage = 
+                (DomainUsage)package.GetSetting("DomainUsage", DomainUsage.Default);
+
+            switch (domainUsage)
+            {
+                case DomainUsage.Multiple:
+                    package.Settings.Remove("DomainUsage");
+                    return new MultipleTestDomainRunner();
+                case DomainUsage.None:
+                    return new RemoteTestRunner();
+                case DomainUsage.Single:
+                default:
+                    return new TestDomain();
+            }
+        }
+
+        public virtual bool CanReuse(TestRunner runner, TestPackage package)
+        {
+            return false;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs b/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs
index 8749437..aebc02c 100644
--- a/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs
+++ b/src/ClientUtilities/util/Interfaces/IRuntimeFrameworkSelector.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-    interface IRuntimeFrameworkSelector
-    {
-        /// <summary>
-        /// Selects a target runtime framework for a TestPackage based on
-        /// the settings in the package and the assemblies themselves.
-        /// The package RuntimeFramework setting may be updated as a 
-        /// result and the selected runtime is returned.
-        /// </summary>
-        /// <param name="package">A TestPackage</param>
-        /// <returns>The selected RuntimeFramework</returns>
-        RuntimeFramework SelectRuntimeFramework(TestPackage package);
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    interface IRuntimeFrameworkSelector
+    {
+        /// <summary>
+        /// Selects a target runtime framework for a TestPackage based on
+        /// the settings in the package and the assemblies themselves.
+        /// The package RuntimeFramework setting may be updated as a 
+        /// result and the selected runtime is returned.
+        /// </summary>
+        /// <param name="package">A TestPackage</param>
+        /// <returns>The selected RuntimeFramework</returns>
+        RuntimeFramework SelectRuntimeFramework(TestPackage package);
+    }
+}
diff --git a/src/ClientUtilities/util/Interfaces/ISettings.cs b/src/ClientUtilities/util/Interfaces/ISettings.cs
index dbc5a82..60acfb7 100644
--- a/src/ClientUtilities/util/Interfaces/ISettings.cs
+++ b/src/ClientUtilities/util/Interfaces/ISettings.cs
@@ -1,118 +1,118 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	public delegate void SettingsEventHandler( object sender, SettingsEventArgs args );
-
-	public class SettingsEventArgs : EventArgs
-	{
-		private string settingName;
-
-		public SettingsEventArgs( string settingName )
-		{
-			this.settingName = settingName;
-		}
-
-		public string SettingName
-		{
-			get { return settingName; }
-		}
-	}
-
-	/// <summary>
-	/// The ISettings interface is used to access all user
-	/// settings and options.
-	/// </summary>
-	public interface ISettings
-	{
-		event SettingsEventHandler Changed;
-
-		/// <summary>
-		/// Load a setting from the storage.
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <returns>Value of the setting or null</returns>
-		object GetSetting( string settingName );
-
-		/// <summary>
-		/// Load a setting from the storage or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <param name="settingName">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		object GetSetting( string settingName, object defaultValue );
-
-        /// <summary>
-        /// Load an integer setting from the storage or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of the setting to load</param>
-        /// <param name="defaultValue">Value to return if the setting is missing</param>
-        /// <returns>Value of the setting or the default value</returns>
-        int GetSetting(string settingName, int defaultValue);
-
-        /// <summary>
-        /// Load a float setting from the storage or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of the setting to load</param>
-        /// <param name="defaultValue">Value to return if the setting is missing</param>
-        /// <returns>Value of the setting or the default value</returns>
-        float GetSetting(string settingName, float defaultValue);
-
-        /// <summary>
-		/// Load a boolean setting or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		bool GetSetting( string settingName, bool defaultValue );
-
-		/// <summary>
-		/// Load a string setting from the storage or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is missing</param>
-		/// <returns>Value of the setting or the default value</returns>
-		string GetSetting( string settingName, string defaultValue );
-
-        /// <summary>
-        /// Load an enum setting from the storage or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of the setting to load</param>
-        /// <param name="defaultValue">Value to return if the setting is missing</param>
-        /// <returns>Value of the setting or the default value</returns>
-        System.Enum GetSetting(string settingName, System.Enum defaultValue);
-
-        /// <summary>
-        /// Load a Font setting from the storage or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of the setting to load</param>
-        /// <param name="defaultFont">Value to return if the setting is missing</param>
-        /// <returns>Value of the setting or the default value</returns>
-        System.Drawing.Font GetSetting(string settingName, System.Drawing.Font defaultFont);
-
-        /// <summary>
-		/// Remove a setting from the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to remove</param>
-		void RemoveSetting( string settingName );
-
-		/// <summary>
-		/// Remove an entire group of settings from the storage
-		/// </summary>
-		/// <param name="groupName">Name of the group to remove</param>
-		void RemoveGroup( string groupName );
-
-		/// <summary>
-		/// Save a setting in the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to save</param>
-		/// <param name="settingValue">Value to be saved</param>
-		void SaveSetting( string settingName, object settingValue );
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	public delegate void SettingsEventHandler( object sender, SettingsEventArgs args );
+
+	public class SettingsEventArgs : EventArgs
+	{
+		private string settingName;
+
+		public SettingsEventArgs( string settingName )
+		{
+			this.settingName = settingName;
+		}
+
+		public string SettingName
+		{
+			get { return settingName; }
+		}
+	}
+
+	/// <summary>
+	/// The ISettings interface is used to access all user
+	/// settings and options.
+	/// </summary>
+	public interface ISettings
+	{
+		event SettingsEventHandler Changed;
+
+		/// <summary>
+		/// Load a setting from the storage.
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <returns>Value of the setting or null</returns>
+		object GetSetting( string settingName );
+
+		/// <summary>
+		/// Load a setting from the storage or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <param name="settingName">Value to return if the setting is missing</param>
+		/// <returns>Value of the setting or the default value</returns>
+		object GetSetting( string settingName, object defaultValue );
+
+        /// <summary>
+        /// Load an integer setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        int GetSetting(string settingName, int defaultValue);
+
+        /// <summary>
+        /// Load a float setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        float GetSetting(string settingName, float defaultValue);
+
+        /// <summary>
+		/// Load a boolean setting or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of setting to load</param>
+		/// <param name="defaultValue">Value to return if the setting is missing</param>
+		/// <returns>Value of the setting or the default value</returns>
+		bool GetSetting( string settingName, bool defaultValue );
+
+		/// <summary>
+		/// Load a string setting from the storage or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <param name="defaultValue">Value to return if the setting is missing</param>
+		/// <returns>Value of the setting or the default value</returns>
+		string GetSetting( string settingName, string defaultValue );
+
+        /// <summary>
+        /// Load an enum setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        System.Enum GetSetting(string settingName, System.Enum defaultValue);
+
+        /// <summary>
+        /// Load a Font setting from the storage or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of the setting to load</param>
+        /// <param name="defaultFont">Value to return if the setting is missing</param>
+        /// <returns>Value of the setting or the default value</returns>
+        System.Drawing.Font GetSetting(string settingName, System.Drawing.Font defaultFont);
+
+        /// <summary>
+		/// Remove a setting from the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to remove</param>
+		void RemoveSetting( string settingName );
+
+		/// <summary>
+		/// Remove an entire group of settings from the storage
+		/// </summary>
+		/// <param name="groupName">Name of the group to remove</param>
+		void RemoveGroup( string groupName );
+
+		/// <summary>
+		/// Save a setting in the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to save</param>
+		/// <param name="settingValue">Value to be saved</param>
+		void SaveSetting( string settingName, object settingValue );
+	}
+}
diff --git a/src/ClientUtilities/util/Interfaces/ITestEvents.cs b/src/ClientUtilities/util/Interfaces/ITestEvents.cs
index 0ad3f6e..eecb804 100644
--- a/src/ClientUtilities/util/Interfaces/ITestEvents.cs
+++ b/src/ClientUtilities/util/Interfaces/ITestEvents.cs
@@ -1,67 +1,67 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// ITestEvents interface defines events related to loading
-	/// and unloading of test projects and loading, unloading and
-	/// running tests.
-	/// </summary>
-	public interface ITestEvents
-	{
-		// Events related to the loading and unloading
-		// of projects - including wrapper projects
-		// created in order to load assemblies. This
-		// occurs separately from the loading of tests
-		// for the assemblies in the project.
-		event TestEventHandler ProjectLoading;
-		event TestEventHandler ProjectLoaded;
-		event TestEventHandler ProjectLoadFailed;
-		event TestEventHandler ProjectUnloading;
-		event TestEventHandler ProjectUnloaded;
-		event TestEventHandler ProjectUnloadFailed;
-
-		// Events related to loading and unloading tests.
-		event TestEventHandler TestLoading;
-		event TestEventHandler TestLoaded;
-		event TestEventHandler TestLoadFailed;
-		
-		event TestEventHandler TestReloading;
-		event TestEventHandler TestReloaded;
-		event TestEventHandler TestReloadFailed;
-		
-		event TestEventHandler TestUnloading;
-		event TestEventHandler TestUnloaded;
-		event TestEventHandler TestUnloadFailed;
-	
-		// Events related to a running a set of tests
-		event TestEventHandler RunStarting;	
-		event TestEventHandler RunFinished;
-
-		// Events that arise while a test is running
-		// These are translated from calls to the runner on the
-		// EventListener interface.
-		event TestEventHandler SuiteStarting;
-		event TestEventHandler SuiteFinished;
-		event TestEventHandler TestStarting;
-		event TestEventHandler TestFinished;
-
-		/// <summary>
-		/// An unhandled exception was thrown during a test run,
-		/// and it cannot be associated with a particular test failure.
-		/// </summary>
-		event TestEventHandler TestException;
-
-		/// <summary>
-		/// Console Out/Error
-		/// </summary>
-		event TestEventHandler TestOutput;
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// ITestEvents interface defines events related to loading
+	/// and unloading of test projects and loading, unloading and
+	/// running tests.
+	/// </summary>
+	public interface ITestEvents
+	{
+		// Events related to the loading and unloading
+		// of projects - including wrapper projects
+		// created in order to load assemblies. This
+		// occurs separately from the loading of tests
+		// for the assemblies in the project.
+		event TestEventHandler ProjectLoading;
+		event TestEventHandler ProjectLoaded;
+		event TestEventHandler ProjectLoadFailed;
+		event TestEventHandler ProjectUnloading;
+		event TestEventHandler ProjectUnloaded;
+		event TestEventHandler ProjectUnloadFailed;
+
+		// Events related to loading and unloading tests.
+		event TestEventHandler TestLoading;
+		event TestEventHandler TestLoaded;
+		event TestEventHandler TestLoadFailed;
+		
+		event TestEventHandler TestReloading;
+		event TestEventHandler TestReloaded;
+		event TestEventHandler TestReloadFailed;
+		
+		event TestEventHandler TestUnloading;
+		event TestEventHandler TestUnloaded;
+		event TestEventHandler TestUnloadFailed;
+	
+		// Events related to a running a set of tests
+		event TestEventHandler RunStarting;	
+		event TestEventHandler RunFinished;
+
+		// Events that arise while a test is running
+		// These are translated from calls to the runner on the
+		// EventListener interface.
+		event TestEventHandler SuiteStarting;
+		event TestEventHandler SuiteFinished;
+		event TestEventHandler TestStarting;
+		event TestEventHandler TestFinished;
+
+		/// <summary>
+		/// An unhandled exception was thrown during a test run,
+		/// and it cannot be associated with a particular test failure.
+		/// </summary>
+		event TestEventHandler TestException;
+
+		/// <summary>
+		/// Console Out/Error
+		/// </summary>
+		event TestEventHandler TestOutput;
+	}
+}
diff --git a/src/ClientUtilities/util/Interfaces/ITestLoader.cs b/src/ClientUtilities/util/Interfaces/ITestLoader.cs
index 278c23f..91e0b24 100644
--- a/src/ClientUtilities/util/Interfaces/ITestLoader.cs
+++ b/src/ClientUtilities/util/Interfaces/ITestLoader.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// The ITestLoader interface supports the loading and running
-	/// of tests in a remote domain.
-	/// </summary>
-	public interface ITestLoader
-	{
-		#region Properties
-
-		// See if a project is loaded
-		bool IsProjectLoaded { get; }
-
-		// See if a test has been loaded from the project
-		bool IsTestLoaded { get; }
-
-		// See if a test is running
-		bool Running { get; }
-
-		// The loaded test project
-		NUnitProject TestProject { get; }
-
-		string TestFileName { get; }
-
-		// Our last test results
-		TestResult TestResult { get; }
-
-		#endregion
-
-		#region Methods
-
-		// Create a new empty project using a default name
-		void NewProject();
-
-		// Create a new project given a filename
-		void NewProject( string filename );
-
-		// Load a project given a filename
-		void LoadProject( string filename );
-
-		// Load a project given a filename and config
-		void LoadProject( string filename, string configname );
-
-		// Load a project given an array of assemblies
-		void LoadProject( string[] assemblies );
-
-		// Unload current project
-		void UnloadProject();
-
-		// Load tests for current project and config
-		void LoadTest();
-
-		// Load a specific test for current project and config
-		void LoadTest( string testName );
-
-		// Unload current test
-		void UnloadTest();
-		
-		// Reload current test
-		void ReloadTest();
-
-		// Run the tests
-		void RunTests( ITestFilter filter );
-
-		// Cancel the running test
-		void CancelTestRun();
-
-		#endregion
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// The ITestLoader interface supports the loading and running
+	/// of tests in a remote domain.
+	/// </summary>
+	public interface ITestLoader
+	{
+		#region Properties
+
+		// See if a project is loaded
+		bool IsProjectLoaded { get; }
+
+		// See if a test has been loaded from the project
+		bool IsTestLoaded { get; }
+
+		// See if a test is running
+		bool Running { get; }
+
+		// The loaded test project
+		NUnitProject TestProject { get; }
+
+		string TestFileName { get; }
+
+		// Our last test results
+		TestResult TestResult { get; }
+
+		#endregion
+
+		#region Methods
+
+		// Create a new empty project using a default name
+		void NewProject();
+
+		// Create a new project given a filename
+		void NewProject( string filename );
+
+		// Load a project given a filename
+		void LoadProject( string filename );
+
+		// Load a project given a filename and config
+		void LoadProject( string filename, string configname );
+
+		// Load a project given an array of assemblies
+		void LoadProject( string[] assemblies );
+
+		// Unload current project
+		void UnloadProject();
+
+		// Load tests for current project and config
+		void LoadTest();
+
+		// Load a specific test for current project and config
+		void LoadTest( string testName );
+
+		// Unload current test
+		void UnloadTest();
+		
+		// Reload current test
+		void ReloadTest();
+
+		// Run the tests
+		void RunTests( ITestFilter filter );
+
+		// Cancel the running test
+		void CancelTestRun();
+
+		#endregion
+	}
 }
\ No newline at end of file
diff --git a/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs b/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs
index 0e63029..0d97342 100644
--- a/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs
+++ b/src/ClientUtilities/util/Interfaces/ITestRunnerFactory.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-    /// <summary>
-    /// A Test Runner factory can supply a suitable test runner for a given package
-    /// </summary>
-    public interface ITestRunnerFactory
-    {
-        /// <summary>
-        /// Return a suitable runner for the package provided as an argument
-        /// </summary>
-        /// <param name="package">The test package to be loaded by the runner</param>
-        /// <returns>A TestRunner</returns>
-        TestRunner MakeTestRunner(TestPackage package);
-
-        /// <summary>
-        /// Return true if the provided runner is suitable for reuse in loading
-        /// the test package provided. Otherwise, return false.
-        /// </summary>
-        /// <param name="package"></param>
-        /// <param name="runner"></param>
-        /// <returns>True if the runner may be reused</returns>
-        bool CanReuse(TestRunner runner, TestPackage package);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    /// <summary>
+    /// A Test Runner factory can supply a suitable test runner for a given package
+    /// </summary>
+    public interface ITestRunnerFactory
+    {
+        /// <summary>
+        /// Return a suitable runner for the package provided as an argument
+        /// </summary>
+        /// <param name="package">The test package to be loaded by the runner</param>
+        /// <returns>A TestRunner</returns>
+        TestRunner MakeTestRunner(TestPackage package);
+
+        /// <summary>
+        /// Return true if the provided runner is suitable for reuse in loading
+        /// the test package provided. Otherwise, return false.
+        /// </summary>
+        /// <param name="package"></param>
+        /// <param name="runner"></param>
+        /// <returns>True if the runner may be reused</returns>
+        bool CanReuse(TestRunner runner, TestPackage package);
+    }
+}
diff --git a/src/ClientUtilities/util/MemorySettingsStorage.cs b/src/ClientUtilities/util/MemorySettingsStorage.cs
index 98aee02..651d006 100644
--- a/src/ClientUtilities/util/MemorySettingsStorage.cs
+++ b/src/ClientUtilities/util/MemorySettingsStorage.cs
@@ -1,79 +1,79 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	///  MemorySettingsStorage is used to hold settings for
-	///  the NUnit tests and also serves as the base class
-	///  for XmlSettingsStorage.
-	/// </summary>
-	public class MemorySettingsStorage : ISettingsStorage
-	{
-		protected Hashtable settings = new Hashtable();
-
-		#region ISettingsStorage Members
-
-		public object GetSetting(string settingName)
-		{
-			return settings[settingName];
-		}
-
-		public void RemoveSetting(string settingName)
-		{
-			settings.Remove( settingName );
-		}
-
-		public void RemoveGroup( string groupName )
-		{
-			ArrayList keysToRemove = new ArrayList();
-
-			string prefix = groupName;
-			if ( !prefix.EndsWith(".") )
-				prefix = prefix + ".";
-
-			foreach( string key in settings.Keys )
-				if ( key.StartsWith( prefix ) )
-					keysToRemove.Add( key );
-
-			foreach( string key in keysToRemove )
-				settings.Remove( key );
-		}
-
-		public void SaveSetting(string settingName, object settingValue)
-		{
-			settings[settingName] = settingValue;
-		}
-
-		public ISettingsStorage MakeChildStorage(string name)
-		{
-			return new MemorySettingsStorage();
-		}
-
-		public virtual void LoadSettings()
-		{
-			// No action required
-		}
-
-		public virtual void SaveSettings()
-		{
-			// No action required
-		}
-		#endregion
-
-		#region IDisposable Members
-
-		public void Dispose()
-		{
-			// TODO:  Add MemorySettingsStorage.Dispose implementation
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	///  MemorySettingsStorage is used to hold settings for
+	///  the NUnit tests and also serves as the base class
+	///  for XmlSettingsStorage.
+	/// </summary>
+	public class MemorySettingsStorage : ISettingsStorage
+	{
+		protected Hashtable settings = new Hashtable();
+
+		#region ISettingsStorage Members
+
+		public object GetSetting(string settingName)
+		{
+			return settings[settingName];
+		}
+
+		public void RemoveSetting(string settingName)
+		{
+			settings.Remove( settingName );
+		}
+
+		public void RemoveGroup( string groupName )
+		{
+			ArrayList keysToRemove = new ArrayList();
+
+			string prefix = groupName;
+			if ( !prefix.EndsWith(".") )
+				prefix = prefix + ".";
+
+			foreach( string key in settings.Keys )
+				if ( key.StartsWith( prefix ) )
+					keysToRemove.Add( key );
+
+			foreach( string key in keysToRemove )
+				settings.Remove( key );
+		}
+
+		public void SaveSetting(string settingName, object settingValue)
+		{
+			settings[settingName] = settingValue;
+		}
+
+		public ISettingsStorage MakeChildStorage(string name)
+		{
+			return new MemorySettingsStorage();
+		}
+
+		public virtual void LoadSettings()
+		{
+			// No action required
+		}
+
+		public virtual void SaveSettings()
+		{
+			// No action required
+		}
+		#endregion
+
+		#region IDisposable Members
+
+		public void Dispose()
+		{
+			// TODO:  Add MemorySettingsStorage.Dispose implementation
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/NUnitProject.cs b/src/ClientUtilities/util/NUnitProject.cs
index 9f2704f..450bbe0 100644
--- a/src/ClientUtilities/util/NUnitProject.cs
+++ b/src/ClientUtilities/util/NUnitProject.cs
@@ -1,509 +1,509 @@
-// ****************************************************************
-// 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.Xml;
-using System.Xml.Schema;
-using System.IO;
-using System.Threading;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Class that represents an NUnit test project
-	/// </summary>
-	public class NUnitProject
-    {
-        #region Constants
-        public static readonly string Extension = ".nunit";
-        #endregion
-
-        #region Instance variables
-
-        /// <summary>
-		/// Path to the file storing this project
-		/// </summary>
-		private string projectPath;
-
-		/// <summary>
-		/// Application Base for the project. Since this
-		/// can be null, always fetch from the property
-		/// rather than using the field directly.
-		/// </summary>
-		private string basePath;
-
-		/// <summary>
-		///  Whether the project is dirty
-		/// </summary>
-		private bool isDirty = false;
-
-        /// <summary>
-        /// Whether canges have been made requiring a reload
-        /// </summary>
-        private bool reloadRequired = false;
-		
-		/// <summary>
-		/// Collection of configs for the project
-		/// </summary>
-		private ProjectConfigCollection configs;
-
-        /// <summary>
-        /// True for NUnit-related projects that follow the config
-        /// of the NUnit build under which they are running.
-        /// </summary>
-        private bool autoConfig;
-
-		/// <summary>
-		/// The currently active configuration
-		/// </summary>
-		private ProjectConfig activeConfig;
-
-		/// <summary>
-		/// Flag indicating that this project is a
-		/// temporary wrapper for an assembly.
-		/// </summary>
-		private bool isAssemblyWrapper = false;
-
-        /// <summary>
-        /// The ProcessModel to be used in loading this project
-        /// </summary>
-        private ProcessModel processModel;
-
-        /// <summary>
-        /// The DomainUsage setting to be used in loading this project
-        /// </summary>
-        private DomainUsage domainUsage;
-
-		#endregion
-
-		#region Constructor
-
-		public NUnitProject( string projectPath )
-		{
-			this.projectPath = Path.GetFullPath( projectPath );
-			configs = new ProjectConfigCollection( this );
-		}
-
-		#endregion
-
-		#region Properties and Events
-
-		/// <summary>
-		/// The path to which a project will be saved.
-		/// </summary>
-		public string ProjectPath
-		{
-			get { return projectPath; }
-			set 
-			{
-				projectPath = Path.GetFullPath( value );
-				isDirty = true;
-			}
-		}
-
-		public string DefaultBasePath
-		{
-			get { return Path.GetDirectoryName( projectPath ); }
-		}
-
-		/// <summary>
-		/// Indicates whether a base path was specified for the project
-		/// </summary>
-		public bool BasePathSpecified
-		{
-			get
-			{
-				return basePath != null && basePath != string.Empty;
-			}
-		}
-
-		/// <summary>
-		/// The base path for the project. Constructor sets
-		/// it to the directory part of the project path.
-		/// </summary>
-		public string BasePath
-		{
-			get 
-			{ 
-				if ( !BasePathSpecified )
-					return DefaultBasePath; 
-				return basePath;
-			}
-            set
-            {
-                basePath = value;
-
-                if (basePath != null && basePath != string.Empty
-                    && !Path.IsPathRooted(basePath))
-                {
-                    basePath = Path.Combine(
-                        DefaultBasePath,
-                        basePath);
-                }
-
-                basePath = PathUtils.Canonicalize(basePath);
-                HasChangesRequiringReload = IsDirty = true;
-            }
-		}
-
-		/// <summary>
-		/// The name of the project.
-		/// </summary>
-		public string Name
-		{
-			get { return Path.GetFileNameWithoutExtension( projectPath ); }
-		}
-
-        public bool AutoConfig
-        {
-            get { return autoConfig; }
-            set { autoConfig = value; }
-        }
-
-		public ProjectConfig ActiveConfig
-		{
-			get 
-			{ 
-				// In case the previous active config was removed
-				if ( activeConfig != null && !configs.Contains( activeConfig ) )
-					activeConfig = null;
-				
-				// In case no active config is set or it was removed
-                if (activeConfig == null && configs.Count > 0)
-                    activeConfig = configs[0];
-				
-				return activeConfig; 
-			}
-		}
-
-		// Safe access to name of the active config
-		public string ActiveConfigName
-		{
-			get
-			{
-				ProjectConfig config = ActiveConfig;
-				return config == null ? null : config.Name;
-			}
-		}
-
-		public bool IsLoadable
-		{
-			get
-			{
-				return	ActiveConfig != null &&
-					ActiveConfig.Assemblies.Count > 0;
-			}
-		}
-
-		// A project made from a single assembly is treated
-		// as a transparent wrapper for some purposes until
-		// a change is made to it.
-		public bool IsAssemblyWrapper
-		{
-			get { return isAssemblyWrapper; }
-			set { isAssemblyWrapper = value; }
-		}
-
-		public string ConfigurationFile
-		{
-			get 
-			{ 
-				// TODO: Check this
-				return isAssemblyWrapper
-					  ? Path.GetFileName( projectPath ) + ".config"
-					  : Path.GetFileNameWithoutExtension( projectPath ) + ".config";
-			}
-		}
-
-		public bool IsDirty
-		{
-			get { return isDirty; }
-			set 
-            { 
-                isDirty = value;
-
-                if (isAssemblyWrapper && value == true)
-                {
-                    projectPath = Path.ChangeExtension(projectPath, ".nunit");
-                    isAssemblyWrapper = false;
-                    HasChangesRequiringReload = true;
-                }
-            }
-		}
-
-        public bool HasChangesRequiringReload
-        {
-            get { return reloadRequired; }
-            set { reloadRequired = value; }
-        }
-
-        public ProcessModel ProcessModel
-        {
-            get { return processModel; }
-            set
-            {
-                processModel = value;
-                HasChangesRequiringReload = IsDirty = true;
-            }
-        }
-
-        public DomainUsage DomainUsage
-        {
-            get { return domainUsage; }
-            set
-            {
-                domainUsage = value;
-                HasChangesRequiringReload = IsDirty = true;
-            }
-        }
-
-		public ProjectConfigCollection Configs
-		{
-			get { return configs; }
-		}
-		#endregion
-
-        #region Static Methods
-        public static bool IsNUnitProjectFile(string path)
-        {
-            return Path.GetExtension(path) == Extension;
-        }
-
-        public static string ProjectPathFromFile(string path)
-        {
-            string fileName = Path.GetFileNameWithoutExtension(path) + NUnitProject.Extension;
-            return Path.Combine(Path.GetDirectoryName(path), fileName);
-        }
-        #endregion
-
-        #region Instance Methods
-
-        public void SetActiveConfig( int index )
-		{
-			activeConfig = configs[index];
-            HasChangesRequiringReload = IsDirty = true;
-		}
-
-		public void SetActiveConfig( string name )
-		{
-			foreach( ProjectConfig config in configs )
-			{
-				if ( config.Name == name )
-				{
-					activeConfig = config;
-                    HasChangesRequiringReload = IsDirty = true;
-                    break;
-				}
-			}
-		}
-
-		public void Add( VSProject vsProject )
-		{
-			foreach( VSProjectConfig vsConfig in vsProject.Configs )
-			{
-				string name = vsConfig.Name;
-
-				if ( !configs.Contains( name ) )
-					configs.Add( name );
-
-				ProjectConfig config = this.Configs[name];
-
-				foreach ( string assembly in vsConfig.Assemblies )
-					config.Assemblies.Add( assembly );
-			}
-		}
-
-		public void Load()
-		{
-			XmlTextReader reader = new XmlTextReader( projectPath );
-
-			string activeConfigName = null;
-			ProjectConfig currentConfig = null;
-			
-			try
-			{
-				reader.MoveToContent();
-				if ( reader.NodeType != XmlNodeType.Element || reader.Name != "NUnitProject" )
-					throw new ProjectFormatException( 
-						"Invalid project format: <NUnitProject> expected.", 
-						reader.LineNumber, reader.LinePosition );
-
-				while( reader.Read() )
-					if ( reader.NodeType == XmlNodeType.Element )
-						switch( reader.Name )
-						{
-							case "Settings":
-								if ( reader.NodeType == XmlNodeType.Element )
-								{
-									activeConfigName = reader.GetAttribute( "activeconfig" );
-
-                                    string autoConfig = reader.GetAttribute("autoconfig");
-                                    if (autoConfig != null)
-                                        this.AutoConfig = autoConfig.ToLower() == "true";
-                                    if (this.AutoConfig)
-										activeConfigName = NUnitConfiguration.BuildConfiguration;
-									
-                                    string appbase = reader.GetAttribute( "appbase" );
-									if ( appbase != null )
-										this.BasePath = appbase;
-
-                                    string processModel = reader.GetAttribute("processModel");
-                                    if (processModel != null)
-                                        this.ProcessModel = (ProcessModel)Enum.Parse(typeof(ProcessModel), processModel);
-
-                                    string domainUsage = reader.GetAttribute("domainUsage");
-                                    if (domainUsage != null)
-                                        this.DomainUsage = (DomainUsage)Enum.Parse(typeof(DomainUsage), domainUsage);
-                                }
-								break;
-
-							case "Config":
-								if ( reader.NodeType == XmlNodeType.Element )
-								{
-									string configName = reader.GetAttribute( "name" );
-									currentConfig = new ProjectConfig( configName );
-									currentConfig.BasePath = reader.GetAttribute( "appbase" );
-									currentConfig.ConfigurationFile = reader.GetAttribute( "configfile" );
-
-									string binpath = reader.GetAttribute( "binpath" );
-									currentConfig.PrivateBinPath = binpath;
-									string type = reader.GetAttribute( "binpathtype" );
-									if ( type == null )
-										if ( binpath == null )
-											currentConfig.BinPathType = BinPathType.Auto;
-										else
-											currentConfig.BinPathType = BinPathType.Manual;
-									else
-										currentConfig.BinPathType = (BinPathType)Enum.Parse( typeof( BinPathType ), type, true );
-
-                                    string runtime = reader.GetAttribute("runtimeFramework");
-                                    if ( runtime != null )
-                                        currentConfig.RuntimeFramework = RuntimeFramework.Parse(runtime);
-
-                                    Configs.Add(currentConfig);
-									if ( configName == activeConfigName )
-										activeConfig = currentConfig;
-								}
-								else if ( reader.NodeType == XmlNodeType.EndElement )
-									currentConfig = null;
-								break;
-
-							case "assembly":
-								if ( reader.NodeType == XmlNodeType.Element && currentConfig != null )
-								{
-									string path = reader.GetAttribute( "path" );
-									currentConfig.Assemblies.Add( 
-										Path.Combine( currentConfig.BasePath, path ) );
-								}
-								break;
-
-							default:
-								break;
-						}
-
-				this.IsDirty = false;
-                this.reloadRequired = false;
-			}
-			catch( FileNotFoundException )
-			{
-				throw;
-			}
-			catch( XmlException e )
-			{
-				throw new ProjectFormatException(
-					string.Format( "Invalid project format: {0}", e.Message ),
-					e.LineNumber, e.LinePosition );
-			}
-			catch( Exception e )
-			{
-				throw new ProjectFormatException( 
-					string.Format( "Invalid project format: {0} Line {1}, Position {2}", 
-					e.Message, reader.LineNumber, reader.LinePosition ),
-					reader.LineNumber, reader.LinePosition );
-			}
-			finally
-			{
-				reader.Close();
-			}
-		}
-
-		public void Save()
-		{
-			projectPath = ProjectPathFromFile( projectPath );
-
-			XmlTextWriter writer = new XmlTextWriter(  projectPath, System.Text.Encoding.UTF8 );
-			writer.Formatting = Formatting.Indented;
-
-			writer.WriteStartElement( "NUnitProject" );
-			
-			if ( configs.Count > 0 || this.BasePath != this.DefaultBasePath )
-			{
-				writer.WriteStartElement( "Settings" );
-				if ( configs.Count > 0 )
-					writer.WriteAttributeString( "activeconfig", ActiveConfigName );
-				if ( this.BasePath != this.DefaultBasePath )
-					writer.WriteAttributeString( "appbase", this.BasePath );
-                if (this.AutoConfig)
-                    writer.WriteAttributeString("autoconfig", "true");
-                if (this.ProcessModel != ProcessModel.Default)
-                    writer.WriteAttributeString("processModel", this.ProcessModel.ToString());
-                if (this.DomainUsage != DomainUsage.Default)
-                    writer.WriteAttributeString("domainUsage", this.DomainUsage.ToString());
-				writer.WriteEndElement();
-			}
-			
-			foreach( ProjectConfig config in Configs )
-			{
-				writer.WriteStartElement( "Config" );
-				writer.WriteAttributeString( "name", config.Name );
-				string appbase = config.BasePath;
-				if ( !PathUtils.SamePathOrUnder( this.BasePath, appbase ) )
-					writer.WriteAttributeString( "appbase", appbase );
-				else if ( config.RelativeBasePath != null )
-					writer.WriteAttributeString( "appbase", config.RelativeBasePath );
-				
-				string configFile = config.ConfigurationFile;
-				if ( configFile != null && configFile != this.ConfigurationFile )
-					writer.WriteAttributeString( "configfile", config.ConfigurationFile );
-				
-				if ( config.BinPathType == BinPathType.Manual )
-					writer.WriteAttributeString( "binpath", config.PrivateBinPath );
-				else
-					writer.WriteAttributeString( "binpathtype", config.BinPathType.ToString() );
-
-                if (config.RuntimeFramework != null)
-                    writer.WriteAttributeString("runtimeFramework", config.RuntimeFramework.ToString());
-
-				foreach( string assembly in config.Assemblies )
-				{
-					writer.WriteStartElement( "assembly" );
-					writer.WriteAttributeString( "path", PathUtils.RelativePath( config.BasePath, assembly ) );
-					writer.WriteEndElement();
-				}
-
-				writer.WriteEndElement();
-			}
-
-			writer.WriteEndElement();
-
-			writer.Close();
-			this.IsDirty = false;
-
-			// Once we save a project, it's no longer
-			// loaded as an assembly wrapper on reload.
-			this.isAssemblyWrapper = false;
-		}
-
-		public void Save( string projectPath )
-		{
-			this.ProjectPath = projectPath;
-			Save();
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Xml;
+using System.Xml.Schema;
+using System.IO;
+using System.Threading;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Class that represents an NUnit test project
+	/// </summary>
+	public class NUnitProject
+    {
+        #region Constants
+        public static readonly string Extension = ".nunit";
+        #endregion
+
+        #region Instance variables
+
+        /// <summary>
+		/// Path to the file storing this project
+		/// </summary>
+		private string projectPath;
+
+		/// <summary>
+		/// Application Base for the project. Since this
+		/// can be null, always fetch from the property
+		/// rather than using the field directly.
+		/// </summary>
+		private string basePath;
+
+		/// <summary>
+		///  Whether the project is dirty
+		/// </summary>
+		private bool isDirty = false;
+
+        /// <summary>
+        /// Whether canges have been made requiring a reload
+        /// </summary>
+        private bool reloadRequired = false;
+		
+		/// <summary>
+		/// Collection of configs for the project
+		/// </summary>
+		private ProjectConfigCollection configs;
+
+        /// <summary>
+        /// True for NUnit-related projects that follow the config
+        /// of the NUnit build under which they are running.
+        /// </summary>
+        private bool autoConfig;
+
+		/// <summary>
+		/// The currently active configuration
+		/// </summary>
+		private ProjectConfig activeConfig;
+
+		/// <summary>
+		/// Flag indicating that this project is a
+		/// temporary wrapper for an assembly.
+		/// </summary>
+		private bool isAssemblyWrapper = false;
+
+        /// <summary>
+        /// The ProcessModel to be used in loading this project
+        /// </summary>
+        private ProcessModel processModel;
+
+        /// <summary>
+        /// The DomainUsage setting to be used in loading this project
+        /// </summary>
+        private DomainUsage domainUsage;
+
+		#endregion
+
+		#region Constructor
+
+		public NUnitProject( string projectPath )
+		{
+			this.projectPath = Path.GetFullPath( projectPath );
+			configs = new ProjectConfigCollection( this );
+		}
+
+		#endregion
+
+		#region Properties and Events
+
+		/// <summary>
+		/// The path to which a project will be saved.
+		/// </summary>
+		public string ProjectPath
+		{
+			get { return projectPath; }
+			set 
+			{
+				projectPath = Path.GetFullPath( value );
+				isDirty = true;
+			}
+		}
+
+		public string DefaultBasePath
+		{
+			get { return Path.GetDirectoryName( projectPath ); }
+		}
+
+		/// <summary>
+		/// Indicates whether a base path was specified for the project
+		/// </summary>
+		public bool BasePathSpecified
+		{
+			get
+			{
+				return basePath != null && basePath != string.Empty;
+			}
+		}
+
+		/// <summary>
+		/// The base path for the project. Constructor sets
+		/// it to the directory part of the project path.
+		/// </summary>
+		public string BasePath
+		{
+			get 
+			{ 
+				if ( !BasePathSpecified )
+					return DefaultBasePath; 
+				return basePath;
+			}
+            set
+            {
+                basePath = value;
+
+                if (basePath != null && basePath != string.Empty
+                    && !Path.IsPathRooted(basePath))
+                {
+                    basePath = Path.Combine(
+                        DefaultBasePath,
+                        basePath);
+                }
+
+                basePath = PathUtils.Canonicalize(basePath);
+                HasChangesRequiringReload = IsDirty = true;
+            }
+		}
+
+		/// <summary>
+		/// The name of the project.
+		/// </summary>
+		public string Name
+		{
+			get { return Path.GetFileNameWithoutExtension( projectPath ); }
+		}
+
+        public bool AutoConfig
+        {
+            get { return autoConfig; }
+            set { autoConfig = value; }
+        }
+
+		public ProjectConfig ActiveConfig
+		{
+			get 
+			{ 
+				// In case the previous active config was removed
+				if ( activeConfig != null && !configs.Contains( activeConfig ) )
+					activeConfig = null;
+				
+				// In case no active config is set or it was removed
+                if (activeConfig == null && configs.Count > 0)
+                    activeConfig = configs[0];
+				
+				return activeConfig; 
+			}
+		}
+
+		// Safe access to name of the active config
+		public string ActiveConfigName
+		{
+			get
+			{
+				ProjectConfig config = ActiveConfig;
+				return config == null ? null : config.Name;
+			}
+		}
+
+		public bool IsLoadable
+		{
+			get
+			{
+				return	ActiveConfig != null &&
+					ActiveConfig.Assemblies.Count > 0;
+			}
+		}
+
+		// A project made from a single assembly is treated
+		// as a transparent wrapper for some purposes until
+		// a change is made to it.
+		public bool IsAssemblyWrapper
+		{
+			get { return isAssemblyWrapper; }
+			set { isAssemblyWrapper = value; }
+		}
+
+		public string ConfigurationFile
+		{
+			get 
+			{ 
+				// TODO: Check this
+				return isAssemblyWrapper
+					  ? Path.GetFileName( projectPath ) + ".config"
+					  : Path.GetFileNameWithoutExtension( projectPath ) + ".config";
+			}
+		}
+
+		public bool IsDirty
+		{
+			get { return isDirty; }
+			set 
+            { 
+                isDirty = value;
+
+                if (isAssemblyWrapper && value == true)
+                {
+                    projectPath = Path.ChangeExtension(projectPath, ".nunit");
+                    isAssemblyWrapper = false;
+                    HasChangesRequiringReload = true;
+                }
+            }
+		}
+
+        public bool HasChangesRequiringReload
+        {
+            get { return reloadRequired; }
+            set { reloadRequired = value; }
+        }
+
+        public ProcessModel ProcessModel
+        {
+            get { return processModel; }
+            set
+            {
+                processModel = value;
+                HasChangesRequiringReload = IsDirty = true;
+            }
+        }
+
+        public DomainUsage DomainUsage
+        {
+            get { return domainUsage; }
+            set
+            {
+                domainUsage = value;
+                HasChangesRequiringReload = IsDirty = true;
+            }
+        }
+
+		public ProjectConfigCollection Configs
+		{
+			get { return configs; }
+		}
+		#endregion
+
+        #region Static Methods
+        public static bool IsNUnitProjectFile(string path)
+        {
+            return Path.GetExtension(path) == Extension;
+        }
+
+        public static string ProjectPathFromFile(string path)
+        {
+            string fileName = Path.GetFileNameWithoutExtension(path) + NUnitProject.Extension;
+            return Path.Combine(Path.GetDirectoryName(path), fileName);
+        }
+        #endregion
+
+        #region Instance Methods
+
+        public void SetActiveConfig( int index )
+		{
+			activeConfig = configs[index];
+            HasChangesRequiringReload = IsDirty = true;
+		}
+
+		public void SetActiveConfig( string name )
+		{
+			foreach( ProjectConfig config in configs )
+			{
+				if ( config.Name == name )
+				{
+					activeConfig = config;
+                    HasChangesRequiringReload = IsDirty = true;
+                    break;
+				}
+			}
+		}
+
+		public void Add( VSProject vsProject )
+		{
+			foreach( VSProjectConfig vsConfig in vsProject.Configs )
+			{
+				string name = vsConfig.Name;
+
+				if ( !configs.Contains( name ) )
+					configs.Add( name );
+
+				ProjectConfig config = this.Configs[name];
+
+				foreach ( string assembly in vsConfig.Assemblies )
+					config.Assemblies.Add( assembly );
+			}
+		}
+
+		public void Load()
+		{
+			XmlTextReader reader = new XmlTextReader( projectPath );
+
+			string activeConfigName = null;
+			ProjectConfig currentConfig = null;
+			
+			try
+			{
+				reader.MoveToContent();
+				if ( reader.NodeType != XmlNodeType.Element || reader.Name != "NUnitProject" )
+					throw new ProjectFormatException( 
+						"Invalid project format: <NUnitProject> expected.", 
+						reader.LineNumber, reader.LinePosition );
+
+				while( reader.Read() )
+					if ( reader.NodeType == XmlNodeType.Element )
+						switch( reader.Name )
+						{
+							case "Settings":
+								if ( reader.NodeType == XmlNodeType.Element )
+								{
+									activeConfigName = reader.GetAttribute( "activeconfig" );
+
+                                    string autoConfig = reader.GetAttribute("autoconfig");
+                                    if (autoConfig != null)
+                                        this.AutoConfig = autoConfig.ToLower() == "true";
+                                    if (this.AutoConfig)
+										activeConfigName = NUnitConfiguration.BuildConfiguration;
+									
+                                    string appbase = reader.GetAttribute( "appbase" );
+									if ( appbase != null )
+										this.BasePath = appbase;
+
+                                    string processModel = reader.GetAttribute("processModel");
+                                    if (processModel != null)
+                                        this.ProcessModel = (ProcessModel)Enum.Parse(typeof(ProcessModel), processModel);
+
+                                    string domainUsage = reader.GetAttribute("domainUsage");
+                                    if (domainUsage != null)
+                                        this.DomainUsage = (DomainUsage)Enum.Parse(typeof(DomainUsage), domainUsage);
+                                }
+								break;
+
+							case "Config":
+								if ( reader.NodeType == XmlNodeType.Element )
+								{
+									string configName = reader.GetAttribute( "name" );
+									currentConfig = new ProjectConfig( configName );
+									currentConfig.BasePath = reader.GetAttribute( "appbase" );
+									currentConfig.ConfigurationFile = reader.GetAttribute( "configfile" );
+
+									string binpath = reader.GetAttribute( "binpath" );
+									currentConfig.PrivateBinPath = binpath;
+									string type = reader.GetAttribute( "binpathtype" );
+									if ( type == null )
+										if ( binpath == null )
+											currentConfig.BinPathType = BinPathType.Auto;
+										else
+											currentConfig.BinPathType = BinPathType.Manual;
+									else
+										currentConfig.BinPathType = (BinPathType)Enum.Parse( typeof( BinPathType ), type, true );
+
+                                    string runtime = reader.GetAttribute("runtimeFramework");
+                                    if ( runtime != null )
+                                        currentConfig.RuntimeFramework = RuntimeFramework.Parse(runtime);
+
+                                    Configs.Add(currentConfig);
+									if ( configName == activeConfigName )
+										activeConfig = currentConfig;
+								}
+								else if ( reader.NodeType == XmlNodeType.EndElement )
+									currentConfig = null;
+								break;
+
+							case "assembly":
+								if ( reader.NodeType == XmlNodeType.Element && currentConfig != null )
+								{
+									string path = reader.GetAttribute( "path" );
+									currentConfig.Assemblies.Add( 
+										Path.Combine( currentConfig.BasePath, path ) );
+								}
+								break;
+
+							default:
+								break;
+						}
+
+				this.IsDirty = false;
+                this.reloadRequired = false;
+			}
+			catch( FileNotFoundException )
+			{
+				throw;
+			}
+			catch( XmlException e )
+			{
+				throw new ProjectFormatException(
+					string.Format( "Invalid project format: {0}", e.Message ),
+					e.LineNumber, e.LinePosition );
+			}
+			catch( Exception e )
+			{
+				throw new ProjectFormatException( 
+					string.Format( "Invalid project format: {0} Line {1}, Position {2}", 
+					e.Message, reader.LineNumber, reader.LinePosition ),
+					reader.LineNumber, reader.LinePosition );
+			}
+			finally
+			{
+				reader.Close();
+			}
+		}
+
+		public void Save()
+		{
+			projectPath = ProjectPathFromFile( projectPath );
+
+			XmlTextWriter writer = new XmlTextWriter(  projectPath, System.Text.Encoding.UTF8 );
+			writer.Formatting = Formatting.Indented;
+
+			writer.WriteStartElement( "NUnitProject" );
+			
+			if ( configs.Count > 0 || this.BasePath != this.DefaultBasePath )
+			{
+				writer.WriteStartElement( "Settings" );
+				if ( configs.Count > 0 )
+					writer.WriteAttributeString( "activeconfig", ActiveConfigName );
+				if ( this.BasePath != this.DefaultBasePath )
+					writer.WriteAttributeString( "appbase", this.BasePath );
+                if (this.AutoConfig)
+                    writer.WriteAttributeString("autoconfig", "true");
+                if (this.ProcessModel != ProcessModel.Default)
+                    writer.WriteAttributeString("processModel", this.ProcessModel.ToString());
+                if (this.DomainUsage != DomainUsage.Default)
+                    writer.WriteAttributeString("domainUsage", this.DomainUsage.ToString());
+				writer.WriteEndElement();
+			}
+			
+			foreach( ProjectConfig config in Configs )
+			{
+				writer.WriteStartElement( "Config" );
+				writer.WriteAttributeString( "name", config.Name );
+				string appbase = config.BasePath;
+				if ( !PathUtils.SamePathOrUnder( this.BasePath, appbase ) )
+					writer.WriteAttributeString( "appbase", appbase );
+				else if ( config.RelativeBasePath != null )
+					writer.WriteAttributeString( "appbase", config.RelativeBasePath );
+				
+				string configFile = config.ConfigurationFile;
+				if ( configFile != null && configFile != this.ConfigurationFile )
+					writer.WriteAttributeString( "configfile", config.ConfigurationFile );
+				
+				if ( config.BinPathType == BinPathType.Manual )
+					writer.WriteAttributeString( "binpath", config.PrivateBinPath );
+				else
+					writer.WriteAttributeString( "binpathtype", config.BinPathType.ToString() );
+
+                if (config.RuntimeFramework != null)
+                    writer.WriteAttributeString("runtimeFramework", config.RuntimeFramework.ToString());
+
+				foreach( string assembly in config.Assemblies )
+				{
+					writer.WriteStartElement( "assembly" );
+					writer.WriteAttributeString( "path", PathUtils.RelativePath( config.BasePath, assembly ) );
+					writer.WriteEndElement();
+				}
+
+				writer.WriteEndElement();
+			}
+
+			writer.WriteEndElement();
+
+			writer.Close();
+			this.IsDirty = false;
+
+			// Once we save a project, it's no longer
+			// loaded as an assembly wrapper on reload.
+			this.isAssemblyWrapper = false;
+		}
+
+		public void Save( string projectPath )
+		{
+			this.ProjectPath = projectPath;
+			Save();
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/NUnitRegistry.cs b/src/ClientUtilities/util/NUnitRegistry.cs
index 1e0cefc..b096349 100644
--- a/src/ClientUtilities/util/NUnitRegistry.cs
+++ b/src/ClientUtilities/util/NUnitRegistry.cs
@@ -1,133 +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.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.IO;
-	using System.Text;
-	using Microsoft.Win32;
-
-	/// <summary>
-	/// NUnitRegistry provides static properties for NUnit's
-	/// subkey under CurrentUser.
-	/// </summary>
-	public class NUnitRegistry
-	{
-		public static readonly string KEY = 
-			@"Software\nunit.org\Nunit\2.4";
-
-		public static readonly string LEGACY_KEY = 
-			@"Software\Nascent Software\Nunit\";
-
-		private static bool testMode = false;
-		public static readonly string TEST_KEY = 
-			@"Software\nunit.org\Nunit-Test";
-
-
-		/// <summary>
-		/// Prevent construction of object
-		/// </summary>
-		private NUnitRegistry() { }
-
-		public static bool TestMode
-		{
-			get { return testMode; }
-			set { testMode = value; }
-		}
-
-		/// <summary>
-		/// Registry subkey for the current user
-		/// </summary>
-		public static RegistryKey CurrentUser
-		{
-			get 
-			{
-				if ( testMode )
-					return Registry.CurrentUser.CreateSubKey( TEST_KEY );
-				
-				RegistryKey newKey = Registry.CurrentUser.OpenSubKey( KEY, true );
-				if (newKey == null)
-				{
-					newKey = Registry.CurrentUser.CreateSubKey( KEY );
-					RegistryKey oldKey = Registry.CurrentUser.OpenSubKey( LEGACY_KEY );
-					if ( oldKey != null )
-					{
-						CopyKey( oldKey, newKey );
-						oldKey.Close();
-					}
-				}
-
-				return newKey; 
-			}
-		}
-
-		public static bool KeyExists( string subkey )
-		{
-			using ( RegistryKey key = Registry.CurrentUser.OpenSubKey( subkey, true ) )
-			{
-				return key != null;
-			} 
-		}
-
-		public static void ClearTestKeys()
-		{
-			ClearSubKey( Registry.CurrentUser, TEST_KEY );
-			//ClearSubKey( Registry.LocalMachine, TEST_KEY );	
-		}
-
-		/// <summary>
-		/// Static helper method that clears out the contents of a subkey
-		/// </summary>
-		/// <param name="baseKey">Base key for the subkey</param>
-		/// <param name="subKey">Name of the subkey</param>
-		private static void ClearSubKey( RegistryKey baseKey, string subKey )
-		{
-			using( RegistryKey key = baseKey.OpenSubKey( subKey, true ) )
-			{
-				if ( key != null ) ClearKey( key );
-			}
-		}
-
-		/// <summary>
-		/// Static function that clears out the contents of a key
-		/// </summary>
-		/// <param name="key">Key to be cleared</param>
-		public static void ClearKey( RegistryKey key )
-		{
-			foreach( string name in key.GetValueNames() )
-				key.DeleteValue( name );
-
-			// TODO: This throws under Mono - Restore when bug is fixed
-			//foreach( string name in key.GetSubKeyNames() )
-			//    key.DeleteSubKeyTree( name );
-
-			foreach (string name in key.GetSubKeyNames())
-			{
-				ClearSubKey(key, name);
-				key.DeleteSubKey( name );
-			}
-		}
-
-		/// <summary>
-		/// Static method that copies the contents of one key to another
-		/// </summary>
-		/// <param name="fromKey">The source key for the copy</param>
-		/// <param name="toKey">The target key for the copy</param>
-		public static void CopyKey( RegistryKey fromKey, RegistryKey toKey )
-		{
-			foreach( string name in fromKey.GetValueNames() )
-				toKey.SetValue( name, fromKey.GetValue( name ) );
-
-			foreach( string name in fromKey.GetSubKeyNames() )
-				using( RegistryKey fromSubKey = fromKey.OpenSubKey( name ) )
-				using( RegistryKey toSubKey = toKey.CreateSubKey( name ) )
-				{
-					CopyKey( fromSubKey, toSubKey );
-				}
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.IO;
+	using System.Text;
+	using Microsoft.Win32;
+
+	/// <summary>
+	/// NUnitRegistry provides static properties for NUnit's
+	/// subkey under CurrentUser.
+	/// </summary>
+	public class NUnitRegistry
+	{
+		public static readonly string KEY = 
+			@"Software\nunit.org\Nunit\2.4";
+
+		public static readonly string LEGACY_KEY = 
+			@"Software\Nascent Software\Nunit\";
+
+		private static bool testMode = false;
+		public static readonly string TEST_KEY = 
+			@"Software\nunit.org\Nunit-Test";
+
+
+		/// <summary>
+		/// Prevent construction of object
+		/// </summary>
+		private NUnitRegistry() { }
+
+		public static bool TestMode
+		{
+			get { return testMode; }
+			set { testMode = value; }
+		}
+
+		/// <summary>
+		/// Registry subkey for the current user
+		/// </summary>
+		public static RegistryKey CurrentUser
+		{
+			get 
+			{
+				if ( testMode )
+					return Registry.CurrentUser.CreateSubKey( TEST_KEY );
+				
+				RegistryKey newKey = Registry.CurrentUser.OpenSubKey( KEY, true );
+				if (newKey == null)
+				{
+					newKey = Registry.CurrentUser.CreateSubKey( KEY );
+					RegistryKey oldKey = Registry.CurrentUser.OpenSubKey( LEGACY_KEY );
+					if ( oldKey != null )
+					{
+						CopyKey( oldKey, newKey );
+						oldKey.Close();
+					}
+				}
+
+				return newKey; 
+			}
+		}
+
+		public static bool KeyExists( string subkey )
+		{
+			using ( RegistryKey key = Registry.CurrentUser.OpenSubKey( subkey, true ) )
+			{
+				return key != null;
+			} 
+		}
+
+		public static void ClearTestKeys()
+		{
+			ClearSubKey( Registry.CurrentUser, TEST_KEY );
+			//ClearSubKey( Registry.LocalMachine, TEST_KEY );	
+		}
+
+		/// <summary>
+		/// Static helper method that clears out the contents of a subkey
+		/// </summary>
+		/// <param name="baseKey">Base key for the subkey</param>
+		/// <param name="subKey">Name of the subkey</param>
+		private static void ClearSubKey( RegistryKey baseKey, string subKey )
+		{
+			using( RegistryKey key = baseKey.OpenSubKey( subKey, true ) )
+			{
+				if ( key != null ) ClearKey( key );
+			}
+		}
+
+		/// <summary>
+		/// Static function that clears out the contents of a key
+		/// </summary>
+		/// <param name="key">Key to be cleared</param>
+		public static void ClearKey( RegistryKey key )
+		{
+			foreach( string name in key.GetValueNames() )
+				key.DeleteValue( name );
+
+			// TODO: This throws under Mono - Restore when bug is fixed
+			//foreach( string name in key.GetSubKeyNames() )
+			//    key.DeleteSubKeyTree( name );
+
+			foreach (string name in key.GetSubKeyNames())
+			{
+				ClearSubKey(key, name);
+				key.DeleteSubKey( name );
+			}
+		}
+
+		/// <summary>
+		/// Static method that copies the contents of one key to another
+		/// </summary>
+		/// <param name="fromKey">The source key for the copy</param>
+		/// <param name="toKey">The target key for the copy</param>
+		public static void CopyKey( RegistryKey fromKey, RegistryKey toKey )
+		{
+			foreach( string name in fromKey.GetValueNames() )
+				toKey.SetValue( name, fromKey.GetValue( name ) );
+
+			foreach( string name in fromKey.GetSubKeyNames() )
+				using( RegistryKey fromSubKey = fromKey.OpenSubKey( name ) )
+				using( RegistryKey toSubKey = toKey.CreateSubKey( name ) )
+				{
+					CopyKey( fromSubKey, toSubKey );
+				}
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/PathUtils.cs b/src/ClientUtilities/util/PathUtils.cs
index 63f33c4..e95c456 100644
--- a/src/ClientUtilities/util/PathUtils.cs
+++ b/src/ClientUtilities/util/PathUtils.cs
@@ -1,265 +1,265 @@
-// ****************************************************************
-// 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.Text;
-using System.Reflection;
-using System.Collections;
-using System.Runtime.InteropServices;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Static methods for manipulating project 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 )
-		{
-			ArrayList parts = new ArrayList(
-				path.Split( DirectorySeparatorChar, AltDirectorySeparatorChar ) );
-
-			for( int index = 0; index < parts.Count; )
-			{
-				string part = (string)parts[index];
-		
-				switch( part )
-				{
-					case ".":
-						parts.RemoveAt( index );
-						break;
-				
-					case "..":
-						parts.RemoveAt( index );
-						if ( index > 0 )
-							parts.RemoveAt( --index );
-						break;
-					default:
-						index++;
-						break;
-				}
-			}
-
-            // Trailing separator removal
-            if (parts.Count > 1 && path.Length > 1 && (string)parts[parts.Count - 1] == "")
-                parts.RemoveAt(parts.Count - 1);
-
-            return String.Join(DirectorySeparatorChar.ToString(), (string[])parts.ToArray(typeof(string)));
-		}
-
-		/// <summary>
-		/// 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;
-		}
-
-        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 )
-		{
-			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
-	}
-}
+// ****************************************************************
+// 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.Text;
+using System.Reflection;
+using System.Collections;
+using System.Runtime.InteropServices;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Static methods for manipulating project 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 )
+		{
+			ArrayList parts = new ArrayList(
+				path.Split( DirectorySeparatorChar, AltDirectorySeparatorChar ) );
+
+			for( int index = 0; index < parts.Count; )
+			{
+				string part = (string)parts[index];
+		
+				switch( part )
+				{
+					case ".":
+						parts.RemoveAt( index );
+						break;
+				
+					case "..":
+						parts.RemoveAt( index );
+						if ( index > 0 )
+							parts.RemoveAt( --index );
+						break;
+					default:
+						index++;
+						break;
+				}
+			}
+
+            // Trailing separator removal
+            if (parts.Count > 1 && path.Length > 1 && (string)parts[parts.Count - 1] == "")
+                parts.RemoveAt(parts.Count - 1);
+
+            return String.Join(DirectorySeparatorChar.ToString(), (string[])parts.ToArray(typeof(string)));
+		}
+
+		/// <summary>
+		/// 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;
+		}
+
+        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 )
+		{
+			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/ClientUtilities/util/ProcessRunner.cs b/src/ClientUtilities/util/ProcessRunner.cs
index 8a4c002..e7ea90f 100644
--- a/src/ClientUtilities/util/ProcessRunner.cs
+++ b/src/ClientUtilities/util/ProcessRunner.cs
@@ -1,121 +1,118 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Diagnostics;
-using System.Reflection;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Proxies;
-using System.Runtime.Remoting.Services;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for ProcessRunner.
-	/// </summary>
-	public class ProcessRunner : ProxyTestRunner
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(ProcessRunner));
-
-		private TestAgent agent;
-
-        private RuntimeFramework runtimeFramework;
-
-		#region Constructors
-		public ProcessRunner() : base( 0 ) { }
-
-		public ProcessRunner( int runnerID ) : base( runnerID ) { }
-		#endregion
-
-        #region Properties
-        public RuntimeFramework RuntimeFramework
-        {
-            get { return runtimeFramework; }
-        }
-        #endregion
-
-        public override bool Load(TestPackage package)
-		{
-            log.Info("Loading " + package.Name);
-			Unload();
-
-            runtimeFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;
-            if ( runtimeFramework == null )
-                 runtimeFramework = RuntimeFramework.CurrentFramework;
-
-            bool enableDebug = package.GetSetting("EnableDebug", false);
-
-            bool loaded = false;
-
-			try
-			{
-                if (this.agent == null)
-                {
-                    this.agent = Services.TestAgency.GetAgent(
-                        runtimeFramework,
-                        30000,
-                        enableDebug);
-
-                    if (this.agent == null)
-                        return false;
-                }
-	
-				if ( this.TestRunner == null )
-					this.TestRunner = agent.CreateRunner(this.runnerID);
-
-				loaded = base.Load (package);
-                return loaded;
-			}
-			finally
-			{
-                // Clean up if the load failed
-				if ( !loaded ) Unload();
-			}
-		}
-
-        public override void Unload()
-        {
-            if (Test != null)
-            {
-                log.Info("Unloading " + Path.GetFileName(Test.TestName.Name));
-                this.TestRunner.Unload();
-                this.TestRunner = null;
-            }
-		}
-
-		#region IDisposable Members
-
-		public override void Dispose()
-		{
-            // Do this first, because the next step will
-            // make the downstream runner inaccessible.
-            base.Dispose();
-
-            if (this.agent != null)
-            {
-                log.Info("Stopping remote agent");
-                try
-                {
-                    agent.Stop();
-                }
-                catch
-                {
-                    // Ignore any exception
-                }
-                finally
-                {
-                    this.agent = null;
-                }
-            }
-        }
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Reflection;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Proxies;
+using System.Runtime.Remoting.Services;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for ProcessRunner.
+	/// </summary>
+	public class ProcessRunner : ProxyTestRunner
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(ProcessRunner));
+
+		private TestAgent agent;
+
+        private RuntimeFramework runtimeFramework;
+
+		#region Constructors
+		public ProcessRunner() : base( 0 ) { }
+
+		public ProcessRunner( int runnerID ) : base( runnerID ) { }
+		#endregion
+
+        #region Properties
+        public RuntimeFramework RuntimeFramework
+        {
+            get { return runtimeFramework; }
+        }
+        #endregion
+
+        public override bool Load(TestPackage package)
+		{
+            log.Info("Loading " + package.Name);
+			Unload();
+
+            runtimeFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;
+            if ( runtimeFramework == null )
+                 runtimeFramework = RuntimeFramework.CurrentFramework;
+
+            bool loaded = false;
+
+			try
+			{
+                if (this.agent == null)
+                {
+                    this.agent = Services.TestAgency.GetAgent(
+                        runtimeFramework,
+                        30000);
+
+                    if (this.agent == null)
+                        return false;
+                }
+	
+				if ( this.TestRunner == null )
+					this.TestRunner = agent.CreateRunner(this.runnerID);
+
+				loaded = base.Load (package);
+                return loaded;
+			}
+			finally
+			{
+                // Clean up if the load failed
+				if ( !loaded ) Unload();
+			}
+		}
+
+        public override void Unload()
+        {
+            if (Test != null)
+            {
+                log.Info("Unloading " + Path.GetFileName(Test.TestName.Name));
+                this.TestRunner.Unload();
+                this.TestRunner = null;
+            }
+		}
+
+		#region IDisposable Members
+
+		public override void Dispose()
+		{
+            // Do this first, because the next step will
+            // make the downstream runner inaccessible.
+            base.Dispose();
+
+            if (this.agent != null)
+            {
+                log.Info("Stopping remote agent");
+                try
+                {
+                    agent.Stop();
+                }
+                catch
+                {
+                    // Ignore any exception
+                }
+                finally
+                {
+                    this.agent = null;
+                }
+            }
+        }
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/ProjectConfig.cs b/src/ClientUtilities/util/ProjectConfig.cs
index 4fff812..6baae21 100644
--- a/src/ClientUtilities/util/ProjectConfig.cs
+++ b/src/ClientUtilities/util/ProjectConfig.cs
@@ -1,282 +1,282 @@
-// ****************************************************************
-// 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.Collections;
-using System.IO;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	public enum BinPathType
-	{
-		Auto,
-		Manual,
-		None
-	}
-
-	public class ProjectConfig
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// The name of this config
-		/// </summary>
-		private string name;
-
-		/// <summary>
-		/// IProject interface of containing project
-		/// </summary>
-		protected NUnitProject project = null;
-
-		/// <summary>
-		/// List of the names of the assemblies
-		/// </summary>
-		private AssemblyList assemblies;
-
-		/// <summary>
-		/// Base path specific to this configuration
-		/// </summary>
-		private string basePath;
-
-		/// <summary>
-		/// Our configuration file, if specified
-		/// </summary>
-		private string configFile;
-
-		/// <summary>
-		/// Private bin path, if specified
-		/// </summary>
-		private string binPath;
-
-		/// <summary>
-		/// True if assembly paths should be added to bin path
-		/// </summary>
-		private BinPathType binPathType = BinPathType.Auto;
-        
-        /// <summary>
-        /// The CLR under which tests are to be run
-        /// </summary>
-        private RuntimeFramework runtimeFramework;
-
-		#endregion
-
-		#region Constructor
-		public ProjectConfig( string name )
-		{
-			this.name = name;
-			this.assemblies = new AssemblyList();
-			assemblies.Changed += new EventHandler( assemblies_Changed );
-		}
-		#endregion
-
-		#region Properties and Events
-
-		public NUnitProject Project
-		{
-			set { project = value; }
-		}
-
-		public string Name
-		{
-			get { return name; }
-			set 
-			{
-				if ( name != value )
-				{
-					name = value;
-					NotifyProjectOfChange();
-				}
-			}
-		}
-
-		private bool BasePathSpecified
-		{
-			get 
-			{
-				return project.BasePathSpecified || this.basePath != null && this.basePath != "";
-			}
-		}
-
-		/// <summary>
-		/// The base directory for this config - used
-		/// as the application base for loading tests.
-		/// </summary>
-		public string BasePath
-		{
-			get
-			{ 
-				if ( project == null || project.BasePath == null )
-					return basePath;
-
-				if ( basePath == null )
-					return project.BasePath;
-
-				return Path.Combine( project.BasePath, basePath );
-			}
-			set 
-			{
-				if ( BasePath != value )
-				{
-					basePath = value;
-					NotifyProjectOfChange();
-				}
-			}
-		}
-
-		/// <summary>
-		/// The base path relative to the project base
-		/// </summary>
-		public string RelativeBasePath
-		{
-			get
-			{
-				if ( project == null || basePath == null || !Path.IsPathRooted( basePath ) )
-					return basePath;
-
-				return PathUtils.RelativePath( project.BasePath, basePath );
-			}
-		}
-
-		private bool ConfigurationFileSpecified
-		{
-			get { return configFile != null; }
-		}
-
-		public string ConfigurationFile
-		{
-			get 
-			{ 
-				return configFile == null && project != null
-					? project.ConfigurationFile 
-					: configFile;
-			}
-			set
-			{
-				if ( ConfigurationFile != value )
-				{
-					configFile = value;
-					NotifyProjectOfChange();
-				}
-			}
-		}
-
-		public string ConfigurationFilePath
-		{
-			get
-			{		
-				return BasePath != null && ConfigurationFile != null
-					? Path.Combine( BasePath, ConfigurationFile )
-					: ConfigurationFile;
-			}
-		}
-
-		private bool PrivateBinPathSpecified
-		{
-			get { return binPath != null; }
-		}
-
-		/// <summary>
-		/// The Path.PathSeparator-separated path containing all the
-		/// assemblies in the list.
-		/// </summary>
-		public string PrivateBinPath
-		{
-			get	{ return binPath; }
-			set
-			{
-				if ( binPath != value )
-				{
-					binPath = value;
-					binPathType = binPath == null ? BinPathType.Auto : BinPathType.Manual;
-					NotifyProjectOfChange();
-				}
-			}
-		}
-
-		/// <summary>
-		/// How our PrivateBinPath is generated
-		/// </summary>
-		public BinPathType BinPathType
-		{
-			get { return binPathType; }
-			set 
-			{
-				if ( binPathType != value )
-				{
-					binPathType = value;
-					NotifyProjectOfChange();
-				}
-			}
-		}
-
-		/// <summary>
-		/// Return our AssemblyList
-		/// </summary>
-		public AssemblyList Assemblies
-		{
-			get { return assemblies; }
-		}
-
-        public RuntimeFramework RuntimeFramework
-        {
-            get { return runtimeFramework; }
-            set 
-			{
-				if ( runtimeFramework != value )
-				{
-					runtimeFramework = value; 
-					NotifyProjectOfChange();
-				}
-			}
-        }
-		#endregion
-
-		public TestPackage MakeTestPackage()
-		{
-			TestPackage package = new TestPackage( project.ProjectPath );
-
-			if ( !project.IsAssemblyWrapper )
-				foreach ( string assembly in this.Assemblies )
-					package.Assemblies.Add( assembly );
-
-			if ( this.BasePathSpecified || this.PrivateBinPathSpecified || this.ConfigurationFileSpecified )
-			{
-				package.BasePath = this.BasePath;
-				package.PrivateBinPath = this.PrivateBinPath;
-				package.ConfigurationFile = this.ConfigurationFile;
-			}
-
-			package.AutoBinPath = this.BinPathType == BinPathType.Auto;
-            if (this.RuntimeFramework != null)
-                package.Settings["RuntimeFramework"] = this.RuntimeFramework;
-
-            if (project.ProcessModel != ProcessModel.Default)
-                package.Settings["ProcessModel"] = project.ProcessModel;
-
-            if (project.DomainUsage != DomainUsage.Default)
-                package.Settings["DomainUsage"] = project.DomainUsage;
-
-			return package;
-		}
-
-		private void assemblies_Changed( object sender, EventArgs e )
-		{
-			NotifyProjectOfChange();
-		}
-
-        private void NotifyProjectOfChange()
-        {
-            if (project != null)
-            {
-                project.IsDirty = true;
-                if (ReferenceEquals(this, project.ActiveConfig))
-                    project.HasChangesRequiringReload = true;
-            }
-        }
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using System.IO;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	public enum BinPathType
+	{
+		Auto,
+		Manual,
+		None
+	}
+
+	public class ProjectConfig
+	{
+		#region Instance Variables
+
+		/// <summary>
+		/// The name of this config
+		/// </summary>
+		private string name;
+
+		/// <summary>
+		/// IProject interface of containing project
+		/// </summary>
+		protected NUnitProject project = null;
+
+		/// <summary>
+		/// List of the names of the assemblies
+		/// </summary>
+		private AssemblyList assemblies;
+
+		/// <summary>
+		/// Base path specific to this configuration
+		/// </summary>
+		private string basePath;
+
+		/// <summary>
+		/// Our configuration file, if specified
+		/// </summary>
+		private string configFile;
+
+		/// <summary>
+		/// Private bin path, if specified
+		/// </summary>
+		private string binPath;
+
+		/// <summary>
+		/// True if assembly paths should be added to bin path
+		/// </summary>
+		private BinPathType binPathType = BinPathType.Auto;
+        
+        /// <summary>
+        /// The CLR under which tests are to be run
+        /// </summary>
+        private RuntimeFramework runtimeFramework;
+
+		#endregion
+
+		#region Constructor
+		public ProjectConfig( string name )
+		{
+			this.name = name;
+			this.assemblies = new AssemblyList();
+			assemblies.Changed += new EventHandler( assemblies_Changed );
+		}
+		#endregion
+
+		#region Properties and Events
+
+		public NUnitProject Project
+		{
+			set { project = value; }
+		}
+
+		public string Name
+		{
+			get { return name; }
+			set 
+			{
+				if ( name != value )
+				{
+					name = value;
+					NotifyProjectOfChange();
+				}
+			}
+		}
+
+		private bool BasePathSpecified
+		{
+			get 
+			{
+				return project.BasePathSpecified || this.basePath != null && this.basePath != "";
+			}
+		}
+
+		/// <summary>
+		/// The base directory for this config - used
+		/// as the application base for loading tests.
+		/// </summary>
+		public string BasePath
+		{
+			get
+			{ 
+				if ( project == null || project.BasePath == null )
+					return basePath;
+
+				if ( basePath == null )
+					return project.BasePath;
+
+				return Path.Combine( project.BasePath, basePath );
+			}
+			set 
+			{
+				if ( BasePath != value )
+				{
+					basePath = value;
+					NotifyProjectOfChange();
+				}
+			}
+		}
+
+		/// <summary>
+		/// The base path relative to the project base
+		/// </summary>
+		public string RelativeBasePath
+		{
+			get
+			{
+				if ( project == null || basePath == null || !Path.IsPathRooted( basePath ) )
+					return basePath;
+
+				return PathUtils.RelativePath( project.BasePath, basePath );
+			}
+		}
+
+		private bool ConfigurationFileSpecified
+		{
+			get { return configFile != null; }
+		}
+
+		public string ConfigurationFile
+		{
+			get 
+			{ 
+				return configFile == null && project != null
+					? project.ConfigurationFile 
+					: configFile;
+			}
+			set
+			{
+				if ( ConfigurationFile != value )
+				{
+					configFile = value;
+					NotifyProjectOfChange();
+				}
+			}
+		}
+
+		public string ConfigurationFilePath
+		{
+			get
+			{		
+				return BasePath != null && ConfigurationFile != null
+					? Path.Combine( BasePath, ConfigurationFile )
+					: ConfigurationFile;
+			}
+		}
+
+		private bool PrivateBinPathSpecified
+		{
+			get { return binPath != null; }
+		}
+
+		/// <summary>
+		/// The Path.PathSeparator-separated path containing all the
+		/// assemblies in the list.
+		/// </summary>
+		public string PrivateBinPath
+		{
+			get	{ return binPath; }
+			set
+			{
+				if ( binPath != value )
+				{
+					binPath = value;
+					binPathType = binPath == null ? BinPathType.Auto : BinPathType.Manual;
+					NotifyProjectOfChange();
+				}
+			}
+		}
+
+		/// <summary>
+		/// How our PrivateBinPath is generated
+		/// </summary>
+		public BinPathType BinPathType
+		{
+			get { return binPathType; }
+			set 
+			{
+				if ( binPathType != value )
+				{
+					binPathType = value;
+					NotifyProjectOfChange();
+				}
+			}
+		}
+
+		/// <summary>
+		/// Return our AssemblyList
+		/// </summary>
+		public AssemblyList Assemblies
+		{
+			get { return assemblies; }
+		}
+
+        public RuntimeFramework RuntimeFramework
+        {
+            get { return runtimeFramework; }
+            set 
+			{
+				if ( runtimeFramework != value )
+				{
+					runtimeFramework = value; 
+					NotifyProjectOfChange();
+				}
+			}
+        }
+		#endregion
+
+		public TestPackage MakeTestPackage()
+		{
+			TestPackage package = new TestPackage( project.ProjectPath );
+
+			if ( !project.IsAssemblyWrapper )
+				foreach ( string assembly in this.Assemblies )
+					package.Assemblies.Add( assembly );
+
+			if ( this.BasePathSpecified || this.PrivateBinPathSpecified || this.ConfigurationFileSpecified )
+			{
+				package.BasePath = this.BasePath;
+				package.PrivateBinPath = this.PrivateBinPath;
+				package.ConfigurationFile = this.ConfigurationFile;
+			}
+
+			package.AutoBinPath = this.BinPathType == BinPathType.Auto;
+            if (this.RuntimeFramework != null)
+                package.Settings["RuntimeFramework"] = this.RuntimeFramework;
+
+            if (project.ProcessModel != ProcessModel.Default)
+                package.Settings["ProcessModel"] = project.ProcessModel;
+
+            if (project.DomainUsage != DomainUsage.Default)
+                package.Settings["DomainUsage"] = project.DomainUsage;
+
+			return package;
+		}
+
+		private void assemblies_Changed( object sender, EventArgs e )
+		{
+			NotifyProjectOfChange();
+		}
+
+        private void NotifyProjectOfChange()
+        {
+            if (project != null)
+            {
+                project.IsDirty = true;
+                if (ReferenceEquals(this, project.ActiveConfig))
+                    project.HasChangesRequiringReload = true;
+            }
+        }
+	}
+}
diff --git a/src/ClientUtilities/util/ProjectConfigCollection.cs b/src/ClientUtilities/util/ProjectConfigCollection.cs
index e9663c0..ce31553 100644
--- a/src/ClientUtilities/util/ProjectConfigCollection.cs
+++ b/src/ClientUtilities/util/ProjectConfigCollection.cs
@@ -1,105 +1,105 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for ProjectConfigCollection.
-	/// </summary>
-	public class ProjectConfigCollection : CollectionBase
-	{
-		protected NUnitProject project;
-
-		public ProjectConfigCollection( NUnitProject project ) 
-		{ 
-			this.project = project;
-		}
-
-		#region Properties
-		public ProjectConfig this[int index]
-		{
-			get { return (ProjectConfig)InnerList[index]; }
-		}
-
-		public ProjectConfig this[string name]
-		{
-			get 
-			{ 
-				int index = IndexOf( name );
-				return index >= 0 ? (ProjectConfig)InnerList[index]: null;
-			}
-		}
-		#endregion
-
-		#region Methods
-		public void Add( ProjectConfig config )
-		{
-			List.Add( config );
-			config.Project = this.project;
-		}
-
-		public void Add( string name )
-		{
-			Add( new ProjectConfig( name ) );
-		}
-
-		public void Remove( string name )
-		{
-			int index = IndexOf( name );
-			if ( index >= 0 )
-			{
-				RemoveAt( index );
-			}
-		}
-
-		private int IndexOf( string name )
-		{
-			for( int index = 0; index < InnerList.Count; index++ )
-			{
-				ProjectConfig config = (ProjectConfig)InnerList[index];
-				if( config.Name == name )
-					return index;
-			}
-
-			return -1;
-		}
-
-		public bool Contains( ProjectConfig config )
-		{
-			return InnerList.Contains( config );
-		}
-
-		public bool Contains( string name )
-		{
-			return IndexOf( name ) >= 0;
-		}
-
-        protected override void OnRemove(int index, object value)
-        {
-            if (project != null)
-            {
-                ProjectConfig config = value as ProjectConfig;
-                project.IsDirty = true;
-                if ( config.Name == project.ActiveConfigName )
-                    project.HasChangesRequiringReload =  true;
-            }
-        }
-
-		protected override void OnInsertComplete( int index, object obj )
-		{
-            if (project != null)
-            {
-                project.IsDirty = true;
-                if (this.Count == 1)
-                    project.HasChangesRequiringReload = true;
-            }
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for ProjectConfigCollection.
+	/// </summary>
+	public class ProjectConfigCollection : CollectionBase
+	{
+		protected NUnitProject project;
+
+		public ProjectConfigCollection( NUnitProject project ) 
+		{ 
+			this.project = project;
+		}
+
+		#region Properties
+		public ProjectConfig this[int index]
+		{
+			get { return (ProjectConfig)InnerList[index]; }
+		}
+
+		public ProjectConfig this[string name]
+		{
+			get 
+			{ 
+				int index = IndexOf( name );
+				return index >= 0 ? (ProjectConfig)InnerList[index]: null;
+			}
+		}
+		#endregion
+
+		#region Methods
+		public void Add( ProjectConfig config )
+		{
+			List.Add( config );
+			config.Project = this.project;
+		}
+
+		public void Add( string name )
+		{
+			Add( new ProjectConfig( name ) );
+		}
+
+		public void Remove( string name )
+		{
+			int index = IndexOf( name );
+			if ( index >= 0 )
+			{
+				RemoveAt( index );
+			}
+		}
+
+		private int IndexOf( string name )
+		{
+			for( int index = 0; index < InnerList.Count; index++ )
+			{
+				ProjectConfig config = (ProjectConfig)InnerList[index];
+				if( config.Name == name )
+					return index;
+			}
+
+			return -1;
+		}
+
+		public bool Contains( ProjectConfig config )
+		{
+			return InnerList.Contains( config );
+		}
+
+		public bool Contains( string name )
+		{
+			return IndexOf( name ) >= 0;
+		}
+
+        protected override void OnRemove(int index, object value)
+        {
+            if (project != null)
+            {
+                ProjectConfig config = value as ProjectConfig;
+                project.IsDirty = true;
+                if ( config.Name == project.ActiveConfigName )
+                    project.HasChangesRequiringReload =  true;
+            }
+        }
+
+		protected override void OnInsertComplete( int index, object obj )
+		{
+            if (project != null)
+            {
+                project.IsDirty = true;
+                if (this.Count == 1)
+                    project.HasChangesRequiringReload = true;
+            }
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs b/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
index 42823e9..a3edbd8 100644
--- a/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
+++ b/src/ClientUtilities/util/ProjectConverters/VisualStudioConverter.cs
@@ -1,154 +1,154 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.IO;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-using NUnit.Util.Extensibility;
-
-namespace NUnit.Util.ProjectConverters
-{
-	/// <summary>
-	/// Summary description for VSProjectLoader.
-	/// </summary>
-	public class VisualStudioConverter : IProjectConverter
-	{
-		#region IProjectConverter Members
-
-		public bool CanConvertFrom(string path)
-		{
-			return VSProject.IsProjectFile(path)|| VSProject.IsSolutionFile(path);
-		}
-
-		public NUnitProject ConvertFrom(string path)
-		{
-			if ( VSProject.IsProjectFile(path) )
-			{
-                return ConvertVSProject(path);
-			}
-			else if ( VSProject.IsSolutionFile(path) )
-			{
-                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;
-        }
-
-        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
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.IO;
+using NUnit.Core;
+using NUnit.Core.Extensibility;
+using NUnit.Util.Extensibility;
+
+namespace NUnit.Util.ProjectConverters
+{
+	/// <summary>
+	/// Summary description for VSProjectLoader.
+	/// </summary>
+	public class VisualStudioConverter : IProjectConverter
+	{
+		#region IProjectConverter Members
+
+		public bool CanConvertFrom(string path)
+		{
+			return VSProject.IsProjectFile(path)|| VSProject.IsSolutionFile(path);
+		}
+
+		public NUnitProject ConvertFrom(string path)
+		{
+			if ( VSProject.IsProjectFile(path) )
+			{
+                return ConvertVSProject(path);
+			}
+			else if ( VSProject.IsSolutionFile(path) )
+			{
+                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;
+        }
+
+        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/ProjectFormatException.cs b/src/ClientUtilities/util/ProjectFormatException.cs
index 1455d69..0b31398 100644
--- a/src/ClientUtilities/util/ProjectFormatException.cs
+++ b/src/ClientUtilities/util/ProjectFormatException.cs
@@ -1,58 +1,58 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Exception raised when loading a project file with
-	/// an invalid format.
-	/// </summary>
-	public class ProjectFormatException : ApplicationException
-	{
-		#region Instance Variables
-
-		private int lineNumber;
-
-		private int linePosition;
-
-		#endregion
-
-		#region Constructors
-
-		public ProjectFormatException() : base() {}
-
-		public ProjectFormatException( string message )
-			: base( message ) {}
-
-		public ProjectFormatException( string message, Exception inner )
-			: base( message, inner ) {}
-
-		public ProjectFormatException( string message, int lineNumber, int linePosition )
-			: base( message )
-		{
-			this.lineNumber = lineNumber;
-			this.linePosition = linePosition;
-		}
-
-		#endregion
-
-		#region Properties
-
-		public int LineNumber
-		{
-			get { return lineNumber; }
-		}
-
-		public int LinePosition
-		{
-			get { return linePosition; }
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Exception raised when loading a project file with
+	/// an invalid format.
+	/// </summary>
+	public class ProjectFormatException : ApplicationException
+	{
+		#region Instance Variables
+
+		private int lineNumber;
+
+		private int linePosition;
+
+		#endregion
+
+		#region Constructors
+
+		public ProjectFormatException() : base() {}
+
+		public ProjectFormatException( string message )
+			: base( message ) {}
+
+		public ProjectFormatException( string message, Exception inner )
+			: base( message, inner ) {}
+
+		public ProjectFormatException( string message, int lineNumber, int linePosition )
+			: base( message )
+		{
+			this.lineNumber = lineNumber;
+			this.linePosition = linePosition;
+		}
+
+		#endregion
+
+		#region Properties
+
+		public int LineNumber
+		{
+			get { return lineNumber; }
+		}
+
+		public int LinePosition
+		{
+			get { return linePosition; }
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/RecentFileEntry.cs b/src/ClientUtilities/util/RecentFileEntry.cs
index c365ff3..07d0618 100644
--- a/src/ClientUtilities/util/RecentFileEntry.cs
+++ b/src/ClientUtilities/util/RecentFileEntry.cs
@@ -1,74 +1,74 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	public class RecentFileEntry
-	{
-		public static readonly char Separator = ',';
-
-		private string path;
-		
-		private Version clrVersion;
-
-		public RecentFileEntry( string path )
-		{
-			this.path = path;
-			this.clrVersion = Environment.Version;
-		}
-
-		public RecentFileEntry( string path, Version clrVersion )
-		{
-			this.path = path;
-			this.clrVersion = clrVersion;
-		}
-
-		public string Path
-		{
-			get { return path; }
-		}
-
-		public Version CLRVersion
-		{
-			get { return clrVersion; }
-		}
-
-		public bool Exists
-		{
-			get { return path != null && System.IO.File.Exists( path ); }
-		}
-
-		public bool IsCompatibleCLRVersion
-		{
-			get { return clrVersion.Major <= Environment.Version.Major; }
-		}
-
-		public override string ToString()
-		{
-			return Path + Separator + CLRVersion.ToString();
-		}
-
-		public static RecentFileEntry Parse( string text )
-		{
-			int sepIndex = text.LastIndexOf( Separator );
-
-			if ( sepIndex > 0 )
-				try
-				{
-					return new RecentFileEntry( text.Substring( 0, sepIndex ), 
-						new Version( text.Substring( sepIndex + 1 ) ) );
-				}
-				catch
-				{
-					//The last part was not a version, so fall through and return the whole text
-				}
-			
-			return new RecentFileEntry( text );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	public class RecentFileEntry
+	{
+		public static readonly char Separator = ',';
+
+		private string path;
+		
+		private Version clrVersion;
+
+		public RecentFileEntry( string path )
+		{
+			this.path = path;
+			this.clrVersion = Environment.Version;
+		}
+
+		public RecentFileEntry( string path, Version clrVersion )
+		{
+			this.path = path;
+			this.clrVersion = clrVersion;
+		}
+
+		public string Path
+		{
+			get { return path; }
+		}
+
+		public Version CLRVersion
+		{
+			get { return clrVersion; }
+		}
+
+		public bool Exists
+		{
+			get { return path != null && System.IO.File.Exists( path ); }
+		}
+
+		public bool IsCompatibleCLRVersion
+		{
+			get { return clrVersion.Major <= Environment.Version.Major; }
+		}
+
+		public override string ToString()
+		{
+			return Path + Separator + CLRVersion.ToString();
+		}
+
+		public static RecentFileEntry Parse( string text )
+		{
+			int sepIndex = text.LastIndexOf( Separator );
+
+			if ( sepIndex > 0 )
+				try
+				{
+					return new RecentFileEntry( text.Substring( 0, sepIndex ), 
+						new Version( text.Substring( sepIndex + 1 ) ) );
+				}
+				catch
+				{
+					//The last part was not a version, so fall through and return the whole text
+				}
+			
+			return new RecentFileEntry( text );
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/RecentFiles.cs b/src/ClientUtilities/util/RecentFiles.cs
index f93d6fd..59aa334 100644
--- a/src/ClientUtilities/util/RecentFiles.cs
+++ b/src/ClientUtilities/util/RecentFiles.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// The RecentFiles interface is used to isolate the app
-	/// from various implementations of recent files.
-	/// </summary>
-	public interface RecentFiles
-	{ 
-		/// <summary>
-		/// The max number of files saved
-		/// </summary>
-		int MaxFiles { get; set; }
-
-		/// <summary>
-		/// The current number of saved files
-		/// </summary>
-		int Count { get; }
-
-		/// <summary>
-		/// Get a list of all the file entries
-		/// </summary>
-		/// <returns>The most recent file list</returns>
-		RecentFilesCollection Entries { get; }
-
-		/// <summary>
-		/// Set the most recent file entry, reordering
-		/// the saved names as needed and removing the oldest
-		/// if the max number of files would be exceeded.
-		/// </summary>
-		void SetMostRecent( RecentFileEntry entry );
-
-		/// <summary>
-		/// Set the most recent file name, reordering
-		/// the saved names as needed and removing the oldest
-		/// if the max number of files would be exceeded.
-		/// The current CLR version is used to create the entry.
-		/// </summary>
-		void SetMostRecent( string fileName );
-
-		/// <summary>
-		/// Remove a file from the list
-		/// </summary>
-		/// <param name="fileName">The name of the file to remove</param>
-		void Remove( string fileName );
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// The RecentFiles interface is used to isolate the app
+	/// from various implementations of recent files.
+	/// </summary>
+	public interface RecentFiles
+	{ 
+		/// <summary>
+		/// The max number of files saved
+		/// </summary>
+		int MaxFiles { get; set; }
+
+		/// <summary>
+		/// The current number of saved files
+		/// </summary>
+		int Count { get; }
+
+		/// <summary>
+		/// Get a list of all the file entries
+		/// </summary>
+		/// <returns>The most recent file list</returns>
+		RecentFilesCollection Entries { get; }
+
+		/// <summary>
+		/// Set the most recent file entry, reordering
+		/// the saved names as needed and removing the oldest
+		/// if the max number of files would be exceeded.
+		/// </summary>
+		void SetMostRecent( RecentFileEntry entry );
+
+		/// <summary>
+		/// Set the most recent file name, reordering
+		/// the saved names as needed and removing the oldest
+		/// if the max number of files would be exceeded.
+		/// The current CLR version is used to create the entry.
+		/// </summary>
+		void SetMostRecent( string fileName );
+
+		/// <summary>
+		/// Remove a file from the list
+		/// </summary>
+		/// <param name="fileName">The name of the file to remove</param>
+		void Remove( string fileName );
+	}
+}
diff --git a/src/ClientUtilities/util/RecentFilesCollection.cs b/src/ClientUtilities/util/RecentFilesCollection.cs
index 9603168..b9ab52a 100644
--- a/src/ClientUtilities/util/RecentFilesCollection.cs
+++ b/src/ClientUtilities/util/RecentFilesCollection.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for RecentFilesCollection.
-	/// </summary>
-	public class RecentFilesCollection : ReadOnlyCollectionBase
-	{
-		public void Add( RecentFileEntry entry )
-		{
-			InnerList.Add( entry );
-		}
-
-		public void Insert( int index, RecentFileEntry entry )
-		{
-			InnerList.Insert( index, entry );
-		}
-
-		public void Remove( string fileName )
-		{
-			int index = IndexOf( fileName );
-			if ( index != -1 )
-				RemoveAt( index );
-		}
-
-		public void RemoveAt( int index )
-		{
-			InnerList.RemoveAt( index );
-		}
-
-		public int IndexOf( string fileName )
-		{
-			for( int index = 0; index < InnerList.Count; index++ )
-				if ( this[index].Path == fileName )
-					return index;
-			return -1;
-		}
-
-		public RecentFileEntry this[int index]
-		{
-			get { return (RecentFileEntry)InnerList[index]; }
-		}
-
-		public void Clear()
-		{
-			InnerList.Clear();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for RecentFilesCollection.
+	/// </summary>
+	public class RecentFilesCollection : ReadOnlyCollectionBase
+	{
+		public void Add( RecentFileEntry entry )
+		{
+			InnerList.Add( entry );
+		}
+
+		public void Insert( int index, RecentFileEntry entry )
+		{
+			InnerList.Insert( index, entry );
+		}
+
+		public void Remove( string fileName )
+		{
+			int index = IndexOf( fileName );
+			if ( index != -1 )
+				RemoveAt( index );
+		}
+
+		public void RemoveAt( int index )
+		{
+			InnerList.RemoveAt( index );
+		}
+
+		public int IndexOf( string fileName )
+		{
+			for( int index = 0; index < InnerList.Count; index++ )
+				if ( this[index].Path == fileName )
+					return index;
+			return -1;
+		}
+
+		public RecentFileEntry this[int index]
+		{
+			get { return (RecentFileEntry)InnerList[index]; }
+		}
+
+		public void Clear()
+		{
+			InnerList.Clear();
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/RegistrySettingsStorage.cs b/src/ClientUtilities/util/RegistrySettingsStorage.cs
index d8d925d..cfff9db 100644
--- a/src/ClientUtilities/util/RegistrySettingsStorage.cs
+++ b/src/ClientUtilities/util/RegistrySettingsStorage.cs
@@ -1,167 +1,167 @@
-// ****************************************************************
-// 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.Diagnostics;
-using Microsoft.Win32;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Implementation of SettingsStorage for NUnit user settings,
-	/// based on storage of settings in the registry.
-	/// 
-	/// Setting names containing a dot are interpreted as a 
-	/// reference to a subkey. Only the first dot is used
-	/// in this way, since the feature is only intended
-	/// to support legacy registry settings, which are not
-	/// nested any deeper.
-	/// </summary>
-	public class RegistrySettingsStorage : ISettingsStorage
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// If not null, the registry key for this storage
-		/// </summary>
-		private RegistryKey storageKey;
-
-		#endregion
-
-		#region Construction and Disposal
-
-		/// <summary>
-		/// Construct a storage on top of a pre-created registry key
-		/// </summary>
-		/// <param name="storageKey"></param>
-		public RegistrySettingsStorage( RegistryKey storageKey )
-		{
-			this.storageKey = storageKey;
-		}
-
-		#endregion
-
-		#region Properties
-
-		/// <summary>
-		/// The registry key used to hold this storage
-		/// </summary>
-		public RegistryKey StorageKey
-		{
-			get { return storageKey; }
-		}
-
-		#endregion
-
-		#region ISettingsStorage Members
-
-		/// <summary>
-		/// Load a setting from this storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <returns>Value of the setting</returns>
-		public object GetSetting( string settingName )
-		{
-			int dot = settingName.IndexOf( '.' );
-			if ( dot < 0 )
-				return storageKey.GetValue( settingName );
-
-			using( RegistryKey subKey = storageKey.OpenSubKey( settingName.Substring( 0, dot ) ) )
-			{
-				if ( subKey != null )
-					return subKey.GetValue( settingName.Substring( dot + 1 ) );
-			}
-
-			return null;
-		}
-
-		/// <summary>
-		/// Remove a setting from the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to remove</param>
-		public void RemoveSetting( string settingName )
-		{
-			int dot = settingName.IndexOf( '.' );
-			if ( dot < 0 )
-				storageKey.DeleteValue( settingName, false );
-			else
-			{
-				using( RegistryKey subKey = storageKey.OpenSubKey( settingName.Substring( 0, dot ), true ) )
-				{
-					if ( subKey != null )
-						subKey.DeleteValue( settingName.Substring( dot + 1 ) );
-				}
-			}
-		}
-
-		public void RemoveGroup( string groupName )
-		{
-			storageKey.DeleteSubKeyTree( groupName );
-		}
-
-		/// <summary>
-		/// Save a setting in this storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to save</param>
-		/// <param name="settingValue">Value to be saved</param>
-		public void SaveSetting( string settingName, object settingValue )
-		{
-			object val = settingValue;
-			if ( val is bool )
-				val = ((bool)val) ? 1 : 0;
-
-			int dot = settingName.IndexOf( '.' );
-			if ( dot < 0 )
-				storageKey.SetValue( settingName, val );
-			else
-			{
-				using(  RegistryKey subKey = storageKey.CreateSubKey( settingName.Substring( 0, dot ) ) )
-				{
-					subKey.SetValue( settingName.Substring( dot + 1 ), val );
-				}
-			}
-		}
-
-		/// <summary>
-		/// Make a new child storage under this one
-		/// </summary>
-		/// <param name="storageName">Name of the child storage to make</param>
-		/// <returns>New storage</returns>
-		public ISettingsStorage MakeChildStorage( string storageName )
-		{
-			return new RegistrySettingsStorage( storageKey.CreateSubKey( storageName ) );
-		}
-
-		/// <summary>
-		/// LoadSettings does nothing in this implementation, since the
-		/// registry is accessed directly.
-		/// </summary>
-		public void LoadSettings()
-		{
-		}
-
-		/// <summary>
-		/// SaveSettings does nothing in this implementation, since the
-		/// registry is accessed directly.
-		/// </summary>
-		public void SaveSettings()
-		{
-		}
-		#endregion
-
-		#region IDisposable Members
-		/// <summary>
-		/// Dispose of this object by closing the storage key, if any
-		/// </summary>
-		public void Dispose()
-		{
-			if ( storageKey != null )
-				storageKey.Close();
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Diagnostics;
+using Microsoft.Win32;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Implementation of SettingsStorage for NUnit user settings,
+	/// based on storage of settings in the registry.
+	/// 
+	/// Setting names containing a dot are interpreted as a 
+	/// reference to a subkey. Only the first dot is used
+	/// in this way, since the feature is only intended
+	/// to support legacy registry settings, which are not
+	/// nested any deeper.
+	/// </summary>
+	public class RegistrySettingsStorage : ISettingsStorage
+	{
+		#region Instance Variables
+
+		/// <summary>
+		/// If not null, the registry key for this storage
+		/// </summary>
+		private RegistryKey storageKey;
+
+		#endregion
+
+		#region Construction and Disposal
+
+		/// <summary>
+		/// Construct a storage on top of a pre-created registry key
+		/// </summary>
+		/// <param name="storageKey"></param>
+		public RegistrySettingsStorage( RegistryKey storageKey )
+		{
+			this.storageKey = storageKey;
+		}
+
+		#endregion
+
+		#region Properties
+
+		/// <summary>
+		/// The registry key used to hold this storage
+		/// </summary>
+		public RegistryKey StorageKey
+		{
+			get { return storageKey; }
+		}
+
+		#endregion
+
+		#region ISettingsStorage Members
+
+		/// <summary>
+		/// Load a setting from this storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <returns>Value of the setting</returns>
+		public object GetSetting( string settingName )
+		{
+			int dot = settingName.IndexOf( '.' );
+			if ( dot < 0 )
+				return storageKey.GetValue( settingName );
+
+			using( RegistryKey subKey = storageKey.OpenSubKey( settingName.Substring( 0, dot ) ) )
+			{
+				if ( subKey != null )
+					return subKey.GetValue( settingName.Substring( dot + 1 ) );
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		/// Remove a setting from the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to remove</param>
+		public void RemoveSetting( string settingName )
+		{
+			int dot = settingName.IndexOf( '.' );
+			if ( dot < 0 )
+				storageKey.DeleteValue( settingName, false );
+			else
+			{
+				using( RegistryKey subKey = storageKey.OpenSubKey( settingName.Substring( 0, dot ), true ) )
+				{
+					if ( subKey != null )
+						subKey.DeleteValue( settingName.Substring( dot + 1 ) );
+				}
+			}
+		}
+
+		public void RemoveGroup( string groupName )
+		{
+			storageKey.DeleteSubKeyTree( groupName );
+		}
+
+		/// <summary>
+		/// Save a setting in this storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to save</param>
+		/// <param name="settingValue">Value to be saved</param>
+		public void SaveSetting( string settingName, object settingValue )
+		{
+			object val = settingValue;
+			if ( val is bool )
+				val = ((bool)val) ? 1 : 0;
+
+			int dot = settingName.IndexOf( '.' );
+			if ( dot < 0 )
+				storageKey.SetValue( settingName, val );
+			else
+			{
+				using(  RegistryKey subKey = storageKey.CreateSubKey( settingName.Substring( 0, dot ) ) )
+				{
+					subKey.SetValue( settingName.Substring( dot + 1 ), val );
+				}
+			}
+		}
+
+		/// <summary>
+		/// Make a new child storage under this one
+		/// </summary>
+		/// <param name="storageName">Name of the child storage to make</param>
+		/// <returns>New storage</returns>
+		public ISettingsStorage MakeChildStorage( string storageName )
+		{
+			return new RegistrySettingsStorage( storageKey.CreateSubKey( storageName ) );
+		}
+
+		/// <summary>
+		/// LoadSettings does nothing in this implementation, since the
+		/// registry is accessed directly.
+		/// </summary>
+		public void LoadSettings()
+		{
+		}
+
+		/// <summary>
+		/// SaveSettings does nothing in this implementation, since the
+		/// registry is accessed directly.
+		/// </summary>
+		public void SaveSettings()
+		{
+		}
+		#endregion
+
+		#region IDisposable Members
+		/// <summary>
+		/// Dispose of this object by closing the storage key, if any
+		/// </summary>
+		public void Dispose()
+		{
+			if ( storageKey != null )
+				storageKey.Close();
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/RemoteTestAgent.cs b/src/ClientUtilities/util/RemoteTestAgent.cs
index dfae857..43ecb83 100644
--- a/src/ClientUtilities/util/RemoteTestAgent.cs
+++ b/src/ClientUtilities/util/RemoteTestAgent.cs
@@ -1,128 +1,128 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Collections;
-using System.IO;
-using System.Reflection;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// RemoteTestAgent represents a remote agent executing in another process
-	/// and communicating with NUnit by TCP. Although it is similar to a
-	/// TestServer, it does not publish a Uri at which clients may connect 
-	/// to it. Rather, it reports back to the sponsoring TestAgency upon 
-	/// startup so that the agency may in turn provide it to clients for use.
-	/// </summary>
-	public class RemoteTestAgent : TestAgent
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(RemoteTestAgent));
-
-		#region Fields
-
-        private ManualResetEvent stopSignal = new ManualResetEvent(false);
-		
-		#endregion
-
-		#region Constructor
-		/// <summary>
-		/// Construct a RemoteTestAgent
-		/// </summary>
-		public RemoteTestAgent( Guid agentId, TestAgency agency )
-            : base(agentId, agency) { }
-		#endregion
-
-		#region Properties
-		public int ProcessId
-		{
-			get { return System.Diagnostics.Process.GetCurrentProcess().Id; }
-		}
-		#endregion
-
-		#region Public Methods
-		public override TestRunner CreateRunner(int runnerID)
-		{
-			return new AgentRunner(runnerID);
-		}
-
-        public override bool Start()
-		{
-			log.Info("Agent starting");
-
-			try
-			{
-				this.Agency.Register( this );
-				log.Debug( "Registered with TestAgency" );
-			}
-			catch( Exception ex )
-			{
-				log.Error( "RemoteTestAgent: Failed to register with TestAgency", ex );
-                return false;
-			}
-
-            return true;
-		}
-
-        [System.Runtime.Remoting.Messaging.OneWay]
-        public override void Stop()
-		{
-			log.Info( "Stopping" );
-            // This causes an error in the client because the agent 
-            // database is not thread-safe.
-            //if ( agency != null )
-            //    agency.ReportStatus(this.ProcessId, AgentStatus.Stopping);
-
-
-            stopSignal.Set();
-		}
-
-		public void WaitForStop()
-		{
-            stopSignal.WaitOne();
-		}
-		#endregion
-
-        #region Nested AgentRunner class
-        class AgentRunner : ProxyTestRunner
-        {
-            private ITestRunnerFactory factory;
-
-            public AgentRunner(int runnerID)
-                : base(runnerID) 
-            {
-                this.factory = new InProcessTestRunnerFactory();
-            }
-
-            public override bool Load(TestPackage package)
-            {
-                this.TestRunner = factory.MakeTestRunner(package);
-                
-                return base.Load(package);
-            }
-			
-			public override IList AssemblyInfo 
-			{
-				get 
-				{
-					IList result = base.AssemblyInfo;
-					string name = Path.GetFileName(Assembly.GetEntryAssembly().Location);
-					
-					foreach( TestAssemblyInfo info in result )
-						info.ModuleName = name;
-					
-					return result;
-				}
-			}
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// RemoteTestAgent represents a remote agent executing in another process
+	/// and communicating with NUnit by TCP. Although it is similar to a
+	/// TestServer, it does not publish a Uri at which clients may connect 
+	/// to it. Rather, it reports back to the sponsoring TestAgency upon 
+	/// startup so that the agency may in turn provide it to clients for use.
+	/// </summary>
+	public class RemoteTestAgent : TestAgent
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(RemoteTestAgent));
+
+		#region Fields
+
+        private ManualResetEvent stopSignal = new ManualResetEvent(false);
+		
+		#endregion
+
+		#region Constructor
+		/// <summary>
+		/// Construct a RemoteTestAgent
+		/// </summary>
+		public RemoteTestAgent( Guid agentId, TestAgency agency )
+            : base(agentId, agency) { }
+		#endregion
+
+		#region Properties
+		public int ProcessId
+		{
+			get { return System.Diagnostics.Process.GetCurrentProcess().Id; }
+		}
+		#endregion
+
+		#region Public Methods
+		public override TestRunner CreateRunner(int runnerID)
+		{
+			return new AgentRunner(runnerID);
+		}
+
+        public override bool Start()
+		{
+			log.Info("Agent starting");
+
+			try
+			{
+				this.Agency.Register( this );
+				log.Debug( "Registered with TestAgency" );
+			}
+			catch( Exception ex )
+			{
+				log.Error( "RemoteTestAgent: Failed to register with TestAgency", ex );
+                return false;
+			}
+
+            return true;
+		}
+
+        [System.Runtime.Remoting.Messaging.OneWay]
+        public override void Stop()
+		{
+			log.Info( "Stopping" );
+            // This causes an error in the client because the agent 
+            // database is not thread-safe.
+            //if ( agency != null )
+            //    agency.ReportStatus(this.ProcessId, AgentStatus.Stopping);
+
+
+            stopSignal.Set();
+		}
+
+		public void WaitForStop()
+		{
+            stopSignal.WaitOne();
+		}
+		#endregion
+
+        #region Nested AgentRunner class
+        class AgentRunner : ProxyTestRunner
+        {
+            private ITestRunnerFactory factory;
+
+            public AgentRunner(int runnerID)
+                : base(runnerID) 
+            {
+                this.factory = new InProcessTestRunnerFactory();
+            }
+
+            public override bool Load(TestPackage package)
+            {
+                this.TestRunner = factory.MakeTestRunner(package);
+                
+                return base.Load(package);
+            }
+			
+			public override IList AssemblyInfo 
+			{
+				get 
+				{
+					IList result = base.AssemblyInfo;
+					string name = Path.GetFileName(Assembly.GetEntryAssembly().Location);
+					
+					foreach( TestAssemblyInfo info in result )
+						info.ModuleName = name;
+					
+					return result;
+				}
+			}
+        }
+        #endregion
+    }
+}
diff --git a/src/ClientUtilities/util/ResultSummarizer.cs b/src/ClientUtilities/util/ResultSummarizer.cs
index bd0baf9..87fd040 100644
--- a/src/ClientUtilities/util/ResultSummarizer.cs
+++ b/src/ClientUtilities/util/ResultSummarizer.cs
@@ -1,193 +1,188 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using NUnit.Core;
-
-	/// <summary>
-	/// Summary description for ResultSummarizer.
-	/// </summary>
-	public class ResultSummarizer
-	{
-	    private int resultCount = 0;
-		private int testsRun = 0;
-		private int failureCount = 0;
-	    private int errorCount = 0;
-	    private int successCount = 0;
-	    private int inconclusiveCount = 0;
-		private int skipCount = 0;
-		private int ignoreCount = 0;
-	    private int notRunnable = 0;
-		
-		private double time = 0.0d;
-		private string name;
-
-		public ResultSummarizer() { }
-
-		public ResultSummarizer(TestResult result)
-		{
-			Summarize(result);
-		}
-
-		public ResultSummarizer(TestResult[] results)
-		{
-			foreach( TestResult result in results )
-				Summarize(result);
-		}
-
-		public void Summarize( TestResult result )
-		{
-			if (this.name == null )
-			{
-				this.name = result.Name;
-				this.time = result.Time;
-			}
-
-			if (!result.Test.IsSuite)
-			{
-			    resultCount++;
-
-                switch (result.ResultState)
-                {
-                    case ResultState.Success:
-                        successCount++;
-                        testsRun++;
-                        break;
-                    case ResultState.Failure:
-                        failureCount++;
-                        testsRun++;
-                        break;
-                    case ResultState.Error:
-                    case ResultState.Cancelled:
-                        errorCount++;
-                        testsRun++;
-                        break;
-                    case ResultState.Inconclusive:
-                        inconclusiveCount++;
-                        testsRun++;
-                        break;
-                    case ResultState.NotRunnable:
-                        notRunnable++;
-                        //errorCount++;
-                        break;
-                    case ResultState.Ignored:
-                        ignoreCount++;
-                        break;
-                    case ResultState.Skipped:
-                    default:
-                        skipCount++;
-                        break;
-                }
-            }
-
-			if ( result.HasResults )
-				foreach (TestResult childResult in result.Results)
-					Summarize( childResult );
-		}
-
-		public string Name
-		{
-			get { return name; }
-		}
-
-		public bool Success
-		{
-			get { return failureCount == 0; }
-		}
-
-        /// <summary>
-        /// Returns the number of test cases for which results
-        /// have been summarized. Any tests excluded by use of
-        /// Category or Explicit attributes are not counted.
-        /// </summary>
-	    public int ResultCount
-	    {
-            get { return resultCount;  }    
-	    }
-
-        /// <summary>
-        /// Returns the number of test cases actually run, which
-        /// is the same as ResultCount, less any Skipped, Ignored
-        /// or NonRunnable tests.
-        /// </summary>
-		public int TestsRun
-		{
-			get { return testsRun; }
-		}
-
-	    /// <summary>
-	    /// Returns the number of tests that passed
-	    /// </summary>
-        public int Passed
-	    {
-            get { return successCount;  }
-	    }
-
-        /// <summary>
-        /// Returns the number of test cases that had an error.
-        /// </summary>
-        public int Errors
-        {
-            get { return errorCount; }
-        }
-
-        /// <summary>
-        /// Returns the number of test cases that failed.
-        /// </summary>
-		public int Failures 
-		{
-			get { return failureCount; }
-		}
-
-        /// <summary>
-        /// Returns the number of test cases that failed.
-        /// </summary>
-        public int Inconclusive
-        {
-            get { return inconclusiveCount; }
-        }
-
-        /// <summary>
-        /// Returns the number of test cases that were not runnable
-        /// due to errors in the signature of the class or method.
-        /// Such tests are also counted as Errors.
-        /// </summary>
-	    public int NotRunnable
-	    {
-	        get { return notRunnable; }   
-	    }
-
-        /// <summary>
-        /// Returns the number of test cases that were skipped.
-        /// </summary>
-		public int Skipped
-		{
-			get { return skipCount; }
-		}
-
-		public int Ignored
-		{
-			get { return ignoreCount; }
-		}
-
-		public double Time
-		{
-			get { return time; }
-		}
-
-		public int TestsNotRun
-		{
-			get { return skipCount + ignoreCount + notRunnable; }
-		}
-
-	    public int ErrorsAndFailures
-	    {
-            get { return errorCount + failureCount; }   
-	    }
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using NUnit.Core;
+
+	/// <summary>
+	/// Summary description for ResultSummarizer.
+	/// </summary>
+	public class ResultSummarizer
+	{
+	    private int resultCount = 0;
+		private int testsRun = 0;
+		private int failureCount = 0;
+	    private int errorCount = 0;
+	    private int successCount = 0;
+	    private int inconclusiveCount = 0;
+		private int skipCount = 0;
+		private int ignoreCount = 0;
+	    private int notRunnable = 0;
+		
+		private double time = 0.0d;
+		private string name;
+
+		public ResultSummarizer() { }
+
+		public ResultSummarizer(TestResult result)
+		{
+			Summarize(result);
+		}
+
+		public ResultSummarizer(TestResult[] results)
+		{
+			foreach( TestResult result in results )
+				Summarize(result);
+		}
+
+		public void Summarize( TestResult result )
+		{
+			if (this.name == null )
+			{
+				this.name = result.Name;
+				this.time = result.Time;
+			}
+
+			if (!result.Test.IsSuite)
+			{
+			    resultCount++;
+
+                switch (result.ResultState)
+                {
+                    case ResultState.Success:
+                        successCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.Failure:
+                        failureCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+                        errorCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.Inconclusive:
+                        inconclusiveCount++;
+                        testsRun++;
+                        break;
+                    case ResultState.NotRunnable:
+                        notRunnable++;
+                        //errorCount++;
+                        break;
+                    case ResultState.Ignored:
+                        ignoreCount++;
+                        break;
+                    case ResultState.Skipped:
+                    default:
+                        skipCount++;
+                        break;
+                }
+            }
+
+			if ( result.HasResults )
+				foreach (TestResult childResult in result.Results)
+					Summarize( childResult );
+		}
+
+		public string Name
+		{
+			get { return name; }
+		}
+
+		public bool Success
+		{
+			get { return failureCount == 0; }
+		}
+
+        /// <summary>
+        /// Returns the number of test cases for which results
+        /// have been summarized. Any tests excluded by use of
+        /// Category or Explicit attributes are not counted.
+        /// </summary>
+	    public int ResultCount
+	    {
+            get { return resultCount;  }    
+	    }
+
+        /// <summary>
+        /// Returns the number of test cases actually run, which
+        /// is the same as ResultCount, less any Skipped, Ignored
+        /// or NonRunnable tests.
+        /// </summary>
+		public int TestsRun
+		{
+			get { return testsRun; }
+		}
+
+	    /// <summary>
+	    /// Returns the number of tests that passed
+	    /// </summary>
+        public int Passed
+	    {
+            get { return successCount;  }
+	    }
+
+        /// <summary>
+        /// Returns the number of test cases that had an error.
+        /// </summary>
+        public int Errors
+        {
+            get { return errorCount; }
+        }
+
+        /// <summary>
+        /// Returns the number of test cases that failed.
+        /// </summary>
+		public int Failures 
+		{
+			get { return failureCount; }
+		}
+
+        /// <summary>
+        /// Returns the number of test cases that failed.
+        /// </summary>
+        public int Inconclusive
+        {
+            get { return inconclusiveCount; }
+        }
+
+        /// <summary>
+        /// Returns the number of test cases that were not runnable
+        /// due to errors in the signature of the class or method.
+        /// Such tests are also counted as Errors.
+        /// </summary>
+	    public int NotRunnable
+	    {
+	        get { return notRunnable; }   
+	    }
+
+        /// <summary>
+        /// Returns the number of test cases that were skipped.
+        /// </summary>
+		public int Skipped
+		{
+			get { return skipCount; }
+		}
+
+		public int Ignored
+		{
+			get { return ignoreCount; }
+		}
+
+		public double Time
+		{
+			get { return time; }
+		}
+
+		public int TestsNotRun
+		{
+			get { return skipCount + ignoreCount + notRunnable; }
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/RuntimeFrameworkSelector.cs b/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
index 137484b..9916887 100644
--- a/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
+++ b/src/ClientUtilities/util/RuntimeFrameworkSelector.cs
@@ -1,78 +1,83 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using System.Reflection;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-    public class RuntimeFrameworkSelector : IRuntimeFrameworkSelector
-    {
-        static Logger log = InternalTrace.GetLogger(typeof(RuntimeFrameworkSelector));
-
-        /// <summary>
-        /// Selects a target runtime framework for a TestPackage based on
-        /// the settings in the package and the assemblies themselves.
-        /// The package RuntimeFramework setting may be updated as a 
-        /// result and the selected runtime is returned.
-        /// </summary>
-        /// <param name="package">A TestPackage</param>
-        /// <returns>The selected RuntimeFramework</returns>
-        public RuntimeFramework SelectRuntimeFramework(TestPackage package)
-        {
-            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
-            RuntimeFramework requestedFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;
-
-            log.Debug("Current framework is {0}", currentFramework);
-            if (requestedFramework == null)
-                log.Debug("No specific framework requested");
-            else
-                log.Debug("Requested framework is {0}", requestedFramework);
-
-            RuntimeType targetRuntime = requestedFramework == null
-                ? RuntimeType.Any 
-                : requestedFramework.Runtime;
-            Version targetVersion = requestedFramework == null
-                ? RuntimeFramework.DefaultVersion
-                : requestedFramework.FrameworkVersion;
-
-            if (targetRuntime == RuntimeType.Any)
-                targetRuntime = currentFramework.Runtime;
-
-            if (targetVersion == RuntimeFramework.DefaultVersion)
-            {
-                if (Services.UserSettings.GetSetting("Options.TestLoader.RuntimeSelectionEnabled", true))
-                    foreach (string assembly in package.Assemblies)
-                    {
-                        using (AssemblyReader reader = new AssemblyReader(assembly))
-                        {
-                            Version v = new Version(reader.ImageRuntimeVersion.Substring(1));
-                            log.Debug("Assembly {0} uses version {1}", assembly, v);
-                            if (v > targetVersion) targetVersion = v;
-                        }
-                    }
-                else
-                    targetVersion = RuntimeFramework.CurrentFramework.ClrVersion;
-
-                RuntimeFramework checkFramework = new RuntimeFramework(targetRuntime, targetVersion);
-                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)
-                        targetVersion = currentFramework.FrameworkVersion;
-                }
-            }
-
-            RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
-            package.Settings["RuntimeFramework"] = targetFramework;
-
-            log.Debug("Test will use {0} framework", targetFramework);
-
-            return targetFramework;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+    public class RuntimeFrameworkSelector : IRuntimeFrameworkSelector
+    {
+        static Logger log = InternalTrace.GetLogger(typeof(RuntimeFrameworkSelector));
+
+        /// <summary>
+        /// Selects a target runtime framework for a TestPackage based on
+        /// the settings in the package and the assemblies themselves.
+        /// The package RuntimeFramework setting may be updated as a 
+        /// result and the selected runtime is returned.
+        /// </summary>
+        /// <param name="package">A TestPackage</param>
+        /// <returns>The selected RuntimeFramework</returns>
+        public RuntimeFramework SelectRuntimeFramework(TestPackage package)
+        {
+            RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+            RuntimeFramework requestedFramework = package.Settings["RuntimeFramework"] as RuntimeFramework;
+
+            log.Debug("Current framework is {0}", currentFramework);
+            if (requestedFramework == null)
+                log.Debug("No specific framework requested");
+            else
+                log.Debug("Requested framework is {0}", requestedFramework);
+
+            RuntimeType targetRuntime = requestedFramework == null
+                ? RuntimeType.Any 
+                : requestedFramework.Runtime;
+            Version targetVersion = requestedFramework == null
+                ? RuntimeFramework.DefaultVersion
+                : requestedFramework.FrameworkVersion;
+
+            if (targetRuntime == RuntimeType.Any)
+                targetRuntime = currentFramework.Runtime;
+
+            if (targetVersion == RuntimeFramework.DefaultVersion)
+            {
+                if (Services.UserSettings.GetSetting("Options.TestLoader.RuntimeSelectionEnabled", true))
+                    foreach (string assembly in package.Assemblies)
+                    {
+                        using (AssemblyReader reader = new AssemblyReader(assembly))
+                        {
+                            string vString = reader.ImageRuntimeVersion;
+                            if (vString.Length > 1) // Make sure it's a valid dot net assembly
+                            {
+                                Version v = new Version(vString.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 || !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)
+                        targetVersion = currentFramework.FrameworkVersion;
+                }
+            }
+
+            RuntimeFramework targetFramework = new RuntimeFramework(targetRuntime, targetVersion);
+            package.Settings["RuntimeFramework"] = targetFramework;
+
+            log.Debug("Test will use {0} framework", targetFramework);
+
+            return targetFramework;
+        }
+    }
+}
diff --git a/src/ClientUtilities/util/ServerBase.cs b/src/ClientUtilities/util/ServerBase.cs
index 058ce73..0ae3333 100644
--- a/src/ClientUtilities/util/ServerBase.cs
+++ b/src/ClientUtilities/util/ServerBase.cs
@@ -1,119 +1,119 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Services;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for ServerBase.
-	/// </summary>
-	public abstract class ServerBase : MarshalByRefObject, IDisposable
-	{
-		protected string uri;
-		protected int port;
-
-		private TcpChannel channel;
-		private bool isMarshalled;
-
-		private object theLock = new object();
-
-		protected ServerBase()
-		{
-		}
-
-		/// <summary>
-		/// Constructor used to provide
-		/// </summary>
-		/// <param name="uri"></param>
-		/// <param name="port"></param>
-		protected ServerBase(string uri, int port)
-		{
-			this.uri = uri;
-			this.port = port;
-		}
-
-        public string ServerUrl
-        {
-            get { return string.Format("tcp://127.0.0.1:{0}/{1}", port, uri); }
-        }
-
-		public virtual void Start()
-		{
-            if (uri != null && uri != string.Empty)
-            {
-                lock (theLock)
-                {
-                    this.channel = ServerUtilities.GetTcpChannel(uri + "Channel", port, 100);
-
-                    RemotingServices.Marshal(this, uri);
-                    this.isMarshalled = true;
-                }
-
-                if (this.port == 0)
-                {
-                    ChannelDataStore store = this.channel.ChannelData as ChannelDataStore;
-                    if (store != null)
-                    {
-                        string channelUri = store.ChannelUris[0];
-                        this.port = int.Parse(channelUri.Substring(channelUri.LastIndexOf(':') + 1));
-                    }
-                }
-            }
-		}
-
-		[System.Runtime.Remoting.Messaging.OneWay]
-		public virtual void Stop()
-		{
-			lock( theLock )
-			{
-				if ( this.isMarshalled )
-				{
-					RemotingServices.Disconnect( this );
-					this.isMarshalled = false;
-				}
-
-				if ( this.channel != null )
-				{
-					ChannelServices.UnregisterChannel( this.channel );
-					this.channel = null;
-				}
-
-				Monitor.PulseAll( theLock );
-			}
-		}
-
-		public void WaitForStop()
-		{
-			lock( theLock )
-			{
-				Monitor.Wait( theLock );
-			}
-		}
-
-		#region IDisposable Members
-
-		public void Dispose()
-		{
-			this.Stop();
-		}
-
-		#endregion
-
-		#region InitializeLifetimeService
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Services;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for ServerBase.
+	/// </summary>
+	public abstract class ServerBase : MarshalByRefObject, IDisposable
+	{
+		protected string uri;
+		protected int port;
+
+		private TcpChannel channel;
+		private bool isMarshalled;
+
+		private object theLock = new object();
+
+		protected ServerBase()
+		{
+		}
+
+		/// <summary>
+		/// Constructor used to provide
+		/// </summary>
+		/// <param name="uri"></param>
+		/// <param name="port"></param>
+		protected ServerBase(string uri, int port)
+		{
+			this.uri = uri;
+			this.port = port;
+		}
+
+        public string ServerUrl
+        {
+            get { return string.Format("tcp://127.0.0.1:{0}/{1}", port, uri); }
+        }
+
+		public virtual void Start()
+		{
+            if (uri != null && uri != string.Empty)
+            {
+                lock (theLock)
+                {
+                    this.channel = ServerUtilities.GetTcpChannel(uri + "Channel", port, 100);
+
+                    RemotingServices.Marshal(this, uri);
+                    this.isMarshalled = true;
+                }
+
+                if (this.port == 0)
+                {
+                    ChannelDataStore store = this.channel.ChannelData as ChannelDataStore;
+                    if (store != null)
+                    {
+                        string channelUri = store.ChannelUris[0];
+                        this.port = int.Parse(channelUri.Substring(channelUri.LastIndexOf(':') + 1));
+                    }
+                }
+            }
+		}
+
+		[System.Runtime.Remoting.Messaging.OneWay]
+		public virtual void Stop()
+		{
+			lock( theLock )
+			{
+				if ( this.isMarshalled )
+				{
+					RemotingServices.Disconnect( this );
+					this.isMarshalled = false;
+				}
+
+				if ( this.channel != null )
+				{
+					ChannelServices.UnregisterChannel( this.channel );
+					this.channel = null;
+				}
+
+				Monitor.PulseAll( theLock );
+			}
+		}
+
+		public void WaitForStop()
+		{
+			lock( theLock )
+			{
+				Monitor.Wait( theLock );
+			}
+		}
+
+		#region IDisposable Members
+
+		public void Dispose()
+		{
+			this.Stop();
+		}
+
+		#endregion
+
+		#region InitializeLifetimeService
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/ServerUtilities.cs b/src/ClientUtilities/util/ServerUtilities.cs
index 7be4fe7..95214c4 100644
--- a/src/ClientUtilities/util/ServerUtilities.cs
+++ b/src/ClientUtilities/util/ServerUtilities.cs
@@ -1,129 +1,129 @@
-// ****************************************************************
-// Copyright 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.Collections;
-using System.Collections.Specialized;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using System.Reflection;
-using System.Diagnostics;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for RemotingUtilities.
-	/// </summary>
-	public class ServerUtilities
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(ServerUtilities));
-
-		/// <summary>
-		///  Create a TcpChannel with a given name, on a given port.
-		/// </summary>
-		/// <param name="port"></param>
-		/// <param name="name"></param>
-		/// <returns></returns>
-		private static TcpChannel CreateTcpChannel( string name, int port, int limit )
-		{
-			ListDictionary props = new ListDictionary();
-			props.Add( "port", port );
-			props.Add( "name", name );
-			props.Add( "bindTo", "127.0.0.1" );
-
-			BinaryServerFormatterSinkProvider serverProvider =
-				new BinaryServerFormatterSinkProvider();
-
-            // NOTE: TypeFilterLevel and "clientConnectionLimit" property don't exist in .NET 1.0.
-			Type typeFilterLevelType = typeof(object).Assembly.GetType("System.Runtime.Serialization.Formatters.TypeFilterLevel");
-			if (typeFilterLevelType != null)
-			{
-				PropertyInfo typeFilterLevelProperty = serverProvider.GetType().GetProperty("TypeFilterLevel");
-				object typeFilterLevel = Enum.Parse(typeFilterLevelType, "Full");
-				typeFilterLevelProperty.SetValue(serverProvider, typeFilterLevel, null);
-
-//                props.Add("clientConnectionLimit", limit);
-            }
-
-			BinaryClientFormatterSinkProvider clientProvider =
-				new BinaryClientFormatterSinkProvider();
-
-			return new TcpChannel( props, clientProvider, serverProvider );
-		}
-
-		public static TcpChannel GetTcpChannel()
-		{
-			return GetTcpChannel( "", 0, 2 );
-		}
-
-		/// <summary>
-		/// Get a channel by name, casting it to a TcpChannel.
-		/// Otherwise, create, register and return a TcpChannel with
-		/// that name, on the port provided as the second argument.
-		/// </summary>
-		/// <param name="name">The channel name</param>
-		/// <param name="port">The port to use if the channel must be created</param>
-		/// <returns>A TcpChannel or null</returns>
-		public static TcpChannel GetTcpChannel( string name, int port )
-		{
-			return GetTcpChannel( name, port, 2 );
-		}
-		
-		/// <summary>
-		/// Get a channel by name, casting it to a TcpChannel.
-		/// Otherwise, create, register and return a TcpChannel with
-		/// that name, on the port provided as the second argument.
-		/// </summary>
-		/// <param name="name">The channel name</param>
-		/// <param name="port">The port to use if the channel must be created</param>
-		/// <param name="limit">The client connection limit or negative for the default</param>
-		/// <returns>A TcpChannel or null</returns>
-		public static TcpChannel GetTcpChannel( string name, int port, int limit )
-		{
-			TcpChannel channel = ChannelServices.GetChannel( name ) as TcpChannel;
-
-			if ( channel == null )
-			{
-				// NOTE: Retries are normally only needed when rapidly creating
-				// and destroying channels, as in running the NUnit tests.
-				int retries = 10;
-				while( --retries > 0 )
-					try
-					{
-						channel = CreateTcpChannel( name, port, limit );
-#if CLR_2_0 || CLR_4_0
-                        ChannelServices.RegisterChannel( channel, false );
-#else
-						ChannelServices.RegisterChannel( channel );
-#endif
-                        break;
-					}
-					catch( Exception e )
-					{
-                        log.Error("Failed to create/register channel", e);
-						System.Threading.Thread.Sleep(300);
-					}
-			}
-
-			return channel;
-		}
-
-		public static void SafeReleaseChannel( IChannel channel )
-		{
-			if( channel != null )
-				try
-				{
-					ChannelServices.UnregisterChannel( channel );
-				}
-				catch( RemotingException )
-				{
-					// Channel was not registered - ignore
-				}
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Collections;
+using System.Collections.Specialized;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Reflection;
+using System.Diagnostics;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for RemotingUtilities.
+	/// </summary>
+	public class ServerUtilities
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(ServerUtilities));
+
+		/// <summary>
+		///  Create a TcpChannel with a given name, on a given port.
+		/// </summary>
+		/// <param name="port"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		private static TcpChannel CreateTcpChannel( string name, int port, int limit )
+		{
+			ListDictionary props = new ListDictionary();
+			props.Add( "port", port );
+			props.Add( "name", name );
+			props.Add( "bindTo", "127.0.0.1" );
+
+			BinaryServerFormatterSinkProvider serverProvider =
+				new BinaryServerFormatterSinkProvider();
+
+            // NOTE: TypeFilterLevel and "clientConnectionLimit" property don't exist in .NET 1.0.
+			Type typeFilterLevelType = typeof(object).Assembly.GetType("System.Runtime.Serialization.Formatters.TypeFilterLevel");
+			if (typeFilterLevelType != null)
+			{
+				PropertyInfo typeFilterLevelProperty = serverProvider.GetType().GetProperty("TypeFilterLevel");
+				object typeFilterLevel = Enum.Parse(typeFilterLevelType, "Full");
+				typeFilterLevelProperty.SetValue(serverProvider, typeFilterLevel, null);
+
+//                props.Add("clientConnectionLimit", limit);
+            }
+
+			BinaryClientFormatterSinkProvider clientProvider =
+				new BinaryClientFormatterSinkProvider();
+
+			return new TcpChannel( props, clientProvider, serverProvider );
+		}
+
+		public static TcpChannel GetTcpChannel()
+		{
+			return GetTcpChannel( "", 0, 2 );
+		}
+
+		/// <summary>
+		/// Get a channel by name, casting it to a TcpChannel.
+		/// Otherwise, create, register and return a TcpChannel with
+		/// that name, on the port provided as the second argument.
+		/// </summary>
+		/// <param name="name">The channel name</param>
+		/// <param name="port">The port to use if the channel must be created</param>
+		/// <returns>A TcpChannel or null</returns>
+		public static TcpChannel GetTcpChannel( string name, int port )
+		{
+			return GetTcpChannel( name, port, 2 );
+		}
+		
+		/// <summary>
+		/// Get a channel by name, casting it to a TcpChannel.
+		/// Otherwise, create, register and return a TcpChannel with
+		/// that name, on the port provided as the second argument.
+		/// </summary>
+		/// <param name="name">The channel name</param>
+		/// <param name="port">The port to use if the channel must be created</param>
+		/// <param name="limit">The client connection limit or negative for the default</param>
+		/// <returns>A TcpChannel or null</returns>
+		public static TcpChannel GetTcpChannel( string name, int port, int limit )
+		{
+			TcpChannel channel = ChannelServices.GetChannel( name ) as TcpChannel;
+
+			if ( channel == null )
+			{
+				// NOTE: Retries are normally only needed when rapidly creating
+				// and destroying channels, as in running the NUnit tests.
+				int retries = 10;
+				while( --retries > 0 )
+					try
+					{
+						channel = CreateTcpChannel( name, port, limit );
+#if CLR_2_0 || CLR_4_0
+                        ChannelServices.RegisterChannel( channel, false );
+#else
+						ChannelServices.RegisterChannel( channel );
+#endif
+                        break;
+					}
+					catch( Exception e )
+					{
+                        log.Error("Failed to create/register channel", e);
+						System.Threading.Thread.Sleep(300);
+					}
+			}
+
+			return channel;
+		}
+
+		public static void SafeReleaseChannel( IChannel channel )
+		{
+			if( channel != null )
+				try
+				{
+					ChannelServices.UnregisterChannel( channel );
+				}
+				catch( RemotingException )
+				{
+					// Channel was not registered - ignore
+				}
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/Services.cs b/src/ClientUtilities/util/Services.cs
index cde8e3a..1890cba 100644
--- a/src/ClientUtilities/util/Services.cs
+++ b/src/ClientUtilities/util/Services.cs
@@ -1,151 +1,151 @@
-// ****************************************************************
-// Copyright 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.Core;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Services is a utility class, which is used to provide access
-	/// to services in a more simple way than is supported by te
-	/// ServiceManager class itself.
-	/// </summary>
-	public class Services
-	{
-		#region AddinManager
-		private static AddinManager addinManager;
-		public static AddinManager AddinManager
-		{
-			get 
-			{
-				if (addinManager == null )
-					addinManager = (AddinManager)ServiceManager.Services.GetService( typeof( AddinManager ) );
-
-				return addinManager; 
-			}
-		}
-		#endregion
-
-		#region AddinRegistry
-		private static IAddinRegistry addinRegistry;
-		public static IAddinRegistry AddinRegistry
-		{
-			get 
-			{
-				if (addinRegistry == null)
-					addinRegistry = (IAddinRegistry)ServiceManager.Services.GetService( typeof( IAddinRegistry ) );
-                
-				return addinRegistry;
-			}
-		}
-		#endregion
-
-		#region DomainManager
-		private static DomainManager domainManager;
-		public static DomainManager DomainManager
-		{
-			get
-			{
-				if ( domainManager == null )
-					domainManager = (DomainManager)ServiceManager.Services.GetService( typeof( DomainManager ) );
-
-				return domainManager;
-			}
-		}
-		#endregion
-
-		#region UserSettings
-		private static ISettings userSettings;
-		public static ISettings UserSettings
-		{
-			get 
-			{ 
-				if ( userSettings == null )
-					userSettings = (ISettings)ServiceManager.Services.GetService( typeof( ISettings ) );
-
-				// Temporary fix needed to run TestDomain tests in test AppDomain
-				// TODO: Figure out how to set up the test domain correctly
-				if ( userSettings == null )
-					userSettings = new SettingsService();
-
-				return userSettings; 
-			}
-		}
-		
-		#endregion
-
-		#region RecentFilesService
-#if CLR_2_0 || CLR_4_0
-		private static RecentFiles recentFiles;
-		public static RecentFiles RecentFiles
-		{
-			get
-			{
-				if ( recentFiles == null )
-					recentFiles = (RecentFiles)ServiceManager.Services.GetService( typeof( RecentFiles ) );
-
-				return recentFiles;
-			}
-		}
-#endif
-		#endregion
-
-		#region TestLoader
-#if CLR_2_0 || CLR_4_0
-		private static TestLoader loader;
-		public static TestLoader TestLoader
-		{
-			get
-			{
-				if ( loader == null )
-					loader = (TestLoader)ServiceManager.Services.GetService( typeof( TestLoader ) );
-
-				return loader;
-			}
-		}
-#endif
-		#endregion
-
-		#region TestAgency
-		private static TestAgency agency;
-		public static TestAgency TestAgency
-		{
-			get
-			{
-				if ( agency == null )
-					agency = (TestAgency)ServiceManager.Services.GetService( typeof( TestAgency ) );
-
-				// Temporary fix needed to run ProcessRunner tests in test AppDomain
-				// TODO: Figure out how to set up the test domain correctly
-//				if ( agency == null )
-//				{
-//					agency = new TestAgency();
-//					agency.Start();
-//				}
-
-				return agency;
-			}
-		}
-		#endregion
-
-		#region ProjectLoader
-		private static ProjectService projectService;
-		public static ProjectService ProjectService
-		{
-			get
-			{
-				if ( projectService == null )
-					projectService = (ProjectService)
-						ServiceManager.Services.GetService( typeof( ProjectService ) );
-
-				return projectService;
-			}
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Services is a utility class, which is used to provide access
+	/// to services in a more simple way than is supported by te
+	/// ServiceManager class itself.
+	/// </summary>
+	public class Services
+	{
+		#region AddinManager
+		private static AddinManager addinManager;
+		public static AddinManager AddinManager
+		{
+			get 
+			{
+				if (addinManager == null )
+					addinManager = (AddinManager)ServiceManager.Services.GetService( typeof( AddinManager ) );
+
+				return addinManager; 
+			}
+		}
+		#endregion
+
+		#region AddinRegistry
+		private static IAddinRegistry addinRegistry;
+		public static IAddinRegistry AddinRegistry
+		{
+			get 
+			{
+				if (addinRegistry == null)
+					addinRegistry = (IAddinRegistry)ServiceManager.Services.GetService( typeof( IAddinRegistry ) );
+                
+				return addinRegistry;
+			}
+		}
+		#endregion
+
+		#region DomainManager
+		private static DomainManager domainManager;
+		public static DomainManager DomainManager
+		{
+			get
+			{
+				if ( domainManager == null )
+					domainManager = (DomainManager)ServiceManager.Services.GetService( typeof( DomainManager ) );
+
+				return domainManager;
+			}
+		}
+		#endregion
+
+		#region UserSettings
+		private static ISettings userSettings;
+		public static ISettings UserSettings
+		{
+			get 
+			{ 
+				if ( userSettings == null )
+					userSettings = (ISettings)ServiceManager.Services.GetService( typeof( ISettings ) );
+
+				// Temporary fix needed to run TestDomain tests in test AppDomain
+				// TODO: Figure out how to set up the test domain correctly
+				if ( userSettings == null )
+					userSettings = new SettingsService();
+
+				return userSettings; 
+			}
+		}
+		
+		#endregion
+
+		#region RecentFilesService
+#if CLR_2_0 || CLR_4_0
+		private static RecentFiles recentFiles;
+		public static RecentFiles RecentFiles
+		{
+			get
+			{
+				if ( recentFiles == null )
+					recentFiles = (RecentFiles)ServiceManager.Services.GetService( typeof( RecentFiles ) );
+
+				return recentFiles;
+			}
+		}
+#endif
+		#endregion
+
+		#region TestLoader
+#if CLR_2_0 || CLR_4_0
+		private static TestLoader loader;
+		public static TestLoader TestLoader
+		{
+			get
+			{
+				if ( loader == null )
+					loader = (TestLoader)ServiceManager.Services.GetService( typeof( TestLoader ) );
+
+				return loader;
+			}
+		}
+#endif
+		#endregion
+
+		#region TestAgency
+		private static TestAgency agency;
+		public static TestAgency TestAgency
+		{
+			get
+			{
+				if ( agency == null )
+					agency = (TestAgency)ServiceManager.Services.GetService( typeof( TestAgency ) );
+
+				// Temporary fix needed to run ProcessRunner tests in test AppDomain
+				// TODO: Figure out how to set up the test domain correctly
+//				if ( agency == null )
+//				{
+//					agency = new TestAgency();
+//					agency.Start();
+//				}
+
+				return agency;
+			}
+		}
+		#endregion
+
+		#region ProjectLoader
+		private static ProjectService projectService;
+		public static ProjectService ProjectService
+		{
+			get
+			{
+				if ( projectService == null )
+					projectService = (ProjectService)
+						ServiceManager.Services.GetService( typeof( ProjectService ) );
+
+				return projectService;
+			}
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/AddinManager.cs b/src/ClientUtilities/util/Services/AddinManager.cs
index 55cfb02..071b085 100644
--- a/src/ClientUtilities/util/Services/AddinManager.cs
+++ b/src/ClientUtilities/util/Services/AddinManager.cs
@@ -1,89 +1,89 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Diagnostics;
-using System.Collections;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Util
-{
-	public class AddinManager : IService
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(AddinManager));
-
-		#region Instance Fields
-		IAddinRegistry addinRegistry;
-		#endregion
-
-		#region Constructor
-		public AddinManager()
-		{
-		}
-		#endregion
-
-		#region Addin Registration
-		public void RegisterAddins()
-		{
-			// Load any extensions in the addins directory
-			DirectoryInfo dir = new DirectoryInfo( NUnitConfiguration.AddinDirectory );
-			if ( dir.Exists )
-				foreach( FileInfo file in dir.GetFiles( "*.dll" ) )
-					Register( file.FullName );
-		}
-
-		public void Register( string path )
-		{
-			try
-			{
-				AssemblyName assemblyName = new AssemblyName();
-				assemblyName.Name = Path.GetFileNameWithoutExtension(path);
-				assemblyName.CodeBase = path;
-				Assembly assembly = Assembly.Load(assemblyName);
-				log.Debug( "Loaded " + Path.GetFileName(path) );
-
-				foreach ( Type type in assembly.GetExportedTypes() )
-				{
-					if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )
-					{
-						Addin addin = new Addin( type );
-                        if ( addinRegistry.IsAddinRegistered(addin.Name) )
-                            log.Error( "Addin {0} was already registered", addin.Name );
-                        else
-                        {
-						    addinRegistry.Register( addin );
-						    log.Debug( "Registered addin: {0}", addin.Name );
-                        }
-					}
-				}
-			}
-			catch( Exception ex )
-			{
-				// NOTE: Since the gui isn't loaded at this point, 
-				// the trace output will only show up in Visual Studio
-				log.Error( "Failed to load" + path, ex  );
-			}
-		}
-		#endregion
-
-		#region IService Members
-
-		public void InitializeService()
-		{
-			addinRegistry = Services.AddinRegistry;
-			RegisterAddins();
-		}
-
-		public void UnloadService()
-		{
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Util
+{
+	public class AddinManager : IService
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(AddinManager));
+
+		#region Instance Fields
+		IAddinRegistry addinRegistry;
+		#endregion
+
+		#region Constructor
+		public AddinManager()
+		{
+		}
+		#endregion
+
+		#region Addin Registration
+		public void RegisterAddins()
+		{
+			// Load any extensions in the addins directory
+			DirectoryInfo dir = new DirectoryInfo( NUnitConfiguration.AddinDirectory );
+			if ( dir.Exists )
+				foreach( FileInfo file in dir.GetFiles( "*.dll" ) )
+					Register( file.FullName );
+		}
+
+		public void Register( string path )
+		{
+			try
+			{
+				AssemblyName assemblyName = new AssemblyName();
+				assemblyName.Name = Path.GetFileNameWithoutExtension(path);
+				assemblyName.CodeBase = path;
+				Assembly assembly = Assembly.Load(assemblyName);
+				log.Debug( "Loaded " + Path.GetFileName(path) );
+
+				foreach ( Type type in assembly.GetExportedTypes() )
+				{
+					if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )
+					{
+						Addin addin = new Addin( type );
+                        if ( addinRegistry.IsAddinRegistered(addin.Name) )
+                            log.Error( "Addin {0} was already registered", addin.Name );
+                        else
+                        {
+						    addinRegistry.Register( addin );
+						    log.Debug( "Registered addin: {0}", addin.Name );
+                        }
+					}
+				}
+			}
+			catch( Exception ex )
+			{
+				// NOTE: Since the gui isn't loaded at this point, 
+				// the trace output will only show up in Visual Studio
+				log.Error( "Failed to load" + path, ex  );
+			}
+		}
+		#endregion
+
+		#region IService Members
+
+		public void InitializeService()
+		{
+			addinRegistry = Services.AddinRegistry;
+			RegisterAddins();
+		}
+
+		public void UnloadService()
+		{
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/AddinRegistry.cs b/src/ClientUtilities/util/Services/AddinRegistry.cs
index df6515f..a4800c8 100644
--- a/src/ClientUtilities/util/Services/AddinRegistry.cs
+++ b/src/ClientUtilities/util/Services/AddinRegistry.cs
@@ -1,81 +1,81 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for AddinRegistry.
-	/// </summary>
-	public class AddinRegistry : MarshalByRefObject, IAddinRegistry, IService
-    {
-        #region Instance Fields
-        private ArrayList addins = new ArrayList();
-		#endregion
-
-		#region IAddinRegistry Members
-
-		public void Register(Addin addin)
-		{
-			addins.Add( addin );
-		}
-
-		public  IList Addins
-		{
-			get
-			{
-				return addins;
-			}
-		}
-
-        public bool IsAddinRegistered(string name)
-        {
-            return FindAddinByName(name) != null;
-        }
-
-		public void SetStatus( string name, AddinStatus status, string message )
-		{
-            Addin addin = FindAddinByName(name);
-            if (addin != null)
-            {
-                addin.Status = status;
-                addin.Message = message;
-            }
-        }
-
-        private Addin FindAddinByName(string name)
-        {
-            foreach (Addin addin in addins)
-                if (addin.Name == name)
-                    return addin;
-
-            return null;
-        }
-		#endregion
-
-		#region IService Members
-		public void InitializeService()
-		{
-		}
-
-		public void UnloadService()
-		{
-		}
-		#endregion
-
-        #region InitializeLifetimeService
-        public override object InitializeLifetimeService()
-        {
-            return null;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for AddinRegistry.
+	/// </summary>
+	public class AddinRegistry : MarshalByRefObject, IAddinRegistry, IService
+    {
+        #region Instance Fields
+        private ArrayList addins = new ArrayList();
+		#endregion
+
+		#region IAddinRegistry Members
+
+		public void Register(Addin addin)
+		{
+			addins.Add( addin );
+		}
+
+		public  IList Addins
+		{
+			get
+			{
+				return addins;
+			}
+		}
+
+        public bool IsAddinRegistered(string name)
+        {
+            return FindAddinByName(name) != null;
+        }
+
+		public void SetStatus( string name, AddinStatus status, string message )
+		{
+            Addin addin = FindAddinByName(name);
+            if (addin != null)
+            {
+                addin.Status = status;
+                addin.Message = message;
+            }
+        }
+
+        private Addin FindAddinByName(string name)
+        {
+            foreach (Addin addin in addins)
+                if (addin.Name == name)
+                    return addin;
+
+            return null;
+        }
+		#endregion
+
+		#region IService Members
+		public void InitializeService()
+		{
+		}
+
+		public void UnloadService()
+		{
+		}
+		#endregion
+
+        #region InitializeLifetimeService
+        public override object InitializeLifetimeService()
+        {
+            return null;
+        }
+        #endregion
+    }
+}
diff --git a/src/ClientUtilities/util/Services/DomainManager.cs b/src/ClientUtilities/util/Services/DomainManager.cs
index 292c52b..840a400 100644
--- a/src/ClientUtilities/util/Services/DomainManager.cs
+++ b/src/ClientUtilities/util/Services/DomainManager.cs
@@ -1,371 +1,371 @@
-// ****************************************************************
-// Copyright 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.Collections;
-using System.Text;
-using System.Threading;
-using System.Reflection;
-using System.Configuration;
-using System.Diagnostics;
-using System.Security;
-using System.Security.Permissions;
-using System.Security.Policy;
-using NUnit.Core;
-using System.Security.Principal;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// The DomainManager class handles the creation and unloading
-	/// of domains as needed and keeps track of all existing domains.
-	/// </summary>
-	public class DomainManager : IService
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(DomainManager));
-
-		#region Properties
-		private static string shadowCopyPath;
-		public static string ShadowCopyPath
-		{
-			get
-			{
-				if ( shadowCopyPath == null )
-				{
-                    shadowCopyPath = Services.UserSettings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
-                    if (shadowCopyPath == "")
-                        shadowCopyPath = PathUtils.Combine(Path.GetTempPath(), "nunit20", "ShadowCopyCache");
-					else
-						shadowCopyPath = Environment.ExpandEnvironmentVariables(shadowCopyPath);
-				}
-
-				return shadowCopyPath;
-			}
-		}
-		#endregion
-
-		#region Create and Unload Domains
-		/// <summary>
-		/// Construct an application domain for running a test package
-		/// </summary>
-		/// <param name="package">The TestPackage to be run</param>
-		public AppDomain CreateDomain( TestPackage package )
-		{
-			AppDomainSetup setup = new AppDomainSetup();
-			 
-			//For paralell tests, we need to use distinct application name
-        	setup.ApplicationName = "Tests" + "_" + Environment.TickCount;
-
-            FileInfo testFile = package.FullName != null && package.FullName != string.Empty
-                ? new FileInfo(package.FullName)
-                : null;
-
-            string appBase = package.BasePath;
-            string configFile = package.ConfigurationFile;
-            string binPath = package.PrivateBinPath;
-
-            if (testFile != null)
-            {
-                if (appBase == null || appBase == string.Empty)
-                    appBase = testFile.DirectoryName;
-
-                if (configFile == null || configFile == string.Empty)
-                    configFile = Services.ProjectService.CanLoadProject(testFile.Name)
-                        ? Path.GetFileNameWithoutExtension(testFile.Name) + ".config"
-                        : testFile.Name + ".config";
-            }
-            else if (appBase == null || appBase == string.Empty)
-                appBase = GetCommonAppBase(package.Assemblies);
-
-            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
-                ? Path.Combine(appBase, configFile)
-                : configFile;
-
-            if (package.AutoBinPath)
-				binPath = GetPrivateBinPath( appBase, package.Assemblies );
-
-			setup.PrivateBinPath = binPath;
-
-            if (package.GetSetting("ShadowCopyFiles", true))
-            {
-                setup.ShadowCopyFiles = "true";
-                setup.ShadowCopyDirectories = appBase;
-                setup.CachePath = GetCachePath();
-            }
-            else
-                setup.ShadowCopyFiles = "false";
-
-			string domainName = "test-domain-" + package.Name;
-            // Setup the Evidence
-            Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence);
-            if (evidence.Count == 0)
-            {
-                Zone zone = new Zone(SecurityZone.MyComputer);
-                evidence.AddHost(zone);
-                Assembly assembly = Assembly.GetExecutingAssembly();
-                Url url = new Url(assembly.CodeBase);
-                evidence.AddHost(url);
-                Hash hash = new Hash(assembly);
-                evidence.AddHost(hash);
-            }
-
-            log.Info("Creating AppDomain " + domainName);
-
-			AppDomain runnerDomain;
-			
-			// TODO: Try to eliminate this test. Currently, running on
-			// Linux with the permission set specified causes an
-            // unexplained crash when unloading the domain.
-#if 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);
-			}
-			else
-#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 ) )
-				runnerDomain.SetData("AddinRegistry", Services.AddinRegistry);
-
-            // Inject DomainInitializer into the remote domain - there are other
-            // approaches, but this works for all CLR versions.
-            DomainInitializer initializer = DomainInitializer.CreateInstance(runnerDomain);
-
-            // HACK: Under nunit-console, direct use of the enum fails
-            int traceLevel = IsTestDomain(AppDomain.CurrentDomain)
-                ? (int)InternalTraceLevel.Off : (int)InternalTrace.Level;
-
-            initializer.InitializeDomain(traceLevel);
-
-			return runnerDomain;
-		}
-
-        public void Unload(AppDomain domain)
-        {
-            new DomainUnloader(domain).Unload();
-        }
-
-		#endregion
-
-        #region Nested DomainUnloader Class
-        class DomainUnloader
-        {
-            private Thread thread;
-            private AppDomain domain;
-
-            public DomainUnloader(AppDomain domain)
-            {
-                this.domain = domain;
-            }
-
-            public void Unload()
-            {
-                string domainName;
-                try
-                {
-                    domainName = domain.FriendlyName;
-                }
-                catch (AppDomainUnloadedException)
-                {
-                    return;
-                }
-
-                log.Info("Unloading AppDomain " + domainName);
-
-                thread = new Thread(new ThreadStart(UnloadOnThread));
-                thread.Start();
-                if (!thread.Join(30000))
-                {
-                    log.Error("Unable to unload AppDomain {0}, Unload thread timed out", domainName);
-                    ThreadUtility.Kill(thread);
-                }
-            }
-
-            private void UnloadOnThread()
-            {
-                bool shadowCopy = false;
-                string cachePath = null;
-                string domainName = "UNKNOWN";               
-
-                try
-                {
-                    shadowCopy = domain.ShadowCopyFiles;
-                    cachePath = domain.SetupInformation.CachePath;
-                    domainName = domain.FriendlyName;
-
-                    AppDomain.Unload(domain);
-                }
-                catch (Exception ex)
-                {
-                    // We assume that the tests did something bad and just leave
-                    // the orphaned AppDomain "out there". 
-                    // TODO: Something useful.
-                    log.Error("Unable to unload AppDomain " + domainName, ex);
-                }
-                finally
-                {
-                    if (shadowCopy && cachePath != null)
-                        DeleteCacheDir(new DirectoryInfo(cachePath));
-                }
-            }
-        }
-        #endregion
-
-        #region Helper Methods
-        /// <summary>
-		/// Get the location for caching and delete any old cache info
-		/// </summary>
-		private string GetCachePath()
-		{
-            int processId = Process.GetCurrentProcess().Id;
-            long ticks = DateTime.Now.Ticks;
-			string cachePath = Path.Combine( ShadowCopyPath, processId.ToString() + "_" + ticks.ToString() ); 
-				
-			try 
-			{
-				DirectoryInfo dir = new DirectoryInfo(cachePath);		
-				if(dir.Exists) dir.Delete(true);
-			}
-			catch( Exception ex)
-			{
-				throw new ApplicationException( 
-					string.Format( "Invalid cache path: {0}",cachePath ),
-					ex );
-			}
-
-			return cachePath;
-		}
-
-		/// <summary>
-		/// Helper method to delete the cache dir. This method deals 
-		/// with a bug that occurs when files are marked read-only
-		/// and deletes each file separately in order to give better 
-		/// exception information when problems occur.
-		/// 
-		/// TODO: This entire method is problematic. Should we be doing it?
-		/// </summary>
-		/// <param name="cacheDir"></param>
-		private static void DeleteCacheDir( DirectoryInfo cacheDir )
-		{
-			//			Debug.WriteLine( "Modules:");
-			//			foreach( ProcessModule module in Process.GetCurrentProcess().Modules )
-			//				Debug.WriteLine( module.ModuleName );
-			
-
-			if(cacheDir.Exists)
-			{
-				foreach( DirectoryInfo dirInfo in cacheDir.GetDirectories() )
-					DeleteCacheDir( dirInfo );
-
-				foreach( FileInfo fileInfo in cacheDir.GetFiles() )
-				{
-					fileInfo.Attributes = FileAttributes.Normal;
-					try 
-					{
-						fileInfo.Delete();
-					}
-					catch( Exception ex )
-					{
-						Debug.WriteLine( string.Format( 
-							"Error deleting {0}, {1}", fileInfo.Name, ex.Message ) );
-					}
-				}
-
-				cacheDir.Attributes = FileAttributes.Normal;
-
-				try
-				{
-					cacheDir.Delete();
-				}
-				catch( Exception ex )
-				{
-					Debug.WriteLine( string.Format( 
-						"Error deleting {0}, {1}", cacheDir.Name, ex.Message ) );
-				}
-			}
-		}
-
-		private bool IsTestDomain(AppDomain domain)
-		{
-			return domain.FriendlyName.StartsWith( "test-domain-" );
-		}
-
-        public static string GetCommonAppBase(IList assemblies)
-        {
-            string commonBase = null;
-
-            foreach (string assembly in assemblies)
-            {
-                string dir = Path.GetFullPath(Path.GetDirectoryName(assembly));
-                if (commonBase == null)
-                    commonBase = dir;
-                else while (!PathUtils.SamePathOrUnder(commonBase, dir) && commonBase != null)
-                        commonBase = Path.GetDirectoryName(commonBase);
-            }
-
-            return commonBase;
-        }
-
-		public static string GetPrivateBinPath( string basePath, IList assemblies )
-		{
-			StringBuilder sb = new StringBuilder(200);
-			ArrayList dirList = new ArrayList();
-
-			foreach( string assembly in assemblies )
-			{
-				string dir = PathUtils.RelativePath(
-                    Path.GetFullPath(basePath), 
-                    Path.GetDirectoryName( Path.GetFullPath(assembly) ) );
-				if ( dir != null && dir != "." && !dirList.Contains( dir ) )
-				{
-					dirList.Add( dir );
-					if ( sb.Length > 0 )
-						sb.Append( Path.PathSeparator );
-					sb.Append( dir );
-				}
-			}
-
-			return sb.Length == 0 ? null : sb.ToString();
-		}
-
-		public static void DeleteShadowCopyPath()
-		{
-			if ( Directory.Exists( ShadowCopyPath ) )
-				Directory.Delete( ShadowCopyPath, true );
-		}
-		#endregion
-
-		#region IService Members
-
-		public void UnloadService()
-		{
-            // TODO:  Add DomainManager.UnloadService implementation
-        }
-
-		public void InitializeService()
-		{
-			// TODO:  Add DomainManager.InitializeService implementation
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Collections;
+using System.Text;
+using System.Threading;
+using System.Reflection;
+using System.Configuration;
+using System.Diagnostics;
+using System.Security;
+using System.Security.Permissions;
+using System.Security.Policy;
+using NUnit.Core;
+using System.Security.Principal;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// The DomainManager class handles the creation and unloading
+	/// of domains as needed and keeps track of all existing domains.
+	/// </summary>
+	public class DomainManager : IService
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(DomainManager));
+
+		#region Properties
+		private static string shadowCopyPath;
+		public static string ShadowCopyPath
+		{
+			get
+			{
+				if ( shadowCopyPath == null )
+				{
+                    shadowCopyPath = Services.UserSettings.GetSetting("Options.TestLoader.ShadowCopyPath", "");
+                    if (shadowCopyPath == "")
+                        shadowCopyPath = PathUtils.Combine(Path.GetTempPath(), "nunit20", "ShadowCopyCache");
+					else
+						shadowCopyPath = Environment.ExpandEnvironmentVariables(shadowCopyPath);
+				}
+
+				return shadowCopyPath;
+			}
+		}
+		#endregion
+
+		#region Create and Unload Domains
+		/// <summary>
+		/// Construct an application domain for running a test package
+		/// </summary>
+		/// <param name="package">The TestPackage to be run</param>
+		public AppDomain CreateDomain( TestPackage package )
+		{
+			AppDomainSetup setup = new AppDomainSetup();
+			 
+			//For paralell tests, we need to use distinct application name
+        	setup.ApplicationName = "Tests" + "_" + Environment.TickCount;
+
+            FileInfo testFile = package.FullName != null && package.FullName != string.Empty
+                ? new FileInfo(package.FullName)
+                : null;
+
+            string appBase = package.BasePath;
+            string configFile = package.ConfigurationFile;
+            string binPath = package.PrivateBinPath;
+
+            if (testFile != null)
+            {
+                if (appBase == null || appBase == string.Empty)
+                    appBase = testFile.DirectoryName;
+
+                if (configFile == null || configFile == string.Empty)
+                    configFile = Services.ProjectService.CanLoadProject(testFile.Name)
+                        ? Path.GetFileNameWithoutExtension(testFile.Name) + ".config"
+                        : testFile.Name + ".config";
+            }
+            else if (appBase == null || appBase == string.Empty)
+                appBase = GetCommonAppBase(package.Assemblies);
+
+            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
+                ? Path.Combine(appBase, configFile)
+                : configFile;
+
+            if (package.AutoBinPath)
+				binPath = GetPrivateBinPath( appBase, package.Assemblies );
+
+			setup.PrivateBinPath = binPath;
+
+            if (package.GetSetting("ShadowCopyFiles", true))
+            {
+                setup.ShadowCopyFiles = "true";
+                setup.ShadowCopyDirectories = appBase;
+                setup.CachePath = GetCachePath();
+            }
+            else
+                setup.ShadowCopyFiles = "false";
+
+			string domainName = "test-domain-" + package.Name;
+            // Setup the Evidence
+            Evidence evidence = new Evidence(AppDomain.CurrentDomain.Evidence);
+            if (evidence.Count == 0)
+            {
+                Zone zone = new Zone(SecurityZone.MyComputer);
+                evidence.AddHost(zone);
+                Assembly assembly = Assembly.GetExecutingAssembly();
+                Url url = new Url(assembly.CodeBase);
+                evidence.AddHost(url);
+                Hash hash = new Hash(assembly);
+                evidence.AddHost(hash);
+            }
+
+            log.Info("Creating AppDomain " + domainName);
+
+			AppDomain runnerDomain;
+			
+			// TODO: Try to eliminate this test. Currently, running on
+			// Linux with the permission set specified causes an
+            // unexplained crash when unloading the domain.
+#if 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);
+			}
+			else
+#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 ) )
+				runnerDomain.SetData("AddinRegistry", Services.AddinRegistry);
+
+            // Inject DomainInitializer into the remote domain - there are other
+            // approaches, but this works for all CLR versions.
+            DomainInitializer initializer = DomainInitializer.CreateInstance(runnerDomain);
+
+            // HACK: Under nunit-console, direct use of the enum fails
+            int traceLevel = IsTestDomain(AppDomain.CurrentDomain)
+                ? (int)InternalTraceLevel.Off : (int)InternalTrace.Level;
+
+            initializer.InitializeDomain(traceLevel);
+
+			return runnerDomain;
+		}
+
+        public void Unload(AppDomain domain)
+        {
+            new DomainUnloader(domain).Unload();
+        }
+
+		#endregion
+
+        #region Nested DomainUnloader Class
+        class DomainUnloader
+        {
+            private Thread thread;
+            private AppDomain domain;
+
+            public DomainUnloader(AppDomain domain)
+            {
+                this.domain = domain;
+            }
+
+            public void Unload()
+            {
+                string domainName;
+                try
+                {
+                    domainName = domain.FriendlyName;
+                }
+                catch (AppDomainUnloadedException)
+                {
+                    return;
+                }
+
+                log.Info("Unloading AppDomain " + domainName);
+
+                thread = new Thread(new ThreadStart(UnloadOnThread));
+                thread.Start();
+                if (!thread.Join(30000))
+                {
+                    log.Error("Unable to unload AppDomain {0}, Unload thread timed out", domainName);
+                    ThreadUtility.Kill(thread);
+                }
+            }
+
+            private void UnloadOnThread()
+            {
+                bool shadowCopy = false;
+                string cachePath = null;
+                string domainName = "UNKNOWN";               
+
+                try
+                {
+                    shadowCopy = domain.ShadowCopyFiles;
+                    cachePath = domain.SetupInformation.CachePath;
+                    domainName = domain.FriendlyName;
+
+                    AppDomain.Unload(domain);
+                }
+                catch (Exception ex)
+                {
+                    // We assume that the tests did something bad and just leave
+                    // the orphaned AppDomain "out there". 
+                    // TODO: Something useful.
+                    log.Error("Unable to unload AppDomain " + domainName, ex);
+                }
+                finally
+                {
+                    if (shadowCopy && cachePath != null)
+                        DeleteCacheDir(new DirectoryInfo(cachePath));
+                }
+            }
+        }
+        #endregion
+
+        #region Helper Methods
+        /// <summary>
+		/// Get the location for caching and delete any old cache info
+		/// </summary>
+		private string GetCachePath()
+		{
+            int processId = Process.GetCurrentProcess().Id;
+            long ticks = DateTime.Now.Ticks;
+			string cachePath = Path.Combine( ShadowCopyPath, processId.ToString() + "_" + ticks.ToString() ); 
+				
+			try 
+			{
+				DirectoryInfo dir = new DirectoryInfo(cachePath);		
+				if(dir.Exists) dir.Delete(true);
+			}
+			catch( Exception ex)
+			{
+				throw new ApplicationException( 
+					string.Format( "Invalid cache path: {0}",cachePath ),
+					ex );
+			}
+
+			return cachePath;
+		}
+
+		/// <summary>
+		/// Helper method to delete the cache dir. This method deals 
+		/// with a bug that occurs when files are marked read-only
+		/// and deletes each file separately in order to give better 
+		/// exception information when problems occur.
+		/// 
+		/// TODO: This entire method is problematic. Should we be doing it?
+		/// </summary>
+		/// <param name="cacheDir"></param>
+		private static void DeleteCacheDir( DirectoryInfo cacheDir )
+		{
+			//			Debug.WriteLine( "Modules:");
+			//			foreach( ProcessModule module in Process.GetCurrentProcess().Modules )
+			//				Debug.WriteLine( module.ModuleName );
+			
+
+			if(cacheDir.Exists)
+			{
+				foreach( DirectoryInfo dirInfo in cacheDir.GetDirectories() )
+					DeleteCacheDir( dirInfo );
+
+				foreach( FileInfo fileInfo in cacheDir.GetFiles() )
+				{
+					fileInfo.Attributes = FileAttributes.Normal;
+					try 
+					{
+						fileInfo.Delete();
+					}
+					catch( Exception ex )
+					{
+						Debug.WriteLine( string.Format( 
+							"Error deleting {0}, {1}", fileInfo.Name, ex.Message ) );
+					}
+				}
+
+				cacheDir.Attributes = FileAttributes.Normal;
+
+				try
+				{
+					cacheDir.Delete();
+				}
+				catch( Exception ex )
+				{
+					Debug.WriteLine( string.Format( 
+						"Error deleting {0}, {1}", cacheDir.Name, ex.Message ) );
+				}
+			}
+		}
+
+		private bool IsTestDomain(AppDomain domain)
+		{
+			return domain.FriendlyName.StartsWith( "test-domain-" );
+		}
+
+        public static string GetCommonAppBase(IList assemblies)
+        {
+            string commonBase = null;
+
+            foreach (string assembly in assemblies)
+            {
+                string dir = Path.GetFullPath(Path.GetDirectoryName(assembly));
+                if (commonBase == null)
+                    commonBase = dir;
+                else while (!PathUtils.SamePathOrUnder(commonBase, dir) && commonBase != null)
+                        commonBase = Path.GetDirectoryName(commonBase);
+            }
+
+            return commonBase;
+        }
+
+		public static string GetPrivateBinPath( string basePath, IList assemblies )
+		{
+			StringBuilder sb = new StringBuilder(200);
+			ArrayList dirList = new ArrayList();
+
+			foreach( string assembly in assemblies )
+			{
+				string dir = PathUtils.RelativePath(
+                    Path.GetFullPath(basePath), 
+                    Path.GetDirectoryName( Path.GetFullPath(assembly) ) );
+				if ( dir != null && dir != "." && !dirList.Contains( dir ) )
+				{
+					dirList.Add( dir );
+					if ( sb.Length > 0 )
+						sb.Append( Path.PathSeparator );
+					sb.Append( dir );
+				}
+			}
+
+			return sb.Length == 0 ? null : sb.ToString();
+		}
+
+		public static void DeleteShadowCopyPath()
+		{
+			if ( Directory.Exists( ShadowCopyPath ) )
+				Directory.Delete( ShadowCopyPath, true );
+		}
+		#endregion
+
+		#region IService Members
+
+		public void UnloadService()
+		{
+            // TODO:  Add DomainManager.UnloadService implementation
+        }
+
+		public void InitializeService()
+		{
+			// TODO:  Add DomainManager.InitializeService implementation
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/ProjectService.cs b/src/ClientUtilities/util/Services/ProjectService.cs
index 975315f..d7c2c72 100644
--- a/src/ClientUtilities/util/Services/ProjectService.cs
+++ b/src/ClientUtilities/util/Services/ProjectService.cs
@@ -1,177 +1,177 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using NUnit.Core;
-using NUnit.Util.Extensibility;
-using NUnit.Util.ProjectConverters;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for ProjectService.
-	/// </summary>
-	public class ProjectService : IProjectConverter, IService
-	{
-		/// <summary>
-		/// Seed used to generate names for new projects
-		/// </summary>
-		private int projectSeed = 0;
-
-		/// <summary>
-		/// The extension used for test projects
-		/// </summary>
-        //private static readonly string nunitExtension = ".nunit";
-
-		/// <summary>
-		/// Array of all installed ProjectConverters
-		/// </summary>
-		IProjectConverter[] converters = new IProjectConverter[] 
-		{
-			new VisualStudioConverter()
-		};
-
-		#region Instance Methods
-		public bool CanLoadProject(string path)
-		{
-			return NUnitProject.IsNUnitProjectFile(path) || CanConvertFrom(path);
-		}
-
-		public NUnitProject LoadProject(string path)
-		{
-			if ( NUnitProject.IsNUnitProjectFile(path) )
-			{
-				NUnitProject project = new NUnitProject( path );
-				project.Load();
-				return project;
-			}
-
-			return ConvertFrom(path);
-		}
-
-		/// <summary>
-		/// Creates a project to wrap a list of assemblies
-		/// </summary>
-		public NUnitProject WrapAssemblies( string[] assemblies )
-		{
-			// if only one assembly is passed in then the configuration file
-			// should follow the name of the assembly. This will only happen
-			// if the LoadAssembly method is called. Currently the console ui
-			// does not differentiate between having one or multiple assemblies
-			// passed in.
-			if ( assemblies.Length == 1)
-				return WrapAssembly(assemblies[0]);
-
-
-			NUnitProject project = Services.ProjectService.EmptyProject();
-			ProjectConfig config = new ProjectConfig( "Default" );
-			foreach( string assembly in assemblies )
-			{
-				string fullPath = Path.GetFullPath( assembly );
-
-				if ( !File.Exists( fullPath ) )
-					throw new FileNotFoundException( string.Format( "Assembly not found: {0}", fullPath ) );
-				
-				config.Assemblies.Add( fullPath );
-			}
-
-			project.Configs.Add( config );
-
-			// TODO: Deduce application base, and provide a
-			// better value for loadpath and project path
-			// analagous to how new projects are handled
-			string basePath = Path.GetDirectoryName( Path.GetFullPath( assemblies[0] ) );
-			project.ProjectPath = Path.Combine( basePath, project.Name + ".nunit" );
-
-			project.IsDirty = true;
-
-			return project;
-		}
-
-		/// <summary>
-		/// Creates a project to wrap an assembly
-		/// </summary>
-		public NUnitProject WrapAssembly( string assemblyPath )
-		{
-			if ( !File.Exists( assemblyPath ) )
-				throw new FileNotFoundException( string.Format( "Assembly not found: {0}", assemblyPath ) );
-
-			string fullPath = Path.GetFullPath( assemblyPath );
-
-			NUnitProject project = new NUnitProject( fullPath );
-			
-			ProjectConfig config = new ProjectConfig( "Default" );
-			config.Assemblies.Add( fullPath );
-			project.Configs.Add( config );
-
-			project.IsAssemblyWrapper = true;
-			project.IsDirty = false;
-
-			return project;
-		}
-
-		public string GenerateProjectName()
-		{
-			return string.Format( "Project{0}", ++projectSeed );
-		}
-
-		public NUnitProject EmptyProject()
-		{
-			return new NUnitProject( GenerateProjectName() );
-		}
-
-		public NUnitProject NewProject()
-		{
-			NUnitProject project = EmptyProject();
-
-			project.Configs.Add( "Debug" );
-			project.Configs.Add( "Release" );
-			project.IsDirty = false;
-
-			return project;
-		}
-
-		public void SaveProject( NUnitProject project )
-		{
-			project.Save();
-		}
-		#endregion
-
-		#region IProjectConverter Members
-		public bool CanConvertFrom(string path)
-		{
-			foreach( IProjectConverter converter in converters )
-				if ( converter.CanConvertFrom(path) )
-					return true;
-
-			return false;
-		}
-
-		public NUnitProject ConvertFrom(string path)
-		{
-			foreach( IProjectConverter converter in converters )
-			{
-				if ( converter.CanConvertFrom( path ) )
-					return converter.ConvertFrom( path );
-			}
-
-			return WrapAssembly(path);
-		}
-		#endregion
-
-		#region IService Members
-		public void InitializeService()
-		{
-			// TODO:  Add ProjectLoader.InitializeService implementation
-		}
-
-		public void UnloadService()
-		{
-			// TODO:  Add ProjectLoader.UnloadService implementation
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using NUnit.Core;
+using NUnit.Util.Extensibility;
+using NUnit.Util.ProjectConverters;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for ProjectService.
+	/// </summary>
+	public class ProjectService : IProjectConverter, IService
+	{
+		/// <summary>
+		/// Seed used to generate names for new projects
+		/// </summary>
+		private int projectSeed = 0;
+
+		/// <summary>
+		/// The extension used for test projects
+		/// </summary>
+        //private static readonly string nunitExtension = ".nunit";
+
+		/// <summary>
+		/// Array of all installed ProjectConverters
+		/// </summary>
+		IProjectConverter[] converters = new IProjectConverter[] 
+		{
+			new VisualStudioConverter()
+		};
+
+		#region Instance Methods
+		public bool CanLoadProject(string path)
+		{
+			return NUnitProject.IsNUnitProjectFile(path) || CanConvertFrom(path);
+		}
+
+		public NUnitProject LoadProject(string path)
+		{
+			if ( NUnitProject.IsNUnitProjectFile(path) )
+			{
+				NUnitProject project = new NUnitProject( path );
+				project.Load();
+				return project;
+			}
+
+			return ConvertFrom(path);
+		}
+
+		/// <summary>
+		/// Creates a project to wrap a list of assemblies
+		/// </summary>
+		public NUnitProject WrapAssemblies( string[] assemblies )
+		{
+			// if only one assembly is passed in then the configuration file
+			// should follow the name of the assembly. This will only happen
+			// if the LoadAssembly method is called. Currently the console ui
+			// does not differentiate between having one or multiple assemblies
+			// passed in.
+			if ( assemblies.Length == 1)
+				return WrapAssembly(assemblies[0]);
+
+
+			NUnitProject project = Services.ProjectService.EmptyProject();
+			ProjectConfig config = new ProjectConfig( "Default" );
+			foreach( string assembly in assemblies )
+			{
+				string fullPath = Path.GetFullPath( assembly );
+
+				if ( !File.Exists( fullPath ) )
+					throw new FileNotFoundException( string.Format( "Assembly not found: {0}", fullPath ) );
+				
+				config.Assemblies.Add( fullPath );
+			}
+
+			project.Configs.Add( config );
+
+			// TODO: Deduce application base, and provide a
+			// better value for loadpath and project path
+			// analagous to how new projects are handled
+			string basePath = Path.GetDirectoryName( Path.GetFullPath( assemblies[0] ) );
+			project.ProjectPath = Path.Combine( basePath, project.Name + ".nunit" );
+
+			project.IsDirty = true;
+
+			return project;
+		}
+
+		/// <summary>
+		/// Creates a project to wrap an assembly
+		/// </summary>
+		public NUnitProject WrapAssembly( string assemblyPath )
+		{
+			if ( !File.Exists( assemblyPath ) )
+				throw new FileNotFoundException( string.Format( "Assembly not found: {0}", assemblyPath ) );
+
+			string fullPath = Path.GetFullPath( assemblyPath );
+
+			NUnitProject project = new NUnitProject( fullPath );
+			
+			ProjectConfig config = new ProjectConfig( "Default" );
+			config.Assemblies.Add( fullPath );
+			project.Configs.Add( config );
+
+			project.IsAssemblyWrapper = true;
+			project.IsDirty = false;
+
+			return project;
+		}
+
+		public string GenerateProjectName()
+		{
+			return string.Format( "Project{0}", ++projectSeed );
+		}
+
+		public NUnitProject EmptyProject()
+		{
+			return new NUnitProject( GenerateProjectName() );
+		}
+
+		public NUnitProject NewProject()
+		{
+			NUnitProject project = EmptyProject();
+
+			project.Configs.Add( "Debug" );
+			project.Configs.Add( "Release" );
+			project.IsDirty = false;
+
+			return project;
+		}
+
+		public void SaveProject( NUnitProject project )
+		{
+			project.Save();
+		}
+		#endregion
+
+		#region IProjectConverter Members
+		public bool CanConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+				if ( converter.CanConvertFrom(path) )
+					return true;
+
+			return false;
+		}
+
+		public NUnitProject ConvertFrom(string path)
+		{
+			foreach( IProjectConverter converter in converters )
+			{
+				if ( converter.CanConvertFrom( path ) )
+					return converter.ConvertFrom( path );
+			}
+
+			return WrapAssembly(path);
+		}
+		#endregion
+
+		#region IService Members
+		public void InitializeService()
+		{
+			// TODO:  Add ProjectLoader.InitializeService implementation
+		}
+
+		public void UnloadService()
+		{
+			// TODO:  Add ProjectLoader.UnloadService implementation
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/RecentFilesService.cs b/src/ClientUtilities/util/Services/RecentFilesService.cs
index 94b0661..8d3c1a6 100644
--- a/src/ClientUtilities/util/Services/RecentFilesService.cs
+++ b/src/ClientUtilities/util/Services/RecentFilesService.cs
@@ -1,176 +1,176 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for RecentFilesService.
-	/// </summary>
-	public class RecentFilesService : RecentFiles, NUnit.Core.IService
-	{
-		private RecentFilesCollection fileEntries = new RecentFilesCollection();
-
-		private ISettings settings;
-
-		public static readonly int MinSize = 0;
-
-		public static readonly int MaxSize = 24;
-
-		public static readonly int DefaultSize = 5;
-
-		#region Constructor
-		public RecentFilesService()
-			: this( Services.UserSettings ) { }
-
-		public RecentFilesService( ISettings settings ) 
-		{
-			this.settings = settings;
-		}
-		#endregion
-
-		#region Properties
-		public int Count
-		{
-			get { return fileEntries.Count; }
-		}
-
-		public int MaxFiles
-		{
-			get 
-			{ 
-				int size = settings.GetSetting("Gui.RecentProjects.MaxFiles", -1 );
-                if (size < 0)
-                {
-                    size = settings.GetSetting("RecentProjects.MaxFiles", DefaultSize);
-                    if (size != DefaultSize)
-                        settings.SaveSetting("Gui.RecentProjects.MaxFiles", size);
-                    settings.RemoveSetting("RecentProjects.MaxFiles");
-                }
-				
-				if ( size < MinSize ) size = MinSize;
-				if ( size > MaxSize ) size = MaxSize;
-				
-				return size;
-			}
-			set 
-			{ 
-				int oldSize = MaxFiles;
-				int newSize = value;
-				
-				if ( newSize < MinSize ) newSize = MinSize;
-				if ( newSize > MaxSize ) newSize = MaxSize;
-
-				settings.SaveSetting( "Gui.RecentProjects.MaxFiles", newSize );
-				if ( newSize < oldSize ) SaveEntriesToSettings( this. settings );
-			}
-		}
-		#endregion
-
-		#region Public Methods
-		public RecentFilesCollection Entries
-		{
-			get
-			{
-				return fileEntries;
-			}
-		}
-		
-		public void Remove( string fileName )
-		{
-			fileEntries.Remove( fileName );
-		}
-
-		public void SetMostRecent( string fileName )
-		{
-			SetMostRecent( new RecentFileEntry( fileName ) );
-		}
-
-		public void SetMostRecent( RecentFileEntry entry )
-		{
-			int index = fileEntries.IndexOf(entry.Path);
-
-			if(index != -1)
-				fileEntries.RemoveAt(index);
-
-			fileEntries.Insert( 0, entry );
-			if( fileEntries.Count > MaxFiles )
-				fileEntries.RemoveAt( MaxFiles );
-		}
-		#endregion
-
-		#region Helper Methods for saving and restoring the settings
-		private void LoadEntriesFromSettings( ISettings settings )
-		{
-			fileEntries.Clear();
-
-            AddEntriesForPrefix("Gui.RecentProjects");
-
-            // Try legacy entries if nothing was found
-            if (fileEntries.Count == 0)
-            {
-                AddEntriesForPrefix("RecentProjects.V2");
-                AddEntriesForPrefix("RecentProjects.V1");
-            }
-
-            // Try even older legacy format
-            if (fileEntries.Count == 0)
-                AddEntriesForPrefix("RecentProjects");
-		}
-
-        private void AddEntriesForPrefix(string prefix)
-        {
-            for (int index = 1; index < MaxFiles; index++)
-            {
-                if (fileEntries.Count >= MaxFiles) break;
-
-                string fileSpec = settings.GetSetting(GetRecentFileKey(prefix, index)) as string;
-                if (fileSpec != null) fileEntries.Add(RecentFileEntry.Parse(fileSpec));
-            }
-        }
-
-		private void SaveEntriesToSettings( ISettings settings )
-		{
-			string prefix = "Gui.RecentProjects";
-
-			while( fileEntries.Count > MaxFiles )
-				fileEntries.RemoveAt( fileEntries.Count - 1 );
-
-			for( int index = 0; index < MaxSize; index++ ) 
-			{
-				string keyName = GetRecentFileKey( prefix, index + 1 );
-				if ( index < fileEntries.Count )
-					settings.SaveSetting( keyName, fileEntries[index].Path );
-				else
-					settings.RemoveSetting( keyName );
-			}
-
-            // Remove legacy entries here
-            settings.RemoveGroup("RecentProjects");
-		}
-
-		private string GetRecentFileKey( string prefix, int index )
-		{
-			return string.Format( "{0}.File{1}", prefix, index );
-		}
-		#endregion
-
-		#region IService Members
-
-		public void UnloadService()
-		{
-			SaveEntriesToSettings( this.settings );
-		}
-
-		public void InitializeService()
-		{
-			LoadEntriesFromSettings( this.settings );
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for RecentFilesService.
+	/// </summary>
+	public class RecentFilesService : RecentFiles, NUnit.Core.IService
+	{
+		private RecentFilesCollection fileEntries = new RecentFilesCollection();
+
+		private ISettings settings;
+
+		public static readonly int MinSize = 0;
+
+		public static readonly int MaxSize = 24;
+
+		public static readonly int DefaultSize = 5;
+
+		#region Constructor
+		public RecentFilesService()
+			: this( Services.UserSettings ) { }
+
+		public RecentFilesService( ISettings settings ) 
+		{
+			this.settings = settings;
+		}
+		#endregion
+
+		#region Properties
+		public int Count
+		{
+			get { return fileEntries.Count; }
+		}
+
+		public int MaxFiles
+		{
+			get 
+			{ 
+				int size = settings.GetSetting("Gui.RecentProjects.MaxFiles", -1 );
+                if (size < 0)
+                {
+                    size = settings.GetSetting("RecentProjects.MaxFiles", DefaultSize);
+                    if (size != DefaultSize)
+                        settings.SaveSetting("Gui.RecentProjects.MaxFiles", size);
+                    settings.RemoveSetting("RecentProjects.MaxFiles");
+                }
+				
+				if ( size < MinSize ) size = MinSize;
+				if ( size > MaxSize ) size = MaxSize;
+				
+				return size;
+			}
+			set 
+			{ 
+				int oldSize = MaxFiles;
+				int newSize = value;
+				
+				if ( newSize < MinSize ) newSize = MinSize;
+				if ( newSize > MaxSize ) newSize = MaxSize;
+
+				settings.SaveSetting( "Gui.RecentProjects.MaxFiles", newSize );
+				if ( newSize < oldSize ) SaveEntriesToSettings( this. settings );
+			}
+		}
+		#endregion
+
+		#region Public Methods
+		public RecentFilesCollection Entries
+		{
+			get
+			{
+				return fileEntries;
+			}
+		}
+		
+		public void Remove( string fileName )
+		{
+			fileEntries.Remove( fileName );
+		}
+
+		public void SetMostRecent( string fileName )
+		{
+			SetMostRecent( new RecentFileEntry( fileName ) );
+		}
+
+		public void SetMostRecent( RecentFileEntry entry )
+		{
+			int index = fileEntries.IndexOf(entry.Path);
+
+			if(index != -1)
+				fileEntries.RemoveAt(index);
+
+			fileEntries.Insert( 0, entry );
+			if( fileEntries.Count > MaxFiles )
+				fileEntries.RemoveAt( MaxFiles );
+		}
+		#endregion
+
+		#region Helper Methods for saving and restoring the settings
+		private void LoadEntriesFromSettings( ISettings settings )
+		{
+			fileEntries.Clear();
+
+            AddEntriesForPrefix("Gui.RecentProjects");
+
+            // Try legacy entries if nothing was found
+            if (fileEntries.Count == 0)
+            {
+                AddEntriesForPrefix("RecentProjects.V2");
+                AddEntriesForPrefix("RecentProjects.V1");
+            }
+
+            // Try even older legacy format
+            if (fileEntries.Count == 0)
+                AddEntriesForPrefix("RecentProjects");
+		}
+
+        private void AddEntriesForPrefix(string prefix)
+        {
+            for (int index = 1; index < MaxFiles; index++)
+            {
+                if (fileEntries.Count >= MaxFiles) break;
+
+                string fileSpec = settings.GetSetting(GetRecentFileKey(prefix, index)) as string;
+                if (fileSpec != null) fileEntries.Add(RecentFileEntry.Parse(fileSpec));
+            }
+        }
+
+		private void SaveEntriesToSettings( ISettings settings )
+		{
+			string prefix = "Gui.RecentProjects";
+
+			while( fileEntries.Count > MaxFiles )
+				fileEntries.RemoveAt( fileEntries.Count - 1 );
+
+			for( int index = 0; index < MaxSize; index++ ) 
+			{
+				string keyName = GetRecentFileKey( prefix, index + 1 );
+				if ( index < fileEntries.Count )
+					settings.SaveSetting( keyName, fileEntries[index].Path );
+				else
+					settings.RemoveSetting( keyName );
+			}
+
+            // Remove legacy entries here
+            settings.RemoveGroup("RecentProjects");
+		}
+
+		private string GetRecentFileKey( string prefix, int index )
+		{
+			return string.Format( "{0}.File{1}", prefix, index );
+		}
+		#endregion
+
+		#region IService Members
+
+		public void UnloadService()
+		{
+			SaveEntriesToSettings( this.settings );
+		}
+
+		public void InitializeService()
+		{
+			LoadEntriesFromSettings( this.settings );
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/ServiceManager.cs b/src/ClientUtilities/util/Services/ServiceManager.cs
index 8127788..0017294 100644
--- a/src/ClientUtilities/util/Services/ServiceManager.cs
+++ b/src/ClientUtilities/util/Services/ServiceManager.cs
@@ -1,103 +1,103 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for ServiceManger.
-	/// </summary>
-	public class ServiceManager
-	{
-		private ArrayList services = new ArrayList();
-		private Hashtable serviceIndex = new Hashtable();
-
-		private static ServiceManager defaultServiceManager = new ServiceManager();
-
-		static Logger log = InternalTrace.GetLogger(typeof(ServiceManager));
-
-		public static ServiceManager Services
-		{
-			get { return defaultServiceManager; }
-		}
-
-		public void AddService( IService service )
-		{
-			services.Add( service );
-			log.Debug( "Added " + service.GetType().Name );
-		}
-
-		public IService GetService( Type serviceType )
-		{
-			IService theService = (IService)serviceIndex[serviceType];
-			if ( theService == null )
-				foreach( IService service in services )
-				{
-					// TODO: Does this work on Mono?
-					if( serviceType.IsInstanceOfType( service ) )
-					{
-						serviceIndex[serviceType] = service;
-						theService = service;
-						break;
-					}
-				}
-
-			if ( theService == null )
-				log.Error( string.Format( "Requested service {0} was not found", serviceType.FullName ) );
-			else
-				log.Debug( string.Format( "Request for service {0} satisfied by {1}", serviceType.Name, theService.GetType().Name ) );
-			
-			return theService;
-		}
-
-		public void InitializeServices()
-		{
-			foreach( IService service in services )
-			{
-				log.Info( "Initializing " + service.GetType().Name );
-                try
-                {
-                    service.InitializeService();
-                }
-                catch (Exception ex)
-                {
-                    log.Error("Failed to initialize service", ex);
-                }
-			}
-		}
-
-		public void StopAllServices()
-		{
-			// Stop services in reverse of initialization order
-			// TODO: Deal with dependencies explicitly
-			int index = services.Count;
-            while (--index >= 0)
-            {
-                IService service = services[index] as IService;
-                log.Info( "Stopping " + service.GetType().Name );
-                try
-                {
-                    service.UnloadService();
-                }
-                catch (Exception ex)
-                {
-                    log.Error("Failure stopping service", ex);
-                }
-            }
-		}
-
-		public void ClearServices()
-		{
-            log.Info("Clearing Service list");
-			services.Clear();
-		}
-
-		private ServiceManager() { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for ServiceManger.
+	/// </summary>
+	public class ServiceManager
+	{
+		private ArrayList services = new ArrayList();
+		private Hashtable serviceIndex = new Hashtable();
+
+		private static ServiceManager defaultServiceManager = new ServiceManager();
+
+		static Logger log = InternalTrace.GetLogger(typeof(ServiceManager));
+
+		public static ServiceManager Services
+		{
+			get { return defaultServiceManager; }
+		}
+
+		public void AddService( IService service )
+		{
+			services.Add( service );
+			log.Debug( "Added " + service.GetType().Name );
+		}
+
+		public IService GetService( Type serviceType )
+		{
+			IService theService = (IService)serviceIndex[serviceType];
+			if ( theService == null )
+				foreach( IService service in services )
+				{
+					// TODO: Does this work on Mono?
+					if( serviceType.IsInstanceOfType( service ) )
+					{
+						serviceIndex[serviceType] = service;
+						theService = service;
+						break;
+					}
+				}
+
+			if ( theService == null )
+				log.Error( string.Format( "Requested service {0} was not found", serviceType.FullName ) );
+			else
+				log.Debug( string.Format( "Request for service {0} satisfied by {1}", serviceType.Name, theService.GetType().Name ) );
+			
+			return theService;
+		}
+
+		public void InitializeServices()
+		{
+			foreach( IService service in services )
+			{
+				log.Info( "Initializing " + service.GetType().Name );
+                try
+                {
+                    service.InitializeService();
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Failed to initialize service", ex);
+                }
+			}
+		}
+
+		public void StopAllServices()
+		{
+			// Stop services in reverse of initialization order
+			// TODO: Deal with dependencies explicitly
+			int index = services.Count;
+            while (--index >= 0)
+            {
+                IService service = services[index] as IService;
+                log.Info( "Stopping " + service.GetType().Name );
+                try
+                {
+                    service.UnloadService();
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Failure stopping service", ex);
+                }
+            }
+		}
+
+		public void ClearServices()
+		{
+            log.Info("Clearing Service list");
+			services.Clear();
+		}
+
+		private ServiceManager() { }
+	}
+}
diff --git a/src/ClientUtilities/util/Services/SettingsService.cs b/src/ClientUtilities/util/Services/SettingsService.cs
index 083de61..85adc97 100644
--- a/src/ClientUtilities/util/Services/SettingsService.cs
+++ b/src/ClientUtilities/util/Services/SettingsService.cs
@@ -1,150 +1,150 @@
-// ****************************************************************
-// Copyright 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 Microsoft.Win32;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for UserSettingsService.
-	/// </summary>
-	public class SettingsService : SettingsGroup, NUnit.Core.IService
-	{
-		static readonly string settingsFileName = "NUnitSettings.xml";
-
-        private bool writeable;
-
-        public SettingsService() : this(true) { }
-
-		public SettingsService(bool writeable)
-		{
-            this.writeable = writeable;
-#if CLR_2_0 || CLR_4_0
-            string settingsFile = System.Configuration.ConfigurationManager.AppSettings["settingsFile"];
-#else
-			string settingsFile = System.Configuration.ConfigurationSettings.AppSettings["settingsFile"];
-#endif
-			if ( settingsFile == null )
-				settingsFile = Path.Combine( NUnitConfiguration.ApplicationDirectory, settingsFileName );
-
-			this.storage = new XmlSettingsStorage( settingsFile, writeable );
-
-			if ( File.Exists( settingsFile ) )
-				storage.LoadSettings();
-			else if (writeable)
-				ConvertLegacySettings();
-		}
-
-		#region IService Implementation
-		public void InitializeService()
-		{
-		}
-
-		public void UnloadService()
-		{
-            if ( writeable )
-			    storage.SaveSettings();
-
-			this.Dispose();
-		}
-		#endregion
-
-		#region ConvertLegacySettings
-		void ConvertLegacySettings()
-		{
-			RegistryKey key = Registry.CurrentUser.OpenSubKey( NUnitRegistry.KEY );
-			if ( key == null )
-				key = Registry.CurrentUser.OpenSubKey( NUnitRegistry.LEGACY_KEY );
-
-			if ( key != null )
-			{
-				using( ISettingsStorage legacyStorage = new RegistrySettingsStorage( key ) )
-				{
-					new LegacySettingsConverter( legacyStorage, storage ).Convert();
-				}
-
-				storage.SaveSettings();
-			}
-		}
-
-		private class LegacySettingsConverter : SettingsGroup
-		{
-			private ISettingsStorage legacy;
-
-			public LegacySettingsConverter( ISettingsStorage legacy, ISettingsStorage current )
-				: base( current )
-			{
-				this.legacy = legacy;
-			}
-
-			public void Convert()
-			{
-				Convert( "Form.x-location", "Gui.MainForm.Left" );
-				Convert( "Form.x-location", "Gui.MiniForm.Left" );
-				Convert( "Form.y-location", "Gui.MainForm.Top" );
-				Convert( "Form.y-location", "Gui.MiniForm.Top" );
-				Convert( "Form.width", "Gui.MainForm.Width" );
-				Convert( "Form.width", "Gui.MiniForm.Width" );
-				Convert( "Form.height", "Gui.MainForm.Height" );
-				Convert( "Form.height", "Gui.MiniForm.Height" );
-				Convert( "Form.maximized", "Gui.MainForm.Maximized", "False", "True" );
-				Convert( "Form.maximized", "Gui.MiniForm.Maximized", "False", "True" );
-				Convert( "Form.font", "Gui.MainForm.Font" );
-				Convert( "Form.font", "Gui.MiniForm.Font" );
-				Convert( "Form.tree-splitter-position", "Gui.MainForm.SplitPosition");
-				Convert( "Form.tab-splitter-position", "Gui.ResultTabs.ErrorsTabSplitterPosition");
-				Convert( "Options.TestLabels", "Gui.ResultTabs.DisplayTestLabels", "False", "True" );
-				Convert( "Options.FailureToolTips", "Gui.ResultTabs.ErrorTab.ToolTipsEnabled", "False", "True" );
-				Convert( "Options.EnableWordWrapForFailures", "Gui.ResultTabs.ErrorTab.WordWrapEnabled", "False", "True" );
-				Convert( "Options.InitialTreeDisplay", "Gui.TestTree.InitialTreeDisplay", "Auto", "Expand", "Collapse", "HideTests"  );
-				Convert( "Options.ShowCheckBoxes", "Gui.TestTree.ShowCheckBoxes", "False", "True" );
-				Convert( "Options.LoadLastProject", "Options.LoadLastProject", "False", "True" );
-				Convert( "Options.ClearResults", "Options.TestLoader.ClearResultsOnReload", "False", "True" ); 
-				Convert( "Options.ReloadOnChange", "Options.TestLoader.ReloadOnChange", "False", "True" );
-				Convert( "Options.RerunOnChange", "Options.TestLoader.RerunOnChange", "False", "True" );
-				Convert( "Options.ReloadOnRun", "Options.TestLoader.ReloadOnRun", "False", "True" );
-				Convert( "Options.MergeAssemblies", "Options.TestLoader.MergeAssemblies", "False", "True" );
-				//Convert( "Options.MultiDomain", "Options.TestLoader.MultiDomain", "False", "True" );
-				Convert( "Options.AutoNamespaceSuites", "Options.TestLoader.AutoNamespaceSuites", "False", "True" );
-				Convert( "Options.VisualStudioSupport", "Options.TestLoader.VisualStudioSupport", "False", "True" );
-				Convert( "Recent-Projects.MaxFiles", "RecentProjects.MaxFiles" );
-
-                object val = legacy.GetSetting("Options.MultiDomain");
-                if (val != null && (bool)val)
-                    this.SaveSetting("Options.TestLoader.DomainUsage", NUnit.Core.DomainUsage.Multiple);
-
-				int maxFiles = this.GetSetting( "RecentProjects.MaxFiles", 5 );
-				for( int i = 1; i <= maxFiles; i++ )
-				{
-					string fileKey = string.Format( "File{0}", i );
-					object fileEntry = legacy.GetSetting( "Recent-Projects." + fileKey );
-					if ( fileEntry != null )
-						this.SaveSetting( "RecentProjects." + fileKey, fileEntry );
-				}
-			}
-
-			private void Convert( string legacyName, string currentName, params string[]values )
-			{
-				object val = legacy.GetSetting( legacyName );
-				if ( val != null )
-				{
-					if ( val is int && values != null )
-					{
-						int ival = (int)val;
-						if ( ival >= 0 && ival < values.Length )
-							val = values[(int)val];
-					}
-
-					this.SaveSetting( currentName, val );
-				}
-			}
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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 Microsoft.Win32;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for UserSettingsService.
+	/// </summary>
+	public class SettingsService : SettingsGroup, NUnit.Core.IService
+	{
+		static readonly string settingsFileName = "NUnitSettings.xml";
+
+        private bool writeable;
+
+        public SettingsService() : this(true) { }
+
+		public SettingsService(bool writeable)
+		{
+            this.writeable = writeable;
+#if CLR_2_0 || CLR_4_0
+            string settingsFile = System.Configuration.ConfigurationManager.AppSettings["settingsFile"];
+#else
+			string settingsFile = System.Configuration.ConfigurationSettings.AppSettings["settingsFile"];
+#endif
+			if ( settingsFile == null )
+				settingsFile = Path.Combine( NUnitConfiguration.ApplicationDirectory, settingsFileName );
+
+			this.storage = new XmlSettingsStorage( settingsFile, writeable );
+
+			if ( File.Exists( settingsFile ) )
+				storage.LoadSettings();
+			else if (writeable)
+				ConvertLegacySettings();
+		}
+
+		#region IService Implementation
+		public void InitializeService()
+		{
+		}
+
+		public void UnloadService()
+		{
+            if ( writeable )
+			    storage.SaveSettings();
+
+			this.Dispose();
+		}
+		#endregion
+
+		#region ConvertLegacySettings
+		void ConvertLegacySettings()
+		{
+			RegistryKey key = Registry.CurrentUser.OpenSubKey( NUnitRegistry.KEY );
+			if ( key == null )
+				key = Registry.CurrentUser.OpenSubKey( NUnitRegistry.LEGACY_KEY );
+
+			if ( key != null )
+			{
+				using( ISettingsStorage legacyStorage = new RegistrySettingsStorage( key ) )
+				{
+					new LegacySettingsConverter( legacyStorage, storage ).Convert();
+				}
+
+				storage.SaveSettings();
+			}
+		}
+
+		private class LegacySettingsConverter : SettingsGroup
+		{
+			private ISettingsStorage legacy;
+
+			public LegacySettingsConverter( ISettingsStorage legacy, ISettingsStorage current )
+				: base( current )
+			{
+				this.legacy = legacy;
+			}
+
+			public void Convert()
+			{
+				Convert( "Form.x-location", "Gui.MainForm.Left" );
+				Convert( "Form.x-location", "Gui.MiniForm.Left" );
+				Convert( "Form.y-location", "Gui.MainForm.Top" );
+				Convert( "Form.y-location", "Gui.MiniForm.Top" );
+				Convert( "Form.width", "Gui.MainForm.Width" );
+				Convert( "Form.width", "Gui.MiniForm.Width" );
+				Convert( "Form.height", "Gui.MainForm.Height" );
+				Convert( "Form.height", "Gui.MiniForm.Height" );
+				Convert( "Form.maximized", "Gui.MainForm.Maximized", "False", "True" );
+				Convert( "Form.maximized", "Gui.MiniForm.Maximized", "False", "True" );
+				Convert( "Form.font", "Gui.MainForm.Font" );
+				Convert( "Form.font", "Gui.MiniForm.Font" );
+				Convert( "Form.tree-splitter-position", "Gui.MainForm.SplitPosition");
+				Convert( "Form.tab-splitter-position", "Gui.ResultTabs.ErrorsTabSplitterPosition");
+				Convert( "Options.TestLabels", "Gui.ResultTabs.DisplayTestLabels", "False", "True" );
+				Convert( "Options.FailureToolTips", "Gui.ResultTabs.ErrorTab.ToolTipsEnabled", "False", "True" );
+				Convert( "Options.EnableWordWrapForFailures", "Gui.ResultTabs.ErrorTab.WordWrapEnabled", "False", "True" );
+				Convert( "Options.InitialTreeDisplay", "Gui.TestTree.InitialTreeDisplay", "Auto", "Expand", "Collapse", "HideTests"  );
+				Convert( "Options.ShowCheckBoxes", "Gui.TestTree.ShowCheckBoxes", "False", "True" );
+				Convert( "Options.LoadLastProject", "Options.LoadLastProject", "False", "True" );
+				Convert( "Options.ClearResults", "Options.TestLoader.ClearResultsOnReload", "False", "True" ); 
+				Convert( "Options.ReloadOnChange", "Options.TestLoader.ReloadOnChange", "False", "True" );
+				Convert( "Options.RerunOnChange", "Options.TestLoader.RerunOnChange", "False", "True" );
+				Convert( "Options.ReloadOnRun", "Options.TestLoader.ReloadOnRun", "False", "True" );
+				Convert( "Options.MergeAssemblies", "Options.TestLoader.MergeAssemblies", "False", "True" );
+				//Convert( "Options.MultiDomain", "Options.TestLoader.MultiDomain", "False", "True" );
+				Convert( "Options.AutoNamespaceSuites", "Options.TestLoader.AutoNamespaceSuites", "False", "True" );
+				Convert( "Options.VisualStudioSupport", "Options.TestLoader.VisualStudioSupport", "False", "True" );
+				Convert( "Recent-Projects.MaxFiles", "RecentProjects.MaxFiles" );
+
+                object val = legacy.GetSetting("Options.MultiDomain");
+                if (val != null && (bool)val)
+                    this.SaveSetting("Options.TestLoader.DomainUsage", NUnit.Core.DomainUsage.Multiple);
+
+				int maxFiles = this.GetSetting( "RecentProjects.MaxFiles", 5 );
+				for( int i = 1; i <= maxFiles; i++ )
+				{
+					string fileKey = string.Format( "File{0}", i );
+					object fileEntry = legacy.GetSetting( "Recent-Projects." + fileKey );
+					if ( fileEntry != null )
+						this.SaveSetting( "RecentProjects." + fileKey, fileEntry );
+				}
+			}
+
+			private void Convert( string legacyName, string currentName, params string[]values )
+			{
+				object val = legacy.GetSetting( legacyName );
+				if ( val != null )
+				{
+					if ( val is int && values != null )
+					{
+						int ival = (int)val;
+						if ( ival >= 0 && ival < values.Length )
+							val = values[(int)val];
+					}
+
+					this.SaveSetting( currentName, val );
+				}
+			}
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/Services/TestAgency.cs b/src/ClientUtilities/util/Services/TestAgency.cs
index d2a35a2..4f30d02 100644
--- a/src/ClientUtilities/util/Services/TestAgency.cs
+++ b/src/ClientUtilities/util/Services/TestAgency.cs
@@ -1,475 +1,470 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Threading;
-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;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Enumeration used to report AgentStatus
-	/// </summary>
-	public enum AgentStatus
-	{
-		Unknown,
-		Starting,
-		Ready,
-		Busy,
-		Stopping
-	}
-
-	/// <summary>
-	/// The TestAgency class provides RemoteTestAgents
-	/// on request and tracks their status. Agents
-	/// are wrapped in an instance of the TestAgent
-	/// class. Multiple agent types are supported
-	/// but only one, ProcessAgent is implemented
-	/// at this time.
-	/// </summary>
-	public class TestAgency : ServerBase, IAgency, IService
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(TestAgency));
-
-		#region Private Fields
-		private AgentDataBase agentData = new AgentDataBase();
-		#endregion
-
-		#region Constructors
-		public TestAgency() : this( "TestAgency", 0 ) { }
-
-		public TestAgency( string uri, int port ) : base( uri, port ) { }
-		#endregion
-
-		#region ServerBase Overrides
-		public override void Stop()
-		{
-			foreach( AgentRecord r in agentData )
-			{
-				if ( !r.Process.HasExited )
-				{
-					if ( r.Agent != null )
-					{
-						r.Agent.Stop();
-						r.Process.WaitForExit(10000);
-					}
-
-					if ( !r.Process.HasExited )
-						r.Process.Kill();
-				}
-			}
-
-			agentData.Clear();
-
-			base.Stop ();
-		}
-		#endregion
-
-		#region Public Methods - Called by Agents
-		public void Register( TestAgent agent )
-		{
-			AgentRecord r = agentData[agent.Id];
-			if ( r == null )
-                throw new ArgumentException(
-                    string.Format("Agent {0} is not in the agency database", agent.Id),
-                    "agentId");
-            r.Agent = agent;
-		}
-
-		public void ReportStatus( Guid agentId, AgentStatus status )
-		{
-			AgentRecord r = agentData[agentId];
-
-			if ( r == null )
-                throw new ArgumentException(
-                    string.Format("Agent {0} is not in the agency database", agentId),
-                    "agentId" );
-
-			r.Status = status;
-		}
-		#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 );
-		}
-
-        public TestAgent GetAgent(int waitTime)
-        {
-            return GetAgent(RuntimeFramework.CurrentFramework, waitTime);
-        }
-
-        public TestAgent GetAgent(RuntimeFramework framework, int waitTime)
-        {
-            return GetAgent(framework, waitTime, false);
-        }
-
-        public TestAgent GetAgent(RuntimeFramework framework, int waitTime, bool enableDebug)
-        {
-            log.Info("Getting agent for use under {0}", framework);
- 
-            if (!framework.IsAvailable)
-                throw new ArgumentException(
-                    string.Format("The {0} framework is not available", framework),
-                    "framework");
-
-            // TODO: Decide if we should reuse agents
-            //AgentRecord r = FindAvailableRemoteAgent(type);
-            //if ( r == null )
-            //    r = CreateRemoteAgent(type, framework, waitTime);
-            return CreateRemoteAgent(framework, waitTime, enableDebug);
-		}
-
-		public void ReleaseAgent( TestAgent agent )
-		{
-			AgentRecord r = agentData[agent.Id];
-			if ( r == null )
-				log.Error( string.Format( "Unable to release agent {0} - not in database", agent.Id ) );
-			else
-			{
-				r.Status = AgentStatus.Ready;
-				log.Debug( "Releasing agent " + agent.Id.ToString() );
-			}
-		}
-
-        //public void DestroyAgent( ITestAgent agent )
-        //{
-        //    AgentRecord r = agentData[agent.Id];
-        //    if ( r != null )
-        //    {
-        //        if( !r.Process.HasExited )
-        //            r.Agent.Stop();
-        //        agentData[r.Id] = null;
-        //    }
-        //}
-		#endregion
-
-		#region Helper Methods
-		private Guid LaunchAgentProcess(RuntimeFramework targetRuntime, bool enableDebug)
-		{
-            string agentExePath = GetTestAgentExePath(targetRuntime.ClrVersion);
-
-            if (agentExePath == null)
-                throw new ArgumentException(
-                    string.Format("NUnit components for version {0} of the CLR are not installed",
-                    targetRuntime.ClrVersion.ToString()), "targetRuntime");
-
-            log.Debug("Using nunit-agent at " + agentExePath);
-
-			Process p = new Process();
-			p.StartInfo.UseShellExecute = false;
-            Guid agentId = Guid.NewGuid();
-            string arglist = agentId.ToString() + " " + ServerUrl;
-            if (enableDebug)
-                arglist += " --pause";
-
-            switch( targetRuntime.Runtime )
-            {
-                case RuntimeType.Mono:
-                    p.StartInfo.FileName = NUnitConfiguration.MonoExePath;
-                    string monoOptions = "--runtime=v" + targetRuntime.ClrVersion.ToString(3);
-                    if (enableDebug)
-                        monoOptions += " --debug";
-                    p.StartInfo.Arguments = string.Format("{0} \"{1}\" {2}", monoOptions, agentExePath, arglist);
-                    break;
-                case RuntimeType.Net:
-                    p.StartInfo.FileName = agentExePath;
-
-                    if (targetRuntime.ClrVersion.Build < 0)
-                        targetRuntime = RuntimeFramework.GetBestAvailableFramework(targetRuntime);
-
-                    string envVar = "v" + targetRuntime.ClrVersion.ToString(3);
-                    p.StartInfo.EnvironmentVariables["COMPLUS_Version"] = envVar;
-
-                    p.StartInfo.Arguments = arglist;
-                    break;
-                default:
-				    p.StartInfo.FileName = agentExePath;
-                    p.StartInfo.Arguments = arglist;
-                    break;
-			}
-			
-            //p.Exited += new EventHandler(OnProcessExit);
-            p.Start();
-            log.Info("Launched Agent process {0} - see nunit-agent_{0}.log", p.Id);
-            log.Info("Command line: \"{0}\" {1}", p.StartInfo.FileName, p.StartInfo.Arguments);
-
-			agentData.Add( new AgentRecord( agentId, p, null, AgentStatus.Starting ) );
-		    return agentId;
-		}
-
-        //private void OnProcessExit(object sender, EventArgs e)
-        //{
-        //    Process p = sender as Process;
-        //    if (p != null)
-        //        agentData.Remove(p.Id);
-        //}
-
-		private AgentRecord FindAvailableAgent()
-		{
-			foreach( AgentRecord r in agentData )
-				if ( r.Status == AgentStatus.Ready)
-				{
-					log.Debug( "Reusing agent {0}", r.Id );
-					r.Status = AgentStatus.Busy;
-					return r;
-				}
-
-			return null;
-		}
-
-		private TestAgent CreateRemoteAgent(RuntimeFramework framework, int waitTime, bool enableDebug)
-		{
-            Guid agentId = LaunchAgentProcess(framework, enableDebug);
-
-			log.Debug( "Waiting for agent {0} to register", agentId.ToString("B") );
-
-            int pollTime = 200;
-            bool infinite = waitTime == Timeout.Infinite;
-
-			while( infinite || waitTime > 0 )
-			{
-				Thread.Sleep( pollTime );
-				if ( !infinite ) waitTime -= pollTime;
-                TestAgent agent = agentData[agentId].Agent;
-				if ( agent != null )
-				{
-					log.Debug( "Returning new agent {0}", agentId.ToString("B") );
-                    return agent;
-				}
-			}
-
-			return null;
-		}
-
-        /// <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
-
-		public void UnloadService()
-		{
-			this.Stop();
-		}
-
-		public void InitializeService()
-		{
-			this.Start();
-		}
-
-		#endregion
-
-		#region Nested Class - AgentRecord
-		private class AgentRecord
-		{
-			public Guid Id;
-			public Process Process;
-			public TestAgent Agent;
-			public AgentStatus Status;
-
-			public AgentRecord( Guid id, Process p, TestAgent a, AgentStatus s )
-			{
-				this.Id = id;
-				this.Process = p;
-				this.Agent = a;
-				this.Status = s;
-			}
-
-		}
-		#endregion
-
-		#region Nested Class - AgentDataBase
-		/// <summary>
-		///  A simple class that tracks data about this
-		///  agencies active and available agents
-		/// </summary>
-		private class AgentDataBase : IEnumerable
-		{
-			private ListDictionary agentData = new ListDictionary();
-
-			public AgentRecord this[Guid id]
-			{
-				get { return (AgentRecord)agentData[id]; }
-				set
-				{
-					if ( value == null )
-						agentData.Remove( id );
-					else
-						agentData[id] = value;
-				}
-			}
-
-			public AgentRecord this[TestAgent agent]
-			{
-				get
-				{
-					foreach( System.Collections.DictionaryEntry entry in agentData )
-					{
-						AgentRecord r = (AgentRecord)entry.Value;
-						if ( r.Agent == agent )
-							return r;
-					}
-
-					return null;
-				}
-			}
-
-			public void Add( AgentRecord r )
-			{
-				agentData[r.Id] = r;
-			}
-
-            public void Remove(Guid agentId)
-            {
-                agentData.Remove(agentId);
-            }
-
-			public void Clear()
-			{
-				agentData.Clear();
-			}
-
-			#region IEnumerable Members
-			public IEnumerator GetEnumerator()
-			{
-				return new AgentDataEnumerator( agentData );
-			}
-			#endregion
-
-			#region Nested Class - AgentDataEnumerator
-			public class AgentDataEnumerator : IEnumerator
-			{
-				IEnumerator innerEnum;
-
-				public AgentDataEnumerator( IDictionary list )
-				{
-					innerEnum = list.GetEnumerator();
-				}
-
-				#region IEnumerator Members
-				public void Reset()
-				{
-					innerEnum.Reset();
-				}
-
-				public object Current
-				{
-					get { return ((DictionaryEntry)innerEnum.Current).Value; }
-				}
-
-				public bool MoveNext()
-				{
-					return innerEnum.MoveNext();
-				}
-				#endregion
-			}
-			#endregion
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Threading;
+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;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Enumeration used to report AgentStatus
+	/// </summary>
+	public enum AgentStatus
+	{
+		Unknown,
+		Starting,
+		Ready,
+		Busy,
+		Stopping
+	}
+
+	/// <summary>
+	/// The TestAgency class provides RemoteTestAgents
+	/// on request and tracks their status. Agents
+	/// are wrapped in an instance of the TestAgent
+	/// class. Multiple agent types are supported
+	/// but only one, ProcessAgent is implemented
+	/// at this time.
+	/// </summary>
+	public class TestAgency : ServerBase, IAgency, IService
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(TestAgency));
+
+		#region Private Fields
+		private AgentDataBase agentData = new AgentDataBase();
+		#endregion
+
+		#region Constructors
+		public TestAgency() : this( "TestAgency", 0 ) { }
+
+		public TestAgency( string uri, int port ) : base( uri, port ) { }
+		#endregion
+
+		#region ServerBase Overrides
+		public override void Stop()
+		{
+			foreach( AgentRecord r in agentData )
+			{
+				if ( !r.Process.HasExited )
+				{
+					if ( r.Agent != null )
+					{
+						r.Agent.Stop();
+						r.Process.WaitForExit(10000);
+					}
+
+					if ( !r.Process.HasExited )
+						r.Process.Kill();
+				}
+			}
+
+			agentData.Clear();
+
+			base.Stop ();
+		}
+		#endregion
+
+		#region Public Methods - Called by Agents
+		public void Register( TestAgent agent )
+		{
+			AgentRecord r = agentData[agent.Id];
+			if ( r == null )
+                throw new ArgumentException(
+                    string.Format("Agent {0} is not in the agency database", agent.Id),
+                    "agentId");
+            r.Agent = agent;
+		}
+
+		public void ReportStatus( Guid agentId, AgentStatus status )
+		{
+			AgentRecord r = agentData[agentId];
+
+			if ( r == null )
+                throw new ArgumentException(
+                    string.Format("Agent {0} is not in the agency database", agentId),
+                    "agentId" );
+
+			r.Status = status;
+		}
+		#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 );
+		}
+
+        public TestAgent GetAgent(int waitTime)
+        {
+            return GetAgent(RuntimeFramework.CurrentFramework, waitTime);
+        }
+
+        public TestAgent GetAgent(RuntimeFramework framework, int waitTime)
+        {
+			log.Info("Getting agent for use under {0}", framework);
+ 
+            if (!framework.IsAvailable)
+                throw new ArgumentException(
+                    string.Format("The {0} framework is not available", framework),
+                    "framework");
+
+            // TODO: Decide if we should reuse agents
+            //AgentRecord r = FindAvailableRemoteAgent(type);
+            //if ( r == null )
+            //    r = CreateRemoteAgent(type, framework, waitTime);
+            return CreateRemoteAgent(framework, waitTime);
+		}
+
+		public void ReleaseAgent( TestAgent agent )
+		{
+			AgentRecord r = agentData[agent.Id];
+			if ( r == null )
+				log.Error( string.Format( "Unable to release agent {0} - not in database", agent.Id ) );
+			else
+			{
+				r.Status = AgentStatus.Ready;
+				log.Debug( "Releasing agent " + agent.Id.ToString() );
+			}
+		}
+
+        //public void DestroyAgent( ITestAgent agent )
+        //{
+        //    AgentRecord r = agentData[agent.Id];
+        //    if ( r != null )
+        //    {
+        //        if( !r.Process.HasExited )
+        //            r.Agent.Stop();
+        //        agentData[r.Id] = null;
+        //    }
+        //}
+		#endregion
+
+		#region Helper Methods
+		private Guid LaunchAgentProcess(RuntimeFramework targetRuntime)
+		{
+            string agentExePath = GetTestAgentExePath(targetRuntime.ClrVersion);
+
+            if (agentExePath == null)
+                throw new ArgumentException(
+                    string.Format("NUnit components for version {0} of the CLR are not installed",
+                    targetRuntime.ClrVersion.ToString()), "targetRuntime");
+
+            log.Debug("Using nunit-agent at " + agentExePath);
+
+			Process p = new Process();
+			p.StartInfo.UseShellExecute = false;
+            Guid agentId = Guid.NewGuid();
+            string arglist = agentId.ToString() + " " + ServerUrl;
+            if (Debugger.IsAttached)
+                arglist += " --launch-debugger";
+
+            switch( targetRuntime.Runtime )
+            {
+                case RuntimeType.Mono:
+                    p.StartInfo.FileName = NUnitConfiguration.MonoExePath;
+                    string monoOptions = "--runtime=v" + targetRuntime.ClrVersion.ToString(3);
+                    if (Debugger.IsAttached)
+                        monoOptions += " --debug";
+                    p.StartInfo.Arguments = string.Format("{0} \"{1}\" {2}", monoOptions, agentExePath, arglist);
+                    break;
+                case RuntimeType.Net:
+                    p.StartInfo.FileName = agentExePath;
+
+                    if (targetRuntime.ClrVersion.Build < 0)
+                        targetRuntime = RuntimeFramework.GetBestAvailableFramework(targetRuntime);
+
+                    string envVar = "v" + targetRuntime.ClrVersion.ToString(3);
+                    p.StartInfo.EnvironmentVariables["COMPLUS_Version"] = envVar;
+
+                    p.StartInfo.Arguments = arglist;
+                    break;
+                default:
+				    p.StartInfo.FileName = agentExePath;
+                    p.StartInfo.Arguments = arglist;
+                    break;
+			}
+			
+            //p.Exited += new EventHandler(OnProcessExit);
+            p.Start();
+            log.Info("Launched Agent process {0} - see nunit-agent_{0}.log", p.Id);
+            log.Info("Command line: \"{0}\" {1}", p.StartInfo.FileName, p.StartInfo.Arguments);
+
+			agentData.Add( new AgentRecord( agentId, p, null, AgentStatus.Starting ) );
+		    return agentId;
+		}
+
+        //private void OnProcessExit(object sender, EventArgs e)
+        //{
+        //    Process p = sender as Process;
+        //    if (p != null)
+        //        agentData.Remove(p.Id);
+        //}
+
+		private AgentRecord FindAvailableAgent()
+		{
+			foreach( AgentRecord r in agentData )
+				if ( r.Status == AgentStatus.Ready)
+				{
+					log.Debug( "Reusing agent {0}", r.Id );
+					r.Status = AgentStatus.Busy;
+					return r;
+				}
+
+			return null;
+		}
+
+		private TestAgent CreateRemoteAgent(RuntimeFramework framework, int waitTime)
+		{
+            Guid agentId = LaunchAgentProcess(framework);
+
+			log.Debug( "Waiting for agent {0} to register", agentId.ToString("B") );
+
+            int pollTime = 200;
+            bool infinite = waitTime == Timeout.Infinite;
+
+			while( infinite || waitTime > 0 )
+			{
+				Thread.Sleep( pollTime );
+				if ( !infinite ) waitTime -= pollTime;
+                TestAgent agent = agentData[agentId].Agent;
+				if ( agent != null )
+				{
+					log.Debug( "Returning new agent {0}", agentId.ToString("B") );
+                    return agent;
+				}
+			}
+
+			return null;
+		}
+
+        /// <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
+
+		public void UnloadService()
+		{
+			this.Stop();
+		}
+
+		public void InitializeService()
+		{
+			this.Start();
+		}
+
+		#endregion
+
+		#region Nested Class - AgentRecord
+		private class AgentRecord
+		{
+			public Guid Id;
+			public Process Process;
+			public TestAgent Agent;
+			public AgentStatus Status;
+
+			public AgentRecord( Guid id, Process p, TestAgent a, AgentStatus s )
+			{
+				this.Id = id;
+				this.Process = p;
+				this.Agent = a;
+				this.Status = s;
+			}
+
+		}
+		#endregion
+
+		#region Nested Class - AgentDataBase
+		/// <summary>
+		///  A simple class that tracks data about this
+		///  agencies active and available agents
+		/// </summary>
+		private class AgentDataBase : IEnumerable
+		{
+			private ListDictionary agentData = new ListDictionary();
+
+			public AgentRecord this[Guid id]
+			{
+				get { return (AgentRecord)agentData[id]; }
+				set
+				{
+					if ( value == null )
+						agentData.Remove( id );
+					else
+						agentData[id] = value;
+				}
+			}
+
+			public AgentRecord this[TestAgent agent]
+			{
+				get
+				{
+					foreach( System.Collections.DictionaryEntry entry in agentData )
+					{
+						AgentRecord r = (AgentRecord)entry.Value;
+						if ( r.Agent == agent )
+							return r;
+					}
+
+					return null;
+				}
+			}
+
+			public void Add( AgentRecord r )
+			{
+				agentData[r.Id] = r;
+			}
+
+            public void Remove(Guid agentId)
+            {
+                agentData.Remove(agentId);
+            }
+
+			public void Clear()
+			{
+				agentData.Clear();
+			}
+
+			#region IEnumerable Members
+			public IEnumerator GetEnumerator()
+			{
+				return new AgentDataEnumerator( agentData );
+			}
+			#endregion
+
+			#region Nested Class - AgentDataEnumerator
+			public class AgentDataEnumerator : IEnumerator
+			{
+				IEnumerator innerEnum;
+
+				public AgentDataEnumerator( IDictionary list )
+				{
+					innerEnum = list.GetEnumerator();
+				}
+
+				#region IEnumerator Members
+				public void Reset()
+				{
+					innerEnum.Reset();
+				}
+
+				public object Current
+				{
+					get { return ((DictionaryEntry)innerEnum.Current).Value; }
+				}
+
+				public bool MoveNext()
+				{
+					return innerEnum.MoveNext();
+				}
+				#endregion
+			}
+			#endregion
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/SettingsGroup.cs b/src/ClientUtilities/util/SettingsGroup.cs
index 2a7e715..538e81a 100644
--- a/src/ClientUtilities/util/SettingsGroup.cs
+++ b/src/ClientUtilities/util/SettingsGroup.cs
@@ -1,314 +1,314 @@
-// ****************************************************************
-// 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
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-    using System.Drawing;
-    using System.Globalization;
-    using System.ComponentModel;
-
-	/// <summary>
-	/// SettingsGroup is the base class representing a group
-	/// of user or system settings. All storge of settings
-	/// is delegated to a SettingsStorage.
-	/// </summary>
-	public class SettingsGroup : ISettings, IDisposable
-	{
-		#region Instance Fields
-		protected ISettingsStorage storage;
-		#endregion
-
-		#region Constructors
-
-		/// <summary>
-		/// Construct a settings group.
-		/// </summary>
-		/// <param name="storage">Storage for the group settings</param>
-		public SettingsGroup( ISettingsStorage storage )
-		{
-			this.storage = storage;
-		}
-
-		/// <summary>
-		/// Protected constructor for use by derived classes that
-		/// set the storage themselves or don't use a storage.
-		/// </summary>
-		protected SettingsGroup()
-		{
-		}
-		#endregion
-
-		#region Properties
-
-		public event SettingsEventHandler Changed;
-
-		/// <summary>
-		/// The storage used for the group settings
-		/// </summary>
-		public ISettingsStorage Storage
-		{
-			get { return storage; }
-		}
-
-		#endregion
-
-		#region ISettings Members
-
-		/// <summary>
-		/// Load the value of one of the group's settings
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <returns>Value of the setting or null</returns>
-		public object GetSetting( string settingName )
-		{
-			return storage.GetSetting( settingName );
-		}
-
-		/// <summary>
-		/// Load the value of one of the group's settings or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value to return if the seeting is not present</param>
-		/// <returns>Value of the setting or the default</returns>
-		public object GetSetting( string settingName, object defaultValue )
-		{
-			object result = GetSetting(settingName );
-
-			if ( result == null )
-				result = defaultValue;
-
-			return result;
-		}
-
-        /// <summary>
-        /// Load the value of one of the group's integer settings
-        /// in a type-safe manner or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of setting to load</param>
-        /// <param name="defaultValue">Value to return if the seeting is not present</param>
-        /// <returns>Value of the setting or the default</returns>
-        public int GetSetting(string settingName, int defaultValue)
-        {
-            object result = GetSetting(settingName);
-
-            if (result == null)
-                return defaultValue;
-
-            if (result is int)
-                return (int)result;
-
-            try
-            {
-                return Int32.Parse(result.ToString());
-            }
-            catch
-            {
-                return defaultValue;
-            }
-        }
-
-        /// <summary>
-        /// Load the value of one of the group's float settings
-        /// in a type-safe manner or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of setting to load</param>
-        /// <param name="defaultValue">Value to return if the setting is not present</param>
-        /// <returns>Value of the setting or the default</returns>
-        public float GetSetting(string settingName, float defaultValue)
-        {
-            object result = GetSetting(settingName);
-
-            if (result == null)
-                return defaultValue;
-
-            if (result is float)
-                return (float)result;
-
-            try
-            {
-                return float.Parse(result.ToString());
-            }
-            catch
-            {
-                return defaultValue;
-            }
-        }
-
-        /// <summary>
-		/// Load the value of one of the group's boolean settings
-		/// in a type-safe manner.
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value of the setting or the default</param>
-		/// <returns>Value of the setting</returns>
-		public bool GetSetting( string settingName, bool defaultValue )
-		{
-			object result = GetSetting(settingName );
-
-			if ( result == null )
-				return defaultValue;
-
-			// Handle legacy formats
-//			if ( result is int )
-//				return (int)result == 1;
-//
-//			if ( result is string )
-//			{
-//				if ( (string)result == "1" ) return true;
-//				if ( (string)result == "0" ) return false;
-//			}
-
-			if ( result is bool )
-				return (bool) result ;
-			
-			try
-			{
-				return Boolean.Parse( result.ToString() );
-			}
-			catch
-			{
-				return defaultValue;
-			}
-		}
-
-		/// <summary>
-		/// Load the value of one of the group's string settings
-		/// in a type-safe manner or return a default value
-		/// </summary>
-		/// <param name="settingName">Name of setting to load</param>
-		/// <param name="defaultValue">Value to return if the setting is not present</param>
-		/// <returns>Value of the setting or the default</returns>
-		public string GetSetting( string settingName, string defaultValue )
-		{
-			object result = GetSetting(settingName );
-
-			if ( result == null )
-				return defaultValue;
-
-			if ( result is string )
-				return (string) result;
-			else
-				return result.ToString();
-		}
-
-        /// <summary>
-        /// Load the value of one of the group's enum settings
-        /// in a type-safe manner or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of setting to load</param>
-        /// <param name="defaultValue">Value to return if the setting is not present</param>
-        /// <returns>Value of the setting or the default</returns>
-        public System.Enum GetSetting(string settingName, System.Enum defaultValue)
-        {
-            object result = GetSetting(settingName);
-
-            if (result == null)
-                return defaultValue;
-
-            if (result is System.Enum)
-                return (System.Enum)result;
-
-            try
-            {
-                return (System.Enum)System.Enum.Parse(defaultValue.GetType(), result.ToString(), true);
-            }
-            catch
-            {
-                return defaultValue;
-            }
-        }
-
-        /// <summary>
-        /// Load the value of one of the group's Font settings
-        /// in a type-safe manner or return a default value
-        /// </summary>
-        /// <param name="settingName">Name of setting to load</param>
-        /// <param name="defaultFont">Value to return if the setting is not present</param>
-        /// <returns>Value of the setting or the default</returns>
-        public Font GetSetting(string settingName, Font defaultFont)
-        {
-            object result = GetSetting(settingName);
-
-            if (result == null)
-                return defaultFont;
-
-            if (result is Font)
-                return (Font)result;
-
-            try
-            {
-                TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-                return (Font)converter.ConvertFrom(null, CultureInfo.InvariantCulture, result.ToString());
-            }
-            catch
-            {
-                return defaultFont;
-            }
-        }
-
-        /// <summary>
-		/// Remove a setting from the group
-		/// </summary>
-		/// <param name="settingName">Name of the setting to remove</param>
-		public void RemoveSetting( string settingName )
-		{
-			storage.RemoveSetting( settingName );
-
-			if ( Changed != null )
-				Changed( this, new SettingsEventArgs( settingName ) );
-		}
-
-		/// <summary>
-		/// Remove a group of settings
-		/// </summary>
-		/// <param name="GroupName"></param>
-		public void RemoveGroup( string groupName )
-		{
-			storage.RemoveGroup( groupName );
-		}
-
-		/// <summary>
-		/// Save the value of one of the group's settings
-		/// </summary>
-		/// <param name="settingName">Name of the setting to save</param>
-		/// <param name="settingValue">Value to be saved</param>
-		public void SaveSetting( string settingName, object settingValue )
-		{
-			object oldValue = storage.GetSetting( settingName );
-
-			// Avoid signaling "changes" when there is not really a change
-			if ( oldValue != null )
-			{
-				if( oldValue is string && settingValue is string && (string)oldValue == (string)settingValue ||
-					oldValue is int && settingValue is int && (int)oldValue == (int)settingValue ||
-					oldValue is bool && settingValue is bool && (bool)oldValue == (bool)settingValue ||
-					oldValue is Enum && settingValue is Enum && oldValue.Equals(settingValue) )
-					return;
-			}
-
-			storage.SaveSetting( settingName, settingValue );
-
-			if ( Changed != null )
-				Changed( this, new SettingsEventArgs( settingName ) );
-		}
-		#endregion
-
-		#region IDisposable Members
-		/// <summary>
-		/// Dispose of this group by disposing of it's storage implementation
-		/// </summary>
-		public void Dispose()
-		{
-			if ( storage != null )
-			{
-				storage.Dispose();
-				storage = null;
-			}
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+    using System.Drawing;
+    using System.Globalization;
+    using System.ComponentModel;
+
+	/// <summary>
+	/// SettingsGroup is the base class representing a group
+	/// of user or system settings. All storge of settings
+	/// is delegated to a SettingsStorage.
+	/// </summary>
+	public class SettingsGroup : ISettings, IDisposable
+	{
+		#region Instance Fields
+		protected ISettingsStorage storage;
+		#endregion
+
+		#region Constructors
+
+		/// <summary>
+		/// Construct a settings group.
+		/// </summary>
+		/// <param name="storage">Storage for the group settings</param>
+		public SettingsGroup( ISettingsStorage storage )
+		{
+			this.storage = storage;
+		}
+
+		/// <summary>
+		/// Protected constructor for use by derived classes that
+		/// set the storage themselves or don't use a storage.
+		/// </summary>
+		protected SettingsGroup()
+		{
+		}
+		#endregion
+
+		#region Properties
+
+		public event SettingsEventHandler Changed;
+
+		/// <summary>
+		/// The storage used for the group settings
+		/// </summary>
+		public ISettingsStorage Storage
+		{
+			get { return storage; }
+		}
+
+		#endregion
+
+		#region ISettings Members
+
+		/// <summary>
+		/// Load the value of one of the group's settings
+		/// </summary>
+		/// <param name="settingName">Name of setting to load</param>
+		/// <returns>Value of the setting or null</returns>
+		public object GetSetting( string settingName )
+		{
+			return storage.GetSetting( settingName );
+		}
+
+		/// <summary>
+		/// Load the value of one of the group's settings or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of setting to load</param>
+		/// <param name="defaultValue">Value to return if the seeting is not present</param>
+		/// <returns>Value of the setting or the default</returns>
+		public object GetSetting( string settingName, object defaultValue )
+		{
+			object result = GetSetting(settingName );
+
+			if ( result == null )
+				result = defaultValue;
+
+			return result;
+		}
+
+        /// <summary>
+        /// Load the value of one of the group's integer settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultValue">Value to return if the seeting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public int GetSetting(string settingName, int defaultValue)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultValue;
+
+            if (result is int)
+                return (int)result;
+
+            try
+            {
+                return Int32.Parse(result.ToString());
+            }
+            catch
+            {
+                return defaultValue;
+            }
+        }
+
+        /// <summary>
+        /// Load the value of one of the group's float settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public float GetSetting(string settingName, float defaultValue)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultValue;
+
+            if (result is float)
+                return (float)result;
+
+            try
+            {
+                return float.Parse(result.ToString());
+            }
+            catch
+            {
+                return defaultValue;
+            }
+        }
+
+        /// <summary>
+		/// Load the value of one of the group's boolean settings
+		/// in a type-safe manner.
+		/// </summary>
+		/// <param name="settingName">Name of setting to load</param>
+		/// <param name="defaultValue">Value of the setting or the default</param>
+		/// <returns>Value of the setting</returns>
+		public bool GetSetting( string settingName, bool defaultValue )
+		{
+			object result = GetSetting(settingName );
+
+			if ( result == null )
+				return defaultValue;
+
+			// Handle legacy formats
+//			if ( result is int )
+//				return (int)result == 1;
+//
+//			if ( result is string )
+//			{
+//				if ( (string)result == "1" ) return true;
+//				if ( (string)result == "0" ) return false;
+//			}
+
+			if ( result is bool )
+				return (bool) result ;
+			
+			try
+			{
+				return Boolean.Parse( result.ToString() );
+			}
+			catch
+			{
+				return defaultValue;
+			}
+		}
+
+		/// <summary>
+		/// Load the value of one of the group's string settings
+		/// in a type-safe manner or return a default value
+		/// </summary>
+		/// <param name="settingName">Name of setting to load</param>
+		/// <param name="defaultValue">Value to return if the setting is not present</param>
+		/// <returns>Value of the setting or the default</returns>
+		public string GetSetting( string settingName, string defaultValue )
+		{
+			object result = GetSetting(settingName );
+
+			if ( result == null )
+				return defaultValue;
+
+			if ( result is string )
+				return (string) result;
+			else
+				return result.ToString();
+		}
+
+        /// <summary>
+        /// Load the value of one of the group's enum settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultValue">Value to return if the setting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public System.Enum GetSetting(string settingName, System.Enum defaultValue)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultValue;
+
+            if (result is System.Enum)
+                return (System.Enum)result;
+
+            try
+            {
+                return (System.Enum)System.Enum.Parse(defaultValue.GetType(), result.ToString(), true);
+            }
+            catch
+            {
+                return defaultValue;
+            }
+        }
+
+        /// <summary>
+        /// Load the value of one of the group's Font settings
+        /// in a type-safe manner or return a default value
+        /// </summary>
+        /// <param name="settingName">Name of setting to load</param>
+        /// <param name="defaultFont">Value to return if the setting is not present</param>
+        /// <returns>Value of the setting or the default</returns>
+        public Font GetSetting(string settingName, Font defaultFont)
+        {
+            object result = GetSetting(settingName);
+
+            if (result == null)
+                return defaultFont;
+
+            if (result is Font)
+                return (Font)result;
+
+            try
+            {
+                TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
+                return (Font)converter.ConvertFrom(null, CultureInfo.InvariantCulture, result.ToString());
+            }
+            catch
+            {
+                return defaultFont;
+            }
+        }
+
+        /// <summary>
+		/// Remove a setting from the group
+		/// </summary>
+		/// <param name="settingName">Name of the setting to remove</param>
+		public void RemoveSetting( string settingName )
+		{
+			storage.RemoveSetting( settingName );
+
+			if ( Changed != null )
+				Changed( this, new SettingsEventArgs( settingName ) );
+		}
+
+		/// <summary>
+		/// Remove a group of settings
+		/// </summary>
+		/// <param name="GroupName"></param>
+		public void RemoveGroup( string groupName )
+		{
+			storage.RemoveGroup( groupName );
+		}
+
+		/// <summary>
+		/// Save the value of one of the group's settings
+		/// </summary>
+		/// <param name="settingName">Name of the setting to save</param>
+		/// <param name="settingValue">Value to be saved</param>
+		public void SaveSetting( string settingName, object settingValue )
+		{
+			object oldValue = storage.GetSetting( settingName );
+
+			// Avoid signaling "changes" when there is not really a change
+			if ( oldValue != null )
+			{
+				if( oldValue is string && settingValue is string && (string)oldValue == (string)settingValue ||
+					oldValue is int && settingValue is int && (int)oldValue == (int)settingValue ||
+					oldValue is bool && settingValue is bool && (bool)oldValue == (bool)settingValue ||
+					oldValue is Enum && settingValue is Enum && oldValue.Equals(settingValue) )
+					return;
+			}
+
+			storage.SaveSetting( settingName, settingValue );
+
+			if ( Changed != null )
+				Changed( this, new SettingsEventArgs( settingName ) );
+		}
+		#endregion
+
+		#region IDisposable Members
+		/// <summary>
+		/// Dispose of this group by disposing of it's storage implementation
+		/// </summary>
+		public void Dispose()
+		{
+			if ( storage != null )
+			{
+				storage.Dispose();
+				storage = null;
+			}
+		}
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/SettingsStorage.cs b/src/ClientUtilities/util/SettingsStorage.cs
index 3aabec1..30e4a1e 100644
--- a/src/ClientUtilities/util/SettingsStorage.cs
+++ b/src/ClientUtilities/util/SettingsStorage.cs
@@ -1,62 +1,62 @@
-// ****************************************************************
-// 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
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-
-	/// <summary>
-	/// The ISettingsStorage interface is implemented by all
-	/// types of backing storage for settings.
-	/// </summary>
-	public interface ISettingsStorage : IDisposable
-	{
-		/// <summary>
-		/// Load a setting from the storage.
-		/// </summary>
-		/// <param name="settingName">Name of the setting to load</param>
-		/// <returns>Value of the setting or null</returns>
-		object GetSetting( string settingName );
-
-		/// <summary>
-		/// Remove a setting from the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to remove</param>
-		void RemoveSetting( string settingName );
-
-		/// <summary>
-		/// Remove a group of settings from the storae
-		/// </summary>
-		/// <param name="groupName">Name of the group to remove</param>
-		void RemoveGroup( string groupName );
-
-		/// <summary>
-		/// Save a setting in the storage
-		/// </summary>
-		/// <param name="settingName">Name of the setting to save</param>
-		/// <param name="settingValue">Value to be saved</param>
-		void SaveSetting( string settingName, object settingValue );
-
-		/// <summary>
-		/// Create a child storage of the same type
-		/// </summary>
-		/// <param name="name">Name of the child storage</param>
-		/// <returns>New child storage</returns>
-		ISettingsStorage MakeChildStorage( string name );
-
-		/// <summary>
-		/// Load settings from external storage if required
-		/// by the implementation.
-		/// </summary>
-		void LoadSettings();
-
-		/// <summary>
-		/// Save settings to external storage if required
-		/// by the implementation.
-		/// </summary>
-		void SaveSettings();
-	}
-}
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+
+	/// <summary>
+	/// The ISettingsStorage interface is implemented by all
+	/// types of backing storage for settings.
+	/// </summary>
+	public interface ISettingsStorage : IDisposable
+	{
+		/// <summary>
+		/// Load a setting from the storage.
+		/// </summary>
+		/// <param name="settingName">Name of the setting to load</param>
+		/// <returns>Value of the setting or null</returns>
+		object GetSetting( string settingName );
+
+		/// <summary>
+		/// Remove a setting from the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to remove</param>
+		void RemoveSetting( string settingName );
+
+		/// <summary>
+		/// Remove a group of settings from the storae
+		/// </summary>
+		/// <param name="groupName">Name of the group to remove</param>
+		void RemoveGroup( string groupName );
+
+		/// <summary>
+		/// Save a setting in the storage
+		/// </summary>
+		/// <param name="settingName">Name of the setting to save</param>
+		/// <param name="settingValue">Value to be saved</param>
+		void SaveSetting( string settingName, object settingValue );
+
+		/// <summary>
+		/// Create a child storage of the same type
+		/// </summary>
+		/// <param name="name">Name of the child storage</param>
+		/// <returns>New child storage</returns>
+		ISettingsStorage MakeChildStorage( string name );
+
+		/// <summary>
+		/// Load settings from external storage if required
+		/// by the implementation.
+		/// </summary>
+		void LoadSettings();
+
+		/// <summary>
+		/// Save settings to external storage if required
+		/// by the implementation.
+		/// </summary>
+		void SaveSettings();
+	}
+}
diff --git a/src/ClientUtilities/util/StackTraceFilter.cs b/src/ClientUtilities/util/StackTraceFilter.cs
index 01a2a54..783cf76 100644
--- a/src/ClientUtilities/util/StackTraceFilter.cs
+++ b/src/ClientUtilities/util/StackTraceFilter.cs
@@ -1,63 +1,63 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.IO;
-
-	/// <summary>
-	/// Summary description for StackTraceFilter.
-	/// </summary>
-	public class StackTraceFilter
-	{
-		public static string Filter(string stack) 
-		{
-			if(stack == null) return null;
-			StringWriter sw = new StringWriter();
-			StringReader sr = new StringReader(stack);
-
-			try 
-			{
-				string line;
-				while ((line = sr.ReadLine()) != null) 
-				{
-					if (!FilterLine(line))
-						sw.WriteLine(line.Trim());
-				}
-			} 
-			catch (Exception) 
-			{
-				return stack;
-			}
-			return sw.ToString();
-		}
-
-		static bool FilterLine(string line) 
-		{
-			string[] patterns = new string[]
-			{
-				"NUnit.Core.TestCase",
-				"NUnit.Core.ExpectedExceptionTestCase",
-				"NUnit.Core.TemplateTestCase",
-				"NUnit.Core.TestResult",
-				"NUnit.Core.TestSuite",
-				"NUnit.Framework.Assertion", 
-				"NUnit.Framework.Assert",
-                "System.Reflection.MonoMethod"
-			};
-
-			for (int i = 0; i < patterns.Length; i++) 
-			{
-				if (line.IndexOf(patterns[i]) > 0)
-					return true;
-			}
-
-			return false;
-		}
-
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.IO;
+
+	/// <summary>
+	/// Summary description for StackTraceFilter.
+	/// </summary>
+	public class StackTraceFilter
+	{
+		public static string Filter(string stack) 
+		{
+			if(stack == null) return null;
+			StringWriter sw = new StringWriter();
+			StringReader sr = new StringReader(stack);
+
+			try 
+			{
+				string line;
+				while ((line = sr.ReadLine()) != null) 
+				{
+					if (!FilterLine(line))
+						sw.WriteLine(line.Trim());
+				}
+			} 
+			catch (Exception) 
+			{
+				return stack;
+			}
+			return sw.ToString();
+		}
+
+		static bool FilterLine(string line) 
+		{
+			string[] patterns = new string[]
+			{
+				"NUnit.Core.TestCase",
+				"NUnit.Core.ExpectedExceptionTestCase",
+				"NUnit.Core.TemplateTestCase",
+				"NUnit.Core.TestResult",
+				"NUnit.Core.TestSuite",
+				"NUnit.Framework.Assertion", 
+				"NUnit.Framework.Assert",
+                "System.Reflection.MonoMethod"
+			};
+
+			for (int i = 0; i < patterns.Length; i++) 
+			{
+				if (line.IndexOf(patterns[i]) > 0)
+					return true;
+			}
+
+			return false;
+		}
+
+	}
+}
diff --git a/src/ClientUtilities/util/TestDomain.cs b/src/ClientUtilities/util/TestDomain.cs
index 6915b42..6b8511f 100644
--- a/src/ClientUtilities/util/TestDomain.cs
+++ b/src/ClientUtilities/util/TestDomain.cs
@@ -1,130 +1,130 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	using System.Diagnostics;
-	using System.Security.Policy;
-	using System.Reflection;
-	using System.Collections;
-	using System.Configuration;
-	using System.IO;
-
-	using NUnit.Core;
-
-	public class TestDomain : ProxyTestRunner, TestRunner
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(TestDomain));
-
-		#region Instance Variables
-
-		/// <summary>
-		/// The appdomain used  to load tests
-		/// </summary>
-		private AppDomain domain; 
-
-		/// <summary>
-		/// The TestAgent in the domain
-		/// </summary>
-		private DomainAgent agent;
-
-		#endregion
-
-		#region Constructors
-		public TestDomain() : base( 0 ) { }
-
-		public TestDomain( int runnerID ) : base( runnerID ) { }
-		#endregion
-
-		#region Properties
-		public AppDomain AppDomain
-		{
-			get { return domain; }
-		}
-		#endregion
-
-		#region Loading and Unloading Tests
-		public override bool Load( TestPackage package )
-		{
-			Unload();
-
-            log.Info("Loading " + package.Name);
-			try
-			{
-				if ( this.domain == null )
-					this.domain = Services.DomainManager.CreateDomain( package );
-
-                if (this.agent == null)
-                {
-                    this.agent = DomainAgent.CreateInstance(domain);
-                    this.agent.Start();
-                }
-            
-				if ( this.TestRunner == null )
-					this.TestRunner = this.agent.CreateRunner( this.ID );
-
-                log.Info(
-                    "Loading tests in AppDomain, see {0}_{1}.log", 
-                    domain.FriendlyName, 
-                    Process.GetCurrentProcess().Id);
-
-				return TestRunner.Load( package );
-			}
-			catch
-			{
-                log.Error("Load failure");
-				Unload();
-				throw;
-			}
-		}
-
-		public override void Unload()
-		{
-            if (this.TestRunner != null)
-            {
-                log.Info("Unloading");
-                this.TestRunner.Unload();
-                this.TestRunner = null;
-            }
-
-            if (this.agent != null)
-            {
-                log.Info("Stopping DomainAgent");
-                this.agent.Dispose();
-                this.agent = null;
-            }
-
-			if(domain != null) 
-			{
-                log.Info("Unloading AppDomain " + domain.FriendlyName);
-				Services.DomainManager.Unload(domain);
-				domain = null;
-			}
-		}
-		#endregion
-
-        #region Running Tests
-        public override void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
-        {
-            log.Info("BeginRun in AppDomain {0}", domain.FriendlyName);
-            base.BeginRun(listener, filter, tracing, logLevel);
-        }
-        #endregion
-
-        #region IDisposable Members
-
-        public override void Dispose()
-        {
-            base.Dispose();
-
-            Unload();
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	using System.Diagnostics;
+	using System.Security.Policy;
+	using System.Reflection;
+	using System.Collections;
+	using System.Configuration;
+	using System.IO;
+
+	using NUnit.Core;
+
+	public class TestDomain : ProxyTestRunner, TestRunner
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestDomain));
+
+		#region Instance Variables
+
+		/// <summary>
+		/// The appdomain used  to load tests
+		/// </summary>
+		private AppDomain domain; 
+
+		/// <summary>
+		/// The TestAgent in the domain
+		/// </summary>
+		private DomainAgent agent;
+
+		#endregion
+
+		#region Constructors
+		public TestDomain() : base( 0 ) { }
+
+		public TestDomain( int runnerID ) : base( runnerID ) { }
+		#endregion
+
+		#region Properties
+		public AppDomain AppDomain
+		{
+			get { return domain; }
+		}
+		#endregion
+
+		#region Loading and Unloading Tests
+		public override bool Load( TestPackage package )
+		{
+			Unload();
+
+            log.Info("Loading " + package.Name);
+			try
+			{
+				if ( this.domain == null )
+					this.domain = Services.DomainManager.CreateDomain( package );
+
+                if (this.agent == null)
+                {
+                    this.agent = DomainAgent.CreateInstance(domain);
+                    this.agent.Start();
+                }
+            
+				if ( this.TestRunner == null )
+					this.TestRunner = this.agent.CreateRunner( this.ID );
+
+                log.Info(
+                    "Loading tests in AppDomain, see {0}_{1}.log", 
+                    domain.FriendlyName, 
+                    Process.GetCurrentProcess().Id);
+
+				return TestRunner.Load( package );
+			}
+			catch
+			{
+                log.Error("Load failure");
+				Unload();
+				throw;
+			}
+		}
+
+		public override void Unload()
+		{
+            if (this.TestRunner != null)
+            {
+                log.Info("Unloading");
+                this.TestRunner.Unload();
+                this.TestRunner = null;
+            }
+
+            if (this.agent != null)
+            {
+                log.Info("Stopping DomainAgent");
+                this.agent.Dispose();
+                this.agent = null;
+            }
+
+			if(domain != null) 
+			{
+                log.Info("Unloading AppDomain " + domain.FriendlyName);
+				Services.DomainManager.Unload(domain);
+				domain = null;
+			}
+		}
+		#endregion
+
+        #region Running Tests
+        public override void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            log.Info("BeginRun in AppDomain {0}", domain.FriendlyName);
+            base.BeginRun(listener, filter, tracing, logLevel);
+        }
+        #endregion
+
+        #region IDisposable Members
+
+        public override void Dispose()
+        {
+            base.Dispose();
+
+            Unload();
+        }
+
+        #endregion
+    }
+}
diff --git a/src/ClientUtilities/util/TestEventArgs.cs b/src/ClientUtilities/util/TestEventArgs.cs
index c867912..0c3098e 100644
--- a/src/ClientUtilities/util/TestEventArgs.cs
+++ b/src/ClientUtilities/util/TestEventArgs.cs
@@ -1,234 +1,234 @@
-// ****************************************************************
-// Copyright 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.Diagnostics;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	#region TestEventHandler delegate
-
-	/// <summary>
-	/// The delegates for all events related to running tests
-	/// </summary>
-	public delegate void TestEventHandler ( object sender, TestEventArgs args );
-
-	#endregion
-
-	#region TestAction enumeration
-
-	/// <summary>
-	/// Enumeration used to distiguish test events
-	/// </summary>
-	public enum TestAction
-	{
-		// Project Load Events
-		ProjectLoading,
-		ProjectLoaded,
-		ProjectLoadFailed,
-		ProjectUnloading,
-		ProjectUnloaded,
-		ProjectUnloadFailed,
-		// Test Load Events
-		TestLoading,
-		TestLoaded,
-		TestLoadFailed,
-		TestReloading,
-		TestReloaded,
-		TestReloadFailed,
-		TestUnloading,
-		TestUnloaded,
-		TestUnloadFailed,
-		// Test Run Events
-		RunStarting,
-		RunFinished,
-		SuiteStarting,
-		SuiteFinished,
-		TestStarting,
-		TestFinished,
-		TestException,
-		TestOutput
-}
-
-	#endregion
-
-	/// <summary>
-	/// Argument used for all test events
-	/// </summary>
-	public class TestEventArgs : EventArgs
-	{
-		#region Instance Variables
-
-		// The action represented by the event
-		private TestAction action;
-
-		// The name of the test or other item
-		private string name;
-		
-		// The name of the test we are running
-		private ITest test;
-
-		private TestName testName;
-
-		// The results from our tests
-		private TestResult testResult;
-		
-		// The exception causing a failure
-		private Exception exception;
-
-		// The test output
-		private TestOutput testOutput;
-
-		// The number of tests we are running
-		private int testCount;
-
-		#endregion
-
-		#region Constructors
-
-		// TestLoaded, TestReloaded
-		public TestEventArgs( TestAction action, 
-			string name, ITest test )
-		{
-			Debug.Assert( 
-				action == TestAction.TestLoaded || action == TestAction.TestReloaded,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.name = name;
-			this.test = test;
-			if ( test != null )
-				this.testCount = test.TestCount;
-		}
-
-		// ProjectLoading, ProjectLoaded, ProjectUnloading, ProjectUnloaded,
-		// TestLoading, TestUnloading, TestUnloaded, TestReloading
-		public TestEventArgs( TestAction action, string name )
-		{
-			Debug.Assert( 
-				action == TestAction.ProjectLoading || action == TestAction.ProjectLoaded ||
-				action == TestAction.ProjectUnloading || action == TestAction.ProjectUnloaded ||
-				action == TestAction.TestLoading || action == TestAction.TestUnloading ||
-				action == TestAction.TestUnloaded || action == TestAction.TestReloading,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.name = name;
-		}
-
-		public TestEventArgs( TestAction action, string name, int testCount )
-		{
-			Debug.Assert( action == TestAction.RunStarting,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.name = name;
-			this.testCount = testCount;
-		}
-
-		// ProjectLoadFailed, ProjectUnloadFailed, TestLoadFailed, TestUnloadFailed, TestReloadFailed, TestException
-		public TestEventArgs( TestAction action,
-			string name, Exception exception )
-		{
-			Debug.Assert(
-				action == TestAction.ProjectLoadFailed || action == TestAction.ProjectUnloadFailed ||
-				action == TestAction.TestLoadFailed || action == TestAction.TestUnloadFailed ||
-				action == TestAction.TestReloadFailed || action == TestAction.TestException, 
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.name = name;
-			this.exception = exception;
-		}
-
-		// TestStarting, SuiteStarting
-		public TestEventArgs( TestAction action, TestName testName )
-		{
-			Debug.Assert( action == TestAction.TestStarting || action == TestAction.SuiteStarting,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.testName = testName;
-		}
-
-		// TestFinished, SuiteFinished, RunFinished
-		public TestEventArgs( TestAction action, TestResult testResult )
-		{
-			Debug.Assert( action == TestAction.TestFinished || action == TestAction.SuiteFinished ||
-				action == TestAction.RunFinished,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.testResult = testResult;
-		}
-
-		// RunFinished
-		public TestEventArgs( TestAction action, Exception exception )
-		{
-			Debug.Assert( action == TestAction.RunFinished,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.exception = exception;
-		}
-
-		// TestOutput
-		public TestEventArgs( TestAction action, TestOutput testOutput )
-		{
-			Debug.Assert( action == TestAction.TestOutput,
-				"Invalid TestAction argument to TestEventArgs constructor" );
-
-			this.action = action;
-			this.testOutput = testOutput;
-		}
-		#endregion
-
-		#region Properties
-
-		public TestAction Action
-		{
-			get { return action; }
-		}
-
-		public string Name
-		{
-			get { return name; }
-		}
-
-		public ITest Test
-		{
-			get { return test; }
-		}
-
-		public TestName TestName
-		{
-			get { return testName; }
-		}
-
-		public int TestCount 
-		{
-			get	{ return testCount;	}
-		}
-
-		public TestResult Result
-		{
-			get { return testResult; }
-		}
-
-		public Exception Exception
-		{
-			get { return exception; }
-		}
-
-		public TestOutput TestOutput
-		{
-			get { return testOutput; }
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Diagnostics;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	#region TestEventHandler delegate
+
+	/// <summary>
+	/// The delegates for all events related to running tests
+	/// </summary>
+	public delegate void TestEventHandler ( object sender, TestEventArgs args );
+
+	#endregion
+
+	#region TestAction enumeration
+
+	/// <summary>
+	/// Enumeration used to distiguish test events
+	/// </summary>
+	public enum TestAction
+	{
+		// Project Load Events
+		ProjectLoading,
+		ProjectLoaded,
+		ProjectLoadFailed,
+		ProjectUnloading,
+		ProjectUnloaded,
+		ProjectUnloadFailed,
+		// Test Load Events
+		TestLoading,
+		TestLoaded,
+		TestLoadFailed,
+		TestReloading,
+		TestReloaded,
+		TestReloadFailed,
+		TestUnloading,
+		TestUnloaded,
+		TestUnloadFailed,
+		// Test Run Events
+		RunStarting,
+		RunFinished,
+		SuiteStarting,
+		SuiteFinished,
+		TestStarting,
+		TestFinished,
+		TestException,
+		TestOutput
+}
+
+	#endregion
+
+	/// <summary>
+	/// Argument used for all test events
+	/// </summary>
+	public class TestEventArgs : EventArgs
+	{
+		#region Instance Variables
+
+		// The action represented by the event
+		private TestAction action;
+
+		// The name of the test or other item
+		private string name;
+		
+		// The name of the test we are running
+		private ITest test;
+
+		private TestName testName;
+
+		// The results from our tests
+		private TestResult testResult;
+		
+		// The exception causing a failure
+		private Exception exception;
+
+		// The test output
+		private TestOutput testOutput;
+
+		// The number of tests we are running
+		private int testCount;
+
+		#endregion
+
+		#region Constructors
+
+		// TestLoaded, TestReloaded
+		public TestEventArgs( TestAction action, 
+			string name, ITest test )
+		{
+			Debug.Assert( 
+				action == TestAction.TestLoaded || action == TestAction.TestReloaded,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.name = name;
+			this.test = test;
+			if ( test != null )
+				this.testCount = test.TestCount;
+		}
+
+		// ProjectLoading, ProjectLoaded, ProjectUnloading, ProjectUnloaded,
+		// TestLoading, TestUnloading, TestUnloaded, TestReloading
+		public TestEventArgs( TestAction action, string name )
+		{
+			Debug.Assert( 
+				action == TestAction.ProjectLoading || action == TestAction.ProjectLoaded ||
+				action == TestAction.ProjectUnloading || action == TestAction.ProjectUnloaded ||
+				action == TestAction.TestLoading || action == TestAction.TestUnloading ||
+				action == TestAction.TestUnloaded || action == TestAction.TestReloading,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.name = name;
+		}
+
+		public TestEventArgs( TestAction action, string name, int testCount )
+		{
+			Debug.Assert( action == TestAction.RunStarting,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.name = name;
+			this.testCount = testCount;
+		}
+
+		// ProjectLoadFailed, ProjectUnloadFailed, TestLoadFailed, TestUnloadFailed, TestReloadFailed, TestException
+		public TestEventArgs( TestAction action,
+			string name, Exception exception )
+		{
+			Debug.Assert(
+				action == TestAction.ProjectLoadFailed || action == TestAction.ProjectUnloadFailed ||
+				action == TestAction.TestLoadFailed || action == TestAction.TestUnloadFailed ||
+				action == TestAction.TestReloadFailed || action == TestAction.TestException, 
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.name = name;
+			this.exception = exception;
+		}
+
+		// TestStarting, SuiteStarting
+		public TestEventArgs( TestAction action, TestName testName )
+		{
+			Debug.Assert( action == TestAction.TestStarting || action == TestAction.SuiteStarting,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.testName = testName;
+		}
+
+		// TestFinished, SuiteFinished, RunFinished
+		public TestEventArgs( TestAction action, TestResult testResult )
+		{
+			Debug.Assert( action == TestAction.TestFinished || action == TestAction.SuiteFinished ||
+				action == TestAction.RunFinished,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.testResult = testResult;
+		}
+
+		// RunFinished
+		public TestEventArgs( TestAction action, Exception exception )
+		{
+			Debug.Assert( action == TestAction.RunFinished,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.exception = exception;
+		}
+
+		// TestOutput
+		public TestEventArgs( TestAction action, TestOutput testOutput )
+		{
+			Debug.Assert( action == TestAction.TestOutput,
+				"Invalid TestAction argument to TestEventArgs constructor" );
+
+			this.action = action;
+			this.testOutput = testOutput;
+		}
+		#endregion
+
+		#region Properties
+
+		public TestAction Action
+		{
+			get { return action; }
+		}
+
+		public string Name
+		{
+			get { return name; }
+		}
+
+		public ITest Test
+		{
+			get { return test; }
+		}
+
+		public TestName TestName
+		{
+			get { return testName; }
+		}
+
+		public int TestCount 
+		{
+			get	{ return testCount;	}
+		}
+
+		public TestResult Result
+		{
+			get { return testResult; }
+		}
+
+		public Exception Exception
+		{
+			get { return exception; }
+		}
+
+		public TestOutput TestOutput
+		{
+			get { return testOutput; }
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/TestEventDispatcher.cs b/src/ClientUtilities/util/TestEventDispatcher.cs
index 92b6cbb..d2d99c4 100644
--- a/src/ClientUtilities/util/TestEventDispatcher.cs
+++ b/src/ClientUtilities/util/TestEventDispatcher.cs
@@ -1,234 +1,234 @@
-// ****************************************************************
-// 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 NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Helper class used to dispatch test events
-	/// </summary>
-	public class TestEventDispatcher : ITestEvents
-	{
-		#region Events
-
-		// Project loading events
-		public event TestEventHandler ProjectLoading;
-		public event TestEventHandler ProjectLoaded;
-		public event TestEventHandler ProjectLoadFailed;
-		public event TestEventHandler ProjectUnloading;
-		public event TestEventHandler ProjectUnloaded;
-		public event TestEventHandler ProjectUnloadFailed;
-
-		// Test loading events
-		public event TestEventHandler TestLoading;	
-		public event TestEventHandler TestLoaded;	
-		public event TestEventHandler TestLoadFailed;
-
-		public event TestEventHandler TestReloading;
-		public event TestEventHandler TestReloaded;
-		public event TestEventHandler TestReloadFailed;
-
-		public event TestEventHandler TestUnloading;
-		public event TestEventHandler TestUnloaded;
-		public event TestEventHandler TestUnloadFailed;
-
-		// Test running events
-		public event TestEventHandler RunStarting;	
-		public event TestEventHandler RunFinished;
-		
-		public event TestEventHandler SuiteStarting;
-		public event TestEventHandler SuiteFinished;
-
-		public event TestEventHandler TestStarting;
-		public event TestEventHandler TestFinished;
-
-		public event TestEventHandler TestException;
-		public event TestEventHandler TestOutput;
-
-		#endregion
-
-		#region Methods for Firing Events
-		
-		protected virtual void Fire( TestEventHandler handler, TestEventArgs e )
-		{
-			if ( handler != null )
-				handler( this, e );
-		}
-
-		public void FireProjectLoading( string fileName )
-		{
-			Fire(
-				ProjectLoading,
-				new TestEventArgs( TestAction.ProjectLoading, fileName ) );
-		}
-
-		public void FireProjectLoaded( string fileName )
-		{
-			Fire( 
-				ProjectLoaded,
-				new TestEventArgs( TestAction.ProjectLoaded, fileName ) );
-		}
-
-		public void FireProjectLoadFailed( string fileName, Exception exception )
-		{
-			Fire( 
-				ProjectLoadFailed,
-				new TestEventArgs( TestAction.ProjectLoadFailed, fileName, exception ) );
-		}
-
-		public void FireProjectUnloading( string fileName )
-		{
-			Fire( 
-				ProjectUnloading,
-				new TestEventArgs( TestAction.ProjectUnloading, fileName ) );
-		}
-
-		public void FireProjectUnloaded( string fileName )
-		{
-			Fire( 
-				ProjectUnloaded,
-				new TestEventArgs( TestAction.ProjectUnloaded, fileName ) );
-		}
-
-		public void FireProjectUnloadFailed( string fileName, Exception exception )
-		{
-			Fire( 
-				ProjectUnloadFailed,
-				new TestEventArgs( TestAction.ProjectUnloadFailed, fileName, exception ) );
-		}
-
-		public void FireTestLoading( string fileName )
-		{
-			Fire( 
-				TestLoading,
-				new TestEventArgs( TestAction.TestLoading, fileName ) );
-		}
-
-		public void FireTestLoaded( string fileName, ITest test )
-		{
-			Fire( 
-				TestLoaded,
-				new TestEventArgs( TestAction.TestLoaded, fileName, test ) );
-		}
-
-		public void FireTestLoadFailed( string fileName, Exception exception )
-		{
-			Fire(
-				TestLoadFailed,
-				new TestEventArgs( TestAction.TestLoadFailed, fileName, exception ) );
-		}
-
-		public void FireTestUnloading( string fileName )
-		{
-			Fire(
-				TestUnloading,
-				new TestEventArgs( TestAction.TestUnloading, fileName ) );
-		}
-
-		public void FireTestUnloaded( string fileName )
-		{
-			Fire(
-				TestUnloaded,
-				new TestEventArgs( TestAction.TestUnloaded, fileName ) );
-		}
-
-		public void FireTestUnloadFailed( string fileName, Exception exception )
-		{
-			Fire(
-				TestUnloadFailed, 
-				new TestEventArgs( TestAction.TestUnloadFailed, fileName, exception ) );
-		}
-
-		public void FireTestReloading( string fileName )
-		{
-			Fire(
-				TestReloading,
-				new TestEventArgs( TestAction.TestReloading, fileName ) );
-		}
-
-		public void FireTestReloaded( string fileName, ITest test )
-		{
-			Fire(
-				TestReloaded,
-				new TestEventArgs( TestAction.TestReloaded, fileName, test ) );
-		}
-
-		public void FireTestReloadFailed( string fileName, Exception exception )
-		{
-			Fire(
-				TestReloadFailed, 
-				new TestEventArgs( TestAction.TestReloadFailed, fileName, exception ) );
-		}
-
-		public void FireRunStarting( string name, int testCount )
-		{
-			Fire(
-				RunStarting,
-				new TestEventArgs( TestAction.RunStarting, name, testCount ) );
-		}
-
-		public void FireRunFinished( TestResult result )
-		{	
-			Fire(
-				RunFinished,
-				new TestEventArgs( TestAction.RunFinished, result ) );
-		}
-
-		public void FireRunFinished( Exception exception )
-		{
-			Fire(
-				RunFinished,
-				new TestEventArgs( TestAction.RunFinished, exception ) );
-		}
-
-		public void FireTestStarting( TestName testName )
-		{
-			Fire(
-				TestStarting,
-				new TestEventArgs( TestAction.TestStarting, testName ) );
-		}
-
-		public void FireTestFinished( TestResult result )
-		{	
-			Fire(
-				TestFinished,
-				new TestEventArgs( TestAction.TestFinished, result ) );
-		}
-
-		public void FireSuiteStarting( TestName testName )
-		{
-			Fire(
-				SuiteStarting,
-				new TestEventArgs( TestAction.SuiteStarting, testName ) );
-		}
-
-		public void FireSuiteFinished( TestResult result )
-		{	
-			Fire(
-				SuiteFinished,
-				new TestEventArgs( TestAction.SuiteFinished, result ) );
-		}
-
-		public void FireTestException( string name, Exception exception )
-		{
-			Fire(
-				TestException,
-				new TestEventArgs( TestAction.TestException, name, exception ) );
-		}
-
-		public void FireTestOutput( TestOutput testOutput )
-		{
-			Fire(
-				TestOutput,
-				new TestEventArgs( TestAction.TestOutput, testOutput ) );
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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 NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Helper class used to dispatch test events
+	/// </summary>
+	public class TestEventDispatcher : ITestEvents
+	{
+		#region Events
+
+		// Project loading events
+		public event TestEventHandler ProjectLoading;
+		public event TestEventHandler ProjectLoaded;
+		public event TestEventHandler ProjectLoadFailed;
+		public event TestEventHandler ProjectUnloading;
+		public event TestEventHandler ProjectUnloaded;
+		public event TestEventHandler ProjectUnloadFailed;
+
+		// Test loading events
+		public event TestEventHandler TestLoading;	
+		public event TestEventHandler TestLoaded;	
+		public event TestEventHandler TestLoadFailed;
+
+		public event TestEventHandler TestReloading;
+		public event TestEventHandler TestReloaded;
+		public event TestEventHandler TestReloadFailed;
+
+		public event TestEventHandler TestUnloading;
+		public event TestEventHandler TestUnloaded;
+		public event TestEventHandler TestUnloadFailed;
+
+		// Test running events
+		public event TestEventHandler RunStarting;	
+		public event TestEventHandler RunFinished;
+		
+		public event TestEventHandler SuiteStarting;
+		public event TestEventHandler SuiteFinished;
+
+		public event TestEventHandler TestStarting;
+		public event TestEventHandler TestFinished;
+
+		public event TestEventHandler TestException;
+		public event TestEventHandler TestOutput;
+
+		#endregion
+
+		#region Methods for Firing Events
+		
+		protected virtual void Fire( TestEventHandler handler, TestEventArgs e )
+		{
+			if ( handler != null )
+				handler( this, e );
+		}
+
+		public void FireProjectLoading( string fileName )
+		{
+			Fire(
+				ProjectLoading,
+				new TestEventArgs( TestAction.ProjectLoading, fileName ) );
+		}
+
+		public void FireProjectLoaded( string fileName )
+		{
+			Fire( 
+				ProjectLoaded,
+				new TestEventArgs( TestAction.ProjectLoaded, fileName ) );
+		}
+
+		public void FireProjectLoadFailed( string fileName, Exception exception )
+		{
+			Fire( 
+				ProjectLoadFailed,
+				new TestEventArgs( TestAction.ProjectLoadFailed, fileName, exception ) );
+		}
+
+		public void FireProjectUnloading( string fileName )
+		{
+			Fire( 
+				ProjectUnloading,
+				new TestEventArgs( TestAction.ProjectUnloading, fileName ) );
+		}
+
+		public void FireProjectUnloaded( string fileName )
+		{
+			Fire( 
+				ProjectUnloaded,
+				new TestEventArgs( TestAction.ProjectUnloaded, fileName ) );
+		}
+
+		public void FireProjectUnloadFailed( string fileName, Exception exception )
+		{
+			Fire( 
+				ProjectUnloadFailed,
+				new TestEventArgs( TestAction.ProjectUnloadFailed, fileName, exception ) );
+		}
+
+		public void FireTestLoading( string fileName )
+		{
+			Fire( 
+				TestLoading,
+				new TestEventArgs( TestAction.TestLoading, fileName ) );
+		}
+
+		public void FireTestLoaded( string fileName, ITest test )
+		{
+			Fire( 
+				TestLoaded,
+				new TestEventArgs( TestAction.TestLoaded, fileName, test ) );
+		}
+
+		public void FireTestLoadFailed( string fileName, Exception exception )
+		{
+			Fire(
+				TestLoadFailed,
+				new TestEventArgs( TestAction.TestLoadFailed, fileName, exception ) );
+		}
+
+		public void FireTestUnloading( string fileName )
+		{
+			Fire(
+				TestUnloading,
+				new TestEventArgs( TestAction.TestUnloading, fileName ) );
+		}
+
+		public void FireTestUnloaded( string fileName )
+		{
+			Fire(
+				TestUnloaded,
+				new TestEventArgs( TestAction.TestUnloaded, fileName ) );
+		}
+
+		public void FireTestUnloadFailed( string fileName, Exception exception )
+		{
+			Fire(
+				TestUnloadFailed, 
+				new TestEventArgs( TestAction.TestUnloadFailed, fileName, exception ) );
+		}
+
+		public void FireTestReloading( string fileName )
+		{
+			Fire(
+				TestReloading,
+				new TestEventArgs( TestAction.TestReloading, fileName ) );
+		}
+
+		public void FireTestReloaded( string fileName, ITest test )
+		{
+			Fire(
+				TestReloaded,
+				new TestEventArgs( TestAction.TestReloaded, fileName, test ) );
+		}
+
+		public void FireTestReloadFailed( string fileName, Exception exception )
+		{
+			Fire(
+				TestReloadFailed, 
+				new TestEventArgs( TestAction.TestReloadFailed, fileName, exception ) );
+		}
+
+		public void FireRunStarting( string name, int testCount )
+		{
+			Fire(
+				RunStarting,
+				new TestEventArgs( TestAction.RunStarting, name, testCount ) );
+		}
+
+		public void FireRunFinished( TestResult result )
+		{	
+			Fire(
+				RunFinished,
+				new TestEventArgs( TestAction.RunFinished, result ) );
+		}
+
+		public void FireRunFinished( Exception exception )
+		{
+			Fire(
+				RunFinished,
+				new TestEventArgs( TestAction.RunFinished, exception ) );
+		}
+
+		public void FireTestStarting( TestName testName )
+		{
+			Fire(
+				TestStarting,
+				new TestEventArgs( TestAction.TestStarting, testName ) );
+		}
+
+		public void FireTestFinished( TestResult result )
+		{	
+			Fire(
+				TestFinished,
+				new TestEventArgs( TestAction.TestFinished, result ) );
+		}
+
+		public void FireSuiteStarting( TestName testName )
+		{
+			Fire(
+				SuiteStarting,
+				new TestEventArgs( TestAction.SuiteStarting, testName ) );
+		}
+
+		public void FireSuiteFinished( TestResult result )
+		{	
+			Fire(
+				SuiteFinished,
+				new TestEventArgs( TestAction.SuiteFinished, result ) );
+		}
+
+		public void FireTestException( string name, Exception exception )
+		{
+			Fire(
+				TestException,
+				new TestEventArgs( TestAction.TestException, name, exception ) );
+		}
+
+		public void FireTestOutput( TestOutput testOutput )
+		{
+			Fire(
+				TestOutput,
+				new TestEventArgs( TestAction.TestOutput, testOutput ) );
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/TestExceptionHandler.cs b/src/ClientUtilities/util/TestExceptionHandler.cs
index 3c731a6..c86b18f 100644
--- a/src/ClientUtilities/util/TestExceptionHandler.cs
+++ b/src/ClientUtilities/util/TestExceptionHandler.cs
@@ -1,46 +1,46 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for UnhandledExceptionCatcher.
-	/// </summary>
-	public class TestExceptionHandler : IDisposable
-	{
-		private UnhandledExceptionEventHandler handler;
-
-		public TestExceptionHandler( UnhandledExceptionEventHandler handler )
-		{
-			this.handler = handler;
-			AppDomain.CurrentDomain.UnhandledException += handler;
-		}
-
-		~TestExceptionHandler()
-		{
-			if ( handler != null )
-			{
-				AppDomain.CurrentDomain.UnhandledException -= handler;
-				handler = null;
-			}
-		}
-
-
-
-		public void Dispose()
-		{
-			if ( handler != null )
-			{
-				AppDomain.CurrentDomain.UnhandledException -= handler;
-				handler = null;
-			}
-
-			System.GC.SuppressFinalize( this );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for UnhandledExceptionCatcher.
+	/// </summary>
+	public class TestExceptionHandler : IDisposable
+	{
+		private UnhandledExceptionEventHandler handler;
+
+		public TestExceptionHandler( UnhandledExceptionEventHandler handler )
+		{
+			this.handler = handler;
+			AppDomain.CurrentDomain.UnhandledException += handler;
+		}
+
+		~TestExceptionHandler()
+		{
+			if ( handler != null )
+			{
+				AppDomain.CurrentDomain.UnhandledException -= handler;
+				handler = null;
+			}
+		}
+
+
+
+		public void Dispose()
+		{
+			if ( handler != null )
+			{
+				AppDomain.CurrentDomain.UnhandledException -= handler;
+				handler = null;
+			}
+
+			System.GC.SuppressFinalize( this );
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/TestLabelLevel.cs b/src/ClientUtilities/util/TestLabelLevel.cs
index 4b4627a..9cc58f2 100644
--- a/src/ClientUtilities/util/TestLabelLevel.cs
+++ b/src/ClientUtilities/util/TestLabelLevel.cs
@@ -1,15 +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,
-    }
-}
+// ****************************************************************
+// 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 5121078..6631fa6 100644
--- a/src/ClientUtilities/util/TestLoader.cs
+++ b/src/ClientUtilities/util/TestLoader.cs
@@ -1,821 +1,821 @@
-// ****************************************************************
-// 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
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.IO;
-	using System.Collections;
-	using System.Diagnostics;
-	using System.Threading;
-	using System.Configuration;
-	using NUnit.Core;
-	using NUnit.Core.Filters;
-
-	/// <summary>
-	/// TestLoader handles interactions between a test runner and a 
-	/// client program - typically the user interface - for the 
-	/// purpose of loading, unloading and running tests.
-	/// 
-	/// It implemements the EventListener interface which is used by 
-	/// the test runner and repackages those events, along with
-	/// others as individual events that clients may subscribe to
-	/// in collaboration with a TestEventDispatcher helper object.
-	/// 
-	/// TestLoader is quite handy for use with a gui client because
-	/// of the large number of events it supports. However, it has
-	/// no dependencies on ui components and can be used independently.
-	/// </summary>
-	public class TestLoader : MarshalByRefObject, NUnit.Core.EventListener, ITestLoader, IService
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(TestLoader));
-
-		#region Instance Variables
-
-		/// <summary>
-		/// Our event dispatching helper object
-		/// </summary>
-		private TestEventDispatcher events;
-
-        /// <summary>
-        /// Our TestRunnerFactory
-        /// </summary>
-        private ITestRunnerFactory factory;
-
-		/// <summary>
-		/// Loads and executes tests. Non-null when
-		/// we have loaded a test.
-		/// </summary>
-		private TestRunner testRunner = null;
-
-		/// <summary>
-		/// Our current test project, if we have one.
-		/// </summary>
-		private NUnitProject testProject = null;
-
-		/// <summary>
-		/// The currently loaded test, returned by the testrunner
-		/// </summary>
-        //private ITest loadedTest = null;
-
-		/// <summary>
-		/// The test name that was specified when loading
-		/// </summary>
-		private string loadedTestName = null;
-
-		/// <summary>
-		/// The currently executing test
-		/// </summary>
-		private string currentTestName;
-
-        /// <summary>
-        /// The currently set runtime framework
-        /// </summary>
-        private RuntimeFramework currentRuntime;
-
-		/// <summary>
-		/// Result of the last test run
-		/// </summary>
-		private TestResult testResult = null;
-
-		/// <summary>
-		/// The last exception received when trying to load, unload or run a test
-		/// </summary>
-		private Exception lastException = null;
-
-		/// <summary>
-		/// Watcher fires when the assembly changes
-		/// </summary>
-		private IAssemblyWatcher watcher;
-
-		/// <summary>
-		/// Assembly changed during a test and
-		/// needs to be reloaded later
-		/// </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
-		/// </summary>
-		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.
-        /// </summary>
-        private RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
-
-		#endregion
-
-		#region Constructors
-
-		public TestLoader()
-			: this( new TestEventDispatcher() ) { }
-
-		public TestLoader(TestEventDispatcher eventDispatcher)
-			: this(eventDispatcher, new AssemblyWatcher()) { }
-
-		public TestLoader(IAssemblyWatcher assemblyWatcher)
-			: this(new TestEventDispatcher(), assemblyWatcher) { }
-
-		public TestLoader(TestEventDispatcher eventDispatcher, IAssemblyWatcher assemblyWatcher)
-		{
-			this.events = eventDispatcher;
-			this.watcher = assemblyWatcher;
-			this.factory = new DefaultTestRunnerFactory();
-			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
-		}
-
-		#endregion
-
-		#region Properties
-		public bool IsProjectLoaded
-		{
-			get { return testProject != null; }
-		}
-
-		public bool IsTestLoaded
-		{
-			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; }
-		}
-
-		public NUnitProject TestProject
-		{
-			get { return testProject; }
-		}
-
-		public ITestEvents Events
-		{
-			get { return events; }
-		}
-
-		public string TestFileName
-		{
-			get { return testProject.ProjectPath; }
-		}
-
-		public TestResult TestResult
-		{
-			get { return testResult; }
-		}
-
-		public Exception LastException
-		{
-			get { return lastException; }
-		}
-
-		public IList AssemblyInfo
-		{
-			get { return testRunner == null ? new TestAssemblyInfo[0] : testRunner.AssemblyInfo; }
-		}
-
-		public int 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
-
-		public void RunStarted(string name, int testCount)
-		{
-            log.Debug("Got RunStarted Event");
-			events.FireRunStarting( name, testCount );
-		}
-
-		public void RunFinished(NUnit.Core.TestResult testResult)
-		{
-			this.testResult = testResult;
-
-            events.FireRunFinished(testResult);
-		}
-
-		public void RunFinished(Exception exception)
-		{
-			this.lastException = exception;
-			events.FireRunFinished( exception );
-		}
-
-		/// <summary>
-		/// Trigger event when each test starts
-		/// </summary>
-		/// <param name="testName">TestName of the Test that is starting</param>
-		public void TestStarted(TestName testName)
-		{
-			this.currentTestName = testName.FullName;
-			events.FireTestStarting( testName );
-		}
-
-		/// <summary>
-		/// Trigger event when each test finishes
-		/// </summary>
-		/// <param name="result">Result of the case that finished</param>
-		public void TestFinished(TestResult result)
-		{
-			events.FireTestFinished( result );
-		}
-
-		/// <summary>
-		/// Trigger event when each suite starts
-		/// </summary>
-		/// <param name="suite">Suite that is starting</param>
-		public void SuiteStarted(TestName suiteName)
-		{
-			events.FireSuiteStarting( suiteName );
-		}
-
-		/// <summary>
-		/// Trigger event when each suite finishes
-		/// </summary>
-		/// <param name="result">Result of the suite that finished</param>
-		public void SuiteFinished(TestResult result)
-		{
-			events.FireSuiteFinished( result );
-		}
-
-		/// <summary>
-		/// Trigger event when an unhandled exception (other than ThreadAbordException) occurs during a test
-		/// </summary>
-		/// <param name="exception">The unhandled exception</param>
-		public void UnhandledException(Exception exception)
-		{
-			events.FireTestException( this.currentTestName, exception );
-		}
-
-		void OnUnhandledException( object sender, UnhandledExceptionEventArgs args )
-		{
-			switch( args.ExceptionObject.GetType().FullName )
-			{
-				case "System.Threading.ThreadAbortException":
-					break;
-				case "NUnit.Framework.AssertionException":
-				default:
-                    Exception ex = args.ExceptionObject as Exception;
-					events.FireTestException( this.currentTestName, ex);
-					break;
-			}
-		}
-
-		/// <summary>
-		/// Trigger event when output occurs during a test
-		/// </summary>
-		/// <param name="testOutput">The test output</param>
-		public void TestOutput(TestOutput testOutput)
-		{
-			events.FireTestOutput( testOutput );
-		}
-
-		#endregion
-
-		#region Methods for Loading and Unloading Projects
-		
-		/// <summary>
-		/// Create a new project with default naming
-		/// </summary>
-		public void NewProject()
-		{
-            log.Info("Creating empty project");
-            try
-			{
-				events.FireProjectLoading( "New Project" );
-
-				OnProjectLoad( Services.ProjectService.NewProject() );
-			}
-			catch( Exception exception )
-			{
-                log.Error("Project creation failed", exception);
-                lastException = exception;
-				events.FireProjectLoadFailed( "New Project", exception );
-			}
-		}
-
-		/// <summary>
-		/// Create a new project using a given path
-		/// </summary>
-		public void NewProject( string filePath )
-		{
-            log.Info("Creating project " + filePath);
-            try
-			{
-				events.FireProjectLoading( filePath );
-
-				NUnitProject project = new NUnitProject( filePath );
-
-				project.Configs.Add( "Debug" );
-				project.Configs.Add( "Release" );			
-				project.IsDirty = false;
-
-				OnProjectLoad( project );
-			}
-			catch( Exception exception )
-			{
-                log.Error("Project creation failed", exception);
-                lastException = exception;
-				events.FireProjectLoadFailed( filePath, exception );
-			}
-		}
-
-		/// <summary>
-		/// Load a new project, optionally selecting the config and fire events
-		/// </summary>
-		public void LoadProject( string filePath, string configName )
-		{
-			try
-			{
-                log.Info("Loading project {0}, {1} config", filePath, configName == null ? "default" : configName);
-                events.FireProjectLoading(filePath);
-
-				NUnitProject newProject = Services.ProjectService.LoadProject( filePath );
-				if ( configName != null ) 
-				{
-					newProject.SetActiveConfig( configName );
-					newProject.IsDirty = false;
-				}
-
-				OnProjectLoad( newProject );
-			}
-			catch( Exception exception )
-			{
-                log.Error("Project load failed", exception);
-                lastException = exception;
-				events.FireProjectLoadFailed( filePath, exception );
-			}
-		}
-
-		/// <summary>
-		/// Load a new project using the default config and fire events
-		/// </summary>
-		public void LoadProject( string filePath )
-		{
-			LoadProject( filePath, null );
-		}
-
-		/// <summary>
-		/// Load a project from a list of assemblies and fire events
-		/// </summary>
-		public void LoadProject( string[] assemblies )
-		{
-			try
-			{
-                log.Info("Loading multiple assemblies as new project");
-				events.FireProjectLoading( "New Project" );
-
-				NUnitProject newProject = Services.ProjectService.WrapAssemblies( assemblies );
-
-				OnProjectLoad( newProject );
-			}
-			catch( Exception exception )
-			{
-                log.Error("Project load failed", exception);
-                lastException = exception;
-				events.FireProjectLoadFailed( "New Project", exception );
-			}
-		}
-
-		/// <summary>
-		/// Unload the current project and fire events
-		/// </summary>
-		public void UnloadProject()
-		{
-			string testFileName = TestFileName;
-
-            log.Info("Unloading project " + testFileName);
-			try
-			{
-				events.FireProjectUnloading( testFileName );
-
-				if ( IsTestLoaded )
-					UnloadTest();
-
-				testProject = null;
-
-				events.FireProjectUnloaded( testFileName );
-			}
-			catch (Exception exception )
-			{
-                log.Error("Project unload failed", exception);
-                lastException = exception;
-				events.FireProjectUnloadFailed( testFileName, exception );
-			}
-
-		}
-
-		/// <summary>
-		/// Common operations done each time a project is loaded
-		/// </summary>
-		/// <param name="testProject">The newly loaded project</param>
-		private void OnProjectLoad( NUnitProject testProject )
-		{
-			if ( IsProjectLoaded )
-				UnloadProject();
-
-			this.testProject = testProject;
-
-			events.FireProjectLoaded( TestFileName );
-		}
-
-		#endregion
-
-		#region Methods for Loading and Unloading Tests
-
-		public void LoadTest()
-		{
-			LoadTest( null );
-		}
-		
-		public void LoadTest( string testName )
-		{
-            log.Info("Loading tests for " + Path.GetFileName(TestFileName));
-
-            long startTime = DateTime.Now.Ticks;
-
-			try
-			{
-				events.FireTestLoading( TestFileName );
-
-                TestPackage package = MakeTestPackage(testName);
-                if (testRunner != null)
-                    testRunner.Dispose();
-				testRunner = factory.MakeTestRunner(package);
-
-                bool loaded = testRunner.Load(package);
-
-				loadedTestName = testName;
-				testResult = null;
-				reloadPending = false;
-			
-				if ( Services.UserSettings.GetSetting( "Options.TestLoader.ReloadOnChange", true ) )
-					InstallWatcher( );
-
-                if (loaded)
-                {
-                    this.currentFramework = package.Settings.Contains("RuntimeFramework")
-                        ? package.Settings["RuntimeFramework"] as RuntimeFramework
-                        : RuntimeFramework.CurrentFramework;
-
-                    testProject.HasChangesRequiringReload = false;
-                    events.FireTestLoaded(TestFileName, LoadedTest);
-                }
-                else
-                {
-                    lastException = new ApplicationException(string.Format("Unable to find test {0} in assembly", testName));
-                    events.FireTestLoadFailed(TestFileName, lastException);
-                }
-			}
-			catch( FileNotFoundException exception )
-			{
-                log.Error("File not found", exception);
-				lastException = exception;
-
-				foreach( string assembly in TestProject.ActiveConfig.Assemblies )
-				{
-					if ( Path.GetFileNameWithoutExtension( assembly ) == exception.FileName &&
-						!PathUtils.SamePathOrUnder( testProject.ActiveConfig.BasePath, assembly ) )
-					{
-						lastException = new ApplicationException( string.Format( "Unable to load {0} because it is not located under the AppBase", exception.FileName ), exception );
-						break;
-					}
-				}
-
-				events.FireTestLoadFailed( TestFileName, lastException );
-
-                double loadTime = (double)(DateTime.Now.Ticks - startTime) / (double)TimeSpan.TicksPerSecond;
-                log.Info("Load completed in {0} seconds", loadTime);
-            }
-			catch( Exception exception )
-			{
-                log.Error("Failed to load test", exception);
-
-				lastException = exception;
-				events.FireTestLoadFailed( TestFileName, exception );
-			}
-		}
-
-		/// <summary>
-		/// Unload the current test suite and fire the Unloaded event
-		/// </summary>
-		public void UnloadTest( )
-		{
-			if( IsTestLoaded )
-			{
-                log.Info("Unloading tests for " + Path.GetFileName(TestFileName));
-
-				// Hold the name for notifications after unload
-				string fileName = TestFileName;
-
-				try
-				{
-					events.FireTestUnloading( fileName );
-
-					RemoveWatcher();
-
-					testRunner.Unload();
-                    testRunner.Dispose();
-					testRunner = null;
-
-					loadedTestName = null;
-					testResult = null;
-					reloadPending = false;
-
-					events.FireTestUnloaded( fileName );
-                    log.Info("Unload complete");
-				}
-				catch( Exception exception )
-				{
-                    log.Error("Failed to unload tests", exception);
-                    lastException = exception;
-					events.FireTestUnloadFailed( fileName, exception );
-				}
-			}
-		}
-
-        /// <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>
-		public void ReloadTest(RuntimeFramework framework)
-		{
-            log.Info("Reloading tests for " + Path.GetFileName(TestFileName));
-			try
-			{
-				events.FireTestReloading( TestFileName );
-
-                TestPackage package = MakeTestPackage(loadedTestName);
-                if (framework != null)
-                    package.Settings["RuntimeFramework"] = framework;
-
-                RemoveWatcher();
-
-                testRunner.Unload();
-                if (!factory.CanReuse(testRunner, package))
-                {
-                    testRunner.Dispose();
-                    testRunner = factory.MakeTestRunner(package);
-                }
-
-                if (testRunner.Load(package))
-                    this.currentFramework = package.Settings.Contains("RuntimeFramework")
-                        ? package.Settings["RuntimeFramework"] as RuntimeFramework
-                        : RuntimeFramework.CurrentFramework;
-
-                currentRuntime = framework;
-				reloadPending = false;
-
-                if (Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnChange", true))
-                    InstallWatcher();
-
-                testProject.HasChangesRequiringReload = false;
-                events.FireTestReloaded(TestFileName, LoadedTest);
-
-                log.Info("Reload complete");
-			}
-			catch( Exception exception )
-			{
-                log.Error("Reload failed", exception);
-                lastException = exception;
-				events.FireTestReloadFailed( TestFileName, exception );
-			}
-		}
-
-        public void ReloadTest()
-        {
-            ReloadTest(currentRuntime);
-        }
-
-		/// <summary>
-		/// Handle watcher event that signals when the loaded assembly
-		/// file has changed. Make sure it's a real change before
-		/// firing the SuiteChangedEvent. Since this all happens
-		/// asynchronously, we use an event to let ui components
-		/// know that the failure happened.
-		/// </summary>
-		public void OnTestChanged( string testFileName )
-		{
-            log.Info("Assembly changed: {0}", testFileName);
-
-			if ( Running )
-				reloadPending = true;
-			else
-			{
-				ReloadTest();
-
-                if (lastFilter != null && Services.UserSettings.GetSetting("Options.TestLoader.RerunOnChange", false))
-					testRunner.BeginRun( this, lastFilter, lastTracing, lastLogLevel );
-			}
-		}
-		#endregion
-
-		#region Methods for Running Tests
-
-		/// <summary>
-		/// Run selected tests using a filter
-		/// </summary>
-		/// <param name="filter">The filter to be used</param>
-		public void RunTests( ITestFilter filter )
-		{
-			if ( !Running  && LoadedTest != null)
-			{
-                if (reloadPending || Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false))
-					ReloadTest();
-
-                // Save args for automatic rerun
-                this.lastFilter = filter;
-                this.lastTracing = tracing;
-                this.lastLogLevel = logLevel;
-
-                testRunner.BeginRun(this, filter, tracing, logLevel);
-			}
-		}
-
-		/// <summary>
-		/// Cancel the currently running test.
-		/// Fail silently if there is none to
-		/// allow for latency in the UI.
-		/// </summary>
-		public void CancelTestRun()
-		{
-			if ( Running )
-				testRunner.CancelRun();
-		}
-
-		public IList GetCategories() 
-		{
-			CategoryManager categoryManager = new CategoryManager();
-			categoryManager.AddAllCategories( this.LoadedTest );
-			ArrayList list = new ArrayList( categoryManager.Categories );
-			list.Sort();
-			return list;
-		}
-
-		public void SaveLastResult( string fileName )
-		{
-			new XmlResultWriter( fileName ).SaveTestResult(this.testResult);
-        }
-        #endregion
-
-        #region Helper Methods
-
-        /// <summary>
-		/// Install our watcher object so as to get notifications
-		/// about changes to a test.
-		/// </summary>
-		private void InstallWatcher()
-		{
-            if (watcher != null)
-            {
-                watcher.Stop();
-                watcher.FreeResources();
-
-                watcher.Setup(1000, TestProject.ActiveConfig.Assemblies.ToArray());
-                watcher.AssemblyChanged += new AssemblyChangedHandler(OnTestChanged);
-                watcher.Start();
-            }
-		}
-
-		/// <summary>
-		/// Stop and remove our current watcher object.
-		/// </summary>
-		private void RemoveWatcher()
-		{
-            if (watcher != null)
-            {
-                watcher.Stop();
-                watcher.FreeResources();
-                watcher.AssemblyChanged -= new AssemblyChangedHandler(OnTestChanged);
-            }
-		}
-
-		private TestPackage MakeTestPackage( string testName )
-		{
-			TestPackage package = TestProject.ActiveConfig.MakeTestPackage();
-			package.TestName = testName;
-
-            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)userSettings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
-            DomainUsage domainUsage = (DomainUsage)userSettings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
-
-            if (processModel != ProcessModel.Default &&     // Ignore default setting
-                !package.Settings.Contains("ProcessModel")) // Ignore global setting if package has a setting
-            {
-                package.Settings["ProcessModel"] = processModel;
-            }
-
-            // 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
-
-		#region InitializeLifetimeService Override
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-		#endregion
-
-		#region IService Members
-
-		public void UnloadService()
-		{
-			// TODO:  Add TestLoader.UnloadService implementation
-		}
-
-		public void InitializeService()
-		{
-			// TODO:  Add TestLoader.InitializeService implementation
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.IO;
+	using System.Collections;
+	using System.Diagnostics;
+	using System.Threading;
+	using System.Configuration;
+	using NUnit.Core;
+	using NUnit.Core.Filters;
+
+	/// <summary>
+	/// TestLoader handles interactions between a test runner and a 
+	/// client program - typically the user interface - for the 
+	/// purpose of loading, unloading and running tests.
+	/// 
+	/// It implemements the EventListener interface which is used by 
+	/// the test runner and repackages those events, along with
+	/// others as individual events that clients may subscribe to
+	/// in collaboration with a TestEventDispatcher helper object.
+	/// 
+	/// TestLoader is quite handy for use with a gui client because
+	/// of the large number of events it supports. However, it has
+	/// no dependencies on ui components and can be used independently.
+	/// </summary>
+	public class TestLoader : MarshalByRefObject, NUnit.Core.EventListener, ITestLoader, IService
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestLoader));
+
+		#region Instance Variables
+
+		/// <summary>
+		/// Our event dispatching helper object
+		/// </summary>
+		private TestEventDispatcher events;
+
+        /// <summary>
+        /// Our TestRunnerFactory
+        /// </summary>
+        private ITestRunnerFactory factory;
+
+		/// <summary>
+		/// Loads and executes tests. Non-null when
+		/// we have loaded a test.
+		/// </summary>
+		private TestRunner testRunner = null;
+
+		/// <summary>
+		/// Our current test project, if we have one.
+		/// </summary>
+		private NUnitProject testProject = null;
+
+		/// <summary>
+		/// The currently loaded test, returned by the testrunner
+		/// </summary>
+        //private ITest loadedTest = null;
+
+		/// <summary>
+		/// The test name that was specified when loading
+		/// </summary>
+		private string loadedTestName = null;
+
+		/// <summary>
+		/// The currently executing test
+		/// </summary>
+		private string currentTestName;
+
+        /// <summary>
+        /// The currently set runtime framework
+        /// </summary>
+        private RuntimeFramework currentRuntime;
+
+		/// <summary>
+		/// Result of the last test run
+		/// </summary>
+		private TestResult testResult = null;
+
+		/// <summary>
+		/// The last exception received when trying to load, unload or run a test
+		/// </summary>
+		private Exception lastException = null;
+
+		/// <summary>
+		/// Watcher fires when the assembly changes
+		/// </summary>
+		private IAssemblyWatcher watcher;
+
+		/// <summary>
+		/// Assembly changed during a test and
+		/// needs to be reloaded later
+		/// </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
+		/// </summary>
+		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.
+        /// </summary>
+        private RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+
+		#endregion
+
+		#region Constructors
+
+		public TestLoader()
+			: this( new TestEventDispatcher() ) { }
+
+		public TestLoader(TestEventDispatcher eventDispatcher)
+			: this(eventDispatcher, new AssemblyWatcher()) { }
+
+		public TestLoader(IAssemblyWatcher assemblyWatcher)
+			: this(new TestEventDispatcher(), assemblyWatcher) { }
+
+		public TestLoader(TestEventDispatcher eventDispatcher, IAssemblyWatcher assemblyWatcher)
+		{
+			this.events = eventDispatcher;
+			this.watcher = assemblyWatcher;
+			this.factory = new DefaultTestRunnerFactory();
+			AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
+		}
+
+		#endregion
+
+		#region Properties
+		public bool IsProjectLoaded
+		{
+			get { return testProject != null; }
+		}
+
+		public bool IsTestLoaded
+		{
+			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; }
+		}
+
+		public NUnitProject TestProject
+		{
+			get { return testProject; }
+		}
+
+		public ITestEvents Events
+		{
+			get { return events; }
+		}
+
+		public string TestFileName
+		{
+			get { return testProject.ProjectPath; }
+		}
+
+		public TestResult TestResult
+		{
+			get { return testResult; }
+		}
+
+		public Exception LastException
+		{
+			get { return lastException; }
+		}
+
+		public IList AssemblyInfo
+		{
+			get { return testRunner == null ? new TestAssemblyInfo[0] : testRunner.AssemblyInfo; }
+		}
+
+		public int 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
+
+		public void RunStarted(string name, int testCount)
+		{
+            log.Debug("Got RunStarted Event");
+			events.FireRunStarting( name, testCount );
+		}
+
+		public void RunFinished(NUnit.Core.TestResult testResult)
+		{
+			this.testResult = testResult;
+
+            events.FireRunFinished(testResult);
+		}
+
+		public void RunFinished(Exception exception)
+		{
+			this.lastException = exception;
+			events.FireRunFinished( exception );
+		}
+
+		/// <summary>
+		/// Trigger event when each test starts
+		/// </summary>
+		/// <param name="testName">TestName of the Test that is starting</param>
+		public void TestStarted(TestName testName)
+		{
+			this.currentTestName = testName.FullName;
+			events.FireTestStarting( testName );
+		}
+
+		/// <summary>
+		/// Trigger event when each test finishes
+		/// </summary>
+		/// <param name="result">Result of the case that finished</param>
+		public void TestFinished(TestResult result)
+		{
+			events.FireTestFinished( result );
+		}
+
+		/// <summary>
+		/// Trigger event when each suite starts
+		/// </summary>
+		/// <param name="suite">Suite that is starting</param>
+		public void SuiteStarted(TestName suiteName)
+		{
+			events.FireSuiteStarting( suiteName );
+		}
+
+		/// <summary>
+		/// Trigger event when each suite finishes
+		/// </summary>
+		/// <param name="result">Result of the suite that finished</param>
+		public void SuiteFinished(TestResult result)
+		{
+			events.FireSuiteFinished( result );
+		}
+
+		/// <summary>
+		/// Trigger event when an unhandled exception (other than ThreadAbordException) occurs during a test
+		/// </summary>
+		/// <param name="exception">The unhandled exception</param>
+		public void UnhandledException(Exception exception)
+		{
+			events.FireTestException( this.currentTestName, exception );
+		}
+
+		void OnUnhandledException( object sender, UnhandledExceptionEventArgs args )
+		{
+			switch( args.ExceptionObject.GetType().FullName )
+			{
+				case "System.Threading.ThreadAbortException":
+					break;
+				case "NUnit.Framework.AssertionException":
+				default:
+                    Exception ex = args.ExceptionObject as Exception;
+					events.FireTestException( this.currentTestName, ex);
+					break;
+			}
+		}
+
+		/// <summary>
+		/// Trigger event when output occurs during a test
+		/// </summary>
+		/// <param name="testOutput">The test output</param>
+		public void TestOutput(TestOutput testOutput)
+		{
+			events.FireTestOutput( testOutput );
+		}
+
+		#endregion
+
+		#region Methods for Loading and Unloading Projects
+		
+		/// <summary>
+		/// Create a new project with default naming
+		/// </summary>
+		public void NewProject()
+		{
+            log.Info("Creating empty project");
+            try
+			{
+				events.FireProjectLoading( "New Project" );
+
+				OnProjectLoad( Services.ProjectService.NewProject() );
+			}
+			catch( Exception exception )
+			{
+                log.Error("Project creation failed", exception);
+                lastException = exception;
+				events.FireProjectLoadFailed( "New Project", exception );
+			}
+		}
+
+		/// <summary>
+		/// Create a new project using a given path
+		/// </summary>
+		public void NewProject( string filePath )
+		{
+            log.Info("Creating project " + filePath);
+            try
+			{
+				events.FireProjectLoading( filePath );
+
+				NUnitProject project = new NUnitProject( filePath );
+
+				project.Configs.Add( "Debug" );
+				project.Configs.Add( "Release" );			
+				project.IsDirty = false;
+
+				OnProjectLoad( project );
+			}
+			catch( Exception exception )
+			{
+                log.Error("Project creation failed", exception);
+                lastException = exception;
+				events.FireProjectLoadFailed( filePath, exception );
+			}
+		}
+
+		/// <summary>
+		/// Load a new project, optionally selecting the config and fire events
+		/// </summary>
+		public void LoadProject( string filePath, string configName )
+		{
+			try
+			{
+                log.Info("Loading project {0}, {1} config", filePath, configName == null ? "default" : configName);
+                events.FireProjectLoading(filePath);
+
+				NUnitProject newProject = Services.ProjectService.LoadProject( filePath );
+				if ( configName != null ) 
+				{
+					newProject.SetActiveConfig( configName );
+					newProject.IsDirty = false;
+				}
+
+				OnProjectLoad( newProject );
+			}
+			catch( Exception exception )
+			{
+                log.Error("Project load failed", exception);
+                lastException = exception;
+				events.FireProjectLoadFailed( filePath, exception );
+			}
+		}
+
+		/// <summary>
+		/// Load a new project using the default config and fire events
+		/// </summary>
+		public void LoadProject( string filePath )
+		{
+			LoadProject( filePath, null );
+		}
+
+		/// <summary>
+		/// Load a project from a list of assemblies and fire events
+		/// </summary>
+		public void LoadProject( string[] assemblies )
+		{
+			try
+			{
+                log.Info("Loading multiple assemblies as new project");
+				events.FireProjectLoading( "New Project" );
+
+				NUnitProject newProject = Services.ProjectService.WrapAssemblies( assemblies );
+
+				OnProjectLoad( newProject );
+			}
+			catch( Exception exception )
+			{
+                log.Error("Project load failed", exception);
+                lastException = exception;
+				events.FireProjectLoadFailed( "New Project", exception );
+			}
+		}
+
+		/// <summary>
+		/// Unload the current project and fire events
+		/// </summary>
+		public void UnloadProject()
+		{
+			string testFileName = TestFileName;
+
+            log.Info("Unloading project " + testFileName);
+			try
+			{
+				events.FireProjectUnloading( testFileName );
+
+				if ( IsTestLoaded )
+					UnloadTest();
+
+				testProject = null;
+
+				events.FireProjectUnloaded( testFileName );
+			}
+			catch (Exception exception )
+			{
+                log.Error("Project unload failed", exception);
+                lastException = exception;
+				events.FireProjectUnloadFailed( testFileName, exception );
+			}
+
+		}
+
+		/// <summary>
+		/// Common operations done each time a project is loaded
+		/// </summary>
+		/// <param name="testProject">The newly loaded project</param>
+		private void OnProjectLoad( NUnitProject testProject )
+		{
+			if ( IsProjectLoaded )
+				UnloadProject();
+
+			this.testProject = testProject;
+
+			events.FireProjectLoaded( TestFileName );
+		}
+
+		#endregion
+
+		#region Methods for Loading and Unloading Tests
+
+		public void LoadTest()
+		{
+			LoadTest( null );
+		}
+		
+		public void LoadTest( string testName )
+		{
+            log.Info("Loading tests for " + Path.GetFileName(TestFileName));
+
+            long startTime = DateTime.Now.Ticks;
+
+			try
+			{
+				events.FireTestLoading( TestFileName );
+
+                TestPackage package = MakeTestPackage(testName);
+                if (testRunner != null)
+                    testRunner.Dispose();
+				testRunner = factory.MakeTestRunner(package);
+
+                bool loaded = testRunner.Load(package);
+
+				loadedTestName = testName;
+				testResult = null;
+				reloadPending = false;
+			
+				if ( Services.UserSettings.GetSetting( "Options.TestLoader.ReloadOnChange", true ) )
+					InstallWatcher( );
+
+                if (loaded)
+                {
+                    this.currentFramework = package.Settings.Contains("RuntimeFramework")
+                        ? package.Settings["RuntimeFramework"] as RuntimeFramework
+                        : RuntimeFramework.CurrentFramework;
+
+                    testProject.HasChangesRequiringReload = false;
+                    events.FireTestLoaded(TestFileName, LoadedTest);
+                }
+                else
+                {
+                    lastException = new ApplicationException(string.Format("Unable to find test {0} in assembly", testName));
+                    events.FireTestLoadFailed(TestFileName, lastException);
+                }
+			}
+			catch( FileNotFoundException exception )
+			{
+                log.Error("File not found", exception);
+				lastException = exception;
+
+				foreach( string assembly in TestProject.ActiveConfig.Assemblies )
+				{
+					if ( Path.GetFileNameWithoutExtension( assembly ) == exception.FileName &&
+						!PathUtils.SamePathOrUnder( testProject.ActiveConfig.BasePath, assembly ) )
+					{
+						lastException = new ApplicationException( string.Format( "Unable to load {0} because it is not located under the AppBase", exception.FileName ), exception );
+						break;
+					}
+				}
+
+				events.FireTestLoadFailed( TestFileName, lastException );
+
+                double loadTime = (double)(DateTime.Now.Ticks - startTime) / (double)TimeSpan.TicksPerSecond;
+                log.Info("Load completed in {0} seconds", loadTime);
+            }
+			catch( Exception exception )
+			{
+                log.Error("Failed to load test", exception);
+
+				lastException = exception;
+				events.FireTestLoadFailed( TestFileName, exception );
+			}
+		}
+
+		/// <summary>
+		/// Unload the current test suite and fire the Unloaded event
+		/// </summary>
+		public void UnloadTest( )
+		{
+			if( IsTestLoaded )
+			{
+                log.Info("Unloading tests for " + Path.GetFileName(TestFileName));
+
+				// Hold the name for notifications after unload
+				string fileName = TestFileName;
+
+				try
+				{
+					events.FireTestUnloading( fileName );
+
+					RemoveWatcher();
+
+					testRunner.Unload();
+                    testRunner.Dispose();
+					testRunner = null;
+
+					loadedTestName = null;
+					testResult = null;
+					reloadPending = false;
+
+					events.FireTestUnloaded( fileName );
+                    log.Info("Unload complete");
+				}
+				catch( Exception exception )
+				{
+                    log.Error("Failed to unload tests", exception);
+                    lastException = exception;
+					events.FireTestUnloadFailed( fileName, exception );
+				}
+			}
+		}
+
+        /// <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>
+		public void ReloadTest(RuntimeFramework framework)
+		{
+            log.Info("Reloading tests for " + Path.GetFileName(TestFileName));
+			try
+			{
+				events.FireTestReloading( TestFileName );
+
+                TestPackage package = MakeTestPackage(loadedTestName);
+                if (framework != null)
+                    package.Settings["RuntimeFramework"] = framework;
+
+                RemoveWatcher();
+
+                testRunner.Unload();
+                if (!factory.CanReuse(testRunner, package))
+                {
+                    testRunner.Dispose();
+                    testRunner = factory.MakeTestRunner(package);
+                }
+
+                if (testRunner.Load(package))
+                    this.currentFramework = package.Settings.Contains("RuntimeFramework")
+                        ? package.Settings["RuntimeFramework"] as RuntimeFramework
+                        : RuntimeFramework.CurrentFramework;
+
+                currentRuntime = framework;
+				reloadPending = false;
+
+                if (Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnChange", true))
+                    InstallWatcher();
+
+                testProject.HasChangesRequiringReload = false;
+                events.FireTestReloaded(TestFileName, LoadedTest);
+
+                log.Info("Reload complete");
+			}
+			catch( Exception exception )
+			{
+                log.Error("Reload failed", exception);
+                lastException = exception;
+				events.FireTestReloadFailed( TestFileName, exception );
+			}
+		}
+
+        public void ReloadTest()
+        {
+            ReloadTest(currentRuntime);
+        }
+
+		/// <summary>
+		/// Handle watcher event that signals when the loaded assembly
+		/// file has changed. Make sure it's a real change before
+		/// firing the SuiteChangedEvent. Since this all happens
+		/// asynchronously, we use an event to let ui components
+		/// know that the failure happened.
+		/// </summary>
+		public void OnTestChanged( string testFileName )
+		{
+            log.Info("Assembly changed: {0}", testFileName);
+
+			if ( Running )
+				reloadPending = true;
+			else
+			{
+				ReloadTest();
+
+                if (lastFilter != null && Services.UserSettings.GetSetting("Options.TestLoader.RerunOnChange", false))
+					testRunner.BeginRun( this, lastFilter, lastTracing, lastLogLevel );
+			}
+		}
+		#endregion
+
+		#region Methods for Running Tests
+
+		/// <summary>
+		/// Run selected tests using a filter
+		/// </summary>
+		/// <param name="filter">The filter to be used</param>
+		public void RunTests( ITestFilter filter )
+		{
+			if ( !Running  && LoadedTest != null)
+			{
+                if (reloadPending || Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false))
+					ReloadTest();
+
+                // Save args for automatic rerun
+                this.lastFilter = filter;
+                this.lastTracing = tracing;
+                this.lastLogLevel = logLevel;
+
+                testRunner.BeginRun(this, filter, tracing, logLevel);
+			}
+		}
+
+		/// <summary>
+		/// Cancel the currently running test.
+		/// Fail silently if there is none to
+		/// allow for latency in the UI.
+		/// </summary>
+		public void CancelTestRun()
+		{
+			if ( Running )
+				testRunner.CancelRun();
+		}
+
+		public IList GetCategories() 
+		{
+			CategoryManager categoryManager = new CategoryManager();
+			categoryManager.AddAllCategories( this.LoadedTest );
+			ArrayList list = new ArrayList( categoryManager.Categories );
+			list.Sort();
+			return list;
+		}
+
+		public void SaveLastResult( string fileName )
+		{
+			new XmlResultWriter( fileName ).SaveTestResult(this.testResult);
+        }
+        #endregion
+
+        #region Helper Methods
+
+        /// <summary>
+		/// Install our watcher object so as to get notifications
+		/// about changes to a test.
+		/// </summary>
+		private void InstallWatcher()
+		{
+            if (watcher != null)
+            {
+                watcher.Stop();
+                watcher.FreeResources();
+
+                watcher.Setup(1000, TestProject.ActiveConfig.Assemblies.ToArray());
+                watcher.AssemblyChanged += new AssemblyChangedHandler(OnTestChanged);
+                watcher.Start();
+            }
+		}
+
+		/// <summary>
+		/// Stop and remove our current watcher object.
+		/// </summary>
+		private void RemoveWatcher()
+		{
+            if (watcher != null)
+            {
+                watcher.Stop();
+                watcher.FreeResources();
+                watcher.AssemblyChanged -= new AssemblyChangedHandler(OnTestChanged);
+            }
+		}
+
+		private TestPackage MakeTestPackage( string testName )
+		{
+			TestPackage package = TestProject.ActiveConfig.MakeTestPackage();
+			package.TestName = testName;
+
+            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)userSettings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
+            DomainUsage domainUsage = (DomainUsage)userSettings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
+
+            if (processModel != ProcessModel.Default &&     // Ignore default setting
+                !package.Settings.Contains("ProcessModel")) // Ignore global setting if package has a setting
+            {
+                package.Settings["ProcessModel"] = processModel;
+            }
+
+            // 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
+
+		#region InitializeLifetimeService Override
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+
+		#region IService Members
+
+		public void UnloadService()
+		{
+			// TODO:  Add TestLoader.UnloadService implementation
+		}
+
+		public void InitializeService()
+		{
+			// TODO:  Add TestLoader.InitializeService implementation
+		}
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/TestObserver.cs b/src/ClientUtilities/util/TestObserver.cs
index 9b8117b..a9c3a88 100644
--- a/src/ClientUtilities/util/TestObserver.cs
+++ b/src/ClientUtilities/util/TestObserver.cs
@@ -1,20 +1,20 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// The TestObserver interface is implemented by a class that
-	/// subscribes to the events generated in loading and running
-	/// tests and uses that information in some way.
-	/// </summary>
-	public interface TestObserver
-	{
-		void Subscribe( ITestEvents events );
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// The TestObserver interface is implemented by a class that
+	/// subscribes to the events generated in loading and running
+	/// tests and uses that information in some way.
+	/// </summary>
+	public interface TestObserver
+	{
+		void Subscribe( ITestEvents events );
+	}
+}
diff --git a/src/ClientUtilities/util/TestResultItem.cs b/src/ClientUtilities/util/TestResultItem.cs
index ce4e91b..7db6ead 100644
--- a/src/ClientUtilities/util/TestResultItem.cs
+++ b/src/ClientUtilities/util/TestResultItem.cs
@@ -1,78 +1,78 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Util
-{
-	using NUnit.Core;
-
-	/// <summary>
-	/// Summary description for TestResultItem.
-	/// </summary>
-	public class TestResultItem
-	{
-		private string testName;
-		private string message;
-		private string stackTrace;
-
-		public TestResultItem(TestResult result )
-		{
-			testName = result.Test.TestName.FullName;
-			message = result.Message;
-			stackTrace = result.StackTrace;
-
-			if ( result.Test.IsSuite && result.FailureSite == FailureSite.SetUp )
-				testName += " (TestFixtureSetUp)";
-		}
-
-		public TestResultItem( string testName, string message, string stackTrace )
-		{
-			this.testName = testName;
-			this.message = message;
-			this.stackTrace = stackTrace;
-		}
-
-		public override string ToString()
-		{
-			if ( message.Length > 64000 )
-				return string.Format( "{0}:{1}{2}", testName, Environment.NewLine, message.Substring( 0, 64000 ) );
-
-			return GetMessage();
-		}
-
-		public string GetMessage()
-		{
-			return String.Format("{0}:{1}{2}", testName, Environment.NewLine, message);
-		}
-
-        public string GetToolTipMessage()   //NRG 05/28/03 - Substitute spaces for tab characters
-        {
-            return (ReplaceTabs(GetMessage(), 8)); // Change each tab to 8 space characters
-        }
-
-        public string ReplaceTabs(string strOriginal, int nSpaces)  //NRG 05/28/03
-        {
-            string strSpaces = string.Empty;
-            strSpaces = strSpaces.PadRight(nSpaces, ' ');
-            return(strOriginal.Replace("\t", strSpaces));
-        }
-
-		public string StackTrace
-		{
-			get 
-			{
-                return stackTrace == null ? null : StackTraceFilter.Filter(stackTrace);
-
-                //string trace = "No stack trace is available";
-                //if(stackTrace != null)
-                //    trace = StackTraceFilter.Filter(stackTrace);
-
-                //return trace;
-			}
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Util
+{
+	using NUnit.Core;
+
+	/// <summary>
+	/// Summary description for TestResultItem.
+	/// </summary>
+	public class TestResultItem
+	{
+		private string testName;
+		private string message;
+		private string stackTrace;
+
+		public TestResultItem(TestResult result )
+		{
+			testName = result.Test.TestName.FullName;
+			message = result.Message;
+			stackTrace = result.StackTrace;
+
+			if ( result.Test.IsSuite && result.FailureSite == FailureSite.SetUp )
+				testName += " (TestFixtureSetUp)";
+		}
+
+		public TestResultItem( string testName, string message, string stackTrace )
+		{
+			this.testName = testName;
+			this.message = message;
+			this.stackTrace = stackTrace;
+		}
+
+		public override string ToString()
+		{
+			if ( message.Length > 64000 )
+				return string.Format( "{0}:{1}{2}", testName, Environment.NewLine, message.Substring( 0, 64000 ) );
+
+			return GetMessage();
+		}
+
+		public string GetMessage()
+		{
+			return String.Format("{0}:{1}{2}", testName, Environment.NewLine, message);
+		}
+
+        public string GetToolTipMessage()   //NRG 05/28/03 - Substitute spaces for tab characters
+        {
+            return (ReplaceTabs(GetMessage(), 8)); // Change each tab to 8 space characters
+        }
+
+        public string ReplaceTabs(string strOriginal, int nSpaces)  //NRG 05/28/03
+        {
+            string strSpaces = string.Empty;
+            strSpaces = strSpaces.PadRight(nSpaces, ' ');
+            return(strOriginal.Replace("\t", strSpaces));
+        }
+
+		public string StackTrace
+		{
+			get 
+			{
+                return stackTrace == null ? null : StackTraceFilter.Filter(stackTrace);
+
+                //string trace = "No stack trace is available";
+                //if(stackTrace != null)
+                //    trace = StackTraceFilter.Filter(stackTrace);
+
+                //return trace;
+			}
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/TestServer.cs b/src/ClientUtilities/util/TestServer.cs
index 0f5c115..4868a13 100644
--- a/src/ClientUtilities/util/TestServer.cs
+++ b/src/ClientUtilities/util/TestServer.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Threading;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Services;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using NUnit.Core;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Base class for servers
-	/// </summary>
-	public class TestServer : ServerBase
-	{
-		private TestRunner runner;
-
-		public TestServer( string uri, int port ) : base( uri, port )
-		{
-			this.runner = new TestDomain();
-		}
-
-		public TestRunner TestRunner
-		{
-			get { return runner; }
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Threading;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Services;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using NUnit.Core;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Base class for servers
+	/// </summary>
+	public class TestServer : ServerBase
+	{
+		private TestRunner runner;
+
+		public TestServer( string uri, int port ) : base( uri, port )
+		{
+			this.runner = new TestDomain();
+		}
+
+		public TestRunner TestRunner
+		{
+			get { return runner; }
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/Transform.resx b/src/ClientUtilities/util/Transform.resx
index b3c9757..5632c37 100644
--- a/src/ClientUtilities/util/Transform.resx
+++ b/src/ClientUtilities/util/Transform.resx
@@ -1,181 +1,181 @@
-<?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>
-  <data name="Summary.xslt" xml:space="preserve">
-    <value><?xml version="1.0" encoding="UTF-8" ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method='text'/>
-
-<xsl:template match="/">
-	<xsl:apply-templates/>
-</xsl:template>
-
-<xsl:template match="test-results">
-<xsl:text>Tests run: </xsl:text>
-<xsl:value-of select="@total"/>
-<xsl:text>, Errors: </xsl:text>
-<xsl:value-of select="@errors"/>
-<xsl:text>, Failures: </xsl:text>
-<xsl:value-of select="@failures"/>
-<xsl:text>, Time: </xsl:text>
-<xsl:value-of select="test-suite/@time"/>
-<xsl:text> seconds
-</xsl:text>
-<xsl:text>  Not run: </xsl:text>
-<xsl:value-of select="@not-run"/>
-<xsl:text>, Invalid: </xsl:text>
-<xsl:value-of select="@invalid"/>
-<xsl:text>, Ignored: </xsl:text>
-<xsl:value-of select="@ignored"/>
-<xsl:text>, Skipped: </xsl:text>
-<xsl:value-of select="@skipped"/>
-<xsl:text>
-
-</xsl:text>
-
-<xsl:if test="//test-suite[failure]"><xsl:text>Test Fixture SetUp Failures:
-</xsl:text></xsl:if>
-<xsl:apply-templates select="//test-suite[failure]"/>
-<xsl:if test="//test-case[failure]"><xsl:text>Test Case Failures:
-</xsl:text></xsl:if>
-<xsl:apply-templates select="//test-case[failure]"/>
-<xsl:if test="//test-case[@executed='False']"><xsl:text>Tests not run:
-</xsl:text></xsl:if>
-<xsl:apply-templates select="//test-case[@executed='False']"/>
-<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
-</xsl:template>
-
-<xsl:template match="test-case|test-suite">
-	<xsl:value-of select="position()"/><xsl:text>) </xsl:text>
-	<xsl:value-of select="@name"/>
-	<xsl:text> : </xsl:text>
-	<xsl:value-of select="child::node()/message"/>
-<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
-	<xsl:if test="failure">
-		<xsl:value-of select="failure/stack-trace"/>
-<xsl:text>
-</xsl:text>
-	</xsl:if>
-</xsl:template>
-
-</xsl:stylesheet>
-
-  </value>
-  </data>
+<?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>
+  <data name="Summary.xslt" xml:space="preserve">
+    <value><?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method='text'/>
+
+<xsl:template match="/">
+	<xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="test-results">
+<xsl:text>Tests run: </xsl:text>
+<xsl:value-of select="@total"/>
+<xsl:text>, Errors: </xsl:text>
+<xsl:value-of select="@errors"/>
+<xsl:text>, Failures: </xsl:text>
+<xsl:value-of select="@failures"/>
+<xsl:text>, Time: </xsl:text>
+<xsl:value-of select="test-suite/@time"/>
+<xsl:text> seconds
+</xsl:text>
+<xsl:text>  Not run: </xsl:text>
+<xsl:value-of select="@not-run"/>
+<xsl:text>, Invalid: </xsl:text>
+<xsl:value-of select="@invalid"/>
+<xsl:text>, Ignored: </xsl:text>
+<xsl:value-of select="@ignored"/>
+<xsl:text>, Skipped: </xsl:text>
+<xsl:value-of select="@skipped"/>
+<xsl:text>
+
+</xsl:text>
+
+<xsl:if test="//test-suite[failure]"><xsl:text>Test Fixture SetUp Failures:
+</xsl:text></xsl:if>
+<xsl:apply-templates select="//test-suite[failure]"/>
+<xsl:if test="//test-case[failure]"><xsl:text>Test Case Failures:
+</xsl:text></xsl:if>
+<xsl:apply-templates select="//test-case[failure]"/>
+<xsl:if test="//test-case[@executed='False']"><xsl:text>Tests not run:
+</xsl:text></xsl:if>
+<xsl:apply-templates select="//test-case[@executed='False']"/>
+<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="test-case|test-suite">
+	<xsl:value-of select="position()"/><xsl:text>) </xsl:text>
+	<xsl:value-of select="@name"/>
+	<xsl:text> : </xsl:text>
+	<xsl:value-of select="child::node()/message"/>
+<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
+	<xsl:if test="failure">
+		<xsl:value-of select="failure/stack-trace"/>
+<xsl:text>
+</xsl:text>
+	</xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
+  </value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/ClientUtilities/util/VSProject.cs b/src/ClientUtilities/util/VSProject.cs
index bb62174..1c06904 100644
--- a/src/ClientUtilities/util/VSProject.cs
+++ b/src/ClientUtilities/util/VSProject.cs
@@ -1,352 +1,352 @@
-// ****************************************************************
-// 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.Xml;
-using System.Text.RegularExpressions;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// This class allows loading information about
-	/// configurations and assemblies in a Visual
-	/// Studio project file and inspecting them.
-	/// Only the most common project 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 project
-		/// </summary>
-		private string projectPath;
-
-		/// <summary>
-		/// Collection of configs for the project
-		/// </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 project.
-		/// </summary>
-		public string Name
-		{
-			get { return Path.GetFileNameWithoutExtension( projectPath ); }
-		}
-
-		/// <summary>
-		/// The path to the project
-		/// </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 CLR_2_0 || CLR_4_0
-            if (path.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
-#else
-			if ( path.IndexOfAny( Path.InvalidPathChars ) >= 0 )
-#endif
-                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":
-
-						// 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( "$(ConfigurationName)", 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";
-
-            string commonOutputPath = null;
-
-			foreach (XmlElement configNode in nodes)
-			{
-                if (configNode.Name != "PropertyGroup")
-                    continue;
-
-                string configurationName = null;
-				XmlAttribute conditionAttribute = configNode.Attributes["Condition"];
-                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;
-
-                if (configurationName == null)
-                {
-                    commonOutputPath = outputPath;
-                    continue;
-                }
-
-                if (outputPath == null)
-                    outputPath = commonOutputPath;
-
-                if (outputPath == null) continue;
-
-				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 project file type: {0}", 
-								Path.GetFileName( projectPath ) ) );
-		}
-
-		private void ThrowInvalidFormat( string projectPath, Exception e )
-		{
-			throw new ArgumentException( 
-				string.Format( "Invalid project 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
-	}
-}
+// ****************************************************************
+// 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.Xml;
+using System.Text.RegularExpressions;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// This class allows loading information about
+	/// configurations and assemblies in a Visual
+	/// Studio project file and inspecting them.
+	/// Only the most common project 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 project
+		/// </summary>
+		private string projectPath;
+
+		/// <summary>
+		/// Collection of configs for the project
+		/// </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 project.
+		/// </summary>
+		public string Name
+		{
+			get { return Path.GetFileNameWithoutExtension( projectPath ); }
+		}
+
+		/// <summary>
+		/// The path to the project
+		/// </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 CLR_2_0 || CLR_4_0
+            if (path.IndexOfAny(Path.GetInvalidPathChars()) >= 0)
+#else
+			if ( path.IndexOfAny( Path.InvalidPathChars ) >= 0 )
+#endif
+                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":
+
+						// 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( "$(ConfigurationName)", 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";
+
+            string commonOutputPath = null;
+
+			foreach (XmlElement configNode in nodes)
+			{
+                if (configNode.Name != "PropertyGroup")
+                    continue;
+
+                string configurationName = null;
+				XmlAttribute conditionAttribute = configNode.Attributes["Condition"];
+                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;
+
+                if (configurationName == null)
+                {
+                    commonOutputPath = outputPath;
+                    continue;
+                }
+
+                if (outputPath == null)
+                    outputPath = commonOutputPath;
+
+                if (outputPath == null) continue;
+
+				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 project file type: {0}", 
+								Path.GetFileName( projectPath ) ) );
+		}
+
+		private void ThrowInvalidFormat( string projectPath, Exception e )
+		{
+			throw new ArgumentException( 
+				string.Format( "Invalid project 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/ClientUtilities/util/VSProjectConfig.cs b/src/ClientUtilities/util/VSProjectConfig.cs
index 800c22e..6ba56cd 100644
--- a/src/ClientUtilities/util/VSProjectConfig.cs
+++ b/src/ClientUtilities/util/VSProjectConfig.cs
@@ -1,39 +1,39 @@
-// ****************************************************************
-// 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.Specialized;
-
-namespace NUnit.Util
-{
-	/// <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; }
-		}
-	}
-}
+// ****************************************************************
+// 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.Specialized;
+
+namespace NUnit.Util
+{
+	/// <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/ClientUtilities/util/VSProjectConfigCollection.cs b/src/ClientUtilities/util/VSProjectConfigCollection.cs
index f422bba..203091e 100644
--- a/src/ClientUtilities/util/VSProjectConfigCollection.cs
+++ b/src/ClientUtilities/util/VSProjectConfigCollection.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Util
-{
-	/// <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;
-		}
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Util
+{
+	/// <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/ClientUtilities/util/XmlResultTransform.cs b/src/ClientUtilities/util/XmlResultTransform.cs
index aa850af..ac60c96 100644
--- a/src/ClientUtilities/util/XmlResultTransform.cs
+++ b/src/ClientUtilities/util/XmlResultTransform.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// Copyright 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.Xml;
-using System.Xml.Xsl;
-using System.Xml.XPath;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for XmlResultTransform.
-	/// </summary>
-	public class XmlResultTransform
-    {
-#if CLR_2_0 || CLR_4_0
-        private XslCompiledTransform xslTransform = new XslCompiledTransform();
-#else
-        private XslTransform xslTransform = new XslTransform();
-#endif
-
-        public XmlResultTransform() { }
-
-		public XmlResultTransform( string stylesheet )
-		{
-			Load( stylesheet );
-		}
-
-		public XmlResultTransform( XmlReader reader )
-		{
-			Load( reader );
-		}
-
-		public void Load( string stylesheet )
-		{
-			xslTransform.Load( stylesheet );				
-		}
-
-		public void Load( XmlReader reader )
-		{
-			// NOTE: Not compatable with .NET 1.0.
-			// xslTransform.Load(reader, null, null);
-
-			xslTransform.Load(reader);
-	        }
-
-		public void Transform( string inputFile, string outputFile )
-		{
-			Transform( new StreamReader( inputFile ), new StreamWriter( outputFile ) );
-		}
-
-		public void Transform( TextReader reader, TextWriter writer )
-		{
-			Transform( new XPathDocument( reader ), writer );
-		}
-
-		public void Transform( IXPathNavigable xpnav, TextWriter writer )
-		{
-			// NOTE: Not compatable with .NET 1.0.
-			// xslTransform.Transform(xpnav, null, writer, null);
-
-			xslTransform.Transform(xpnav, null, writer);
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Xml;
+using System.Xml.Xsl;
+using System.Xml.XPath;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for XmlResultTransform.
+	/// </summary>
+	public class XmlResultTransform
+    {
+#if CLR_2_0 || CLR_4_0
+        private XslCompiledTransform xslTransform = new XslCompiledTransform();
+#else
+        private XslTransform xslTransform = new XslTransform();
+#endif
+
+        public XmlResultTransform() { }
+
+		public XmlResultTransform( string stylesheet )
+		{
+			Load( stylesheet );
+		}
+
+		public XmlResultTransform( XmlReader reader )
+		{
+			Load( reader );
+		}
+
+		public void Load( string stylesheet )
+		{
+			xslTransform.Load( stylesheet );				
+		}
+
+		public void Load( XmlReader reader )
+		{
+			// NOTE: Not compatable with .NET 1.0.
+			// xslTransform.Load(reader, null, null);
+
+			xslTransform.Load(reader);
+	        }
+
+		public void Transform( string inputFile, string outputFile )
+		{
+			Transform( new StreamReader( inputFile ), new StreamWriter( outputFile ) );
+		}
+
+		public void Transform( TextReader reader, TextWriter writer )
+		{
+			Transform( new XPathDocument( reader ), writer );
+		}
+
+		public void Transform( IXPathNavigable xpnav, TextWriter writer )
+		{
+			// NOTE: Not compatable with .NET 1.0.
+			// xslTransform.Transform(xpnav, null, writer, null);
+
+			xslTransform.Transform(xpnav, null, writer);
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/XmlResultWriter.cs b/src/ClientUtilities/util/XmlResultWriter.cs
index c8cb599..9bd0976 100644
--- a/src/ClientUtilities/util/XmlResultWriter.cs
+++ b/src/ClientUtilities/util/XmlResultWriter.cs
@@ -1,335 +1,335 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Util
-{
-	using System;
-	using System.Globalization;
-	using System.IO;
-	using System.Xml;
-    using System.Collections;
-	using System.Reflection;
-	using NUnit.Core;
-
-	/// <summary>
-	/// Summary description for XmlResultWriter.
-	/// </summary>
-	public class XmlResultWriter
-	{
-		private XmlTextWriter xmlWriter;
-		private TextWriter writer;
-		private MemoryStream memoryStream;
-
-		#region Constructors
-		public XmlResultWriter(string fileName)
-		{
-			xmlWriter = new XmlTextWriter( new StreamWriter(fileName, false, System.Text.Encoding.UTF8) );
-		}
-
-        public XmlResultWriter( TextWriter writer )
-		{
-			this.memoryStream = new MemoryStream();
-			this.writer = writer;
-			this.xmlWriter = new XmlTextWriter( new StreamWriter( memoryStream, System.Text.Encoding.UTF8 ) );
-		}
-		#endregion
-
-		private void InitializeXmlFile(TestResult result) 
-		{
-			ResultSummarizer summaryResults = new ResultSummarizer(result);
-
-			xmlWriter.Formatting = Formatting.Indented;
-			xmlWriter.WriteStartDocument(false);
-			xmlWriter.WriteComment("This file represents the results of running a test suite");
-
-			xmlWriter.WriteStartElement("test-results");
-
-			xmlWriter.WriteAttributeString("name", summaryResults.Name);
-			xmlWriter.WriteAttributeString("total", summaryResults.TestsRun.ToString());
-            xmlWriter.WriteAttributeString("errors", summaryResults.Errors.ToString());
-            xmlWriter.WriteAttributeString("failures", summaryResults.Failures.ToString());
-            xmlWriter.WriteAttributeString("not-run", summaryResults.TestsNotRun.ToString());
-            xmlWriter.WriteAttributeString("inconclusive", summaryResults.Inconclusive.ToString());
-            xmlWriter.WriteAttributeString("ignored", summaryResults.Ignored.ToString());
-            xmlWriter.WriteAttributeString("skipped", summaryResults.Skipped.ToString());
-            xmlWriter.WriteAttributeString("invalid", summaryResults.NotRunnable.ToString());
-
-			DateTime now = DateTime.Now;
-			xmlWriter.WriteAttributeString("date", XmlConvert.ToString( now, "yyyy-MM-dd" ) );
-			xmlWriter.WriteAttributeString("time", XmlConvert.ToString( now, "HH:mm:ss" ));
-			WriteEnvironment();
-			WriteCultureInfo();
-		}
-
-		private void WriteCultureInfo() {
-			xmlWriter.WriteStartElement("culture-info");
-			xmlWriter.WriteAttributeString("current-culture",
-			                               CultureInfo.CurrentCulture.ToString());
-			xmlWriter.WriteAttributeString("current-uiculture",
-			                               CultureInfo.CurrentUICulture.ToString());
-			xmlWriter.WriteEndElement();
-		}
-
-		private void WriteEnvironment() {
-			xmlWriter.WriteStartElement("environment");
-			xmlWriter.WriteAttributeString("nunit-version", 
-										   Assembly.GetExecutingAssembly().GetName().Version.ToString());
-			xmlWriter.WriteAttributeString("clr-version", 
-			                               Environment.Version.ToString());
-			xmlWriter.WriteAttributeString("os-version",
-			                               Environment.OSVersion.ToString());
-			xmlWriter.WriteAttributeString("platform",
-				Environment.OSVersion.Platform.ToString());
-			xmlWriter.WriteAttributeString("cwd",
-			                               Environment.CurrentDirectory);
-			xmlWriter.WriteAttributeString("machine-name",
-			                               Environment.MachineName);
-			xmlWriter.WriteAttributeString("user",
-			                               Environment.UserName);
-			xmlWriter.WriteAttributeString("user-domain",
-			                               Environment.UserDomainName);
-			xmlWriter.WriteEndElement();
-		}
-
-		#region Public Methods
-		public void SaveTestResult( TestResult result )
-		{
-			InitializeXmlFile( result );
-			WriteResultElement( result );
-			TerminateXmlFile();
-		}
-
-        private void WriteResultElement( TestResult result )
-        {
-			StartTestElement( result );
-
-			WriteCategoriesElement(result);
-			WritePropertiesElement(result);
-
-            switch (result.ResultState)
-            {
-                case ResultState.Ignored:
-                case ResultState.NotRunnable:
-                case ResultState.Skipped:
-                    WriteReasonElement(result);
-                    break;
-
-                case ResultState.Failure:
-                case ResultState.Error:
-                case ResultState.Cancelled:
-                    if (!result.Test.IsSuite || result.FailureSite == FailureSite.SetUp)
-                        WriteFailureElement(result);
-                    break;
-                case ResultState.Success:
-                case ResultState.Inconclusive:
-                    if (result.Message != null)
-                        WriteReasonElement(result);
-                    break;
-            }
-
-			if ( result.HasResults )
-				WriteChildResults( result );
-
-			xmlWriter.WriteEndElement(); // test element
-		}
-
-		private void TerminateXmlFile()
-		{
-			try 
-			{
-				xmlWriter.WriteEndElement(); // test-results
-				xmlWriter.WriteEndDocument();
-				xmlWriter.Flush();
-
-				if ( memoryStream != null && writer != null )
-				{
-					memoryStream.Position = 0;
-					using ( StreamReader rdr = new StreamReader( memoryStream ) )
-					{
-						writer.Write( rdr.ReadToEnd() );
-					}
-				}
-
-				xmlWriter.Close();
-			} 
-			finally 
-			{
-				//writer.Close();
-			}
-		}
-		#endregion
-
-		#region Element Creation Helpers
-		private void StartTestElement(TestResult result)
-		{
-            if (result.Test.IsSuite)
-            {
-                xmlWriter.WriteStartElement("test-suite");
-                xmlWriter.WriteAttributeString("type", result.Test.TestType);
-                xmlWriter.WriteAttributeString("name", result.Name);
-            }
-            else
-            {
-                xmlWriter.WriteStartElement("test-case");
-                xmlWriter.WriteAttributeString("name", result.FullName);
-            }
-
-			if (result.Description != null)
-				xmlWriter.WriteAttributeString("description", result.Description);
-
-			xmlWriter.WriteAttributeString("executed", result.Executed.ToString());
-            xmlWriter.WriteAttributeString("result", result.ResultState.ToString());
-			
-			if ( result.Executed )
-			{
-				xmlWriter.WriteAttributeString("success", result.IsSuccess.ToString());
-				xmlWriter.WriteAttributeString("time", result.Time.ToString("#####0.000", NumberFormatInfo.InvariantInfo));
-				xmlWriter.WriteAttributeString("asserts", result.AssertCount.ToString());
-			}
-		}
-
-		private void WriteCategoriesElement(TestResult result)
-		{
-			if (result.Test.Categories != null && result.Test.Categories.Count > 0)
-			{
-				xmlWriter.WriteStartElement("categories");
-				foreach (string category in result.Test.Categories)
-				{
-					xmlWriter.WriteStartElement("category");
-					xmlWriter.WriteAttributeString("name", category);
-					xmlWriter.WriteEndElement();
-				}
-				xmlWriter.WriteEndElement();
-			}
-		}
-
-		private void WritePropertiesElement(TestResult result)
-		{
-            IDictionary props = result.Test.Properties;
-
-			if (result.Test.Properties != null && props.Count > 0)
-			{
-                int nprops = 0;
-
-				foreach (string key in result.Test.Properties.Keys)
-				{
-                    if ( !key.StartsWith("_") )
-                    {
-                        object val = result.Test.Properties[key];
-                        if (val != null)
-                        {
-                            if ( nprops == 0 )
-                                xmlWriter.WriteStartElement("properties");
-
-                            xmlWriter.WriteStartElement("property");
-                            xmlWriter.WriteAttributeString("name", key);
-                            xmlWriter.WriteAttributeString("value", val.ToString());
-                            xmlWriter.WriteEndElement();
-
-                            ++nprops;
-                        }
-                    }
-				}
-
-                if ( nprops > 0 )
-				    xmlWriter.WriteEndElement();
-			}
-		}
-
-		private void WriteReasonElement(TestResult result)
-		{
-			xmlWriter.WriteStartElement("reason");
-			xmlWriter.WriteStartElement("message");
-			xmlWriter.WriteCData(result.Message);
-			xmlWriter.WriteEndElement();
-			xmlWriter.WriteEndElement();
-		}
-
-		private void WriteFailureElement(TestResult result)
-		{
-			xmlWriter.WriteStartElement("failure");
-
-			xmlWriter.WriteStartElement("message");
-            WriteCData(result.Message);
-			xmlWriter.WriteEndElement();
-
-			xmlWriter.WriteStartElement("stack-trace");
-            if (result.StackTrace != null)
-                WriteCData(StackTraceFilter.Filter(result.StackTrace));
-			xmlWriter.WriteEndElement();
-
-			xmlWriter.WriteEndElement();
-		}
-
-		private void WriteChildResults(TestResult result)
-		{
-			xmlWriter.WriteStartElement("results");
-
-			if ( result.HasResults )
-				foreach (TestResult childResult in result.Results)
-					WriteResultElement( childResult );
-
-			xmlWriter.WriteEndElement();
-		}
-		#endregion
-
-		#region Output Helpers
-		/// <summary>
-		/// Makes string safe for xml parsing, replacing control chars with '?'
-		/// </summary>
-		/// <param name="encodedString">string to make safe</param>
-		/// <returns>xml safe string</returns>
-		private static string CharacterSafeString(string encodedString)
-		{
-			/*The default code page for the system will be used.
-			Since all code pages use the same lower 128 bytes, this should be sufficient
-			for finding uprintable control characters that make the xslt processor error.
-			We use characters encoded by the default code page to avoid mistaking bytes as
-			individual characters on non-latin code pages.*/
-			char[] encodedChars = System.Text.Encoding.Default.GetChars(System.Text.Encoding.Default.GetBytes(encodedString));
-			
-			System.Collections.ArrayList pos = new System.Collections.ArrayList();
-			for(int x = 0 ; x < encodedChars.Length ; x++)
-			{
-				char currentChar = encodedChars[x];
-				//unprintable characters are below 0x20 in Unicode tables
-				//some control characters are acceptable. (carriage return 0x0D, line feed 0x0A, horizontal tab 0x09)
-				if(currentChar < 32 && (currentChar != 9 && currentChar != 10 && currentChar != 13))
-				{
-					//save the array index for later replacement.
-					pos.Add(x);
-				}
-			}
-			foreach(int index in pos)
-			{
-				encodedChars[index] = '?';//replace unprintable control characters with ?(3F)
-			}
-			return System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(encodedChars));
-		}
-
-        private void WriteCData(string text)
-        {
-            int start = 0;
-            while (true)
-            {
-                int illegal = text.IndexOf("]]>", start);
-                if (illegal < 0)
-                    break;
-                xmlWriter.WriteCData(text.Substring(start, illegal - start + 2));
-                start = illegal + 2;
-                if (start >= text.Length)
-                    return;
-            }
-
-            if (start > 0)
-                xmlWriter.WriteCData(text.Substring(start));
-            else
-                xmlWriter.WriteCData(text);
-        }
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Util
+{
+	using System;
+	using System.Globalization;
+	using System.IO;
+	using System.Xml;
+    using System.Collections;
+	using System.Reflection;
+	using NUnit.Core;
+
+	/// <summary>
+	/// Summary description for XmlResultWriter.
+	/// </summary>
+	public class XmlResultWriter
+	{
+		private XmlTextWriter xmlWriter;
+		private TextWriter writer;
+		private MemoryStream memoryStream;
+
+		#region Constructors
+		public XmlResultWriter(string fileName)
+		{
+			xmlWriter = new XmlTextWriter( new StreamWriter(fileName, false, System.Text.Encoding.UTF8) );
+		}
+
+        public XmlResultWriter( TextWriter writer )
+		{
+			this.memoryStream = new MemoryStream();
+			this.writer = writer;
+			this.xmlWriter = new XmlTextWriter( new StreamWriter( memoryStream, System.Text.Encoding.UTF8 ) );
+		}
+		#endregion
+
+		private void InitializeXmlFile(TestResult result) 
+		{
+			ResultSummarizer summaryResults = new ResultSummarizer(result);
+
+			xmlWriter.Formatting = Formatting.Indented;
+			xmlWriter.WriteStartDocument(false);
+			xmlWriter.WriteComment("This file represents the results of running a test suite");
+
+			xmlWriter.WriteStartElement("test-results");
+
+			xmlWriter.WriteAttributeString("name", summaryResults.Name);
+			xmlWriter.WriteAttributeString("total", summaryResults.TestsRun.ToString());
+            xmlWriter.WriteAttributeString("errors", summaryResults.Errors.ToString());
+            xmlWriter.WriteAttributeString("failures", summaryResults.Failures.ToString());
+            xmlWriter.WriteAttributeString("not-run", summaryResults.TestsNotRun.ToString());
+            xmlWriter.WriteAttributeString("inconclusive", summaryResults.Inconclusive.ToString());
+            xmlWriter.WriteAttributeString("ignored", summaryResults.Ignored.ToString());
+            xmlWriter.WriteAttributeString("skipped", summaryResults.Skipped.ToString());
+            xmlWriter.WriteAttributeString("invalid", summaryResults.NotRunnable.ToString());
+
+			DateTime now = DateTime.Now;
+			xmlWriter.WriteAttributeString("date", XmlConvert.ToString( now, "yyyy-MM-dd" ) );
+			xmlWriter.WriteAttributeString("time", XmlConvert.ToString( now, "HH:mm:ss" ));
+			WriteEnvironment();
+			WriteCultureInfo();
+		}
+
+		private void WriteCultureInfo() {
+			xmlWriter.WriteStartElement("culture-info");
+			xmlWriter.WriteAttributeString("current-culture",
+			                               CultureInfo.CurrentCulture.ToString());
+			xmlWriter.WriteAttributeString("current-uiculture",
+			                               CultureInfo.CurrentUICulture.ToString());
+			xmlWriter.WriteEndElement();
+		}
+
+		private void WriteEnvironment() {
+			xmlWriter.WriteStartElement("environment");
+			xmlWriter.WriteAttributeString("nunit-version", 
+										   Assembly.GetExecutingAssembly().GetName().Version.ToString());
+			xmlWriter.WriteAttributeString("clr-version", 
+			                               Environment.Version.ToString());
+			xmlWriter.WriteAttributeString("os-version",
+			                               Environment.OSVersion.ToString());
+			xmlWriter.WriteAttributeString("platform",
+				Environment.OSVersion.Platform.ToString());
+			xmlWriter.WriteAttributeString("cwd",
+			                               Environment.CurrentDirectory);
+			xmlWriter.WriteAttributeString("machine-name",
+			                               Environment.MachineName);
+			xmlWriter.WriteAttributeString("user",
+			                               Environment.UserName);
+			xmlWriter.WriteAttributeString("user-domain",
+			                               Environment.UserDomainName);
+			xmlWriter.WriteEndElement();
+		}
+
+		#region Public Methods
+		public void SaveTestResult( TestResult result )
+		{
+			InitializeXmlFile( result );
+			WriteResultElement( result );
+			TerminateXmlFile();
+		}
+
+        private void WriteResultElement( TestResult result )
+        {
+			StartTestElement( result );
+
+			WriteCategoriesElement(result);
+			WritePropertiesElement(result);
+
+            switch (result.ResultState)
+            {
+                case ResultState.Ignored:
+                case ResultState.NotRunnable:
+                case ResultState.Skipped:
+                    WriteReasonElement(result);
+                    break;
+
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+                    if (!result.Test.IsSuite || result.FailureSite == FailureSite.SetUp)
+                        WriteFailureElement(result);
+                    break;
+                case ResultState.Success:
+                case ResultState.Inconclusive:
+                    if (result.Message != null)
+                        WriteReasonElement(result);
+                    break;
+            }
+
+			if ( result.HasResults )
+				WriteChildResults( result );
+
+			xmlWriter.WriteEndElement(); // test element
+		}
+
+		private void TerminateXmlFile()
+		{
+			try 
+			{
+				xmlWriter.WriteEndElement(); // test-results
+				xmlWriter.WriteEndDocument();
+				xmlWriter.Flush();
+
+				if ( memoryStream != null && writer != null )
+				{
+					memoryStream.Position = 0;
+					using ( StreamReader rdr = new StreamReader( memoryStream ) )
+					{
+						writer.Write( rdr.ReadToEnd() );
+					}
+				}
+
+				xmlWriter.Close();
+			} 
+			finally 
+			{
+				//writer.Close();
+			}
+		}
+		#endregion
+
+		#region Element Creation Helpers
+		private void StartTestElement(TestResult result)
+		{
+            if (result.Test.IsSuite)
+            {
+                xmlWriter.WriteStartElement("test-suite");
+                xmlWriter.WriteAttributeString("type", result.Test.TestType);
+                xmlWriter.WriteAttributeString("name", result.Name);
+            }
+            else
+            {
+                xmlWriter.WriteStartElement("test-case");
+                xmlWriter.WriteAttributeString("name", result.FullName);
+            }
+
+			if (result.Description != null)
+				xmlWriter.WriteAttributeString("description", result.Description);
+
+			xmlWriter.WriteAttributeString("executed", result.Executed.ToString());
+            xmlWriter.WriteAttributeString("result", result.ResultState.ToString());
+			
+			if ( result.Executed )
+			{
+				xmlWriter.WriteAttributeString("success", result.IsSuccess.ToString());
+				xmlWriter.WriteAttributeString("time", result.Time.ToString("#####0.000", NumberFormatInfo.InvariantInfo));
+				xmlWriter.WriteAttributeString("asserts", result.AssertCount.ToString());
+			}
+		}
+
+		private void WriteCategoriesElement(TestResult result)
+		{
+			if (result.Test.Categories != null && result.Test.Categories.Count > 0)
+			{
+				xmlWriter.WriteStartElement("categories");
+				foreach (string category in result.Test.Categories)
+				{
+					xmlWriter.WriteStartElement("category");
+					xmlWriter.WriteAttributeString("name", category);
+					xmlWriter.WriteEndElement();
+				}
+				xmlWriter.WriteEndElement();
+			}
+		}
+
+		private void WritePropertiesElement(TestResult result)
+		{
+            IDictionary props = result.Test.Properties;
+
+			if (result.Test.Properties != null && props.Count > 0)
+			{
+                int nprops = 0;
+
+				foreach (string key in result.Test.Properties.Keys)
+				{
+                    if ( !key.StartsWith("_") )
+                    {
+                        object val = result.Test.Properties[key];
+                        if (val != null)
+                        {
+                            if ( nprops == 0 )
+                                xmlWriter.WriteStartElement("properties");
+
+                            xmlWriter.WriteStartElement("property");
+                            xmlWriter.WriteAttributeString("name", key);
+                            xmlWriter.WriteAttributeString("value", val.ToString());
+                            xmlWriter.WriteEndElement();
+
+                            ++nprops;
+                        }
+                    }
+				}
+
+                if ( nprops > 0 )
+				    xmlWriter.WriteEndElement();
+			}
+		}
+
+		private void WriteReasonElement(TestResult result)
+		{
+			xmlWriter.WriteStartElement("reason");
+			xmlWriter.WriteStartElement("message");
+			xmlWriter.WriteCData(result.Message);
+			xmlWriter.WriteEndElement();
+			xmlWriter.WriteEndElement();
+		}
+
+		private void WriteFailureElement(TestResult result)
+		{
+			xmlWriter.WriteStartElement("failure");
+
+			xmlWriter.WriteStartElement("message");
+            WriteCData(result.Message);
+			xmlWriter.WriteEndElement();
+
+			xmlWriter.WriteStartElement("stack-trace");
+            if (result.StackTrace != null)
+                WriteCData(StackTraceFilter.Filter(result.StackTrace));
+			xmlWriter.WriteEndElement();
+
+			xmlWriter.WriteEndElement();
+		}
+
+		private void WriteChildResults(TestResult result)
+		{
+			xmlWriter.WriteStartElement("results");
+
+			if ( result.HasResults )
+				foreach (TestResult childResult in result.Results)
+					WriteResultElement( childResult );
+
+			xmlWriter.WriteEndElement();
+		}
+		#endregion
+
+		#region Output Helpers
+		/// <summary>
+		/// Makes string safe for xml parsing, replacing control chars with '?'
+		/// </summary>
+		/// <param name="encodedString">string to make safe</param>
+		/// <returns>xml safe string</returns>
+		private static string CharacterSafeString(string encodedString)
+		{
+			/*The default code page for the system will be used.
+			Since all code pages use the same lower 128 bytes, this should be sufficient
+			for finding uprintable control characters that make the xslt processor error.
+			We use characters encoded by the default code page to avoid mistaking bytes as
+			individual characters on non-latin code pages.*/
+			char[] encodedChars = System.Text.Encoding.Default.GetChars(System.Text.Encoding.Default.GetBytes(encodedString));
+			
+			System.Collections.ArrayList pos = new System.Collections.ArrayList();
+			for(int x = 0 ; x < encodedChars.Length ; x++)
+			{
+				char currentChar = encodedChars[x];
+				//unprintable characters are below 0x20 in Unicode tables
+				//some control characters are acceptable. (carriage return 0x0D, line feed 0x0A, horizontal tab 0x09)
+				if(currentChar < 32 && (currentChar != 9 && currentChar != 10 && currentChar != 13))
+				{
+					//save the array index for later replacement.
+					pos.Add(x);
+				}
+			}
+			foreach(int index in pos)
+			{
+				encodedChars[index] = '?';//replace unprintable control characters with ?(3F)
+			}
+			return System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(encodedChars));
+		}
+
+        private void WriteCData(string text)
+        {
+            int start = 0;
+            while (true)
+            {
+                int illegal = text.IndexOf("]]>", start);
+                if (illegal < 0)
+                    break;
+                xmlWriter.WriteCData(text.Substring(start, illegal - start + 2));
+                start = illegal + 2;
+                if (start >= text.Length)
+                    return;
+            }
+
+            if (start > 0)
+                xmlWriter.WriteCData(text.Substring(start));
+            else
+                xmlWriter.WriteCData(text);
+        }
+
+		#endregion
+	}
+}
diff --git a/src/ClientUtilities/util/XmlSettingsStorage.cs b/src/ClientUtilities/util/XmlSettingsStorage.cs
index 89f6f25..8eebe32 100644
--- a/src/ClientUtilities/util/XmlSettingsStorage.cs
+++ b/src/ClientUtilities/util/XmlSettingsStorage.cs
@@ -1,98 +1,98 @@
-// ****************************************************************
-// Copyright 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.Xml;
-using System.Collections;
-using System.ComponentModel;
-
-namespace NUnit.Util
-{
-	/// <summary>
-	/// Summary description for XmlSettingsStorage.
-	/// </summary>
-	public class XmlSettingsStorage : MemorySettingsStorage
-	{
-		private string filePath;
-        private bool writeable;
-
-        public XmlSettingsStorage(string filePath) : this(filePath, true) { }
-
-		public XmlSettingsStorage( string filePath, bool writeable )
-		{
-            this.filePath = filePath;
-            this.writeable = writeable;
-		}
-
-		public override void LoadSettings()
-		{
-			FileInfo info = new FileInfo(filePath);
-			if ( !info.Exists || info.Length == 0 )
-				return;
-
-			try
-			{
-				XmlDocument doc = new XmlDocument();
-				doc.Load( filePath );
-
-				foreach( XmlElement element in doc.DocumentElement["Settings"].ChildNodes )
-				{
-					if ( element.Name != "Setting" )
-						throw new ApplicationException( "Unknown element in settings file: " + element.Name );
-
-					if ( !element.HasAttribute( "name" ) )
-						throw new ApplicationException( "Setting must have 'name' attribute" );
-
-					if ( !element.HasAttribute( "value" ) )
-						throw new ApplicationException( "Setting must have 'value' attribute" );
-
-					settings[ element.GetAttribute( "name" ) ] = element.GetAttribute( "value" );
-				}
-			}
-			catch( Exception ex )
-			{
-				throw new ApplicationException( "Error loading settings file", ex );
-			}
-		}
-
-		public override void SaveSettings()
-		{
-            if (!this.writeable)
-                throw new InvalidOperationException("Attempted to write to a non-writeable Settings Storage");
-
-			string dirPath = Path.GetDirectoryName( filePath );
-			if ( !Directory.Exists( dirPath ) )
-				Directory.CreateDirectory( dirPath );
-
-			XmlTextWriter writer = new XmlTextWriter(  filePath, System.Text.Encoding.UTF8 );
-			writer.Formatting = Formatting.Indented;
-
-			writer.WriteProcessingInstruction( "xml", "version=\"1.0\"" );
-			writer.WriteStartElement( "NUnitSettings" );
-			writer.WriteStartElement( "Settings" );
-
-			ArrayList keys = new ArrayList( settings.Keys );
-			keys.Sort();
-
-			foreach( string name in keys )
-			{
-				object val = settings[name];
-				if ( val != null )
-				{
-					writer.WriteStartElement( "Setting");
-					writer.WriteAttributeString( "name", name );
-					writer.WriteAttributeString( "value", val.ToString() );
-					writer.WriteEndElement();
-				}
-			}
-
-			writer.WriteEndElement();
-			writer.WriteEndElement();
-			writer.Close();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Xml;
+using System.Collections;
+using System.ComponentModel;
+
+namespace NUnit.Util
+{
+	/// <summary>
+	/// Summary description for XmlSettingsStorage.
+	/// </summary>
+	public class XmlSettingsStorage : MemorySettingsStorage
+	{
+		private string filePath;
+        private bool writeable;
+
+        public XmlSettingsStorage(string filePath) : this(filePath, true) { }
+
+		public XmlSettingsStorage( string filePath, bool writeable )
+		{
+            this.filePath = filePath;
+            this.writeable = writeable;
+		}
+
+		public override void LoadSettings()
+		{
+			FileInfo info = new FileInfo(filePath);
+			if ( !info.Exists || info.Length == 0 )
+				return;
+
+			try
+			{
+				XmlDocument doc = new XmlDocument();
+				doc.Load( filePath );
+
+				foreach( XmlElement element in doc.DocumentElement["Settings"].ChildNodes )
+				{
+					if ( element.Name != "Setting" )
+						throw new ApplicationException( "Unknown element in settings file: " + element.Name );
+
+					if ( !element.HasAttribute( "name" ) )
+						throw new ApplicationException( "Setting must have 'name' attribute" );
+
+					if ( !element.HasAttribute( "value" ) )
+						throw new ApplicationException( "Setting must have 'value' attribute" );
+
+					settings[ element.GetAttribute( "name" ) ] = element.GetAttribute( "value" );
+				}
+			}
+			catch( Exception ex )
+			{
+				throw new ApplicationException( "Error loading settings file", ex );
+			}
+		}
+
+		public override void SaveSettings()
+		{
+            if (!this.writeable)
+                throw new InvalidOperationException("Attempted to write to a non-writeable Settings Storage");
+
+			string dirPath = Path.GetDirectoryName( filePath );
+			if ( !Directory.Exists( dirPath ) )
+				Directory.CreateDirectory( dirPath );
+
+			XmlTextWriter writer = new XmlTextWriter(  filePath, System.Text.Encoding.UTF8 );
+			writer.Formatting = Formatting.Indented;
+
+			writer.WriteProcessingInstruction( "xml", "version=\"1.0\"" );
+			writer.WriteStartElement( "NUnitSettings" );
+			writer.WriteStartElement( "Settings" );
+
+			ArrayList keys = new ArrayList( settings.Keys );
+			keys.Sort();
+
+			foreach( string name in keys )
+			{
+				object val = settings[name];
+				if ( val != null )
+				{
+					writer.WriteStartElement( "Setting");
+					writer.WriteAttributeString( "name", name );
+					writer.WriteAttributeString( "value", val.ToString() );
+					writer.WriteEndElement();
+				}
+			}
+
+			writer.WriteEndElement();
+			writer.WriteEndElement();
+			writer.Close();
+		}
+	}
+}
diff --git a/src/ClientUtilities/util/nunit.util.build b/src/ClientUtilities/util/nunit.util.build
index 32286cb..1d336c5 100644
--- a/src/ClientUtilities/util/nunit.util.build
+++ b/src/ClientUtilities/util/nunit.util.build
@@ -1,112 +1,112 @@
-<?xml version="1.0"?>
-<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" 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">
-    <include name="Transform.resx"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.lib.dir}/nunit.util.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618"/>
-        <warning number="1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <resources prefix="NUnit.Util">
-        <patternset refid="resource-files"/>
-      </resources>
-      <references>
-        <include name="System.Runtime.Remoting.dll"/>
-        <include name="System.Configuration.dll"/>
-        <include name="System.Drawing.dll"/>
-	<include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-      </references>
-    </csc>
-  </target>
-  
-  <target name="package">
-    <copy todir="${package.src.dir}/ClientUtilities/util">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <include name="nunit.util.dll.csproj"/>
-        <include name="nunit.util.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<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" 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">
+    <include name="Transform.resx"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.lib.dir}/nunit.util.dll"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="618"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <resources prefix="NUnit.Util">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="System.Configuration.dll"/>
+        <include name="System.Drawing.dll"/>
+	<include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+      </references>
+    </csc>
+  </target>
+  
+  <target name="package">
+    <copy todir="${package.src.dir}/ClientUtilities/util">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.util.dll.csproj"/>
+        <include name="nunit.util.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/ClientUtilities/util/nunit.util.dll.csproj b/src/ClientUtilities/util/nunit.util.dll.csproj
index 66950a3..c328f03 100644
--- a/src/ClientUtilities/util/nunit.util.dll.csproj
+++ b/src/ClientUtilities/util/nunit.util.dll.csproj
@@ -1,177 +1,211 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{61CE9CE5-943E-44D4-A381-814DC1406767}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.util</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Util</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;NET_2_0;CLR_2_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;NET_2_0;CLR_2_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Runtime.Remoting">
-      <Name>System.Runtime.Remoting</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <Reference Include="System.Configuration" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AggregatingTestRunner.cs" />
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="AssemblyList.cs" />
-    <Compile Include="AssemblyWatcher.cs">
-    </Compile>
-    <Compile Include="CategoryExpression.cs" />
-    <Compile Include="CategoryManager.cs" />
-    <Compile Include="CommandLineOptions.cs" />
-    <Compile Include="ConsoleWriter.cs" />
-    <Compile Include="DefaultTestRunnerFactory.cs" />
-    <Compile Include="Extensibility\IProjectConverter.cs" />
-    <Compile Include="Extensibility\ProjectConverterCollection.cs" />
-    <Compile Include="FileWatcher.cs">
-    </Compile>
-    <Compile Include="Guard.cs" />
-    <Compile Include="IAssemblyWatcher.cs" />
-    <Compile Include="InProcessTestRunnerFactory.cs" />
-    <Compile Include="Interfaces\IRuntimeFrameworkSelector.cs" />
-    <Compile Include="Interfaces\ISettings.cs" />
-    <Compile Include="Interfaces\ITestEvents.cs" />
-    <Compile Include="Interfaces\ITestLoader.cs" />
-    <Compile Include="Interfaces\ITestRunnerFactory.cs" />
-    <Compile Include="MemorySettingsStorage.cs" />
-    <Compile Include="NUnitProject.cs" />
-    <Compile Include="NUnitRegistry.cs" />
-    <Compile Include="PathUtils.cs" />
-    <Compile Include="ProcessRunner.cs" />
-    <Compile Include="ProjectConfig.cs" />
-    <Compile Include="ProjectConfigCollection.cs" />
-    <Compile Include="ProjectConverters\VisualStudioConverter.cs" />
-    <Compile Include="ProjectFormatException.cs" />
-    <Compile Include="RecentFileEntry.cs" />
-    <Compile Include="RecentFiles.cs" />
-    <Compile Include="RecentFilesCollection.cs" />
-    <Compile Include="RegistrySettingsStorage.cs" />
-    <Compile Include="RemoteTestAgent.cs" />
-    <Compile Include="ResultSummarizer.cs" />
-    <Compile Include="RuntimeFrameworkSelector.cs" />
-    <Compile Include="ServerBase.cs" />
-    <Compile Include="ServerUtilities.cs" />
-    <Compile Include="Services.cs" />
-    <Compile Include="Services\AddinManager.cs" />
-    <Compile Include="Services\AddinRegistry.cs" />
-    <Compile Include="Services\DomainManager.cs" />
-    <Compile Include="Services\ProjectService.cs" />
-    <Compile Include="Services\RecentFilesService.cs" />
-    <Compile Include="Services\ServiceManager.cs" />
-    <Compile Include="Services\SettingsService.cs" />
-    <Compile Include="Services\TestAgency.cs" />
-    <Compile Include="SettingsGroup.cs" />
-    <Compile Include="SettingsStorage.cs" />
-    <Compile Include="StackTraceFilter.cs" />
-    <Compile Include="TestDomain.cs" />
-    <Compile Include="TestEventArgs.cs" />
-    <Compile Include="TestEventDispatcher.cs" />
-    <Compile Include="TestExceptionHandler.cs" />
-    <Compile Include="TestLabelLevel.cs" />
-    <Compile Include="TestLoader.cs" />
-    <Compile Include="TestObserver.cs" />
-    <Compile Include="TestResultItem.cs" />
-    <Compile Include="TestServer.cs" />
-    <Compile Include="VSProject.cs" />
-    <Compile Include="VSProjectConfig.cs" />
-    <Compile Include="VSProjectConfigCollection.cs" />
-    <Compile Include="XmlResultTransform.cs" />
-    <Compile Include="XmlResultWriter.cs" />
-    <Compile Include="XmlSettingsStorage.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Transform.resx">
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.util.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{61CE9CE5-943E-44D4-A381-814DC1406767}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.util</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Util</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET_2_0;CLR_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET_2_0;CLR_2_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <Reference Include="System.Configuration" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AggregatingTestRunner.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="AssemblyList.cs" />
+    <Compile Include="AssemblyWatcher.cs">
+    </Compile>
+    <Compile Include="CategoryExpression.cs" />
+    <Compile Include="CategoryManager.cs" />
+    <Compile Include="CommandLineOptions.cs" />
+    <Compile Include="ConsoleWriter.cs" />
+    <Compile Include="DefaultTestRunnerFactory.cs" />
+    <Compile Include="Extensibility\IProjectConverter.cs" />
+    <Compile Include="Extensibility\ProjectConverterCollection.cs" />
+    <Compile Include="FileWatcher.cs">
+    </Compile>
+    <Compile Include="Guard.cs" />
+    <Compile Include="IAssemblyWatcher.cs" />
+    <Compile Include="InProcessTestRunnerFactory.cs" />
+    <Compile Include="Interfaces\IRuntimeFrameworkSelector.cs" />
+    <Compile Include="Interfaces\ISettings.cs" />
+    <Compile Include="Interfaces\ITestEvents.cs" />
+    <Compile Include="Interfaces\ITestLoader.cs" />
+    <Compile Include="Interfaces\ITestRunnerFactory.cs" />
+    <Compile Include="MemorySettingsStorage.cs" />
+    <Compile Include="NUnitProject.cs" />
+    <Compile Include="NUnitRegistry.cs" />
+    <Compile Include="PathUtils.cs" />
+    <Compile Include="ProcessRunner.cs" />
+    <Compile Include="ProjectConfig.cs" />
+    <Compile Include="ProjectConfigCollection.cs" />
+    <Compile Include="ProjectConverters\VisualStudioConverter.cs" />
+    <Compile Include="ProjectFormatException.cs" />
+    <Compile Include="RecentFileEntry.cs" />
+    <Compile Include="RecentFiles.cs" />
+    <Compile Include="RecentFilesCollection.cs" />
+    <Compile Include="RegistrySettingsStorage.cs" />
+    <Compile Include="RemoteTestAgent.cs" />
+    <Compile Include="ResultSummarizer.cs" />
+    <Compile Include="RuntimeFrameworkSelector.cs" />
+    <Compile Include="ServerBase.cs" />
+    <Compile Include="ServerUtilities.cs" />
+    <Compile Include="Services.cs" />
+    <Compile Include="Services\AddinManager.cs" />
+    <Compile Include="Services\AddinRegistry.cs" />
+    <Compile Include="Services\DomainManager.cs" />
+    <Compile Include="Services\ProjectService.cs" />
+    <Compile Include="Services\RecentFilesService.cs" />
+    <Compile Include="Services\ServiceManager.cs" />
+    <Compile Include="Services\SettingsService.cs" />
+    <Compile Include="Services\TestAgency.cs" />
+    <Compile Include="SettingsGroup.cs" />
+    <Compile Include="SettingsStorage.cs" />
+    <Compile Include="StackTraceFilter.cs" />
+    <Compile Include="TestDomain.cs" />
+    <Compile Include="TestEventArgs.cs" />
+    <Compile Include="TestEventDispatcher.cs" />
+    <Compile Include="TestExceptionHandler.cs" />
+    <Compile Include="TestLabelLevel.cs" />
+    <Compile Include="TestLoader.cs" />
+    <Compile Include="TestObserver.cs" />
+    <Compile Include="TestResultItem.cs" />
+    <Compile Include="TestServer.cs" />
+    <Compile Include="VSProject.cs" />
+    <Compile Include="VSProjectConfig.cs" />
+    <Compile Include="VSProjectConfigCollection.cs" />
+    <Compile Include="XmlResultTransform.cs" />
+    <Compile Include="XmlResultWriter.cs" />
+    <Compile Include="XmlSettingsStorage.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Transform.resx">
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.util.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/CommonAssemblyInfo.cs b/src/CommonAssemblyInfo.cs
index ebc62e5..35a6cf6 100644
--- a/src/CommonAssemblyInfo.cs
+++ b/src/CommonAssemblyInfo.cs
@@ -1,34 +1,34 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-//
-// Common Information about all NUnit assemblies is controlled through the following 
-// set of attributes. Change these source values to modify the information
-// associated with an assembly. 
-//
-// NOTE: This file is only used in the Visual Studio builds. For the NAnt builds,
-// an alternate file is generated and used.
-//
-[assembly: AssemblyCompany("NUnit.org")]
-[assembly: AssemblyProduct("NUnit")]
-[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")]
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("2.6.0")]
-[assembly: AssemblyInformationalVersion("2.6.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.Reflection;
+
+//
+// Common Information about all NUnit assemblies is controlled through the following 
+// set of attributes. Change these source values to modify the information
+// associated with an assembly. 
+//
+// NOTE: This file is only used in the Visual Studio builds. For the NAnt builds,
+// an alternate file is generated and used.
+//
+[assembly: AssemblyCompany("NUnit.org")]
+[assembly: AssemblyProduct("NUnit")]
+[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")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("2.6.3")]
+[assembly: AssemblyInformationalVersion("2.6.3")]
diff --git a/src/ConsoleRunner/nunit-console-exe/App.config b/src/ConsoleRunner/nunit-console-exe/App.config
index 3a2afb3..81e5346 100644
--- a/src/ConsoleRunner/nunit-console-exe/App.config
+++ b/src/ConsoleRunner/nunit-console-exe/App.config
@@ -1,31 +1,24 @@
-<?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>
-    <!-- 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>
-
-  </runtime>
-  
-</configuration>
\ No newline at end of file
+<?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 -->
+	</startup>
+	<runtime>
+		<!-- 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>
+	</runtime>
+</configuration>
diff --git a/src/ConsoleRunner/nunit-console-exe/App.v1.config b/src/ConsoleRunner/nunit-console-exe/App.v1.config
index 09e2a8f..8d62e6c 100644
--- a/src/ConsoleRunner/nunit-console-exe/App.v1.config
+++ b/src/ConsoleRunner/nunit-console-exe/App.v1.config
@@ -1,74 +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>
-  
+<?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/AssemblyInfo.cs b/src/ConsoleRunner/nunit-console-exe/AssemblyInfo.cs
index 5f1ae5e..faabeca 100644
--- a/src/ConsoleRunner/nunit-console-exe/AssemblyInfo.cs
+++ b/src/ConsoleRunner/nunit-console-exe/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: AssemblyTitle("NUnit-Console")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+[assembly: AssemblyTitle("NUnit-Console")]
 [assembly: AssemblyDescription("")]
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console-exe/Class1.cs b/src/ConsoleRunner/nunit-console-exe/Class1.cs
index 556a696..99a1ba0 100644
--- a/src/ConsoleRunner/nunit-console-exe/Class1.cs
+++ b/src/ConsoleRunner/nunit-console-exe/Class1.cs
@@ -1,26 +1,26 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-
-namespace NUnit.ConsoleRunner
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	class Class1
-	{
-		/// <summary>
-		/// The main entry point for the application.
-		/// </summary>
-		[STAThread]
-		public static int Main(string[] args)
-		{
-            return Runner.Main(args);
-        }
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+
+namespace NUnit.ConsoleRunner
+{
+	/// <summary>
+	/// Summary description for Class1.
+	/// </summary>
+	class Class1
+	{
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		public static int Main(string[] args)
+		{
+            return Runner.Main(args);
+        }
+	}
+}
diff --git a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
index 2e6222e..c954c26 100644
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
+++ b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.build
@@ -1,61 +1,61 @@
-<?xml version="1.0"?>
-<project name="NUnit-Console" default="build">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="Class1.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="exe" 
-        output="${current.build.dir}/nunit-console.exe"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-	  <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.lib.dir}">
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit-console-runner.dll"/>
-      </references>
-    </csc>
-
-    <copy file="App.config" if="${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="${runtime.version >= '2.0'}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.lib.dir}">
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-        <include name="nunit-console-runner.dll"/>
-      </references>
-    </csc>
-
-    <copy file="App.config" if="${runtime.version >= '2.0'}"
-      tofile="${current.build.dir}/nunit-console-x86.exe.config"/>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/ConsoleRunner/nunit-console-exe">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="App.config"/>
-        <include name="App.v1.config"/>
-        <include name="App.ico"/>
-        <include name="nunit-console.exe.csproj"/>
-        <include name="nunit-console.exe.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnit-Console" default="build">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Class1.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="exe" 
+        output="${current.build.dir}/nunit-console.exe"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+	      <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+        <include name="nunit-console-runner.dll"/>
+      </references>
+    </csc>
+
+    <copy file="App.config" if="${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="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+        <include name="nunit-console-runner.dll"/>
+      </references>
+    </csc>
+
+    <copy file="App.config" if="${runtime.version >= '2.0'}"
+      tofile="${current.build.dir}/nunit-console-x86.exe.config"/>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/ConsoleRunner/nunit-console-exe">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="App.config"/>
+        <include name="App.v1.config"/>
+        <include name="App.ico"/>
+        <include name="nunit-console.exe.csproj"/>
+        <include name="nunit-console.exe.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
index aca663c..c2aa3e8 100644
--- a/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
+++ b/src/ConsoleRunner/nunit-console-exe/nunit-console.exe.csproj
@@ -1,107 +1,141 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-console</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Exe</OutputType>
-    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <NoWin32Manifest>true</NoWin32Manifest>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
-    <Externalconsole>true</Externalconsole>
-    <Commandlineparameters>../../NUnitTests.nunit</Commandlineparameters>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-console\nunit-console.csproj">
-      <Name>nunit-console</Name>
-      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </None>
-    <None Include="nunit-console.exe.build" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="Class1.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="App.ico" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{53BF8787-CB9C-4BB8-AFB4-605DD3A5CA0E}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-console</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <Externalconsole>true</Externalconsole>
+    <Commandlineparameters>../../NUnitTests.nunit</Commandlineparameters>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-console\nunit-console.csproj">
+      <Name>nunit-console</Name>
+      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="nunit-console.exe.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Class1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console/AssemblyInfo.cs b/src/ConsoleRunner/nunit-console/AssemblyInfo.cs
index 4835bf6..a676cbf 100644
--- a/src/ConsoleRunner/nunit-console/AssemblyInfo.cs
+++ b/src/ConsoleRunner/nunit-console/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/ConsoleRunner/nunit-console/ConsoleOptions.cs b/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
index b692fcb..655a6df 100644
--- a/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
+++ b/src/ConsoleRunner/nunit-console/ConsoleOptions.cs
@@ -1,146 +1,152 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.ConsoleRunner
-{
-	using System;
-	using Codeblast;
-	using NUnit.Util;
-    using NUnit.Core;
-
-	public class ConsoleOptions : CommandLineOptions
-	{
-		[Option(Short="load", Description = "Test fixture or namespace to be loaded (Deprecated)")]
-		public string fixture;
-
-		[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(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;
-
-        [Option(Description = "Set internal trace level: Off, Error, Warning, Info, Verbose")]
-        public InternalTraceLevel trace;
-
-		[Option(Description = "List of categories to include")]
-		public string include;
-
-		[Option(Description = "List of categories to exclude")]
-		public string exclude;
-
-#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 = "Apartment for running tests: MTA (Default), STA")]
-        public System.Threading.ApartmentState apartment;
-
-        [Option(Description = "Disable shadow copy when running in separate domain")]
-		public bool noshadow;
-
-		[Option (Description = "Disable use of a separate thread for tests")]
-		public bool nothread;
-
-        [Option(Description = "Set timeout for each test case in milliseconds")]
-        public int timeout;
-
-		[Option(Description = "Wait for input before closing console window")]
-		public bool wait = false;
-
-		[Option(Description = "Do not display the logo")]
-		public bool nologo = false;
-
-		[Option(Description = "Do not display progress" )]
-		public bool nodots = false;
-
-        [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 ) {}
-
-		public ConsoleOptions( bool allowForwardSlash, params string[] args ) : base( allowForwardSlash, args ) {}
-
-		public bool Validate()
-		{
-			if(isInvalid) return false; 
-
-			if(NoArgs) return true; 
-
-			if(ParameterCount >= 1) return true; 
-
-			return false;
-		}
-
-//		protected override bool IsValidParameter(string parm)
-//		{
-//			return Services.ProjectLoadService.CanLoadProject( parm ) || PathUtils.IsAssemblyFileType( parm );
-//		}
-
-
-        public bool IsTestProject
-        {
-            get
-            {
-                return ParameterCount == 1 && Services.ProjectService.CanLoadProject((string)Parameters[0]);
-            }
-        }
-
-		public override void Help()
-		{
-			Console.WriteLine();
-			Console.WriteLine( "NUNIT-CONSOLE [inputfiles] [options]" );
-			Console.WriteLine();
-			Console.WriteLine( "Runs a set of NUnit tests from the console." );
-			Console.WriteLine();
-			Console.WriteLine( "You may specify one or more assemblies or a single" );
-			Console.WriteLine( "project file of type .nunit." );
-			Console.WriteLine();
-			Console.WriteLine( "Options:" );
-			base.Help();
-			Console.WriteLine();
-			Console.WriteLine( "Options that take values may use an equal sign, a colon" );
-			Console.WriteLine( "or a space to separate the option from its value." );
-			Console.WriteLine();
-		}
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.ConsoleRunner
+{
+	using System;
+	using Codeblast;
+	using NUnit.Util;
+    using NUnit.Core;
+
+	public class ConsoleOptions : CommandLineOptions
+	{
+		[Option(Short="load", Description = "Test fixture or namespace to be loaded (Deprecated)")]
+		public string fixture;
+
+		[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, one per line")]
+        public string runlist;
+
+		[Option(Description = "Project configuration (e.g.: Debug) to load")]
+		public string config;
+
+		[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;
+
+        [Option(Description = "Set internal trace level: Off, Error, Warning, Info, Verbose")]
+        public InternalTraceLevel trace;
+
+		[Option(Description = "List of categories to include")]
+		public string include;
+
+		[Option(Description = "List of categories to exclude")]
+		public string exclude;
+
+#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 = "Apartment for running tests: MTA (Default), STA")]
+        public System.Threading.ApartmentState apartment = System.Threading.ApartmentState.Unknown;
+
+        [Option(Description = "Disable shadow copy when running in separate domain")]
+		public bool noshadow;
+
+		[Option (Description = "Disable use of a separate thread for tests")]
+		public bool nothread;
+
+		[Option(Description = "Base path to be used when loading the assemblies")]
+ 		public string basepath;
+ 
+ 		[Option(Description = "Additional directories to be probed when loading assemblies, separated by semicolons")]
+ 		public string privatebinpath;
+
+        [Option(Description = "Set timeout for each test case in milliseconds")]
+        public int timeout;
+
+		[Option(Description = "Wait for input before closing console window")]
+		public bool wait = false;
+
+		[Option(Description = "Do not display the logo")]
+		public bool nologo = false;
+
+		[Option(Description = "Do not display progress" )]
+		public bool nodots = false;
+
+        [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 ) {}
+
+		public ConsoleOptions( bool allowForwardSlash, params string[] args ) : base( allowForwardSlash, args ) {}
+
+		public bool Validate()
+		{
+			if(isInvalid) return false; 
+
+			if(NoArgs) return true; 
+
+			if(ParameterCount >= 1) return true; 
+
+			return false;
+		}
+
+//		protected override bool IsValidParameter(string parm)
+//		{
+//			return Services.ProjectLoadService.CanLoadProject( parm ) || PathUtils.IsAssemblyFileType( parm );
+//		}
+
+
+        public bool IsTestProject
+        {
+            get
+            {
+                return ParameterCount == 1 && Services.ProjectService.CanLoadProject((string)Parameters[0]);
+            }
+        }
+
+		public override void Help()
+		{
+			Console.WriteLine();
+			Console.WriteLine( "NUNIT-CONSOLE [inputfiles] [options]" );
+			Console.WriteLine();
+			Console.WriteLine( "Runs a set of NUnit tests from the console." );
+			Console.WriteLine();
+			Console.WriteLine( "You may specify one or more assemblies or a single" );
+			Console.WriteLine( "project file of type .nunit." );
+			Console.WriteLine();
+			Console.WriteLine( "Options:" );
+			base.Help();
+			Console.WriteLine();
+			Console.WriteLine( "Options that take values may use an equal sign, a colon" );
+			Console.WriteLine( "or a space to separate the option from its value." );
+			Console.WriteLine();
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console/ConsoleUi.cs b/src/ConsoleRunner/nunit-console/ConsoleUi.cs
index cf25140..4ceab5f 100644
--- a/src/ConsoleRunner/nunit-console/ConsoleUi.cs
+++ b/src/ConsoleRunner/nunit-console/ConsoleUi.cs
@@ -1,404 +1,446 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.ConsoleRunner
-{
-	using System;
-	using System.IO;
-	using System.Reflection;
-	using System.Xml;
-	using System.Resources;
-	using System.Text;
-	using NUnit.Core;
-	using NUnit.Core.Filters;
-	using NUnit.Util;
-	
-	/// <summary>
-	/// Summary description for ConsoleUi.
-	/// </summary>
-	public class ConsoleUi
-	{
-		public static readonly int OK = 0;
-		public static readonly int INVALID_ARG = -1;
-		public static readonly int FILE_NOT_FOUND = -2;
-		public static readonly int FIXTURE_NOT_FOUND = -3;
-		public static readonly int 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( Path.Combine(workDir, options.output) );
-				outStreamWriter.AutoFlush = true;
-				outWriter = outStreamWriter;
-			}
-
-			TextWriter errorWriter = Console.Error;
-			bool redirectError = options.err != null && options.err != string.Empty;
-			if ( redirectError )
-			{
-				StreamWriter errorStreamWriter = new StreamWriter( Path.Combine(workDir, options.err) );
-				errorStreamWriter.AutoFlush = true;
-				errorWriter = errorStreamWriter;
-			}
-
-            TestPackage package = MakeTestPackage(options);
-
-            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);
-
-            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))
-			{
-                testRunner.Load(package);
-
-                if (testRunner.Test == null)
-				{
-					testRunner.Unload();
-					Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture);
-					return FIXTURE_NOT_FOUND;
-				}
-
-				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 );
-                    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 )
-				{
-					TestFilter includeFilter = new CategoryExpression( options.include ).Filter;
-                    Console.WriteLine("Included categories: " + includeFilter.ToString());
-
-                    if (testFilter.IsEmpty)
-						testFilter = includeFilter;
-					else
-						testFilter = new AndFilter( testFilter, includeFilter );
-				}
-
-				if ( options.exclude != null && options.exclude != string.Empty )
-				{
-					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 )
-						((AndFilter)testFilter).Add( excludeFilter );
-					else
-						testFilter = new AndFilter( testFilter, excludeFilter );
-				}
-
-                if (testFilter is NotFilter)
-                    ((NotFilter)testFilter).TopLevel = true;
-
-				TestResult result = null;
-				string savedDirectory = Environment.CurrentDirectory;
-				TextWriter savedOut = Console.Out;
-				TextWriter savedError = Console.Error;
-
-				try
-				{
-					result = testRunner.Run( collector, testFilter, false, LoggingThreshold.Off );
-				}
-				finally
-				{
-					outWriter.Flush();
-					errorWriter.Flush();
-
-					if ( redirectOutput )
-						outWriter.Close();
-					if ( redirectError )
-						errorWriter.Close();
-
-					Environment.CurrentDirectory = savedDirectory;
-					Console.SetOut( savedOut );
-					Console.SetError( savedError );
-				}
-
-				Console.WriteLine();
-
-                int returnCode = UNEXPECTED_ERROR;
-
-                if (result != null)
-                {
-                    string xmlOutput = CreateXmlOutput(result);
-                    ResultSummarizer summary = new ResultSummarizer(result);
-
-                    if (options.xmlConsole)
-                    {
-                        Console.WriteLine(xmlOutput);
-                    }
-                    else
-                    {
-                        WriteSummaryReport(summary);
-                        if (summary.ErrorsAndFailures > 0 || result.IsError || result.IsFailure)
-                        {
-                            if (options.stoponerror)
-                            {
-                                Console.WriteLine("Test run was stopped after first error, as requested.");
-                                Console.WriteLine();
-                            }
-
-                            WriteErrorsAndFailuresReport(result);
-                        }
-                        if (summary.TestsNotRun > 0)
-                            WriteNotRunReport(result);
-
-                        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;
-                }
-
-				if ( collector.HasExceptions )
-				{
-					collector.WriteExceptions();
-					returnCode = UNEXPECTED_ERROR;
-				}
-            
-				return returnCode;
-			}
-		}
-
-		#region Helper Methods
-        // TODO: See if this can be unified with the Gui's MakeTestPackage
-        private TestPackage MakeTestPackage( ConsoleOptions options )
-        {
-			TestPackage package;
-			DomainUsage domainUsage = DomainUsage.Default;
-            ProcessModel processModel = ProcessModel.Default;
-            RuntimeFramework framework = null;
-
-            string[] parameters = new string[options.ParameterCount];
-            for (int i = 0; i < options.ParameterCount; i++)
-                parameters[i] = Path.GetFullPath((string)options.Parameters[i]);
-
-			if (options.IsTestProject)
-			{
-				NUnitProject project = 
-					Services.ProjectService.LoadProject(parameters[0]);
-
-				string configName = options.config;
-				if (configName != null)
-					project.SetActiveConfig(configName);
-
-				package = project.ActiveConfig.MakeTestPackage();
-                processModel = project.ProcessModel;
-                domainUsage = project.DomainUsage;
-                framework = project.ActiveConfig.RuntimeFramework;
-			}
-			else if (parameters.Length == 1)
-			{
-                package = new TestPackage(parameters[0]);
-				domainUsage = DomainUsage.Single;
-			}
-			else
-			{
-                // TODO: Figure out a better way to handle "anonymous" packages
-				package = new TestPackage(null, parameters);
-                package.AutoBinPath = true;
-				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;
-
-			package.TestName = options.fixture;
-            
-            package.Settings["ProcessModel"] = processModel;
-            package.Settings["DomainUsage"] = domainUsage;
-            if (framework != null)
-                package.Settings["RuntimeFramework"] = framework;
-
-            
-
-            if (domainUsage == DomainUsage.None)
-            {
-                // Make sure that addins are available
-                CoreExtensions.Host.AddinRegistry = Services.AddinRegistry;
-            }
-
-            package.Settings["ShadowCopyFiles"] = !options.noshadow;
-			package.Settings["UseThreadedRunner"] = !options.nothread;
-            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;
-		}
-
-		private static string CreateXmlOutput( TestResult result )
-		{
-			StringBuilder builder = new StringBuilder();
-			new XmlResultWriter(new StringWriter( builder )).SaveTestResult(result);
-
-			return builder.ToString();
-		}
-
-		private static void WriteSummaryReport( ResultSummarizer summary )
-		{
-            Console.WriteLine(
-                "Tests run: {0}, Errors: {1}, Failures: {2}, Inconclusive: {3}, Time: {4} seconds",
-                summary.TestsRun, summary.Errors, summary.Failures, summary.Inconclusive, summary.Time);
-            Console.WriteLine(
-                "  Not run: {0}, Invalid: {1}, Ignored: {2}, Skipped: {3}",
-                summary.TestsNotRun, summary.NotRunnable, summary.Ignored, summary.Skipped);
-            Console.WriteLine();
-        }
-
-        private void WriteErrorsAndFailuresReport(TestResult result)
-        {
-            reportIndex = 0;
-            Console.WriteLine("Errors and Failures:");
-            WriteErrorsAndFailures(result);
-            Console.WriteLine();
-        }
-
-        private void WriteErrorsAndFailures(TestResult result)
-        {
-            if (result.Executed)
-            {
-                if (result.HasResults)
-                {
-                    if (result.IsFailure || result.IsError)
-                        if (result.FailureSite == FailureSite.SetUp || result.FailureSite == FailureSite.TearDown)
-                            WriteSingleResult(result);
-
-                    foreach (TestResult childResult in result.Results)
-                        WriteErrorsAndFailures(childResult);
-                }
-                else if (result.IsFailure || result.IsError)
-                {
-                    WriteSingleResult(result);
-                }
-            }
-        }
-
-        private void WriteNotRunReport(TestResult result)
-        {
-	        reportIndex = 0;
-            Console.WriteLine("Tests Not Run:");
-	        WriteNotRunResults(result);
-            Console.WriteLine();
-        }
-
-	    private int reportIndex = 0;
-        private void WriteNotRunResults(TestResult result)
-        {
-            if (result.HasResults)
-                foreach (TestResult childResult in result.Results)
-                    WriteNotRunResults(childResult);
-            else if (!result.Executed)
-                WriteSingleResult( result );
-        }
-
-        private void WriteSingleResult( TestResult result )
-        {
-            string status = result.IsFailure || result.IsError
-                ? string.Format("{0} {1}", result.FailureSite, result.ResultState)
-                : result.ResultState.ToString();
-
-            Console.WriteLine("{0}) {1} : {2}", ++reportIndex, status, result.FullName);
-
-            if ( result.Message != null && result.Message != string.Empty )
-                 Console.WriteLine("   {0}", result.Message);
-
-            if (result.StackTrace != null && result.StackTrace != string.Empty)
-                Console.WriteLine( result.IsFailure
-                    ? StackTraceFilter.Filter(result.StackTrace)
-                    : result.StackTrace + Environment.NewLine );
-        }
-	    #endregion
-	}
-}
-
+// ****************************************************************
+// 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.Diagnostics;
+
+namespace NUnit.ConsoleRunner
+{
+	using System;
+	using System.IO;
+	using System.Reflection;
+	using System.Xml;
+	using System.Resources;
+	using System.Text;
+	using NUnit.Core;
+	using NUnit.Core.Filters;
+	using NUnit.Util;
+	
+	/// <summary>
+	/// Summary description for ConsoleUi.
+	/// </summary>
+	public class ConsoleUi
+	{
+		public static readonly int OK = 0;
+		public static readonly int INVALID_ARG = -1;
+		public static readonly int FILE_NOT_FOUND = -2;
+		public static readonly int FIXTURE_NOT_FOUND = -3;
+		public static readonly int 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( Path.Combine(workDir, options.output) );
+				outStreamWriter.AutoFlush = true;
+				outWriter = outStreamWriter;
+			}
+
+			TextWriter errorWriter = Console.Error;
+			bool redirectError = options.err != null && options.err != string.Empty;
+			if ( redirectError )
+			{
+				StreamWriter errorStreamWriter = new StreamWriter( Path.Combine(workDir, options.err) );
+				errorStreamWriter.AutoFlush = true;
+				errorWriter = errorStreamWriter;
+			}
+
+            TestPackage package = MakeTestPackage(options);
+
+            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);
+
+            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))
+			{
+                testRunner.Load(package);
+
+                if (testRunner.Test == null)
+				{
+					testRunner.Unload();
+					Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture);
+					return FIXTURE_NOT_FOUND;
+				}
+
+				EventCollector collector = new EventCollector( options, outWriter, errorWriter );
+
+				TestFilter testFilter;
+					
+				if(!CreateTestFilter(options, out testFilter))
+					return INVALID_ARG;
+
+				TestResult result = null;
+				string savedDirectory = Environment.CurrentDirectory;
+				TextWriter savedOut = Console.Out;
+				TextWriter savedError = Console.Error;
+
+				try
+				{
+					result = testRunner.Run( collector, testFilter, true, LoggingThreshold.Off );
+				}
+				finally
+				{
+					outWriter.Flush();
+					errorWriter.Flush();
+
+					if (redirectOutput)
+						outWriter.Close();
+
+					if (redirectError)
+						errorWriter.Close();
+
+					Environment.CurrentDirectory = savedDirectory;
+					Console.SetOut( savedOut );
+					Console.SetError( savedError );
+				}
+
+				Console.WriteLine();
+
+                int returnCode = UNEXPECTED_ERROR;
+
+                if (result != null)
+                {
+                    string xmlOutput = CreateXmlOutput(result);
+                    ResultSummarizer summary = new ResultSummarizer(result);
+
+                    if (options.xmlConsole)
+                    {
+                        Console.WriteLine(xmlOutput);
+                    }
+                    else
+                    {
+                        WriteSummaryReport(summary);
+
+                        bool hasErrors = summary.Errors > 0 || summary.Failures > 0 || result.IsError || result.IsFailure;
+
+                        if (options.stoponerror && (hasErrors || summary.NotRunnable > 0))
+                        {
+                            Console.WriteLine("Test run was stopped after first error, as requested.");
+                            Console.WriteLine();
+                        }
+
+                        if (hasErrors)
+                            WriteErrorsAndFailuresReport(result);
+
+                        if (summary.TestsNotRun > 0)
+                            WriteNotRunReport(result);
+
+                        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.Errors + summary.Failures + summary.NotRunnable;
+                }
+
+				if (collector.HasExceptions)
+				{
+					collector.WriteExceptions();
+					returnCode = UNEXPECTED_ERROR;
+				}
+            
+				return returnCode;
+			}
+		}
+
+		internal static bool CreateTestFilter(ConsoleOptions options, out TestFilter testFilter)
+		{
+			testFilter = TestFilter.Empty;
+
+			SimpleNameFilter nameFilter = new SimpleNameFilter();
+
+			if (options.run != null && options.run != string.Empty)
+			{
+				Console.WriteLine("Selected test(s): " + 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);
+				
+				try
+				{
+					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 && line.Length > 0)
+						{
+							if (line[0] != '#')
+								nameFilter.Add(line);
+							line = rdr.ReadLine();
+						}
+					}
+				}
+				catch (Exception e)
+				{
+					if (e is FileNotFoundException || e is DirectoryNotFoundException)
+					{
+						Console.WriteLine("Unable to locate file: " + options.runlist);
+						return false;
+					}
+					throw;
+				}
+
+				testFilter = nameFilter;
+			}
+
+			if (options.include != null && options.include != string.Empty)
+			{
+				TestFilter includeFilter = new CategoryExpression(options.include).Filter;
+				Console.WriteLine("Included categories: " + includeFilter.ToString());
+
+				if (testFilter.IsEmpty)
+					testFilter = includeFilter;
+				else
+					testFilter = new AndFilter(testFilter, includeFilter);
+			}
+
+			if (options.exclude != null && options.exclude != string.Empty)
+			{
+				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)
+					((AndFilter) testFilter).Add(excludeFilter);
+				else
+					testFilter = new AndFilter(testFilter, excludeFilter);
+			}
+
+			if (testFilter is NotFilter)
+				((NotFilter) testFilter).TopLevel = true;
+
+			return true;
+		}
+
+		#region Helper Methods
+        // TODO: See if this can be unified with the Gui's MakeTestPackage
+        private TestPackage MakeTestPackage( ConsoleOptions options )
+        {
+			TestPackage package;
+			DomainUsage domainUsage = DomainUsage.Default;
+            ProcessModel processModel = ProcessModel.Default;
+            RuntimeFramework framework = null;
+
+            string[] parameters = new string[options.ParameterCount];
+            for (int i = 0; i < options.ParameterCount; i++)
+                parameters[i] = Path.GetFullPath((string)options.Parameters[i]);
+
+			if (options.IsTestProject)
+			{
+				NUnitProject project = 
+					Services.ProjectService.LoadProject(parameters[0]);
+
+				string configName = options.config;
+				if (configName != null)
+					project.SetActiveConfig(configName);
+
+				package = project.ActiveConfig.MakeTestPackage();
+                processModel = project.ProcessModel;
+                domainUsage = project.DomainUsage;
+                framework = project.ActiveConfig.RuntimeFramework;
+			}
+			else if (parameters.Length == 1)
+			{
+                package = new TestPackage(parameters[0]);
+				domainUsage = DomainUsage.Single;
+			}
+			else
+			{
+                // TODO: Figure out a better way to handle "anonymous" packages
+				package = new TestPackage(null, parameters);
+                package.AutoBinPath = true;
+				domainUsage = DomainUsage.Multiple;
+			}
+
+			if (options.basepath != null && options.basepath != string.Empty)
+ 			{
+ 				package.BasePath = options.basepath;
+ 			}
+ 
+ 			if (options.privatebinpath != null && options.privatebinpath != string.Empty)
+ 			{
+ 				package.AutoBinPath = false;
+				package.PrivateBinPath = options.privatebinpath;
+ 			}
+
+#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;
+
+			package.TestName = options.fixture;
+            
+            package.Settings["ProcessModel"] = processModel;
+            package.Settings["DomainUsage"] = domainUsage;
+            
+			if (framework != null)
+                package.Settings["RuntimeFramework"] = framework;
+
+            if (domainUsage == DomainUsage.None)
+            {
+                // Make sure that addins are available
+                CoreExtensions.Host.AddinRegistry = Services.AddinRegistry;
+            }
+
+            package.Settings["ShadowCopyFiles"] = !options.noshadow;
+			package.Settings["UseThreadedRunner"] = !options.nothread;
+            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;
+		}
+
+		private static string CreateXmlOutput( TestResult result )
+		{
+			StringBuilder builder = new StringBuilder();
+			new XmlResultWriter(new StringWriter( builder )).SaveTestResult(result);
+
+			return builder.ToString();
+		}
+
+		private static void WriteSummaryReport( ResultSummarizer summary )
+		{
+            Console.WriteLine(
+                "Tests run: {0}, Errors: {1}, Failures: {2}, Inconclusive: {3}, Time: {4} seconds",
+                summary.TestsRun, summary.Errors, summary.Failures, summary.Inconclusive, summary.Time);
+            Console.WriteLine(
+                "  Not run: {0}, Invalid: {1}, Ignored: {2}, Skipped: {3}",
+                summary.TestsNotRun, summary.NotRunnable, summary.Ignored, summary.Skipped);
+            Console.WriteLine();
+        }
+
+        private void WriteErrorsAndFailuresReport(TestResult result)
+        {
+            reportIndex = 0;
+            Console.WriteLine("Errors and Failures:");
+            WriteErrorsAndFailures(result);
+            Console.WriteLine();
+        }
+
+        private void WriteErrorsAndFailures(TestResult result)
+        {
+            if (result.Executed)
+            {
+                if (result.HasResults)
+                {
+                    if (result.IsFailure || result.IsError)
+                        if (result.FailureSite == FailureSite.SetUp || result.FailureSite == FailureSite.TearDown)
+                            WriteSingleResult(result);
+
+                    foreach (TestResult childResult in result.Results)
+                        WriteErrorsAndFailures(childResult);
+                }
+                else if (result.IsFailure || result.IsError)
+                {
+                    WriteSingleResult(result);
+                }
+            }
+        }
+
+        private void WriteNotRunReport(TestResult result)
+        {
+	        reportIndex = 0;
+            Console.WriteLine("Tests Not Run:");
+	        WriteNotRunResults(result);
+            Console.WriteLine();
+        }
+
+	    private int reportIndex = 0;
+        private void WriteNotRunResults(TestResult result)
+        {
+            if (result.HasResults)
+                foreach (TestResult childResult in result.Results)
+                    WriteNotRunResults(childResult);
+            else if (!result.Executed)
+                WriteSingleResult( result );
+        }
+
+        private void WriteSingleResult( TestResult result )
+        {
+            string status = result.IsFailure || result.IsError
+                ? string.Format("{0} {1}", result.FailureSite, result.ResultState)
+                : result.ResultState.ToString();
+
+            Console.WriteLine("{0}) {1} : {2}", ++reportIndex, status, result.FullName);
+
+            if ( result.Message != null && result.Message != string.Empty )
+                 Console.WriteLine("   {0}", result.Message);
+
+            if (result.StackTrace != null && result.StackTrace != string.Empty)
+                Console.WriteLine( result.IsFailure
+                    ? StackTraceFilter.Filter(result.StackTrace)
+                    : result.StackTrace + Environment.NewLine );
+        }
+	    #endregion
+	}
+}
+
diff --git a/src/ConsoleRunner/nunit-console/EventCollector.cs b/src/ConsoleRunner/nunit-console/EventCollector.cs
index 2bfff55..0c0300e 100644
--- a/src/ConsoleRunner/nunit-console/EventCollector.cs
+++ b/src/ConsoleRunner/nunit-console/EventCollector.cs
@@ -1,221 +1,221 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using System.Diagnostics;
-using System.Text.RegularExpressions;
-using System.Collections;
-using System.Collections.Specialized;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.ConsoleRunner
-{
-	/// <summary>
-	/// Summary description for EventCollector.
-	/// </summary>
-	public class EventCollector : MarshalByRefObject, EventListener
-	{
-		private int testRunCount;
-		private int testIgnoreCount;
-		private int failureCount;
-		private int level;
-
-		private ConsoleOptions options;
-		private TextWriter outWriter;
-		private TextWriter errorWriter;
-
-		StringCollection messages;
-		
-		private bool progress = false;
-		private string currentTestName;
-
-		private ArrayList unhandledExceptions = new ArrayList();
-
-		public EventCollector( ConsoleOptions options, TextWriter outWriter, TextWriter errorWriter )
-		{
-			level = 0;
-			this.options = options;
-			this.outWriter = outWriter;
-			this.errorWriter = errorWriter;
-			this.currentTestName = string.Empty;
-			this.progress = !options.xmlConsole && !options.labels && !options.nodots;
-
-			AppDomain.CurrentDomain.UnhandledException += 
-				new UnhandledExceptionEventHandler(OnUnhandledException);
-		}
-
-		public bool HasExceptions
-		{
-			get { return unhandledExceptions.Count > 0; }
-		}
-
-		public void WriteExceptions()
-		{
-			Console.WriteLine();
-			Console.WriteLine("Unhandled exceptions:");
-			int index = 1;
-			foreach( string msg in unhandledExceptions )
-				Console.WriteLine( "{0}) {1}", index++, msg );
-		}
-
-		public void RunStarted(string name, int testCount)
-		{
-		}
-
-		public void RunFinished(TestResult result)
-		{
-		}
-
-		public void RunFinished(Exception exception)
-		{
-		}
-
-		public void TestFinished(TestResult testResult)
-		{
-            switch( testResult.ResultState )
-            {
-                case ResultState.Error:
-                case ResultState.Failure:
-                case ResultState.Cancelled:
-                    testRunCount++;
-			        failureCount++;
-    					
-			        if ( progress )
-				        Console.Write("F");
-    					
-			        messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.TestName.FullName ) );
-			        messages.Add( testResult.Message.Trim( Environment.NewLine.ToCharArray() ) );
-
-			        string stackTrace = StackTraceFilter.Filter( testResult.StackTrace );
-			        if ( stackTrace != null && stackTrace != string.Empty )
-			        {
-				        string[] trace = stackTrace.Split( System.Environment.NewLine.ToCharArray() );
-				        foreach( string s in trace )
-				        {
-					        if ( s != string.Empty )
-					        {
-						        string link = Regex.Replace( s.Trim(), @".* in (.*):line (.*)", "$1($2)");
-						        messages.Add( string.Format( "at\n{0}", link ) );
-					        }
-				        }
-			        }
-                    break;
-
-                case ResultState.Inconclusive:
-                case ResultState.Success:
-                    testRunCount++;
-                    break;
-
-                case ResultState.Ignored:
-                case ResultState.Skipped:
-                case ResultState.NotRunnable:
-    				testIgnoreCount++;
-					
-	    			if ( progress )
-		    			Console.Write("N");
-                    break;
-			}
-
-			currentTestName = string.Empty;
-		}
-
-		public void TestStarted(TestName testName)
-		{
-			currentTestName = testName.FullName;
-
-			if ( options.labels )
-				outWriter.WriteLine("***** {0}", currentTestName );
-				
-			if ( progress )
-				Console.Write(".");
-		}
-
-		public void SuiteStarted(TestName testName)
-		{
-			if ( level++ == 0 )
-			{
-				messages = new StringCollection();
-				testRunCount = 0;
-				testIgnoreCount = 0;
-				failureCount = 0;
-				Trace.WriteLine( "################################ UNIT TESTS ################################" );
-				Trace.WriteLine( "Running tests in '" + testName.FullName + "'..." );
-			}
-		}
-
-		public void SuiteFinished(TestResult suiteResult) 
-		{
-			if ( --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( "Unhandled exceptions : " + unhandledExceptions.Count);
-				Trace.WriteLine( "Total time           : " + suiteResult.Time + " seconds" );
-				Trace.WriteLine( "############################################################################");
-			}
-		}
-
-		private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
-		{
-			if (e.ExceptionObject.GetType() != typeof(System.Threading.ThreadAbortException))
-			{
-				this.UnhandledException((Exception)e.ExceptionObject);
-			}
-		}
-
-
-		public void UnhandledException( Exception exception )
-		{
-			// If we do labels, we already have a newline
-			unhandledExceptions.Add(currentTestName + " : " + exception.ToString());
-			//if (!options.labels) outWriter.WriteLine();
-			string msg = string.Format("##### Unhandled Exception while running {0}", currentTestName);
-			//outWriter.WriteLine(msg);
-			//outWriter.WriteLine(exception.ToString());
-
-			Trace.WriteLine(msg);
-			Trace.WriteLine(exception.ToString());
-		}
-
-		public void TestOutput( TestOutput output)
-		{
-			switch ( output.Type )
-			{
-				case TestOutputType.Out:
-					outWriter.Write( output.Text );
-					break;
-				case TestOutputType.Error:
-					errorWriter.Write( output.Text );
-					break;
-			}
-		}
-
-
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Text.RegularExpressions;
+using System.Collections;
+using System.Collections.Specialized;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.ConsoleRunner
+{
+	/// <summary>
+	/// Summary description for EventCollector.
+	/// </summary>
+	public class EventCollector : MarshalByRefObject, EventListener
+	{
+		private int testRunCount;
+		private int testIgnoreCount;
+		private int failureCount;
+		private int level;
+
+		private ConsoleOptions options;
+		private TextWriter outWriter;
+		private TextWriter errorWriter;
+
+		StringCollection messages;
+		
+		private bool progress = false;
+		private string currentTestName;
+
+		private ArrayList unhandledExceptions = new ArrayList();
+
+		public EventCollector( ConsoleOptions options, TextWriter outWriter, TextWriter errorWriter )
+		{
+			level = 0;
+			this.options = options;
+			this.outWriter = outWriter;
+			this.errorWriter = errorWriter;
+			this.currentTestName = string.Empty;
+			this.progress = !options.xmlConsole && !options.labels && !options.nodots;
+
+			AppDomain.CurrentDomain.UnhandledException += 
+				new UnhandledExceptionEventHandler(OnUnhandledException);
+		}
+
+		public bool HasExceptions
+		{
+			get { return unhandledExceptions.Count > 0; }
+		}
+
+		public void WriteExceptions()
+		{
+			Console.WriteLine();
+			Console.WriteLine("Unhandled exceptions:");
+			int index = 1;
+			foreach( string msg in unhandledExceptions )
+				Console.WriteLine( "{0}) {1}", index++, msg );
+		}
+
+		public void RunStarted(string name, int testCount)
+		{
+		}
+
+		public void RunFinished(TestResult result)
+		{
+		}
+
+		public void RunFinished(Exception exception)
+		{
+		}
+
+		public void TestFinished(TestResult testResult)
+		{
+            switch( testResult.ResultState )
+            {
+                case ResultState.Error:
+                case ResultState.Failure:
+                case ResultState.Cancelled:
+                    testRunCount++;
+			        failureCount++;
+    					
+			        if ( progress )
+				        Console.Write("F");
+    					
+			        messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.TestName.FullName ) );
+			        messages.Add( testResult.Message.Trim( Environment.NewLine.ToCharArray() ) );
+
+			        string stackTrace = StackTraceFilter.Filter( testResult.StackTrace );
+			        if ( stackTrace != null && stackTrace != string.Empty )
+			        {
+				        string[] trace = stackTrace.Split( System.Environment.NewLine.ToCharArray() );
+				        foreach( string s in trace )
+				        {
+					        if ( s != string.Empty )
+					        {
+						        string link = Regex.Replace( s.Trim(), @".* in (.*):line (.*)", "$1($2)");
+						        messages.Add( string.Format( "at\n{0}", link ) );
+					        }
+				        }
+			        }
+                    break;
+
+                case ResultState.Inconclusive:
+                case ResultState.Success:
+                    testRunCount++;
+                    break;
+
+                case ResultState.Ignored:
+                case ResultState.Skipped:
+                case ResultState.NotRunnable:
+    				testIgnoreCount++;
+					
+	    			if ( progress )
+		    			Console.Write("N");
+                    break;
+			}
+
+			currentTestName = string.Empty;
+		}
+
+		public void TestStarted(TestName testName)
+		{
+			currentTestName = testName.FullName;
+
+			if ( options.labels )
+				outWriter.WriteLine("***** {0}", currentTestName );
+				
+			if ( progress )
+				Console.Write(".");
+		}
+
+		public void SuiteStarted(TestName testName)
+		{
+			if ( level++ == 0 )
+			{
+				messages = new StringCollection();
+				testRunCount = 0;
+				testIgnoreCount = 0;
+				failureCount = 0;
+				Trace.WriteLine( "################################ UNIT TESTS ################################" );
+				Trace.WriteLine( "Running tests in '" + testName.FullName + "'..." );
+			}
+		}
+
+		public void SuiteFinished(TestResult suiteResult) 
+		{
+			if ( --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( "Unhandled exceptions : " + unhandledExceptions.Count);
+				Trace.WriteLine( "Total time           : " + suiteResult.Time + " seconds" );
+				Trace.WriteLine( "############################################################################");
+			}
+		}
+
+		private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
+		{
+			if (e.ExceptionObject.GetType() != typeof(System.Threading.ThreadAbortException))
+			{
+				this.UnhandledException((Exception)e.ExceptionObject);
+			}
+		}
+
+
+		public void UnhandledException( Exception exception )
+		{
+			// If we do labels, we already have a newline
+			unhandledExceptions.Add(currentTestName + " : " + exception.ToString());
+			//if (!options.labels) outWriter.WriteLine();
+			string msg = string.Format("##### Unhandled Exception while running {0}", currentTestName);
+			//outWriter.WriteLine(msg);
+			//outWriter.WriteLine(exception.ToString());
+
+			Trace.WriteLine(msg);
+			Trace.WriteLine(exception.ToString());
+		}
+
+		public void TestOutput( TestOutput output)
+		{
+			switch ( output.Type )
+			{
+				case TestOutputType.Out:
+					outWriter.Write( output.Text );
+					break;
+				case TestOutputType.Error:
+					errorWriter.Write( output.Text );
+					break;
+			}
+		}
+
+
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+	}
+}
diff --git a/src/ConsoleRunner/nunit-console/Runner.cs b/src/ConsoleRunner/nunit-console/Runner.cs
index 2bba447..66103a8 100644
--- a/src/ConsoleRunner/nunit-console/Runner.cs
+++ b/src/ConsoleRunner/nunit-console/Runner.cs
@@ -1,162 +1,162 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Util;
-
-
-namespace NUnit.ConsoleRunner
-{
-	/// <summary>
-	/// Summary description for Runner.
-	/// </summary>
-	public class Runner
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(Runner));
-
-		[STAThread]
-		public static int Main(string[] args)
-		{
-			ConsoleOptions options = new ConsoleOptions(args);
-
-            // Create SettingsService early so we know the trace level right at the start
-            SettingsService settingsService = new SettingsService();
-            InternalTraceLevel level = (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default);
-            if (options.trace != InternalTraceLevel.Default)
-                level = options.trace;
-
-            InternalTrace.Initialize("nunit-console_%p.log", level);
-            
-            log.Info("NUnit-console.exe starting");
-
-			if(!options.nologo)
-				WriteCopyright();
-
-			if(options.help)
-			{
-				options.Help();
-				return ConsoleUi.OK;
-			}
-
-            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();
-				return ConsoleUi.OK;
-			}
-			
-			if(!options.Validate())
-			{
-				foreach( string arg in options.InvalidArguments )
-					Console.Error.WriteLine("fatal error: invalid argument: {0}", arg );
-				options.Help();
-				return ConsoleUi.INVALID_ARG;
-			}
-
-			// Add Standard Services to ServiceManager
-			ServiceManager.Services.AddService( settingsService );
-			ServiceManager.Services.AddService( new DomainManager() );
-			//ServiceManager.Services.AddService( new RecentFilesService() );
-			ServiceManager.Services.AddService( new ProjectService() );
-			//ServiceManager.Services.AddService( new TestLoader() );
-			ServiceManager.Services.AddService( new AddinRegistry() );
-			ServiceManager.Services.AddService( new AddinManager() );
-            ServiceManager.Services.AddService( new TestAgency() );
-
-			// Initialize Services
-			ServiceManager.Services.InitializeServices();
-
-            foreach (string parm in options.Parameters)
-            {
-                if (!Services.ProjectService.CanLoadProject(parm) && !PathUtils.IsAssemblyFileType(parm))
-                {
-                    Console.WriteLine("File type not known: {0}", parm);
-                    return ConsoleUi.INVALID_ARG;
-                }
-            }
-
-			try
-			{
-				ConsoleUi consoleUi = new ConsoleUi();
-				return consoleUi.Execute( options );
-			}
-			catch( FileNotFoundException ex )
-			{
-				Console.WriteLine( ex.Message );
-				return ConsoleUi.FILE_NOT_FOUND;
-			}
-			catch( Exception ex )
-			{
-				Console.WriteLine( "Unhandled Exception:\n{0}", ex.ToString() );
-				return ConsoleUi.UNEXPECTED_ERROR;
-			}
-			finally
-			{
-				if(options.wait)
-				{
-					Console.Out.WriteLine("\nHit <enter> key to continue");
-					Console.ReadLine();
-				}
-
-				log.Info( "NUnit-console.exe terminating" );
-			}
-
-		}
-
-		private static void WriteCopyright()
-		{
-			Assembly executingAssembly = Assembly.GetExecutingAssembly();
-			string versionText = executingAssembly.GetName().Version.ToString();
-
-#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(AssemblyCopyrightAttribute), false);
-			if ( objectAttrs.Length > 0 )
-				copyrightText = ((AssemblyCopyrightAttribute)objectAttrs[0]).Copyright;
-
-			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
-            if (objectAttrs.Length > 0)
-            {
-                string configText = ((AssemblyConfigurationAttribute)objectAttrs[0]).Configuration;
-                if (configText != "")
-                    versionText += string.Format(" ({0})", configText);
-            }
-
-			Console.WriteLine(String.Format("{0} version {1}", productName, versionText));
-			Console.WriteLine(copyrightText);
-			Console.WriteLine();
-
-			Console.WriteLine( "Runtime Environment - " );
-			RuntimeFramework framework = RuntimeFramework.CurrentFramework;
-			Console.WriteLine( string.Format("   OS Version: {0}", Environment.OSVersion ) );
-			Console.WriteLine( string.Format("  CLR Version: {0} ( {1} )",
-				Environment.Version,  framework.DisplayName ) );
-
-			Console.WriteLine();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using System.Reflection;
+using NUnit.Core;
+using NUnit.Util;
+
+
+namespace NUnit.ConsoleRunner
+{
+	/// <summary>
+	/// Summary description for Runner.
+	/// </summary>
+	public class Runner
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(Runner));
+
+		[STAThread]
+		public static int Main(string[] args)
+		{
+			ConsoleOptions options = new ConsoleOptions(args);
+
+            // Create SettingsService early so we know the trace level right at the start
+            SettingsService settingsService = new SettingsService();
+            InternalTraceLevel level = (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default);
+            if (options.trace != InternalTraceLevel.Default)
+                level = options.trace;
+
+            InternalTrace.Initialize("nunit-console_%p.log", level);
+            
+            log.Info("NUnit-console.exe starting");
+
+			if(!options.nologo)
+				WriteCopyright();
+
+			if(options.help)
+			{
+				options.Help();
+				return ConsoleUi.OK;
+			}
+
+            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();
+				return ConsoleUi.OK;
+			}
+			
+			if(!options.Validate())
+			{
+				foreach( string arg in options.InvalidArguments )
+					Console.Error.WriteLine("fatal error: invalid argument: {0}", arg );
+				options.Help();
+				return ConsoleUi.INVALID_ARG;
+			}
+
+			// Add Standard Services to ServiceManager
+			ServiceManager.Services.AddService( settingsService );
+			ServiceManager.Services.AddService( new DomainManager() );
+			//ServiceManager.Services.AddService( new RecentFilesService() );
+			ServiceManager.Services.AddService( new ProjectService() );
+			//ServiceManager.Services.AddService( new TestLoader() );
+			ServiceManager.Services.AddService( new AddinRegistry() );
+			ServiceManager.Services.AddService( new AddinManager() );
+            ServiceManager.Services.AddService( new TestAgency() );
+
+			// Initialize Services
+			ServiceManager.Services.InitializeServices();
+
+            foreach (string parm in options.Parameters)
+            {
+                if (!Services.ProjectService.CanLoadProject(parm) && !PathUtils.IsAssemblyFileType(parm))
+                {
+                    Console.WriteLine("File type not known: {0}", parm);
+                    return ConsoleUi.INVALID_ARG;
+                }
+            }
+
+			try
+			{
+				ConsoleUi consoleUi = new ConsoleUi();
+				return consoleUi.Execute( options );
+			}
+			catch( FileNotFoundException ex )
+			{
+				Console.WriteLine( ex.Message );
+				return ConsoleUi.FILE_NOT_FOUND;
+			}
+			catch( Exception ex )
+			{
+				Console.WriteLine( "Unhandled Exception:\n{0}", ex.ToString() );
+				return ConsoleUi.UNEXPECTED_ERROR;
+			}
+			finally
+			{
+				if(options.wait)
+				{
+					Console.Out.WriteLine("\nHit <enter> key to continue");
+					Console.ReadLine();
+				}
+
+				log.Info( "NUnit-console.exe terminating" );
+			}
+
+		}
+
+		private static void WriteCopyright()
+		{
+			Assembly executingAssembly = Assembly.GetExecutingAssembly();
+			string versionText = executingAssembly.GetName().Version.ToString();
+
+#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(AssemblyCopyrightAttribute), false);
+			if ( objectAttrs.Length > 0 )
+				copyrightText = ((AssemblyCopyrightAttribute)objectAttrs[0]).Copyright;
+
+			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
+            if (objectAttrs.Length > 0)
+            {
+                string configText = ((AssemblyConfigurationAttribute)objectAttrs[0]).Configuration;
+                if (configText != "")
+                    versionText += string.Format(" ({0})", configText);
+            }
+
+			Console.WriteLine(String.Format("{0} version {1}", productName, versionText));
+			Console.WriteLine(copyrightText);
+			Console.WriteLine();
+
+			Console.WriteLine( "Runtime Environment - " );
+			RuntimeFramework framework = RuntimeFramework.CurrentFramework;
+			Console.WriteLine( string.Format("   OS Version: {0}", Environment.OSVersion ) );
+			Console.WriteLine( string.Format("  CLR Version: {0} ( {1} )",
+				Environment.Version,  framework.DisplayName ) );
+
+			Console.WriteLine();
+		}
+	}
+}
diff --git a/src/ConsoleRunner/nunit-console/TestNameParser.cs b/src/ConsoleRunner/nunit-console/TestNameParser.cs
index 2df3ead..bd4d8dd 100644
--- a/src/ConsoleRunner/nunit-console/TestNameParser.cs
+++ b/src/ConsoleRunner/nunit-console/TestNameParser.cs
@@ -1,92 +1,92 @@
-// ****************************************************************
-// Copyright 2011, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.ConsoleRunner
-{
-    /// <summary>
-    /// TestNameParser is used to parse the arguments to the 
-    /// -run option, separating testnames at the correct point.
-    /// </summary>
-    public class TestNameParser
-    {
-        /// <summary>
-        /// Parse the -run argument and return an array of argument
-        /// </summary>
-        /// <param name="argument">argument</param>
-        /// <returns></returns>
-        public static string[] Parse(string argument)
-        {
-            ArrayList list = new ArrayList();
-
-            int index = 0;
-            while (index < argument.Length)
-            {
-                string name = GetTestName(argument, ref index);
-                if (name != null && name != string.Empty)
-                    list.Add(name);
-            }
-
-            return (string[])list.ToArray(typeof(string));
-        }
-
-        private static string GetTestName(string argument, ref int index)
-        {
-            int separator = GetSeparator(argument, index);
-            string result;
-
-            if (separator >= 0)
-            {
-                result = argument.Substring(index, separator - index).Trim();
-                index = separator + 1;
-            }
-            else
-            {
-                result = argument.Substring(index).Trim();
-                index = argument.Length;
-            }
-
-            return result;
-        }
-
-        private static int GetSeparator(string argument, int index)
-        {
-            int nest = 0;
-
-            while (index < argument.Length)
-            {
-                switch (argument[index])
-                {
-                    case ',':
-                        if (nest == 0)
-                            return index;
-                        break;
-
-                    case '"':
-                        while (++index < argument.Length && argument[index] != '"')
-                            ;
-                        break;
-
-                    case '(':
-                    case '<':
-                        nest++;
-                        break;
-
-                    case ')':
-                    case '>':
-                        nest--;
-                        break;
-                }
-
-                index++;
-            }
-
-            return -1;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2011, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.ConsoleRunner
+{
+    /// <summary>
+    /// TestNameParser is used to parse the arguments to the 
+    /// -run option, separating testnames at the correct point.
+    /// </summary>
+    public class TestNameParser
+    {
+        /// <summary>
+        /// Parse the -run argument and return an array of argument
+        /// </summary>
+        /// <param name="argument">argument</param>
+        /// <returns></returns>
+        public static string[] Parse(string argument)
+        {
+            ArrayList list = new ArrayList();
+
+            int index = 0;
+            while (index < argument.Length)
+            {
+                string name = GetTestName(argument, ref index);
+                if (name != null && name != string.Empty)
+                    list.Add(name);
+            }
+
+            return (string[])list.ToArray(typeof(string));
+        }
+
+        private static string GetTestName(string argument, ref int index)
+        {
+            int separator = GetSeparator(argument, index);
+            string result;
+
+            if (separator >= 0)
+            {
+                result = argument.Substring(index, separator - index).Trim();
+                index = separator + 1;
+            }
+            else
+            {
+                result = argument.Substring(index).Trim();
+                index = argument.Length;
+            }
+
+            return result;
+        }
+
+        private static int GetSeparator(string argument, int index)
+        {
+            int nest = 0;
+
+            while (index < argument.Length)
+            {
+                switch (argument[index])
+                {
+                    case ',':
+                        if (nest == 0)
+                            return index;
+                        break;
+
+                    case '"':
+                        while (++index < argument.Length && argument[index] != '"')
+                            ;
+                        break;
+
+                    case '(':
+                    case '<':
+                        nest++;
+                        break;
+
+                    case ')':
+                    case '>':
+                        nest--;
+                        break;
+                }
+
+                index++;
+            }
+
+            return -1;
+        }
+    }
+}
diff --git a/src/ConsoleRunner/nunit-console/nunit-console.build b/src/ConsoleRunner/nunit-console/nunit-console.build
index 367dd0c..7b45d93 100644
--- a/src/ConsoleRunner/nunit-console/nunit-console.build
+++ b/src/ConsoleRunner/nunit-console/nunit-console.build
@@ -1,43 +1,43 @@
-<?xml version="1.0"?>
-<project name="NUnit-Console" default="build">
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cs"/>
-    <include name="ConsoleOptions.cs"/>
-    <include name="ConsoleUi.cs"/>
-    <include name="EventCollector.cs"/>
-    <include name="Runner.cs"/>
-    <include name="TestNameParser.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.lib.dir}/nunit-console-runner.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <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}/ConsoleRunner/nunit-console">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit-console.csproj"/>
-        <include name="nunit-console.build"/>
-        <include name="App.ico"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnit-Console" default="build">
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs"/>
+    <include name="ConsoleOptions.cs"/>
+    <include name="ConsoleUi.cs"/>
+    <include name="EventCollector.cs"/>
+    <include name="Runner.cs"/>
+    <include name="TestNameParser.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.lib.dir}/nunit-console-runner.dll"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <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}/ConsoleRunner/nunit-console">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit-console.csproj"/>
+        <include name="nunit-console.build"/>
+        <include name="App.ico"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/ConsoleRunner/nunit-console/nunit-console.csproj b/src/ConsoleRunner/nunit-console/nunit-console.csproj
index 5dcd5c0..6d93a79 100644
--- a/src/ConsoleRunner/nunit-console/nunit-console.csproj
+++ b/src/ConsoleRunner/nunit-console/nunit-console.csproj
@@ -1,113 +1,147 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-console-runner</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618,1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618,1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="App.ico" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="ConsoleOptions.cs" />
-    <Compile Include="ConsoleUi.cs" />
-    <Compile Include="EventCollector.cs" />
-    <Compile Include="Runner.cs" />
-    <Compile Include="TestNameParser.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit-console.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-console-runner</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.ConsoleRunner</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="ConsoleOptions.cs" />
+    <Compile Include="ConsoleUi.cs" />
+    <Compile Include="EventCollector.cs" />
+    <Compile Include="Runner.cs" />
+    <Compile Include="TestNameParser.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-console.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/nunit-console/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/ConsoleRunner/nunit-console/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..b561877
Binary files /dev/null and b/src/ConsoleRunner/nunit-console/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console-runner.pdb b/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console-runner.pdb
new file mode 100644
index 0000000..8a295e4
Binary files /dev/null and b/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console-runner.pdb differ
diff --git a/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console.csproj.FileListAbsolute.txt b/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..c7286c4
--- /dev/null
+++ b/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit-console-runner.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit-console-runner.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\ConsoleRunner\nunit-console\obj\Debug\nunit-console-runner.dll
+D:\Dev\NUnit\nunit-2.6\work\src\ConsoleRunner\nunit-console\obj\Debug\nunit-console-runner.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\ConsoleRunner\nunit-console\obj\Debug\nunit-console.csprojResolveAssemblyReference.cache
diff --git a/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console.csprojResolveAssemblyReference.cache b/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..1d00dd3
Binary files /dev/null and b/src/ConsoleRunner/nunit-console/obj/Debug/nunit-console.csprojResolveAssemblyReference.cache differ
diff --git a/src/ConsoleRunner/tests/CommandLineTests.cs b/src/ConsoleRunner/tests/CommandLineTests.cs
index a7804a6..c64c026 100644
--- a/src/ConsoleRunner/tests/CommandLineTests.cs
+++ b/src/ConsoleRunner/tests/CommandLineTests.cs
@@ -1,191 +1,193 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.ConsoleRunner.Tests
-{
-	using System;
-	using System.IO;
-	using System.Reflection;
-	using NUnit.Framework;
-
-	[TestFixture]
-	public class CommandLineTests
-	{
-		[Test]
-		public void NoParametersCount()
-		{
-			ConsoleOptions options = new ConsoleOptions();
-			Assert.IsTrue(options.NoArgs);
-		}
-
-		[Test]
-		public void AllowForwardSlashDefaultsCorrectly()
-		{
-			ConsoleOptions options = new ConsoleOptions();
-			Assert.AreEqual( Path.DirectorySeparatorChar != '/', options.AllowForwardSlash );
-		}
-
-		[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 );
-			Assert.AreEqual( typeof(bool), field.FieldType, "Field '{0}' is wrong type", fieldName );
-
-			ConsoleOptions options = new ConsoleOptions( "-" + option );
-			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize -" + option );
-			options = new ConsoleOptions( "--" + option );
-			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize --" + option );
-			options = new ConsoleOptions( false, "/" + option );
-			Assert.AreEqual( false, (bool)field.GetValue( options ), "Incorrectly recognized /" + option );
-			options = new ConsoleOptions( true, "/" + option );
-			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize /" + 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 );
-			Assert.AreEqual( typeof(string), field.FieldType );
-
-			ConsoleOptions options = new ConsoleOptions( "-" + option + ":text" );
-			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize -" + option );
-			options = new ConsoleOptions( "--" + option + ":text" );
-			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize --" + option );
-			options = new ConsoleOptions( false, "/" + option + ":text" );
-			Assert.AreEqual( null, (string)field.GetValue( options ), "Incorrectly recognized /" + option );
-			options = new ConsoleOptions( true, "/" + option + ":text" );
-			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize /" + option );
-		}
-
-        [TestCase("domain")]
-        [TestCase("trace")]
-		public void EnumOptionsAreRecognized( string fieldName )
-		{
-			FieldInfo field = typeof(ConsoleOptions).GetField( fieldName );
-			Assert.IsNotNull( field, "Field {0} not found", fieldName );
-			Assert.IsTrue( field.FieldType.IsEnum, "Field {0} is not an enum", fieldName );
-		}
-
-		[Test]
-		public void AssemblyName()
-		{
-			ConsoleOptions options = new ConsoleOptions( "nunit.tests.dll" );
-			Assert.AreEqual( "nunit.tests.dll", options.Parameters[0] );
-		}
-
-		[Test]
-		public void FixtureNamePlusAssemblyIsValid()
-		{
-			ConsoleOptions options = new ConsoleOptions( "-fixture:NUnit.Tests.AllTests", "nunit.tests.dll" );
-			Assert.AreEqual("nunit.tests.dll", options.Parameters[0]);
-			Assert.AreEqual("NUnit.Tests.AllTests", options.fixture);
-			Assert.IsTrue(options.Validate());
-		}
-
-		[Test]
-		public void AssemblyAloneIsValid()
-		{
-			ConsoleOptions options = new ConsoleOptions( "nunit.tests.dll" );
-			Assert.IsTrue(options.Validate(), "command line should be valid");
-		}
-
-		[Test]
-		public void InvalidOption()
-		{
-			ConsoleOptions options = new ConsoleOptions( "-asembly:nunit.tests.dll" );
-			Assert.IsFalse(options.Validate());
-		}
-
-
-		[Test]
-		public void NoFixtureNameProvided()
-		{
-			ConsoleOptions options = new ConsoleOptions( "-fixture:", "nunit.tests.dll" );
-			Assert.IsFalse(options.Validate());
-		}
-
-		[Test] 
-		public void InvalidCommandLineParms()
-		{
-			ConsoleOptions options = new ConsoleOptions( "-garbage:TestFixture", "-assembly:Tests.dll" );
-			Assert.IsFalse(options.Validate());
-		}
-
-		[Test]
-		public void XmlParameter()
-		{
-			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.result);
-		}
-
-		[Test]
-		public void XmlParameterWithFullPath()
-		{
-			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.result);
-		}
-
-		[Test]
-		public void XmlParameterWithFullPathUsingEqualSign()
-		{
-			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.result);
-		}
-
-		[Test]
-		public void FileNameWithoutXmlParameterLooksLikeParameter()
-		{
-			ConsoleOptions options = new ConsoleOptions( "tests.dll", "result.xml" );
-			Assert.IsTrue(options.Validate());
-			Assert.AreEqual(2, options.Parameters.Count);
-		}
-
-		[Test]
-		public void XmlParameterWithoutFileNameIsInvalid()
-		{
-			ConsoleOptions options = new ConsoleOptions( "tests.dll", "-xml:" );
-			Assert.IsFalse(options.Validate());			
-		}
-
-		[Test]
-		public void HelpTextUsesCorrectDelimiterForPlatform()
-		{
-			string helpText = new ConsoleOptions().GetHelpText();
-			char delim = System.IO.Path.DirectorySeparatorChar == '/' ? '-' : '/';
-
-			string expected = string.Format( "{0}output=", delim );
-			StringAssert.Contains( expected, helpText );
-			
-			expected = string.Format( "{0}out=", delim );
-			StringAssert.Contains( expected, helpText );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.ConsoleRunner.Tests
+{
+	using System;
+	using System.IO;
+	using System.Reflection;
+	using NUnit.Framework;
+
+	[TestFixture]
+	public class CommandLineTests
+	{
+		[Test]
+		public void NoParametersCount()
+		{
+			ConsoleOptions options = new ConsoleOptions();
+			Assert.IsTrue(options.NoArgs);
+		}
+
+		[Test]
+		public void AllowForwardSlashDefaultsCorrectly()
+		{
+			ConsoleOptions options = new ConsoleOptions();
+			Assert.AreEqual( Path.DirectorySeparatorChar != '/', options.AllowForwardSlash );
+		}
+
+		[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 );
+			Assert.AreEqual( typeof(bool), field.FieldType, "Field '{0}' is wrong type", fieldName );
+
+			ConsoleOptions options = new ConsoleOptions( "-" + option );
+			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize -" + option );
+			options = new ConsoleOptions( "--" + option );
+			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize --" + option );
+			options = new ConsoleOptions( false, "/" + option );
+			Assert.AreEqual( false, (bool)field.GetValue( options ), "Incorrectly recognized /" + option );
+			options = new ConsoleOptions( true, "/" + option );
+			Assert.AreEqual( true, (bool)field.GetValue( options ), "Didn't recognize /" + 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")]
+        [TestCase("basepath", "basepath")]
+        [TestCase("privatebinpath", "privatebinpath")]
+		public void StringOptionsAreRecognized( string fieldName, string option )
+		{
+			FieldInfo field = typeof(ConsoleOptions).GetField( fieldName );
+			Assert.IsNotNull( field, "Field {0} not found", fieldName );
+			Assert.AreEqual( typeof(string), field.FieldType );
+
+			ConsoleOptions options = new ConsoleOptions( "-" + option + ":text" );
+			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize -" + option );
+			options = new ConsoleOptions( "--" + option + ":text" );
+			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize --" + option );
+			options = new ConsoleOptions( false, "/" + option + ":text" );
+			Assert.AreEqual( null, (string)field.GetValue( options ), "Incorrectly recognized /" + option );
+			options = new ConsoleOptions( true, "/" + option + ":text" );
+			Assert.AreEqual( "text", (string)field.GetValue( options ), "Didn't recognize /" + option );
+		}
+
+        [TestCase("domain")]
+        [TestCase("trace")]
+		public void EnumOptionsAreRecognized( string fieldName )
+		{
+			FieldInfo field = typeof(ConsoleOptions).GetField( fieldName );
+			Assert.IsNotNull( field, "Field {0} not found", fieldName );
+			Assert.IsTrue( field.FieldType.IsEnum, "Field {0} is not an enum", fieldName );
+		}
+
+		[Test]
+		public void AssemblyName()
+		{
+			ConsoleOptions options = new ConsoleOptions( "nunit.tests.dll" );
+			Assert.AreEqual( "nunit.tests.dll", options.Parameters[0] );
+		}
+
+		[Test]
+		public void FixtureNamePlusAssemblyIsValid()
+		{
+			ConsoleOptions options = new ConsoleOptions( "-fixture:NUnit.Tests.AllTests", "nunit.tests.dll" );
+			Assert.AreEqual("nunit.tests.dll", options.Parameters[0]);
+			Assert.AreEqual("NUnit.Tests.AllTests", options.fixture);
+			Assert.IsTrue(options.Validate());
+		}
+
+		[Test]
+		public void AssemblyAloneIsValid()
+		{
+			ConsoleOptions options = new ConsoleOptions( "nunit.tests.dll" );
+			Assert.IsTrue(options.Validate(), "command line should be valid");
+		}
+
+		[Test]
+		public void InvalidOption()
+		{
+			ConsoleOptions options = new ConsoleOptions( "-asembly:nunit.tests.dll" );
+			Assert.IsFalse(options.Validate());
+		}
+
+
+		[Test]
+		public void NoFixtureNameProvided()
+		{
+			ConsoleOptions options = new ConsoleOptions( "-fixture:", "nunit.tests.dll" );
+			Assert.IsFalse(options.Validate());
+		}
+
+		[Test] 
+		public void InvalidCommandLineParms()
+		{
+			ConsoleOptions options = new ConsoleOptions( "-garbage:TestFixture", "-assembly:Tests.dll" );
+			Assert.IsFalse(options.Validate());
+		}
+
+		[Test]
+		public void XmlParameter()
+		{
+			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.result);
+		}
+
+		[Test]
+		public void XmlParameterWithFullPath()
+		{
+			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.result);
+		}
+
+		[Test]
+		public void XmlParameterWithFullPathUsingEqualSign()
+		{
+			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.result);
+		}
+
+		[Test]
+		public void FileNameWithoutXmlParameterLooksLikeParameter()
+		{
+			ConsoleOptions options = new ConsoleOptions( "tests.dll", "result.xml" );
+			Assert.IsTrue(options.Validate());
+			Assert.AreEqual(2, options.Parameters.Count);
+		}
+
+		[Test]
+		public void XmlParameterWithoutFileNameIsInvalid()
+		{
+			ConsoleOptions options = new ConsoleOptions( "tests.dll", "-xml:" );
+			Assert.IsFalse(options.Validate());			
+		}
+
+		[Test]
+		public void HelpTextUsesCorrectDelimiterForPlatform()
+		{
+			string helpText = new ConsoleOptions().GetHelpText();
+			char delim = System.IO.Path.DirectorySeparatorChar == '/' ? '-' : '/';
+
+			string expected = string.Format( "{0}output=", delim );
+			StringAssert.Contains( expected, helpText );
+			
+			expected = string.Format( "{0}out=", delim );
+			StringAssert.Contains( expected, helpText );
+		}
+	}
+}
diff --git a/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs b/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs
index 7d18b63..6dca780 100644
--- a/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs
+++ b/src/ConsoleRunner/tests/CommandLineTests_MultipleAssemblies.cs
@@ -1,66 +1,66 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.ConsoleRunner.Tests
-{
-	using System;
-	using System.Collections;
-	using NUnit.Framework;
-
-	[TestFixture]
-	public class CommandLineTests_MultipleAssemblies
-	{
-		private readonly string firstAssembly = "nunit.tests.dll";
-		private readonly string secondAssembly = "mock-assembly.dll";
-		private readonly string fixture = "NUnit.Tests.CommandLine";
-		private ConsoleOptions assemblyOptions;
-		private ConsoleOptions fixtureOptions;
-
-		[SetUp]
-		public void SetUp()
-		{
-			assemblyOptions = new ConsoleOptions(new string[]
-				{ firstAssembly, secondAssembly });
-			fixtureOptions = new ConsoleOptions(new string[]
-				{ "-fixture:"+fixture, firstAssembly, secondAssembly });
-		}
-
-		[Test]
-		public void MultipleAssemblyValidate()
-		{
-			Assert.IsTrue(assemblyOptions.Validate());
-		}
-
-		[Test]
-		public void ParameterCount()
-		{
-			Assert.AreEqual(2, assemblyOptions.Parameters.Count);
-		}
-
-		[Test]
-		public void CheckParameters()
-		{
-			ArrayList parms = assemblyOptions.Parameters;
-			Assert.IsTrue(parms.Contains(firstAssembly));
-			Assert.IsTrue(parms.Contains(secondAssembly));
-		}
-
-		[Test]
-		public void FixtureValidate()
-		{
-			Assert.IsTrue(fixtureOptions.Validate());
-		}
-
-		[Test]
-		public void FixtureParameters()
-		{
-			Assert.AreEqual(fixture, fixtureOptions.fixture);
-			ArrayList parms = fixtureOptions.Parameters;
-			Assert.IsTrue(parms.Contains(firstAssembly));
-			Assert.IsTrue(parms.Contains(secondAssembly));
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.ConsoleRunner.Tests
+{
+	using System;
+	using System.Collections;
+	using NUnit.Framework;
+
+	[TestFixture]
+	public class CommandLineTests_MultipleAssemblies
+	{
+		private readonly string firstAssembly = "nunit.tests.dll";
+		private readonly string secondAssembly = "mock-assembly.dll";
+		private readonly string fixture = "NUnit.Tests.CommandLine";
+		private ConsoleOptions assemblyOptions;
+		private ConsoleOptions fixtureOptions;
+
+		[SetUp]
+		public void SetUp()
+		{
+			assemblyOptions = new ConsoleOptions(new string[]
+				{ firstAssembly, secondAssembly });
+			fixtureOptions = new ConsoleOptions(new string[]
+				{ "-fixture:"+fixture, firstAssembly, secondAssembly });
+		}
+
+		[Test]
+		public void MultipleAssemblyValidate()
+		{
+			Assert.IsTrue(assemblyOptions.Validate());
+		}
+
+		[Test]
+		public void ParameterCount()
+		{
+			Assert.AreEqual(2, assemblyOptions.Parameters.Count);
+		}
+
+		[Test]
+		public void CheckParameters()
+		{
+			ArrayList parms = assemblyOptions.Parameters;
+			Assert.IsTrue(parms.Contains(firstAssembly));
+			Assert.IsTrue(parms.Contains(secondAssembly));
+		}
+
+		[Test]
+		public void FixtureValidate()
+		{
+			Assert.IsTrue(fixtureOptions.Validate());
+		}
+
+		[Test]
+		public void FixtureParameters()
+		{
+			Assert.AreEqual(fixture, fixtureOptions.fixture);
+			ArrayList parms = fixtureOptions.Parameters;
+			Assert.IsTrue(parms.Contains(firstAssembly));
+			Assert.IsTrue(parms.Contains(secondAssembly));
+		}
+	}
+}
diff --git a/src/ConsoleRunner/tests/ConsoleRunnerTest.cs b/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
index 2dd828b..4a941e7 100644
--- a/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
+++ b/src/ConsoleRunner/tests/ConsoleRunnerTest.cs
@@ -1,208 +1,269 @@
-// ****************************************************************
-// 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.Text;
-using System.Collections;
-
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.TestData.ConsoleRunnerTest;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.ConsoleRunner.Tests
-{
-	[TestFixture]
-	public class ConsoleRunnerTest
-	{
-        private static readonly string failureMsg = 
-            string.Format( "Errors: {0}, Failures: {1}", 
-                MockAssembly.Errors, MockAssembly.Failures );
-
-		private static readonly string xmlFile = Path.Combine(Path.GetTempPath(), "console-test.xml");
-		private StringBuilder output;
-		TextWriter saveOut;
-
-		[SetUp]
-		public void Init()
-		{
-			output = new StringBuilder();
-
-			Console.Out.Flush();
-			saveOut = Console.Out;
-			Console.SetOut( new StringWriter( output ) );
-		}
-
-		[TearDown]
-		public void CleanUp()
-		{
-			Console.SetOut( saveOut );
-
-			FileInfo file = new FileInfo(xmlFile);
-			if(file.Exists) file.Delete();
-
-			file = new FileInfo( "TestResult.xml" );
-			if(file.Exists) file.Delete();
-		}
-
-		[Test]
-		public void FailureFixture() 
-		{
-            int resultCode = runFixture(typeof(FailureTest), "-noxml"); 
-			Assert.AreEqual(1, resultCode);
-		}
-
-		[Test]
-		public void MultiFailureFixture() 
-		{
-            int resultCode = runFixture(typeof(MultiFailureTest), "-noxml"); 
-			Assert.AreEqual(3, resultCode);
-		}
-
-		[Test]
-		public void SuccessFixture()
-		{
-            int resultCode = runFixture(typeof(SuccessTest), "-noxml");
-			Assert.AreEqual(0, resultCode);
-		}
-
-		[Test]
-		public void XmlResult() 
-		{
-			FileInfo info = new FileInfo(xmlFile);
-			info.Delete();
-
-			int resultCode = runFixture(typeof(SuccessTest), "-xml:" + xmlFile);
-
-			Assert.AreEqual(0, resultCode);
-			Assert.AreEqual(true, info.Exists);
-		}
-
-		[Test]
-		public void InvalidFixture()
-		{
-			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", "-noxml" });
-            Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
-        }
-
-        [Test]
-        public void OneOfTwoAssembliesNotFound()
-        {
-            int resultCode = executeConsole(new string[] { GetType().Module.Name, "badassembly.dll", "-noxml" });
-            Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
-        }
-
-		[Test]
-		public void XmlToConsole() 
-		{
-			int resultCode = runFixture( 
-				typeof(SuccessTest),
-				"-xmlconsole", 
-				"-nologo" );
-
-			Assert.AreEqual(0, resultCode);
-			StringAssert.Contains( @"<?xml version=""1.0""", output.ToString(),
-				"Only XML should be displayed in xmlconsole mode");
-		}
-
-		[Test]
-		public void Bug1073539Test()
-		{
-			int resultCode = runFixture( typeof( Bug1073539Fixture ), "-noxml" );
-			Assert.AreEqual( 1, resultCode );
-		}
-
-		[Test]
-		public void Bug1311644Test()
-		{
-			int resultCode = runFixture( typeof( Bug1311644Fixture ), "-noxml" );
-			Assert.AreEqual( 1, resultCode );
-		}
-
-		[Test]
-		public void CanRunWithoutTestDomain()
-		{
-            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", "-noxml"));
-			StringAssert.Contains( failureMsg, output.ToString() );
-		}
-
-		[Test]
-		public void CanRunWithMultipleTestDomains()
-		{
-            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", "-noxml"));
-			StringAssert.Contains( failureMsg, output.ToString() );
-		}
-
-		[Test]
-		public void CanRunWithSingleTestDomain_NoThread()
-		{
-            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", "-noxml"));
-			StringAssert.Contains( failureMsg, output.ToString() );
-		}
-
-		private int runFixture( Type type )
-		{
-            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+2];
-			int n = 0;
-			args[n++] = AssemblyHelper.GetAssemblyPath(type);
-			args[n++] = "-fixture:" + type.FullName;
-			foreach( string arg in arguments )
-				args[n++] = arg;
-			return executeConsole( args ); 
-		}
-
-        // Run test in process using console. For test purposes,
-        // avoid use of another process and turn trace off.
-        private int executeConsole( params string[] 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 );
-		}
-	}
-}
+// ****************************************************************
+// 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.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Collections;
+
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.TestData.ConsoleRunnerTest;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.ConsoleRunner.Tests
+{
+	[TestFixture]
+	public class ConsoleRunnerTest
+	{
+        private static readonly string failureMsg = 
+            string.Format( "Errors: {0}, Failures: {1}", 
+                MockAssembly.Errors, MockAssembly.Failures );
+        private static readonly int expectedReturnCode =
+            MockAssembly.Errors + MockAssembly.Failures + MockAssembly.NotRunnable;
+
+		private static readonly string xmlFile = Path.Combine(Path.GetTempPath(), "console-test.xml");
+		private StringBuilder output;
+		TextWriter saveOut;
+
+		[SetUp]
+		public void Init()
+		{
+			output = new StringBuilder();
+
+			Console.Out.Flush();
+			saveOut = Console.Out;
+			Console.SetOut( new StringWriter( output ) );
+		}
+
+		[TearDown]
+		public void CleanUp()
+		{
+			Console.SetOut( saveOut );
+
+			FileInfo file = new FileInfo(xmlFile);
+			if(file.Exists) file.Delete();
+
+			file = new FileInfo( "TestResult.xml" );
+			if(file.Exists) file.Delete();
+		}
+
+		[Test]
+		public void FailureFixture() 
+		{
+            int resultCode = runFixture(typeof(FailureTest), "-noxml"); 
+			Assert.AreEqual(1, resultCode);
+		}
+
+		[Test]
+		public void MultiFailureFixture() 
+		{
+            int resultCode = runFixture(typeof(MultiFailureTest), "-noxml"); 
+			Assert.AreEqual(3, resultCode);
+		}
+
+		[Test]
+		public void SuccessFixture()
+		{
+            int resultCode = runFixture(typeof(SuccessTest), "-noxml");
+			Assert.AreEqual(0, resultCode);
+		}
+
+		[Test]
+		public void XmlResult() 
+		{
+			FileInfo info = new FileInfo(xmlFile);
+			info.Delete();
+
+			int resultCode = runFixture(typeof(SuccessTest), "-xml:" + xmlFile);
+
+			Assert.AreEqual(0, resultCode);
+			Assert.AreEqual(true, info.Exists);
+		}
+
+		[Test]
+		public void InvalidFixture()
+		{
+			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", "-noxml" });
+            Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
+        }
+
+        [Test]
+        public void OneOfTwoAssembliesNotFound()
+        {
+            int resultCode = executeConsole(new string[] { GetType().Module.Name, "badassembly.dll", "-noxml" });
+            Assert.AreEqual(ConsoleUi.FILE_NOT_FOUND, resultCode);
+        }
+
+		[Test]
+		public void XmlToConsole() 
+		{
+			int resultCode = runFixture( 
+				typeof(SuccessTest),
+				"-xmlconsole", 
+				"-nologo" );
+
+			Assert.AreEqual(0, resultCode);
+			StringAssert.Contains( @"<?xml version=""1.0""", output.ToString(),
+				"Only XML should be displayed in xmlconsole mode");
+		}
+
+		[Test]
+		public void Bug1073539Test()
+		{
+			int resultCode = runFixture( typeof( Bug1073539Fixture ), "-noxml" );
+			Assert.AreEqual( 1, resultCode );
+		}
+
+		[Test]
+		public void Bug1311644Test()
+		{
+			int resultCode = runFixture( typeof( Bug1311644Fixture ), "-noxml" );
+			Assert.AreEqual( 1, resultCode );
+		}
+
+		[Test]
+		public void CanRunWithoutTestDomain()
+		{
+            Assert.AreEqual(expectedReturnCode, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-noxml"));
+			StringAssert.Contains( failureMsg, output.ToString() );
+		}
+
+		[Test]
+		public void CanRunWithSingleTestDomain()
+		{
+            Assert.AreEqual(expectedReturnCode, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-noxml"));
+			StringAssert.Contains( failureMsg, output.ToString() );
+		}
+
+		[Test]
+		public void CanRunWithMultipleTestDomains()
+		{
+            Assert.AreEqual(expectedReturnCode, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-noxml"));
+			StringAssert.Contains( failureMsg, output.ToString() );
+		}
+
+		[Test]
+		public void CanRunWithoutTestDomain_NoThread()
+		{
+            Assert.AreEqual(expectedReturnCode, executeConsole(MockAssembly.AssemblyPath, "-domain:None", "-nothread", "-noxml"));
+			StringAssert.Contains( failureMsg, output.ToString() );
+		}
+
+		[Test]
+		public void CanRunWithSingleTestDomain_NoThread()
+		{
+            Assert.AreEqual(expectedReturnCode, executeConsole(MockAssembly.AssemblyPath, "-domain:Single", "-nothread", "-noxml"));
+			StringAssert.Contains( failureMsg, output.ToString() );
+		}
+
+		[Test]
+		public void CanRunWithMultipleTestDomains_NoThread()
+		{
+            Assert.AreEqual(expectedReturnCode, executeConsole(MockAssembly.AssemblyPath, NoNamespaceTestFixture.AssemblyPath, "-domain:Multiple", "-nothread", "-noxml"));
+			StringAssert.Contains( failureMsg, output.ToString() );
+		}
+
+        [Test]
+        public void CanSpecifyBasePathAndPrivateBinPath()
+        {
+            // Assuming mock assembly is at ...x/y/z/mock-assembly.dll
+            string basePath = Path.GetDirectoryName(MockAssembly.AssemblyPath); // ...x/y/z
+            string privateBinPath = Path.GetFileName(basePath); // z
+            basePath = Path.GetDirectoryName(basePath); // ...x/y
+            privateBinPath = Path.Combine(Path.GetFileName(basePath), privateBinPath); // y/z
+            basePath = Path.GetDirectoryName(basePath); // ...x
+
+            Assert.AreEqual(expectedReturnCode, executeConsole("mock-assembly.dll", "-basepath=" + basePath, "-privatebinpath=" + privateBinPath, "-noxml"));
+            StringAssert.Contains( failureMsg, output.ToString());
+        }
+
+		[Test]
+		public void DoesNotFailWithEmptyRunList()
+		{
+			string path = Path.GetTempFileName();
+
+			int returnCode = runFixture(typeof(SuccessTest), "-runlist=" + path, "-noxml");
+			Assert.AreEqual(0, returnCode);
+			StringAssert.Contains("Tests run: 0", output.ToString());
+
+			File.Delete(path);
+		}
+
+		[Test]
+		public void DoesNotFailIfRunListHasEmptyLines()
+		{
+			string path = Path.GetTempFileName();
+
+			using(StreamWriter writer = File.CreateText(path))
+				writer.WriteLine();
+
+			int returnCode = runFixture(typeof(SuccessTest), "-runlist=" + path, "-noxml");
+			Assert.AreEqual(0, returnCode);
+			StringAssert.Contains("Tests run: 0", output.ToString());
+		
+			File.Delete(path);
+		}
+
+		[Test]
+		public void FailsGracefullyIfRunListPointsToNonExistingFile()
+		{
+			int returnCode = runFixture(typeof(SuccessTest), "-runlist=NonExistingFile.txt");
+			Assert.AreEqual(ConsoleUi.INVALID_ARG, returnCode);
+			StringAssert.Contains("NonExistingFile.txt", output.ToString());
+		}
+
+
+		[Test]
+		public void FailsGracefullyIfRunListPointsToNonExistingDirectory()
+		{
+			int returnCode = runFixture(typeof(SuccessTest), "-runlist=NonExistingDirectory\\NonExistingFile.txt");
+			Assert.AreEqual(ConsoleUi.INVALID_ARG, returnCode);
+			StringAssert.Contains("NonExistingDirectory", output.ToString());
+		}
+
+		private int runFixture( Type type )
+		{
+            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+2];
+			int n = 0;
+			args[n++] = AssemblyHelper.GetAssemblyPath(type);
+			args[n++] = "-fixture:" + type.FullName;
+			foreach( string arg in arguments )
+				args[n++] = arg;
+			return executeConsole( args ); 
+		}
+
+        // Run test in process using console. For test purposes,
+        // avoid use of another process and turn trace off.
+        private int executeConsole( params string[] 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/TestNameParserTests.cs b/src/ConsoleRunner/tests/TestNameParserTests.cs
index 2ea2ed4..dd80bd1 100644
--- a/src/ConsoleRunner/tests/TestNameParserTests.cs
+++ b/src/ConsoleRunner/tests/TestNameParserTests.cs
@@ -1,43 +1,43 @@
-// ****************************************************************
-// Copyright 2011, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.ConsoleRunner.Tests
-{
-    public class TestNameParserTests
-    {
-        [TestCase("Test.Namespace.Fixture.Method")]
-        [TestCase("Test.Namespace.Fixture.Method,")]
-        [TestCase("  Test.Namespace.Fixture.Method  ")]
-        [TestCase("  Test.Namespace.Fixture.Method  ,")]
-        [TestCase("Test.Namespace.Fixture.Method()")]
-        [TestCase("Test.Namespace.Fixture.Method(\"string,argument\")")]
-        [TestCase("Test.Namespace.Fixture.Method(1,2,3)")]
-        [TestCase("Test.Namespace.Fixture.Method<int,int>()")]
-        [TestCase("Test.Namespace.Fixture.Method(\")\")")]
-        public void SingleName(string name)
-        {
-            string[] names = TestNameParser.Parse(name);
-            Assert.AreEqual(1, names.Length);
-            Assert.AreEqual(name.Trim(new char[] { ' ', ',' }), names[0]);
-        }
-
-        [TestCase("Test.Namespace.Fixture.Method1", "Test.Namespace.Fixture.Method2")]
-        [TestCase("Test.Namespace.Fixture.Method1", "Test.Namespace.Fixture.Method2,")]
-        [TestCase("Test.Namespace.Fixture.Method1(1,2)", "Test.Namespace.Fixture.Method2(3,4)")]
-        [TestCase("Test.Namespace.Fixture.Method1(\"(\")", "Test.Namespace.Fixture.Method2(\"<\")")]
-        public void TwoNames(string name1, string name2)
-        {
-            char[] delims = new char[] { ' ', ',' };
-            string[] names = TestNameParser.Parse(name1 + "," + name2);
-            Assert.AreEqual(2, names.Length);
-            Assert.AreEqual(name1.Trim(delims), names[0]);
-            Assert.AreEqual(name2.Trim(delims), names[1]);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2011, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.ConsoleRunner.Tests
+{
+    public class TestNameParserTests
+    {
+        [TestCase("Test.Namespace.Fixture.Method")]
+        [TestCase("Test.Namespace.Fixture.Method,")]
+        [TestCase("  Test.Namespace.Fixture.Method  ")]
+        [TestCase("  Test.Namespace.Fixture.Method  ,")]
+        [TestCase("Test.Namespace.Fixture.Method()")]
+        [TestCase("Test.Namespace.Fixture.Method(\"string,argument\")")]
+        [TestCase("Test.Namespace.Fixture.Method(1,2,3)")]
+        [TestCase("Test.Namespace.Fixture.Method<int,int>()")]
+        [TestCase("Test.Namespace.Fixture.Method(\")\")")]
+        public void SingleName(string name)
+        {
+            string[] names = TestNameParser.Parse(name);
+            Assert.AreEqual(1, names.Length);
+            Assert.AreEqual(name.Trim(new char[] { ' ', ',' }), names[0]);
+        }
+
+        [TestCase("Test.Namespace.Fixture.Method1", "Test.Namespace.Fixture.Method2")]
+        [TestCase("Test.Namespace.Fixture.Method1", "Test.Namespace.Fixture.Method2,")]
+        [TestCase("Test.Namespace.Fixture.Method1(1,2)", "Test.Namespace.Fixture.Method2(3,4)")]
+        [TestCase("Test.Namespace.Fixture.Method1(\"(\")", "Test.Namespace.Fixture.Method2(\"<\")")]
+        public void TwoNames(string name1, string name2)
+        {
+            char[] delims = new char[] { ' ', ',' };
+            string[] names = TestNameParser.Parse(name1 + "," + name2);
+            Assert.AreEqual(2, names.Length);
+            Assert.AreEqual(name1.Trim(delims), names[0]);
+            Assert.AreEqual(name2.Trim(delims), names[1]);
+        }
+    }
+}
diff --git a/src/ConsoleRunner/tests/nunit-console.tests.build b/src/ConsoleRunner/tests/nunit-console.tests.build
index d7ae33b..d2a5a05 100644
--- a/src/ConsoleRunner/tests/nunit-console.tests.build
+++ b/src/ConsoleRunner/tests/nunit-console.tests.build
@@ -1,43 +1,45 @@
-<?xml version="1.0"?>
-<project name="NUnit.Console.Tests" default="build">
-
-  <patternset id="source-files">
-    <include name="CommandLineTests.cs"/>
-    <include name="CommandLineTests_MultipleAssemblies.cs"/>
-    <include name="ConsoleRunnerTest.cs"/>
-    <include name="TestNameParserTests.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-      output="${current.test.dir}/nunit-console.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.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.lib.dir}/nunit-console-runner.dll"/>
-        <include name="${current.test.dir}/nunit.framework.tests.dll"/>
-        <include name="${current.test.dir}/test-assembly.dll"/>
-        <include name="${current.test.dir}/mock-assembly.dll"/>
-		<include name="${current.test.dir}/nonamespace-assembly.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/ConsoleRunner/tests">
-      <fileset>
-        <patternset refid="source-files" />
-        <include name="nunit-console.tests.csproj" />
-        <include name="nunit-console.tests.build" />
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnit.Console.Tests" default="build">
+
+  <patternset id="source-files">
+    <include name="CommandLineTests.cs"/>
+    <include name="CommandLineTests_MultipleAssemblies.cs"/>
+    <include name="ConsoleRunnerTest.cs"/>
+    <include name="TestNameParserTests.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+      output="${current.test.dir}/nunit-console.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.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit-console-runner.dll"/>
+        <include name="${current.test.dir}/nunit.framework.tests.dll"/>
+        <include name="${current.test.dir}/test-assembly.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+		    <include name="${current.test.dir}/nonamespace-assembly.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/ConsoleRunner/tests">
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="EmptyLineTextFile.txt" />
+        <include name="EmptyTextFile.txt" />
+        <include name="nunit-console.tests.csproj" />
+        <include name="nunit-console.tests.build" />
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/ConsoleRunner/tests/nunit-console.tests.csproj b/src/ConsoleRunner/tests/nunit-console.tests.csproj
index 094100e..29d4111 100644
--- a/src/ConsoleRunner/tests/nunit-console.tests.csproj
+++ b/src/ConsoleRunner/tests/nunit-console.tests.csproj
@@ -1,130 +1,159 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8597D2C6-804D-48CB-BFC7-ED2404D389B0}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-console.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>ConsoleRunner.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Name>nunit.core.interfaces.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\tests\nunit.core.tests.csproj">
-      <Name>nunit.core.tests</Name>
-      <Project>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Name>mock-assembly</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
-      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
-      <Name>nonamespace-assembly</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
-      <Name>test-assembly</Name>
-      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-console\nunit-console.csproj">
-      <Name>nunit-console</Name>
-      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="CommandLineTests.cs" />
-    <Compile Include="CommandLineTests_MultipleAssemblies.cs" />
-    <Compile Include="ConsoleRunnerTest.cs" />
-    <Compile Include="TestNameParserTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit-console.tests.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8597D2C6-804D-48CB-BFC7-ED2404D389B0}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-console.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>ConsoleRunner.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Name>mock-assembly</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Name>nonamespace-assembly</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
+      <Name>test-assembly</Name>
+      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-console\nunit-console.csproj">
+      <Name>nunit-console</Name>
+      <Project>{9367EC89-6A38-42BA-9607-0DC288E4BC3A}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CommandLineTests.cs" />
+    <Compile Include="CommandLineTests_MultipleAssemblies.cs" />
+    <Compile Include="ConsoleRunnerTest.cs" />
+    <Compile Include="TestNameParserTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-console.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/ConsoleRunner/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/ConsoleRunner/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..c2612eb
Binary files /dev/null and b/src/ConsoleRunner/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.csproj.FileListAbsolute.txt b/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..9c61b07
--- /dev/null
+++ b/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit-console.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit-console.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\ConsoleRunner\tests\obj\Debug\nunit-console.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\ConsoleRunner\tests\obj\Debug\nunit-console.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\ConsoleRunner\tests\obj\Debug\nunit-console.tests.csprojResolveAssemblyReference.cache
diff --git a/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.csprojResolveAssemblyReference.cache b/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..bba1f7a
Binary files /dev/null and b/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.pdb b/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.pdb
new file mode 100644
index 0000000..581feab
Binary files /dev/null and b/src/ConsoleRunner/tests/obj/Debug/nunit-console.tests.pdb differ
diff --git a/src/GuiComponents/UiKit/AddConfigurationDialog.cs b/src/GuiComponents/UiKit/AddConfigurationDialog.cs
index 8f8bc58..c1b9e75 100644
--- a/src/GuiComponents/UiKit/AddConfigurationDialog.cs
+++ b/src/GuiComponents/UiKit/AddConfigurationDialog.cs
@@ -1,230 +1,230 @@
-// ****************************************************************
-// 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.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-    /// Displays a dialog for creation of a new configuration.
-    /// The dialog collects and validates the name and the
-    /// name of a configuration to be copied and then adds the
-    /// new configuration to the project.
-    /// 
-    /// A DialogResult of DialogResult.OK indicates that the
-    /// configuration was added successfully.
-    /// </summary>
-    public class AddConfigurationDialog : NUnitFormBase
-	{
-		#region Instance variables
-
-		private NUnitProject project;
-		private string configurationName;
-		private string copyConfigurationName;
-
-		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;
-
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		#endregion
-
-		#region Construction and Disposal
-
-		public AddConfigurationDialog( NUnitProject project )
-		{ 
-			InitializeComponent();
-			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()
-		{
-			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;
-			this.configurationNameTextBox.Text = "";
-			// 
-			// 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 = 1;
-			this.okButton.Text = "OK";
-			this.okButton.Click += new System.EventHandler(this.okButton_Click);
-			// 
-			// 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.TabIndex = 2;
-			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 = 3;
-			// 
-			// 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.Load += new System.EventHandler(this.ConfigurationNameDialog_Load);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		#region Properties
-
-		public string ConfigurationName
-		{
-			get { return configurationName; }
-		}
-
-		public string CopyConfigurationName
-		{
-			get { return copyConfigurationName; }
-		}
-
-		#endregion
-
-		#region Methods
-
-		private void ConfigurationNameDialog_Load(object sender, System.EventArgs e)
-		{
-			configurationComboBox.Items.Add( "<none>" );
-			configurationComboBox.SelectedIndex = 0;
-
-			foreach( ProjectConfig config in project.Configs )
-			{
-				int index = configurationComboBox.Items.Add( config.Name );
-				if ( config.Name == project.ActiveConfigName )
-					configurationComboBox.SelectedIndex = index;
-			}
-		}
-
-		private void okButton_Click(object sender, System.EventArgs e)
-		{
-			configurationName = configurationNameTextBox.Text;
-
-			if ( configurationName == string.Empty )
-			{
-                MessageDisplay.Error("No configuration name provided");
-				return;
-			}
-
-			if ( project.Configs.Contains( configurationName ) )
-			{
-                MessageDisplay.Error("A configuration with that name already exists");
-				return;
-			}
-
-			// ToDo: Move more of this to project
-			ProjectConfig newConfig = new ProjectConfig( configurationName );
-				
-			copyConfigurationName = null;
-			if ( configurationComboBox.SelectedIndex > 0 )
-			{		
-				copyConfigurationName = (string)configurationComboBox.SelectedItem;
-				ProjectConfig copyConfig = project.Configs[copyConfigurationName];
-				if ( copyConfig != null )
-					foreach( string assembly in copyConfig.Assemblies )
-						newConfig.Assemblies.Add( assembly );
-			}
-
-			project.Configs.Add( newConfig );
-			DialogResult = DialogResult.OK;
-
-			Close();
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+    /// Displays a dialog for creation of a new configuration.
+    /// The dialog collects and validates the name and the
+    /// name of a configuration to be copied and then adds the
+    /// new configuration to the project.
+    /// 
+    /// A DialogResult of DialogResult.OK indicates that the
+    /// configuration was added successfully.
+    /// </summary>
+    public class AddConfigurationDialog : NUnitFormBase
+	{
+		#region Instance variables
+
+		private NUnitProject project;
+		private string configurationName;
+		private string copyConfigurationName;
+
+		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;
+
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		#endregion
+
+		#region Construction and Disposal
+
+		public AddConfigurationDialog( NUnitProject project )
+		{ 
+			InitializeComponent();
+			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()
+		{
+			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;
+			this.configurationNameTextBox.Text = "";
+			// 
+			// 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 = 1;
+			this.okButton.Text = "OK";
+			this.okButton.Click += new System.EventHandler(this.okButton_Click);
+			// 
+			// 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.TabIndex = 2;
+			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 = 3;
+			// 
+			// 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.Load += new System.EventHandler(this.ConfigurationNameDialog_Load);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Properties
+
+		public string ConfigurationName
+		{
+			get { return configurationName; }
+		}
+
+		public string CopyConfigurationName
+		{
+			get { return copyConfigurationName; }
+		}
+
+		#endregion
+
+		#region Methods
+
+		private void ConfigurationNameDialog_Load(object sender, System.EventArgs e)
+		{
+			configurationComboBox.Items.Add( "<none>" );
+			configurationComboBox.SelectedIndex = 0;
+
+			foreach( ProjectConfig config in project.Configs )
+			{
+				int index = configurationComboBox.Items.Add( config.Name );
+				if ( config.Name == project.ActiveConfigName )
+					configurationComboBox.SelectedIndex = index;
+			}
+		}
+
+		private void okButton_Click(object sender, System.EventArgs e)
+		{
+			configurationName = configurationNameTextBox.Text;
+
+			if ( configurationName == string.Empty )
+			{
+                MessageDisplay.Error("No configuration name provided");
+				return;
+			}
+
+			if ( project.Configs.Contains( configurationName ) )
+			{
+                MessageDisplay.Error("A configuration with that name already exists");
+				return;
+			}
+
+			// ToDo: Move more of this to project
+			ProjectConfig newConfig = new ProjectConfig( configurationName );
+				
+			copyConfigurationName = null;
+			if ( configurationComboBox.SelectedIndex > 0 )
+			{		
+				copyConfigurationName = (string)configurationComboBox.SelectedItem;
+				ProjectConfig copyConfig = project.Configs[copyConfigurationName];
+				if ( copyConfig != null )
+					foreach( string assembly in copyConfig.Assemblies )
+						newConfig.Assemblies.Add( assembly );
+			}
+
+			project.Configs.Add( newConfig );
+			DialogResult = DialogResult.OK;
+
+			Close();
+		}
+
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/AddConfigurationDialog.resx b/src/GuiComponents/UiKit/AddConfigurationDialog.resx
index dc8d476..66c5d7f 100644
--- a/src/GuiComponents/UiKit/AddConfigurationDialog.resx
+++ b/src/GuiComponents/UiKit/AddConfigurationDialog.resx
@@ -1,184 +1,184 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="configurationNameTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configurationNameTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="configurationNameTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configurationComboBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configurationComboBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="configurationComboBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>AddConfigurationDialog</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="configurationNameTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="configurationNameTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="configurationNameTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="configurationComboBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="configurationComboBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="configurationComboBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>AddConfigurationDialog</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/AddTabPageDialog.cs b/src/GuiComponents/UiKit/AddTabPageDialog.cs
index 8f644ff..325f595 100644
--- a/src/GuiComponents/UiKit/AddTabPageDialog.cs
+++ b/src/GuiComponents/UiKit/AddTabPageDialog.cs
@@ -1,141 +1,141 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for NewTabPageDialog.
-	/// </summary>
-    public class AddTabPageDialog : NUnitFormBase
-	{
-		private TextDisplayTabSettings tabSettings;
-
-		private System.Windows.Forms.TextBox titleTextBox;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Button okButton;
-		private System.Windows.Forms.Button cancelButton;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public AddTabPageDialog(TextDisplayTabSettings tabSettings)
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			this.tabSettings = tabSettings;
-		}
-
-		/// <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.titleTextBox = new System.Windows.Forms.TextBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.okButton = new System.Windows.Forms.Button();
-			this.cancelButton = new System.Windows.Forms.Button();
-			this.SuspendLayout();
-			// 
-			// titleTextBox
-			// 
-			this.titleTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.titleTextBox.Location = new System.Drawing.Point(16, 32);
-			this.titleTextBox.Name = "titleTextBox";
-			this.titleTextBox.Size = new System.Drawing.Size(312, 22);
-			this.titleTextBox.TabIndex = 0;
-			this.titleTextBox.Text = "";
-			// 
-			// label1
-			// 
-			this.label1.Location = new System.Drawing.Point(16, 8);
-			this.label1.Name = "label1";
-			this.label1.TabIndex = 1;
-			this.label1.Text = "Tab Page Title:";
-			// 
-			// okButton
-			// 
-			this.okButton.Location = new System.Drawing.Point(88, 72);
-			this.okButton.Name = "okButton";
-			this.okButton.TabIndex = 2;
-			this.okButton.Text = "OK";
-			this.okButton.Click += new System.EventHandler(this.okButton_Click);
-			// 
-			// cancelButton
-			// 
-			this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.cancelButton.Location = new System.Drawing.Point(184, 72);
-			this.cancelButton.Name = "cancelButton";
-			this.cancelButton.TabIndex = 3;
-			this.cancelButton.Text = "Cancel";
-			// 
-			// AddTabPageDialog
-			// 
-			this.AcceptButton = this.okButton;
-			this.CancelButton = this.cancelButton;
-			this.ClientSize = new System.Drawing.Size(344, 104);
-			this.ControlBox = false;
-			this.Controls.Add(this.cancelButton);
-			this.Controls.Add(this.okButton);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.titleTextBox);
-			this.Name = "AddTabPageDialog";
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "New Tab Page";
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		public string Title
-		{
-			get { return titleTextBox.Text; }
-		}
-
-		private void okButton_Click(object sender, System.EventArgs e)
-		{
-			if ( Title == string.Empty )
-			{
-                MessageDisplay.Error("No title entered");
-				return;
-			}
-
-			tabSettings.Tabs.AddNewTab( Title );
-
-			DialogResult = DialogResult.OK;
-			this.Close();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for NewTabPageDialog.
+	/// </summary>
+    public class AddTabPageDialog : NUnitFormBase
+	{
+		private TextDisplayTabSettings tabSettings;
+
+		private System.Windows.Forms.TextBox titleTextBox;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Button okButton;
+		private System.Windows.Forms.Button cancelButton;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public AddTabPageDialog(TextDisplayTabSettings tabSettings)
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			this.tabSettings = tabSettings;
+		}
+
+		/// <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.titleTextBox = new System.Windows.Forms.TextBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.okButton = new System.Windows.Forms.Button();
+			this.cancelButton = new System.Windows.Forms.Button();
+			this.SuspendLayout();
+			// 
+			// titleTextBox
+			// 
+			this.titleTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.titleTextBox.Location = new System.Drawing.Point(16, 32);
+			this.titleTextBox.Name = "titleTextBox";
+			this.titleTextBox.Size = new System.Drawing.Size(312, 22);
+			this.titleTextBox.TabIndex = 0;
+			this.titleTextBox.Text = "";
+			// 
+			// label1
+			// 
+			this.label1.Location = new System.Drawing.Point(16, 8);
+			this.label1.Name = "label1";
+			this.label1.TabIndex = 1;
+			this.label1.Text = "Tab Page Title:";
+			// 
+			// okButton
+			// 
+			this.okButton.Location = new System.Drawing.Point(88, 72);
+			this.okButton.Name = "okButton";
+			this.okButton.TabIndex = 2;
+			this.okButton.Text = "OK";
+			this.okButton.Click += new System.EventHandler(this.okButton_Click);
+			// 
+			// cancelButton
+			// 
+			this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cancelButton.Location = new System.Drawing.Point(184, 72);
+			this.cancelButton.Name = "cancelButton";
+			this.cancelButton.TabIndex = 3;
+			this.cancelButton.Text = "Cancel";
+			// 
+			// AddTabPageDialog
+			// 
+			this.AcceptButton = this.okButton;
+			this.CancelButton = this.cancelButton;
+			this.ClientSize = new System.Drawing.Size(344, 104);
+			this.ControlBox = false;
+			this.Controls.Add(this.cancelButton);
+			this.Controls.Add(this.okButton);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.titleTextBox);
+			this.Name = "AddTabPageDialog";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "New Tab Page";
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		public string Title
+		{
+			get { return titleTextBox.Text; }
+		}
+
+		private void okButton_Click(object sender, System.EventArgs e)
+		{
+			if ( Title == string.Empty )
+			{
+                MessageDisplay.Error("No title entered");
+				return;
+			}
+
+			tabSettings.Tabs.AddNewTab( Title );
+
+			DialogResult = DialogResult.OK;
+			this.Close();
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/AddTabPageDialog.resx b/src/GuiComponents/UiKit/AddTabPageDialog.resx
index 3c993dd..4013f04 100644
--- a/src/GuiComponents/UiKit/AddTabPageDialog.resx
+++ b/src/GuiComponents/UiKit/AddTabPageDialog.resx
@@ -1,166 +1,166 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="titleTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="titleTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="titleTextBox.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="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="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$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.Name">
-    <value>AddTabPageDialog</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="titleTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="titleTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="titleTextBox.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="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="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$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.Name">
+    <value>AddTabPageDialog</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/AppContainer.cs b/src/GuiComponents/UiKit/AppContainer.cs
index 15383ae..51ea7d8 100644
--- a/src/GuiComponents/UiKit/AppContainer.cs
+++ b/src/GuiComponents/UiKit/AppContainer.cs
@@ -1,70 +1,70 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.ComponentModel;
-using System.ComponentModel.Design;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// AppContainer acts as the container nunit components, providing 
-	/// them with a Site from which services may be acquired.
-	/// </summary>
-	public class AppContainer : Container
-	{
-		public AppContainer()
-		{
-			// We use a single root-level service container for the app
-			_services = new ServiceContainer();
-			// Add the service containter to itself as a service!
-			// This allows components to get access to the ServiceContainer
-			// service in order to add services themselves.
-			_services.AddService( typeof( IServiceContainer ), _services );
-		}
- 
-		ServiceContainer _services;
-		public IServiceContainer Services 
-		{
-			get { return _services; }
-		}
-
-		// Override GetService so that any components in this
-		// container get access to services in the associated
-		// ServiceContainer.
-		protected override object GetService(Type service)
-		{
-			object s = _services.GetService(service);
-			if (s == null) s = base.GetService(service);
-			return s;
-		}
-
-		public static ISite GetSite( Control control )
-		{
-			while( control != null && control.Site == null )
-				control = control.Parent;
-			return control == null ? null : control.Site;
-		}
-
-		public static IContainer GetContainer( Control control )
-		{
-			ISite site = GetSite( control );
-			return site == null ? null : site.Container;
-		}
-
-		public static object GetService( Control control, Type service )
-		{
-			ISite site = GetSite( control );
-			return site == null ? null : site.GetService( service );
-		}
-
-		public static AppContainer GetAppContainer( Control control )
-		{
-			return GetContainer( control ) as AppContainer;
-		}
-	} 
-}
+// ****************************************************************
+// Copyright 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.ComponentModel;
+using System.ComponentModel.Design;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// AppContainer acts as the container nunit components, providing 
+	/// them with a Site from which services may be acquired.
+	/// </summary>
+	public class AppContainer : Container
+	{
+		public AppContainer()
+		{
+			// We use a single root-level service container for the app
+			_services = new ServiceContainer();
+			// Add the service containter to itself as a service!
+			// This allows components to get access to the ServiceContainer
+			// service in order to add services themselves.
+			_services.AddService( typeof( IServiceContainer ), _services );
+		}
+ 
+		ServiceContainer _services;
+		public IServiceContainer Services 
+		{
+			get { return _services; }
+		}
+
+		// Override GetService so that any components in this
+		// container get access to services in the associated
+		// ServiceContainer.
+		protected override object GetService(Type service)
+		{
+			object s = _services.GetService(service);
+			if (s == null) s = base.GetService(service);
+			return s;
+		}
+
+		public static ISite GetSite( Control control )
+		{
+			while( control != null && control.Site == null )
+				control = control.Parent;
+			return control == null ? null : control.Site;
+		}
+
+		public static IContainer GetContainer( Control control )
+		{
+			ISite site = GetSite( control );
+			return site == null ? null : site.Container;
+		}
+
+		public static object GetService( Control control, Type service )
+		{
+			ISite site = GetSite( control );
+			return site == null ? null : site.GetService( service );
+		}
+
+		public static AppContainer GetAppContainer( Control control )
+		{
+			return GetContainer( control ) as AppContainer;
+		}
+	} 
+}
diff --git a/src/GuiComponents/UiKit/AssemblyInfo.cs b/src/GuiComponents/UiKit/AssemblyInfo.cs
index 4835bf6..a676cbf 100644
--- a/src/GuiComponents/UiKit/AssemblyInfo.cs
+++ b/src/GuiComponents/UiKit/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/GuiComponents/UiKit/ConfigurationEditor.cs b/src/GuiComponents/UiKit/ConfigurationEditor.cs
index c84cc70..704bff5 100644
--- a/src/GuiComponents/UiKit/ConfigurationEditor.cs
+++ b/src/GuiComponents/UiKit/ConfigurationEditor.cs
@@ -1,285 +1,285 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// ConfigurationEditor form is designed for adding, deleting
-	/// and renaming configurations from a project.
-	/// </summary>
-    public class ConfigurationEditor : NUnitFormBase
-	{
-		#region Instance Variables
-
-		private NUnitProject project;
-
-		private int selectedIndex = -1;
-
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-		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;
-
-		#endregion
-
-		#region Construction and Disposal
-
-		public ConfigurationEditor( NUnitProject project )
-		{
-			InitializeComponent();
-			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.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ConfigurationEditor));
-			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;
-			this.configListBox.SelectedIndexChanged += new System.EventHandler(this.configListBox_SelectedIndexChanged);
-			// 
-			// 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";
-			this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
-			// 
-			// 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";
-			this.renameButton.Click += new System.EventHandler(this.renameButton_Click);
-			// 
-			// 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";
-			this.closeButton.Click += new System.EventHandler(this.okButton_Click);
-			// 
-			// 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...";
-			this.addButton.Click += new System.EventHandler(this.addButton_Click);
-			// 
-			// 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";
-			this.activeButton.Click += new System.EventHandler(this.activeButton_Click);
-			// 
-			// 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.Load += new System.EventHandler(this.ConfigurationEditor_Load);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-        #region UI Event Handlers
-
-        private void ConfigurationEditor_Load(object sender, System.EventArgs e)
-		{
-			FillListBox();
-			if ( configListBox.Items.Count > 0 )
-				configListBox.SelectedIndex = selectedIndex = 0;
-		}
-
-		private void removeButton_Click(object sender, System.EventArgs e)
-		{	
-			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 (MessageDisplay.Ask(msg) == DialogResult.No)
-					return;
-			}
-
-			project.Configs.RemoveAt( selectedIndex );
-			FillListBox();
-		}
-
-		private void renameButton_Click(object sender, System.EventArgs e)
-		{
-			RenameConfiguration( project.Configs[selectedIndex].Name );
-		}
-
-		private void addButton_Click(object sender, System.EventArgs e)
-		{
-			using( AddConfigurationDialog dlg = new AddConfigurationDialog( project ) )
-			{
-				this.Site.Container.Add( dlg );
-				if ( dlg.ShowDialog() == DialogResult.OK )
-					FillListBox();
-			}
-		}
-
-		private void activeButton_Click(object sender, System.EventArgs e)
-		{
-			project.SetActiveConfig( selectedIndex );
-			FillListBox();
-		}
-
-		private void okButton_Click(object sender, System.EventArgs e)
-		{
-			DialogResult = DialogResult.OK;
-			Close();
-		}
-
-		private void configListBox_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			selectedIndex = configListBox.SelectedIndex;
-			activeButton.Enabled = selectedIndex >= 0 && project.Configs[selectedIndex].Name != project.ActiveConfigName;
-			renameButton.Enabled = addButton.Enabled = selectedIndex >= 0;
-			removeButton.Enabled = selectedIndex >= 0 && configListBox.Items.Count > 0;
-		}
-
-		#endregion
-
-		#region Helper Methods
-
-		private void RenameConfiguration( string oldName )
-		{
-			using( RenameConfigurationDialog dlg = 
-					   new RenameConfigurationDialog( project, oldName ) )
-			{
-				this.Site.Container.Add( dlg );
-				if ( dlg.ShowDialog() == DialogResult.OK )
-				{
-					project.Configs[oldName].Name = dlg.ConfigurationName;
-					FillListBox();
-				}
-			}
-		}
-
-		private void FillListBox()
-		{
-			configListBox.Items.Clear();
-			int count = 0;
-
-			foreach( ProjectConfig config in project.Configs )
-			{
-				string name = config.Name;
-
-				if ( name == project.ActiveConfigName )
-					name += " (active)";
-				
-				configListBox.Items.Add( name );
-				count++;
-			}	
-		
-			if ( count > 0 )
-			{
-				if( selectedIndex >= count )
-					selectedIndex = count - 1;
-
-				configListBox.SelectedIndex = selectedIndex;
-			}
-			else selectedIndex = -1;
-		}
-
-		#endregion
-
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// ConfigurationEditor form is designed for adding, deleting
+	/// and renaming configurations from a project.
+	/// </summary>
+    public class ConfigurationEditor : NUnitFormBase
+	{
+		#region Instance Variables
+
+		private NUnitProject project;
+
+		private int selectedIndex = -1;
+
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+		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;
+
+		#endregion
+
+		#region Construction and Disposal
+
+		public ConfigurationEditor( NUnitProject project )
+		{
+			InitializeComponent();
+			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.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ConfigurationEditor));
+			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;
+			this.configListBox.SelectedIndexChanged += new System.EventHandler(this.configListBox_SelectedIndexChanged);
+			// 
+			// 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";
+			this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+			// 
+			// 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";
+			this.renameButton.Click += new System.EventHandler(this.renameButton_Click);
+			// 
+			// 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";
+			this.closeButton.Click += new System.EventHandler(this.okButton_Click);
+			// 
+			// 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...";
+			this.addButton.Click += new System.EventHandler(this.addButton_Click);
+			// 
+			// 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";
+			this.activeButton.Click += new System.EventHandler(this.activeButton_Click);
+			// 
+			// 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.Load += new System.EventHandler(this.ConfigurationEditor_Load);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        #region UI Event Handlers
+
+        private void ConfigurationEditor_Load(object sender, System.EventArgs e)
+		{
+			FillListBox();
+			if ( configListBox.Items.Count > 0 )
+				configListBox.SelectedIndex = selectedIndex = 0;
+		}
+
+		private void removeButton_Click(object sender, System.EventArgs e)
+		{	
+			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 (MessageDisplay.Ask(msg) == DialogResult.No)
+					return;
+			}
+
+			project.Configs.RemoveAt( selectedIndex );
+			FillListBox();
+		}
+
+		private void renameButton_Click(object sender, System.EventArgs e)
+		{
+			RenameConfiguration( project.Configs[selectedIndex].Name );
+		}
+
+		private void addButton_Click(object sender, System.EventArgs e)
+		{
+			using( AddConfigurationDialog dlg = new AddConfigurationDialog( project ) )
+			{
+				this.Site.Container.Add( dlg );
+				if ( dlg.ShowDialog() == DialogResult.OK )
+					FillListBox();
+			}
+		}
+
+		private void activeButton_Click(object sender, System.EventArgs e)
+		{
+			project.SetActiveConfig( selectedIndex );
+			FillListBox();
+		}
+
+		private void okButton_Click(object sender, System.EventArgs e)
+		{
+			DialogResult = DialogResult.OK;
+			Close();
+		}
+
+		private void configListBox_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			selectedIndex = configListBox.SelectedIndex;
+			activeButton.Enabled = selectedIndex >= 0 && project.Configs[selectedIndex].Name != project.ActiveConfigName;
+			renameButton.Enabled = addButton.Enabled = selectedIndex >= 0;
+			removeButton.Enabled = selectedIndex >= 0 && configListBox.Items.Count > 0;
+		}
+
+		#endregion
+
+		#region Helper Methods
+
+		private void RenameConfiguration( string oldName )
+		{
+			using( RenameConfigurationDialog dlg = 
+					   new RenameConfigurationDialog( project, oldName ) )
+			{
+				this.Site.Container.Add( dlg );
+				if ( dlg.ShowDialog() == DialogResult.OK )
+				{
+					project.Configs[oldName].Name = dlg.ConfigurationName;
+					FillListBox();
+				}
+			}
+		}
+
+		private void FillListBox()
+		{
+			configListBox.Items.Clear();
+			int count = 0;
+
+			foreach( ProjectConfig config in project.Configs )
+			{
+				string name = config.Name;
+
+				if ( name == project.ActiveConfigName )
+					name += " (active)";
+				
+				configListBox.Items.Add( name );
+				count++;
+			}	
+		
+			if ( count > 0 )
+			{
+				if( selectedIndex >= count )
+					selectedIndex = count - 1;
+
+				configListBox.SelectedIndex = selectedIndex;
+			}
+			else selectedIndex = -1;
+		}
+
+		#endregion
+
+	}
+}
diff --git a/src/GuiComponents/UiKit/ConfigurationEditor.resx b/src/GuiComponents/UiKit/ConfigurationEditor.resx
index 6ddf7c1..e29db06 100644
--- a/src/GuiComponents/UiKit/ConfigurationEditor.resx
+++ b/src/GuiComponents/UiKit/ConfigurationEditor.resx
@@ -1,215 +1,215 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="configListBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configListBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="configListBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="removeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="removeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="removeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="renameButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="renameButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="renameButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="closeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="closeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="closeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="addButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="activeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="activeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="activeButton.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">
-    <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.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>ConfigurationEditor</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
-        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="configListBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="configListBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="configListBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="removeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="removeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="removeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="renameButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="renameButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="renameButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="closeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="closeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="closeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="addButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="activeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="activeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="activeButton.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">
+    <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.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>ConfigurationEditor</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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/GuiComponents/UiKit/EditTabPagesDialog.cs b/src/GuiComponents/UiKit/EditTabPagesDialog.cs
index 3800445..e9f2cbc 100644
--- a/src/GuiComponents/UiKit/EditTabPagesDialog.cs
+++ b/src/GuiComponents/UiKit/EditTabPagesDialog.cs
@@ -1,225 +1,225 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for EditTabPagesDialog.
-	/// </summary>
-	public class EditTabPagesDialog : NUnitFormBase
-	{
-		private TextDisplayTabSettings tabSettings;
-		private int selectedIndex = -1;
-
-		private System.Windows.Forms.Button addButton;
-		private System.Windows.Forms.Button closeButton;
-		private System.Windows.Forms.Button removeButton;
-		private System.Windows.Forms.ListBox tabPageListBox;
-		private System.Windows.Forms.Button moveDownButton;
-		private System.Windows.Forms.Button moveUpButton;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public EditTabPagesDialog(TextDisplayTabSettings tabSettings)
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			this.tabSettings = tabSettings;
-		}
-
-		/// <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.addButton = new System.Windows.Forms.Button();
-			this.closeButton = new System.Windows.Forms.Button();
-			this.removeButton = new System.Windows.Forms.Button();
-			this.tabPageListBox = new System.Windows.Forms.ListBox();
-			this.moveUpButton = new System.Windows.Forms.Button();
-			this.moveDownButton = new System.Windows.Forms.Button();
-			this.SuspendLayout();
-			// 
-			// addButton
-			// 
-			this.addButton.Location = new System.Drawing.Point(192, 48);
-			this.addButton.Name = "addButton";
-			this.addButton.Size = new System.Drawing.Size(96, 32);
-			this.addButton.TabIndex = 10;
-			this.addButton.Text = "&Add...";
-			this.addButton.Click += new System.EventHandler(this.addButton_Click);
-			// 
-			// closeButton
-			// 
-			this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.closeButton.Location = new System.Drawing.Point(190, 218);
-			this.closeButton.Name = "closeButton";
-			this.closeButton.Size = new System.Drawing.Size(96, 32);
-			this.closeButton.TabIndex = 9;
-			this.closeButton.Text = "Close";
-			// 
-			// removeButton
-			// 
-			this.removeButton.Location = new System.Drawing.Point(190, 10);
-			this.removeButton.Name = "removeButton";
-			this.removeButton.Size = new System.Drawing.Size(96, 32);
-			this.removeButton.TabIndex = 7;
-			this.removeButton.Text = "&Remove";
-			this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
-			// 
-			// tabPageListBox
-			// 
-			this.tabPageListBox.ItemHeight = 16;
-			this.tabPageListBox.Location = new System.Drawing.Point(6, 10);
-			this.tabPageListBox.Name = "tabPageListBox";
-			this.tabPageListBox.Size = new System.Drawing.Size(168, 212);
-			this.tabPageListBox.TabIndex = 6;
-			this.tabPageListBox.SelectedIndexChanged += new System.EventHandler(this.tabPageListBox_SelectedIndexChanged);
-			// 
-			// moveUpButton
-			// 
-			this.moveUpButton.Location = new System.Drawing.Point(192, 88);
-			this.moveUpButton.Name = "moveUpButton";
-			this.moveUpButton.Size = new System.Drawing.Size(96, 32);
-			this.moveUpButton.TabIndex = 11;
-			this.moveUpButton.Text = "Move Up";
-			this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click);
-			// 
-			// moveDownButton
-			// 
-			this.moveDownButton.Location = new System.Drawing.Point(192, 128);
-			this.moveDownButton.Name = "moveDownButton";
-			this.moveDownButton.Size = new System.Drawing.Size(96, 32);
-			this.moveDownButton.TabIndex = 12;
-			this.moveDownButton.Text = "Move Down";
-			this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click);
-			// 
-			// EditTabPagesDialog
-			// 
-			this.AcceptButton = this.closeButton;
-			this.CancelButton = this.closeButton;
-			this.ClientSize = new System.Drawing.Size(292, 260);
-			this.ControlBox = false;
-			this.Controls.Add(this.moveDownButton);
-			this.Controls.Add(this.moveUpButton);
-			this.Controls.Add(this.addButton);
-			this.Controls.Add(this.closeButton);
-			this.Controls.Add(this.removeButton);
-			this.Controls.Add(this.tabPageListBox);
-			this.Name = "EditTabPagesDialog";
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "Edit Tab Pages";
-			this.Load += new System.EventHandler(this.EditTabPagesDialog_Load);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void EditTabPagesDialog_Load(object sender, System.EventArgs e)
-		{
-			FillListBox();
-			if ( tabPageListBox.Items.Count > 0 )
-				tabPageListBox.SelectedIndex = selectedIndex = 0;
-		}
-
-		private void tabPageListBox_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			selectedIndex = tabPageListBox.SelectedIndex;
-			removeButton.Enabled = selectedIndex >= 0;
-			moveUpButton.Enabled = selectedIndex > 0;
-			moveDownButton.Enabled = selectedIndex >= 0 && selectedIndex < tabPageListBox.Items.Count - 1;
-		}
-
-		private void addButton_Click(object sender, System.EventArgs e)
-		{
-			using( AddTabPageDialog dlg = new AddTabPageDialog(tabSettings) )
-			{
-				this.Site.Container.Add( dlg );
-				if ( dlg.ShowDialog() == DialogResult.OK )
-					FillListBox();
-			}		
-		}
-
-		private void removeButton_Click(object sender, System.EventArgs e)
-		{
-			tabSettings.Tabs.RemoveAt(selectedIndex);
-			FillListBox();
-		}
-
-		private void renameButton_Click(object sender, System.EventArgs e)
-		{
-			tabSettings.Tabs[selectedIndex].Title = "";
-		}
-
-		#region Helper Methods
-
-		private void FillListBox()
-		{
-			tabPageListBox.Items.Clear();
-
-			foreach( TextDisplayTabSettings.TabInfo tab in tabSettings.Tabs )
-				tabPageListBox.Items.Add( tab.Title );
-
-			int count = tabPageListBox.Items.Count;
-			if ( count > 0 )
-			{
-				if ( selectedIndex >= count )
-					selectedIndex = count - 1;
-
-				tabPageListBox.SelectedIndex = selectedIndex;
-			}
-			else selectedIndex = -1;
-		}
-
-		#endregion
-
-		private void moveUpButton_Click(object sender, System.EventArgs e)
-		{
-			TextDisplayTabSettings.TabInfo tab = tabSettings.Tabs[selectedIndex];
-			tabSettings.Tabs.RemoveAt(selectedIndex--);
-			tabSettings.Tabs.Insert(selectedIndex, tab );
-			FillListBox();
-		}
-
-		private void moveDownButton_Click(object sender, System.EventArgs e)
-		{
-			TextDisplayTabSettings.TabInfo tab = tabSettings.Tabs[selectedIndex];
-			tabSettings.Tabs.RemoveAt(selectedIndex++);
-			tabSettings.Tabs.Insert(selectedIndex, tab );
-			FillListBox();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for EditTabPagesDialog.
+	/// </summary>
+	public class EditTabPagesDialog : NUnitFormBase
+	{
+		private TextDisplayTabSettings tabSettings;
+		private int selectedIndex = -1;
+
+		private System.Windows.Forms.Button addButton;
+		private System.Windows.Forms.Button closeButton;
+		private System.Windows.Forms.Button removeButton;
+		private System.Windows.Forms.ListBox tabPageListBox;
+		private System.Windows.Forms.Button moveDownButton;
+		private System.Windows.Forms.Button moveUpButton;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public EditTabPagesDialog(TextDisplayTabSettings tabSettings)
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			this.tabSettings = tabSettings;
+		}
+
+		/// <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.addButton = new System.Windows.Forms.Button();
+			this.closeButton = new System.Windows.Forms.Button();
+			this.removeButton = new System.Windows.Forms.Button();
+			this.tabPageListBox = new System.Windows.Forms.ListBox();
+			this.moveUpButton = new System.Windows.Forms.Button();
+			this.moveDownButton = new System.Windows.Forms.Button();
+			this.SuspendLayout();
+			// 
+			// addButton
+			// 
+			this.addButton.Location = new System.Drawing.Point(192, 48);
+			this.addButton.Name = "addButton";
+			this.addButton.Size = new System.Drawing.Size(96, 32);
+			this.addButton.TabIndex = 10;
+			this.addButton.Text = "&Add...";
+			this.addButton.Click += new System.EventHandler(this.addButton_Click);
+			// 
+			// closeButton
+			// 
+			this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.closeButton.Location = new System.Drawing.Point(190, 218);
+			this.closeButton.Name = "closeButton";
+			this.closeButton.Size = new System.Drawing.Size(96, 32);
+			this.closeButton.TabIndex = 9;
+			this.closeButton.Text = "Close";
+			// 
+			// removeButton
+			// 
+			this.removeButton.Location = new System.Drawing.Point(190, 10);
+			this.removeButton.Name = "removeButton";
+			this.removeButton.Size = new System.Drawing.Size(96, 32);
+			this.removeButton.TabIndex = 7;
+			this.removeButton.Text = "&Remove";
+			this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+			// 
+			// tabPageListBox
+			// 
+			this.tabPageListBox.ItemHeight = 16;
+			this.tabPageListBox.Location = new System.Drawing.Point(6, 10);
+			this.tabPageListBox.Name = "tabPageListBox";
+			this.tabPageListBox.Size = new System.Drawing.Size(168, 212);
+			this.tabPageListBox.TabIndex = 6;
+			this.tabPageListBox.SelectedIndexChanged += new System.EventHandler(this.tabPageListBox_SelectedIndexChanged);
+			// 
+			// moveUpButton
+			// 
+			this.moveUpButton.Location = new System.Drawing.Point(192, 88);
+			this.moveUpButton.Name = "moveUpButton";
+			this.moveUpButton.Size = new System.Drawing.Size(96, 32);
+			this.moveUpButton.TabIndex = 11;
+			this.moveUpButton.Text = "Move Up";
+			this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click);
+			// 
+			// moveDownButton
+			// 
+			this.moveDownButton.Location = new System.Drawing.Point(192, 128);
+			this.moveDownButton.Name = "moveDownButton";
+			this.moveDownButton.Size = new System.Drawing.Size(96, 32);
+			this.moveDownButton.TabIndex = 12;
+			this.moveDownButton.Text = "Move Down";
+			this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click);
+			// 
+			// EditTabPagesDialog
+			// 
+			this.AcceptButton = this.closeButton;
+			this.CancelButton = this.closeButton;
+			this.ClientSize = new System.Drawing.Size(292, 260);
+			this.ControlBox = false;
+			this.Controls.Add(this.moveDownButton);
+			this.Controls.Add(this.moveUpButton);
+			this.Controls.Add(this.addButton);
+			this.Controls.Add(this.closeButton);
+			this.Controls.Add(this.removeButton);
+			this.Controls.Add(this.tabPageListBox);
+			this.Name = "EditTabPagesDialog";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Edit Tab Pages";
+			this.Load += new System.EventHandler(this.EditTabPagesDialog_Load);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void EditTabPagesDialog_Load(object sender, System.EventArgs e)
+		{
+			FillListBox();
+			if ( tabPageListBox.Items.Count > 0 )
+				tabPageListBox.SelectedIndex = selectedIndex = 0;
+		}
+
+		private void tabPageListBox_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			selectedIndex = tabPageListBox.SelectedIndex;
+			removeButton.Enabled = selectedIndex >= 0;
+			moveUpButton.Enabled = selectedIndex > 0;
+			moveDownButton.Enabled = selectedIndex >= 0 && selectedIndex < tabPageListBox.Items.Count - 1;
+		}
+
+		private void addButton_Click(object sender, System.EventArgs e)
+		{
+			using( AddTabPageDialog dlg = new AddTabPageDialog(tabSettings) )
+			{
+				this.Site.Container.Add( dlg );
+				if ( dlg.ShowDialog() == DialogResult.OK )
+					FillListBox();
+			}		
+		}
+
+		private void removeButton_Click(object sender, System.EventArgs e)
+		{
+			tabSettings.Tabs.RemoveAt(selectedIndex);
+			FillListBox();
+		}
+
+		private void renameButton_Click(object sender, System.EventArgs e)
+		{
+			tabSettings.Tabs[selectedIndex].Title = "";
+		}
+
+		#region Helper Methods
+
+		private void FillListBox()
+		{
+			tabPageListBox.Items.Clear();
+
+			foreach( TextDisplayTabSettings.TabInfo tab in tabSettings.Tabs )
+				tabPageListBox.Items.Add( tab.Title );
+
+			int count = tabPageListBox.Items.Count;
+			if ( count > 0 )
+			{
+				if ( selectedIndex >= count )
+					selectedIndex = count - 1;
+
+				tabPageListBox.SelectedIndex = selectedIndex;
+			}
+			else selectedIndex = -1;
+		}
+
+		#endregion
+
+		private void moveUpButton_Click(object sender, System.EventArgs e)
+		{
+			TextDisplayTabSettings.TabInfo tab = tabSettings.Tabs[selectedIndex];
+			tabSettings.Tabs.RemoveAt(selectedIndex--);
+			tabSettings.Tabs.Insert(selectedIndex, tab );
+			FillListBox();
+		}
+
+		private void moveDownButton_Click(object sender, System.EventArgs e)
+		{
+			TextDisplayTabSettings.TabInfo tab = tabSettings.Tabs[selectedIndex];
+			tabSettings.Tabs.RemoveAt(selectedIndex++);
+			tabSettings.Tabs.Insert(selectedIndex, tab );
+			FillListBox();
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/EditTabPagesDialog.resx b/src/GuiComponents/UiKit/EditTabPagesDialog.resx
index 46a4b19..8ca8478 100644
--- a/src/GuiComponents/UiKit/EditTabPagesDialog.resx
+++ b/src/GuiComponents/UiKit/EditTabPagesDialog.resx
@@ -1,184 +1,184 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="addButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="addButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="closeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="closeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="closeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="removeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="removeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="removeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPageListBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPageListBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabPageListBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="moveUpButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="moveUpButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="moveUpButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="moveDownButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="moveDownButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="moveDownButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.Name">
-    <value>EditTabPagesDialog</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="addButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="addButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="closeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="closeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="closeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="removeButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="removeButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="removeButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPageListBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPageListBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabPageListBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="moveUpButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="moveUpButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="moveUpButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="moveDownButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="moveDownButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="moveDownButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.Name">
+    <value>EditTabPagesDialog</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ErrorDisplay.cs b/src/GuiComponents/UiKit/ErrorDisplay.cs
index d00779d..00871d7 100644
--- a/src/GuiComponents/UiKit/ErrorDisplay.cs
+++ b/src/GuiComponents/UiKit/ErrorDisplay.cs
@@ -1,475 +1,475 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.Core;
-using CP.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for ErrorDisplay.
-	/// </summary>
-	public class ErrorDisplay : System.Windows.Forms.UserControl, TestObserver
-	{
-        static readonly Font DefaultFixedFont = new Font(FontFamily.GenericMonospace, 8.0F);
-
-        private ISettings settings = null;
-		int hoverIndex = -1;
-		private System.Windows.Forms.Timer hoverTimer;
-		TipWindow tipWindow;
-		private bool wordWrap = false;
-
-		private System.Windows.Forms.ListBox detailList;
-        public UiException.Controls.StackTraceDisplay stackTraceDisplay;
-        public UiException.Controls.ErrorBrowser errorBrowser;
-        private UiException.Controls.SourceCodeDisplay sourceCode;
-        public System.Windows.Forms.Splitter tabSplitter;
-		private System.Windows.Forms.ContextMenu detailListContextMenu;
-		private System.Windows.Forms.MenuItem copyDetailMenuItem;
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public ErrorDisplay()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-		}
-
-		/// <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 Properties
-		private bool WordWrap
-		{
-			get { return wordWrap; }
-			set 
-			{ 
-				if ( value != this.wordWrap )
-				{
-					this.wordWrap = value; 
-					RefillDetailList();
-				}
-			}
-		}
-		#endregion
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.detailList = new System.Windows.Forms.ListBox();
-			this.tabSplitter = new System.Windows.Forms.Splitter();
-
-            this.errorBrowser = new NUnit.UiException.Controls.ErrorBrowser();
-            this.sourceCode = new UiException.Controls.SourceCodeDisplay();
-            this.stackTraceDisplay = new UiException.Controls.StackTraceDisplay();
-			this.detailListContextMenu = new System.Windows.Forms.ContextMenu();
-			this.copyDetailMenuItem = new System.Windows.Forms.MenuItem();
-			this.SuspendLayout();
-			// 
-			// detailList
-			// 
-			this.detailList.Dock = System.Windows.Forms.DockStyle.Top;
-			this.detailList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
-			this.detailList.Font = DefaultFixedFont;
-			this.detailList.HorizontalExtent = 2000;
-			this.detailList.HorizontalScrollbar = true;
-			this.detailList.ItemHeight = 16;
-			this.detailList.Location = new System.Drawing.Point(0, 0);
-			this.detailList.Name = "detailList";
-			this.detailList.ScrollAlwaysVisible = true;
-			this.detailList.Size = new System.Drawing.Size(496, 128);
-			this.detailList.TabIndex = 1;
-			this.detailList.Resize += new System.EventHandler(this.detailList_Resize);
-			this.detailList.MouseHover += new System.EventHandler(this.OnMouseHover);
-			this.detailList.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.detailList_MeasureItem);
-			this.detailList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.detailList_MouseMove);
-			this.detailList.MouseLeave += new System.EventHandler(this.detailList_MouseLeave);
-			this.detailList.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.detailList_DrawItem);
-			this.detailList.SelectedIndexChanged += new System.EventHandler(this.detailList_SelectedIndexChanged);
-			// 
-			// tabSplitter
-			// 
-			this.tabSplitter.Dock = System.Windows.Forms.DockStyle.Top;
-			this.tabSplitter.Location = new System.Drawing.Point(0, 128);
-			this.tabSplitter.MinSize = 100;
-			this.tabSplitter.Name = "tabSplitter";
-			this.tabSplitter.Size = new System.Drawing.Size(496, 9);
-			this.tabSplitter.TabIndex = 3;
-			this.tabSplitter.TabStop = false;
-			this.tabSplitter.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.tabSplitter_SplitterMoved);
-            // 
-            // errorBrowser
-            // 
-            this.errorBrowser.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.errorBrowser.Location = new System.Drawing.Point(0, 137);
-            this.errorBrowser.Name = "errorBrowser";
-            this.errorBrowser.Size = new System.Drawing.Size(496, 151);
-            this.errorBrowser.StackTraceSource = null;
-            this.errorBrowser.TabIndex = 4;
-            //
-            // configure and register SourceCodeDisplay
-            //
-            this.sourceCode.AutoSelectFirstItem = true;
-            this.sourceCode.ListOrderPolicy = UiException.Controls.ErrorListOrderPolicy.ReverseOrder;
-            this.sourceCode.SplitOrientation = Orientation.Vertical;
-            this.sourceCode.SplitterDistance = 0.3f;
-            this.stackTraceDisplay.Font = DefaultFixedFont;
-            this.errorBrowser.RegisterDisplay(sourceCode);
-            this.errorBrowser.RegisterDisplay(stackTraceDisplay);
-			//
-            // detailListContextMenu
-			// 
-			this.detailListContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-																								  this.copyDetailMenuItem});
-			// 
-			// copyDetailMenuItem
-			// 
-			this.copyDetailMenuItem.Index = 0;
-			this.copyDetailMenuItem.Text = "Copy";
-			this.copyDetailMenuItem.Click += new System.EventHandler(this.copyDetailMenuItem_Click);
-			// 
-			// ErrorDisplay
-			// 
-            this.Controls.Add(this.errorBrowser);
-			this.Controls.Add(this.tabSplitter);
-			this.Controls.Add(this.detailList);
-			this.Name = "ErrorDisplay";
-			this.Size = new System.Drawing.Size(496, 288);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		#region Form Level Events
-		protected override void OnLoad(EventArgs e)
-		{
-			// NOTE: DesignMode is not true when display is nested in another
-			// user control and the containing form is displayed in the designer.
-			// This is a problem with VS.Net.
-			//
-			// Consequently, we rely on the fact that Services.UserSettings
-			// returns a dummy Service, if the ServiceManager has not been
-			// initialized.
-			if ( !this.DesignMode )
-			{
-				this.settings = Services.UserSettings;
-				settings.Changed += new SettingsEventHandler(UserSettings_Changed);
-
-				int splitPosition = settings.GetSetting( "Gui.ResultTabs.ErrorsTabSplitterPosition", tabSplitter.SplitPosition );
-				if ( splitPosition >= tabSplitter.MinSize && splitPosition < this.ClientSize.Height )
-					this.tabSplitter.SplitPosition = splitPosition;
-
-				this.WordWrap = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
-
-                this.detailList.Font = this.stackTraceDisplay.Font =
-                    settings.GetSetting( "Gui.FixedFont", DefaultFixedFont );
-
-                Orientation splitOrientation = (Orientation)settings.GetSetting(
-                    "Gui.ResultTabs.ErrorBrowser.SplitterOrientation", Orientation.Vertical);
-                float splitterDistance = splitOrientation == Orientation.Vertical
-                    ? settings.GetSetting( "Gui.ResultTabs.ErrorBrowser.VerticalPosition", 0.3f )
-                    : settings.GetSetting( "Gui.ResultTabs.ErrorBrowser.HorizontalPosition", 0.3f );
-
-                sourceCode.SplitOrientation = splitOrientation;
-                sourceCode.SplitterDistance = splitterDistance;
-
-                sourceCode.SplitOrientationChanged += new EventHandler(sourceCode_SplitOrientationChanged);
-                sourceCode.SplitterDistanceChanged += new EventHandler(sourceCode_SplitterDistanceChanged);
-
-                if ( settings.GetSetting("Gui.ResultTabs.ErrorBrowser.SourceCodeDisplay", false) )
-                    errorBrowser.SelectedDisplay = sourceCode;
-                else
-                    errorBrowser.SelectedDisplay = stackTraceDisplay;
-
-                errorBrowser.StackTraceDisplayChanged += new EventHandler(errorBrowser_StackTraceDisplayChanged);
-			}
-
-			base.OnLoad (e);
-		}
-
-        void errorBrowser_StackTraceDisplayChanged(object sender, EventArgs e)
-        {
-            settings.SaveSetting("Gui.ResultTabs.ErrorBrowser.SourceCodeDisplay",
-                errorBrowser.SelectedDisplay == sourceCode);
-        }
-
-        void sourceCode_SplitterDistanceChanged(object sender, EventArgs e)
-        {
-            string distanceSetting = sourceCode.SplitOrientation == Orientation.Vertical
-                ? "Gui.ResultTabs.ErrorBrowser.VerticalPosition" : "Gui.ResultTabs.ErrorBrowser.HorizontalPosition";
-            settings.SaveSetting(distanceSetting, sourceCode.SplitterDistance);
-        }
-
-        void sourceCode_SplitOrientationChanged(object sender, EventArgs e)
-        {
-            settings.SaveSetting("Gui.ResultTabs.ErrorBrowser.SplitterOrientation", sourceCode.SplitOrientation);
-
-            string distanceSetting = sourceCode.SplitOrientation == Orientation.Vertical
-                ? "Gui.ResultTabs.ErrorBrowser.VerticalPosition" : "Gui.ResultTabs.ErrorBrowser.HorizontalPosition";
-            sourceCode.SplitterDistance = settings.GetSetting(distanceSetting, 0.3f);
-        }
-		#endregion
-
-		#region Public Methods
-		public void Clear()
-		{
-			detailList.Items.Clear();
-			detailList.ContextMenu = null;
-            errorBrowser.StackTraceSource = "";
-		}
-		#endregion
-
-		#region UserSettings Events
-		private void UserSettings_Changed( object sender, SettingsEventArgs args )
-		{
-			this.WordWrap = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
-            Font newFont = this.stackTraceDisplay.Font = this.sourceCode.CodeDisplayFont
-                = settings.GetSetting("Gui.FixedFont", DefaultFixedFont);
-            if (newFont != this.detailList.Font)
-            {
-                this.detailList.Font = newFont;
-                RefillDetailList();
-            }
-        }
-		#endregion
-
-		#region DetailList Events
-		/// <summary>
-		/// When one of the detail failure items is selected, display
-		/// the stack trace and set up the tool tip for that item.
-		/// </summary>
-		private void detailList_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			TestResultItem resultItem = (TestResultItem)detailList.SelectedItem;
-            errorBrowser.StackTraceSource = resultItem.StackTrace;
-			detailList.ContextMenu = detailListContextMenu;
-		}
-
-		private void detailList_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
-		{
-			TestResultItem item = (TestResultItem) detailList.Items[e.Index];
-			//string s = item.ToString();
-			SizeF size = this.WordWrap
-				? e.Graphics.MeasureString(item.ToString(), detailList.Font, detailList.ClientSize.Width )
-				: e.Graphics.MeasureString(item.ToString(), detailList.Font );
-			e.ItemHeight = (int)size.Height;
-			e.ItemWidth = (int)size.Width;
-		}
-
-		private void detailList_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
-		{
-			if (e.Index >= 0) 
-			{
-				e.DrawBackground();
-				TestResultItem item = (TestResultItem) detailList.Items[e.Index];
-				bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? true : false;
-				Brush brush = selected ? SystemBrushes.HighlightText : SystemBrushes.WindowText;
-				RectangleF layoutRect = e.Bounds;
-				if ( this.WordWrap && layoutRect.Width > detailList.ClientSize.Width )
-					layoutRect.Width = detailList.ClientSize.Width;
-				e.Graphics.DrawString(item.ToString(),detailList.Font, brush, layoutRect);
-				
-			}
-		}
-
-		private void detailList_Resize(object sender, System.EventArgs e)
-		{
-			if ( this.WordWrap ) RefillDetailList();
-		}
-
-		private void RefillDetailList()
-		{
-			if ( this.detailList.Items.Count > 0 )
-			{
-				this.detailList.BeginUpdate();
-				ArrayList copiedItems = new ArrayList( detailList.Items );
-				this.detailList.Items.Clear();
-				foreach( object item in copiedItems )
-					this.detailList.Items.Add( item );
-				this.detailList.EndUpdate();
-			}
-		}
-
-		private void copyDetailMenuItem_Click(object sender, System.EventArgs e)
-		{
-			if ( detailList.SelectedItem != null )
-				Clipboard.SetDataObject( detailList.SelectedItem.ToString() );
-		}
-
-		private void OnMouseHover(object sender, System.EventArgs e)
-		{
-			if ( tipWindow != null ) tipWindow.Close();
-
-			if ( settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", false ) && hoverIndex >= 0 && hoverIndex < detailList.Items.Count )
-			{
-				Graphics g = Graphics.FromHwnd( detailList.Handle );
-
-				Rectangle itemRect = detailList.GetItemRectangle( hoverIndex );
-				string text = detailList.Items[hoverIndex].ToString();
-
-				SizeF sizeNeeded = g.MeasureString( text, detailList.Font );
-				bool expansionNeeded = 
-					itemRect.Width < (int)sizeNeeded.Width ||
-					itemRect.Height < (int)sizeNeeded.Height;
-
-				if ( expansionNeeded )
-				{
-					tipWindow = new TipWindow( detailList, hoverIndex );
-					tipWindow.ItemBounds = itemRect;
-					tipWindow.TipText = text;
-					tipWindow.Expansion = TipWindow.ExpansionStyle.Both;
-					tipWindow.Overlay = true;
-					tipWindow.WantClicks = true;
-					tipWindow.Closed += new EventHandler( tipWindow_Closed );
-					tipWindow.Show();
-				}
-			}		
-		}
-
-		private void tipWindow_Closed( object sender, System.EventArgs e )
-		{
-			tipWindow = null;
-			hoverIndex = -1;
-			ClearTimer();
-		}
-
-		private void detailList_MouseLeave(object sender, System.EventArgs e)
-		{
-			hoverIndex = -1;
-			ClearTimer();
-		}
-
-		private void detailList_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
-		{
-			ClearTimer();
-
-			hoverIndex = detailList.IndexFromPoint( e.X, e.Y );	
-
-			if ( hoverIndex >= 0 && hoverIndex < detailList.Items.Count )
-			{
-				// Workaround problem of IndexFromPoint returning an
-				// index when mouse is over bottom part of list.
-				Rectangle r = detailList.GetItemRectangle( hoverIndex );
-				if ( e.Y > r.Bottom )
-					hoverIndex = -1;
-				else
-				{
-					hoverTimer = new System.Windows.Forms.Timer();
-					hoverTimer.Interval = 800;
-					hoverTimer.Tick += new EventHandler( OnMouseHover );
-					hoverTimer.Start();
-				}
-			}
-		}
-
-		private void ClearTimer()
-		{
-			if ( hoverTimer != null )
-			{
-				hoverTimer.Stop();
-				hoverTimer.Dispose();
-			}
-		}
-
-		private void tabSplitter_SplitterMoved( object sender, SplitterEventArgs e )
-		{
-			settings.SaveSetting( "Gui.ResultTabs.ErrorsTabSplitterPosition", tabSplitter.SplitPosition );
-		}
-
-		#endregion
-
-		#region TestObserver Interface
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestFinished += new TestEventHandler(OnTestFinished);
-			events.SuiteFinished += new TestEventHandler(OnSuiteFinished);
-			events.TestException += new TestEventHandler(OnTestException);
-		}
-		#endregion
-
-		#region Test Event Handlers
-		private void OnTestFinished(object sender, TestEventArgs args)
-		{
-            TestResult result = args.Result;
-            switch (result.ResultState)
-            {
-                case ResultState.Failure:
-                case ResultState.Error:
-                case ResultState.Cancelled:
-                    if (result.FailureSite != FailureSite.Parent)
-                        InsertTestResultItem(result);
-                    break;
-                case ResultState.NotRunnable:
-                    InsertTestResultItem(result);
-                    break;
-            }
-		}
-		
-		private void OnSuiteFinished(object sender, TestEventArgs args)
-		{
-			TestResult result = args.Result;
-			if(	result.FailureSite != FailureSite.Child )
-                switch (result.ResultState)
-                {
-                    case ResultState.Failure:
-                    case ResultState.Error:
-                    case ResultState.Cancelled:
-                        InsertTestResultItem(result);
-                        break;
-                }
-		}
-		
-		private void OnTestException(object sender, TestEventArgs args)
-		{
-			string msg = string.Format( "An unhandled {0} was thrown while executing this test : {1}",
-				args.Exception.GetType().FullName, args.Exception.Message );
-			TestResultItem item = new TestResultItem( args.Name, msg, args.Exception.StackTrace );
-				
-			InsertTestResultItem( item );
-		}
-
-		private void InsertTestResultItem( TestResult result )
-		{
-			TestResultItem item = new TestResultItem(result);
-			InsertTestResultItem( item );
-		}
-
-		private void InsertTestResultItem( TestResultItem item )
-		{
-			detailList.BeginUpdate();
-			detailList.Items.Insert(detailList.Items.Count, item);
-			detailList.SelectedIndex = 0;
-			detailList.EndUpdate();
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using NUnit.Util;
+using NUnit.Core;
+using CP.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for ErrorDisplay.
+	/// </summary>
+	public class ErrorDisplay : System.Windows.Forms.UserControl, TestObserver
+	{
+        static readonly Font DefaultFixedFont = new Font(FontFamily.GenericMonospace, 8.0F);
+
+        private ISettings settings = null;
+		int hoverIndex = -1;
+		private System.Windows.Forms.Timer hoverTimer;
+		TipWindow tipWindow;
+		private bool wordWrap = false;
+
+		private System.Windows.Forms.ListBox detailList;
+        public UiException.Controls.StackTraceDisplay stackTraceDisplay;
+        public UiException.Controls.ErrorBrowser errorBrowser;
+        private UiException.Controls.SourceCodeDisplay sourceCode;
+        public System.Windows.Forms.Splitter tabSplitter;
+		private System.Windows.Forms.ContextMenu detailListContextMenu;
+		private System.Windows.Forms.MenuItem copyDetailMenuItem;
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public ErrorDisplay()
+		{
+			// This call is required by the Windows.Forms Form Designer.
+			InitializeComponent();
+		}
+
+		/// <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 Properties
+		private bool WordWrap
+		{
+			get { return wordWrap; }
+			set 
+			{ 
+				if ( value != this.wordWrap )
+				{
+					this.wordWrap = value; 
+					RefillDetailList();
+				}
+			}
+		}
+		#endregion
+
+		#region Component Designer generated code
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.detailList = new System.Windows.Forms.ListBox();
+			this.tabSplitter = new System.Windows.Forms.Splitter();
+
+            this.errorBrowser = new NUnit.UiException.Controls.ErrorBrowser();
+            this.sourceCode = new UiException.Controls.SourceCodeDisplay();
+            this.stackTraceDisplay = new UiException.Controls.StackTraceDisplay();
+			this.detailListContextMenu = new System.Windows.Forms.ContextMenu();
+			this.copyDetailMenuItem = new System.Windows.Forms.MenuItem();
+			this.SuspendLayout();
+			// 
+			// detailList
+			// 
+			this.detailList.Dock = System.Windows.Forms.DockStyle.Top;
+			this.detailList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable;
+			this.detailList.Font = DefaultFixedFont;
+			this.detailList.HorizontalExtent = 2000;
+			this.detailList.HorizontalScrollbar = true;
+			this.detailList.ItemHeight = 16;
+			this.detailList.Location = new System.Drawing.Point(0, 0);
+			this.detailList.Name = "detailList";
+			this.detailList.ScrollAlwaysVisible = true;
+			this.detailList.Size = new System.Drawing.Size(496, 128);
+			this.detailList.TabIndex = 1;
+			this.detailList.Resize += new System.EventHandler(this.detailList_Resize);
+			this.detailList.MouseHover += new System.EventHandler(this.OnMouseHover);
+			this.detailList.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.detailList_MeasureItem);
+			this.detailList.MouseMove += new System.Windows.Forms.MouseEventHandler(this.detailList_MouseMove);
+			this.detailList.MouseLeave += new System.EventHandler(this.detailList_MouseLeave);
+			this.detailList.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.detailList_DrawItem);
+			this.detailList.SelectedIndexChanged += new System.EventHandler(this.detailList_SelectedIndexChanged);
+			// 
+			// tabSplitter
+			// 
+			this.tabSplitter.Dock = System.Windows.Forms.DockStyle.Top;
+			this.tabSplitter.Location = new System.Drawing.Point(0, 128);
+			this.tabSplitter.MinSize = 100;
+			this.tabSplitter.Name = "tabSplitter";
+			this.tabSplitter.Size = new System.Drawing.Size(496, 9);
+			this.tabSplitter.TabIndex = 3;
+			this.tabSplitter.TabStop = false;
+			this.tabSplitter.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.tabSplitter_SplitterMoved);
+            // 
+            // errorBrowser
+            // 
+            this.errorBrowser.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.errorBrowser.Location = new System.Drawing.Point(0, 137);
+            this.errorBrowser.Name = "errorBrowser";
+            this.errorBrowser.Size = new System.Drawing.Size(496, 151);
+            this.errorBrowser.StackTraceSource = null;
+            this.errorBrowser.TabIndex = 4;
+            //
+            // configure and register SourceCodeDisplay
+            //
+            this.sourceCode.AutoSelectFirstItem = true;
+            this.sourceCode.ListOrderPolicy = UiException.Controls.ErrorListOrderPolicy.ReverseOrder;
+            this.sourceCode.SplitOrientation = Orientation.Vertical;
+            this.sourceCode.SplitterDistance = 0.3f;
+            this.stackTraceDisplay.Font = DefaultFixedFont;
+            this.errorBrowser.RegisterDisplay(sourceCode);
+            this.errorBrowser.RegisterDisplay(stackTraceDisplay);
+			//
+            // detailListContextMenu
+			// 
+			this.detailListContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+																								  this.copyDetailMenuItem});
+			// 
+			// copyDetailMenuItem
+			// 
+			this.copyDetailMenuItem.Index = 0;
+			this.copyDetailMenuItem.Text = "Copy";
+			this.copyDetailMenuItem.Click += new System.EventHandler(this.copyDetailMenuItem_Click);
+			// 
+			// ErrorDisplay
+			// 
+            this.Controls.Add(this.errorBrowser);
+			this.Controls.Add(this.tabSplitter);
+			this.Controls.Add(this.detailList);
+			this.Name = "ErrorDisplay";
+			this.Size = new System.Drawing.Size(496, 288);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Form Level Events
+		protected override void OnLoad(EventArgs e)
+		{
+			// NOTE: DesignMode is not true when display is nested in another
+			// user control and the containing form is displayed in the designer.
+			// This is a problem with VS.Net.
+			//
+			// Consequently, we rely on the fact that Services.UserSettings
+			// returns a dummy Service, if the ServiceManager has not been
+			// initialized.
+			if ( !this.DesignMode )
+			{
+				this.settings = Services.UserSettings;
+				settings.Changed += new SettingsEventHandler(UserSettings_Changed);
+
+				int splitPosition = settings.GetSetting( "Gui.ResultTabs.ErrorsTabSplitterPosition", tabSplitter.SplitPosition );
+				if ( splitPosition >= tabSplitter.MinSize && splitPosition < this.ClientSize.Height )
+					this.tabSplitter.SplitPosition = splitPosition;
+
+				this.WordWrap = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
+
+                this.detailList.Font = this.stackTraceDisplay.Font =
+                    settings.GetSetting( "Gui.FixedFont", DefaultFixedFont );
+
+                Orientation splitOrientation = (Orientation)settings.GetSetting(
+                    "Gui.ResultTabs.ErrorBrowser.SplitterOrientation", Orientation.Vertical);
+                float splitterDistance = splitOrientation == Orientation.Vertical
+                    ? settings.GetSetting( "Gui.ResultTabs.ErrorBrowser.VerticalPosition", 0.3f )
+                    : settings.GetSetting( "Gui.ResultTabs.ErrorBrowser.HorizontalPosition", 0.3f );
+
+                sourceCode.SplitOrientation = splitOrientation;
+                sourceCode.SplitterDistance = splitterDistance;
+
+                sourceCode.SplitOrientationChanged += new EventHandler(sourceCode_SplitOrientationChanged);
+                sourceCode.SplitterDistanceChanged += new EventHandler(sourceCode_SplitterDistanceChanged);
+
+                if ( settings.GetSetting("Gui.ResultTabs.ErrorBrowser.SourceCodeDisplay", false) )
+                    errorBrowser.SelectedDisplay = sourceCode;
+                else
+                    errorBrowser.SelectedDisplay = stackTraceDisplay;
+
+                errorBrowser.StackTraceDisplayChanged += new EventHandler(errorBrowser_StackTraceDisplayChanged);
+			}
+
+			base.OnLoad (e);
+		}
+
+        void errorBrowser_StackTraceDisplayChanged(object sender, EventArgs e)
+        {
+            settings.SaveSetting("Gui.ResultTabs.ErrorBrowser.SourceCodeDisplay",
+                errorBrowser.SelectedDisplay == sourceCode);
+        }
+
+        void sourceCode_SplitterDistanceChanged(object sender, EventArgs e)
+        {
+            string distanceSetting = sourceCode.SplitOrientation == Orientation.Vertical
+                ? "Gui.ResultTabs.ErrorBrowser.VerticalPosition" : "Gui.ResultTabs.ErrorBrowser.HorizontalPosition";
+            settings.SaveSetting(distanceSetting, sourceCode.SplitterDistance);
+        }
+
+        void sourceCode_SplitOrientationChanged(object sender, EventArgs e)
+        {
+            settings.SaveSetting("Gui.ResultTabs.ErrorBrowser.SplitterOrientation", sourceCode.SplitOrientation);
+
+            string distanceSetting = sourceCode.SplitOrientation == Orientation.Vertical
+                ? "Gui.ResultTabs.ErrorBrowser.VerticalPosition" : "Gui.ResultTabs.ErrorBrowser.HorizontalPosition";
+            sourceCode.SplitterDistance = settings.GetSetting(distanceSetting, 0.3f);
+        }
+		#endregion
+
+		#region Public Methods
+		public void Clear()
+		{
+			detailList.Items.Clear();
+			detailList.ContextMenu = null;
+            errorBrowser.StackTraceSource = "";
+		}
+		#endregion
+
+		#region UserSettings Events
+		private void UserSettings_Changed( object sender, SettingsEventArgs args )
+		{
+			this.WordWrap = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
+            Font newFont = this.stackTraceDisplay.Font = this.sourceCode.CodeDisplayFont
+                = settings.GetSetting("Gui.FixedFont", DefaultFixedFont);
+            if (newFont != this.detailList.Font)
+            {
+                this.detailList.Font = newFont;
+                RefillDetailList();
+            }
+        }
+		#endregion
+
+		#region DetailList Events
+		/// <summary>
+		/// When one of the detail failure items is selected, display
+		/// the stack trace and set up the tool tip for that item.
+		/// </summary>
+		private void detailList_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			TestResultItem resultItem = (TestResultItem)detailList.SelectedItem;
+            errorBrowser.StackTraceSource = resultItem.StackTrace;
+			detailList.ContextMenu = detailListContextMenu;
+		}
+
+		private void detailList_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
+		{
+			TestResultItem item = (TestResultItem) detailList.Items[e.Index];
+			//string s = item.ToString();
+			SizeF size = this.WordWrap
+				? e.Graphics.MeasureString(item.ToString(), detailList.Font, detailList.ClientSize.Width )
+				: e.Graphics.MeasureString(item.ToString(), detailList.Font );
+			e.ItemHeight = (int)size.Height;
+			e.ItemWidth = (int)size.Width;
+		}
+
+		private void detailList_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
+		{
+			if (e.Index >= 0) 
+			{
+				e.DrawBackground();
+				TestResultItem item = (TestResultItem) detailList.Items[e.Index];
+				bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? true : false;
+				Brush brush = selected ? SystemBrushes.HighlightText : SystemBrushes.WindowText;
+				RectangleF layoutRect = e.Bounds;
+				if ( this.WordWrap && layoutRect.Width > detailList.ClientSize.Width )
+					layoutRect.Width = detailList.ClientSize.Width;
+				e.Graphics.DrawString(item.ToString(),detailList.Font, brush, layoutRect);
+				
+			}
+		}
+
+		private void detailList_Resize(object sender, System.EventArgs e)
+		{
+			if ( this.WordWrap ) RefillDetailList();
+		}
+
+		private void RefillDetailList()
+		{
+			if ( this.detailList.Items.Count > 0 )
+			{
+				this.detailList.BeginUpdate();
+				ArrayList copiedItems = new ArrayList( detailList.Items );
+				this.detailList.Items.Clear();
+				foreach( object item in copiedItems )
+					this.detailList.Items.Add( item );
+				this.detailList.EndUpdate();
+			}
+		}
+
+		private void copyDetailMenuItem_Click(object sender, System.EventArgs e)
+		{
+			if ( detailList.SelectedItem != null )
+				Clipboard.SetDataObject( detailList.SelectedItem.ToString() );
+		}
+
+		private void OnMouseHover(object sender, System.EventArgs e)
+		{
+			if ( tipWindow != null ) tipWindow.Close();
+
+			if ( settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", false ) && hoverIndex >= 0 && hoverIndex < detailList.Items.Count )
+			{
+				Graphics g = Graphics.FromHwnd( detailList.Handle );
+
+				Rectangle itemRect = detailList.GetItemRectangle( hoverIndex );
+				string text = detailList.Items[hoverIndex].ToString();
+
+				SizeF sizeNeeded = g.MeasureString( text, detailList.Font );
+				bool expansionNeeded = 
+					itemRect.Width < (int)sizeNeeded.Width ||
+					itemRect.Height < (int)sizeNeeded.Height;
+
+				if ( expansionNeeded )
+				{
+					tipWindow = new TipWindow( detailList, hoverIndex );
+					tipWindow.ItemBounds = itemRect;
+					tipWindow.TipText = text;
+					tipWindow.Expansion = TipWindow.ExpansionStyle.Both;
+					tipWindow.Overlay = true;
+					tipWindow.WantClicks = true;
+					tipWindow.Closed += new EventHandler( tipWindow_Closed );
+					tipWindow.Show();
+				}
+			}		
+		}
+
+		private void tipWindow_Closed( object sender, System.EventArgs e )
+		{
+			tipWindow = null;
+			hoverIndex = -1;
+			ClearTimer();
+		}
+
+		private void detailList_MouseLeave(object sender, System.EventArgs e)
+		{
+			hoverIndex = -1;
+			ClearTimer();
+		}
+
+		private void detailList_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
+		{
+			ClearTimer();
+
+			hoverIndex = detailList.IndexFromPoint( e.X, e.Y );	
+
+			if ( hoverIndex >= 0 && hoverIndex < detailList.Items.Count )
+			{
+				// Workaround problem of IndexFromPoint returning an
+				// index when mouse is over bottom part of list.
+				Rectangle r = detailList.GetItemRectangle( hoverIndex );
+				if ( e.Y > r.Bottom )
+					hoverIndex = -1;
+				else
+				{
+					hoverTimer = new System.Windows.Forms.Timer();
+					hoverTimer.Interval = 800;
+					hoverTimer.Tick += new EventHandler( OnMouseHover );
+					hoverTimer.Start();
+				}
+			}
+		}
+
+		private void ClearTimer()
+		{
+			if ( hoverTimer != null )
+			{
+				hoverTimer.Stop();
+				hoverTimer.Dispose();
+			}
+		}
+
+		private void tabSplitter_SplitterMoved( object sender, SplitterEventArgs e )
+		{
+			settings.SaveSetting( "Gui.ResultTabs.ErrorsTabSplitterPosition", tabSplitter.SplitPosition );
+		}
+
+		#endregion
+
+		#region TestObserver Interface
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestFinished += new TestEventHandler(OnTestFinished);
+			events.SuiteFinished += new TestEventHandler(OnSuiteFinished);
+			events.TestException += new TestEventHandler(OnTestException);
+		}
+		#endregion
+
+		#region Test Event Handlers
+		private void OnTestFinished(object sender, TestEventArgs args)
+		{
+            TestResult result = args.Result;
+            switch (result.ResultState)
+            {
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+                    if (result.FailureSite != FailureSite.Parent)
+                        InsertTestResultItem(result);
+                    break;
+                case ResultState.NotRunnable:
+                    InsertTestResultItem(result);
+                    break;
+            }
+		}
+		
+		private void OnSuiteFinished(object sender, TestEventArgs args)
+		{
+			TestResult result = args.Result;
+			if(	result.FailureSite != FailureSite.Child )
+                switch (result.ResultState)
+                {
+                    case ResultState.Failure:
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+                        InsertTestResultItem(result);
+                        break;
+                }
+		}
+		
+		private void OnTestException(object sender, TestEventArgs args)
+		{
+			string msg = string.Format( "An unhandled {0} was thrown while executing this test : {1}",
+				args.Exception.GetType().FullName, args.Exception.Message );
+			TestResultItem item = new TestResultItem( args.Name, msg, args.Exception.StackTrace );
+				
+			InsertTestResultItem( item );
+		}
+
+		private void InsertTestResultItem( TestResult result )
+		{
+			TestResultItem item = new TestResultItem(result);
+			InsertTestResultItem( item );
+		}
+
+		private void InsertTestResultItem( TestResultItem item )
+		{
+			detailList.BeginUpdate();
+			detailList.Items.Insert(detailList.Items.Count, item);
+			detailList.SelectedIndex = 0;
+			detailList.EndUpdate();
+		}
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/ErrorDisplay.resx b/src/GuiComponents/UiKit/ErrorDisplay.resx
index 1ec516b..1a81d9e 100644
--- a/src/GuiComponents/UiKit/ErrorDisplay.resx
+++ b/src/GuiComponents/UiKit/ErrorDisplay.resx
@@ -1,123 +1,123 @@
-<?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="detailListContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
+<?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="detailListContextMenu.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/GuiComponents/UiKit/ExpandingLabel.cs b/src/GuiComponents/UiKit/ExpandingLabel.cs
index a13a91a..c7a4a8a 100644
--- a/src/GuiComponents/UiKit/ExpandingLabel.cs
+++ b/src/GuiComponents/UiKit/ExpandingLabel.cs
@@ -1,209 +1,209 @@
-// ****************************************************************
-// 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.Windows.Forms;
-using System.ComponentModel;
-using System.Drawing;
-
-namespace CP.Windows.Forms
-{
-	/// <summary>
-	/// A special type of label which can display a tooltip-like
-	/// window to show the full extent of any text which doesn't 
-	/// fit. The window may be placed directly over the label
-	/// or immediately beneath it and will expand to fit in
-	/// a horizontal, vertical or both directions as needed.
-	/// </summary>
-	public class ExpandingLabel : System.Windows.Forms.Label
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// Our window for displaying expanded text
-		/// </summary>
-		private TipWindow tipWindow;
-		
-		/// <summary>
-		/// Direction of expansion
-		/// </summary>
-		private TipWindow.ExpansionStyle expansion = TipWindow.ExpansionStyle.Horizontal;
-		
-		/// <summary>
-		/// True if tipWindow may overlay the label
-		/// </summary>
-		private bool overlay = true;
-		
-		/// <summary>
-		/// Time in milliseconds that the tip window
-		/// will remain displayed.
-		/// </summary>
-		private int autoCloseDelay = 0;
-
-		/// <summary>
-		/// Time in milliseconds that the window stays
-		/// open after the mouse leaves the control.
-		/// </summary>
-		private int mouseLeaveDelay = 300;
-
-		/// <summary>
-		/// If true, a context menu with Copy is displayed which
-		/// allows copying contents to the clipboard.
-		/// </summary>
-		private bool copySupported = false;
-
-		#endregion
-
-		#region Properties
-
-		[Browsable( false )]
-		public bool Expanded
-		{
-			get { return tipWindow != null && tipWindow.Visible; }
-		}
-
-		[Category ( "Behavior"  ), DefaultValue( TipWindow.ExpansionStyle.Horizontal )]
-		public TipWindow.ExpansionStyle Expansion
-		{
-			get { return expansion; }
-			set { expansion = value; }
-		}
-
-		[Category( "Behavior" ), DefaultValue( true )]
-		[Description("Indicates whether the tip window should overlay the label")]
-		public bool Overlay
-		{
-			get { return overlay; }
-			set { overlay = value; }
-		}
-
-		/// <summary>
-		/// Time in milliseconds that the tip window
-		/// will remain displayed.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( 0 )]
-		[Description("Time in milliseconds that the tip is displayed. Zero indicates no automatic timeout.")]
-		public int AutoCloseDelay
-		{
-			get { return autoCloseDelay; }
-			set { autoCloseDelay = value; }
-		}
-
-		/// <summary>
-		/// Time in milliseconds that the window stays
-		/// open after the mouse leaves the control.
-		/// Reentering the control resets this.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( 300 )]
-		[Description("Time in milliseconds that the tip is displayed after the mouse levaes the control")]
-		public int MouseLeaveDelay
-		{
-			get { return mouseLeaveDelay; }
-			set { mouseLeaveDelay = value; }
-		}
-
-		[Category( "Behavior"), DefaultValue( false )]
-		[Description("If true, displays a context menu with Copy")]
-		public bool CopySupported
-		{
-			get { return copySupported; }
-			set 
-			{ 
-				copySupported = value; 
-				if ( copySupported )
-					base.ContextMenu = null;
-			}
-		}
-
-		/// <summary>
-		/// Override Text property to set up copy menu if
-		/// the value is non-empty.
-		/// </summary>
-		public override string Text
-		{
-			get { return base.Text; }
-			set 
-			{ 
-				base.Text = value;
-
-				if ( copySupported )
-				{
-					if ( value == null || value == string.Empty )
-					{
-						if ( this.ContextMenu != null )
-						{
-							this.ContextMenu.Dispose();
-							this.ContextMenu = null;
-						}
-					}
-					else
-					{
-						this.ContextMenu = new System.Windows.Forms.ContextMenu();
-						MenuItem copyMenuItem = new MenuItem( "Copy", new EventHandler( CopyToClipboard ) );
-						this.ContextMenu.MenuItems.Add( copyMenuItem );
-					}
-				}
-			}
-		}
-
-		#endregion
-
-		#region Public Methods
-
-		public void Expand()
-		{
-			if ( !Expanded )
-			{
-				tipWindow = new TipWindow( this );
-				tipWindow.Closed += new EventHandler( tipWindow_Closed );
-				tipWindow.Expansion = this.Expansion;
-				tipWindow.Overlay = this.Overlay;
-				tipWindow.AutoCloseDelay = this.AutoCloseDelay;
-				tipWindow.MouseLeaveDelay = this.MouseLeaveDelay;
-				tipWindow.WantClicks = this.CopySupported;
-				tipWindow.Show();
-			}
-		}
-
-		public void Unexpand()
-		{
-			if ( Expanded )
-			{
-				tipWindow.Close();
-			}
-		}
-
-		#endregion
-
-		#region Event Handlers
-
-		private void tipWindow_Closed( object sender, EventArgs e )
-		{
-			tipWindow = null;
-		}
-
-		protected override void OnMouseHover(System.EventArgs e)
-		{
-			Graphics g = Graphics.FromHwnd( Handle );
-			SizeF sizeNeeded = g.MeasureString( Text, Font );
-			bool expansionNeeded = 
-				Width < (int)sizeNeeded.Width ||
-				Height < (int)sizeNeeded.Height;
-
-			if ( expansionNeeded ) Expand();
-		}
-
-		/// <summary>
-		/// Copy contents to clipboard
-		/// </summary>
-		private void CopyToClipboard( object sender, EventArgs e )
-		{
-			Clipboard.SetDataObject( this.Text );
-		}
-	
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Windows.Forms;
+using System.ComponentModel;
+using System.Drawing;
+
+namespace CP.Windows.Forms
+{
+	/// <summary>
+	/// A special type of label which can display a tooltip-like
+	/// window to show the full extent of any text which doesn't 
+	/// fit. The window may be placed directly over the label
+	/// or immediately beneath it and will expand to fit in
+	/// a horizontal, vertical or both directions as needed.
+	/// </summary>
+	public class ExpandingLabel : System.Windows.Forms.Label
+	{
+		#region Instance Variables
+
+		/// <summary>
+		/// Our window for displaying expanded text
+		/// </summary>
+		private TipWindow tipWindow;
+		
+		/// <summary>
+		/// Direction of expansion
+		/// </summary>
+		private TipWindow.ExpansionStyle expansion = TipWindow.ExpansionStyle.Horizontal;
+		
+		/// <summary>
+		/// True if tipWindow may overlay the label
+		/// </summary>
+		private bool overlay = true;
+		
+		/// <summary>
+		/// Time in milliseconds that the tip window
+		/// will remain displayed.
+		/// </summary>
+		private int autoCloseDelay = 0;
+
+		/// <summary>
+		/// Time in milliseconds that the window stays
+		/// open after the mouse leaves the control.
+		/// </summary>
+		private int mouseLeaveDelay = 300;
+
+		/// <summary>
+		/// If true, a context menu with Copy is displayed which
+		/// allows copying contents to the clipboard.
+		/// </summary>
+		private bool copySupported = false;
+
+		#endregion
+
+		#region Properties
+
+		[Browsable( false )]
+		public bool Expanded
+		{
+			get { return tipWindow != null && tipWindow.Visible; }
+		}
+
+		[Category ( "Behavior"  ), DefaultValue( TipWindow.ExpansionStyle.Horizontal )]
+		public TipWindow.ExpansionStyle Expansion
+		{
+			get { return expansion; }
+			set { expansion = value; }
+		}
+
+		[Category( "Behavior" ), DefaultValue( true )]
+		[Description("Indicates whether the tip window should overlay the label")]
+		public bool Overlay
+		{
+			get { return overlay; }
+			set { overlay = value; }
+		}
+
+		/// <summary>
+		/// Time in milliseconds that the tip window
+		/// will remain displayed.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( 0 )]
+		[Description("Time in milliseconds that the tip is displayed. Zero indicates no automatic timeout.")]
+		public int AutoCloseDelay
+		{
+			get { return autoCloseDelay; }
+			set { autoCloseDelay = value; }
+		}
+
+		/// <summary>
+		/// Time in milliseconds that the window stays
+		/// open after the mouse leaves the control.
+		/// Reentering the control resets this.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( 300 )]
+		[Description("Time in milliseconds that the tip is displayed after the mouse levaes the control")]
+		public int MouseLeaveDelay
+		{
+			get { return mouseLeaveDelay; }
+			set { mouseLeaveDelay = value; }
+		}
+
+		[Category( "Behavior"), DefaultValue( false )]
+		[Description("If true, displays a context menu with Copy")]
+		public bool CopySupported
+		{
+			get { return copySupported; }
+			set 
+			{ 
+				copySupported = value; 
+				if ( copySupported )
+					base.ContextMenu = null;
+			}
+		}
+
+		/// <summary>
+		/// Override Text property to set up copy menu if
+		/// the value is non-empty.
+		/// </summary>
+		public override string Text
+		{
+			get { return base.Text; }
+			set 
+			{ 
+				base.Text = value;
+
+				if ( copySupported )
+				{
+					if ( value == null || value == string.Empty )
+					{
+						if ( this.ContextMenu != null )
+						{
+							this.ContextMenu.Dispose();
+							this.ContextMenu = null;
+						}
+					}
+					else
+					{
+						this.ContextMenu = new System.Windows.Forms.ContextMenu();
+						MenuItem copyMenuItem = new MenuItem( "Copy", new EventHandler( CopyToClipboard ) );
+						this.ContextMenu.MenuItems.Add( copyMenuItem );
+					}
+				}
+			}
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public void Expand()
+		{
+			if ( !Expanded )
+			{
+				tipWindow = new TipWindow( this );
+				tipWindow.Closed += new EventHandler( tipWindow_Closed );
+				tipWindow.Expansion = this.Expansion;
+				tipWindow.Overlay = this.Overlay;
+				tipWindow.AutoCloseDelay = this.AutoCloseDelay;
+				tipWindow.MouseLeaveDelay = this.MouseLeaveDelay;
+				tipWindow.WantClicks = this.CopySupported;
+				tipWindow.Show();
+			}
+		}
+
+		public void Unexpand()
+		{
+			if ( Expanded )
+			{
+				tipWindow.Close();
+			}
+		}
+
+		#endregion
+
+		#region Event Handlers
+
+		private void tipWindow_Closed( object sender, EventArgs e )
+		{
+			tipWindow = null;
+		}
+
+		protected override void OnMouseHover(System.EventArgs e)
+		{
+			Graphics g = Graphics.FromHwnd( Handle );
+			SizeF sizeNeeded = g.MeasureString( Text, Font );
+			bool expansionNeeded = 
+				Width < (int)sizeNeeded.Width ||
+				Height < (int)sizeNeeded.Height;
+
+			if ( expansionNeeded ) Expand();
+		}
+
+		/// <summary>
+		/// Copy contents to clipboard
+		/// </summary>
+		private void CopyToClipboard( object sender, EventArgs e )
+		{
+			Clipboard.SetDataObject( this.Text );
+		}
+	
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/ExpandingLabel.resx b/src/GuiComponents/UiKit/ExpandingLabel.resx
index 7174dee..c9feadd 100644
--- a/src/GuiComponents/UiKit/ExpandingLabel.resx
+++ b/src/GuiComponents/UiKit/ExpandingLabel.resx
@@ -1,109 +1,109 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>ExpandingLabel</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>ExpandingLabel</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ExpandingTextBox.cs b/src/GuiComponents/UiKit/ExpandingTextBox.cs
index fdf5d2d..9c58445 100644
--- a/src/GuiComponents/UiKit/ExpandingTextBox.cs
+++ b/src/GuiComponents/UiKit/ExpandingTextBox.cs
@@ -1,339 +1,339 @@
-// ****************************************************************
-// 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.Windows.Forms;
-using System.ComponentModel;
-using System.Drawing;
-
-namespace CP.Windows.Forms
-{
-	/// <summary>
-	/// A special type of textbox which can display a tooltip-like
-	/// window to show the full extent of any text which doesn't 
-	/// fit. The window may be placed directly over the label
-	/// or immediately beneath it and will expand to fit in
-	/// a horizontal, vertical or both directions as needed.
-	/// 
-	/// TODO: This control is virtually identical to ExpandingLabel.
-	/// We need to have an extension provider that works like a 
-	/// ToolTip in order to eliminate the duplication.
-	/// </summary>
-	public class ExpandingTextBox : System.Windows.Forms.TextBox
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// Our window for displaying expanded text
-		/// </summary>
-		private TipWindow tipWindow;
-		
-		/// <summary>
-		/// Direction of expansion
-		/// </summary>
-		private TipWindow.ExpansionStyle expansion = TipWindow.ExpansionStyle.Horizontal;
-		
-		/// <summary>
-		/// Time in milliseconds that the mouse must
-		/// be stationary over an item before the
-		/// tip window will display.
-		/// </summary>
-		private int mouseHoverDelay = 300;
-
-		/// <summary>
-		/// True if tipWindow may overlay the label
-		/// </summary>
-		private bool overlay = true;
-		
-		/// <summary>
-		/// Time in milliseconds that the tip window
-		/// will remain displayed.
-		/// </summary>
-		private int autoCloseDelay = 0;
-
-		/// <summary>
-		/// Time in milliseconds that the window stays
-		/// open after the mouse leaves the control.
-		/// </summary>
-		private int mouseLeaveDelay = 300;
-
-		/// <summary>
-		/// If true, a context menu with Copy is displayed which
-		/// allows copying contents to the clipboard.
-		/// </summary>
-		private bool copySupported = false;
-
-		/// <summary>
-		/// Timer used to control display behavior on hover.
-		/// </summary>
-		private System.Windows.Forms.Timer hoverTimer;
-
-		/// <summary>
-		/// True if control should expand automatically on hover.
-		/// </summary>
-		private bool autoExpand = true;
-
-		#endregion
-
-		#region Properties
-
-		[Browsable( false )]
-		public bool Expanded
-		{
-			get { return tipWindow != null && tipWindow.Visible; }
-		}
-
-		[Category ( "Behavior"  ), DefaultValue( TipWindow.ExpansionStyle.Horizontal )]
-		public TipWindow.ExpansionStyle Expansion
-		{
-			get { return expansion; }
-			set { expansion = value; }
-		}
-
-		[Category ( "Behavior" ), DefaultValue( true )]
-		public bool AutoExpand
-		{
-			get { return autoExpand; }
-			set { autoExpand = value; }
-		}
-
-		[Category( "Behavior" ), DefaultValue( true )]
-		[Description("Indicates whether the tip window should overlay the label")]
-		public bool Overlay
-		{
-			get { return overlay; }
-			set { overlay = value; }
-		}
-
-		/// <summary>
-		/// Time in milliseconds that the mouse must
-		/// be stationary over an item before the
-		/// tip window will display.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( 300 )]
-		[Description("Time in milliseconds that mouse must be stationary over an item before the tip is displayed.")]
-		public int MouseHoverDelay
-		{
-			get { return mouseHoverDelay; }
-			set { mouseHoverDelay = value; }
-		}
-
-		/// <summary>
-		/// Time in milliseconds that the tip window
-		/// will remain displayed.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( 0 )]
-		[Description("Time in milliseconds that the tip is displayed. Zero indicates no automatic timeout.")]
-		public int AutoCloseDelay
-		{
-			get { return autoCloseDelay; }
-			set { autoCloseDelay = value; }
-		}
-
-		/// <summary>
-		/// Time in milliseconds that the window stays
-		/// open after the mouse leaves the control.
-		/// Reentering the control resets this.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( 300 )]
-		[Description("Time in milliseconds that the tip is displayed after the mouse levaes the control")]
-		public int MouseLeaveDelay
-		{
-			get { return mouseLeaveDelay; }
-			set { mouseLeaveDelay = value; }
-		}
-
-		[Category( "Behavior"), DefaultValue( false )]
-		[Description("If true, displays a context menu with Copy")]
-		public bool CopySupported
-		{
-			get { return copySupported; }
-			set 
-			{ 
-				copySupported = value; 
-				if ( copySupported )
-					base.ContextMenu = null;
-			}
-		}
-
-		/// <summary>
-		/// Override Text property to set up copy menu if
-		/// the value is non-empty.
-		/// </summary>
-		public override string Text
-		{
-			get { return base.Text; }
-			set 
-			{ 
-				base.Text = value;
-
-				if ( copySupported )
-				{
-					if ( value == null || value == string.Empty )
-					{
-						if ( this.ContextMenu != null )
-						{
-							this.ContextMenu.Dispose();
-							this.ContextMenu = null;
-						}
-					}
-					else
-					{
-						this.ContextMenu = new System.Windows.Forms.ContextMenu();
-						MenuItem copyMenuItem = new MenuItem( "Copy", new EventHandler( CopyToClipboard ) );
-						this.ContextMenu.MenuItems.Add( copyMenuItem );
-					}
-				}
-			}
-		}
-
-		#endregion
-
-		#region Public Methods
-
-		public void Expand()
-		{
-			if ( !Expanded )
-			{
-				tipWindow = new TipWindow( this );
-				tipWindow.Closed += new EventHandler( tipWindow_Closed );
-				tipWindow.Expansion = this.Expansion;
-				tipWindow.Overlay = this.Overlay;
-				tipWindow.AutoCloseDelay = this.AutoCloseDelay;
-				tipWindow.MouseLeaveDelay = this.MouseLeaveDelay;
-				tipWindow.WantClicks = this.CopySupported;
-				tipWindow.Show();
-			}
-		}
-
-		public void Unexpand()
-		{
-			if ( Expanded )
-			{
-				tipWindow.Close();
-			}
-		}
-
-		#endregion
-
-		#region Event Handlers
-
-		private void tipWindow_Closed( object sender, EventArgs e )
-		{
-			tipWindow = null;
-			ClearTimer();
-		}
-
-		protected override void OnMouseLeave(EventArgs e)
-		{
-			ClearTimer();
-		}
-
-		private void OnMouseHover( object sender, System.EventArgs e )
-		{
-			if ( autoExpand )
-			{
-				Graphics g = Graphics.FromHwnd( Handle );
-				SizeF sizeNeeded = g.MeasureString( Text, Font );
-				bool expansionNeeded = 
-					Width < (int)sizeNeeded.Width ||
-					Height < (int)sizeNeeded.Height;
-
-				if ( expansionNeeded ) Expand();
-			}
-		}
-
-		protected override void OnMouseMove(MouseEventArgs e)
-		{
-			ClearTimer();
-
-			int textExtent = this.Lines.Length * this.FontHeight;
-			if ( e.Y <= textExtent )
-			{
-				hoverTimer = new System.Windows.Forms.Timer();
-				hoverTimer.Interval = mouseHoverDelay;
-				hoverTimer.Tick += new EventHandler( OnMouseHover );
-				hoverTimer.Start();
-			}
-
-			base.OnMouseMove (e);
-		}
-
-		private void ClearTimer()
-		{
-			if ( hoverTimer != null )
-			{
-				hoverTimer.Stop();
-				hoverTimer.Dispose();
-			}
-		}
-
-		/// <summary>
-		/// Copy contents to clipboard
-		/// </summary>
-		private void CopyToClipboard( object sender, EventArgs e )
-		{
-			Clipboard.SetDataObject( this.Text );
-		}
-	
-		#endregion
-	}
-
-//	public class HoverDetector
-//	{
-//		private Control control;
-//
-//		private Timer hoverTimer;
-//
-//		private int hoverDelay;
-//
-//		public int HoverDelay
-//		{
-//			get { return hoverDelay; }
-//			set { hoverDelay = value; }
-//		}
-//
-//		public event System.EventHandler Hover;
-//
-//		public HoverDetector( Control control )
-//		{
-//			this.control = control;
-//			
-//			control.MouseLeave += new EventHandler( OnMouseLeave );
-//			control.MouseMove += new MouseEventHandler( OnMouseMove );
-//		}
-//
-//		private void OnMouseLeave( object sender, System.EventArgs e )
-//		{
-//			ClearTimer();
-//		}
-//
-//		private void OnMouseMove( object sender, MouseEventArgs e )
-//		{
-//			ClearTimer();
-//
-//			hoverTimer = new System.Windows.Forms.Timer();
-//			hoverTimer.Interval = hoverDelay;
-//			hoverTimer.Tick += new EventHandler( OnMouseHover );
-//			hoverTimer.Start();	
-//		}
-//
-//		private void OnMouseHover( object sender, System.EventArgs e )
-//		{
-//			if ( Hover != null )
-//				Hover( this, e );
-//		}
-//
-//		private void ClearTimer()
-//		{
-//			if ( hoverTimer != null )
-//			{
-//				hoverTimer.Stop();
-//				hoverTimer.Dispose();
-//			}
-//		}
-//	}
-}
+// ****************************************************************
+// 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.Windows.Forms;
+using System.ComponentModel;
+using System.Drawing;
+
+namespace CP.Windows.Forms
+{
+	/// <summary>
+	/// A special type of textbox which can display a tooltip-like
+	/// window to show the full extent of any text which doesn't 
+	/// fit. The window may be placed directly over the label
+	/// or immediately beneath it and will expand to fit in
+	/// a horizontal, vertical or both directions as needed.
+	/// 
+	/// TODO: This control is virtually identical to ExpandingLabel.
+	/// We need to have an extension provider that works like a 
+	/// ToolTip in order to eliminate the duplication.
+	/// </summary>
+	public class ExpandingTextBox : System.Windows.Forms.TextBox
+	{
+		#region Instance Variables
+
+		/// <summary>
+		/// Our window for displaying expanded text
+		/// </summary>
+		private TipWindow tipWindow;
+		
+		/// <summary>
+		/// Direction of expansion
+		/// </summary>
+		private TipWindow.ExpansionStyle expansion = TipWindow.ExpansionStyle.Horizontal;
+		
+		/// <summary>
+		/// Time in milliseconds that the mouse must
+		/// be stationary over an item before the
+		/// tip window will display.
+		/// </summary>
+		private int mouseHoverDelay = 300;
+
+		/// <summary>
+		/// True if tipWindow may overlay the label
+		/// </summary>
+		private bool overlay = true;
+		
+		/// <summary>
+		/// Time in milliseconds that the tip window
+		/// will remain displayed.
+		/// </summary>
+		private int autoCloseDelay = 0;
+
+		/// <summary>
+		/// Time in milliseconds that the window stays
+		/// open after the mouse leaves the control.
+		/// </summary>
+		private int mouseLeaveDelay = 300;
+
+		/// <summary>
+		/// If true, a context menu with Copy is displayed which
+		/// allows copying contents to the clipboard.
+		/// </summary>
+		private bool copySupported = false;
+
+		/// <summary>
+		/// Timer used to control display behavior on hover.
+		/// </summary>
+		private System.Windows.Forms.Timer hoverTimer;
+
+		/// <summary>
+		/// True if control should expand automatically on hover.
+		/// </summary>
+		private bool autoExpand = true;
+
+		#endregion
+
+		#region Properties
+
+		[Browsable( false )]
+		public bool Expanded
+		{
+			get { return tipWindow != null && tipWindow.Visible; }
+		}
+
+		[Category ( "Behavior"  ), DefaultValue( TipWindow.ExpansionStyle.Horizontal )]
+		public TipWindow.ExpansionStyle Expansion
+		{
+			get { return expansion; }
+			set { expansion = value; }
+		}
+
+		[Category ( "Behavior" ), DefaultValue( true )]
+		public bool AutoExpand
+		{
+			get { return autoExpand; }
+			set { autoExpand = value; }
+		}
+
+		[Category( "Behavior" ), DefaultValue( true )]
+		[Description("Indicates whether the tip window should overlay the label")]
+		public bool Overlay
+		{
+			get { return overlay; }
+			set { overlay = value; }
+		}
+
+		/// <summary>
+		/// Time in milliseconds that the mouse must
+		/// be stationary over an item before the
+		/// tip window will display.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( 300 )]
+		[Description("Time in milliseconds that mouse must be stationary over an item before the tip is displayed.")]
+		public int MouseHoverDelay
+		{
+			get { return mouseHoverDelay; }
+			set { mouseHoverDelay = value; }
+		}
+
+		/// <summary>
+		/// Time in milliseconds that the tip window
+		/// will remain displayed.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( 0 )]
+		[Description("Time in milliseconds that the tip is displayed. Zero indicates no automatic timeout.")]
+		public int AutoCloseDelay
+		{
+			get { return autoCloseDelay; }
+			set { autoCloseDelay = value; }
+		}
+
+		/// <summary>
+		/// Time in milliseconds that the window stays
+		/// open after the mouse leaves the control.
+		/// Reentering the control resets this.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( 300 )]
+		[Description("Time in milliseconds that the tip is displayed after the mouse levaes the control")]
+		public int MouseLeaveDelay
+		{
+			get { return mouseLeaveDelay; }
+			set { mouseLeaveDelay = value; }
+		}
+
+		[Category( "Behavior"), DefaultValue( false )]
+		[Description("If true, displays a context menu with Copy")]
+		public bool CopySupported
+		{
+			get { return copySupported; }
+			set 
+			{ 
+				copySupported = value; 
+				if ( copySupported )
+					base.ContextMenu = null;
+			}
+		}
+
+		/// <summary>
+		/// Override Text property to set up copy menu if
+		/// the value is non-empty.
+		/// </summary>
+		public override string Text
+		{
+			get { return base.Text; }
+			set 
+			{ 
+				base.Text = value;
+
+				if ( copySupported )
+				{
+					if ( value == null || value == string.Empty )
+					{
+						if ( this.ContextMenu != null )
+						{
+							this.ContextMenu.Dispose();
+							this.ContextMenu = null;
+						}
+					}
+					else
+					{
+						this.ContextMenu = new System.Windows.Forms.ContextMenu();
+						MenuItem copyMenuItem = new MenuItem( "Copy", new EventHandler( CopyToClipboard ) );
+						this.ContextMenu.MenuItems.Add( copyMenuItem );
+					}
+				}
+			}
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public void Expand()
+		{
+			if ( !Expanded )
+			{
+				tipWindow = new TipWindow( this );
+				tipWindow.Closed += new EventHandler( tipWindow_Closed );
+				tipWindow.Expansion = this.Expansion;
+				tipWindow.Overlay = this.Overlay;
+				tipWindow.AutoCloseDelay = this.AutoCloseDelay;
+				tipWindow.MouseLeaveDelay = this.MouseLeaveDelay;
+				tipWindow.WantClicks = this.CopySupported;
+				tipWindow.Show();
+			}
+		}
+
+		public void Unexpand()
+		{
+			if ( Expanded )
+			{
+				tipWindow.Close();
+			}
+		}
+
+		#endregion
+
+		#region Event Handlers
+
+		private void tipWindow_Closed( object sender, EventArgs e )
+		{
+			tipWindow = null;
+			ClearTimer();
+		}
+
+		protected override void OnMouseLeave(EventArgs e)
+		{
+			ClearTimer();
+		}
+
+		private void OnMouseHover( object sender, System.EventArgs e )
+		{
+			if ( autoExpand )
+			{
+				Graphics g = Graphics.FromHwnd( Handle );
+				SizeF sizeNeeded = g.MeasureString( Text, Font );
+				bool expansionNeeded = 
+					Width < (int)sizeNeeded.Width ||
+					Height < (int)sizeNeeded.Height;
+
+				if ( expansionNeeded ) Expand();
+			}
+		}
+
+		protected override void OnMouseMove(MouseEventArgs e)
+		{
+			ClearTimer();
+
+			int textExtent = this.Lines.Length * this.FontHeight;
+			if ( e.Y <= textExtent )
+			{
+				hoverTimer = new System.Windows.Forms.Timer();
+				hoverTimer.Interval = mouseHoverDelay;
+				hoverTimer.Tick += new EventHandler( OnMouseHover );
+				hoverTimer.Start();
+			}
+
+			base.OnMouseMove (e);
+		}
+
+		private void ClearTimer()
+		{
+			if ( hoverTimer != null )
+			{
+				hoverTimer.Stop();
+				hoverTimer.Dispose();
+			}
+		}
+
+		/// <summary>
+		/// Copy contents to clipboard
+		/// </summary>
+		private void CopyToClipboard( object sender, EventArgs e )
+		{
+			Clipboard.SetDataObject( this.Text );
+		}
+	
+		#endregion
+	}
+
+//	public class HoverDetector
+//	{
+//		private Control control;
+//
+//		private Timer hoverTimer;
+//
+//		private int hoverDelay;
+//
+//		public int HoverDelay
+//		{
+//			get { return hoverDelay; }
+//			set { hoverDelay = value; }
+//		}
+//
+//		public event System.EventHandler Hover;
+//
+//		public HoverDetector( Control control )
+//		{
+//			this.control = control;
+//			
+//			control.MouseLeave += new EventHandler( OnMouseLeave );
+//			control.MouseMove += new MouseEventHandler( OnMouseMove );
+//		}
+//
+//		private void OnMouseLeave( object sender, System.EventArgs e )
+//		{
+//			ClearTimer();
+//		}
+//
+//		private void OnMouseMove( object sender, MouseEventArgs e )
+//		{
+//			ClearTimer();
+//
+//			hoverTimer = new System.Windows.Forms.Timer();
+//			hoverTimer.Interval = hoverDelay;
+//			hoverTimer.Tick += new EventHandler( OnMouseHover );
+//			hoverTimer.Start();	
+//		}
+//
+//		private void OnMouseHover( object sender, System.EventArgs e )
+//		{
+//			if ( Hover != null )
+//				Hover( this, e );
+//		}
+//
+//		private void ClearTimer()
+//		{
+//			if ( hoverTimer != null )
+//			{
+//				hoverTimer.Stop();
+//				hoverTimer.Dispose();
+//			}
+//		}
+//	}
+}
diff --git a/src/GuiComponents/UiKit/ExpandingTextBox.resx b/src/GuiComponents/UiKit/ExpandingTextBox.resx
index 7174dee..c9feadd 100644
--- a/src/GuiComponents/UiKit/ExpandingTextBox.resx
+++ b/src/GuiComponents/UiKit/ExpandingTextBox.resx
@@ -1,109 +1,109 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>ExpandingLabel</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>ExpandingLabel</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/GuiAttachedConsole.cs b/src/GuiComponents/UiKit/GuiAttachedConsole.cs
index 32d2ef8..006e149 100644
--- a/src/GuiComponents/UiKit/GuiAttachedConsole.cs
+++ b/src/GuiComponents/UiKit/GuiAttachedConsole.cs
@@ -1,32 +1,32 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Runtime.InteropServices;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for GuiAttachedConsole.
-	/// </summary>
-	public class GuiAttachedConsole
-	{
-		public GuiAttachedConsole()
-		{
-			AllocConsole();
-		}
-
-		public void Close()
-		{
-			FreeConsole();
-		}
-
-		[DllImport("Kernel32.dll")]
-		static extern bool AllocConsole();
-
-		[DllImport("Kernel32.dll")]
-		static extern bool FreeConsole();
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Runtime.InteropServices;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for GuiAttachedConsole.
+	/// </summary>
+	public class GuiAttachedConsole
+	{
+		public GuiAttachedConsole()
+		{
+			AllocConsole();
+		}
+
+		public void Close()
+		{
+			FreeConsole();
+		}
+
+		[DllImport("Kernel32.dll")]
+		static extern bool AllocConsole();
+
+		[DllImport("Kernel32.dll")]
+		static extern bool FreeConsole();
+	}
+}
diff --git a/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs b/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs
index 8120dcd..4e896d4 100644
--- a/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs
+++ b/src/GuiComponents/UiKit/GuiTestEventDispatcher.cs
@@ -1,61 +1,61 @@
-// ****************************************************************
-// Copyright 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.UiKit
-{
-	[Serializable]
-	public class TestEventInvocationException : Exception
-	{
-		public TestEventInvocationException( Exception inner )
-			: base( "Exception invoking TestEvent handler", inner )
-		{
-		}
-	}	
-
-	/// <summary>
-	/// Summary description for GuiTestEventDispatcher.
-	/// </summary>
-	public class GuiTestEventDispatcher : TestEventDispatcher
-	{
-		protected override void Fire(TestEventHandler handler, TestEventArgs e)
-		{
-			if ( handler != null )
-				InvokeHandler( handler, e );
-		}
-
-		private void InvokeHandler( MulticastDelegate handlerList, EventArgs e )
-		{
-			object[] args = new object[] { this, e };
-			foreach( Delegate handler in handlerList.GetInvocationList() )
-			{
-				object target = handler.Target;
-				System.Windows.Forms.Control control 
-					= target as System.Windows.Forms.Control;
-				try 
-				{
-					if ( control != null && control.InvokeRequired )
-						control.Invoke( handler, args );
-					else
-						handler.Method.Invoke( target, args );
-				}
-				catch( Exception ex )
-				{
-					// TODO: Stop rethrowing this since it goes back to the
-					// Test domain which may not know how to handle it!!!
-					Console.WriteLine( "Exception:" );
-					Console.WriteLine( ex );
-					//throw new TestEventInvocationException( ex );
-					//throw;
-				}
-			}
-		}
-
-	}
-}
-
+// ****************************************************************
+// Copyright 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.UiKit
+{
+	[Serializable]
+	public class TestEventInvocationException : Exception
+	{
+		public TestEventInvocationException( Exception inner )
+			: base( "Exception invoking TestEvent handler", inner )
+		{
+		}
+	}	
+
+	/// <summary>
+	/// Summary description for GuiTestEventDispatcher.
+	/// </summary>
+	public class GuiTestEventDispatcher : TestEventDispatcher
+	{
+		protected override void Fire(TestEventHandler handler, TestEventArgs e)
+		{
+			if ( handler != null )
+				InvokeHandler( handler, e );
+		}
+
+		private void InvokeHandler( MulticastDelegate handlerList, EventArgs e )
+		{
+			object[] args = new object[] { this, e };
+			foreach( Delegate handler in handlerList.GetInvocationList() )
+			{
+				object target = handler.Target;
+				System.Windows.Forms.Control control 
+					= target as System.Windows.Forms.Control;
+				try 
+				{
+					if ( control != null && control.InvokeRequired )
+						control.Invoke( handler, args );
+					else
+						handler.Method.Invoke( target, args );
+				}
+				catch( Exception ex )
+				{
+					// TODO: Stop rethrowing this since it goes back to the
+					// Test domain which may not know how to handle it!!!
+					Console.WriteLine( "Exception:" );
+					Console.WriteLine( ex );
+					//throw new TestEventInvocationException( ex );
+					//throw;
+				}
+			}
+		}
+
+	}
+}
+
diff --git a/src/GuiComponents/UiKit/IMessageDisplay.cs b/src/GuiComponents/UiKit/IMessageDisplay.cs
index 7e6fc24..bf2de19 100644
--- a/src/GuiComponents/UiKit/IMessageDisplay.cs
+++ b/src/GuiComponents/UiKit/IMessageDisplay.cs
@@ -1,30 +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);
-    }
-}
+// ****************************************************************
+// 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/LongRunningOperationDisplay.cs b/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs
index 4371332..c2c9241 100644
--- a/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs
+++ b/src/GuiComponents/UiKit/LongRunningOperationDisplay.cs
@@ -1,116 +1,116 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// LongRunningOperationDisplay shows an overlay message block 
-	/// that describes the operation in progress.
-	/// </summary>
-	public class LongRunningOperationDisplay : System.Windows.Forms.Form
-	{
-		private System.Windows.Forms.Label operation;
-		private Cursor ownerCursor;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public LongRunningOperationDisplay( Form owner, string text )
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			// Save the arguments
-			this.Owner = owner;
-			this.operation.Text = text;
-
-			// Save owner's current cursor and set it to the WaitCursor
-			this.ownerCursor = owner.Cursor;
-			owner.Cursor = Cursors.WaitCursor;
-
-			// Force immediate display upon construction
-			this.Show();
-			this.Invalidate();
-			this.Update();
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-
-				Owner.Cursor = this.ownerCursor;
-			}
-			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.operation = new System.Windows.Forms.Label();
-			this.SuspendLayout();
-			// 
-			// operation
-			// 
-			this.operation.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
-			this.operation.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.operation.Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 10.2F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
-			this.operation.Location = new System.Drawing.Point(0, 0);
-			this.operation.Name = "operation";
-			this.operation.Size = new System.Drawing.Size(320, 40);
-			this.operation.TabIndex = 0;
-			this.operation.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
-			// 
-			// LongRunningOperationDisplay
-			// 
-			this.BackColor = System.Drawing.Color.LightYellow;
-			this.ClientSize = new System.Drawing.Size(320, 40);
-			this.ControlBox = false;
-			this.Controls.Add(this.operation);
-			this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.Name = "LongRunningOperationDisplay";
-			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
-			this.ResumeLayout(false);
-		}
-		#endregion
-
-		protected override void OnLoad(EventArgs e)
-		{
-			base.OnLoad (e);
-	
-			// Set this again, see Mono Bug #82769
-			this.ClientSize = new System.Drawing.Size(320, 40);
-			Point origin = this.Owner.Location;
-			origin.Offset( 
-				(this.Owner.Size.Width - this.Size.Width) / 2,
-				(this.Owner.Size.Height - this.Size.Height) / 2 );
-			this.Location = origin;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// LongRunningOperationDisplay shows an overlay message block 
+	/// that describes the operation in progress.
+	/// </summary>
+	public class LongRunningOperationDisplay : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Label operation;
+		private Cursor ownerCursor;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public LongRunningOperationDisplay( Form owner, string text )
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			// Save the arguments
+			this.Owner = owner;
+			this.operation.Text = text;
+
+			// Save owner's current cursor and set it to the WaitCursor
+			this.ownerCursor = owner.Cursor;
+			owner.Cursor = Cursors.WaitCursor;
+
+			// Force immediate display upon construction
+			this.Show();
+			this.Invalidate();
+			this.Update();
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+
+				Owner.Cursor = this.ownerCursor;
+			}
+			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.operation = new System.Windows.Forms.Label();
+			this.SuspendLayout();
+			// 
+			// operation
+			// 
+			this.operation.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.operation.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.operation.Font = new System.Drawing.Font(FontFamily.GenericSansSerif, 10.2F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+			this.operation.Location = new System.Drawing.Point(0, 0);
+			this.operation.Name = "operation";
+			this.operation.Size = new System.Drawing.Size(320, 40);
+			this.operation.TabIndex = 0;
+			this.operation.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+			// 
+			// LongRunningOperationDisplay
+			// 
+			this.BackColor = System.Drawing.Color.LightYellow;
+			this.ClientSize = new System.Drawing.Size(320, 40);
+			this.ControlBox = false;
+			this.Controls.Add(this.operation);
+			this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "LongRunningOperationDisplay";
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+			this.ResumeLayout(false);
+		}
+		#endregion
+
+		protected override void OnLoad(EventArgs e)
+		{
+			base.OnLoad (e);
+	
+			// Set this again, see Mono Bug #82769
+			this.ClientSize = new System.Drawing.Size(320, 40);
+			Point origin = this.Owner.Location;
+			origin.Offset( 
+				(this.Owner.Size.Width - this.Size.Width) / 2,
+				(this.Owner.Size.Height - this.Size.Height) / 2 );
+			this.Location = origin;
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/LongRunningOperationDisplay.resx b/src/GuiComponents/UiKit/LongRunningOperationDisplay.resx
index b6793fa..5daee64 100644
--- a/src/GuiComponents/UiKit/LongRunningOperationDisplay.resx
+++ b/src/GuiComponents/UiKit/LongRunningOperationDisplay.resx
@@ -1,139 +1,139 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="operation.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="operation.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="operation.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.Name">
-    <value>LongRunningOperationDisplay</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="operation.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="operation.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="operation.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.Name">
+    <value>LongRunningOperationDisplay</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/MessageDisplay.cs b/src/GuiComponents/UiKit/MessageDisplay.cs
index de664b3..5476ccf 100644
--- a/src/GuiComponents/UiKit/MessageDisplay.cs
+++ b/src/GuiComponents/UiKit/MessageDisplay.cs
@@ -1,133 +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
-    }
-}
+// ****************************************************************
+// 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
index 7530d46..cf546d5 100644
--- a/src/GuiComponents/UiKit/NUnitFormBase.cs
+++ b/src/GuiComponents/UiKit/NUnitFormBase.cs
@@ -1,35 +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;
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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/NotRunTree.cs b/src/GuiComponents/UiKit/NotRunTree.cs
index d647a84..a135f7e 100644
--- a/src/GuiComponents/UiKit/NotRunTree.cs
+++ b/src/GuiComponents/UiKit/NotRunTree.cs
@@ -1,59 +1,59 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for NotRunTree.
-	/// </summary>
-	public class NotRunTree : TreeView, TestObserver
-	{
-		#region TestObserver Members and TestEventHandlers
-
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestLoaded += new TestEventHandler(ClearTreeNodes);
-			events.TestUnloaded += new TestEventHandler(ClearTreeNodes);
-			events.TestReloaded += new TestEventHandler(OnTestReloaded);
-			events.RunStarting += new TestEventHandler(ClearTreeNodes);
-			events.TestFinished += new TestEventHandler(OnTestFinished);
-			events.SuiteFinished += new TestEventHandler(OnTestFinished);
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs args )
-		{
-			TestResult result = args.Result;
-			if ( result.ResultState == ResultState.Skipped || result.ResultState == ResultState.Ignored)
-				this.AddNode( args.Result );
-		}
-
-		private void ClearTreeNodes(object sender, TestEventArgs args)
-		{
-			this.Nodes.Clear();
-		}
-
-		private void OnTestReloaded(object sender, TestEventArgs args)
-		{
-			if ( Services.UserSettings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
-				this.Nodes.Clear();
-		}
-
-		private void AddNode( TestResult result )
-		{
-			TreeNode node = new TreeNode(result.Name);
-			TreeNode reasonNode = new TreeNode("Reason: " + result.Message);
-			node.Nodes.Add(reasonNode);
-
-			Nodes.Add( node );
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Windows.Forms;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for NotRunTree.
+	/// </summary>
+	public class NotRunTree : TreeView, TestObserver
+	{
+		#region TestObserver Members and TestEventHandlers
+
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestLoaded += new TestEventHandler(ClearTreeNodes);
+			events.TestUnloaded += new TestEventHandler(ClearTreeNodes);
+			events.TestReloaded += new TestEventHandler(OnTestReloaded);
+			events.RunStarting += new TestEventHandler(ClearTreeNodes);
+			events.TestFinished += new TestEventHandler(OnTestFinished);
+			events.SuiteFinished += new TestEventHandler(OnTestFinished);
+		}
+
+		private void OnTestFinished( object sender, TestEventArgs args )
+		{
+			TestResult result = args.Result;
+			if ( result.ResultState == ResultState.Skipped || result.ResultState == ResultState.Ignored)
+				this.AddNode( args.Result );
+		}
+
+		private void ClearTreeNodes(object sender, TestEventArgs args)
+		{
+			this.Nodes.Clear();
+		}
+
+		private void OnTestReloaded(object sender, TestEventArgs args)
+		{
+			if ( Services.UserSettings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
+				this.Nodes.Clear();
+		}
+
+		private void AddNode( TestResult result )
+		{
+			TreeNode node = new TreeNode(result.Name);
+			TreeNode reasonNode = new TreeNode("Reason: " + result.Message);
+			node.Nodes.Add(reasonNode);
+
+			Nodes.Add( node );
+		}
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/NotRunTree.resx b/src/GuiComponents/UiKit/NotRunTree.resx
index 6af1353..df79c33 100644
--- a/src/GuiComponents/UiKit/NotRunTree.resx
+++ b/src/GuiComponents/UiKit/NotRunTree.resx
@@ -1,42 +1,42 @@
-<?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>
+<?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/ProgressBar.cs b/src/GuiComponents/UiKit/ProgressBar.cs
index bb89fa6..3e82e5c 100644
--- a/src/GuiComponents/UiKit/ProgressBar.cs
+++ b/src/GuiComponents/UiKit/ProgressBar.cs
@@ -1,428 +1,428 @@
-// ****************************************************************
-// 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.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// ColorProgressBar provides a custom progress bar with the
-	/// ability to control the color of the bar and to render itself
-	/// in either solid or segmented style. The bar can be updated
-	/// on the fly and has code to avoid repainting the entire bar
-	/// when that occurs.
-	/// </summary>
-	public class ColorProgressBar : System.Windows.Forms.Control
-	{
-		#region Instance Variables
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		/// <summary>
-		/// The current progress value
-		/// </summary>
-		private int val = 0;
-
-		/// <summary>
-		/// The minimum value allowed
-		/// </summary>
-		private int min = 0;
-
-		/// <summary>
-		/// The maximum value allowed
-		/// </summary>
-		private int max = 100;
-
-		/// <summary>
-		/// Amount to advance for each step
-		/// </summary>
-		private int step = 1;
-
-		/// <summary>
-		/// Last segment displayed when displaying asynchronously rather 
-		/// than through OnPaint calls.
-		/// </summary>
-		private int lastSegmentCount=0;
-
-		/// <summary>
-		/// The brush to use in painting the progress bar
-		/// </summary>
-		private Brush foreBrush = null;
-
-		/// <summary>
-		/// The brush to use in painting the background of the bar
-		/// </summary>
-		private Brush backBrush = null;
-
-		/// <summary>
-		/// Indicates whether to draw the bar in segments or not
-		/// </summary>
-		private bool segmented = false;
-
-		#endregion
-
-		#region Constructors & Disposer
-		public ColorProgressBar()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			SetStyle(ControlStyles.ResizeRedraw, true);
-		}
-
-		/// <summary> 
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-				this.ReleaseBrushes();
-			}
-			base.Dispose( disposing );
-		}
-		#endregion
-
-		#region Properties
-		
-		[Category("Behavior")]
-		public int Minimum
-		{
-			get { return this.min; }
-			set
-			{
-				if (value <= Maximum) 
-				{
-					if (this.min != value) 
-					{
-						this.min = value;
-						this.Invalidate();
-					}
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Minimum", value
-						,"Minimum must be <= Maximum.");
-				}
-			}
-		}
-
-		[Category("Behavior")]
-		public int Maximum 
-		{
-			get	{ return this.max; }
-			set
-			{
-				if (value >= Minimum) 
-				{
-					if (this.max != value) 
-					{
-						this.max = value;
-						this.Invalidate();
-					}
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Maximum", value
-						,"Maximum must be >= Minimum.");
-				}
-			}
-		}
-
-		[Category("Behavior")]
-		public int Step
-		{
-			get	{ return this.step; }
-			set
-			{
-				if (value <= Maximum && value >= Minimum) 
-				{
-					this.step = value;
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Step", value
-						,"Must fall between Minimum and Maximum inclusive.");
-				}
-			}
-		}
-		
-		[Browsable(false)]
-		private float PercentValue
-		{
-			get
-            {
-                if (0 != Maximum - Minimum) // NRG 05/28/03: Prevent divide by zero
-                    return((float)this.val / ((float)Maximum - (float)Minimum));
-                else
-                    return(0);
-            }
-		}	
-
-		[Category("Behavior")]
-		public int Value 
-		{
-			get { return this.val; }
-			set 
-			{
-				if(value == this.val)
-					return;
-				else if(value <= Maximum && value >= Minimum)
-				{
-					this.val = value;
-					this.Invalidate();
-				}
-				else
-				{
-					throw new ArgumentOutOfRangeException("Value", value
-						,"Must fall between Minimum and Maximum inclusive.");
-				}
-			}
-		}
-
-		[Category("Appearance")]
-		public bool Segmented
-		{
-			get { return segmented; }
-			set { segmented = value; }
-		}
-
-		#endregion
-
-		#region Methods
-
-		protected override void OnCreateControl()
-		{
-		}
-
-		public void PerformStep()
-		{
-			int newValue = Value + Step;
-
-			if( newValue > Maximum )
-				newValue = Maximum;
-
-			Value = newValue;
-		}
-
-		protected override void OnBackColorChanged(System.EventArgs e)
-		{
-			base.OnBackColorChanged(e);
-			this.Refresh();
-		}
-		protected override void OnForeColorChanged(System.EventArgs e)
-		{
-			base.OnForeColorChanged(e);
-			this.Refresh();
-		}
-		
-		protected override void OnPaint(PaintEventArgs e)
-		{
-			base.OnPaint(e);
-			this.lastSegmentCount=0;
-			this.ReleaseBrushes();
-			PaintBar(e.Graphics);
-			ControlPaint.DrawBorder3D(
-				e.Graphics
-				,this.ClientRectangle
-				,Border3DStyle.SunkenOuter);
-			//e.Graphics.Flush();
-		}
-
-		private void ReleaseBrushes()
-		{
-			if(foreBrush != null)
-			{
-				foreBrush.Dispose();
-				backBrush.Dispose();
-				foreBrush=null;
-				backBrush=null;
-			}
-		}
-
-		private void AcquireBrushes()
-		{
-			if(foreBrush == null)
-			{
-				foreBrush = new SolidBrush(this.ForeColor);
-				backBrush = new SolidBrush(this.BackColor);
-			}
-		}
-
-		private void PaintBar(Graphics g)
-		{
-			Rectangle theBar = Rectangle.Inflate(ClientRectangle, -2, -2);
-			int maxRight = theBar.Right-1;
-			this.AcquireBrushes();
-
-			if ( segmented )
-			{
-				int segmentWidth = (int)((float)ClientRectangle.Height * 0.66f);
-				int maxSegmentCount = ( theBar.Width + segmentWidth ) / segmentWidth;
-
-				//int maxRight = Bar.Right;
-				int newSegmentCount = (int)System.Math.Ceiling(PercentValue*maxSegmentCount);
-				if(newSegmentCount > lastSegmentCount)
-				{
-					theBar.X += lastSegmentCount*segmentWidth;
-					while (lastSegmentCount < newSegmentCount )
-					{
-						theBar.Width = System.Math.Min( maxRight - theBar.X, segmentWidth - 2 );
-						g.FillRectangle( foreBrush, theBar );
-						theBar.X += segmentWidth;
-						lastSegmentCount++;
-					}
-				}
-				else if(newSegmentCount < lastSegmentCount)
-				{
-					theBar.X += newSegmentCount * segmentWidth;
-					theBar.Width = maxRight - theBar.X;
-					g.FillRectangle(backBrush, theBar);
-					lastSegmentCount = newSegmentCount;
-				}
-			}
-			else
-			{
-				//g.FillRectangle( backBrush, theBar );
-				theBar.Width = theBar.Width * val / max;
-				g.FillRectangle( foreBrush, theBar );
-			}
-
-			if(Value == Minimum || Value == Maximum)
-				this.ReleaseBrushes();
-		}
-
-		#endregion
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			// 
-			// ProgressBar
-			// 
-			this.CausesValidation = false;
-			this.Enabled = false;
-			this.ForeColor = System.Drawing.SystemColors.Highlight;
-			this.Name = "ProgressBar";
-			this.Size = new System.Drawing.Size(432, 24);
-		}
-		#endregion
-	}
-
-	public class TestProgressBar : ColorProgressBar, TestObserver
-	{
-		private readonly static Color SuccessColor = Color.Lime;
-		private readonly static Color FailureColor = Color.Red;
-		private readonly static Color IgnoredColor = Color.Yellow;
-
-		public TestProgressBar()
-		{
-			Initialize( 100 );
-		}
-
-		private void Initialize( int testCount )
-		{
-			Value = 0;
-			Maximum = testCount;
-            ForeColor = SuccessColor;
-        }
-
-		private void OnRunStarting( object Sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount );
-		}
-
-        private void OnTestLoaded(object sender, TestEventArgs e)
-        {
-            Initialize(e.TestCount);
-        }
-
-        private void OnTestReloaded(object sender, TestEventArgs e)
-        {
-            if (Services.UserSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
-                Initialize(e.TestCount);
-            else
-                Value = Maximum = e.TestCount;
-        }
-
-        private void OnTestUnloaded(object sender, TestEventArgs e)
-		{
-			Initialize( 100 );
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs e )
-		{
-			PerformStep();
-
-            switch (e.Result.ResultState)
-            {
-                case ResultState.NotRunnable:
-                case ResultState.Failure:
-                case ResultState.Error:
-                case ResultState.Cancelled:
-                    ForeColor = FailureColor;
-                    break;
-                case ResultState.Ignored:
-                    if (ForeColor == SuccessColor)
-                        ForeColor = IgnoredColor;
-                    break;
-                default:
-                    break;
-            }
-        }
-
-		private void OnSuiteFinished( object sender, TestEventArgs e )
-		{
-			TestResult result = e.Result;
-            if ( result.FailureSite == FailureSite.TearDown )
-                switch (result.ResultState)
-                {
-                    case ResultState.Error:
-                    case ResultState.Failure:
-                    case ResultState.Cancelled:
-                        ForeColor = FailureColor;
-                        break;
-                }
-		}
-
-		private void OnTestException(object sender, TestEventArgs e)
-		{
-			ForeColor = FailureColor;
-		}
-
-		#region TestObserver Members
-
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
-            events.TestReloaded += new TestEventHandler(OnTestReloaded);
-			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
-			events.RunStarting	+= new TestEventHandler( OnRunStarting );
-			events.TestFinished	+= new TestEventHandler( OnTestFinished );
-			events.SuiteFinished += new TestEventHandler( OnSuiteFinished );
-			events.TestException += new TestEventHandler(OnTestException);
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// ColorProgressBar provides a custom progress bar with the
+	/// ability to control the color of the bar and to render itself
+	/// in either solid or segmented style. The bar can be updated
+	/// on the fly and has code to avoid repainting the entire bar
+	/// when that occurs.
+	/// </summary>
+	public class ColorProgressBar : System.Windows.Forms.Control
+	{
+		#region Instance Variables
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		/// <summary>
+		/// The current progress value
+		/// </summary>
+		private int val = 0;
+
+		/// <summary>
+		/// The minimum value allowed
+		/// </summary>
+		private int min = 0;
+
+		/// <summary>
+		/// The maximum value allowed
+		/// </summary>
+		private int max = 100;
+
+		/// <summary>
+		/// Amount to advance for each step
+		/// </summary>
+		private int step = 1;
+
+		/// <summary>
+		/// Last segment displayed when displaying asynchronously rather 
+		/// than through OnPaint calls.
+		/// </summary>
+		private int lastSegmentCount=0;
+
+		/// <summary>
+		/// The brush to use in painting the progress bar
+		/// </summary>
+		private Brush foreBrush = null;
+
+		/// <summary>
+		/// The brush to use in painting the background of the bar
+		/// </summary>
+		private Brush backBrush = null;
+
+		/// <summary>
+		/// Indicates whether to draw the bar in segments or not
+		/// </summary>
+		private bool segmented = false;
+
+		#endregion
+
+		#region Constructors & Disposer
+		public ColorProgressBar()
+		{
+			// This call is required by the Windows.Forms Form Designer.
+			InitializeComponent();
+
+			SetStyle(ControlStyles.ResizeRedraw, true);
+		}
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+				this.ReleaseBrushes();
+			}
+			base.Dispose( disposing );
+		}
+		#endregion
+
+		#region Properties
+		
+		[Category("Behavior")]
+		public int Minimum
+		{
+			get { return this.min; }
+			set
+			{
+				if (value <= Maximum) 
+				{
+					if (this.min != value) 
+					{
+						this.min = value;
+						this.Invalidate();
+					}
+				}
+				else
+				{
+					throw new ArgumentOutOfRangeException("Minimum", value
+						,"Minimum must be <= Maximum.");
+				}
+			}
+		}
+
+		[Category("Behavior")]
+		public int Maximum 
+		{
+			get	{ return this.max; }
+			set
+			{
+				if (value >= Minimum) 
+				{
+					if (this.max != value) 
+					{
+						this.max = value;
+						this.Invalidate();
+					}
+				}
+				else
+				{
+					throw new ArgumentOutOfRangeException("Maximum", value
+						,"Maximum must be >= Minimum.");
+				}
+			}
+		}
+
+		[Category("Behavior")]
+		public int Step
+		{
+			get	{ return this.step; }
+			set
+			{
+				if (value <= Maximum && value >= Minimum) 
+				{
+					this.step = value;
+				}
+				else
+				{
+					throw new ArgumentOutOfRangeException("Step", value
+						,"Must fall between Minimum and Maximum inclusive.");
+				}
+			}
+		}
+		
+		[Browsable(false)]
+		private float PercentValue
+		{
+			get
+            {
+                if (0 != Maximum - Minimum) // NRG 05/28/03: Prevent divide by zero
+                    return((float)this.val / ((float)Maximum - (float)Minimum));
+                else
+                    return(0);
+            }
+		}	
+
+		[Category("Behavior")]
+		public int Value 
+		{
+			get { return this.val; }
+			set 
+			{
+				if(value == this.val)
+					return;
+				else if(value <= Maximum && value >= Minimum)
+				{
+					this.val = value;
+					this.Invalidate();
+				}
+				else
+				{
+					throw new ArgumentOutOfRangeException("Value", value
+						,"Must fall between Minimum and Maximum inclusive.");
+				}
+			}
+		}
+
+		[Category("Appearance")]
+		public bool Segmented
+		{
+			get { return segmented; }
+			set { segmented = value; }
+		}
+
+		#endregion
+
+		#region Methods
+
+		protected override void OnCreateControl()
+		{
+		}
+
+		public void PerformStep()
+		{
+			int newValue = Value + Step;
+
+			if( newValue > Maximum )
+				newValue = Maximum;
+
+			Value = newValue;
+		}
+
+		protected override void OnBackColorChanged(System.EventArgs e)
+		{
+			base.OnBackColorChanged(e);
+			this.Refresh();
+		}
+		protected override void OnForeColorChanged(System.EventArgs e)
+		{
+			base.OnForeColorChanged(e);
+			this.Refresh();
+		}
+		
+		protected override void OnPaint(PaintEventArgs e)
+		{
+			base.OnPaint(e);
+			this.lastSegmentCount=0;
+			this.ReleaseBrushes();
+			PaintBar(e.Graphics);
+			ControlPaint.DrawBorder3D(
+				e.Graphics
+				,this.ClientRectangle
+				,Border3DStyle.SunkenOuter);
+			//e.Graphics.Flush();
+		}
+
+		private void ReleaseBrushes()
+		{
+			if(foreBrush != null)
+			{
+				foreBrush.Dispose();
+				backBrush.Dispose();
+				foreBrush=null;
+				backBrush=null;
+			}
+		}
+
+		private void AcquireBrushes()
+		{
+			if(foreBrush == null)
+			{
+				foreBrush = new SolidBrush(this.ForeColor);
+				backBrush = new SolidBrush(this.BackColor);
+			}
+		}
+
+		private void PaintBar(Graphics g)
+		{
+			Rectangle theBar = Rectangle.Inflate(ClientRectangle, -2, -2);
+			int maxRight = theBar.Right-1;
+			this.AcquireBrushes();
+
+			if ( segmented )
+			{
+				int segmentWidth = (int)((float)ClientRectangle.Height * 0.66f);
+				int maxSegmentCount = ( theBar.Width + segmentWidth ) / segmentWidth;
+
+				//int maxRight = Bar.Right;
+				int newSegmentCount = (int)System.Math.Ceiling(PercentValue*maxSegmentCount);
+				if(newSegmentCount > lastSegmentCount)
+				{
+					theBar.X += lastSegmentCount*segmentWidth;
+					while (lastSegmentCount < newSegmentCount )
+					{
+						theBar.Width = System.Math.Min( maxRight - theBar.X, segmentWidth - 2 );
+						g.FillRectangle( foreBrush, theBar );
+						theBar.X += segmentWidth;
+						lastSegmentCount++;
+					}
+				}
+				else if(newSegmentCount < lastSegmentCount)
+				{
+					theBar.X += newSegmentCount * segmentWidth;
+					theBar.Width = maxRight - theBar.X;
+					g.FillRectangle(backBrush, theBar);
+					lastSegmentCount = newSegmentCount;
+				}
+			}
+			else
+			{
+				//g.FillRectangle( backBrush, theBar );
+				theBar.Width = theBar.Width * val / max;
+				g.FillRectangle( foreBrush, theBar );
+			}
+
+			if(Value == Minimum || Value == Maximum)
+				this.ReleaseBrushes();
+		}
+
+		#endregion
+
+		#region Component Designer generated code
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			// 
+			// ProgressBar
+			// 
+			this.CausesValidation = false;
+			this.Enabled = false;
+			this.ForeColor = System.Drawing.SystemColors.Highlight;
+			this.Name = "ProgressBar";
+			this.Size = new System.Drawing.Size(432, 24);
+		}
+		#endregion
+	}
+
+	public class TestProgressBar : ColorProgressBar, TestObserver
+	{
+		private readonly static Color SuccessColor = Color.Lime;
+		private readonly static Color FailureColor = Color.Red;
+		private readonly static Color IgnoredColor = Color.Yellow;
+
+		public TestProgressBar()
+		{
+			Initialize( 100 );
+		}
+
+		private void Initialize( int testCount )
+		{
+			Value = 0;
+			Maximum = testCount;
+            ForeColor = SuccessColor;
+        }
+
+		private void OnRunStarting( object Sender, TestEventArgs e )
+		{
+			Initialize( e.TestCount );
+		}
+
+        private void OnTestLoaded(object sender, TestEventArgs e)
+        {
+            Initialize(e.TestCount);
+        }
+
+        private void OnTestReloaded(object sender, TestEventArgs e)
+        {
+            if (Services.UserSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
+                Initialize(e.TestCount);
+            else
+                Value = Maximum = e.TestCount;
+        }
+
+        private void OnTestUnloaded(object sender, TestEventArgs e)
+		{
+			Initialize( 100 );
+		}
+
+		private void OnTestFinished( object sender, TestEventArgs e )
+		{
+			PerformStep();
+
+            switch (e.Result.ResultState)
+            {
+                case ResultState.NotRunnable:
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+                    ForeColor = FailureColor;
+                    break;
+                case ResultState.Ignored:
+                    if (ForeColor == SuccessColor)
+                        ForeColor = IgnoredColor;
+                    break;
+                default:
+                    break;
+            }
+        }
+
+		private void OnSuiteFinished( object sender, TestEventArgs e )
+		{
+			TestResult result = e.Result;
+            if ( result.FailureSite == FailureSite.TearDown )
+                switch (result.ResultState)
+                {
+                    case ResultState.Error:
+                    case ResultState.Failure:
+                    case ResultState.Cancelled:
+                        ForeColor = FailureColor;
+                        break;
+                }
+		}
+
+		private void OnTestException(object sender, TestEventArgs e)
+		{
+			ForeColor = FailureColor;
+		}
+
+		#region TestObserver Members
+
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
+            events.TestReloaded += new TestEventHandler(OnTestReloaded);
+			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
+			events.RunStarting	+= new TestEventHandler( OnRunStarting );
+			events.TestFinished	+= new TestEventHandler( OnTestFinished );
+			events.SuiteFinished += new TestEventHandler( OnSuiteFinished );
+			events.TestException += new TestEventHandler(OnTestException);
+		}
+
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/ProgressBar.resx b/src/GuiComponents/UiKit/ProgressBar.resx
index 6af1353..df79c33 100644
--- a/src/GuiComponents/UiKit/ProgressBar.resx
+++ b/src/GuiComponents/UiKit/ProgressBar.resx
@@ -1,42 +1,42 @@
-<?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>
+<?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/RenameConfigurationDialog.cs b/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
index c1497ca..28cccdd 100644
--- a/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
+++ b/src/GuiComponents/UiKit/RenameConfigurationDialog.cs
@@ -1,176 +1,176 @@
-// ****************************************************************
-// 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.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-    /// Displays a dialog for entry of a new name for an
-    /// existing configuration. This dialog collects and
-    /// validates the name. The caller is responsible for
-    /// actually renaming the cofiguration.
-    /// </summary>
-    public class RenameConfigurationDialog : NUnitFormBase
-	{
-		#region Instance Variables
-
-		/// <summary>
-		///  The project in which we are renaming a configuration
-		/// </summary>
-		private NUnitProject project;
-
-		/// <summary>
-		/// The new name to give the configuration
-		/// </summary>
-		private string configurationName;
-
-		/// <summary>
-		/// The original name of the configuration
-		/// </summary>
-		private string originalName;
-
-		private System.Windows.Forms.Button okButton;
-		private System.Windows.Forms.Button cancelButton;
-		private System.Windows.Forms.TextBox configurationNameTextBox;
-
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		#endregion
-
-		#region Construction and Disposal
-
-		public RenameConfigurationDialog( NUnitProject project, string configurationName )
-		{
-			InitializeComponent();
-			this.project = project;
-			this.configurationName = configurationName;
-			this.originalName = configurationName;
-		}
-
-		/// <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.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;
-			this.configurationNameTextBox.Text = "";
-			this.configurationNameTextBox.TextChanged += new System.EventHandler(this.configurationNameTextBox_TextChanged);
-			// 
-			// 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";
-			this.okButton.Click += new System.EventHandler(this.okButton_Click);
-			// 
-			// 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.Load += new System.EventHandler(this.ConfigurationNameDialog_Load);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		#region Properties & Methods
-
-		public string ConfigurationName
-		{
-			get{ return configurationName; }
-			set{ configurationName = value; }
-		}
-
-		private void ConfigurationNameDialog_Load(object sender, System.EventArgs e)
-		{
-			if ( configurationName != null )
-			{
-				configurationNameTextBox.Text = configurationName;
-				configurationNameTextBox.SelectAll();
-			}
-		}
-
-		private void okButton_Click(object sender, System.EventArgs e)
-		{
-			configurationName = configurationNameTextBox.Text;		
-			if ( project.Configs.Contains( configurationName ) )
-				// TODO: Need general error message display
-                MessageDisplay.Error("A configuration with that name already exists");
-			else
-			{
-				DialogResult = DialogResult.OK;
-				Close();
-			}
-		}
-
-		private void configurationNameTextBox_TextChanged(object sender, System.EventArgs e)
-		{
-			okButton.Enabled = 
-				configurationNameTextBox.TextLength > 0 &&
-				configurationNameTextBox.Text != originalName;
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+    /// Displays a dialog for entry of a new name for an
+    /// existing configuration. This dialog collects and
+    /// validates the name. The caller is responsible for
+    /// actually renaming the cofiguration.
+    /// </summary>
+    public class RenameConfigurationDialog : NUnitFormBase
+	{
+		#region Instance Variables
+
+		/// <summary>
+		///  The project in which we are renaming a configuration
+		/// </summary>
+		private NUnitProject project;
+
+		/// <summary>
+		/// The new name to give the configuration
+		/// </summary>
+		private string configurationName;
+
+		/// <summary>
+		/// The original name of the configuration
+		/// </summary>
+		private string originalName;
+
+		private System.Windows.Forms.Button okButton;
+		private System.Windows.Forms.Button cancelButton;
+		private System.Windows.Forms.TextBox configurationNameTextBox;
+
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		#endregion
+
+		#region Construction and Disposal
+
+		public RenameConfigurationDialog( NUnitProject project, string configurationName )
+		{
+			InitializeComponent();
+			this.project = project;
+			this.configurationName = configurationName;
+			this.originalName = configurationName;
+		}
+
+		/// <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.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;
+			this.configurationNameTextBox.Text = "";
+			this.configurationNameTextBox.TextChanged += new System.EventHandler(this.configurationNameTextBox_TextChanged);
+			// 
+			// 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";
+			this.okButton.Click += new System.EventHandler(this.okButton_Click);
+			// 
+			// 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.Load += new System.EventHandler(this.ConfigurationNameDialog_Load);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Properties & Methods
+
+		public string ConfigurationName
+		{
+			get{ return configurationName; }
+			set{ configurationName = value; }
+		}
+
+		private void ConfigurationNameDialog_Load(object sender, System.EventArgs e)
+		{
+			if ( configurationName != null )
+			{
+				configurationNameTextBox.Text = configurationName;
+				configurationNameTextBox.SelectAll();
+			}
+		}
+
+		private void okButton_Click(object sender, System.EventArgs e)
+		{
+			configurationName = configurationNameTextBox.Text;		
+			if ( project.Configs.Contains( configurationName ) )
+				// TODO: Need general error message display
+                MessageDisplay.Error("A configuration with that name already exists");
+			else
+			{
+				DialogResult = DialogResult.OK;
+				Close();
+			}
+		}
+
+		private void configurationNameTextBox_TextChanged(object sender, System.EventArgs e)
+		{
+			okButton.Enabled = 
+				configurationNameTextBox.TextLength > 0 &&
+				configurationNameTextBox.Text != originalName;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/RenameConfigurationDialog.resx b/src/GuiComponents/UiKit/RenameConfigurationDialog.resx
index 15057b2..72365f0 100644
--- a/src/GuiComponents/UiKit/RenameConfigurationDialog.resx
+++ b/src/GuiComponents/UiKit/RenameConfigurationDialog.resx
@@ -1,157 +1,157 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="configurationNameTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configurationNameTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="configurationNameTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>RenameConfigurationDialog</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="configurationNameTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="configurationNameTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="configurationNameTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>RenameConfigurationDialog</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ResultTabs.cs b/src/GuiComponents/UiKit/ResultTabs.cs
index f954de7..c76f2e7 100644
--- a/src/GuiComponents/UiKit/ResultTabs.cs
+++ b/src/GuiComponents/UiKit/ResultTabs.cs
@@ -1,485 +1,478 @@
-// ****************************************************************
-// Copyright 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.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.Core;
-using CP.Windows.Forms;
-using System.Diagnostics;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for ResultTabs.
-	/// </summary>
-	public class ResultTabs : System.Windows.Forms.UserControl, TestObserver
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(ResultTabs));
-
-		private ISettings settings;
-		private bool updating = false;
-		private TextDisplayController displayController;
-
-		private MenuItem tabsMenu;
-		private MenuItem errorsTabMenuItem;
-		private MenuItem notRunTabMenuItem;
-		private MenuItem menuSeparator;
-		private MenuItem textOutputMenuItem;
-
-		private System.Windows.Forms.TabPage errorTab;
-		private NUnit.UiKit.ErrorDisplay errorDisplay;
-		private System.Windows.Forms.TabPage notRunTab;
-		private NUnit.UiKit.NotRunTree notRunTree;
-		private System.Windows.Forms.TabControl tabControl;
-		private System.Windows.Forms.MenuItem copyDetailMenuItem;
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public ResultTabs()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			this.tabsMenu = new MenuItem();
-			this.errorsTabMenuItem = new System.Windows.Forms.MenuItem();
-			this.notRunTabMenuItem = new System.Windows.Forms.MenuItem();
-			this.menuSeparator = new System.Windows.Forms.MenuItem();
-			this.textOutputMenuItem = new System.Windows.Forms.MenuItem();
-
-			this.tabsMenu.MergeType = MenuMerge.Add;
-			this.tabsMenu.MergeOrder = 1;
-			this.tabsMenu.MenuItems.AddRange(
-				new System.Windows.Forms.MenuItem[] 
-				{
-					this.errorsTabMenuItem,
-					this.notRunTabMenuItem,
-					this.menuSeparator,
-					this.textOutputMenuItem,
-				} );
-			this.tabsMenu.Text = "&Result Tabs";
-			this.tabsMenu.Visible = true;
-
-			this.errorsTabMenuItem.Index = 0;
-			this.errorsTabMenuItem.Text = "&Errors && Failures";
-			this.errorsTabMenuItem.Click += new System.EventHandler(this.errorsTabMenuItem_Click);
-
-			this.notRunTabMenuItem.Index = 1;
-			this.notRunTabMenuItem.Text = "Tests &Not Run";
-			this.notRunTabMenuItem.Click += new System.EventHandler(this.notRunTabMenuItem_Click);
-
-			this.menuSeparator.Index = 2;
-			this.menuSeparator.Text = "-";
-			
-			this.textOutputMenuItem.Index = 3;
-			this.textOutputMenuItem.Text = "Text &Output...";
-			this.textOutputMenuItem.Click += new EventHandler(textOutputMenuItem_Click);
-
-			displayController = new TextDisplayController(tabControl);
-//			displayController.CreatePages();
-		}
-
-		/// <summary> 
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.tabControl = new System.Windows.Forms.TabControl();
-			this.errorTab = new System.Windows.Forms.TabPage();
-			this.errorDisplay = new NUnit.UiKit.ErrorDisplay();
-			this.notRunTab = new System.Windows.Forms.TabPage();
-			this.notRunTree = new NUnit.UiKit.NotRunTree();
-			this.copyDetailMenuItem = new System.Windows.Forms.MenuItem();
-			this.tabControl.SuspendLayout();
-			this.errorTab.SuspendLayout();
-			this.notRunTab.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// tabControl
-			// 
-			this.tabControl.Alignment = System.Windows.Forms.TabAlignment.Bottom;
-			this.tabControl.Controls.Add(this.errorTab);
-			this.tabControl.Controls.Add(this.notRunTab);
-			this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.tabControl.Location = new System.Drawing.Point(0, 0);
-			this.tabControl.Name = "tabControl";
-			this.tabControl.SelectedIndex = 0;
-			this.tabControl.Size = new System.Drawing.Size(488, 280);
-			this.tabControl.TabIndex = 3;
-			this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
-			// 
-			// errorTab
-			// 
-			this.errorTab.Controls.Add(this.errorDisplay);
-			this.errorTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.errorTab.Location = new System.Drawing.Point(4, 4);
-			this.errorTab.Name = "errorTab";
-			this.errorTab.Size = new System.Drawing.Size(480, 254);
-			this.errorTab.TabIndex = 0;
-			this.errorTab.Text = "Errors and Failures";
-			// 
-			// errorDisplay
-			// 
-			this.errorDisplay.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.errorDisplay.Location = new System.Drawing.Point(0, 0);
-			this.errorDisplay.Name = "errorDisplay";
-			this.errorDisplay.Size = new System.Drawing.Size(480, 254);
-			this.errorDisplay.TabIndex = 0;
-			// 
-			// notRunTab
-			// 
-			this.notRunTab.Controls.Add(this.notRunTree);
-			this.notRunTab.ForeColor = System.Drawing.SystemColors.ControlText;
-			this.notRunTab.Location = new System.Drawing.Point(4, 4);
-			this.notRunTab.Name = "notRunTab";
-			this.notRunTab.Size = new System.Drawing.Size(480, 254);
-			this.notRunTab.TabIndex = 1;
-			this.notRunTab.Text = "Tests Not Run";
-			this.notRunTab.Visible = false;
-			// 
-			// notRunTree
-			// 
-			this.notRunTree.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.notRunTree.ImageIndex = -1;
-			this.notRunTree.Indent = 19;
-			this.notRunTree.Location = new System.Drawing.Point(0, 0);
-			this.notRunTree.Name = "notRunTree";
-			this.notRunTree.SelectedImageIndex = -1;
-			this.notRunTree.Size = new System.Drawing.Size(480, 254);
-			this.notRunTree.TabIndex = 0;
-			// 
-			// copyDetailMenuItem
-			// 
-			this.copyDetailMenuItem.Index = -1;
-			this.copyDetailMenuItem.Text = "Copy";
-			// 
-			// ResultTabs
-			// 
-			this.Controls.Add(this.tabControl);
-			this.Name = "ResultTabs";
-			this.Size = new System.Drawing.Size(488, 280);
-			this.tabControl.ResumeLayout(false);
-			this.errorTab.ResumeLayout(false);
-			this.notRunTab.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-        public bool IsTracingEnabled
-        {
-            get { return displayController.IsTracingEnabled; }
-        }
-
-        public LoggingThreshold MaximumLogLevel
-        {
-            get { return displayController.MaximumLogLevel; }
-        }
-	
-		public void Clear()
-		{
-			errorDisplay.Clear();
-			notRunTree.Nodes.Clear();
-			displayController.Clear();
-		}
-
-		public MenuItem TabsMenu
-		{
-			get { return tabsMenu; }
-		}
-
-		protected override void OnLoad(EventArgs e)
-		{
-			if ( !this.DesignMode )
-			{
-				this.settings = Services.UserSettings;
-				TextDisplayTabSettings tabSettings = new TextDisplayTabSettings();
-				tabSettings.LoadSettings( settings );
-
-				UpdateTabPages();
-
-				Subscribe( Services.TestLoader.Events );
-				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
-
-				ITestEvents events = Services.TestLoader.Events;
-				errorDisplay.Subscribe( events );
-				notRunTree.Subscribe( events );
-
-				displayController.Subscribe( events );
-			}
-
-			base.OnLoad (e);
-		}
-
-		private void UpdateTabPages()
-		{
-			errorsTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
-			notRunTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
-
-			log.Debug( "Updating tab pages" );
-			updating = true;
-			
-			tabControl.TabPages.Clear();
-
-			if ( errorsTabMenuItem.Checked )
-				tabControl.TabPages.Add( errorTab );
-			if ( notRunTabMenuItem.Checked )
-				tabControl.TabPages.Add( notRunTab );
-			
-			displayController.UpdatePages();
-
-			tabControl.SelectedIndex = settings.GetSetting( "Gui.ResultTabs.SelectedTab", 0 );
-
-			updating = false;
-		}
-
-		private void UserSettings_Changed( object sender, SettingsEventArgs e )
-		{
-			if( e.SettingName.StartsWith( "Gui.ResultTabs.Display" ) ||
-				e.SettingName == "Gui.TextOutput.TabList" || 
-				e.SettingName.StartsWith( "Gui.TextOut" ) && e.SettingName.EndsWith( "Enabled" ) )
-					UpdateTabPages();
-		}
-
-		private void errorsTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayErrorsTab", errorsTabMenuItem.Checked = !errorsTabMenuItem.Checked );
-		}
-
-		private void notRunTabMenuItem_Click(object sender, System.EventArgs e)
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayNotRunTab", notRunTabMenuItem.Checked = !notRunTabMenuItem.Checked );
-		}
-
-		private void textOutputMenuItem_Click(object sender, System.EventArgs e)
-		{
-			SimpleSettingsDialog.Display( this.FindForm(), new TextOutputSettingsPage("Text Output") );
-		}
-
-		private void tabControl_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			if ( !updating )
-			{
-				int index = tabControl.SelectedIndex;
-				if ( index >=0 && index < tabControl.TabCount )
-					settings.SaveSetting( "Gui.ResultTabs.SelectedTab", index );
-			}
-		}
-
-		#region TestObserver Members
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestLoaded += new TestEventHandler(OnTestLoaded);
-			events.TestUnloaded += new TestEventHandler(OnTestUnloaded);
-			events.TestReloaded += new TestEventHandler(OnTestReloaded);
-			events.RunStarting += new TestEventHandler(OnRunStarting);
-		}
-
-		private void OnRunStarting(object sender, TestEventArgs args)
-		{
-			this.Clear();
-		}
-
-		private void OnTestLoaded(object sender, TestEventArgs args)
-		{
-			this.Clear();
-		}
-
-		private void OnTestUnloaded(object sender, TestEventArgs args)
-		{
-			this.Clear();
-		}
-		private void OnTestReloaded(object sender, TestEventArgs args)
-		{
-			if ( settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
-				this.Clear();
-		}
-		#endregion
-
-		private void tabControl_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
-		{
-			bool selected = e.Index == tabControl.SelectedIndex;
-
-			Font font = selected ? new Font( e.Font, FontStyle.Bold ) : e.Font;
-			Brush backBrush = new SolidBrush( selected ? SystemColors.Control : SystemColors.Window );
-			Brush foreBrush = new SolidBrush( SystemColors.ControlText );
-
-			e.Graphics.FillRectangle( backBrush, e.Bounds );
-			Rectangle r = e.Bounds;
-			r.Y += 3; r.Height -= 3;
-			StringFormat sf = new StringFormat();
-			sf.Alignment = StringAlignment.Center;
-			e.Graphics.DrawString( tabControl.TabPages[e.Index].Text, font, foreBrush, r, sf );
-
-			foreBrush.Dispose();
-			backBrush.Dispose();
-			if ( selected )
-				font.Dispose();
-		}
-
-        protected override void OnFontChanged(EventArgs e)
-        {
-            base.OnFontChanged(e);
-
-            tabControl.ItemSize = new Size(tabControl.ItemSize.Width, this.Font.Height + 7);
-        }
-
-		private class TextDisplayController : TestObserver
-		{
-			private TabControl tabControl;
-			List<TextDisplayTabPage> tabPages = new List<TextDisplayTabPage>();
-
-			public TextDisplayController(TabControl tabControl)
-			{			
-				this.tabControl = tabControl;
-				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
-			}
-
-            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();
-			}
-
-			public void UpdatePages()
-			{
-				TextDisplayTabSettings tabSettings = new TextDisplayTabSettings();
-				tabSettings.LoadSettings();
-                List <TextDisplayTabPage> oldPages = tabPages;
-				tabPages = new List<TextDisplayTabPage>();
-				Font displayFont = GetFixedFont();
-
-				foreach( TextDisplayTabSettings.TabInfo tabInfo in tabSettings.Tabs )
-				{
-					if ( tabInfo.Enabled )
-					{
-						TextDisplayTabPage thePage = null;
-						foreach( TextDisplayTabPage page in oldPages )
-							if ( page.Name == tabInfo.Name )
-							{
-								thePage = page;
-								break;
-							}
-
-						if ( thePage == null )
-							thePage = new TextDisplayTabPage( tabInfo );
-
-						thePage.DisplayFont = displayFont;
-
-						tabPages.Add( thePage );
-						tabControl.TabPages.Add( thePage );
-					}
-				}
-			}
-
-			private void UserSettings_Changed(object sender, SettingsEventArgs args)
-			{
-				string settingName = args.SettingName; 
-				string prefix = "Gui.TextOutput.";
-
-				if ( settingName == "Gui.FixedFont" )
-				{
-					Font displayFont = GetFixedFont();
-					foreach( TextDisplayTabPage page in tabPages )
-						page.DisplayFont = displayFont;
-				}
-				else
-				if ( settingName.StartsWith( prefix ) )
-				{
-					string fieldName = settingName.Substring( prefix.Length );
-					int dot = fieldName.IndexOf('.');
-					if ( dot > 0 )
-					{
-						string tabName = fieldName.Substring( 0, dot );
-						string propName = fieldName.Substring( dot + 1 );
-						foreach( TextDisplayTabPage page in tabPages )
-							if ( page.Name == tabName )
-							{
-								switch(propName)
-								{
-									case "Title":
-										page.Text = (string)Services.UserSettings.GetSetting( settingName );
-										break;
-                                    case "Content":
-                                        page.Display.Content.LoadSettings(tabName);
-                                        break;
-                                }
-							}
-					}
-				}
-			}
-
-			private static Font GetFixedFont()
-			{
-				ISettings settings = Services.UserSettings;
-
-				return settings == null 
-                    ? new Font(FontFamily.GenericMonospace, 8.0f) 
-                    : settings.GetSetting("Gui.FixedFont", new Font(FontFamily.GenericMonospace, 8.0f));
-			}
-
-			#region TestObserver Members
-			public void Subscribe(ITestEvents events)
-			{
-				foreach( TextDisplayTabPage page in tabPages )
-					page.Display.Subscribe(events);
-			}
-			#endregion
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using NUnit.Util;
+using NUnit.Core;
+using CP.Windows.Forms;
+using System.Diagnostics;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for ResultTabs.
+	/// </summary>
+	public class ResultTabs : System.Windows.Forms.UserControl, TestObserver
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(ResultTabs));
+
+		private ISettings settings;
+		private bool updating = false;
+		private TextDisplayController displayController;
+
+		private MenuItem tabsMenu;
+		private MenuItem errorsTabMenuItem;
+		private MenuItem notRunTabMenuItem;
+		private MenuItem menuSeparator;
+		private MenuItem textOutputMenuItem;
+
+		private System.Windows.Forms.TabPage errorTab;
+		private NUnit.UiKit.ErrorDisplay errorDisplay;
+		private System.Windows.Forms.TabPage notRunTab;
+		private NUnit.UiKit.NotRunTree notRunTree;
+		private System.Windows.Forms.TabControl tabControl;
+		private System.Windows.Forms.MenuItem copyDetailMenuItem;
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public ResultTabs()
+		{
+			// This call is required by the Windows.Forms Form Designer.
+			InitializeComponent();
+
+			this.tabsMenu = new MenuItem();
+			this.errorsTabMenuItem = new System.Windows.Forms.MenuItem();
+			this.notRunTabMenuItem = new System.Windows.Forms.MenuItem();
+			this.menuSeparator = new System.Windows.Forms.MenuItem();
+			this.textOutputMenuItem = new System.Windows.Forms.MenuItem();
+
+			this.tabsMenu.MergeType = MenuMerge.Add;
+			this.tabsMenu.MergeOrder = 1;
+			this.tabsMenu.MenuItems.AddRange(
+				new System.Windows.Forms.MenuItem[] 
+				{
+					this.errorsTabMenuItem,
+					this.notRunTabMenuItem,
+					this.menuSeparator,
+					this.textOutputMenuItem,
+				} );
+			this.tabsMenu.Text = "&Result Tabs";
+			this.tabsMenu.Visible = true;
+
+			this.errorsTabMenuItem.Index = 0;
+			this.errorsTabMenuItem.Text = "&Errors && Failures";
+			this.errorsTabMenuItem.Click += new System.EventHandler(this.errorsTabMenuItem_Click);
+
+			this.notRunTabMenuItem.Index = 1;
+			this.notRunTabMenuItem.Text = "Tests &Not Run";
+			this.notRunTabMenuItem.Click += new System.EventHandler(this.notRunTabMenuItem_Click);
+
+			this.menuSeparator.Index = 2;
+			this.menuSeparator.Text = "-";
+			
+			this.textOutputMenuItem.Index = 3;
+			this.textOutputMenuItem.Text = "Text &Output...";
+			this.textOutputMenuItem.Click += new EventHandler(textOutputMenuItem_Click);
+
+			displayController = new TextDisplayController(tabControl);
+//			displayController.CreatePages();
+		}
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Component Designer generated code
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.tabControl = new System.Windows.Forms.TabControl();
+			this.errorTab = new System.Windows.Forms.TabPage();
+			this.errorDisplay = new NUnit.UiKit.ErrorDisplay();
+			this.notRunTab = new System.Windows.Forms.TabPage();
+			this.notRunTree = new NUnit.UiKit.NotRunTree();
+			this.copyDetailMenuItem = new System.Windows.Forms.MenuItem();
+			this.tabControl.SuspendLayout();
+			this.errorTab.SuspendLayout();
+			this.notRunTab.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// tabControl
+			// 
+			this.tabControl.Alignment = System.Windows.Forms.TabAlignment.Bottom;
+			this.tabControl.Controls.Add(this.errorTab);
+			this.tabControl.Controls.Add(this.notRunTab);
+			this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.tabControl.Location = new System.Drawing.Point(0, 0);
+			this.tabControl.Name = "tabControl";
+			this.tabControl.SelectedIndex = 0;
+			this.tabControl.Size = new System.Drawing.Size(488, 280);
+			this.tabControl.TabIndex = 3;
+			this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
+			// 
+			// errorTab
+			// 
+			this.errorTab.Controls.Add(this.errorDisplay);
+			this.errorTab.ForeColor = System.Drawing.SystemColors.ControlText;
+			this.errorTab.Location = new System.Drawing.Point(4, 4);
+			this.errorTab.Name = "errorTab";
+			this.errorTab.Size = new System.Drawing.Size(480, 254);
+			this.errorTab.TabIndex = 0;
+			this.errorTab.Text = "Errors and Failures";
+			// 
+			// errorDisplay
+			// 
+			this.errorDisplay.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.errorDisplay.Location = new System.Drawing.Point(0, 0);
+			this.errorDisplay.Name = "errorDisplay";
+			this.errorDisplay.Size = new System.Drawing.Size(480, 254);
+			this.errorDisplay.TabIndex = 0;
+			// 
+			// notRunTab
+			// 
+			this.notRunTab.Controls.Add(this.notRunTree);
+			this.notRunTab.ForeColor = System.Drawing.SystemColors.ControlText;
+			this.notRunTab.Location = new System.Drawing.Point(4, 4);
+			this.notRunTab.Name = "notRunTab";
+			this.notRunTab.Size = new System.Drawing.Size(480, 254);
+			this.notRunTab.TabIndex = 1;
+			this.notRunTab.Text = "Tests Not Run";
+			this.notRunTab.Visible = false;
+			// 
+			// notRunTree
+			// 
+			this.notRunTree.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.notRunTree.ImageIndex = -1;
+			this.notRunTree.Indent = 19;
+			this.notRunTree.Location = new System.Drawing.Point(0, 0);
+			this.notRunTree.Name = "notRunTree";
+			this.notRunTree.SelectedImageIndex = -1;
+			this.notRunTree.Size = new System.Drawing.Size(480, 254);
+			this.notRunTree.TabIndex = 0;
+			// 
+			// copyDetailMenuItem
+			// 
+			this.copyDetailMenuItem.Index = -1;
+			this.copyDetailMenuItem.Text = "Copy";
+			// 
+			// ResultTabs
+			// 
+			this.Controls.Add(this.tabControl);
+			this.Name = "ResultTabs";
+			this.Size = new System.Drawing.Size(488, 280);
+			this.tabControl.ResumeLayout(false);
+			this.errorTab.ResumeLayout(false);
+			this.notRunTab.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        public bool IsTracingEnabled
+        {
+            get { return displayController.IsTracingEnabled; }
+        }
+
+        public LoggingThreshold MaximumLogLevel
+        {
+            get { return displayController.MaximumLogLevel; }
+        }
+	
+		public void Clear()
+		{
+			errorDisplay.Clear();
+			notRunTree.Nodes.Clear();
+			displayController.Clear();
+		}
+
+		public MenuItem TabsMenu
+		{
+			get { return tabsMenu; }
+		}
+
+		protected override void OnLoad(EventArgs e)
+		{
+			if ( !this.DesignMode )
+			{
+				this.settings = Services.UserSettings;
+				TextDisplayTabSettings tabSettings = new TextDisplayTabSettings();
+				tabSettings.LoadSettings( settings );
+
+				UpdateTabPages();
+
+				Subscribe( Services.TestLoader.Events );
+				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
+
+				ITestEvents events = Services.TestLoader.Events;
+				errorDisplay.Subscribe( events );
+				notRunTree.Subscribe( events );
+			}
+
+			base.OnLoad (e);
+		}
+
+		private void UpdateTabPages()
+		{
+			errorsTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
+			notRunTabMenuItem.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
+
+			log.Debug( "Updating tab pages" );
+			updating = true;
+			
+			tabControl.TabPages.Clear();
+
+			if ( errorsTabMenuItem.Checked )
+				tabControl.TabPages.Add( errorTab );
+			if ( notRunTabMenuItem.Checked )
+				tabControl.TabPages.Add( notRunTab );
+			
+			displayController.UpdatePages();
+
+			tabControl.SelectedIndex = settings.GetSetting( "Gui.ResultTabs.SelectedTab", 0 );
+
+			updating = false;
+		}
+
+		private void UserSettings_Changed( object sender, SettingsEventArgs e )
+		{
+			if( e.SettingName.StartsWith( "Gui.ResultTabs.Display" ) ||
+				e.SettingName == "Gui.TextOutput.TabList" || 
+				e.SettingName.StartsWith( "Gui.TextOut" ) && e.SettingName.EndsWith( "Enabled" ) )
+					UpdateTabPages();
+		}
+
+		private void errorsTabMenuItem_Click(object sender, System.EventArgs e)
+		{
+			settings.SaveSetting( "Gui.ResultTabs.DisplayErrorsTab", errorsTabMenuItem.Checked = !errorsTabMenuItem.Checked );
+		}
+
+		private void notRunTabMenuItem_Click(object sender, System.EventArgs e)
+		{
+			settings.SaveSetting( "Gui.ResultTabs.DisplayNotRunTab", notRunTabMenuItem.Checked = !notRunTabMenuItem.Checked );
+		}
+
+		private void textOutputMenuItem_Click(object sender, System.EventArgs e)
+		{
+			SimpleSettingsDialog.Display( this.FindForm(), new TextOutputSettingsPage("Text Output") );
+		}
+
+		private void tabControl_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			if ( !updating )
+			{
+				int index = tabControl.SelectedIndex;
+				if ( index >=0 && index < tabControl.TabCount )
+					settings.SaveSetting( "Gui.ResultTabs.SelectedTab", index );
+			}
+		}
+
+		#region TestObserver Members
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestLoaded += new TestEventHandler(OnTestLoaded);
+			events.TestUnloaded += new TestEventHandler(OnTestUnloaded);
+			events.TestReloaded += new TestEventHandler(OnTestReloaded);
+			events.RunStarting += new TestEventHandler(OnRunStarting);
+		}
+
+		private void OnRunStarting(object sender, TestEventArgs args)
+		{
+			this.Clear();
+		}
+
+		private void OnTestLoaded(object sender, TestEventArgs args)
+		{
+			this.Clear();
+		}
+
+		private void OnTestUnloaded(object sender, TestEventArgs args)
+		{
+			this.Clear();
+		}
+		private void OnTestReloaded(object sender, TestEventArgs args)
+		{
+			if ( settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", false ) )
+				this.Clear();
+		}
+		#endregion
+
+		private void tabControl_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
+		{
+			bool selected = e.Index == tabControl.SelectedIndex;
+
+			Font font = selected ? new Font( e.Font, FontStyle.Bold ) : e.Font;
+			Brush backBrush = new SolidBrush( selected ? SystemColors.Control : SystemColors.Window );
+			Brush foreBrush = new SolidBrush( SystemColors.ControlText );
+
+			e.Graphics.FillRectangle( backBrush, e.Bounds );
+			Rectangle r = e.Bounds;
+			r.Y += 3; r.Height -= 3;
+			StringFormat sf = new StringFormat();
+			sf.Alignment = StringAlignment.Center;
+			e.Graphics.DrawString( tabControl.TabPages[e.Index].Text, font, foreBrush, r, sf );
+
+			foreBrush.Dispose();
+			backBrush.Dispose();
+			if ( selected )
+				font.Dispose();
+		}
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            base.OnFontChanged(e);
+
+            tabControl.ItemSize = new Size(tabControl.ItemSize.Width, this.Font.Height + 7);
+        }
+
+		private class TextDisplayController
+		{
+			private TabControl tabControl;
+			List<TextDisplayTabPage> tabPages = new List<TextDisplayTabPage>();
+
+			public TextDisplayController(TabControl tabControl)
+			{			
+				this.tabControl = tabControl;
+				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
+			}
+
+            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();
+			}
+
+			public void UpdatePages()
+			{
+				TextDisplayTabSettings tabSettings = new TextDisplayTabSettings();
+				tabSettings.LoadSettings();
+                List <TextDisplayTabPage> oldPages = tabPages;
+				tabPages = new List<TextDisplayTabPage>();
+				Font displayFont = GetFixedFont();
+
+				foreach( TextDisplayTabSettings.TabInfo tabInfo in tabSettings.Tabs )
+				{
+					if ( tabInfo.Enabled )
+					{
+						TextDisplayTabPage thePage = null;
+						foreach( TextDisplayTabPage page in oldPages )
+							if ( page.Name == tabInfo.Name )
+							{
+								thePage = page;
+								break;
+							}
+
+						if ( thePage == null )
+						{
+							thePage = new TextDisplayTabPage( tabInfo );
+							thePage.Display.Subscribe(Services.TestLoader.Events);
+						}
+
+						thePage.DisplayFont = displayFont;
+
+						tabPages.Add( thePage );
+						tabControl.TabPages.Add( thePage );
+					}
+				}
+			}
+
+			private void UserSettings_Changed(object sender, SettingsEventArgs args)
+			{
+				string settingName = args.SettingName; 
+				string prefix = "Gui.TextOutput.";
+
+				if ( settingName == "Gui.FixedFont" )
+				{
+					Font displayFont = GetFixedFont();
+					foreach( TextDisplayTabPage page in tabPages )
+						page.DisplayFont = displayFont;
+				}
+				else
+				if ( settingName.StartsWith( prefix ) )
+				{
+					string fieldName = settingName.Substring( prefix.Length );
+					int dot = fieldName.IndexOf('.');
+					if ( dot > 0 )
+					{
+						string tabName = fieldName.Substring( 0, dot );
+						string propName = fieldName.Substring( dot + 1 );
+						foreach( TextDisplayTabPage page in tabPages )
+							if ( page.Name == tabName )
+							{
+								switch(propName)
+								{
+									case "Title":
+										page.Text = (string)Services.UserSettings.GetSetting( settingName );
+										break;
+                                    case "Content":
+                                        page.Display.Content.LoadSettings(tabName);
+                                        break;
+                                }
+							}
+					}
+				}
+			}
+
+			private static Font GetFixedFont()
+			{
+				ISettings settings = Services.UserSettings;
+
+				return settings == null 
+                    ? new Font(FontFamily.GenericMonospace, 8.0f) 
+                    : settings.GetSetting("Gui.FixedFont", new Font(FontFamily.GenericMonospace, 8.0f));
+			}
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/ResultTabs.resx b/src/GuiComponents/UiKit/ResultTabs.resx
index 26f39b3..c339ef7 100644
--- a/src/GuiComponents/UiKit/ResultTabs.resx
+++ b/src/GuiComponents/UiKit/ResultTabs.resx
@@ -1,208 +1,208 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="tabControl.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabControl.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="errorTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="errorTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="errorTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="errorTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="errorDisplay.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="errorDisplay.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="errorDisplay.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="notRunTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="notRunTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="notRunTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="notRunTree.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTree.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="notRunTree.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="copyDetailMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="copyDetailMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>ResultTabs</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="tabControl.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabControl.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabControl.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabControl.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabControl.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabControl.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="errorTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="errorTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="errorTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="errorTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="errorTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="errorTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="errorDisplay.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="errorDisplay.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="errorDisplay.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="notRunTab.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="notRunTab.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="notRunTab.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="notRunTab.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="notRunTab.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="notRunTab.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="notRunTree.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="notRunTree.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="notRunTree.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="copyDetailMenuItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="copyDetailMenuItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>ResultTabs</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs b/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs
index a7f19d5..ed150a0 100644
--- a/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs
+++ b/src/GuiComponents/UiKit/ScrollingTextDisplayForm.cs
@@ -1,147 +1,147 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Text;
-using System.IO;
-using System.Collections;
-using System.Reflection;
-using System.Windows.Forms;
-using System.Drawing;
-using NUnit.Util;
-using NUnit.Core;
-
-namespace NUnit.UiKit
-{
-    public class ScrollingTextDisplayForm : Form
-    {
-		private System.Windows.Forms.Button okButton;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-		private System.Windows.Forms.RichTextBox textBox;
-        private System.Windows.Forms.Label message;
-
-		public ScrollingTextDisplayForm()
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Windows Form Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.okButton = new System.Windows.Forms.Button();
-			this.textBox = new System.Windows.Forms.RichTextBox();
-            this.message = new System.Windows.Forms.Label();
-			this.SuspendLayout();
-			// 
-			// okButton
-			// 
-			this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
-			this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-            this.okButton.Location = new System.Drawing.Point(284, 441);
-            this.okButton.Name = "okButton";
-			this.okButton.Size = new System.Drawing.Size(90, 27);
-			this.okButton.TabIndex = 1;
-			this.okButton.Text = "Close";
-			// 
-			// textBox
-			// 
-			this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.textBox.Location = new System.Drawing.Point(10, 65);
-			this.textBox.Name = "textBox";
-			this.textBox.ReadOnly = true;
-            this.textBox.Size = new System.Drawing.Size(640, 362);
-            this.textBox.TabIndex = 3;
-			this.textBox.Text = "";
-			// 
-			// message
-			// 
-            this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-                | System.Windows.Forms.AnchorStyles.Right)));
-            this.message.Location = new System.Drawing.Point(19, 9);
-            this.message.Name = "message";
-            this.message.Size = new System.Drawing.Size(631, 46);
-            this.message.TabIndex = 2;
-            this.message.Text = "";
-            // 
-			// TestAssemblyInfoForm
-			// 
-            this.ClientSize = new System.Drawing.Size(669, 480);
-            this.Controls.Add(this.textBox);
-            this.Controls.Add(this.message);
-			this.Controls.Add(this.okButton);
-			this.Name = "ScrollingTextDisplayForm";
-			this.Text = "NUnit";
-			this.Resize += new System.EventHandler(this.ScrollingTextDisplayForm_Resize);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-        protected RichTextBox TextBox
-        {
-            get { return textBox; }
-        }
-
-        protected Label Message
-        {
-            get { return message; }
-        }
-
-        protected override void OnLoad(EventArgs e)
-        {
-            base.OnLoad(e);
-
-            SetMessageLabelSize();
-        }
-
-        private void ScrollingTextDisplayForm_Resize(object sender, System.EventArgs e)
-        {
-            SetMessageLabelSize();
-        }
-
-        private void SetMessageLabelSize()
-        {
-            Rectangle rect = message.ClientRectangle;
-            Graphics g = Graphics.FromHwnd(Handle);
-            SizeF sizeNeeded = g.MeasureString(message.Text, message.Font, rect.Width);
-            int delta = sizeNeeded.ToSize().Height - rect.Height;
-
-            message.Height += delta;
-            textBox.Top += delta;
-            textBox.Height -= delta;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Text;
+using System.IO;
+using System.Collections;
+using System.Reflection;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.Util;
+using NUnit.Core;
+
+namespace NUnit.UiKit
+{
+    public class ScrollingTextDisplayForm : Form
+    {
+		private System.Windows.Forms.Button okButton;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+		private System.Windows.Forms.RichTextBox textBox;
+        private System.Windows.Forms.Label message;
+
+		public ScrollingTextDisplayForm()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.okButton = new System.Windows.Forms.Button();
+			this.textBox = new System.Windows.Forms.RichTextBox();
+            this.message = new System.Windows.Forms.Label();
+			this.SuspendLayout();
+			// 
+			// okButton
+			// 
+			this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+			this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.okButton.Location = new System.Drawing.Point(284, 441);
+            this.okButton.Name = "okButton";
+			this.okButton.Size = new System.Drawing.Size(90, 27);
+			this.okButton.TabIndex = 1;
+			this.okButton.Text = "Close";
+			// 
+			// textBox
+			// 
+			this.textBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+				| System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.textBox.Location = new System.Drawing.Point(10, 65);
+			this.textBox.Name = "textBox";
+			this.textBox.ReadOnly = true;
+            this.textBox.Size = new System.Drawing.Size(640, 362);
+            this.textBox.TabIndex = 3;
+			this.textBox.Text = "";
+			// 
+			// message
+			// 
+            this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+                | System.Windows.Forms.AnchorStyles.Right)));
+            this.message.Location = new System.Drawing.Point(19, 9);
+            this.message.Name = "message";
+            this.message.Size = new System.Drawing.Size(631, 46);
+            this.message.TabIndex = 2;
+            this.message.Text = "";
+            // 
+			// TestAssemblyInfoForm
+			// 
+            this.ClientSize = new System.Drawing.Size(669, 480);
+            this.Controls.Add(this.textBox);
+            this.Controls.Add(this.message);
+			this.Controls.Add(this.okButton);
+			this.Name = "ScrollingTextDisplayForm";
+			this.Text = "NUnit";
+			this.Resize += new System.EventHandler(this.ScrollingTextDisplayForm_Resize);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        protected RichTextBox TextBox
+        {
+            get { return textBox; }
+        }
+
+        protected Label Message
+        {
+            get { return message; }
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            base.OnLoad(e);
+
+            SetMessageLabelSize();
+        }
+
+        private void ScrollingTextDisplayForm_Resize(object sender, System.EventArgs e)
+        {
+            SetMessageLabelSize();
+        }
+
+        private void SetMessageLabelSize()
+        {
+            Rectangle rect = message.ClientRectangle;
+            Graphics g = Graphics.FromHwnd(Handle);
+            SizeF sizeNeeded = g.MeasureString(message.Text, message.Font, rect.Width);
+            int delta = sizeNeeded.ToSize().Height - rect.Height;
+
+            message.Height += delta;
+            textBox.Top += delta;
+            textBox.Height -= delta;
+        }
+    }
+}
diff --git a/src/GuiComponents/UiKit/SettingsDialogBase.cs b/src/GuiComponents/UiKit/SettingsDialogBase.cs
index b80da3b..4bcff57 100644
--- a/src/GuiComponents/UiKit/SettingsDialogBase.cs
+++ b/src/GuiComponents/UiKit/SettingsDialogBase.cs
@@ -1,205 +1,205 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for OptionsDialogBase.
-	/// </summary>
-    public class SettingsDialogBase : NUnitFormBase
-	{
-		#region Instance Fields
-		protected System.Windows.Forms.Button cancelButton;
-		protected System.Windows.Forms.Button okButton;
-
-		private SettingsPageCollection pageList;
-
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		private bool reloadProjectOnClose;
-		#endregion
-
-		#region Construction and Disposal
-		public SettingsDialogBase()
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			pageList = new SettingsPageCollection( );
-		}
-
-		/// <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.cancelButton = new System.Windows.Forms.Button();
-			this.okButton = new System.Windows.Forms.Button();
-			this.SuspendLayout();
-			// 
-			// cancelButton
-			// 
-			this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-			this.cancelButton.CausesValidation = false;
-			this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.cancelButton.Location = new System.Drawing.Point(256, 424);
-			this.cancelButton.Name = "cancelButton";
-			this.cancelButton.Size = new System.Drawing.Size(72, 24);
-			this.cancelButton.TabIndex = 18;
-			this.cancelButton.Text = "Cancel";
-			// 
-			// okButton
-			// 
-			this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-			this.okButton.Location = new System.Drawing.Point(168, 424);
-			this.okButton.Name = "okButton";
-			this.okButton.Size = new System.Drawing.Size(72, 24);
-			this.okButton.TabIndex = 17;
-			this.okButton.Text = "OK";
-			this.okButton.Click += new System.EventHandler(this.okButton_Click);
-			// 
-			// SettingsDialogBase
-			// 
-			this.ClientSize = new System.Drawing.Size(336, 458);
-			this.Controls.Add(this.cancelButton);
-			this.Controls.Add(this.okButton);
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
-			this.HelpButton = true;
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.Name = "SettingsDialogBase";
-			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-			this.Text = "Settings";
-			this.Closed += new System.EventHandler(this.SettingsDialogBase_Closed);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		#region Properties
-
-		public SettingsPageCollection SettingsPages
-		{
-			get { return pageList; }
-		}
-
-		#endregion
-
-		#region Public Methods
-		public void ApplySettings()
-		{
-			foreach( SettingsPage page in pageList )
-				if ( page.SettingsLoaded )
-					page.ApplySettings();
-		}
-		#endregion
-
-		#region Event Handlers
-		private void SettingsDialogBase_Closed(object sender, System.EventArgs e)
-		{
-			if (this.reloadProjectOnClose)
-				Services.TestLoader.ReloadTest();
-		}
-
-		private void okButton_Click(object sender, System.EventArgs e)
-		{
-			if ( Services.TestLoader.IsTestLoaded && this.HasChangesRequiringReload )
-			{
-                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;
-			}
-
-			ApplySettings();
-
-			DialogResult = DialogResult.OK;
-
-			Close();
-		}
-		#endregion
-
-		#region Helper Methods
-		private bool HasChangesRequiringReload
-		{
-			get
-			{
-				foreach( SettingsPage page in pageList )
-					if ( page.SettingsLoaded && page.HasChangesRequiringReload )
-						return true;
-
-				return false;
-			}
-		}
-		#endregion
-
-		#region Nested SettingsPageCollection Class
-		public class SettingsPageCollection : CollectionBase
-		{
-			public void Add( SettingsPage page )
-			{
-				this.InnerList.Add( page );
-			}
-
-			public void AddRange( params SettingsPage[] pages )
-			{
-				this.InnerList.AddRange( pages );
-			}
-
-			public SettingsPage this[int index]
-			{
-				get { return (SettingsPage)InnerList[index]; }
-			}
-
-			public SettingsPage this[string key]
-			{
-				get
-				{
-					foreach( SettingsPage page in InnerList )
-						if ( page.Key == key )
-							return page;
-
-					return null;
-				}
-			}
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for OptionsDialogBase.
+	/// </summary>
+    public class SettingsDialogBase : NUnitFormBase
+	{
+		#region Instance Fields
+		protected System.Windows.Forms.Button cancelButton;
+		protected System.Windows.Forms.Button okButton;
+
+		private SettingsPageCollection pageList;
+
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		private bool reloadProjectOnClose;
+		#endregion
+
+		#region Construction and Disposal
+		public SettingsDialogBase()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			pageList = new SettingsPageCollection( );
+		}
+
+		/// <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.cancelButton = new System.Windows.Forms.Button();
+			this.okButton = new System.Windows.Forms.Button();
+			this.SuspendLayout();
+			// 
+			// cancelButton
+			// 
+			this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.cancelButton.CausesValidation = false;
+			this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cancelButton.Location = new System.Drawing.Point(256, 424);
+			this.cancelButton.Name = "cancelButton";
+			this.cancelButton.Size = new System.Drawing.Size(72, 24);
+			this.cancelButton.TabIndex = 18;
+			this.cancelButton.Text = "Cancel";
+			// 
+			// okButton
+			// 
+			this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.okButton.Location = new System.Drawing.Point(168, 424);
+			this.okButton.Name = "okButton";
+			this.okButton.Size = new System.Drawing.Size(72, 24);
+			this.okButton.TabIndex = 17;
+			this.okButton.Text = "OK";
+			this.okButton.Click += new System.EventHandler(this.okButton_Click);
+			// 
+			// SettingsDialogBase
+			// 
+			this.ClientSize = new System.Drawing.Size(336, 458);
+			this.Controls.Add(this.cancelButton);
+			this.Controls.Add(this.okButton);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.HelpButton = true;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "SettingsDialogBase";
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Settings";
+			this.Closed += new System.EventHandler(this.SettingsDialogBase_Closed);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Properties
+
+		public SettingsPageCollection SettingsPages
+		{
+			get { return pageList; }
+		}
+
+		#endregion
+
+		#region Public Methods
+		public void ApplySettings()
+		{
+			foreach( SettingsPage page in pageList )
+				if ( page.SettingsLoaded )
+					page.ApplySettings();
+		}
+		#endregion
+
+		#region Event Handlers
+		private void SettingsDialogBase_Closed(object sender, System.EventArgs e)
+		{
+			if (this.reloadProjectOnClose)
+				Services.TestLoader.ReloadTest();
+		}
+
+		private void okButton_Click(object sender, System.EventArgs e)
+		{
+			if ( Services.TestLoader.IsTestLoaded && this.HasChangesRequiringReload )
+			{
+                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;
+			}
+
+			ApplySettings();
+
+			DialogResult = DialogResult.OK;
+
+			Close();
+		}
+		#endregion
+
+		#region Helper Methods
+		private bool HasChangesRequiringReload
+		{
+			get
+			{
+				foreach( SettingsPage page in pageList )
+					if ( page.SettingsLoaded && page.HasChangesRequiringReload )
+						return true;
+
+				return false;
+			}
+		}
+		#endregion
+
+		#region Nested SettingsPageCollection Class
+		public class SettingsPageCollection : CollectionBase
+		{
+			public void Add( SettingsPage page )
+			{
+				this.InnerList.Add( page );
+			}
+
+			public void AddRange( params SettingsPage[] pages )
+			{
+				this.InnerList.AddRange( pages );
+			}
+
+			public SettingsPage this[int index]
+			{
+				get { return (SettingsPage)InnerList[index]; }
+			}
+
+			public SettingsPage this[string key]
+			{
+				get
+				{
+					foreach( SettingsPage page in InnerList )
+						if ( page.Key == key )
+							return page;
+
+					return null;
+				}
+			}
+		}
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/SettingsDialogBase.resx b/src/GuiComponents/UiKit/SettingsDialogBase.resx
index 8e04681..d8d76ca 100644
--- a/src/GuiComponents/UiKit/SettingsDialogBase.resx
+++ b/src/GuiComponents/UiKit/SettingsDialogBase.resx
@@ -1,170 +1,170 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>SettingsDialogBase</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
-        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>SettingsDialogBase</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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/GuiComponents/UiKit/SettingsPage.cs b/src/GuiComponents/UiKit/SettingsPage.cs
index 313759f..811ad97 100644
--- a/src/GuiComponents/UiKit/SettingsPage.cs
+++ b/src/GuiComponents/UiKit/SettingsPage.cs
@@ -1,138 +1,138 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// NUnitSettingsPage is the base class for all pages used
-	/// in a tabbed or tree-structured SettingsDialog.
-	/// </summary>
-	public class SettingsPage : System.Windows.Forms.UserControl
-	{
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		/// <summary>
-		/// Settings are available to derived classes
-		/// </summary>
-		protected ISettings settings;
-
-		private string key;
-		private string title;
-
-        private MessageDisplay messageDisplay;
-
-		// Constructor used by the Windows.Forms Designer
-		public SettingsPage()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		// Constructor we use in creating page for a Tabbed
-		// or TreeBased dialog.
-		public SettingsPage( string key) : this()
-		{
-			this.key = key;
-			this.title = key;
-			int dot = key.LastIndexOf( '.' );
-			if ( dot >= 0 ) title = key.Substring(dot+1);
-            this.messageDisplay = new MessageDisplay("NUnit Settings");
-		}
-
-		/// <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 Properties
-
-		public string Key
-		{
-			get { return key; }
-		}
-
-		public string Title
-		{
-			get { return title; }
-		}
-
-		public bool SettingsLoaded
-		{
-			get { return settings != null; }
-		}
-
-		public virtual bool HasChangesRequiringReload
-		{
-			get { return false; }
-		}
-
-        public IMessageDisplay MessageDisplay
-        {
-            get { return messageDisplay; }
-        }
-
-		#endregion
-
-		#region Public Methods
-		public virtual void LoadSettings()
-		{
-		}
-
-		public virtual void ApplySettings()
-		{
-		}
-		#endregion
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			// 
-			// SettingsPage
-			// 
-			this.Name = "SettingsPage";
-			this.Size = new System.Drawing.Size(456, 336);
-
-		}
-		#endregion
-
-		protected override void OnLoad(EventArgs e)
-		{
-			base.OnLoad (e);
-
-			if ( !DesignMode )
-			{
-				this.settings = Services.UserSettings;
-				this.LoadSettings();
-			}
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// NUnitSettingsPage is the base class for all pages used
+	/// in a tabbed or tree-structured SettingsDialog.
+	/// </summary>
+	public class SettingsPage : System.Windows.Forms.UserControl
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		/// <summary>
+		/// Settings are available to derived classes
+		/// </summary>
+		protected ISettings settings;
+
+		private string key;
+		private string title;
+
+        private MessageDisplay messageDisplay;
+
+		// Constructor used by the Windows.Forms Designer
+		public SettingsPage()
+		{
+			// This call is required by the Windows.Forms Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		// Constructor we use in creating page for a Tabbed
+		// or TreeBased dialog.
+		public SettingsPage( string key) : this()
+		{
+			this.key = key;
+			this.title = key;
+			int dot = key.LastIndexOf( '.' );
+			if ( dot >= 0 ) title = key.Substring(dot+1);
+            this.messageDisplay = new MessageDisplay("NUnit Settings");
+		}
+
+		/// <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 Properties
+
+		public string Key
+		{
+			get { return key; }
+		}
+
+		public string Title
+		{
+			get { return title; }
+		}
+
+		public bool SettingsLoaded
+		{
+			get { return settings != null; }
+		}
+
+		public virtual bool HasChangesRequiringReload
+		{
+			get { return false; }
+		}
+
+        public IMessageDisplay MessageDisplay
+        {
+            get { return messageDisplay; }
+        }
+
+		#endregion
+
+		#region Public Methods
+		public virtual void LoadSettings()
+		{
+		}
+
+		public virtual void ApplySettings()
+		{
+		}
+		#endregion
+
+		#region Component Designer generated code
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			// 
+			// SettingsPage
+			// 
+			this.Name = "SettingsPage";
+			this.Size = new System.Drawing.Size(456, 336);
+
+		}
+		#endregion
+
+		protected override void OnLoad(EventArgs e)
+		{
+			base.OnLoad (e);
+
+			if ( !DesignMode )
+			{
+				this.settings = Services.UserSettings;
+				this.LoadSettings();
+			}
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/SettingsPage.resx b/src/GuiComponents/UiKit/SettingsPage.resx
index e25ab98..2747578 100644
--- a/src/GuiComponents/UiKit/SettingsPage.resx
+++ b/src/GuiComponents/UiKit/SettingsPage.resx
@@ -1,130 +1,130 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>SettingsPage</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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Name">
+    <value>SettingsPage</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/SimpleSettingsDialog.cs b/src/GuiComponents/UiKit/SimpleSettingsDialog.cs
index 5556f5b..f59dd5a 100644
--- a/src/GuiComponents/UiKit/SimpleSettingsDialog.cs
+++ b/src/GuiComponents/UiKit/SimpleSettingsDialog.cs
@@ -1,114 +1,114 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	public class SimpleSettingsDialog : NUnit.UiKit.SettingsDialogBase
-	{
-		private System.Windows.Forms.Panel panel1;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.ComponentModel.IContainer components = null;
-
-		public static void Display( Form owner, SettingsPage page )
-		{
-			using( SimpleSettingsDialog dialog = new SimpleSettingsDialog() )
-			{
-				owner.Site.Container.Add( dialog );
-				dialog.Font = owner.Font;
-				dialog.SettingsPages.Add( page ); 
-				dialog.ShowDialog();
-			}
-		}
-
-		public SimpleSettingsDialog()
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.panel1 = new System.Windows.Forms.Panel();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.SuspendLayout();
-			// 
-			// cancelButton
-			// 
-			this.cancelButton.Location = new System.Drawing.Point(410, 392);
-			this.cancelButton.Name = "cancelButton";
-			// 
-			// okButton
-			// 
-			this.okButton.Location = new System.Drawing.Point(322, 392);
-			this.okButton.Name = "okButton";
-			// 
-			// panel1
-			// 
-			this.panel1.Location = new System.Drawing.Point(16, 16);
-			this.panel1.Name = "panel1";
-			this.panel1.Size = new System.Drawing.Size(456, 336);
-			this.panel1.TabIndex = 21;
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Location = new System.Drawing.Point(16, 360);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(456, 8);
-			this.groupBox1.TabIndex = 22;
-			this.groupBox1.TabStop = false;
-			// 
-			// SimpleSettingsDialog
-			// 
-			this.ClientSize = new System.Drawing.Size(490, 426);
-			this.Controls.Add(this.panel1);
-			this.Controls.Add(this.groupBox1);
-			this.Name = "SimpleSettingsDialog";
-			this.Load += new System.EventHandler(this.SimpleSettingsDialog_Load);
-			this.Controls.SetChildIndex(this.okButton, 0);
-			this.Controls.SetChildIndex(this.cancelButton, 0);
-			this.Controls.SetChildIndex(this.groupBox1, 0);
-			this.Controls.SetChildIndex(this.panel1, 0);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void SimpleSettingsDialog_Load(object sender, System.EventArgs e)
-		{
-			SettingsPage page = this.SettingsPages[0];
-			this.panel1.Controls.Add( page );
-			this.Text = page.Title;
-		}
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	public class SimpleSettingsDialog : NUnit.UiKit.SettingsDialogBase
+	{
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.ComponentModel.IContainer components = null;
+
+		public static void Display( Form owner, SettingsPage page )
+		{
+			using( SimpleSettingsDialog dialog = new SimpleSettingsDialog() )
+			{
+				owner.Site.Container.Add( dialog );
+				dialog.Font = owner.Font;
+				dialog.SettingsPages.Add( page ); 
+				dialog.ShowDialog();
+			}
+		}
+
+		public SimpleSettingsDialog()
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.panel1 = new System.Windows.Forms.Panel();
+			this.groupBox1 = new System.Windows.Forms.GroupBox();
+			this.SuspendLayout();
+			// 
+			// cancelButton
+			// 
+			this.cancelButton.Location = new System.Drawing.Point(410, 392);
+			this.cancelButton.Name = "cancelButton";
+			// 
+			// okButton
+			// 
+			this.okButton.Location = new System.Drawing.Point(322, 392);
+			this.okButton.Name = "okButton";
+			// 
+			// panel1
+			// 
+			this.panel1.Location = new System.Drawing.Point(16, 16);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size(456, 336);
+			this.panel1.TabIndex = 21;
+			// 
+			// groupBox1
+			// 
+			this.groupBox1.Location = new System.Drawing.Point(16, 360);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size(456, 8);
+			this.groupBox1.TabIndex = 22;
+			this.groupBox1.TabStop = false;
+			// 
+			// SimpleSettingsDialog
+			// 
+			this.ClientSize = new System.Drawing.Size(490, 426);
+			this.Controls.Add(this.panel1);
+			this.Controls.Add(this.groupBox1);
+			this.Name = "SimpleSettingsDialog";
+			this.Load += new System.EventHandler(this.SimpleSettingsDialog_Load);
+			this.Controls.SetChildIndex(this.okButton, 0);
+			this.Controls.SetChildIndex(this.cancelButton, 0);
+			this.Controls.SetChildIndex(this.groupBox1, 0);
+			this.Controls.SetChildIndex(this.panel1, 0);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void SimpleSettingsDialog_Load(object sender, System.EventArgs e)
+		{
+			SettingsPage page = this.SettingsPages[0];
+			this.panel1.Controls.Add( page );
+			this.Text = page.Title;
+		}
+	}
+}
+
diff --git a/src/GuiComponents/UiKit/SimpleSettingsDialog.resx b/src/GuiComponents/UiKit/SimpleSettingsDialog.resx
index cf4f312..8b6cba6 100644
--- a/src/GuiComponents/UiKit/SimpleSettingsDialog.resx
+++ b/src/GuiComponents/UiKit/SimpleSettingsDialog.resx
@@ -1,184 +1,184 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="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="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.Name">
-    <value>SimpleSettingsDialog</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="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="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.Name">
+    <value>SimpleSettingsDialog</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/StatusBar.cs b/src/GuiComponents/UiKit/StatusBar.cs
index ba51409..f90259d 100644
--- a/src/GuiComponents/UiKit/StatusBar.cs
+++ b/src/GuiComponents/UiKit/StatusBar.cs
@@ -1,261 +1,261 @@
-// ****************************************************************
-// 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.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	public class StatusBar : System.Windows.Forms.StatusBar, TestObserver
-	{
-		private StatusBarPanel statusPanel = new StatusBarPanel();
-		private StatusBarPanel testCountPanel = new StatusBarPanel();
-		private StatusBarPanel testsRunPanel = new StatusBarPanel();
-		private StatusBarPanel errorsPanel = new StatusBarPanel();
-		private StatusBarPanel failuresPanel = new StatusBarPanel();
-		private StatusBarPanel timePanel = new StatusBarPanel();
-
-		private int testCount = 0;
-		private int testsRun = 0;
-		private int errors = 0;
-		private int failures = 0;
-		private double time = 0.0;
-
-		private bool displayProgress = false;
-
-		public bool DisplayTestProgress
-		{
-			get { return displayProgress; }
-			set { displayProgress = value; }
-		}
-
-		public StatusBar()
-		{
-			Panels.Add( statusPanel );
-			Panels.Add( testCountPanel );
-			Panels.Add( testsRunPanel );
-			Panels.Add( errorsPanel );
-			Panels.Add( failuresPanel );
-			Panels.Add( timePanel );
-
-			statusPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
-			statusPanel.BorderStyle = StatusBarPanelBorderStyle.None;
-			statusPanel.Text = "Status";
-			
-			testCountPanel.AutoSize = StatusBarPanelAutoSize.Contents;
-			testsRunPanel.AutoSize = StatusBarPanelAutoSize.Contents;
-			errorsPanel.AutoSize = StatusBarPanelAutoSize.Contents;
-			failuresPanel.AutoSize = StatusBarPanelAutoSize.Contents;
-			timePanel.AutoSize = StatusBarPanelAutoSize.Contents;
-
-			ShowPanels = true;
-			InitPanels();
-		}
-
-		// Kluge to keep VS from generating code that sets the Panels for
-		// the statusbar. Really, our status bar should be a user control
-		// to avoid this and shouldn't allow the panels to be set except
-		// according to specific protocols.
-		[System.ComponentModel.DesignerSerializationVisibility( 
-			 System.ComponentModel.DesignerSerializationVisibility.Hidden )]
-		public new System.Windows.Forms.StatusBar.StatusBarPanelCollection Panels
-		{
-			get 
-			{ 
-				return base.Panels;
-			}
-		}
-
-	
-		public override string Text
-		{
-			get { return statusPanel.Text; }
-			set { statusPanel.Text = value; }
-		}
-
-		public void Initialize( int testCount )
-		{
-			Initialize( testCount, testCount > 0 ? "Ready" : "" );
-		}
-
-		public void Initialize( int testCount, string text )
-		{
-			this.statusPanel.Text = text;
-
-			this.testCount = testCount;
-			this.testsRun = 0;
-			this.errors = 0;
-			this.failures = 0;
-			this.time = 0.0;
-
-			InitPanels();
-		}
-
-		private void InitPanels()
-		{
-			this.testCountPanel.MinWidth = 50;
-			DisplayTestCount();
-
-			this.testsRunPanel.MinWidth = 50;
-			this.testsRunPanel.Text = "";
-
-			this.errorsPanel.MinWidth = 50;
-			this.errorsPanel.Text = "";
-			
-			this.failuresPanel.MinWidth = 50;
-			this.failuresPanel.Text = "";
-			
-			this.timePanel.MinWidth = 50;
-			this.timePanel.Text = "";
-		}
-
-		private void DisplayTestCount()
-		{
-            testCountPanel.Text = "Test Cases : " + testCount.ToString();
-		}
-
-		private void DisplayTestsRun()
-		{
-            testsRunPanel.Text = "Tests Run : " + testsRun.ToString();
-		}
-
-		private void DisplayErrors()
-		{
-            errorsPanel.Text = "Errors : " + errors.ToString();
-		}
-
-		private void DisplayFailures()
-		{
-            failuresPanel.Text = "Failures : " + failures.ToString();
-		}
-
-		private void DisplayTime()
-		{
-            timePanel.Text = "Time : " + time.ToString();
-		}
-
-		private void DisplayResult(TestResult result)
-		{
-			ResultSummarizer summarizer = new ResultSummarizer(result);
-
-            //this.testCount = summarizer.ResultCount;
-            this.testsRun = summarizer.TestsRun;
-			this.errors = summarizer.Errors;
-            this.failures = summarizer.Failures;
-            this.time = summarizer.Time;
-
-            DisplayTestCount();
-            DisplayTestsRun();
-            DisplayErrors();
-            DisplayFailures();
-            DisplayTime();
-        }
-
-		public void OnTestLoaded( object sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount );
-		}
-
-		public void OnTestReloaded( object sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount, "Reloaded" );
-		}
-
-		public void OnTestUnloaded( object sender, TestEventArgs e )
-		{
-			Initialize( 0, "Unloaded" );
-		}
-
-		private void OnRunStarting( object sender, TestEventArgs e )
-		{
-			Initialize( e.TestCount, "Running :" + e.Name );
-			DisplayTestCount();
-            DisplayTestsRun();
-            DisplayErrors();
-            DisplayFailures();
-            DisplayTime();
-        }
-
-		private void OnRunFinished(object sender, TestEventArgs e )
-		{
-			if ( e.Exception != null )
-				statusPanel.Text = "Failed";
-			else
-			{
-				statusPanel.Text = "Completed";
-				DisplayResult( e.Result );
-			}
-		}
-
-		public void OnTestStarting( object sender, TestEventArgs e )
-		{
-			string fullText = "Running : " + e.TestName.FullName;
-			string shortText = "Running : " + e.TestName.Name;
-
-			Graphics g = Graphics.FromHwnd( Handle );
-			SizeF sizeNeeded = g.MeasureString( fullText, Font );
-			if ( statusPanel.Width >= (int)sizeNeeded.Width )
-			{
-				statusPanel.Text = fullText;
-				statusPanel.ToolTipText = "";
-			}
-			else
-			{
-				sizeNeeded = g.MeasureString( shortText, Font );
-				statusPanel.Text = statusPanel.Width >= (int)sizeNeeded.Width
-					? shortText : e.TestName.Name;
-				statusPanel.ToolTipText = e.TestName.FullName;
-			}
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs e )
-		{
-			if ( DisplayTestProgress && e.Result.Executed )
-			{
-				++testsRun;
-				DisplayTestsRun();
-                switch ( e.Result.ResultState )
-                {
-                    case ResultState.Error:
-                    case ResultState.Cancelled:
-    					++errors;
-	    				DisplayErrors();
-                        break;
-                    case ResultState.Failure:
-    					++failures;
-	    				DisplayFailures();
-                        break;
-				}
-			}
-		}
-
-//        protected override void OnFontChanged(EventArgs e)
-//        {
-//            base.OnFontChanged(e);
-//
-//            this.Height = (int)(this.Font.Height * 1.6);
-//        }
-
-		#region TestObserver Members
-
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
-			events.TestReloaded	+= new TestEventHandler( OnTestReloaded );
-			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
-
-			events.TestStarting	+= new TestEventHandler( OnTestStarting );
-			events.TestFinished	+= new TestEventHandler( OnTestFinished );
-			events.RunStarting	+= new TestEventHandler( OnRunStarting );
-			events.RunFinished	+= new TestEventHandler( OnRunFinished );
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	public class StatusBar : System.Windows.Forms.StatusBar, TestObserver
+	{
+		private StatusBarPanel statusPanel = new StatusBarPanel();
+		private StatusBarPanel testCountPanel = new StatusBarPanel();
+		private StatusBarPanel testsRunPanel = new StatusBarPanel();
+		private StatusBarPanel errorsPanel = new StatusBarPanel();
+		private StatusBarPanel failuresPanel = new StatusBarPanel();
+		private StatusBarPanel timePanel = new StatusBarPanel();
+
+		private int testCount = 0;
+		private int testsRun = 0;
+		private int errors = 0;
+		private int failures = 0;
+		private double time = 0.0;
+
+		private bool displayProgress = false;
+
+		public bool DisplayTestProgress
+		{
+			get { return displayProgress; }
+			set { displayProgress = value; }
+		}
+
+		public StatusBar()
+		{
+			Panels.Add( statusPanel );
+			Panels.Add( testCountPanel );
+			Panels.Add( testsRunPanel );
+			Panels.Add( errorsPanel );
+			Panels.Add( failuresPanel );
+			Panels.Add( timePanel );
+
+			statusPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
+			statusPanel.BorderStyle = StatusBarPanelBorderStyle.None;
+			statusPanel.Text = "Status";
+			
+			testCountPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			testsRunPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			errorsPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			failuresPanel.AutoSize = StatusBarPanelAutoSize.Contents;
+			timePanel.AutoSize = StatusBarPanelAutoSize.Contents;
+
+			ShowPanels = true;
+			InitPanels();
+		}
+
+		// Kluge to keep VS from generating code that sets the Panels for
+		// the statusbar. Really, our status bar should be a user control
+		// to avoid this and shouldn't allow the panels to be set except
+		// according to specific protocols.
+		[System.ComponentModel.DesignerSerializationVisibility( 
+			 System.ComponentModel.DesignerSerializationVisibility.Hidden )]
+		public new System.Windows.Forms.StatusBar.StatusBarPanelCollection Panels
+		{
+			get 
+			{ 
+				return base.Panels;
+			}
+		}
+
+	
+		public override string Text
+		{
+			get { return statusPanel.Text; }
+			set { statusPanel.Text = value; }
+		}
+
+		public void Initialize( int testCount )
+		{
+			Initialize( testCount, testCount > 0 ? "Ready" : "" );
+		}
+
+		public void Initialize( int testCount, string text )
+		{
+			this.statusPanel.Text = text;
+
+			this.testCount = testCount;
+			this.testsRun = 0;
+			this.errors = 0;
+			this.failures = 0;
+			this.time = 0.0;
+
+			InitPanels();
+		}
+
+		private void InitPanels()
+		{
+			this.testCountPanel.MinWidth = 50;
+			DisplayTestCount();
+
+			this.testsRunPanel.MinWidth = 50;
+			this.testsRunPanel.Text = "";
+
+			this.errorsPanel.MinWidth = 50;
+			this.errorsPanel.Text = "";
+			
+			this.failuresPanel.MinWidth = 50;
+			this.failuresPanel.Text = "";
+			
+			this.timePanel.MinWidth = 50;
+			this.timePanel.Text = "";
+		}
+
+		private void DisplayTestCount()
+		{
+            testCountPanel.Text = "Test Cases : " + testCount.ToString();
+		}
+
+		private void DisplayTestsRun()
+		{
+            testsRunPanel.Text = "Tests Run : " + testsRun.ToString();
+		}
+
+		private void DisplayErrors()
+		{
+            errorsPanel.Text = "Errors : " + errors.ToString();
+		}
+
+		private void DisplayFailures()
+		{
+            failuresPanel.Text = "Failures : " + failures.ToString();
+		}
+
+		private void DisplayTime()
+		{
+            timePanel.Text = "Time : " + time.ToString();
+		}
+
+		private void DisplayResult(TestResult result)
+		{
+			ResultSummarizer summarizer = new ResultSummarizer(result);
+
+            //this.testCount = summarizer.ResultCount;
+            this.testsRun = summarizer.TestsRun;
+			this.errors = summarizer.Errors;
+            this.failures = summarizer.Failures;
+            this.time = summarizer.Time;
+
+            DisplayTestCount();
+            DisplayTestsRun();
+            DisplayErrors();
+            DisplayFailures();
+            DisplayTime();
+        }
+
+		public void OnTestLoaded( object sender, TestEventArgs e )
+		{
+			Initialize( e.TestCount );
+		}
+
+		public void OnTestReloaded( object sender, TestEventArgs e )
+		{
+			Initialize( e.TestCount, "Reloaded" );
+		}
+
+		public void OnTestUnloaded( object sender, TestEventArgs e )
+		{
+			Initialize( 0, "Unloaded" );
+		}
+
+		private void OnRunStarting( object sender, TestEventArgs e )
+		{
+			Initialize( e.TestCount, "Running :" + e.Name );
+			DisplayTestCount();
+            DisplayTestsRun();
+            DisplayErrors();
+            DisplayFailures();
+            DisplayTime();
+        }
+
+		private void OnRunFinished(object sender, TestEventArgs e )
+		{
+			if ( e.Exception != null )
+				statusPanel.Text = "Failed";
+			else
+			{
+				statusPanel.Text = "Completed";
+				DisplayResult( e.Result );
+			}
+		}
+
+		public void OnTestStarting( object sender, TestEventArgs e )
+		{
+			string fullText = "Running : " + e.TestName.FullName;
+			string shortText = "Running : " + e.TestName.Name;
+
+			Graphics g = Graphics.FromHwnd( Handle );
+			SizeF sizeNeeded = g.MeasureString( fullText, Font );
+			if ( statusPanel.Width >= (int)sizeNeeded.Width )
+			{
+				statusPanel.Text = fullText;
+				statusPanel.ToolTipText = "";
+			}
+			else
+			{
+				sizeNeeded = g.MeasureString( shortText, Font );
+				statusPanel.Text = statusPanel.Width >= (int)sizeNeeded.Width
+					? shortText : e.TestName.Name;
+				statusPanel.ToolTipText = e.TestName.FullName;
+			}
+		}
+
+		private void OnTestFinished( object sender, TestEventArgs e )
+		{
+			if ( DisplayTestProgress && e.Result.Executed )
+			{
+				++testsRun;
+				DisplayTestsRun();
+                switch ( e.Result.ResultState )
+                {
+                    case ResultState.Error:
+                    case ResultState.Cancelled:
+    					++errors;
+	    				DisplayErrors();
+                        break;
+                    case ResultState.Failure:
+    					++failures;
+	    				DisplayFailures();
+                        break;
+				}
+			}
+		}
+
+//        protected override void OnFontChanged(EventArgs e)
+//        {
+//            base.OnFontChanged(e);
+//
+//            this.Height = (int)(this.Font.Height * 1.6);
+//        }
+
+		#region TestObserver Members
+
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
+			events.TestReloaded	+= new TestEventHandler( OnTestReloaded );
+			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
+
+			events.TestStarting	+= new TestEventHandler( OnTestStarting );
+			events.TestFinished	+= new TestEventHandler( OnTestFinished );
+			events.RunStarting	+= new TestEventHandler( OnRunStarting );
+			events.RunFinished	+= new TestEventHandler( OnRunFinished );
+		}
+
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/StatusBar.resx b/src/GuiComponents/UiKit/StatusBar.resx
index 86bccd9..aeaf74a 100644
--- a/src/GuiComponents/UiKit/StatusBar.resx
+++ b/src/GuiComponents/UiKit/StatusBar.resx
@@ -1,118 +1,118 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="toolTip.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="toolTip.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </data>
-  <data name="toolTip.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>StatusBar</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="toolTip.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="toolTip.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </data>
+  <data name="toolTip.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Name">
+    <value>StatusBar</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TabbedSettingsDialog.cs b/src/GuiComponents/UiKit/TabbedSettingsDialog.cs
index 75aa049..0a021f2 100644
--- a/src/GuiComponents/UiKit/TabbedSettingsDialog.cs
+++ b/src/GuiComponents/UiKit/TabbedSettingsDialog.cs
@@ -1,111 +1,111 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.UiKit
-{
-	public class TabbedSettingsDialog : NUnit.UiKit.SettingsDialogBase
-	{
-		protected System.Windows.Forms.TabControl tabControl1;
-		private System.ComponentModel.IContainer components = null;
-
-		public static void Display( Form owner, params SettingsPage[] pages )
-		{
-			using( TabbedSettingsDialog dialog = new TabbedSettingsDialog() )
-			{
-				owner.Site.Container.Add( dialog );
-				dialog.Font = owner.Font;
-				dialog.SettingsPages.AddRange( pages ); 
-				dialog.ShowDialog();
-			}
-		}
-
-		public TabbedSettingsDialog()
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.tabControl1 = new System.Windows.Forms.TabControl();
-			this.SuspendLayout();
-			// 
-			// cancelButton
-			// 
-			this.cancelButton.Location = new System.Drawing.Point(394, 392);
-			this.cancelButton.Name = "cancelButton";
-			// 
-			// okButton
-			// 
-			this.okButton.Location = new System.Drawing.Point(306, 392);
-			this.okButton.Name = "okButton";
-			// 
-			// tabControl1
-			// 
-			this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-				| System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.tabControl1.ItemSize = new System.Drawing.Size(46, 18);
-			this.tabControl1.Location = new System.Drawing.Point(10, 8);
-			this.tabControl1.Name = "tabControl1";
-			this.tabControl1.SelectedIndex = 0;
-			this.tabControl1.Size = new System.Drawing.Size(456, 376);
-			this.tabControl1.TabIndex = 2;
-			// 
-			// TabbedSettingsDialog
-			// 
-			this.ClientSize = new System.Drawing.Size(474, 426);
-			this.Controls.Add(this.tabControl1);
-			this.Name = "TabbedSettingsDialog";
-			this.Load += new System.EventHandler(this.TabbedSettingsDialog_Load);
-			this.Controls.SetChildIndex(this.okButton, 0);
-			this.Controls.SetChildIndex(this.cancelButton, 0);
-			this.Controls.SetChildIndex(this.tabControl1, 0);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void TabbedSettingsDialog_Load(object sender, System.EventArgs e)
-		{
-			foreach( SettingsPage page in SettingsPages )
-			{
-				TabPage tabPage = new TabPage(page.Title);
-				tabPage.Controls.Add( page );
-				page.Location = new Point(0, 16);
-				this.tabControl1.TabPages.Add( tabPage );
-			}
-		}
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiKit
+{
+	public class TabbedSettingsDialog : NUnit.UiKit.SettingsDialogBase
+	{
+		protected System.Windows.Forms.TabControl tabControl1;
+		private System.ComponentModel.IContainer components = null;
+
+		public static void Display( Form owner, params SettingsPage[] pages )
+		{
+			using( TabbedSettingsDialog dialog = new TabbedSettingsDialog() )
+			{
+				owner.Site.Container.Add( dialog );
+				dialog.Font = owner.Font;
+				dialog.SettingsPages.AddRange( pages ); 
+				dialog.ShowDialog();
+			}
+		}
+
+		public TabbedSettingsDialog()
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.tabControl1 = new System.Windows.Forms.TabControl();
+			this.SuspendLayout();
+			// 
+			// cancelButton
+			// 
+			this.cancelButton.Location = new System.Drawing.Point(394, 392);
+			this.cancelButton.Name = "cancelButton";
+			// 
+			// okButton
+			// 
+			this.okButton.Location = new System.Drawing.Point(306, 392);
+			this.okButton.Name = "okButton";
+			// 
+			// tabControl1
+			// 
+			this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+				| System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.tabControl1.ItemSize = new System.Drawing.Size(46, 18);
+			this.tabControl1.Location = new System.Drawing.Point(10, 8);
+			this.tabControl1.Name = "tabControl1";
+			this.tabControl1.SelectedIndex = 0;
+			this.tabControl1.Size = new System.Drawing.Size(456, 376);
+			this.tabControl1.TabIndex = 2;
+			// 
+			// TabbedSettingsDialog
+			// 
+			this.ClientSize = new System.Drawing.Size(474, 426);
+			this.Controls.Add(this.tabControl1);
+			this.Name = "TabbedSettingsDialog";
+			this.Load += new System.EventHandler(this.TabbedSettingsDialog_Load);
+			this.Controls.SetChildIndex(this.okButton, 0);
+			this.Controls.SetChildIndex(this.cancelButton, 0);
+			this.Controls.SetChildIndex(this.tabControl1, 0);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void TabbedSettingsDialog_Load(object sender, System.EventArgs e)
+		{
+			foreach( SettingsPage page in SettingsPages )
+			{
+				TabPage tabPage = new TabPage(page.Title);
+				tabPage.Controls.Add( page );
+				page.Location = new Point(0, 16);
+				this.tabControl1.TabPages.Add( tabPage );
+			}
+		}
+	}
+}
+
diff --git a/src/GuiComponents/UiKit/TabbedSettingsDialog.resx b/src/GuiComponents/UiKit/TabbedSettingsDialog.resx
index 0a5e5c8..34c45bd 100644
--- a/src/GuiComponents/UiKit/TabbedSettingsDialog.resx
+++ b/src/GuiComponents/UiKit/TabbedSettingsDialog.resx
@@ -1,166 +1,166 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="tabControl1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabControl1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="tabControl1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Name">
-    <value>TabbedSettingsDialog</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="tabControl1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabControl1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabControl1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabControl1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="tabControl1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabControl1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>TabbedSettingsDialog</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs b/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs
index 03777fe..a32dbeb 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.Designer.cs
@@ -1,379 +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;
-    }
+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 cff8f13..34511a9 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.cs
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.cs
@@ -1,332 +1,332 @@
-// ****************************************************************
-// 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;
-using System.Text;
-using System.IO;
-using System.Collections;
-using NUnit.Core;
-
-namespace NUnit.UiKit
-{
-    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)
-                {
-                    sb1.Append(", ");
-                    sb1.Append(cat);
-                }
-            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();
-
-            elapsedTime.Text = "Execution Time:";
-            assertCount.Text = "Assert Count:";
-            message.Text = "";
-            stackTrace.Text = "";
-
-            if (result != null)
-            {
-                elapsedTime.Text = string.Format("Execution Time: {0}", result.Time);
-
-                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)
-                        message.Text = TrimLeadingBlankLines(result.Message.Substring(0, 64000));
-                    else
-                        message.Text = TrimLeadingBlankLines(result.Message);
-                }
-
-                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
-    }
-}
+// ****************************************************************
+// 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;
+using System.Text;
+using System.IO;
+using System.Collections;
+using NUnit.Core;
+
+namespace NUnit.UiKit
+{
+    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)
+                {
+                    sb1.Append(", ");
+                    sb1.Append(cat);
+                }
+            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();
+
+            elapsedTime.Text = "Execution Time:";
+            assertCount.Text = "Assert Count:";
+            message.Text = "";
+            stackTrace.Text = "";
+
+            if (result != null)
+            {
+                elapsedTime.Text = string.Format("Execution Time: {0}", result.Time);
+
+                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)
+                        message.Text = TrimLeadingBlankLines(result.Message.Substring(0, 64000));
+                    else
+                        message.Text = TrimLeadingBlankLines(result.Message);
+                }
+
+                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 bdbccdf..beb2576 100644
--- a/src/GuiComponents/UiKit/TestPropertiesDialog.resx
+++ b/src/GuiComponents/UiKit/TestPropertiesDialog.resx
@@ -1,207 +1,207 @@
-<?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="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>
+<?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="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 d7cfb80..8b50b81 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
+++ b/src/GuiComponents/UiKit/TestSuiteTreeNode.cs
@@ -1,289 +1,293 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.UiKit
-{
-	using System;
-	using System.Windows.Forms;
-	using System.Drawing;
-	using NUnit.Core;
-	using NUnit.Util;
-
-    /// <summary>
-	/// Type safe TreeNode for use in the TestSuiteTreeView. 
-	/// NOTE: Hides some methods and properties of base class.
-	/// </summary>
-	public class TestSuiteTreeNode : TreeNode
-	{
-		#region Instance variables and constant definitions
-
-		/// <summary>
-		/// The testcase or testsuite represented by this node
-		/// </summary>
-		private ITest test;
-
-		/// <summary>
-		/// The result from the last run of the test
-		/// </summary>
-		private TestResult result;
-
-		/// <summary>
-		/// Private field used for inclusion by category
-		/// </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
-		/// </summary>
-		public static readonly int InitIndex = 0;
-		public static readonly int SkippedIndex = 0; 
-		public static readonly int FailureIndex = 1;
-		public static readonly int SuccessIndex = 2;
-		public static readonly int IgnoredIndex = 3;
-	    public static readonly int InconclusiveIndex = 4;
-
-		#endregion
-
-		#region Constructors
-
-		/// <summary>
-		/// Construct a TestNode given a test
-		/// </summary>
-		public TestSuiteTreeNode( TestInfo test ) : base(test.TestName.Name)
-		{
-			this.test = test;
-			UpdateImageIndex();
-		}
-
-		/// <summary>
-		/// Construct a TestNode given a TestResult
-		/// </summary>
-		public TestSuiteTreeNode( TestResult result ) : base( result.Test.TestName.Name )
-		{
-			this.test = result.Test;
-			this.result = result;
-			UpdateImageIndex();
-		}
-
-		#endregion
-
-		#region Properties	
-		/// <summary>
-		/// Test represented by this node
-		/// </summary>
-		public ITest Test
-		{
-			get { return this.test; }
-			set	{ this.test = value; }
-		}
-
-		/// <summary>
-		/// Test result for this node
-		/// </summary>
-		public TestResult Result
-		{
-			get { return this.result; }
-			set 
-			{ 
-				this.result = value;
-				UpdateImageIndex();
-			}
-		}
-
-        /// <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; }
-		}
-
-		public string StatusText
-		{
-			get
-			{
-				if ( result == null )
-					return test.RunState.ToString();
-
-				return result.ResultState.ToString();
-			}
-		}
-
-		public bool Included
-		{
-			get { return included; }
-			set
-			{ 
-				included = value;
-				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
-
-		/// <summary>
-		/// UPdate the image index based on the result field
-		/// </summary>
-		public void UpdateImageIndex()
-		{
-			ImageIndex = SelectedImageIndex = CalcImageIndex();
-		}
-
-		/// <summary>
-		/// Clear the result of this node and all its children
-		/// </summary>
-		public void ClearResults()
-		{
-			this.result = null;
-			ImageIndex = SelectedImageIndex = CalcImageIndex();
-
-			foreach(TestSuiteTreeNode node in Nodes)
-				node.ClearResults();
-		}
-
-        /// <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)
-            {
-                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;
-                }
-            }
-		}
-
-		internal void Accept(TestSuiteTreeNodeVisitor visitor) 
-		{
-			visitor.Visit(this);
-			foreach (TestSuiteTreeNode node in this.Nodes) 
-			{
-				node.Accept(visitor);
-			}
-		}
-
-		#endregion
-	}
-
-	public abstract class TestSuiteTreeNodeVisitor 
-	{
-		public abstract void Visit(TestSuiteTreeNode node);
-	}
-}
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.UiKit
+{
+	using System;
+	using System.Windows.Forms;
+	using System.Drawing;
+	using NUnit.Core;
+	using NUnit.Util;
+
+    /// <summary>
+	/// Type safe TreeNode for use in the TestSuiteTreeView. 
+	/// NOTE: Hides some methods and properties of base class.
+	/// </summary>
+	public class TestSuiteTreeNode : TreeNode
+	{
+		#region Instance variables and constant definitions
+
+		/// <summary>
+		/// The testcase or testsuite represented by this node
+		/// </summary>
+		private ITest test;
+
+		/// <summary>
+		/// The result from the last run of the test
+		/// </summary>
+		private TestResult result;
+
+		/// <summary>
+		/// Private field used for inclusion by category
+		/// </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
+		/// </summary>
+		public const int InitIndex = 0;
+		public const int SkippedIndex = 0; 
+		public const int FailureIndex = 1;
+		public const int SuccessIndex = 2;
+		public const int IgnoredIndex = 3;
+	    public const int InconclusiveIndex = 4;
+
+		#endregion
+
+		#region Constructors
+
+		/// <summary>
+		/// Construct a TestNode given a test
+		/// </summary>
+		public TestSuiteTreeNode( TestInfo test ) : base(test.TestName.Name)
+		{
+			this.test = test;
+			UpdateImageIndex();
+		}
+
+		/// <summary>
+		/// Construct a TestNode given a TestResult
+		/// </summary>
+		public TestSuiteTreeNode( TestResult result ) : base( result.Test.TestName.Name )
+		{
+			this.test = result.Test;
+			this.result = result;
+			UpdateImageIndex();
+		}
+
+		#endregion
+
+		#region Properties	
+		/// <summary>
+		/// Test represented by this node
+		/// </summary>
+		public ITest Test
+		{
+			get { return this.test; }
+			set	{ this.test = value; }
+		}
+
+		/// <summary>
+		/// Test result for this node
+		/// </summary>
+		public TestResult Result
+		{
+			get { return this.result; }
+			set 
+			{ 
+				this.result = value;
+				UpdateImageIndex();
+			}
+		}
+
+        /// <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; }
+		}
+
+		public string StatusText
+		{
+			get
+			{
+				if ( result == null )
+					return test.RunState.ToString();
+
+				return result.ResultState.ToString();
+			}
+		}
+
+		public bool Included
+		{
+			get { return included; }
+			set
+			{ 
+				included = value;
+				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
+
+		/// <summary>
+		/// UPdate the image index based on the result field
+		/// </summary>
+		public void UpdateImageIndex()
+		{
+			ImageIndex = SelectedImageIndex = CalcImageIndex();
+		}
+
+		/// <summary>
+		/// Clear the result of this node and all its children
+		/// </summary>
+		public void ClearResults()
+		{
+			this.result = null;
+			ImageIndex = SelectedImageIndex = CalcImageIndex();
+
+			foreach(TestSuiteTreeNode node in Nodes)
+				node.ClearResults();
+		}
+
+        /// <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)
+            {
+                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:
+                        int resultIndex = SuccessIndex;
+                        foreach (TestSuiteTreeNode node in this.Nodes)
+                        {
+                            if (node.ImageIndex == FailureIndex)
+                                return FailureIndex; // Return FailureIndex if there is any failure
+                            if (node.ImageIndex == IgnoredIndex)
+                                resultIndex = IgnoredIndex; // Remember IgnoredIndex - we might still find a failure
+                        }
+                        return resultIndex;
+                    default:
+                        return InitIndex;
+                }
+            }
+		}
+
+		internal void Accept(TestSuiteTreeNodeVisitor visitor) 
+		{
+			visitor.Visit(this);
+			foreach (TestSuiteTreeNode node in this.Nodes) 
+			{
+				node.Accept(visitor);
+			}
+		}
+
+		#endregion
+	}
+
+	public abstract class TestSuiteTreeNodeVisitor 
+	{
+		public abstract void Visit(TestSuiteTreeNode node);
+	}
+}
+
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeView.cs b/src/GuiComponents/UiKit/TestSuiteTreeView.cs
index 4b3c069..64e4683 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeView.cs
+++ b/src/GuiComponents/UiKit/TestSuiteTreeView.cs
@@ -1,1399 +1,1400 @@
-// ****************************************************************
-// 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.Collections.Generic;
-using System.Diagnostics;
-using System.Windows.Forms;
-using System.ComponentModel;
-using System.Reflection;
-using NUnit.Core;
-using NUnit.Core.Filters;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-
-	public delegate void SelectedTestChangedHandler( ITest test );
-	public delegate void CheckedTestChangedHandler( ITest[] tests );
-
-	/// <summary>
-	/// TestSuiteTreeView is a tree view control
-	/// specialized for displaying the tests
-	/// in an assembly. Clients should always
-	/// use TestNode rather than TreeNode when
-	/// dealing with this class to be sure of
-	/// calling the proper methods.
-	/// </summary>
-	public class TestSuiteTreeView : TreeView
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(TestSuiteTreeView));
-
-		#region DisplayStyle Enumeraton
-
-		/// <summary>
-		/// Indicates how a tree should be displayed
-		/// </summary>
-		public enum DisplayStyle
-		{
-			Auto,		// Select based on space available
-			Expand,		// Expand fully
-			Collapse,	// Collpase fully
-			HideTests	// Expand all but the fixtures, leaving
-			// leaf nodes hidden
-		}
-
-		#endregion
-
-        #region TreeStructureChangedException
-        private class TreeStructureChangedException : Exception
-        {
-            public TreeStructureChangedException(string message)
-                :base( message ) { }
-        }
-        #endregion
-
-        #region Instance Variables
-
-        /// <summary>
-		/// Hashtable provides direct access to TestNodes
-		/// </summary>
-		private Hashtable treeMap = new Hashtable();
-	
-		/// <summary>
-		/// The TestNode on which a right click was done
-		/// </summary>
-		private TestSuiteTreeNode contextNode;
-
-		/// <summary>
-		/// Whether the browser supports running tests,
-		/// or just loading and examining them
-		/// </summary>
-		private bool runCommandSupported = true;
-		
-		/// <summary>
-		/// Whether or not we track progress of tests visibly in the tree
-		/// </summary>
-		private bool displayProgress = true;
-
-		/// <summary>
-		/// The properties dialog if displayed
-		/// </summary>
-		private TestPropertiesDialog propertiesDialog;
-
-		/// <summary>
-		/// Source of events that the tree responds to and
-		/// target for the run command.
-		/// </summary>
-		private ITestLoader loader;
-		
-		public System.Windows.Forms.ImageList treeImages;
-		private System.ComponentModel.IContainer components;
-
-		/// <summary>
-		/// True if the UI should allow a run command to be selected
-		/// </summary>
-		private bool runCommandEnabled = false;
-
-		private ITest[] runningTests;
-
-		private TestFilter categoryFilter = TestFilter.Empty;
-
-		private bool suppressEvents = false;
-
-		private bool fixtureLoaded = false;
-
-        private bool showInconclusiveResults = false;
-
-		#endregion
-
-		#region Construction and Initialization
-
-		public TestSuiteTreeView()
-		{
-			InitializeComponent();
-
-			this.ContextMenu = new System.Windows.Forms.ContextMenu();
-			this.ContextMenu.Popup += new System.EventHandler( ContextMenu_Popup );
-
-            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 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], imageSet);
-            }
-        }
-
-        private void LoadAlternateImage(int index, string name, string imageSet)
-        {
-            string imageDir = PathUtils.Combine(Assembly.GetExecutingAssembly(), "Images", "Tree", imageSet);
-
-            string[] extensions = { ".png", ".jpg" };
-
-            foreach (string ext in extensions)
-            {
-                string filePath = Path.Combine(imageDir, name + ext);
-                if (File.Exists(filePath))
-                {
-                    treeImages.Images[index] = Image.FromFile(filePath);
-                    break;
-                }
-            }
-        }
-
-		private void InitializeComponent()
-		{
-            this.components = new System.ComponentModel.Container();
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestSuiteTreeView));
-            this.treeImages = new System.Windows.Forms.ImageList(this.components);
-            this.SuspendLayout();
-            // 
-            // treeImages
-            // 
-            this.treeImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("treeImages.ImageStream")));
-            this.treeImages.TransparentColor = System.Drawing.Color.White;
-            this.treeImages.Images.SetKeyName(0, "Skipped.png");
-            this.treeImages.Images.SetKeyName(1, "Failure.png");
-            this.treeImages.Images.SetKeyName(2, "Success.png");
-            this.treeImages.Images.SetKeyName(3, "Ignored.png");
-            this.treeImages.Images.SetKeyName(4, "Inconclusive.png");
-            // 
-            // TestSuiteTreeView
-            // 
-            this.ImageIndex = 0;
-            this.ImageList = this.treeImages;
-            this.SelectedImageIndex = 0;
-            this.DoubleClick += new System.EventHandler(this.TestSuiteTreeView_DoubleClick);
-            this.DragDrop += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragDrop);
-            this.DragEnter += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragEnter);
-            this.ResumeLayout(false);
-
-		}
-
-		public void Initialize( ITestLoader loader, ITestEvents events )
-		{
-			this.loader = loader;
-
-			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
-			events.TestReloaded	+= new TestEventHandler( OnTestChanged );
-			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
-			
-			events.RunStarting	+= new TestEventHandler( OnRunStarting );
-			events.RunFinished	+= new TestEventHandler( OnRunFinished );
-			events.TestFinished	+= new TestEventHandler( OnTestResult );
-			events.SuiteFinished+= new TestEventHandler( OnTestResult );
-		}
-
-		#endregion
-
-		#region Properties and Events
-
-		/// <summary>
-		/// Property determining whether the run command
-		/// is supported from the tree context menu and
-		/// by double-clicking test cases.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( true )]
-		[Description("Indicates whether the tree context menu should include a run command")]
-		public bool RunCommandSupported
-		{
-			get { return runCommandSupported; }
-			set { runCommandSupported = value; }
-		}
-
-		/// <summary>
-		/// Property determining whether tree should reDraw nodes
-		/// as tests are complete in order to show progress.
-		/// </summary>
-		[Category( "Behavior" ), DefaultValue( true )]
-		[Description("Indicates whether results should be displayed in the tree as each test completes")]
-		public bool DisplayTestProgress
-		{
-			get { return displayProgress; }
-			set { displayProgress = value; }
-		}
-
-        [Category( "Appearance" ), DefaultValue( false )]
-        [Description("Indicates whether checkboxes are displayed beside test nodes")]
-        public new bool CheckBoxes
-        {
-            get { return base.CheckBoxes; }
-            set 
-            { 
-                if ( base.CheckBoxes != value )
-                {
-                    VisualState visualState = !value && this.TopNode != null
-                        ? new VisualState(this)
-                        : null;
-
-                    base.CheckBoxes = value;
-
-                    if ( CheckBoxesChanged != null )
-                        CheckBoxesChanged(this, new EventArgs());
-
-                    if (visualState != null)
-                    {
-                        try
-                        {
-                            suppressEvents = true;
-                            visualState.ShowCheckBoxes = this.CheckBoxes;
-                            //RestoreVisualState( visualState );
-                            visualState.Restore(this);
-                        }
-                        finally
-                        {
-                            suppressEvents = false;
-                        }
-                    }
-                }
-            }
-        }
-
-        public bool ShowInconclusiveResults
-        {
-            get { return showInconclusiveResults; }
-        }
-
-		/// <summary>
-		/// The currently selected test.
-		/// </summary>
-		[Browsable( false )]
-		public ITest SelectedTest
-		{
-			get 
-			{ 
-				TestSuiteTreeNode node = (TestSuiteTreeNode)SelectedNode;
-				return node == null ? null : node.Test;
-			}
-		}
-
-		[Browsable( false )]
-		public ITest[] CheckedTests 
-		{
-			get 
-			{
-				CheckedTestFinder finder = new CheckedTestFinder( this );
-				return finder.GetCheckedTests( CheckedTestFinder.SelectionFlags.All );
-			}
-		}
-
-		[Browsable( false )]
-		public ITest[] SelectedTests
-		{
-			get
-			{
-				ITest[] result = null;
-
-				if ( this.CheckBoxes )
-				{
-					CheckedTestFinder finder = new CheckedTestFinder( this );
-					result = finder.GetCheckedTests( 
-						CheckedTestFinder.SelectionFlags.Top | CheckedTestFinder.SelectionFlags.Explicit );
-				}
-
-				if ( result == null || result.Length == 0 )
-					if ( this.SelectedTest != null )
-						result = new ITest[] { this.SelectedTest };
-
-				return result;
-			}	
-		}
-
-		[Browsable( false )]
-		public ITest[] FailedTests
-		{
-			get
-			{
-				FailedTestsFilterVisitor visitor = new FailedTestsFilterVisitor();
-				Accept(visitor);
-				return visitor.Tests;
-			}
-		}
-
-		/// <summary>
-		/// The currently selected test result or null
-		/// </summary>
-		[Browsable( false )]
-		public TestResult SelectedTestResult
-		{
-			get 
-			{
-				TestSuiteTreeNode node = (TestSuiteTreeNode)SelectedNode;
-				return node == null ? null : node.Result; 
-			}
-		}
-
-		[Browsable(false)]
-		public TestFilter CategoryFilter
-		{
-			get { return categoryFilter; }
-			set 
-			{ 
-				categoryFilter = value;
- 
-				TestFilterVisitor visitor = new TestFilterVisitor( categoryFilter );
-				this.Accept( visitor );
-			}
-		}
-
-		public event SelectedTestChangedHandler SelectedTestChanged;
-		public event CheckedTestChangedHandler CheckedTestChanged;
-		public event EventHandler CheckBoxesChanged;
-
-		public TestSuiteTreeNode this[string uniqueName]
-		{
-			get { return treeMap[uniqueName] as TestSuiteTreeNode; }
-		}
-
-		/// <summary>
-		/// Test node corresponding to a test
-		/// </summary>
-		private TestSuiteTreeNode this[ITest test]
-		{
-			get { return FindNode( test ); }
-		}
-
-		/// <summary>
-		/// Test node corresponding to a TestResultInfo
-		/// </summary>
-		private TestSuiteTreeNode this[TestResult result]
-		{
-			get	{ return FindNode( result.Test ); }
-		}
-
-		#endregion
-
-		#region Handlers for events related to loading and running tests
-		private void OnTestLoaded( object sender, TestEventArgs e )
-		{
-			CheckPropertiesDialog();
-			TestNode test = e.Test as TestNode;
-			if ( test != null )
-				Load( test );
-			runCommandEnabled = true;
-		}
-
-		private void OnTestChanged( object sender, TestEventArgs e )
-		{
-			TestNode test = e.Test as TestNode;
-			if ( test != null )
-				Invoke( new LoadHandler( Reload ), new object[]{ test } );
-		}
-
-		private void OnTestUnloaded( object sender, TestEventArgs e)
-		{
-			ClosePropertiesDialog();
-		
-			if ( Services.UserSettings.GetSetting( "Gui.TestTree.SaveVisualState", true ) && loader != null)
-				try
-				{
-					new VisualState(this).Save(VisualState.GetVisualStateFileName(loader.TestFileName));
-				}
-				catch(Exception ex)
-				{
-					Debug.WriteLine( "Unable to save visual state." );
-					Debug.WriteLine( ex );
-				}
-
-			Clear();
-			contextNode = null;
-			runCommandEnabled = false;
-		}
-
-		private void OnRunStarting( object sender, TestEventArgs e )
-		{
-			CheckPropertiesDialog();
-#if ACCUMULATE_RESULTS
-			if ( runningTests != null )
-				foreach( ITest test in runningTests )
-					this[test].ClearResults();
-#else
-			ClearAllResults();
-#endif
-			runCommandEnabled = false;
-		}
-
-		private void OnRunFinished( object sender, TestEventArgs e )
-		{
-			if ( runningTests != null )
-				foreach( ITest test in runningTests )
-					this[test].Expand();
-
-			if ( propertiesDialog != null )
-				propertiesDialog.Invoke( new PropertiesDisplayHandler( propertiesDialog.DisplayProperties ) );
-
-			runningTests = null;
-			runCommandEnabled = true;
-		}
-
-		private void OnTestResult( object sender, TestEventArgs e )
-		{
-			SetTestResult(e.Result);
-		}
-		#endregion
-
-		#region Context Menu
-		/// <summary>
-		/// Handles right mouse button down by
-		/// remembering the proper context item
-		/// and implements multiple select with the left button.
-		/// </summary>
-		/// <param name="e">MouseEventArgs structure with information about the mouse position and button state</param>
-		protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
-		{
-			if (e.Button == MouseButtons.Right )
-			{
-				CheckPropertiesDialog();
-				TreeNode theNode = GetNodeAt( e.X, e.Y );
-				contextNode = theNode as TestSuiteTreeNode;
-			}
-//			else if (e.Button == MouseButtons.Left )
-//			{
-//				if ( Control.ModifierKeys == Keys.Control )
-//				{
-//					TestSuiteTreeNode theNode = GetNodeAt( e.X, e.Y ) as TestSuiteTreeNode;
-//					if ( theNode != null )
-//						theNode.IsSelected = true;
-//				}
-//				else
-//				{
-//					ClearSelected();
-//				}
-//			}
-
-			base.OnMouseDown( e );
-		}
-
-		/// <summary>
-		/// Build treeview context menu dynamically on popup
-		/// </summary>
-		private void ContextMenu_Popup(object sender, System.EventArgs e)
-		{
-			this.ContextMenu.MenuItems.Clear();
-
-			TestSuiteTreeNode targetNode = contextNode != null ? contextNode : (TestSuiteTreeNode)SelectedNode;
-			if ( targetNode == null )
-				return;
-	
-			if ( RunCommandSupported )
-			{
-				// TODO: handle in Starting event
-				if ( loader.Running )
-					runCommandEnabled = false;
-
-				MenuItem runMenuItem = new MenuItem( "&Run", new EventHandler( runMenuItem_Click ) );
-				runMenuItem.DefaultItem = runMenuItem.Enabled = runCommandEnabled && targetNode.Included &&
-                    (targetNode.Test.RunState == RunState.Runnable || targetNode.Test.RunState == RunState.Explicit);
-		
-				this.ContextMenu.MenuItems.Add( runMenuItem );
-
-                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);
-
-                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("-");
-
-            MenuItem loadFixtureMenuItem = new MenuItem("Load Fixture", new EventHandler(loadFixtureMenuItem_Click));
-			loadFixtureMenuItem.Enabled = targetNode.Test.IsSuite && targetNode != Nodes[0];
-			this.ContextMenu.MenuItems.Add( loadFixtureMenuItem );
-
-			MenuItem clearFixtureMenuItem = new MenuItem( "Clear Fixture", new EventHandler( clearFixtureMenuItem_Click ) );
-			clearFixtureMenuItem.Enabled = fixtureLoaded;
-			this.ContextMenu.MenuItems.Add( clearFixtureMenuItem );
-			this.ContextMenu.MenuItems.Add( "-" );
-
-			MenuItem propertiesMenuItem = new MenuItem(
-				"&Properties", new EventHandler( propertiesMenuItem_Click ) );
-		
-			this.ContextMenu.MenuItems.Add( propertiesMenuItem );
-		}
-
-		private void showCheckBoxesMenuItem_Click( object sender, System.EventArgs e)
-		{
-			this.CheckBoxes = !this.CheckBoxes;
-		}
-
-		/// <summary>
-		/// When Expand context menu item is clicked, expand the node
-		/// </summary>
-		private void expandMenuItem_Click(object sender, System.EventArgs e)
-		{
-			TestSuiteTreeNode targetNode = contextNode != null ? contextNode : (TestSuiteTreeNode)SelectedNode;
-			if ( targetNode != null )
-				targetNode.Expand();
-		}
-
-		/// <summary>
-		/// When Collapse context menu item is clicked, collapse the node
-		/// </summary>
-		private void collapseMenuItem_Click(object sender, System.EventArgs e)
-		{
-			TestSuiteTreeNode targetNode = contextNode != null ? contextNode : (TestSuiteTreeNode)SelectedNode;
-			if ( targetNode != null )
-				targetNode.Collapse();
-		}
-
-		private void expandAllMenuItem_Click(object sender, System.EventArgs e)
-		{
-			this.BeginUpdate();
-			this.ExpandAll();
-			this.EndUpdate();
-		}
-
-		private void collapseAllMenuItem_Click(object sender, System.EventArgs e)
-		{
-			this.BeginUpdate();
-			this.CollapseAll();
-			this.EndUpdate();
-
-			// Compensate for a bug in the underlying control
-			if ( this.Nodes.Count > 0 )
-				this.SelectedNode = this.Nodes[0];	
-		}
-
-        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>
-		private void runMenuItem_Click(object sender, System.EventArgs e)
-		{
-			//TODO: some sort of lock on these booleans?
-			if ( runCommandEnabled )
-			{
-				runCommandEnabled = false;
-
-				if ( contextNode != null )
-					RunTests( new ITest[] { contextNode.Test }, false );
-				else
-					RunSelectedTests();
-			}
-		}
-
-		private void runAllMenuItem_Click(object sender, System.EventArgs e)
-		{
-			if ( runCommandEnabled )
-			{
-				runCommandEnabled = false;
-				RunAllTests();
-			}
-		}
-
-		private void runFailedMenuItem_Click(object sender, System.EventArgs e)
-		{
-			if ( runCommandEnabled )
-			{
-				runCommandEnabled = false;
-				RunFailedTests();
-			}
-		}
-
-		private void loadFixtureMenuItem_Click( object sender, System.EventArgs e)
-		{
-			if ( contextNode != null )
-			{
-				loader.LoadTest( contextNode.Test.TestName.FullName );
-				fixtureLoaded = true;
-			}
-		}
-
-		private void clearFixtureMenuItem_Click( object sender, System.EventArgs e)
-		{
-			loader.LoadTest();
-			fixtureLoaded = false;
-		}
-
-		private void propertiesMenuItem_Click( object sender, System.EventArgs e)
-		{
-			TestSuiteTreeNode targetNode = contextNode != null ? contextNode : (TestSuiteTreeNode)SelectedNode;
-			if ( targetNode != null )
-				ShowPropertiesDialog( targetNode );
-		}
-		#endregion
-
-		#region Drag and drop
-
-		/// <summary>
-		/// Helper method to determine if an IDataObject is valid
-		/// for dropping on the tree view. It must be a the drop
-		/// of a single file with a valid assembly file type.
-		/// </summary>
-		/// <param name="data">IDataObject to be tested</param>
-		/// <returns>True if dropping is allowed</returns>
-		private bool IsValidFileDrop( IDataObject data )
-		{
-			if ( !data.GetDataPresent( DataFormats.FileDrop ) )
-				return false;
-
-			string [] fileNames = data.GetData( DataFormats.FileDrop ) as string [];
-
-			if ( fileNames == null || fileNames.Length == 0 )
-				return false;
-			
-			// We can't open more than one project at a time
-			// so handle length of 1 separately.
-			if ( fileNames.Length == 1 )
-			{
-				string fileName = fileNames[0];
-				bool isProject = NUnitProject.IsNUnitProjectFile( fileName );
-				if ( Services.UserSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false ) )
-					isProject |= Services.ProjectService.CanConvertFrom( fileName );
-				
-				return isProject || PathUtils.IsAssemblyFileType( fileName );
-			}
-
-			// Multiple assemblies are allowed - we
-			// assume they are all in the same directory
-			// since they are being dragged together.
-			foreach( string fileName in fileNames )
-			{
-				if ( !PathUtils.IsAssemblyFileType( fileName ) )
-					return false;
-			}
-
-			return true;
-		}
-
-		private void TestSuiteTreeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
-		{
-			if ( IsValidFileDrop( e.Data ) )
-			{
-				string[] fileNames = (string[])e.Data.GetData( DataFormats.FileDrop );
-				if ( fileNames.Length == 1 )
-					loader.LoadProject( fileNames[0] );
-				else
-					loader.LoadProject( fileNames );
-
-				if (loader.IsProjectLoaded && loader.TestProject.IsLoadable)
-					loader.LoadTest();
-			}
-		}
-
-		private void TestSuiteTreeView_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
-		{
-			if ( IsValidFileDrop( e.Data ) )
-				e.Effect = DragDropEffects.Copy;
-			else
-				e.Effect = DragDropEffects.None;
-		}
-
-		#endregion
-
-		#region UI Event Handlers
-
-		private void TestSuiteTreeView_DoubleClick(object sender, System.EventArgs e)
-		{
-			TestSuiteTreeNode node = SelectedNode as TestSuiteTreeNode;
-			if ( runCommandSupported && runCommandEnabled && node.Nodes.Count == 0 && node.Included )
-			{
-				runCommandEnabled = false;
-				
-				// TODO: Since this is a terminal node, don't use a category filter
-				RunTests( new ITest[] { SelectedTest }, true );
-			}
-		}
-
-		protected override void OnAfterSelect(System.Windows.Forms.TreeViewEventArgs e)
-		{
-			if ( !suppressEvents )
-			{
-				if ( SelectedTestChanged != null )
-					SelectedTestChanged( SelectedTest );
-
-				base.OnAfterSelect( e );
-			}
-		}
-
-		protected override void OnAfterCheck(TreeViewEventArgs e)
-		{
-			if ( !suppressEvents )
-			{
-				if (CheckedTestChanged != null)
-					CheckedTestChanged(CheckedTests);
-
-				base.OnAfterCheck (e);
-			}
-		}
-
-		#endregion
-
-		#region Public methods to manipulate the tree
-
-		/// <summary>
-		/// Clear all the results in the tree.
-		/// </summary>
-		public void ClearAllResults()
-		{
-			foreach ( TestSuiteTreeNode rootNode in Nodes )
-				rootNode.ClearResults();
-		}
-
-		/// <summary>
-		/// Load the tree with a test hierarchy
-		/// </summary>
-		/// <param name="test">Test to be loaded</param>
-		public void Load( TestNode test )
-		{
-			using( new CP.Windows.Forms.WaitCursor() )
-			{
-				Clear();
-				BeginUpdate();
-
-				try
-				{
-			
-					AddTreeNodes( Nodes, test, false );		
-					SetInitialExpansion();
-				}
-				finally
-				{
-					EndUpdate();
-					contextNode = null;
-                    this.Select();
-				}
-
-				if ( Services.UserSettings.GetSetting( "Gui.TestTree.SaveVisualState", true ) && loader != null)
-					RestoreVisualState();
-			}
-		}
-
-		/// <summary>
-		/// Load the tree from a test result
-		/// </summary>
-		/// <param name="result"></param>
-		public void Load( TestResult result )
-		{
-			using ( new CP.Windows.Forms.WaitCursor( ) )
-			{
-				Clear();
-				BeginUpdate();
-
-				try
-				{
-					AddTreeNodes( Nodes, result, false );
-					SetInitialExpansion();
-				}
-				finally
-				{
-					EndUpdate();
-				}
-			}
-		}
-
-		/// <summary>
-		/// Reload the tree with a changed test hierarchy
-		/// while maintaining as much gui state as possible.
-		/// </summary>
-		/// <param name="test">Test suite to be loaded</param>
-		public void Reload( TestNode test )
-		{
-            TestResult result = ((TestSuiteTreeNode)Nodes[0]).Result;
-            VisualState visualState = new VisualState(this);
-
-            Load(test);
-
-            visualState.Restore(this);
-
-            if (result != null && !Services.UserSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
-                RestoreResults(result);
-		}
-
-		/// <summary>
-		/// Clear all the info in the tree.
-		/// </summary>
-		public void Clear()
-		{
-			treeMap.Clear();
-			Nodes.Clear();
-		}
-
-		protected override void OnAfterCollapse(TreeViewEventArgs e)
-		{
-			if ( !suppressEvents )
-				base.OnAfterCollapse (e);
-		}
-
-		protected override void OnAfterExpand(TreeViewEventArgs e)
-		{
-			if ( !suppressEvents )
-				base.OnAfterExpand (e);
-		}
-
-		public void Accept(TestSuiteTreeNodeVisitor visitor) 
-		{
-			foreach(TestSuiteTreeNode node in Nodes) 
-			{
-				node.Accept(visitor);
-			}
-		}
-
-		public void ClearCheckedNodes() 
-		{
-			Accept(new ClearCheckedNodesVisitor());
-		}
-
-		public void CheckFailedNodes() 
-		{
-			Accept(new CheckFailedNodesVisitor());
-		}
-
-		/// <summary>
-		/// Add the result of a test to the tree
-		/// </summary>
-		/// <param name="result">The result of the test</param>
-		public void SetTestResult(TestResult result)
-		{
-			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.TestType == "Theory")
-                    node.RepopulateTheoryNode();
-
-                if (DisplayTestProgress && node.IsVisible)
-                {
-                    Invalidate(node.Bounds);
-                    Update();
-                }
-            }
-		}
-
-		public void HideTests()
-		{
-			this.BeginUpdate();
-			foreach( TestSuiteTreeNode node in Nodes )
-				HideTestsUnderNode( node );
-			this.EndUpdate();
-		}
-
-		public void ShowPropertiesDialog( ITest test )
-		{
-			ShowPropertiesDialog( this[ test ] );
-		}
-
-		private void ShowPropertiesDialog( TestSuiteTreeNode node )
-		{
-			if ( propertiesDialog == null )
-			{
-				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);
-				propertiesDialog.Show();
-				propertiesDialog.Closed += new EventHandler( OnPropertiesDialogClosed );
-			}
-			else
-			{
-				propertiesDialog.DisplayProperties( node );
-			}
-		}
-
-		private void ClosePropertiesDialog()
-		{
-			if ( propertiesDialog != null )
-				propertiesDialog.Close();
-		}
-
-		private void CheckPropertiesDialog()
-		{
-			if ( propertiesDialog != null && !propertiesDialog.Pinned )
-				propertiesDialog.Close();
-		}
-
-		private void OnPropertiesDialogClosed( object sender, System.EventArgs e )
-		{
-			propertiesDialog = null;
-		}
-
-		#endregion
-
-		#region Running Tests
-
-        public void RunAllTests()
-        {
-            RunAllTests(true);
-        }
-
-		public void RunAllTests(bool ignoreCategories)
-		{
-            if (Nodes.Count > 0)
-            {
-                runCommandEnabled = false;
-                RunTests(new ITest[] { ((TestSuiteTreeNode)Nodes[0]).Test }, ignoreCategories);
-            }
-		}
-
-		public void RunSelectedTests()
-		{
-			runCommandEnabled = false;
-			RunTests( SelectedTests, false );
-		}
-
-		public void RunFailedTests()
-		{
-			runCommandEnabled = false;
-			RunTests( FailedTests, true );
-		}
-
-		private void RunTests( ITest[] tests, bool ignoreCategories )
-		{
-            if (tests != null && tests.Length > 0)
-            {
-                runningTests = tests;
-
-                ITestFilter filter = ignoreCategories
-                    ? MakeNameFilter(tests)
-                    : MakeFilter(tests);
-
-                loader.RunTests(filter);
-            }
-		}
-
-		private TestFilter MakeFilter( ITest[] tests )
-		{
-			TestFilter nameFilter = MakeNameFilter( tests );
-
-			if ( nameFilter == TestFilter.Empty )
-				return CategoryFilter;
-
-			if ( tests.Length == 1 )
-			{
-				TestSuiteTreeNode rootNode = (TestSuiteTreeNode)Nodes[0];
-				if ( tests[0] == rootNode.Test )
-					return CategoryFilter;
-			}
-
-			if ( CategoryFilter.IsEmpty )
-				return nameFilter;
-
-			return new AndFilter( nameFilter, CategoryFilter );
-		}
-
-		private TestFilter MakeNameFilter( ITest[] tests )
-		{
-			if ( tests == null || tests.Length == 0 )
-				return TestFilter.Empty;
-
-			NameFilter nameFilter = new NameFilter();
-			foreach( ITest test in tests )
-				nameFilter.Add( test.TestName );
-
-			return nameFilter;
-		}
-
-		#endregion
-
-		#region Helper Methods
-
-		/// <summary>
-		/// Add nodes to the tree constructed from a test
-		/// </summary>
-		/// <param name="nodes">The TreeNodeCollection to which the new node should  be added</param>
-		/// <param name="rootTest">The test for which a node is to be built</param>
-		/// <param name="highlight">If true, highlight the text for this node in the tree</param>
-		/// <returns>A newly constructed TestNode, possibly with descendant nodes</returns>
-		private TestSuiteTreeNode AddTreeNodes( IList nodes, TestNode rootTest, bool highlight )
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( rootTest );
-			//			if ( highlight ) node.ForeColor = Color.Blue;
-			AddToMap( node );
-
-			nodes.Add( node );
-			
-			if ( rootTest.IsSuite )
-			{
-				foreach( TestNode test in rootTest.Tests )
-					AddTreeNodes( node.Nodes, test, highlight );
-			}
-
-			return node;
-		}
-
-		private TestSuiteTreeNode AddTreeNodes( IList nodes, TestResult rootResult, bool highlight )
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( rootResult );
-			AddToMap( node );
-
-			nodes.Add( node );
-			
-			if ( rootResult.HasResults )
-			{
-				foreach( TestResult result in rootResult.Results )
-					AddTreeNodes( node.Nodes, result, highlight );
-			}
-
-			node.UpdateImageIndex();
-
-			return node;
-		}
-
-		private void AddToMap( TestSuiteTreeNode node )
-		{
-			string key = node.Test.TestName.UniqueName;
-
-			if ( treeMap.ContainsKey( key ) )
-				log.Error( "Duplicate entry: " + key );
-				//				UserMessage.Display( string.Format( 
-				//					"The test {0} is duplicated\r\rResults will not be displayed correctly in the tree.", node.Test.FullName ), "Duplicate Test" );
-			else
-			{
-				log.Debug( "Added to map: " + node.Test.TestName.UniqueName );
-				treeMap.Add( key, node );
-			}
-		}
-
-		private void RemoveFromMap( TestSuiteTreeNode node )
-		{
-			foreach( TestSuiteTreeNode child in node.Nodes )
-				RemoveFromMap( child );
-			treeMap.Remove( node.Test.TestName.UniqueName );
-		}
-
-		/// <summary>
-		/// Remove a node from the tree itself and the hashtable
-		/// </summary>
-		/// <param name="node">Node to remove</param>
-		private void RemoveNode( TestSuiteTreeNode node )
-		{
-			if ( contextNode == node )
-				contextNode = null;
-			RemoveFromMap( node );
-			node.Remove();
-		}
-
-		/// <summary>
-		/// Delegate for use in invoking the tree loader
-		/// from the watcher thread.
-		/// </summary>
-		private delegate void LoadHandler( TestNode test );
-
-		private delegate void PropertiesDisplayHandler();
-		
-		/// <summary>
-		/// Helper collapses all fixtures under a node
-		/// </summary>
-		/// <param name="node">Node under which to collapse fixtures</param>
-		private void HideTestsUnderNode( TestSuiteTreeNode node )
-		{
-            if (node.Test.IsSuite)
-            {
-                if (node.Test.TestType == "TestFixture")
-                    node.Collapse();
-                else
-                {
-                    node.Expand();
-
-                    foreach (TestSuiteTreeNode child in node.Nodes)
-                        HideTestsUnderNode(child);
-                }
-            }
-		}
-
-		/// <summary>
-		/// Helper used to figure out the display style
-		/// to use when the setting is Auto
-		/// </summary>
-		/// <returns>DisplayStyle to be used</returns>
-		private DisplayStyle GetDisplayStyle()
-		{
-			DisplayStyle initialDisplay = (TestSuiteTreeView.DisplayStyle)
-				Services.UserSettings.GetSetting( "Gui.TestTree.InitialTreeDisplay", DisplayStyle.Auto );
-
-			if ( initialDisplay != DisplayStyle.Auto )
-				return initialDisplay;
-
-			if ( VisibleCount >= this.GetNodeCount( true ) )
-				return DisplayStyle.Expand;
-
-			return DisplayStyle.HideTests;
-		}
-
-		public void SetInitialExpansion()
-		{
-			CollapseAll();
-			
-			switch ( GetDisplayStyle() )
-			{
-				case DisplayStyle.Expand:
-					ExpandAll();
-					break;
-				case DisplayStyle.HideTests:
-					HideTests();
-					break;
-				case DisplayStyle.Collapse:
-				default:
-					break;
-			}
-			
-			SelectedNode = Nodes[0];
-			SelectedNode.EnsureVisible();
-		}
-
-		private TestSuiteTreeNode FindNode( ITest test )
-		{
-			TestSuiteTreeNode node = treeMap[test.TestName.UniqueName] as TestSuiteTreeNode;
-
-            if (node == null)
-                node = FindNodeByName(test.TestName.FullName);
-
-            return node;
-		}
-
-        private TestSuiteTreeNode FindNodeByName( string fullName )
-        {
-            foreach( string uname in treeMap.Keys )
-            {
-                int rbrack = uname.IndexOf(']');
-                string name = rbrack >=0 ? uname.Substring(rbrack+1) : uname;
-                if ( name == fullName )
-                    return treeMap[uname] as TestSuiteTreeNode;
-            }
-
-            return null;
-        }
-
-		private void RestoreVisualState()
-		{
-            if (loader != null)
-            {
-                string fileName = VisualState.GetVisualStateFileName(loader.TestFileName);
-                if (File.Exists(fileName))
-                {
-                    VisualState.LoadFrom(fileName).Restore(this);
-                }
-            }
-        }
-
-        private void RestoreResults(TestResult result)
-        {
-            if (result.HasResults)
-                foreach (TestResult childResult in result.Results)
-                    RestoreResults(childResult);
-
-            SetTestResult(result);
-        }
-
-		#endregion
-	}
-
-	#region Helper Classes
-
-    #region ClearCheckedNodesVisitor
-
-    internal class ClearCheckedNodesVisitor : TestSuiteTreeNodeVisitor
-	{
-		public override void Visit(TestSuiteTreeNode node)
-		{
-			node.Checked = false;
-		}
-
-    }
-
-    #endregion
-
-    #region CheckFailedNodesVisitor
-
-    internal class CheckFailedNodesVisitor : TestSuiteTreeNodeVisitor 
-	{
-		public override void Visit(TestSuiteTreeNode node)
-		{
-			if (!node.Test.IsSuite && node.HasResult && 
-                (node.Result.ResultState == ResultState.Failure || 
-                 node.Result.ResultState == ResultState.Error) )
-			{
-				node.Checked = true;
-				node.EnsureVisible();
-			}
-			else
-				node.Checked = false;
-		
-		}
-    }
-
-    #endregion
-
-    #region FailedTestsFilterVisitor
-
-    internal class FailedTestsFilterVisitor : TestSuiteTreeNodeVisitor
-	{
-		List<ITest> tests = new List<ITest>();
-
-		public ITest[] Tests
-		{
-			get { return tests.ToArray(); }
-		}
-
-		public override void Visit(TestSuiteTreeNode node)
-		{
-			if (!node.Test.IsSuite && node.HasResult && 
-                    (node.Result.ResultState == ResultState.Failure || 
-                     node.Result.ResultState == ResultState.Error) )
-			{
-				tests.Add(node.Test);
-			}
-		}
-    }
-
-    #endregion
-
-    #region TestFilterVisitor
-
-    public class TestFilterVisitor : TestSuiteTreeNodeVisitor
-	{
-		private ITestFilter filter;
-
-		public TestFilterVisitor( ITestFilter filter )
-		{
-			this.filter = filter;
-		}
-
-		public override void Visit( TestSuiteTreeNode node )
-		{
-			node.Included = filter.Pass( node.Test );
-		}
-    }
-
-    #endregion
-
-    #region CheckedTestFinder
-
-    internal class CheckedTestFinder
-	{
-		[Flags]
-		public enum SelectionFlags
-		{
-			Top= 1,
-			Sub = 2,
-			Explicit = 4,
-			All = Top + Sub
-		}
-
-		private List<CheckedTestInfo> checkedTests = new List<CheckedTestInfo>();
-		private struct CheckedTestInfo
-		{
-			public ITest Test;
-			public bool TopLevel;
-
-			public CheckedTestInfo( ITest test, bool topLevel )
-			{
-				this.Test = test;
-				this.TopLevel = topLevel;
-			}
-		}
-
-		public ITest[] GetCheckedTests( SelectionFlags flags )
-		{
-			int count = 0;
-			foreach( CheckedTestInfo info in checkedTests )
-				if ( isSelected( info, flags ) ) count++;
-	
-			ITest[] result = new ITest[count];
-			
-			int index = 0;
-			foreach( CheckedTestInfo info in checkedTests )
-				if ( isSelected( info, flags ) )
-					result[index++] = info.Test;
-
-			return result;
-		}
-
-		private bool isSelected( CheckedTestInfo info, SelectionFlags flags )
-		{
-			if ( info.TopLevel && (flags & SelectionFlags.Top) != 0 )
-				return true;
-			else if ( !info.TopLevel && (flags & SelectionFlags.Sub) != 0 )
-				return true;
-			else if ( info.Test.RunState == RunState.Explicit && (flags & SelectionFlags.Explicit) != 0 )
-				return true;
-			else
-				return false;
-		}
-
-		public CheckedTestFinder( TestSuiteTreeView treeView )
-		{
-			FindCheckedNodes( treeView.Nodes, true );
-		}
-
-		private void FindCheckedNodes( TestSuiteTreeNode node, bool topLevel )
-		{
-			if ( node.Checked )
-			{
-				checkedTests.Add( new CheckedTestInfo( node.Test, topLevel ) );
-				topLevel = false;
-			}
-		
-			FindCheckedNodes( node.Nodes, topLevel );
-		}
-
-		private void FindCheckedNodes( TreeNodeCollection nodes, bool topLevel )
-		{
-			foreach( TestSuiteTreeNode node in nodes )
-				FindCheckedNodes( node, topLevel );
-		}
-    }
-
-    #endregion
-
-    #endregion
-}
-
+// ****************************************************************
+// 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.Collections.Generic;
+using System.Diagnostics;
+using System.Windows.Forms;
+using System.ComponentModel;
+using System.Reflection;
+using NUnit.Core;
+using NUnit.Core.Filters;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+
+	public delegate void SelectedTestChangedHandler( ITest test );
+	public delegate void CheckedTestChangedHandler( ITest[] tests );
+
+	/// <summary>
+	/// TestSuiteTreeView is a tree view control
+	/// specialized for displaying the tests
+	/// in an assembly. Clients should always
+	/// use TestNode rather than TreeNode when
+	/// dealing with this class to be sure of
+	/// calling the proper methods.
+	/// </summary>
+	public class TestSuiteTreeView : TreeView
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestSuiteTreeView));
+
+		#region DisplayStyle Enumeraton
+
+		/// <summary>
+		/// Indicates how a tree should be displayed
+		/// </summary>
+		public enum DisplayStyle
+		{
+			Auto,		// Select based on space available
+			Expand,		// Expand fully
+			Collapse,	// Collpase fully
+			HideTests	// Expand all but the fixtures, leaving
+			// leaf nodes hidden
+		}
+
+		#endregion
+
+        #region TreeStructureChangedException
+        private class TreeStructureChangedException : Exception
+        {
+            public TreeStructureChangedException(string message)
+                :base( message ) { }
+        }
+        #endregion
+
+        #region Instance Variables
+
+        /// <summary>
+		/// Hashtable provides direct access to TestNodes
+		/// </summary>
+		private Hashtable treeMap = new Hashtable();
+	
+		/// <summary>
+		/// The TestNode on which a right click was done
+		/// </summary>
+		private TestSuiteTreeNode explicitlySelectedNode;
+
+		/// <summary>
+		/// Whether the browser supports running tests,
+		/// or just loading and examining them
+		/// </summary>
+		private bool runCommandSupported = true;
+		
+		/// <summary>
+		/// Whether or not we track progress of tests visibly in the tree
+		/// </summary>
+		private bool displayProgress = true;
+
+		/// <summary>
+		/// The properties dialog if displayed
+		/// </summary>
+		private TestPropertiesDialog propertiesDialog;
+
+		/// <summary>
+		/// Source of events that the tree responds to and
+		/// target for the run command.
+		/// </summary>
+		private ITestLoader loader;
+		
+		public System.Windows.Forms.ImageList treeImages;
+		private System.ComponentModel.IContainer components;
+
+		/// <summary>
+		/// True if the UI should allow a run command to be selected
+		/// </summary>
+		private bool runCommandEnabled = false;
+
+		private ITest[] runningTests;
+
+		private TestFilter categoryFilter = TestFilter.Empty;
+
+		private bool suppressEvents = false;
+
+		private bool fixtureLoaded = false;
+
+        private bool showInconclusiveResults = false;
+
+		#endregion
+
+		#region Construction and Initialization
+
+		public TestSuiteTreeView()
+		{
+			InitializeComponent();
+
+			this.ContextMenu = new System.Windows.Forms.ContextMenu();
+			this.ContextMenu.Popup += new System.EventHandler( ContextMenu_Popup );
+
+            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 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], imageSet);
+            }
+        }
+
+        private void LoadAlternateImage(int index, string name, string imageSet)
+        {
+            string imageDir = PathUtils.Combine(Assembly.GetExecutingAssembly(), "Images", "Tree", imageSet);
+
+            string[] extensions = { ".png", ".jpg" };
+
+            foreach (string ext in extensions)
+            {
+                string filePath = Path.Combine(imageDir, name + ext);
+                if (File.Exists(filePath))
+                {
+                    treeImages.Images[index] = Image.FromFile(filePath);
+                    break;
+                }
+            }
+        }
+
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestSuiteTreeView));
+            this.treeImages = new System.Windows.Forms.ImageList(this.components);
+            this.SuspendLayout();
+            // 
+            // treeImages
+            // 
+            this.treeImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("treeImages.ImageStream")));
+            this.treeImages.TransparentColor = System.Drawing.Color.White;
+            this.treeImages.Images.SetKeyName(0, "Skipped.png");
+            this.treeImages.Images.SetKeyName(1, "Failure.png");
+            this.treeImages.Images.SetKeyName(2, "Success.png");
+            this.treeImages.Images.SetKeyName(3, "Ignored.png");
+            this.treeImages.Images.SetKeyName(4, "Inconclusive.png");
+            // 
+            // TestSuiteTreeView
+            // 
+            this.ImageIndex = 0;
+            this.ImageList = this.treeImages;
+            this.SelectedImageIndex = 0;
+            this.DoubleClick += new System.EventHandler(this.TestSuiteTreeView_DoubleClick);
+            this.DragDrop += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragDrop);
+            this.DragEnter += new System.Windows.Forms.DragEventHandler(this.TestSuiteTreeView_DragEnter);
+            this.ResumeLayout(false);
+
+		}
+
+		public void Initialize( ITestLoader loader, ITestEvents events )
+		{
+			this.loader = loader;
+
+			events.TestLoaded	+= new TestEventHandler( OnTestLoaded );
+			events.TestReloaded	+= new TestEventHandler( OnTestChanged );
+			events.TestUnloaded	+= new TestEventHandler( OnTestUnloaded );
+			
+			events.RunStarting	+= new TestEventHandler( OnRunStarting );
+			events.RunFinished	+= new TestEventHandler( OnRunFinished );
+			events.TestFinished	+= new TestEventHandler( OnTestResult );
+			events.SuiteFinished+= new TestEventHandler( OnTestResult );
+		}
+
+		#endregion
+
+		#region Properties and Events
+
+		/// <summary>
+		/// Property determining whether the run command
+		/// is supported from the tree context menu and
+		/// by double-clicking test cases.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( true )]
+		[Description("Indicates whether the tree context menu should include a run command")]
+		public bool RunCommandSupported
+		{
+			get { return runCommandSupported; }
+			set { runCommandSupported = value; }
+		}
+
+		/// <summary>
+		/// Property determining whether tree should reDraw nodes
+		/// as tests are complete in order to show progress.
+		/// </summary>
+		[Category( "Behavior" ), DefaultValue( true )]
+		[Description("Indicates whether results should be displayed in the tree as each test completes")]
+		public bool DisplayTestProgress
+		{
+			get { return displayProgress; }
+			set { displayProgress = value; }
+		}
+
+        [Category( "Appearance" ), DefaultValue( false )]
+        [Description("Indicates whether checkboxes are displayed beside test nodes")]
+        public new bool CheckBoxes
+        {
+            get { return base.CheckBoxes; }
+            set 
+            { 
+                if ( base.CheckBoxes != value )
+                {
+                    VisualState visualState = !value && this.TopNode != null
+                        ? new VisualState(this)
+                        : null;
+
+                    base.CheckBoxes = value;
+
+                    if ( CheckBoxesChanged != null )
+                        CheckBoxesChanged(this, new EventArgs());
+
+                    if (visualState != null)
+                    {
+                        try
+                        {
+                            suppressEvents = true;
+                            visualState.ShowCheckBoxes = this.CheckBoxes;
+                            //RestoreVisualState( visualState );
+                            visualState.Restore(this);
+                        }
+                        finally
+                        {
+                            suppressEvents = false;
+                        }
+                    }
+                }
+            }
+        }
+
+        public bool ShowInconclusiveResults
+        {
+            get { return showInconclusiveResults; }
+        }
+
+		/// <summary>
+		/// The currently selected test.
+		/// </summary>
+		[Browsable( false )]
+		public ITest SelectedTest
+		{
+			get 
+			{ 
+				TestSuiteTreeNode node = (TestSuiteTreeNode)SelectedNode;
+				return node == null ? null : node.Test;
+			}
+		}
+
+		[Browsable( false )]
+		public ITest[] CheckedTests 
+		{
+			get 
+			{
+				CheckedTestFinder finder = new CheckedTestFinder( this );
+				return finder.GetCheckedTests( CheckedTestFinder.SelectionFlags.All );
+			}
+		}
+
+		[Browsable( false )]
+		public ITest[] SelectedTests
+		{
+			get
+			{
+				ITest[] result = null;
+
+				if ( this.CheckBoxes )
+				{
+					CheckedTestFinder finder = new CheckedTestFinder( this );
+					result = finder.GetCheckedTests( 
+						CheckedTestFinder.SelectionFlags.Top | CheckedTestFinder.SelectionFlags.Explicit );
+				}
+
+				if ( result == null || result.Length == 0 )
+					if ( this.SelectedTest != null )
+						result = new ITest[] { this.SelectedTest };
+
+				return result;
+			}	
+		}
+
+		[Browsable( false )]
+		public ITest[] FailedTests
+		{
+			get
+			{
+				FailedTestsFilterVisitor visitor = new FailedTestsFilterVisitor();
+				Accept(visitor);
+				return visitor.Tests;
+			}
+		}
+
+		/// <summary>
+		/// The currently selected test result or null
+		/// </summary>
+		[Browsable( false )]
+		public TestResult SelectedTestResult
+		{
+			get 
+			{
+				TestSuiteTreeNode node = (TestSuiteTreeNode)SelectedNode;
+				return node == null ? null : node.Result; 
+			}
+		}
+
+		[Browsable(false)]
+		public TestFilter CategoryFilter
+		{
+			get { return categoryFilter; }
+			set 
+			{ 
+				categoryFilter = value;
+ 
+				TestFilterVisitor visitor = new TestFilterVisitor( categoryFilter );
+				this.Accept( visitor );
+			}
+		}
+
+		public event SelectedTestChangedHandler SelectedTestChanged;
+		public event CheckedTestChangedHandler CheckedTestChanged;
+		public event EventHandler CheckBoxesChanged;
+
+		public TestSuiteTreeNode this[string uniqueName]
+		{
+			get { return treeMap[uniqueName] as TestSuiteTreeNode; }
+		}
+
+		/// <summary>
+		/// Test node corresponding to a test
+		/// </summary>
+		private TestSuiteTreeNode this[ITest test]
+		{
+			get { return FindNode( test ); }
+		}
+
+		/// <summary>
+		/// Test node corresponding to a TestResultInfo
+		/// </summary>
+		private TestSuiteTreeNode this[TestResult result]
+		{
+			get	{ return FindNode( result.Test ); }
+		}
+
+		#endregion
+
+		#region Handlers for events related to loading and running tests
+		private void OnTestLoaded( object sender, TestEventArgs e )
+		{
+			CheckPropertiesDialog();
+			TestNode test = e.Test as TestNode;
+			if ( test != null )
+				Load( test );
+			runCommandEnabled = true;
+		}
+
+		private void OnTestChanged( object sender, TestEventArgs e )
+		{
+			TestNode test = e.Test as TestNode;
+			if ( test != null )
+				Invoke( new LoadHandler( Reload ), new object[]{ test } );
+		}
+
+		private void OnTestUnloaded( object sender, TestEventArgs e)
+		{
+			ClosePropertiesDialog();
+		
+			if ( Services.UserSettings.GetSetting( "Gui.TestTree.SaveVisualState", true ) && loader != null)
+				try
+				{
+					new VisualState(this).Save(VisualState.GetVisualStateFileName(loader.TestFileName));
+				}
+				catch(Exception ex)
+				{
+					Debug.WriteLine( "Unable to save visual state." );
+					Debug.WriteLine( ex );
+				}
+
+			Clear();
+			explicitlySelectedNode = null;
+			runCommandEnabled = false;
+		}
+
+		private void OnRunStarting( object sender, TestEventArgs e )
+		{
+			CheckPropertiesDialog();
+#if ACCUMULATE_RESULTS
+			if ( runningTests != null )
+				foreach( ITest test in runningTests )
+					this[test].ClearResults();
+#else
+			ClearAllResults();
+#endif
+			runCommandEnabled = false;
+		}
+
+		private void OnRunFinished( object sender, TestEventArgs e )
+		{
+			if ( runningTests != null )
+				foreach( ITest test in runningTests )
+					this[test].Expand();
+
+			if ( propertiesDialog != null )
+				propertiesDialog.Invoke( new PropertiesDisplayHandler( propertiesDialog.DisplayProperties ) );
+
+			runningTests = null;
+			runCommandEnabled = true;
+		}
+
+		private void OnTestResult( object sender, TestEventArgs e )
+		{
+			SetTestResult(e.Result);
+		}
+		#endregion
+
+		#region Context Menu
+		/// <summary>
+		/// Handles right mouse button down by
+		/// remembering the proper context item
+		/// and implements multiple select with the left button.
+		/// </summary>
+		/// <param name="e">MouseEventArgs structure with information about the mouse position and button state</param>
+		protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
+		{
+			if (e.Button == MouseButtons.Right )
+			{
+				CheckPropertiesDialog();
+				TreeNode theNode = GetNodeAt( e.X, e.Y );
+				explicitlySelectedNode = theNode as TestSuiteTreeNode;
+			}
+//			else if (e.Button == MouseButtons.Left )
+//			{
+//				if ( Control.ModifierKeys == Keys.Control )
+//				{
+//					TestSuiteTreeNode theNode = GetNodeAt( e.X, e.Y ) as TestSuiteTreeNode;
+//					if ( theNode != null )
+//						theNode.IsSelected = true;
+//				}
+//				else
+//				{
+//					ClearSelected();
+//				}
+//			}
+
+			base.OnMouseDown( e );
+		}
+
+		/// <summary>
+		/// Build treeview context menu dynamically on popup
+		/// </summary>
+		private void ContextMenu_Popup(object sender, System.EventArgs e)
+		{
+			this.ContextMenu.MenuItems.Clear();
+
+			TestSuiteTreeNode targetNode = explicitlySelectedNode != null ? explicitlySelectedNode : (TestSuiteTreeNode)SelectedNode;
+			if ( targetNode == null )
+				return;
+	
+			if ( RunCommandSupported )
+			{
+				// TODO: handle in Starting event
+				if ( loader.Running )
+					runCommandEnabled = false;
+
+				MenuItem runMenuItem = new MenuItem( "&Run", new EventHandler( runMenuItem_Click ) );
+				runMenuItem.DefaultItem = runMenuItem.Enabled = runCommandEnabled && targetNode.Included &&
+                    (targetNode.Test.RunState == RunState.Runnable || targetNode.Test.RunState == RunState.Explicit);
+		
+				this.ContextMenu.MenuItems.Add( runMenuItem );
+
+                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);
+
+                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("-");
+
+            MenuItem loadFixtureMenuItem = new MenuItem("Load Fixture", new EventHandler(loadFixtureMenuItem_Click));
+			loadFixtureMenuItem.Enabled = targetNode.Test.IsSuite && targetNode != Nodes[0];
+			this.ContextMenu.MenuItems.Add( loadFixtureMenuItem );
+
+			MenuItem clearFixtureMenuItem = new MenuItem( "Clear Fixture", new EventHandler( clearFixtureMenuItem_Click ) );
+			clearFixtureMenuItem.Enabled = fixtureLoaded;
+			this.ContextMenu.MenuItems.Add( clearFixtureMenuItem );
+			this.ContextMenu.MenuItems.Add( "-" );
+
+			MenuItem propertiesMenuItem = new MenuItem(
+				"&Properties", new EventHandler( propertiesMenuItem_Click ) );
+		
+			this.ContextMenu.MenuItems.Add( propertiesMenuItem );
+		}
+
+		private void showCheckBoxesMenuItem_Click( object sender, System.EventArgs e)
+		{
+			this.CheckBoxes = !this.CheckBoxes;
+		}
+
+		/// <summary>
+		/// When Expand context menu item is clicked, expand the node
+		/// </summary>
+		private void expandMenuItem_Click(object sender, System.EventArgs e)
+		{
+			TestSuiteTreeNode targetNode = explicitlySelectedNode != null ? explicitlySelectedNode : (TestSuiteTreeNode)SelectedNode;
+			if ( targetNode != null )
+				targetNode.Expand();
+		}
+
+		/// <summary>
+		/// When Collapse context menu item is clicked, collapse the node
+		/// </summary>
+		private void collapseMenuItem_Click(object sender, System.EventArgs e)
+		{
+			TestSuiteTreeNode targetNode = explicitlySelectedNode != null ? explicitlySelectedNode : (TestSuiteTreeNode)SelectedNode;
+			if ( targetNode != null )
+				targetNode.Collapse();
+		}
+
+		private void expandAllMenuItem_Click(object sender, System.EventArgs e)
+		{
+			this.BeginUpdate();
+			this.ExpandAll();
+			this.EndUpdate();
+		}
+
+		private void collapseAllMenuItem_Click(object sender, System.EventArgs e)
+		{
+			this.BeginUpdate();
+			this.CollapseAll();
+			this.EndUpdate();
+
+			// Compensate for a bug in the underlying control
+			if ( this.Nodes.Count > 0 )
+				this.SelectedNode = this.Nodes[0];	
+		}
+
+        private void failedAssumptionsMenuItem_Click(object sender, System.EventArgs e)
+        {
+            TestSuiteTreeNode targetNode = explicitlySelectedNode != null ? explicitlySelectedNode : (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>
+		private void runMenuItem_Click(object sender, System.EventArgs e)
+		{
+			//TODO: some sort of lock on these booleans?
+			if ( runCommandEnabled )
+			{
+				runCommandEnabled = false;
+
+				if ( explicitlySelectedNode != null )
+					RunTests( new ITest[] { explicitlySelectedNode.Test }, false );
+				else
+					RunSelectedTests();
+			}
+		}
+
+		private void runAllMenuItem_Click(object sender, System.EventArgs e)
+		{
+			if ( runCommandEnabled )
+			{
+				runCommandEnabled = false;
+				RunAllTests();
+			}
+		}
+
+		private void runFailedMenuItem_Click(object sender, System.EventArgs e)
+		{
+			if ( runCommandEnabled )
+			{
+				runCommandEnabled = false;
+				RunFailedTests();
+			}
+		}
+
+		private void loadFixtureMenuItem_Click( object sender, System.EventArgs e)
+		{
+			if ( explicitlySelectedNode != null )
+			{
+				loader.LoadTest( explicitlySelectedNode.Test.TestName.FullName );
+				fixtureLoaded = true;
+			}
+		}
+
+		private void clearFixtureMenuItem_Click( object sender, System.EventArgs e)
+		{
+			loader.LoadTest();
+			fixtureLoaded = false;
+		}
+
+		private void propertiesMenuItem_Click( object sender, System.EventArgs e)
+		{
+			TestSuiteTreeNode targetNode = explicitlySelectedNode != null ? explicitlySelectedNode : (TestSuiteTreeNode)SelectedNode;
+			if ( targetNode != null )
+				ShowPropertiesDialog( targetNode );
+		}
+		#endregion
+
+		#region Drag and drop
+
+		/// <summary>
+		/// Helper method to determine if an IDataObject is valid
+		/// for dropping on the tree view. It must be a the drop
+		/// of a single file with a valid assembly file type.
+		/// </summary>
+		/// <param name="data">IDataObject to be tested</param>
+		/// <returns>True if dropping is allowed</returns>
+		private bool IsValidFileDrop( IDataObject data )
+		{
+			if ( !data.GetDataPresent( DataFormats.FileDrop ) )
+				return false;
+
+			string [] fileNames = data.GetData( DataFormats.FileDrop ) as string [];
+
+			if ( fileNames == null || fileNames.Length == 0 )
+				return false;
+			
+			// We can't open more than one project at a time
+			// so handle length of 1 separately.
+			if ( fileNames.Length == 1 )
+			{
+				string fileName = fileNames[0];
+				bool isProject = NUnitProject.IsNUnitProjectFile( fileName );
+				if ( Services.UserSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false ) )
+					isProject |= Services.ProjectService.CanConvertFrom( fileName );
+				
+				return isProject || PathUtils.IsAssemblyFileType( fileName );
+			}
+
+			// Multiple assemblies are allowed - we
+			// assume they are all in the same directory
+			// since they are being dragged together.
+			foreach( string fileName in fileNames )
+			{
+				if ( !PathUtils.IsAssemblyFileType( fileName ) )
+					return false;
+			}
+
+			return true;
+		}
+
+		private void TestSuiteTreeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
+		{
+			if ( IsValidFileDrop( e.Data ) )
+			{
+				string[] fileNames = (string[])e.Data.GetData( DataFormats.FileDrop );
+				if ( fileNames.Length == 1 )
+					loader.LoadProject( fileNames[0] );
+				else
+					loader.LoadProject( fileNames );
+
+				if (loader.IsProjectLoaded && loader.TestProject.IsLoadable)
+					loader.LoadTest();
+			}
+		}
+
+		private void TestSuiteTreeView_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
+		{
+			if ( IsValidFileDrop( e.Data ) )
+				e.Effect = DragDropEffects.Copy;
+			else
+				e.Effect = DragDropEffects.None;
+		}
+
+		#endregion
+
+		#region UI Event Handlers
+
+		private void TestSuiteTreeView_DoubleClick(object sender, System.EventArgs e)
+		{
+			TestSuiteTreeNode node = SelectedNode as TestSuiteTreeNode;
+			if ( runCommandSupported && runCommandEnabled && node.Nodes.Count == 0 && node.Included )
+			{
+				runCommandEnabled = false;
+				
+				// TODO: Since this is a terminal node, don't use a category filter
+				RunTests( new ITest[] { SelectedTest }, true );
+			}
+		}
+
+		protected override void OnAfterSelect(System.Windows.Forms.TreeViewEventArgs e)
+		{
+			explicitlySelectedNode = null;
+
+			if ( !suppressEvents )
+			{
+				if ( SelectedTestChanged != null )
+					SelectedTestChanged( SelectedTest );
+
+				base.OnAfterSelect( e );
+			}
+		}
+
+		protected override void OnAfterCheck(TreeViewEventArgs e)
+		{
+			if ( !suppressEvents )
+			{
+				if (CheckedTestChanged != null)
+					CheckedTestChanged(CheckedTests);
+
+				base.OnAfterCheck (e);
+			}
+		}
+
+		#endregion
+
+		#region Public methods to manipulate the tree
+
+		/// <summary>
+		/// Clear all the results in the tree.
+		/// </summary>
+		public void ClearAllResults()
+		{
+			foreach ( TestSuiteTreeNode rootNode in Nodes )
+				rootNode.ClearResults();
+		}
+
+		/// <summary>
+		/// Load the tree with a test hierarchy
+		/// </summary>
+		/// <param name="test">Test to be loaded</param>
+		public void Load( TestNode test )
+		{
+			using( new CP.Windows.Forms.WaitCursor() )
+			{
+				Clear();
+				BeginUpdate();
+
+				try
+				{
+			
+					AddTreeNodes( Nodes, test, false );		
+					SetInitialExpansion();
+				}
+				finally
+				{
+					EndUpdate();
+					explicitlySelectedNode = null;
+                    this.Select();
+				}
+
+				if ( Services.UserSettings.GetSetting( "Gui.TestTree.SaveVisualState", true ) && loader != null)
+					RestoreVisualState();
+			}
+		}
+
+		/// <summary>
+		/// Load the tree from a test result
+		/// </summary>
+		/// <param name="result"></param>
+		public void Load( TestResult result )
+		{
+			using ( new CP.Windows.Forms.WaitCursor( ) )
+			{
+				Clear();
+				BeginUpdate();
+
+				try
+				{
+					AddTreeNodes( Nodes, result, false );
+					SetInitialExpansion();
+				}
+				finally
+				{
+					EndUpdate();
+				}
+			}
+		}
+
+		/// <summary>
+		/// Reload the tree with a changed test hierarchy
+		/// while maintaining as much gui state as possible.
+		/// </summary>
+		/// <param name="test">Test suite to be loaded</param>
+		public void Reload( TestNode test )
+		{
+            TestResult result = ((TestSuiteTreeNode)Nodes[0]).Result;
+            VisualState visualState = new VisualState(this);
+
+            Load(test);
+
+            visualState.Restore(this);
+
+            if (result != null && !Services.UserSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
+                RestoreResults(result);
+		}
+
+		/// <summary>
+		/// Clear all the info in the tree.
+		/// </summary>
+		public void Clear()
+		{
+			treeMap.Clear();
+			Nodes.Clear();
+		}
+
+		protected override void OnAfterCollapse(TreeViewEventArgs e)
+		{
+			if ( !suppressEvents )
+				base.OnAfterCollapse (e);
+		}
+
+		protected override void OnAfterExpand(TreeViewEventArgs e)
+		{
+			if ( !suppressEvents )
+				base.OnAfterExpand (e);
+		}
+
+		public void Accept(TestSuiteTreeNodeVisitor visitor) 
+		{
+			foreach(TestSuiteTreeNode node in Nodes) 
+			{
+				node.Accept(visitor);
+			}
+		}
+
+		public void ClearCheckedNodes() 
+		{
+			Accept(new ClearCheckedNodesVisitor());
+		}
+
+		public void CheckFailedNodes() 
+		{
+			Accept(new CheckFailedNodesVisitor());
+		}
+
+		/// <summary>
+		/// Add the result of a test to the tree
+		/// </summary>
+		/// <param name="result">The result of the test</param>
+		public void SetTestResult(TestResult result)
+		{
+			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.TestType == "Theory")
+                    node.RepopulateTheoryNode();
+
+                if (DisplayTestProgress && node.IsVisible)
+                {
+                    Invalidate(node.Bounds);
+                    Update();
+                }
+            }
+		}
+
+		public void HideTests()
+		{
+			this.BeginUpdate();
+			foreach( TestSuiteTreeNode node in Nodes )
+				HideTestsUnderNode( node );
+			this.EndUpdate();
+		}
+
+		public void ShowPropertiesDialog( ITest test )
+		{
+			ShowPropertiesDialog( this[ test ] );
+		}
+
+		private void ShowPropertiesDialog( TestSuiteTreeNode node )
+		{
+			if ( propertiesDialog == null )
+			{
+				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);
+				propertiesDialog.Show();
+				propertiesDialog.Closed += new EventHandler( OnPropertiesDialogClosed );
+			}
+			else
+			{
+				propertiesDialog.DisplayProperties( node );
+			}
+		}
+
+		private void ClosePropertiesDialog()
+		{
+			if ( propertiesDialog != null )
+				propertiesDialog.Close();
+		}
+
+		private void CheckPropertiesDialog()
+		{
+			if ( propertiesDialog != null && !propertiesDialog.Pinned )
+				propertiesDialog.Close();
+		}
+
+		private void OnPropertiesDialogClosed( object sender, System.EventArgs e )
+		{
+			propertiesDialog = null;
+		}
+
+		#endregion
+
+		#region Running Tests
+
+        public void RunAllTests()
+        {
+            RunAllTests(true);
+        }
+
+		public void RunAllTests(bool ignoreCategories)
+		{
+            if (Nodes.Count > 0)
+            {
+                runCommandEnabled = false;
+                RunTests(new ITest[] { ((TestSuiteTreeNode)Nodes[0]).Test }, ignoreCategories);
+            }
+		}
+
+		public void RunSelectedTests()
+		{
+			runCommandEnabled = false;
+			RunTests( SelectedTests, false );
+		}
+
+		public void RunFailedTests()
+		{
+			runCommandEnabled = false;
+			RunTests( FailedTests, true );
+		}
+
+		private void RunTests( ITest[] tests, bool ignoreCategories )
+		{
+            if (tests != null && tests.Length > 0)
+            {
+                runningTests = tests;
+
+                ITestFilter filter = ignoreCategories
+                    ? MakeNameFilter(tests)
+                    : MakeFilter(tests);
+
+                loader.RunTests(filter);
+            }
+		}
+
+		private TestFilter MakeFilter( ITest[] tests )
+		{
+			TestFilter nameFilter = MakeNameFilter( tests );
+
+			if ( nameFilter == TestFilter.Empty )
+				return CategoryFilter;
+
+			if ( tests.Length == 1 )
+			{
+				TestSuiteTreeNode rootNode = (TestSuiteTreeNode)Nodes[0];
+				if ( tests[0] == rootNode.Test )
+					return CategoryFilter;
+			}
+
+			if ( CategoryFilter.IsEmpty )
+				return nameFilter;
+
+			return new AndFilter( nameFilter, CategoryFilter );
+		}
+
+		private TestFilter MakeNameFilter( ITest[] tests )
+		{
+			if ( tests == null || tests.Length == 0 )
+				return TestFilter.Empty;
+
+			NameFilter nameFilter = new NameFilter();
+			foreach( ITest test in tests )
+				nameFilter.Add( test.TestName );
+
+			return nameFilter;
+		}
+
+		#endregion
+
+		#region Helper Methods
+
+		/// <summary>
+		/// Add nodes to the tree constructed from a test
+		/// </summary>
+		/// <param name="nodes">The TreeNodeCollection to which the new node should  be added</param>
+		/// <param name="rootTest">The test for which a node is to be built</param>
+		/// <param name="highlight">If true, highlight the text for this node in the tree</param>
+		/// <returns>A newly constructed TestNode, possibly with descendant nodes</returns>
+		private TestSuiteTreeNode AddTreeNodes( IList nodes, TestNode rootTest, bool highlight )
+		{
+			TestSuiteTreeNode node = new TestSuiteTreeNode( rootTest );
+			//			if ( highlight ) node.ForeColor = Color.Blue;
+			AddToMap( node );
+
+			nodes.Add( node );
+			
+			if ( rootTest.IsSuite )
+			{
+				foreach( TestNode test in rootTest.Tests )
+					AddTreeNodes( node.Nodes, test, highlight );
+			}
+
+			return node;
+		}
+
+		private TestSuiteTreeNode AddTreeNodes( IList nodes, TestResult rootResult, bool highlight )
+		{
+			TestSuiteTreeNode node = new TestSuiteTreeNode( rootResult );
+			AddToMap( node );
+
+			nodes.Add( node );
+			
+			if ( rootResult.HasResults )
+			{
+				foreach( TestResult result in rootResult.Results )
+					AddTreeNodes( node.Nodes, result, highlight );
+			}
+
+			node.UpdateImageIndex();
+
+			return node;
+		}
+
+		private void AddToMap( TestSuiteTreeNode node )
+		{
+			string key = node.Test.TestName.UniqueName;
+
+			if ( treeMap.ContainsKey( key ) )
+				log.Error( "Duplicate entry: " + key );
+				//				UserMessage.Display( string.Format( 
+				//					"The test {0} is duplicated\r\rResults will not be displayed correctly in the tree.", node.Test.FullName ), "Duplicate Test" );
+			else
+			{
+				log.Debug( "Added to map: " + node.Test.TestName.UniqueName );
+				treeMap.Add( key, node );
+			}
+		}
+
+		private void RemoveFromMap( TestSuiteTreeNode node )
+		{
+			foreach( TestSuiteTreeNode child in node.Nodes )
+				RemoveFromMap( child );
+			treeMap.Remove( node.Test.TestName.UniqueName );
+		}
+
+		/// <summary>
+		/// Remove a node from the tree itself and the hashtable
+		/// </summary>
+		/// <param name="node">Node to remove</param>
+		private void RemoveNode( TestSuiteTreeNode node )
+		{
+			if ( explicitlySelectedNode == node )
+				explicitlySelectedNode = null;
+			RemoveFromMap( node );
+			node.Remove();
+		}
+
+		/// <summary>
+		/// Delegate for use in invoking the tree loader
+		/// from the watcher thread.
+		/// </summary>
+		private delegate void LoadHandler( TestNode test );
+
+		private delegate void PropertiesDisplayHandler();
+		
+		/// <summary>
+		/// Helper collapses all fixtures under a node
+		/// </summary>
+		/// <param name="node">Node under which to collapse fixtures</param>
+		private void HideTestsUnderNode( TestSuiteTreeNode node )
+		{
+            if (node.Test.IsSuite)
+            {
+                if (node.Test.TestType == "TestFixture")
+                    node.Collapse();
+                else
+                {
+                    node.Expand();
+
+                    foreach (TestSuiteTreeNode child in node.Nodes)
+                        HideTestsUnderNode(child);
+                }
+            }
+		}
+
+		/// <summary>
+		/// Helper used to figure out the display style
+		/// to use when the setting is Auto
+		/// </summary>
+		/// <returns>DisplayStyle to be used</returns>
+		private DisplayStyle GetDisplayStyle()
+		{
+			DisplayStyle initialDisplay = (TestSuiteTreeView.DisplayStyle)
+				Services.UserSettings.GetSetting( "Gui.TestTree.InitialTreeDisplay", DisplayStyle.Auto );
+
+			if ( initialDisplay != DisplayStyle.Auto )
+				return initialDisplay;
+
+			if ( VisibleCount >= this.GetNodeCount( true ) )
+				return DisplayStyle.Expand;
+
+			return DisplayStyle.HideTests;
+		}
+
+		public void SetInitialExpansion()
+		{
+			CollapseAll();
+			
+			switch ( GetDisplayStyle() )
+			{
+				case DisplayStyle.Expand:
+					ExpandAll();
+					break;
+				case DisplayStyle.HideTests:
+					HideTests();
+					break;
+				case DisplayStyle.Collapse:
+				default:
+					break;
+			}
+			
+			SelectedNode = Nodes[0];
+			SelectedNode.EnsureVisible();
+		}
+
+		private TestSuiteTreeNode FindNode( ITest test )
+		{
+			TestSuiteTreeNode node = treeMap[test.TestName.UniqueName] as TestSuiteTreeNode;
+
+            if (node == null)
+                node = FindNodeByName(test.TestName.FullName);
+
+            return node;
+		}
+
+        private TestSuiteTreeNode FindNodeByName( string fullName )
+        {
+            foreach( string uname in treeMap.Keys )
+            {
+                int rbrack = uname.IndexOf(']');
+                string name = rbrack >=0 ? uname.Substring(rbrack+1) : uname;
+                if ( name == fullName )
+                    return treeMap[uname] as TestSuiteTreeNode;
+            }
+
+            return null;
+        }
+
+		private void RestoreVisualState()
+		{
+            if (loader != null)
+            {
+                string fileName = VisualState.GetVisualStateFileName(loader.TestFileName);
+                if (File.Exists(fileName))
+                {
+                    VisualState.LoadFrom(fileName).Restore(this);
+                }
+            }
+        }
+
+        private void RestoreResults(TestResult result)
+        {
+            if (result.HasResults)
+                foreach (TestResult childResult in result.Results)
+                    RestoreResults(childResult);
+
+            SetTestResult(result);
+        }
+
+		#endregion
+	}
+
+	#region Helper Classes
+
+    #region ClearCheckedNodesVisitor
+
+    internal class ClearCheckedNodesVisitor : TestSuiteTreeNodeVisitor
+	{
+		public override void Visit(TestSuiteTreeNode node)
+		{
+			node.Checked = false;
+		}
+
+    }
+
+    #endregion
+
+    #region CheckFailedNodesVisitor
+
+    internal class CheckFailedNodesVisitor : TestSuiteTreeNodeVisitor 
+	{
+		public override void Visit(TestSuiteTreeNode node)
+		{
+			if (!node.Test.IsSuite && node.HasResult && 
+                (node.Result.ResultState == ResultState.Failure || 
+                 node.Result.ResultState == ResultState.Error) )
+			{
+				node.Checked = true;
+				node.EnsureVisible();
+			}
+			else
+				node.Checked = false;
+		
+		}
+    }
+
+    #endregion
+
+    #region FailedTestsFilterVisitor
+
+    internal class FailedTestsFilterVisitor : TestSuiteTreeNodeVisitor
+	{
+		List<ITest> tests = new List<ITest>();
+
+		public ITest[] Tests
+		{
+			get { return tests.ToArray(); }
+		}
+
+		public override void Visit(TestSuiteTreeNode node)
+		{
+			if (!node.Test.IsSuite && node.HasResult && 
+                    (node.Result.ResultState == ResultState.Failure || 
+                     node.Result.ResultState == ResultState.Error) )
+			{
+				tests.Add(node.Test);
+			}
+		}
+    }
+
+    #endregion
+
+    #region TestFilterVisitor
+
+    public class TestFilterVisitor : TestSuiteTreeNodeVisitor
+	{
+		private ITestFilter filter;
+
+		public TestFilterVisitor( ITestFilter filter )
+		{
+			this.filter = filter;
+		}
+
+		public override void Visit( TestSuiteTreeNode node )
+		{
+			node.Included = filter.Pass( node.Test );
+		}
+    }
+
+    #endregion
+
+    #region CheckedTestFinder
+
+    internal class CheckedTestFinder
+	{
+		[Flags]
+		public enum SelectionFlags
+		{
+			Top= 1,
+			Sub = 2,
+			Explicit = 4,
+			All = Top + Sub
+		}
+
+		private List<CheckedTestInfo> checkedTests = new List<CheckedTestInfo>();
+		private struct CheckedTestInfo
+		{
+			public ITest Test;
+			public bool TopLevel;
+
+			public CheckedTestInfo( ITest test, bool topLevel )
+			{
+				this.Test = test;
+				this.TopLevel = topLevel;
+			}
+		}
+
+		public ITest[] GetCheckedTests( SelectionFlags flags )
+		{
+			int count = 0;
+			foreach( CheckedTestInfo info in checkedTests )
+				if ( isSelected( info, flags ) ) count++;
+	
+			ITest[] result = new ITest[count];
+			
+			int index = 0;
+			foreach( CheckedTestInfo info in checkedTests )
+				if ( isSelected( info, flags ) )
+					result[index++] = info.Test;
+
+			return result;
+		}
+
+		private bool isSelected( CheckedTestInfo info, SelectionFlags flags )
+		{
+			if ( info.TopLevel && (flags & SelectionFlags.Top) != 0 )
+				return true;
+			else if ( !info.TopLevel && (flags & SelectionFlags.Sub) != 0 )
+				return true;
+			else if ( info.Test.RunState == RunState.Explicit && (flags & SelectionFlags.Explicit) != 0 )
+				return true;
+			else
+				return false;
+		}
+
+		public CheckedTestFinder( TestSuiteTreeView treeView )
+		{
+			FindCheckedNodes( treeView.Nodes, true );
+		}
+
+		private void FindCheckedNodes( TestSuiteTreeNode node, bool topLevel )
+		{
+			if ( node.Checked )
+			{
+				checkedTests.Add( new CheckedTestInfo( node.Test, topLevel ) );
+				topLevel = false;
+			}
+		
+			FindCheckedNodes( node.Nodes, topLevel );
+		}
+
+		private void FindCheckedNodes( TreeNodeCollection nodes, bool topLevel )
+		{
+			foreach( TestSuiteTreeNode node in nodes )
+				FindCheckedNodes( node, topLevel );
+		}
+    }
+
+    #endregion
+
+    #endregion
+}
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestSuiteTreeView.resx b/src/GuiComponents/UiKit/TestSuiteTreeView.resx
index 107afc8..d9733a8 100644
--- a/src/GuiComponents/UiKit/TestSuiteTreeView.resx
+++ b/src/GuiComponents/UiKit/TestSuiteTreeView.resx
@@ -1,198 +1,198 @@
-<?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="treeImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <data name="treeImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA2
-        DwAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABIAMAAQEBAAEYBgABGOEAA9YDtwOYA4ADtQPWqwADnAGdAYQBlQHIAYABsQFRASwBRgErARgBJAFc
-        AT0BUgGeAYYBlgOcpQABhAGDAYQByQGBAbQB2AFVAbAB3AFhAbYBZgExAVYBLQEWASYBdgE5AWMB3AFk
-        AbcBzAGJAbcBhAGDAYSfAAOcAckBfgGyAdgBUgGvAd4BaAG5AeMBegHCAeIBhAHEAb8BdAGnAc8BeQG0
-        AeMBegHCAd4BaAG5AcwBiQG3A5yZAAPWAZ0BhAGVAdUBSgGqAdwBYQG2AeMBegHCAekBkAHNAXYBUAFq
-        ATABIgErAXMBTgFnAekBkAHNAeMBegHCAdwBZAG3AZ4BhgGWA9aWAAO3AcYBfAGwAdcBUAGtAd8BawG7
-        AeYBhwHIAe0BoQHVAZABbQGFATEBJwEuAU8BPAFJAeUBmwHOAeYBhwHIAd8BawG7AcgBhQGzA7eWAAOb
-        AdMBaQGxAdgBUgGvAd8BbwG8AeYBjwHNAe8BqAHYAboBkwGtATMBLQIxAScBLgFaAT8BUQHcAYQBwAHf
-        AW8BvAHWAXgBugOblgADmwHTAWkBsQHXAVABrQHbAZEB0wHfAacB3wHmAbAB4QHzAbgB4QGmAYMBmgEy
-        ASUBLgEvASABKwFWATIBSwHVAWYBsgHWAXYBuQOblgADtwHGAXwBsAHVAUoBqgHXAbEB6AHaAbQB6QHg
-        Aa4B4wHrAaYB2QHvAagB2AGrAXQBmgEyAR8BLAEtARgBJwGRAUABeAHIAYABsQO3lgAD1gGdAYQBlQHS
-        AT8BpQHNAckB8wGzAZQBwQHeAZ4B2gHlAYoBygHnAYsBygHmAYcByAFpATgBWQEsARUBJQFpASgBVgGd
-        AYQBlQPWmQADnAHJAX4BsgFhAR0BTAEvARQBJwGBATkBawHAAVwBoQHHAWMBpwG4AVgBmgE9ARsBMwEr
-        ARABIwFzAUkBZgOcnwABfQF8AX0BQwEqATwBKQEMASABKwEOASIBKwEQASMBKwEQASMBKwEQASMBKgEO
-        ASEBKgEaASQBeAF3AXilAAOWAVoBSgFVATQBIQEuASkBFAEiASkBFAEiASgBGAEiATEBKQEvA3+rAAPW
-        A7QDjwONA6UD0f8A/wAGAAaDJAADygOjBn8DowPKEgADvAM3BgAD1gO3BpsDtwPWBgADNwO8EgAD1gO3
-        BpsDtwPWHgAD1gN/Bh8DfwPWGwADgANtA3wDcQNzA30DbQOADwADCAMAA1UDnAF+AYEBmgFvAXsBvAFa
-        AWkBxgFaAWkBxgFyAXwBvgF+AYIBmgOcA1UDAAMIDwADnAF5AZgBeQFhAa8BYQE9AZUBPQFTAcABUwFr
-        AbgBawF8AZgBfAOcGAADnAF+AYoBjwFeAYIBigEUASMBJgEUASQBJwFfAYYBjQF+AYwBkAOcFQADYwN9
-        A1wDYwNqA2wDagNmA4MDYwwAA3sGAAFXAWABkwEwAUQBxQE0AUcByQE4AUwBzAE6AU0BzgE4AUwBzAE3
-        AUoBygFbAWMBlgYAA3sMAAGDAYQBgwFiAbcBYgEhAbkBIQERAUEBEQEJARsBCQFAAcEBQAE+AcQBPgE1
-        AcABNQFvAbwBbwGDAYQBgxIAA4MBbwGVAZ4BJAF8AY0BIwGIAZYBJAGMAZkBIwGLAZYBJQGPAZwBJwGK
-        AZgBcQGdAaUDgw8AA4ADfwNgA28DewOEA4cDhAN7A28DhwOADAADEQMAAQgBDAEkATcBSQHDAUMBVQHU
-        AUkBWwHYAUsBXQHaAUkBWwHYAUABUQHKAQoBDgElAwADEQwAA5wBYQG3AWEBHQG4AR0BIAFrASAGAAE2
-        AW8BNgFhAdIBYQFRAcwBUQE6AcMBOgFvAbwBbwOcDAADnAFvAZMBnQEgAXoBiwEkAY4BmwEhAYIBiwEK
-        AScBKAEJASMBJAEhAYYBjAEoAZ8BqQEkAY4BmwFxAZ0BpQOcCQADygNtA2ADcAOCA5IDnQOhA50DkgOC
-        A3IDcAPKBgAD1gFSAVQBYwYAARIBFwE3AU4BXwHYAVkBaQHkAVwBbQHmAVcBZgHeARUBGQE5BgABUwFV
-        AWUD1gYAA9YBeQGYAXkBEwGzARMBJAGOASQBAQECAQEGAAEHAQsBBwF3AckBdwFuAdcBbgFRAcwBUQE1
-        AcABNQF8AZgBfAPWBgAD1gF+AYoBjwEiAXIBhQEjAYgBlgEoAZ8BqQEmAZwBoQEJAScBKAEKASgBKQEi
-        AYwBjgEsAbQBugEoAZ8BqQEnAYoBmAF+AYwBkAPWBgADowN+A2YDewOQA6MDtAO8A7QDowOQA3sDiAOj
-        BgADtwFvAXkBvAEXASABXQYAAR0BIgFIAWYBdgHrAWwBewHvASABJQFLBgABHgEnAWIBdQGAAcEDtwYA
-        A7cBXgG0AV4BFQGWARUBBQEPAQUDAAEEAQcBBAYAAT0BWAE9AYQB3wGEAWEB0gFhAT4BxAE+AWsBuAFr
-        A7cGAAO3AWsBkQGaAR8BdwGJASUBkQGeASoBqwGyASwBtgG5AQoCKwELAS4BLQEUAlMBLQG7Ab4BKgGr
-        AbIBJQGRAZ4BbQGZAaIDtwYAA38DdANpA38DlQOrA8ED1wPBA6sDlQN/A4QDfwYAA5sBVgFmAcMBMgFG
-        AcgBGQEgAVAGAAEoAS0BWQEuATMBXQYAAR4BJQFUAUEBVAHTAWABbwHLA5sGAAObAS0BhgEtAQIBCgEC
-        BgABXQGWAV0BOQFNATkDAAMBAXEBtQFxAWgB1AFoAUIBxgFCAVMBwAFTA5sGAAObAVEBhQGVASABegGL
-        ASYBlAGgATQBsQG6ATEByQHKARgBZQFkAQwBMwExAQsBLgEtARIBSgFLASgBoQGoASUBlAGgAVQBlQGh
-        A5sGAAN/A3MDZgN7A5ADowO0A7wDtAOjA5ADewOBA38GAAObAVQBYwHDATABRAHFAT4BUQHOARcBHAFB
-        DAABGwEgAUQBTAFeAdgBPwFSAdEBYAFtAcoDmwYAA5sBFgFBARYEAAECAQABQgF4AUYBjwHeAZQBjQHM
-        AY4BBgEIAQYDAAEfATQBHwFhAdIBYQE+AcQBPgFQAcABUAObBgADmwFRAYUBlQEfAXcBiQFkAakBwQFy
-        Ab0B0gFfAcgB1wE1AtUBFwFhAWABCgIrAQkBJwEoAQwBMAEyAR8BegGFAVMBkgGeA5sGAAOjA3wDXQKB
-        AYgCkgGbApYBmAOdA6EDnQOSA4IDcAODA6MGAAO3AWsBdwG5ASoBPwHDATgBTAHMATwBSAGcAgQBBwYA
-        AgMBBwE6AUYBnwFFAVcB1gE4AUwBzAFyAXwBvgO3BgADtwFbAa8BWwEEATIBBAFFAYYBTQGWAdEBrAGc
-        AdYBrwGVAd0BngFEAW0BRAYAASkBZgEpATEBvwExAWQBtwFkA7cGAAO3AWsBkQGaASIBcgGFAZ0BvQHe
-        AZYBwQHgAXUBwgHYAT8BxQHMAS8BxwHIARkBZwFpAQkBJAElAQgBIAEiARABPAFCAW0BlgGfA7cGAAPK
-        A20DUgKGAZQCnAGuApIBnAOEA4cDhAN7A28DYwNtA8oGAAPWAX0BgAGZASABMwGhARIBGQFLAQEBAgED
-        AwACAgEDAwEDAAMBARYBHQFOASsBPAGoAX4BggGaA9YGAAPWAXkBmAF5AQUBrgEFAYUByAGdAbQB0QHV
-        AZ0B0QG1AYYB0wGTAWQBywFkAQ0BHQENBgABEQFgAREBeQGYAXkD1gYAA9YBfgGKAY8BHwFmAXkBwQHE
-        AeoBnQG/Ad8BbAG1AcsBMQGtAbUBKwGvAbYBKgGrAbIBEwFKAU4BBwEcAR8BCQEhASUBfgGKAY8D1gkA
-        A4ADfQNNAqkBxAKJAZcDbQNsA2oDYwNZA30DgAkAA9ADNQMBBgABEwEUARoBbwF2AbUBSwFWAakBBgEI
-        ARYGAAMBAzUD0AkAA5wBYQG3AWEBBQGuAQUBmQHMAbUBeQHJAYsBUAHGAVUBQgHGAUIBNgGsATYBBQEV
-        AQUGAAM/DAADnAFEAVoBYQEHARoBHwEhAVYBYwElAYcBlgElAZEBngElAZQBoAEkAY8BnAENATMBOAEG
-        ARgBHAEZASEBIwOWDwADYwN9A1ADTQNPA1EDTwNQA30DYwwAA4QGAAIFAQgBDwEYAlYBYwHDAVQBZAHR
-        ASsBPwHDASUBOAGzAREBGwFYAgUBCAYAA4QMAAGDAYQBgwFhAbcBYQEFAa4BBQEPAbIBDwEaAbcBGgEd
-        AbgBHQEaAbcBGgEQAZcBEAEIAQ4BCAYAAykJAAPfAx4BFQEdAR8BBgEUARgBCgElASwBEAE8AUUBEgFD
-        AUwBCwEqATABBgEWARoBFQEdAR8DTBUAA4ADbQN8BnADfANtA4ASAAMgA3cDkQF8AX8BmAFoAXIBtwFN
-        AV0BvQFOAV8BvQFpAXQBuAF9AX8BmAORA3cDIBIAA5wBeQGYAXkBXgG0AV4BPgG4Aj4BuAE+AV4BtAFe
-        AXkBmAF5A4oDQAMAA44MAAO2AzABGAEbARwBFQEdAR8BDwEaAR0BDwEaAR0BFQEdAR8BGAEbARwDNhsA
-        A8oDowZ/A6MDyh4AA9YDtwabA7cD1h4AA9YDtwabA7cD1gYAA6sVAAOCAzsDLAMoAyoDf88AAUIBTQE+
-        BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAL/BgAB+AEfBgAB8AEPBgAB4AEHBgABwAED
-        BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABwAEDBgAB4AEHBgAB8AEPBgAB+AEf
-        BgAC/wYABv8B/gF/AfgBHwGYARkB+AEfAfgBHwHwAQ8BgAEBAfABDwHwAQ8B4AEHAYABAQHgAQcB4AEH
-        AcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB
-        AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQHAAQMBgAEB
-        AcABAwHAAQMB4AEHAYABAQHgAQEBwAEHAfABDwHAAQMB8AEBAeABDwH4AR8B+AEfAfgBGwH4AR8I/ws=
-</value>
-  </data>
-  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </metadata>
+<?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="treeImages.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="treeImages.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA2
+        DwAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAMAAQEBAAEYBgABGOEAA9YDtwOYA4ADtQPWqwADnAGdAYQBlQHIAYABsQFRASwBRgErARgBJAFc
+        AT0BUgGeAYYBlgOcpQABhAGDAYQByQGBAbQB2AFVAbAB3AFhAbYBZgExAVYBLQEWASYBdgE5AWMB3AFk
+        AbcBzAGJAbcBhAGDAYSfAAOcAckBfgGyAdgBUgGvAd4BaAG5AeMBegHCAeIBhAHEAb8BdAGnAc8BeQG0
+        AeMBegHCAd4BaAG5AcwBiQG3A5yZAAPWAZ0BhAGVAdUBSgGqAdwBYQG2AeMBegHCAekBkAHNAXYBUAFq
+        ATABIgErAXMBTgFnAekBkAHNAeMBegHCAdwBZAG3AZ4BhgGWA9aWAAO3AcYBfAGwAdcBUAGtAd8BawG7
+        AeYBhwHIAe0BoQHVAZABbQGFATEBJwEuAU8BPAFJAeUBmwHOAeYBhwHIAd8BawG7AcgBhQGzA7eWAAOb
+        AdMBaQGxAdgBUgGvAd8BbwG8AeYBjwHNAe8BqAHYAboBkwGtATMBLQIxAScBLgFaAT8BUQHcAYQBwAHf
+        AW8BvAHWAXgBugOblgADmwHTAWkBsQHXAVABrQHbAZEB0wHfAacB3wHmAbAB4QHzAbgB4QGmAYMBmgEy
+        ASUBLgEvASABKwFWATIBSwHVAWYBsgHWAXYBuQOblgADtwHGAXwBsAHVAUoBqgHXAbEB6AHaAbQB6QHg
+        Aa4B4wHrAaYB2QHvAagB2AGrAXQBmgEyAR8BLAEtARgBJwGRAUABeAHIAYABsQO3lgAD1gGdAYQBlQHS
+        AT8BpQHNAckB8wGzAZQBwQHeAZ4B2gHlAYoBygHnAYsBygHmAYcByAFpATgBWQEsARUBJQFpASgBVgGd
+        AYQBlQPWmQADnAHJAX4BsgFhAR0BTAEvARQBJwGBATkBawHAAVwBoQHHAWMBpwG4AVgBmgE9ARsBMwEr
+        ARABIwFzAUkBZgOcnwABfQF8AX0BQwEqATwBKQEMASABKwEOASIBKwEQASMBKwEQASMBKwEQASMBKgEO
+        ASEBKgEaASQBeAF3AXilAAOWAVoBSgFVATQBIQEuASkBFAEiASkBFAEiASgBGAEiATEBKQEvA3+rAAPW
+        A7QDjwONA6UD0f8A/wAGAAaDJAADygOjBn8DowPKEgADvAM3BgAD1gO3BpsDtwPWBgADNwO8EgAD1gO3
+        BpsDtwPWHgAD1gN/Bh8DfwPWGwADgANtA3wDcQNzA30DbQOADwADCAMAA1UDnAF+AYEBmgFvAXsBvAFa
+        AWkBxgFaAWkBxgFyAXwBvgF+AYIBmgOcA1UDAAMIDwADnAF5AZgBeQFhAa8BYQE9AZUBPQFTAcABUwFr
+        AbgBawF8AZgBfAOcGAADnAF+AYoBjwFeAYIBigEUASMBJgEUASQBJwFfAYYBjQF+AYwBkAOcFQADYwN9
+        A1wDYwNqA2wDagNmA4MDYwwAA3sGAAFXAWABkwEwAUQBxQE0AUcByQE4AUwBzAE6AU0BzgE4AUwBzAE3
+        AUoBygFbAWMBlgYAA3sMAAGDAYQBgwFiAbcBYgEhAbkBIQERAUEBEQEJARsBCQFAAcEBQAE+AcQBPgE1
+        AcABNQFvAbwBbwGDAYQBgxIAA4MBbwGVAZ4BJAF8AY0BIwGIAZYBJAGMAZkBIwGLAZYBJQGPAZwBJwGK
+        AZgBcQGdAaUDgw8AA4ADfwNgA28DewOEA4cDhAN7A28DhwOADAADEQMAAQgBDAEkATcBSQHDAUMBVQHU
+        AUkBWwHYAUsBXQHaAUkBWwHYAUABUQHKAQoBDgElAwADEQwAA5wBYQG3AWEBHQG4AR0BIAFrASAGAAE2
+        AW8BNgFhAdIBYQFRAcwBUQE6AcMBOgFvAbwBbwOcDAADnAFvAZMBnQEgAXoBiwEkAY4BmwEhAYIBiwEK
+        AScBKAEJASMBJAEhAYYBjAEoAZ8BqQEkAY4BmwFxAZ0BpQOcCQADygNtA2ADcAOCA5IDnQOhA50DkgOC
+        A3IDcAPKBgAD1gFSAVQBYwYAARIBFwE3AU4BXwHYAVkBaQHkAVwBbQHmAVcBZgHeARUBGQE5BgABUwFV
+        AWUD1gYAA9YBeQGYAXkBEwGzARMBJAGOASQBAQECAQEGAAEHAQsBBwF3AckBdwFuAdcBbgFRAcwBUQE1
+        AcABNQF8AZgBfAPWBgAD1gF+AYoBjwEiAXIBhQEjAYgBlgEoAZ8BqQEmAZwBoQEJAScBKAEKASgBKQEi
+        AYwBjgEsAbQBugEoAZ8BqQEnAYoBmAF+AYwBkAPWBgADowN+A2YDewOQA6MDtAO8A7QDowOQA3sDiAOj
+        BgADtwFvAXkBvAEXASABXQYAAR0BIgFIAWYBdgHrAWwBewHvASABJQFLBgABHgEnAWIBdQGAAcEDtwYA
+        A7cBXgG0AV4BFQGWARUBBQEPAQUDAAEEAQcBBAYAAT0BWAE9AYQB3wGEAWEB0gFhAT4BxAE+AWsBuAFr
+        A7cGAAO3AWsBkQGaAR8BdwGJASUBkQGeASoBqwGyASwBtgG5AQoCKwELAS4BLQEUAlMBLQG7Ab4BKgGr
+        AbIBJQGRAZ4BbQGZAaIDtwYAA38DdANpA38DlQOrA8ED1wPBA6sDlQN/A4QDfwYAA5sBVgFmAcMBMgFG
+        AcgBGQEgAVAGAAEoAS0BWQEuATMBXQYAAR4BJQFUAUEBVAHTAWABbwHLA5sGAAObAS0BhgEtAQIBCgEC
+        BgABXQGWAV0BOQFNATkDAAMBAXEBtQFxAWgB1AFoAUIBxgFCAVMBwAFTA5sGAAObAVEBhQGVASABegGL
+        ASYBlAGgATQBsQG6ATEByQHKARgBZQFkAQwBMwExAQsBLgEtARIBSgFLASgBoQGoASUBlAGgAVQBlQGh
+        A5sGAAN/A3MDZgN7A5ADowO0A7wDtAOjA5ADewOBA38GAAObAVQBYwHDATABRAHFAT4BUQHOARcBHAFB
+        DAABGwEgAUQBTAFeAdgBPwFSAdEBYAFtAcoDmwYAA5sBFgFBARYEAAECAQABQgF4AUYBjwHeAZQBjQHM
+        AY4BBgEIAQYDAAEfATQBHwFhAdIBYQE+AcQBPgFQAcABUAObBgADmwFRAYUBlQEfAXcBiQFkAakBwQFy
+        Ab0B0gFfAcgB1wE1AtUBFwFhAWABCgIrAQkBJwEoAQwBMAEyAR8BegGFAVMBkgGeA5sGAAOjA3wDXQKB
+        AYgCkgGbApYBmAOdA6EDnQOSA4IDcAODA6MGAAO3AWsBdwG5ASoBPwHDATgBTAHMATwBSAGcAgQBBwYA
+        AgMBBwE6AUYBnwFFAVcB1gE4AUwBzAFyAXwBvgO3BgADtwFbAa8BWwEEATIBBAFFAYYBTQGWAdEBrAGc
+        AdYBrwGVAd0BngFEAW0BRAYAASkBZgEpATEBvwExAWQBtwFkA7cGAAO3AWsBkQGaASIBcgGFAZ0BvQHe
+        AZYBwQHgAXUBwgHYAT8BxQHMAS8BxwHIARkBZwFpAQkBJAElAQgBIAEiARABPAFCAW0BlgGfA7cGAAPK
+        A20DUgKGAZQCnAGuApIBnAOEA4cDhAN7A28DYwNtA8oGAAPWAX0BgAGZASABMwGhARIBGQFLAQEBAgED
+        AwACAgEDAwEDAAMBARYBHQFOASsBPAGoAX4BggGaA9YGAAPWAXkBmAF5AQUBrgEFAYUByAGdAbQB0QHV
+        AZ0B0QG1AYYB0wGTAWQBywFkAQ0BHQENBgABEQFgAREBeQGYAXkD1gYAA9YBfgGKAY8BHwFmAXkBwQHE
+        AeoBnQG/Ad8BbAG1AcsBMQGtAbUBKwGvAbYBKgGrAbIBEwFKAU4BBwEcAR8BCQEhASUBfgGKAY8D1gkA
+        A4ADfQNNAqkBxAKJAZcDbQNsA2oDYwNZA30DgAkAA9ADNQMBBgABEwEUARoBbwF2AbUBSwFWAakBBgEI
+        ARYGAAMBAzUD0AkAA5wBYQG3AWEBBQGuAQUBmQHMAbUBeQHJAYsBUAHGAVUBQgHGAUIBNgGsATYBBQEV
+        AQUGAAM/DAADnAFEAVoBYQEHARoBHwEhAVYBYwElAYcBlgElAZEBngElAZQBoAEkAY8BnAENATMBOAEG
+        ARgBHAEZASEBIwOWDwADYwN9A1ADTQNPA1EDTwNQA30DYwwAA4QGAAIFAQgBDwEYAlYBYwHDAVQBZAHR
+        ASsBPwHDASUBOAGzAREBGwFYAgUBCAYAA4QMAAGDAYQBgwFhAbcBYQEFAa4BBQEPAbIBDwEaAbcBGgEd
+        AbgBHQEaAbcBGgEQAZcBEAEIAQ4BCAYAAykJAAPfAx4BFQEdAR8BBgEUARgBCgElASwBEAE8AUUBEgFD
+        AUwBCwEqATABBgEWARoBFQEdAR8DTBUAA4ADbQN8BnADfANtA4ASAAMgA3cDkQF8AX8BmAFoAXIBtwFN
+        AV0BvQFOAV8BvQFpAXQBuAF9AX8BmAORA3cDIBIAA5wBeQGYAXkBXgG0AV4BPgG4Aj4BuAE+AV4BtAFe
+        AXkBmAF5A4oDQAMAA44MAAO2AzABGAEbARwBFQEdAR8BDwEaAR0BDwEaAR0BFQEdAR8BGAEbARwDNhsA
+        A8oDowZ/A6MDyh4AA9YDtwabA7cD1h4AA9YDtwabA7cD1gYAA6sVAAOCAzsDLAMoAyoDf88AAUIBTQE+
+        BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAL/BgAB+AEfBgAB8AEPBgAB4AEHBgABwAED
+        BgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABgAEBBgABwAEDBgAB4AEHBgAB8AEPBgAB+AEf
+        BgAC/wYABv8B/gF/AfgBHwGYARkB+AEfAfgBHwHwAQ8BgAEBAfABDwHwAQ8B4AEHAYABAQHgAQcB4AEH
+        AcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB
+        AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQHAAQMBgAEB
+        AcABAwHAAQMB4AEHAYABAQHgAQEBwAEHAfABDwHAAQMB8AEBAeABDwH4AR8B+AEfAfgBGwH4AR8I/ws=
+</value>
+  </data>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TestTree.cs b/src/GuiComponents/UiKit/TestTree.cs
index 1faef4b..79f522a 100644
--- a/src/GuiComponents/UiKit/TestTree.cs
+++ b/src/GuiComponents/UiKit/TestTree.cs
@@ -1,821 +1,826 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	public delegate void SelectedTestsChangedEventHandler(object sender, SelectedTestsChangedEventArgs e);
-	/// <summary>
-	/// Summary description for TestTree.
-	/// </summary>
-	public class TestTree : System.Windows.Forms.UserControl
-	{
-		#region Instance Variables
-
-		// Contains all available categories, whether
-		// selected or not. Unselected members of this
-		// list are displayed in selectedList
-		private IList availableCategories = new List<string>();
-
-		// Our test loader
-		private TestLoader loader;
-
-		private System.Windows.Forms.TabControl tabs;
-		private System.Windows.Forms.TabPage testPage;
-		private System.Windows.Forms.TabPage categoryPage;
-		private System.Windows.Forms.Panel testPanel;
-		private System.Windows.Forms.Panel categoryPanel;
-		private System.Windows.Forms.Panel treePanel;
-		private System.Windows.Forms.Panel buttonPanel;
-		private NUnit.UiKit.TestSuiteTreeView tests;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.ListBox availableList;
-		private System.Windows.Forms.GroupBox selectedCategories;
-		private System.Windows.Forms.ListBox selectedList;
-		private System.Windows.Forms.Panel categoryButtonPanel;
-		private System.Windows.Forms.Button addCategory;
-		private System.Windows.Forms.Button removeCategory;
-		private System.Windows.Forms.Button clearAllButton;
-		private System.Windows.Forms.Button checkFailedButton;
-		private System.Windows.Forms.MenuItem treeMenu;
-		private System.Windows.Forms.MenuItem checkBoxesMenuItem;
-		private System.Windows.Forms.MenuItem treeMenuSeparatorItem1;
-		private System.Windows.Forms.MenuItem expandMenuItem;
-		private System.Windows.Forms.MenuItem collapseMenuItem;
-		private System.Windows.Forms.MenuItem treeMenuSeparatorItem2;
-		private System.Windows.Forms.MenuItem expandAllMenuItem;
-		private System.Windows.Forms.MenuItem collapseAllMenuItem;
-		private System.Windows.Forms.MenuItem hideTestsMenuItem;
-		private System.Windows.Forms.MenuItem treeMenuSeparatorItem3;
-		private System.Windows.Forms.MenuItem propertiesMenuItem;
-		private System.Windows.Forms.CheckBox excludeCheckbox;
-
-		/// <summary> 
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		#endregion
-
-		#region Properties
-
-		public MenuItem TreeMenu 
-		{
-			get { return treeMenu; }
-		}
-
-		public string[] SelectedCategories
-		{
-			get
-			{
-				int n = this.selectedList.Items.Count;
-				string[] categories = new string[n];
-				for( int i = 0; i < n; i++ )
-					categories[i] = this.selectedList.Items[i].ToString();
-				return categories;
-			}
-		}
-
-		[Browsable(false)]
-		public bool ShowCheckBoxes
-		{
-			get { return tests.CheckBoxes; }
-			set 
-			{ 
-				tests.CheckBoxes = value;
-				buttonPanel.Visible	= value;
-				clearAllButton.Visible = value;
-				checkFailedButton.Visible = value;
-				checkBoxesMenuItem.Checked = value;
-			}
-		}
-		#endregion
-
-		#region Construction and Initialization
-
-		public TestTree()
-		{
-			// This call is required by the Windows.Forms Form Designer.
-			InitializeComponent();
-			treeMenu = new MenuItem();
-			this.checkBoxesMenuItem = new System.Windows.Forms.MenuItem();
-			this.treeMenuSeparatorItem1 = new System.Windows.Forms.MenuItem();
-			this.expandMenuItem = new System.Windows.Forms.MenuItem();
-			this.collapseMenuItem = new System.Windows.Forms.MenuItem();
-			this.treeMenuSeparatorItem2 = new System.Windows.Forms.MenuItem();
-			this.expandAllMenuItem = new System.Windows.Forms.MenuItem();
-			this.collapseAllMenuItem = new System.Windows.Forms.MenuItem();
-			this.hideTestsMenuItem = new System.Windows.Forms.MenuItem();
-			this.treeMenuSeparatorItem3 = new System.Windows.Forms.MenuItem();
-			this.propertiesMenuItem = new System.Windows.Forms.MenuItem();
-
-			// 
-			// treeMenu
-			// 
-			this.treeMenu.MergeType = MenuMerge.Add;
-			this.treeMenu.MergeOrder = 1;
-			this.treeMenu.MenuItems.AddRange(
-				new System.Windows.Forms.MenuItem[] 
-				{
-					this.checkBoxesMenuItem,
-					this.treeMenuSeparatorItem1,
-					this.expandMenuItem,
-					this.collapseMenuItem,
-					this.treeMenuSeparatorItem2,
-					this.expandAllMenuItem,
-					this.collapseAllMenuItem,
-					this.hideTestsMenuItem,
-					this.treeMenuSeparatorItem3,
-					this.propertiesMenuItem 
-				} );
-			this.treeMenu.Text = "&Tree";
-			this.treeMenu.Visible = false;
-			this.treeMenu.Popup += new System.EventHandler(this.treeMenu_Popup);
-			// 
-			// checkBoxesMenuItem
-			// 
-			this.checkBoxesMenuItem.Index = 0;
-			this.checkBoxesMenuItem.Text = "Show Check&Boxes";
-			this.checkBoxesMenuItem.Click += new System.EventHandler(this.checkBoxesMenuItem_Click);
-			// 
-			// treeMenuSeparatorItem1
-			// 
-			this.treeMenuSeparatorItem1.Index = 1;
-			this.treeMenuSeparatorItem1.Text = "-";
-			// 
-			// expandMenuItem
-			// 
-			this.expandMenuItem.Index = 2;
-			this.expandMenuItem.Text = "&Expand";
-			this.expandMenuItem.Click += new System.EventHandler(this.expandMenuItem_Click);
-			// 
-			// collapseMenuItem
-			// 
-			this.collapseMenuItem.Index = 3;
-			this.collapseMenuItem.Text = "&Collapse";
-			this.collapseMenuItem.Click += new System.EventHandler(this.collapseMenuItem_Click);
-			// 
-			// treeMenuSeparatorItem2
-			// 
-			this.treeMenuSeparatorItem2.Index = 4;
-			this.treeMenuSeparatorItem2.Text = "-";
-			// 
-			// expandAllMenuItem
-			// 
-			this.expandAllMenuItem.Index = 5;
-			this.expandAllMenuItem.Text = "Expand All";
-			this.expandAllMenuItem.Click += new System.EventHandler(this.expandAllMenuItem_Click);
-			// 
-			// collapseAllMenuItem
-			// 
-			this.collapseAllMenuItem.Index = 6;
-			this.collapseAllMenuItem.Text = "Collapse All";
-			this.collapseAllMenuItem.Click += new System.EventHandler(this.collapseAllMenuItem_Click);
-			// 
-			// hideTestsMenuItem
-			// 
-			this.hideTestsMenuItem.Index = 7;
-			this.hideTestsMenuItem.Text = "Hide Tests";
-			this.hideTestsMenuItem.Click += new System.EventHandler(this.hideTestsMenuItem_Click);
-			// 
-			// treeMenuSeparatorItem3
-			// 
-			this.treeMenuSeparatorItem3.Index = 8;
-			this.treeMenuSeparatorItem3.Text = "-";
-			// 
-			// propertiesMenuItem
-			// 
-			this.propertiesMenuItem.Index = 9;
-			this.propertiesMenuItem.Text = "&Properties";
-			this.propertiesMenuItem.Click += new System.EventHandler(this.propertiesMenuItem_Click);
-
-
-			tests.SelectedTestChanged += new SelectedTestChangedHandler(tests_SelectedTestChanged);
-			tests.CheckedTestChanged += new CheckedTestChangedHandler(tests_CheckedTestChanged);
-
-			this.excludeCheckbox.Enabled = false;
-		}
-
-		protected override void OnLoad(EventArgs e)
-		{
-			if ( !this.DesignMode )
-			{
-				this.ShowCheckBoxes = 
-					Services.UserSettings.GetSetting( "Options.ShowCheckBoxes", false );
-				Initialize( Services.TestLoader );
-				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
-			}
-
-			base.OnLoad (e);
-		}
-
-		public void Initialize(TestLoader loader) 
-		{
-			this.tests.Initialize(loader, loader.Events);
-			this.loader = loader;
-			loader.Events.TestLoaded += new NUnit.Util.TestEventHandler(events_TestLoaded);
-			loader.Events.TestReloaded += new NUnit.Util.TestEventHandler(events_TestReloaded);
-			loader.Events.TestUnloaded += new NUnit.Util.TestEventHandler(events_TestUnloaded);
-		}
-
-		public void SelectCategories( string[] categories, bool exclude )
-		{
-			foreach( string category in categories )
-			{
-				if ( availableCategories.Contains( category ) )
-				{
-					if (!selectedList.Items.Contains(category))
-					{
-						selectedList.Items.Add(category);
-					}
-					availableList.Items.Remove( category );
-
-					this.excludeCheckbox.Checked = exclude;
-				}
-			}
-
-			UpdateCategoryFilter();
-			if (this.SelectedCategories.Length > 0)
-				this.excludeCheckbox.Enabled = true;
-		}
-
-		/// <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 View Menu Handlers
-
-		private void treeMenu_Popup(object sender, System.EventArgs e)
-		{
-			TreeNode selectedNode = tests.SelectedNode;
-			if ( selectedNode != null && selectedNode.Nodes.Count > 0 )
-			{
-				bool isExpanded = selectedNode.IsExpanded;
-				collapseMenuItem.Enabled = isExpanded;
-				expandMenuItem.Enabled = !isExpanded;		
-			}
-			else
-			{
-				collapseMenuItem.Enabled = expandMenuItem.Enabled = false;
-			}
-		}
-
-		private void collapseMenuItem_Click(object sender, System.EventArgs e)
-		{
-			tests.SelectedNode.Collapse();
-		}
-
-		private void expandMenuItem_Click(object sender, System.EventArgs e)
-		{
-			tests.SelectedNode.Expand();
-		}
-
-		private void collapseAllMenuItem_Click(object sender, System.EventArgs e)
-		{
-			tests.BeginUpdate();
-			tests.CollapseAll();
-			tests.EndUpdate();
-
-			// Compensate for a bug in the underlying control
-			if ( tests.Nodes.Count > 0 )
-				tests.SelectedNode = tests.Nodes[0];	
-		}
-
-		private void hideTestsMenuItem_Click(object sender, System.EventArgs e)
-		{
-			tests.HideTests();
-		}
-
-		private void expandAllMenuItem_Click(object sender, System.EventArgs e)
-		{
-			tests.BeginUpdate();
-			tests.ExpandAll();
-			tests.EndUpdate();
-		}
-
-		private void propertiesMenuItem_Click(object sender, System.EventArgs e)
-		{
-			if ( tests.SelectedTest != null )
-				tests.ShowPropertiesDialog( tests.SelectedTest );
-		}
-
-		#endregion
-
-		#region Component Designer generated code
-		/// <summary> 
-		/// Required method for Designer support - do not modify 
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.tabs = new System.Windows.Forms.TabControl();
-			this.testPage = new System.Windows.Forms.TabPage();
-			this.testPanel = new System.Windows.Forms.Panel();
-			this.treePanel = new System.Windows.Forms.Panel();
-			this.tests = new NUnit.UiKit.TestSuiteTreeView();
-			this.buttonPanel = new System.Windows.Forms.Panel();
-			this.checkFailedButton = new System.Windows.Forms.Button();
-			this.clearAllButton = new System.Windows.Forms.Button();
-			this.categoryPage = new System.Windows.Forms.TabPage();
-			this.categoryPanel = new System.Windows.Forms.Panel();
-			this.categoryButtonPanel = new System.Windows.Forms.Panel();
-			this.removeCategory = new System.Windows.Forms.Button();
-			this.addCategory = new System.Windows.Forms.Button();
-			this.selectedCategories = new System.Windows.Forms.GroupBox();
-			this.selectedList = new System.Windows.Forms.ListBox();
-			this.excludeCheckbox = new System.Windows.Forms.CheckBox();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.availableList = new System.Windows.Forms.ListBox();
-			this.tabs.SuspendLayout();
-			this.testPage.SuspendLayout();
-			this.testPanel.SuspendLayout();
-			this.treePanel.SuspendLayout();
-			this.buttonPanel.SuspendLayout();
-			this.categoryPage.SuspendLayout();
-			this.categoryPanel.SuspendLayout();
-			this.categoryButtonPanel.SuspendLayout();
-			this.selectedCategories.SuspendLayout();
-			this.groupBox1.SuspendLayout();
-			this.SuspendLayout();
-			// 
-			// tabs
-			// 
-			this.tabs.Alignment = System.Windows.Forms.TabAlignment.Left;
-			this.tabs.Controls.Add(this.testPage);
-			this.tabs.Controls.Add(this.categoryPage);
-			this.tabs.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.tabs.Location = new System.Drawing.Point(0, 0);
-			this.tabs.Multiline = true;
-			this.tabs.Name = "tabs";
-			this.tabs.SelectedIndex = 0;
-			this.tabs.Size = new System.Drawing.Size(248, 496);
-			this.tabs.TabIndex = 0;
-			// 
-			// testPage
-			// 
-			this.testPage.Controls.Add(this.testPanel);
-			this.testPage.Location = new System.Drawing.Point(25, 4);
-			this.testPage.Name = "testPage";
-			this.testPage.Size = new System.Drawing.Size(219, 488);
-			this.testPage.TabIndex = 0;
-			this.testPage.Text = "Tests";
-			// 
-			// testPanel
-			// 
-			this.testPanel.Controls.Add(this.treePanel);
-			this.testPanel.Controls.Add(this.buttonPanel);
-			this.testPanel.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.testPanel.Location = new System.Drawing.Point(0, 0);
-			this.testPanel.Name = "testPanel";
-			this.testPanel.Size = new System.Drawing.Size(219, 488);
-			this.testPanel.TabIndex = 0;
-			// 
-			// treePanel
-			// 
-			this.treePanel.Controls.Add(this.tests);
-			this.treePanel.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.treePanel.Location = new System.Drawing.Point(0, 0);
-			this.treePanel.Name = "treePanel";
-			this.treePanel.Size = new System.Drawing.Size(219, 448);
-			this.treePanel.TabIndex = 0;
-			// 
-			// tests
-			// 
-			this.tests.AllowDrop = true;
-			this.tests.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.tests.HideSelection = false;
-			this.tests.Location = new System.Drawing.Point(0, 0);
-			this.tests.Name = "tests";
-			this.tests.Size = new System.Drawing.Size(219, 448);
-			this.tests.TabIndex = 0;
-			this.tests.CheckBoxesChanged += new System.EventHandler(this.tests_CheckBoxesChanged);
-			// 
-			// buttonPanel
-			// 
-			this.buttonPanel.Controls.Add(this.checkFailedButton);
-			this.buttonPanel.Controls.Add(this.clearAllButton);
-			this.buttonPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
-			this.buttonPanel.Location = new System.Drawing.Point(0, 448);
-			this.buttonPanel.Name = "buttonPanel";
-			this.buttonPanel.Size = new System.Drawing.Size(219, 40);
-			this.buttonPanel.TabIndex = 1;
-			// 
-			// checkFailedButton
-			// 
-			this.checkFailedButton.Anchor = System.Windows.Forms.AnchorStyles.Top;
-			this.checkFailedButton.Location = new System.Drawing.Point(117, 8);
-			this.checkFailedButton.Name = "checkFailedButton";
-			this.checkFailedButton.Size = new System.Drawing.Size(96, 23);
-			this.checkFailedButton.TabIndex = 1;
-			this.checkFailedButton.Text = "Check Failed";
-			this.checkFailedButton.Click += new System.EventHandler(this.checkFailedButton_Click);
-			// 
-			// clearAllButton
-			// 
-			this.clearAllButton.Anchor = System.Windows.Forms.AnchorStyles.Top;
-			this.clearAllButton.Location = new System.Drawing.Point(13, 8);
-			this.clearAllButton.Name = "clearAllButton";
-			this.clearAllButton.Size = new System.Drawing.Size(96, 23);
-			this.clearAllButton.TabIndex = 0;
-			this.clearAllButton.Text = "Clear All";
-			this.clearAllButton.Click += new System.EventHandler(this.clearAllButton_Click);
-			// 
-			// categoryPage
-			// 
-			this.categoryPage.Controls.Add(this.categoryPanel);
-			this.categoryPage.Location = new System.Drawing.Point(25, 4);
-			this.categoryPage.Name = "categoryPage";
-			this.categoryPage.Size = new System.Drawing.Size(219, 488);
-			this.categoryPage.TabIndex = 1;
-			this.categoryPage.Text = "Categories";
-			// 
-			// categoryPanel
-			// 
-			this.categoryPanel.Controls.Add(this.categoryButtonPanel);
-			this.categoryPanel.Controls.Add(this.selectedCategories);
-			this.categoryPanel.Controls.Add(this.groupBox1);
-			this.categoryPanel.Dock = System.Windows.Forms.DockStyle.Fill;
-			this.categoryPanel.Location = new System.Drawing.Point(0, 0);
-			this.categoryPanel.Name = "categoryPanel";
-			this.categoryPanel.Size = new System.Drawing.Size(219, 488);
-			this.categoryPanel.TabIndex = 0;
-			// 
-			// categoryButtonPanel
-			// 
-			this.categoryButtonPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.categoryButtonPanel.Controls.Add(this.removeCategory);
-			this.categoryButtonPanel.Controls.Add(this.addCategory);
-			this.categoryButtonPanel.Location = new System.Drawing.Point(8, 280);
-			this.categoryButtonPanel.Name = "categoryButtonPanel";
-			this.categoryButtonPanel.Size = new System.Drawing.Size(203, 40);
-			this.categoryButtonPanel.TabIndex = 1;
-			// 
-			// removeCategory
-			// 
-			this.removeCategory.Anchor = System.Windows.Forms.AnchorStyles.Top;
-			this.removeCategory.Location = new System.Drawing.Point(109, 8);
-			this.removeCategory.Name = "removeCategory";
-			this.removeCategory.TabIndex = 1;
-			this.removeCategory.Text = "Remove";
-			this.removeCategory.Click += new System.EventHandler(this.removeCategory_Click);
-			// 
-			// addCategory
-			// 
-			this.addCategory.Anchor = System.Windows.Forms.AnchorStyles.Top;
-			this.addCategory.Location = new System.Drawing.Point(21, 8);
-			this.addCategory.Name = "addCategory";
-			this.addCategory.TabIndex = 0;
-			this.addCategory.Text = "Add";
-			this.addCategory.Click += new System.EventHandler(this.addCategory_Click);
-			// 
-			// selectedCategories
-			// 
-			this.selectedCategories.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.selectedCategories.Controls.Add(this.selectedList);
-			this.selectedCategories.Controls.Add(this.excludeCheckbox);
-			this.selectedCategories.Location = new System.Drawing.Point(8, 328);
-			this.selectedCategories.Name = "selectedCategories";
-			this.selectedCategories.Size = new System.Drawing.Size(203, 144);
-			this.selectedCategories.TabIndex = 2;
-			this.selectedCategories.TabStop = false;
-			this.selectedCategories.Text = "Selected Categories";
-			// 
-			// selectedList
-			// 
-			this.selectedList.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.selectedList.ItemHeight = 16;
-			this.selectedList.Location = new System.Drawing.Point(8, 16);
-			this.selectedList.Name = "selectedList";
-			this.selectedList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
-			this.selectedList.Size = new System.Drawing.Size(187, 84);
-			this.selectedList.TabIndex = 0;
-			this.selectedList.DoubleClick += new System.EventHandler(this.removeCategory_Click);
-			// 
-			// excludeCheckbox
-			// 
-			this.excludeCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.excludeCheckbox.Location = new System.Drawing.Point(8, 120);
-			this.excludeCheckbox.Name = "excludeCheckbox";
-			this.excludeCheckbox.Size = new System.Drawing.Size(179, 16);
-			this.excludeCheckbox.TabIndex = 1;
-			this.excludeCheckbox.Text = "Exclude these categories";
-			this.excludeCheckbox.CheckedChanged += new System.EventHandler(this.excludeCheckbox_CheckedChanged);
-			// 
-			// 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.Controls.Add(this.availableList);
-			this.groupBox1.Location = new System.Drawing.Point(8, 0);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(203, 272);
-			this.groupBox1.TabIndex = 0;
-			this.groupBox1.TabStop = false;
-			this.groupBox1.Text = "Available Categories";
-			// 
-			// availableList
-			// 
-			this.availableList.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.availableList.ItemHeight = 16;
-			this.availableList.Location = new System.Drawing.Point(8, 24);
-			this.availableList.Name = "availableList";
-			this.availableList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
-			this.availableList.Size = new System.Drawing.Size(187, 244);
-			this.availableList.TabIndex = 0;
-			this.availableList.DoubleClick += new System.EventHandler(this.addCategory_Click);
-			// 
-			// TestTree
-			// 
-			this.Controls.Add(this.tabs);
-			this.Name = "TestTree";
-			this.Size = new System.Drawing.Size(248, 496);
-			this.tabs.ResumeLayout(false);
-			this.testPage.ResumeLayout(false);
-			this.testPanel.ResumeLayout(false);
-			this.treePanel.ResumeLayout(false);
-			this.buttonPanel.ResumeLayout(false);
-			this.categoryPage.ResumeLayout(false);
-			this.categoryPanel.ResumeLayout(false);
-			this.categoryButtonPanel.ResumeLayout(false);
-			this.selectedCategories.ResumeLayout(false);
-			this.groupBox1.ResumeLayout(false);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		#region SelectedTestsChanged Event
-
-		public event SelectedTestsChangedEventHandler SelectedTestsChanged;
-
-		#endregion
-
-
-        public void RunAllTests()
-        {
-            RunAllTests(true);
-        }
-
-		public void RunAllTests(bool ignoreTests)
-		{
-			tests.RunAllTests(ignoreTests);
-		}
-
-		public void RunSelectedTests()
-		{
-			tests.RunSelectedTests();
-		}
-
-		public void RunFailedTests()
-		{
-			tests.RunFailedTests();
-		}
-
-		private void addCategory_Click(object sender, System.EventArgs e)
-		{
-			if (availableList.SelectedItems.Count > 0) 
-			{
-                // 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);
-				}
-
-				UpdateCategoryFilter();
-				if (this.SelectedCategories.Length > 0)
-					this.excludeCheckbox.Enabled = true;
-			}
-		}
-
-		private void removeCategory_Click(object sender, System.EventArgs e)
-		{
-			if (selectedList.SelectedItems.Count > 0) 
-			{
-                // 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);
-					availableList.Items.Add(category);
-				}
-
-				UpdateCategoryFilter();
-				if (this.SelectedCategories.Length == 0)
-				{
-					this.excludeCheckbox.Checked = false;
-					this.excludeCheckbox.Enabled = false;
-				}
-			}
-		}
-
-		private void clearAllButton_Click(object sender, System.EventArgs e)
-		{
-			tests.ClearCheckedNodes();
-		}
-
-		private void checkFailedButton_Click(object sender, System.EventArgs e)
-		{
-			tests.CheckFailedNodes();
-		}
-
-		private void tests_SelectedTestChanged(ITest test)
-		{
-			if (SelectedTestsChanged != null) 
-			{
-				SelectedTestsChangedEventArgs args = new SelectedTestsChangedEventArgs(test.TestName.Name, test.TestCount);
-				SelectedTestsChanged(tests, args);
-			}
-		}
-
-		private void events_TestLoaded(object sender, NUnit.Util.TestEventArgs args)
-		{			
-			treeMenu.Visible = true;
-
-			availableCategories = this.loader.GetCategories();
-			availableList.Items.Clear();
-			selectedList.Items.Clear();
-			
-			availableList.SuspendLayout();
-			foreach (string category in availableCategories) 
-				availableList.Items.Add(category);
-
-			// tree may have restored visual state
-			if( !tests.CategoryFilter.IsEmpty )
-			{
-				ITestFilter filter = tests.CategoryFilter;
-				if ( filter is NUnit.Core.Filters.NotFilter )
-				{
-					filter = ((NUnit.Core.Filters.NotFilter)filter).BaseFilter;
-					this.excludeCheckbox.Checked = true;
-				}
-
-				foreach( string cat in ((NUnit.Core.Filters.CategoryFilter)filter).Categories )
-					if ( this.availableCategories.Contains( cat ) )
-					{
-						this.availableList.Items.Remove( cat );
-						this.selectedList.Items.Add( cat );
-						this.excludeCheckbox.Enabled = true;
-					}
-
-				UpdateCategoryFilter();
-			}
-
-			availableList.ResumeLayout();
-		}
-
-		private void events_TestReloaded(object sender, NUnit.Util.TestEventArgs args)
-		{
-			// Get new list of available categories
-			availableCategories = this.loader.GetCategories();
-
-			// Remove any selected items that are no longer available
-			int index = selectedList.Items.Count;
-			selectedList.SuspendLayout();
-			while( --index >= 0 )
-			{
-				string category = selectedList.Items[index].ToString();
-				if ( !availableCategories.Contains( category )  )
-					selectedList.Items.RemoveAt( index );
-			}
-			selectedList.ResumeLayout();
-
-			// Put any unselected available items availableList
-			availableList.Items.Clear();
-			availableList.SuspendLayout();
-			foreach( string category in availableCategories )
-				if( selectedList.FindStringExact( category ) < 0 )
-					availableList.Items.Add( category );
-			availableList.ResumeLayout();
-
-			// Tell the tree what is selected
-			UpdateCategoryFilter();
-		}
-
-		private void excludeCheckbox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			UpdateCategoryFilter();
-		}
-
-		private void events_TestUnloaded(object sender, NUnit.Util.TestEventArgs args)
-		{
-			availableCategories.Clear();
-			availableList.Items.Clear();
-			selectedList.Items.Clear();
-			excludeCheckbox.Checked = false;
-			excludeCheckbox.Enabled = false;
-			treeMenu.Visible = false;
-		}
-
-		private void tests_CheckedTestChanged(ITest[] tests)
-		{
-			if (SelectedTestsChanged != null) 
-			{
-				SelectedTestsChangedEventArgs args = new SelectedTestsChangedEventArgs("", tests.Length);
-				SelectedTestsChanged(tests, args);
-			}
-
-			if (tests.Length > 0) 
-			{
-			}
-		}
-
-		private void checkBoxesMenuItem_Click(object sender, System.EventArgs e)
-		{
-			Services.UserSettings.SaveSetting( "Options.ShowCheckBoxes", 
-				ShowCheckBoxes = !checkBoxesMenuItem.Checked );
-			
-			// Temporary till we can save tree state and restore
-			//this.SetInitialExpansion();
-		}
-
-		private void UpdateCategoryFilter()
-		{
-			TestFilter catFilter;
-
-			if ( SelectedCategories == null || SelectedCategories.Length == 0 )
-				catFilter = TestFilter.Empty;
-			else
-				catFilter = new NUnit.Core.Filters.CategoryFilter( SelectedCategories );
-			if ( excludeCheckbox.Checked )
-				catFilter = new NUnit.Core.Filters.NotFilter( catFilter );
-
-			tests.CategoryFilter = catFilter;
-		}
-
-		private void tests_CheckBoxesChanged(object sender, System.EventArgs e)
-		{
-			ShowCheckBoxes = tests.CheckBoxes;
-		}
-
-		private void UserSettings_Changed(object sender, SettingsEventArgs args)
-		{
-			if ( args.SettingName == "Options.ShowCheckBoxes" )
-				this.ShowCheckBoxes = Services.UserSettings.GetSetting( args.SettingName, false );
-		}
-	}
-
-	public class SelectedTestsChangedEventArgs : EventArgs 
-	{
-		private string testName;
-		private int count;
-
-		public SelectedTestsChangedEventArgs(string testName, int count) 
-		{
-			this.testName = testName;
-			this.count = count;
-		}
-
-		public string TestName 
-		{
-			get { return testName; }
-		}
-
-		public int TestCount 
-		{
-			get { return count; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	public delegate void SelectedTestsChangedEventHandler(object sender, SelectedTestsChangedEventArgs e);
+	/// <summary>
+	/// Summary description for TestTree.
+	/// </summary>
+	public class TestTree : System.Windows.Forms.UserControl
+	{
+		#region Instance Variables
+
+		// Contains all available categories, whether
+		// selected or not. Unselected members of this
+		// list are displayed in selectedList
+		private IList availableCategories = new List<string>();
+
+		// Our test loader
+		private TestLoader loader;
+
+		private System.Windows.Forms.TabControl tabs;
+		private System.Windows.Forms.TabPage testPage;
+		private System.Windows.Forms.TabPage categoryPage;
+		private System.Windows.Forms.Panel testPanel;
+		private System.Windows.Forms.Panel categoryPanel;
+		private System.Windows.Forms.Panel treePanel;
+		private System.Windows.Forms.Panel buttonPanel;
+		private NUnit.UiKit.TestSuiteTreeView tests;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.ListBox availableList;
+		private System.Windows.Forms.GroupBox selectedCategories;
+		private System.Windows.Forms.ListBox selectedList;
+		private System.Windows.Forms.Panel categoryButtonPanel;
+		private System.Windows.Forms.Button addCategory;
+		private System.Windows.Forms.Button removeCategory;
+		private System.Windows.Forms.Button clearAllButton;
+		private System.Windows.Forms.Button checkFailedButton;
+		private System.Windows.Forms.MenuItem treeMenu;
+		private System.Windows.Forms.MenuItem checkBoxesMenuItem;
+		private System.Windows.Forms.MenuItem treeMenuSeparatorItem1;
+		private System.Windows.Forms.MenuItem expandMenuItem;
+		private System.Windows.Forms.MenuItem collapseMenuItem;
+		private System.Windows.Forms.MenuItem treeMenuSeparatorItem2;
+		private System.Windows.Forms.MenuItem expandAllMenuItem;
+		private System.Windows.Forms.MenuItem collapseAllMenuItem;
+		private System.Windows.Forms.MenuItem hideTestsMenuItem;
+		private System.Windows.Forms.MenuItem treeMenuSeparatorItem3;
+		private System.Windows.Forms.MenuItem propertiesMenuItem;
+		private System.Windows.Forms.CheckBox excludeCheckbox;
+
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		#endregion
+
+		#region Properties
+
+		public MenuItem TreeMenu 
+		{
+			get { return treeMenu; }
+		}
+
+		public string[] SelectedCategories
+		{
+			get
+			{
+				int n = this.selectedList.Items.Count;
+				string[] categories = new string[n];
+				for( int i = 0; i < n; i++ )
+					categories[i] = this.selectedList.Items[i].ToString();
+				return categories;
+			}
+		}
+
+		[Browsable(false)]
+		public bool ShowCheckBoxes
+		{
+			get { return tests.CheckBoxes; }
+			set 
+			{ 
+				tests.CheckBoxes = value;
+				buttonPanel.Visible	= value;
+				clearAllButton.Visible = value;
+				checkFailedButton.Visible = value;
+				checkBoxesMenuItem.Checked = value;
+			}
+		}
+		#endregion
+
+		#region Construction and Initialization
+
+		public TestTree()
+		{
+			// This call is required by the Windows.Forms Form Designer.
+			InitializeComponent();
+			treeMenu = new MenuItem();
+			this.checkBoxesMenuItem = new System.Windows.Forms.MenuItem();
+			this.treeMenuSeparatorItem1 = new System.Windows.Forms.MenuItem();
+			this.expandMenuItem = new System.Windows.Forms.MenuItem();
+			this.collapseMenuItem = new System.Windows.Forms.MenuItem();
+			this.treeMenuSeparatorItem2 = new System.Windows.Forms.MenuItem();
+			this.expandAllMenuItem = new System.Windows.Forms.MenuItem();
+			this.collapseAllMenuItem = new System.Windows.Forms.MenuItem();
+			this.hideTestsMenuItem = new System.Windows.Forms.MenuItem();
+			this.treeMenuSeparatorItem3 = new System.Windows.Forms.MenuItem();
+			this.propertiesMenuItem = new System.Windows.Forms.MenuItem();
+
+			// 
+			// treeMenu
+			// 
+			this.treeMenu.MergeType = MenuMerge.Add;
+			this.treeMenu.MergeOrder = 1;
+			this.treeMenu.MenuItems.AddRange(
+				new System.Windows.Forms.MenuItem[] 
+				{
+					this.checkBoxesMenuItem,
+					this.treeMenuSeparatorItem1,
+					this.expandMenuItem,
+					this.collapseMenuItem,
+					this.treeMenuSeparatorItem2,
+					this.expandAllMenuItem,
+					this.collapseAllMenuItem,
+					this.hideTestsMenuItem,
+					this.treeMenuSeparatorItem3,
+					this.propertiesMenuItem 
+				} );
+			this.treeMenu.Text = "&Tree";
+			this.treeMenu.Visible = false;
+			this.treeMenu.Popup += new System.EventHandler(this.treeMenu_Popup);
+			// 
+			// checkBoxesMenuItem
+			// 
+			this.checkBoxesMenuItem.Index = 0;
+			this.checkBoxesMenuItem.Text = "Show Check&Boxes";
+			this.checkBoxesMenuItem.Click += new System.EventHandler(this.checkBoxesMenuItem_Click);
+			// 
+			// treeMenuSeparatorItem1
+			// 
+			this.treeMenuSeparatorItem1.Index = 1;
+			this.treeMenuSeparatorItem1.Text = "-";
+			// 
+			// expandMenuItem
+			// 
+			this.expandMenuItem.Index = 2;
+			this.expandMenuItem.Text = "&Expand";
+			this.expandMenuItem.Click += new System.EventHandler(this.expandMenuItem_Click);
+			// 
+			// collapseMenuItem
+			// 
+			this.collapseMenuItem.Index = 3;
+			this.collapseMenuItem.Text = "&Collapse";
+			this.collapseMenuItem.Click += new System.EventHandler(this.collapseMenuItem_Click);
+			// 
+			// treeMenuSeparatorItem2
+			// 
+			this.treeMenuSeparatorItem2.Index = 4;
+			this.treeMenuSeparatorItem2.Text = "-";
+			// 
+			// expandAllMenuItem
+			// 
+			this.expandAllMenuItem.Index = 5;
+			this.expandAllMenuItem.Text = "Expand All";
+			this.expandAllMenuItem.Click += new System.EventHandler(this.expandAllMenuItem_Click);
+			// 
+			// collapseAllMenuItem
+			// 
+			this.collapseAllMenuItem.Index = 6;
+			this.collapseAllMenuItem.Text = "Collapse All";
+			this.collapseAllMenuItem.Click += new System.EventHandler(this.collapseAllMenuItem_Click);
+			// 
+			// hideTestsMenuItem
+			// 
+			this.hideTestsMenuItem.Index = 7;
+			this.hideTestsMenuItem.Text = "Hide Tests";
+			this.hideTestsMenuItem.Click += new System.EventHandler(this.hideTestsMenuItem_Click);
+			// 
+			// treeMenuSeparatorItem3
+			// 
+			this.treeMenuSeparatorItem3.Index = 8;
+			this.treeMenuSeparatorItem3.Text = "-";
+			// 
+			// propertiesMenuItem
+			// 
+			this.propertiesMenuItem.Index = 9;
+			this.propertiesMenuItem.Text = "&Properties";
+			this.propertiesMenuItem.Click += new System.EventHandler(this.propertiesMenuItem_Click);
+
+
+			tests.SelectedTestChanged += new SelectedTestChangedHandler(tests_SelectedTestChanged);
+			tests.CheckedTestChanged += new CheckedTestChangedHandler(tests_CheckedTestChanged);
+
+			this.excludeCheckbox.Enabled = false;
+		}
+
+		protected override void OnLoad(EventArgs e)
+		{
+			if ( !this.DesignMode )
+			{
+				this.ShowCheckBoxes = 
+					Services.UserSettings.GetSetting( "Options.ShowCheckBoxes", false );
+				Initialize( Services.TestLoader );
+				Services.UserSettings.Changed += new SettingsEventHandler(UserSettings_Changed);
+			}
+
+			base.OnLoad (e);
+		}
+
+		public void Initialize(TestLoader loader) 
+		{
+			this.tests.Initialize(loader, loader.Events);
+			this.loader = loader;
+			loader.Events.TestLoaded += new NUnit.Util.TestEventHandler(events_TestLoaded);
+			loader.Events.TestReloaded += new NUnit.Util.TestEventHandler(events_TestReloaded);
+			loader.Events.TestUnloaded += new NUnit.Util.TestEventHandler(events_TestUnloaded);
+		}
+
+		public void SelectCategories( string[] categories, bool exclude )
+		{
+			foreach( string category in categories )
+			{
+				if ( availableCategories.Contains( category ) )
+				{
+					if (!selectedList.Items.Contains(category))
+					{
+						selectedList.Items.Add(category);
+					}
+					availableList.Items.Remove( category );
+
+					this.excludeCheckbox.Checked = exclude;
+				}
+			}
+
+			UpdateCategoryFilter();
+			if (this.SelectedCategories.Length > 0)
+				this.excludeCheckbox.Enabled = true;
+		}
+
+		/// <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 View Menu Handlers
+
+		private void treeMenu_Popup(object sender, System.EventArgs e)
+		{
+			TreeNode selectedNode = tests.SelectedNode;
+			if ( selectedNode != null && selectedNode.Nodes.Count > 0 )
+			{
+				bool isExpanded = selectedNode.IsExpanded;
+				collapseMenuItem.Enabled = isExpanded;
+				expandMenuItem.Enabled = !isExpanded;		
+			}
+			else
+			{
+				collapseMenuItem.Enabled = expandMenuItem.Enabled = false;
+			}
+		}
+
+		private void collapseMenuItem_Click(object sender, System.EventArgs e)
+		{
+			tests.SelectedNode.Collapse();
+		}
+
+		private void expandMenuItem_Click(object sender, System.EventArgs e)
+		{
+			tests.SelectedNode.Expand();
+		}
+
+		private void collapseAllMenuItem_Click(object sender, System.EventArgs e)
+		{
+			tests.BeginUpdate();
+			tests.CollapseAll();
+			tests.EndUpdate();
+
+			// Compensate for a bug in the underlying control
+			if ( tests.Nodes.Count > 0 )
+				tests.SelectedNode = tests.Nodes[0];	
+		}
+
+		private void hideTestsMenuItem_Click(object sender, System.EventArgs e)
+		{
+			tests.HideTests();
+		}
+
+		private void expandAllMenuItem_Click(object sender, System.EventArgs e)
+		{
+			tests.BeginUpdate();
+			tests.ExpandAll();
+			tests.EndUpdate();
+		}
+
+		private void propertiesMenuItem_Click(object sender, System.EventArgs e)
+		{
+			if ( tests.SelectedTest != null )
+				tests.ShowPropertiesDialog( tests.SelectedTest );
+		}
+
+		#endregion
+
+		#region Component Designer generated code
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.tabs = new System.Windows.Forms.TabControl();
+			this.testPage = new System.Windows.Forms.TabPage();
+			this.testPanel = new System.Windows.Forms.Panel();
+			this.treePanel = new System.Windows.Forms.Panel();
+			this.tests = new NUnit.UiKit.TestSuiteTreeView();
+			this.buttonPanel = new System.Windows.Forms.Panel();
+			this.checkFailedButton = new System.Windows.Forms.Button();
+			this.clearAllButton = new System.Windows.Forms.Button();
+			this.categoryPage = new System.Windows.Forms.TabPage();
+			this.categoryPanel = new System.Windows.Forms.Panel();
+			this.categoryButtonPanel = new System.Windows.Forms.Panel();
+			this.removeCategory = new System.Windows.Forms.Button();
+			this.addCategory = new System.Windows.Forms.Button();
+			this.selectedCategories = new System.Windows.Forms.GroupBox();
+			this.selectedList = new System.Windows.Forms.ListBox();
+			this.excludeCheckbox = new System.Windows.Forms.CheckBox();
+			this.groupBox1 = new System.Windows.Forms.GroupBox();
+			this.availableList = new System.Windows.Forms.ListBox();
+			this.tabs.SuspendLayout();
+			this.testPage.SuspendLayout();
+			this.testPanel.SuspendLayout();
+			this.treePanel.SuspendLayout();
+			this.buttonPanel.SuspendLayout();
+			this.categoryPage.SuspendLayout();
+			this.categoryPanel.SuspendLayout();
+			this.categoryButtonPanel.SuspendLayout();
+			this.selectedCategories.SuspendLayout();
+			this.groupBox1.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// tabs
+			// 
+			this.tabs.Alignment = System.Windows.Forms.TabAlignment.Left;
+			this.tabs.Controls.Add(this.testPage);
+			this.tabs.Controls.Add(this.categoryPage);
+			this.tabs.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.tabs.Location = new System.Drawing.Point(0, 0);
+			this.tabs.Multiline = true;
+			this.tabs.Name = "tabs";
+			this.tabs.SelectedIndex = 0;
+			this.tabs.Size = new System.Drawing.Size(248, 496);
+			this.tabs.TabIndex = 0;
+			// 
+			// testPage
+			// 
+			this.testPage.Controls.Add(this.testPanel);
+			this.testPage.Location = new System.Drawing.Point(25, 4);
+			this.testPage.Name = "testPage";
+			this.testPage.Size = new System.Drawing.Size(219, 488);
+			this.testPage.TabIndex = 0;
+			this.testPage.Text = "Tests";
+			// 
+			// testPanel
+			// 
+			this.testPanel.Controls.Add(this.treePanel);
+			this.testPanel.Controls.Add(this.buttonPanel);
+			this.testPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.testPanel.Location = new System.Drawing.Point(0, 0);
+			this.testPanel.Name = "testPanel";
+			this.testPanel.Size = new System.Drawing.Size(219, 488);
+			this.testPanel.TabIndex = 0;
+			// 
+			// treePanel
+			// 
+			this.treePanel.Controls.Add(this.tests);
+			this.treePanel.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.treePanel.Location = new System.Drawing.Point(0, 0);
+			this.treePanel.Name = "treePanel";
+			this.treePanel.Size = new System.Drawing.Size(219, 448);
+			this.treePanel.TabIndex = 0;
+			// 
+			// tests
+			// 
+			this.tests.AllowDrop = true;
+			this.tests.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.tests.HideSelection = false;
+			this.tests.Location = new System.Drawing.Point(0, 0);
+			this.tests.Name = "tests";
+			this.tests.Size = new System.Drawing.Size(219, 448);
+			this.tests.TabIndex = 0;
+			this.tests.CheckBoxesChanged += new System.EventHandler(this.tests_CheckBoxesChanged);
+			// 
+			// buttonPanel
+			// 
+			this.buttonPanel.Controls.Add(this.checkFailedButton);
+			this.buttonPanel.Controls.Add(this.clearAllButton);
+			this.buttonPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.buttonPanel.Location = new System.Drawing.Point(0, 448);
+			this.buttonPanel.Name = "buttonPanel";
+			this.buttonPanel.Size = new System.Drawing.Size(219, 40);
+			this.buttonPanel.TabIndex = 1;
+			// 
+			// checkFailedButton
+			// 
+			this.checkFailedButton.Anchor = System.Windows.Forms.AnchorStyles.Top;
+			this.checkFailedButton.Location = new System.Drawing.Point(117, 8);
+			this.checkFailedButton.Name = "checkFailedButton";
+			this.checkFailedButton.Size = new System.Drawing.Size(96, 23);
+			this.checkFailedButton.TabIndex = 1;
+			this.checkFailedButton.Text = "Check Failed";
+			this.checkFailedButton.Click += new System.EventHandler(this.checkFailedButton_Click);
+			// 
+			// clearAllButton
+			// 
+			this.clearAllButton.Anchor = System.Windows.Forms.AnchorStyles.Top;
+			this.clearAllButton.Location = new System.Drawing.Point(13, 8);
+			this.clearAllButton.Name = "clearAllButton";
+			this.clearAllButton.Size = new System.Drawing.Size(96, 23);
+			this.clearAllButton.TabIndex = 0;
+			this.clearAllButton.Text = "Clear All";
+			this.clearAllButton.Click += new System.EventHandler(this.clearAllButton_Click);
+			// 
+			// categoryPage
+			// 
+			this.categoryPage.Controls.Add(this.categoryPanel);
+			this.categoryPage.Location = new System.Drawing.Point(25, 4);
+			this.categoryPage.Name = "categoryPage";
+			this.categoryPage.Size = new System.Drawing.Size(219, 488);
+			this.categoryPage.TabIndex = 1;
+			this.categoryPage.Text = "Categories";
+			// 
+			// categoryPanel
+			// 
+			this.categoryPanel.Controls.Add(this.categoryButtonPanel);
+			this.categoryPanel.Controls.Add(this.selectedCategories);
+			this.categoryPanel.Controls.Add(this.groupBox1);
+			this.categoryPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.categoryPanel.Location = new System.Drawing.Point(0, 0);
+			this.categoryPanel.Name = "categoryPanel";
+			this.categoryPanel.Size = new System.Drawing.Size(219, 488);
+			this.categoryPanel.TabIndex = 0;
+			// 
+			// categoryButtonPanel
+			// 
+			this.categoryButtonPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.categoryButtonPanel.Controls.Add(this.removeCategory);
+			this.categoryButtonPanel.Controls.Add(this.addCategory);
+			this.categoryButtonPanel.Location = new System.Drawing.Point(8, 280);
+			this.categoryButtonPanel.Name = "categoryButtonPanel";
+			this.categoryButtonPanel.Size = new System.Drawing.Size(203, 40);
+			this.categoryButtonPanel.TabIndex = 1;
+			// 
+			// removeCategory
+			// 
+			this.removeCategory.Anchor = System.Windows.Forms.AnchorStyles.Top;
+			this.removeCategory.Location = new System.Drawing.Point(109, 8);
+			this.removeCategory.Name = "removeCategory";
+			this.removeCategory.TabIndex = 1;
+			this.removeCategory.Text = "Remove";
+			this.removeCategory.Click += new System.EventHandler(this.removeCategory_Click);
+			// 
+			// addCategory
+			// 
+			this.addCategory.Anchor = System.Windows.Forms.AnchorStyles.Top;
+			this.addCategory.Location = new System.Drawing.Point(21, 8);
+			this.addCategory.Name = "addCategory";
+			this.addCategory.TabIndex = 0;
+			this.addCategory.Text = "Add";
+			this.addCategory.Click += new System.EventHandler(this.addCategory_Click);
+			// 
+			// selectedCategories
+			// 
+			this.selectedCategories.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.selectedCategories.Controls.Add(this.selectedList);
+			this.selectedCategories.Controls.Add(this.excludeCheckbox);
+			this.selectedCategories.Location = new System.Drawing.Point(8, 328);
+			this.selectedCategories.Name = "selectedCategories";
+			this.selectedCategories.Size = new System.Drawing.Size(203, 144);
+			this.selectedCategories.TabIndex = 2;
+			this.selectedCategories.TabStop = false;
+			this.selectedCategories.Text = "Selected Categories";
+			// 
+			// selectedList
+			// 
+			this.selectedList.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.selectedList.ItemHeight = 16;
+			this.selectedList.Location = new System.Drawing.Point(8, 16);
+			this.selectedList.Name = "selectedList";
+			this.selectedList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
+			this.selectedList.Size = new System.Drawing.Size(187, 84);
+			this.selectedList.TabIndex = 0;
+			this.selectedList.DoubleClick += new System.EventHandler(this.removeCategory_Click);
+			// 
+			// excludeCheckbox
+			// 
+			this.excludeCheckbox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.excludeCheckbox.Location = new System.Drawing.Point(8, 120);
+			this.excludeCheckbox.Name = "excludeCheckbox";
+			this.excludeCheckbox.Size = new System.Drawing.Size(179, 16);
+			this.excludeCheckbox.TabIndex = 1;
+			this.excludeCheckbox.Text = "Exclude these categories";
+			this.excludeCheckbox.CheckedChanged += new System.EventHandler(this.excludeCheckbox_CheckedChanged);
+			// 
+			// 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.Controls.Add(this.availableList);
+			this.groupBox1.Location = new System.Drawing.Point(8, 0);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size(203, 272);
+			this.groupBox1.TabIndex = 0;
+			this.groupBox1.TabStop = false;
+			this.groupBox1.Text = "Available Categories";
+			// 
+			// availableList
+			// 
+			this.availableList.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.availableList.ItemHeight = 16;
+			this.availableList.Location = new System.Drawing.Point(8, 24);
+			this.availableList.Name = "availableList";
+			this.availableList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
+			this.availableList.Size = new System.Drawing.Size(187, 244);
+			this.availableList.TabIndex = 0;
+			this.availableList.DoubleClick += new System.EventHandler(this.addCategory_Click);
+			// 
+			// TestTree
+			// 
+			this.Controls.Add(this.tabs);
+			this.Name = "TestTree";
+			this.Size = new System.Drawing.Size(248, 496);
+			this.tabs.ResumeLayout(false);
+			this.testPage.ResumeLayout(false);
+			this.testPanel.ResumeLayout(false);
+			this.treePanel.ResumeLayout(false);
+			this.buttonPanel.ResumeLayout(false);
+			this.categoryPage.ResumeLayout(false);
+			this.categoryPanel.ResumeLayout(false);
+			this.categoryButtonPanel.ResumeLayout(false);
+			this.selectedCategories.ResumeLayout(false);
+			this.groupBox1.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region SelectedTestsChanged Event
+
+		public event SelectedTestsChangedEventHandler SelectedTestsChanged;
+
+		#endregion
+
+
+        public void RunAllTests()
+        {
+            RunAllTests(true);
+        }
+
+		public void RunAllTests(bool ignoreTests)
+		{
+			tests.RunAllTests(ignoreTests);
+		}
+
+		public void RunSelectedTests()
+		{
+			tests.RunSelectedTests();
+		}
+
+		public void RunFailedTests()
+		{
+			tests.RunFailedTests();
+		}
+
+		private void addCategory_Click(object sender, System.EventArgs e)
+		{
+			if (availableList.SelectedItems.Count > 0) 
+			{
+                // 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);
+				}
+
+				UpdateCategoryFilter();
+				if (this.SelectedCategories.Length > 0)
+					this.excludeCheckbox.Enabled = true;
+			}
+		}
+
+		private void removeCategory_Click(object sender, System.EventArgs e)
+		{
+			if (selectedList.SelectedItems.Count > 0) 
+			{
+                // 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);
+					availableList.Items.Add(category);
+				}
+
+				UpdateCategoryFilter();
+				if (this.SelectedCategories.Length == 0)
+				{
+					this.excludeCheckbox.Checked = false;
+					this.excludeCheckbox.Enabled = false;
+				}
+			}
+		}
+
+		private void clearAllButton_Click(object sender, System.EventArgs e)
+		{
+			tests.ClearCheckedNodes();
+		}
+
+		private void checkFailedButton_Click(object sender, System.EventArgs e)
+		{
+			tests.CheckFailedNodes();
+		}
+
+		private void tests_SelectedTestChanged(ITest test)
+		{
+			if (SelectedTestsChanged != null) 
+			{
+				SelectedTestsChangedEventArgs args = new SelectedTestsChangedEventArgs(test.TestName.Name, test.TestCount);
+				SelectedTestsChanged(tests, args);
+			}
+		}
+
+		private void events_TestLoaded(object sender, NUnit.Util.TestEventArgs args)
+		{			
+			treeMenu.Visible = true;
+
+			availableCategories = this.loader.GetCategories();
+			availableList.Items.Clear();
+			selectedList.Items.Clear();
+			
+			availableList.SuspendLayout();
+			foreach (string category in availableCategories) 
+				availableList.Items.Add(category);
+
+			// tree may have restored visual state
+			if( !tests.CategoryFilter.IsEmpty )
+			{
+				ITestFilter filter = tests.CategoryFilter;
+				if ( filter is NUnit.Core.Filters.NotFilter )
+				{
+					filter = ((NUnit.Core.Filters.NotFilter)filter).BaseFilter;
+					this.excludeCheckbox.Checked = true;
+				}
+
+				foreach( string cat in ((NUnit.Core.Filters.CategoryFilter)filter).Categories )
+					if ( this.availableCategories.Contains( cat ) )
+					{
+						this.availableList.Items.Remove( cat );
+						this.selectedList.Items.Add( cat );
+						this.excludeCheckbox.Enabled = true;
+					}
+
+				UpdateCategoryFilter();
+			}
+
+			availableList.ResumeLayout();
+		}
+
+		private void events_TestReloaded(object sender, NUnit.Util.TestEventArgs args)
+		{
+			// Get new list of available categories
+			availableCategories = this.loader.GetCategories();
+
+			// Remove any selected items that are no longer available
+			int index = selectedList.Items.Count;
+			selectedList.SuspendLayout();
+			while( --index >= 0 )
+			{
+				string category = selectedList.Items[index].ToString();
+				if ( !availableCategories.Contains( category )  )
+					selectedList.Items.RemoveAt( index );
+			}
+			selectedList.ResumeLayout();
+
+            // Clear check box if there are no more selected items.
+            if (selectedList.Items.Count == 0)
+                excludeCheckbox.Checked = excludeCheckbox.Enabled = false;
+
+            // Put any unselected available items on availableList
+			availableList.Items.Clear();
+			availableList.SuspendLayout();
+			foreach( string category in availableCategories )
+				if( selectedList.FindStringExact( category ) < 0 )
+					availableList.Items.Add( category );
+			availableList.ResumeLayout();
+
+			// Tell the tree what is selected
+			UpdateCategoryFilter();
+		}
+
+		private void excludeCheckbox_CheckedChanged(object sender, System.EventArgs e)
+		{
+			UpdateCategoryFilter();
+		}
+
+		private void events_TestUnloaded(object sender, NUnit.Util.TestEventArgs args)
+		{
+			availableCategories.Clear();
+			availableList.Items.Clear();
+			selectedList.Items.Clear();
+			excludeCheckbox.Checked = false;
+			excludeCheckbox.Enabled = false;
+			treeMenu.Visible = false;
+		}
+
+		private void tests_CheckedTestChanged(ITest[] tests)
+		{
+			if (SelectedTestsChanged != null) 
+			{
+				SelectedTestsChangedEventArgs args = new SelectedTestsChangedEventArgs("", tests.Length);
+				SelectedTestsChanged(tests, args);
+			}
+
+			if (tests.Length > 0) 
+			{
+			}
+		}
+
+		private void checkBoxesMenuItem_Click(object sender, System.EventArgs e)
+		{
+			Services.UserSettings.SaveSetting( "Options.ShowCheckBoxes", 
+				ShowCheckBoxes = !checkBoxesMenuItem.Checked );
+			
+			// Temporary till we can save tree state and restore
+			//this.SetInitialExpansion();
+		}
+
+		private void UpdateCategoryFilter()
+		{
+			TestFilter catFilter;
+
+			if ( SelectedCategories == null || SelectedCategories.Length == 0 )
+				catFilter = TestFilter.Empty;
+			else
+				catFilter = new NUnit.Core.Filters.CategoryFilter( SelectedCategories );
+
+			if ( excludeCheckbox.Checked )
+				catFilter = new NUnit.Core.Filters.NotFilter( catFilter, true );
+
+			tests.CategoryFilter = catFilter;
+		}
+
+		private void tests_CheckBoxesChanged(object sender, System.EventArgs e)
+		{
+			ShowCheckBoxes = tests.CheckBoxes;
+		}
+
+		private void UserSettings_Changed(object sender, SettingsEventArgs args)
+		{
+			if ( args.SettingName == "Options.ShowCheckBoxes" )
+				this.ShowCheckBoxes = Services.UserSettings.GetSetting( args.SettingName, false );
+		}
+	}
+
+	public class SelectedTestsChangedEventArgs : EventArgs 
+	{
+		private string testName;
+		private int count;
+
+		public SelectedTestsChangedEventArgs(string testName, int count) 
+		{
+			this.testName = testName;
+			this.count = count;
+		}
+
+		public string TestName 
+		{
+			get { return testName; }
+		}
+
+		public int TestCount 
+		{
+			get { return count; }
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/TestTree.resx b/src/GuiComponents/UiKit/TestTree.resx
index 5247cce..484ba8a 100644
--- a/src/GuiComponents/UiKit/TestTree.resx
+++ b/src/GuiComponents/UiKit/TestTree.resx
@@ -1,382 +1,382 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="tabs.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabs.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabs.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabs.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabs.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabs.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="testPage.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testPage.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="testPage.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="testPage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testPage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testPage.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="testPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="testPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="testPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="testPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treePanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="treePanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="treePanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treePanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="treePanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="treePanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tests.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tests.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tests.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="buttonPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="buttonPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="buttonPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="buttonPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="buttonPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="buttonPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="checkFailedButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="checkFailedButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="checkFailedButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="clearAllButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="clearAllButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="clearAllButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categoryPage.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="categoryPage.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="categoryPage.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="categoryPage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categoryPage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categoryPage.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="categoryPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="categoryPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="categoryPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categoryPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="categoryPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="categoryPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categoryButtonPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="categoryButtonPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="categoryButtonPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="categoryButtonPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="categoryButtonPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="categoryButtonPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="removeCategory.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="removeCategory.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="removeCategory.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addCategory.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="addCategory.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addCategory.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="selectedCategories.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="selectedCategories.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="selectedCategories.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="selectedCategories.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="selectedCategories.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="selectedCategories.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="selectedList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="selectedList.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="selectedList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="excludeCheckbox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="excludeCheckbox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="excludeCheckbox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="availableList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="availableList.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="availableList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>TestTree</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="tabs.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabs.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabs.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabs.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabs.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabs.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="testPage.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="testPage.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="testPage.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="testPage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="testPage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="testPage.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="testPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="testPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="testPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="testPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="testPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="testPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="treePanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="treePanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="treePanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="treePanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="treePanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="treePanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tests.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tests.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tests.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="buttonPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="buttonPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="buttonPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="buttonPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="buttonPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="buttonPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="checkFailedButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="checkFailedButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="checkFailedButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="clearAllButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="clearAllButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="clearAllButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="categoryPage.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="categoryPage.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="categoryPage.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="categoryPage.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="categoryPage.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="categoryPage.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="categoryPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="categoryPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="categoryPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="categoryPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="categoryPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="categoryPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="categoryButtonPanel.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="categoryButtonPanel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="categoryButtonPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="categoryButtonPanel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="categoryButtonPanel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="categoryButtonPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="removeCategory.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="removeCategory.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="removeCategory.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addCategory.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="addCategory.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addCategory.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="selectedCategories.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="selectedCategories.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="selectedCategories.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="selectedCategories.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="selectedCategories.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="selectedCategories.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="selectedList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="selectedList.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="selectedList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="excludeCheckbox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="excludeCheckbox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="excludeCheckbox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="groupBox1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="groupBox1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="groupBox1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="groupBox1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="groupBox1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="availableList.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="availableList.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="availableList.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Name">
+    <value>TestTree</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TextBoxDisplay.cs b/src/GuiComponents/UiKit/TextBoxDisplay.cs
index c81fb1b..3604b79 100644
--- a/src/GuiComponents/UiKit/TextBoxDisplay.cs
+++ b/src/GuiComponents/UiKit/TextBoxDisplay.cs
@@ -1,197 +1,197 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Windows.Forms;
-using System.Drawing;
-using System.ComponentModel;
-using NUnit.Core;
-using NUnit.Util;
-using System.Diagnostics;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// TextBoxDisplay is an adapter that allows accessing a 
-	/// System.Windows.Forms.TextBox using the TextDisplay interface.
-	/// </summary>
-	public class TextBoxDisplay : System.Windows.Forms.RichTextBox, TextDisplay, TestObserver
-	{
-		private MenuItem copyMenuItem;
-		private MenuItem selectAllMenuItem;
-		private MenuItem wordWrapMenuItem;
-		private MenuItem fontMenuItem;
-		private MenuItem increaseFontMenuItem;
-		private MenuItem decreaseFontMenuItem;
-		private MenuItem restoreFontMenuItem;
-
-		private TextDisplayContent content;
-
-		public TextBoxDisplay()
-		{
-			this.Multiline = true;
-			this.ReadOnly = true;
-			this.WordWrap = false;
-
-			this.ContextMenu = new ContextMenu();
-			this.copyMenuItem = new MenuItem( "&Copy", new EventHandler( copyMenuItem_Click ) );
-			this.selectAllMenuItem = new MenuItem( "Select &All", new EventHandler( selectAllMenuItem_Click ) );
-			this.wordWrapMenuItem = new MenuItem( "&Word Wrap", new EventHandler( wordWrapMenuItem_Click ) );
-			this.fontMenuItem = new MenuItem( "Font" );
-			this.increaseFontMenuItem = new MenuItem( "Increase", new EventHandler( increaseFontMenuItem_Click ) );
-			this.decreaseFontMenuItem = new MenuItem( "Decrease", new EventHandler( decreaseFontMenuItem_Click ) );
-			this.restoreFontMenuItem = new MenuItem( "Restore", new EventHandler( restoreFontMenuItem_Click ) );
-			this.fontMenuItem.MenuItems.AddRange( new MenuItem[] { increaseFontMenuItem, decreaseFontMenuItem, new MenuItem("-"), restoreFontMenuItem } );
-			this.ContextMenu.MenuItems.AddRange( new MenuItem[] { copyMenuItem, selectAllMenuItem, wordWrapMenuItem, fontMenuItem } );
-			this.ContextMenu.Popup += new EventHandler(ContextMenu_Popup);
-		}
-
-		private void copyMenuItem_Click(object sender, EventArgs e)
-		{
-			this.Copy();
-		}
-
-		private void selectAllMenuItem_Click(object sender, EventArgs e)
-		{
-			this.SelectAll();
-		}
-
-		private void wordWrapMenuItem_Click(object sender, EventArgs e)
-		{
-			this.WordWrap = this.wordWrapMenuItem.Checked = !this.wordWrapMenuItem.Checked;
-		}
-
-		private void increaseFontMenuItem_Click(object sender, EventArgs e)
-		{
-			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints * 1.2f, this.Font.Style ) );
-		}
-
-		private void decreaseFontMenuItem_Click(object sender, EventArgs e)
-		{
-			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints / 1.2f, this.Font.Style ) );
-		}
-
-		private void restoreFontMenuItem_Click(object sender, EventArgs e)
-		{
-			applyFont( new Font( FontFamily.GenericMonospace, 8.0f ) );
-		}
-
-		private void applyFont( Font font )
-		{
-			this.Font = font;
-			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-			Services.UserSettings.SaveSetting( "Gui.FixedFont", 
-                converter.ConvertToString( null, System.Globalization.CultureInfo.InvariantCulture, font ) );
-		}
-		
-		private void ContextMenu_Popup(object sender, EventArgs e)
-		{
-			this.copyMenuItem.Enabled = this.SelectedText != "";
-			this.selectAllMenuItem.Enabled = this.TextLength > 0;
-		}
-
-		private string pendingTestCaseLabel = null;
-		private void OnTestOutput( object sender, TestEventArgs e )
-		{
-			if ( ShouldInclude(e.TestOutput.Type) )
-			{
-				if ( pendingTestCaseLabel != null )
-				{
-					WriteLine( pendingTestCaseLabel );
-					pendingTestCaseLabel = null;
-				}
-
-				Write( e.TestOutput.Text );
-			}
-		}
-
-        // 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.Labels != TestLabelLevel.Off)
-			{
-				string label = string.Format( "***** {0}", args.TestName.FullName );
-
-				if (this.content.Labels == TestLabelLevel.On)
-					this.pendingTestCaseLabel = label;
-				else
-					WriteLine(label);
-			}
-		}
-
-		protected override void OnFontChanged(EventArgs e)
-		{
-			// Do nothing - this control uses it's own font
-		}
-
-
-		#region TextDisplay Members
-		public TextDisplayContent Content
-		{
-			get { return content; }
-			set { content = value; }
-		}
-
-		public void Write( string text )
-		{
-			this.AppendText( text );
-		}
-
-		public void Write( NUnit.Core.TestOutput output )
-		{
-			Write( output.Text );
-		}
-
-		public void WriteLine( string text )
-		{
-			Write( text + Environment.NewLine );
-		}
-
-		public string GetText()
-		{
-			return this.Text;
-		}
-		#endregion
-
-		#region TestObserver Members
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestOutput += new TestEventHandler(OnTestOutput);
-			events.TestStarting += new TestEventHandler(OnTestStarting);
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Windows.Forms;
+using System.Drawing;
+using System.ComponentModel;
+using NUnit.Core;
+using NUnit.Util;
+using System.Diagnostics;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// TextBoxDisplay is an adapter that allows accessing a 
+	/// System.Windows.Forms.TextBox using the TextDisplay interface.
+	/// </summary>
+	public class TextBoxDisplay : System.Windows.Forms.RichTextBox, TextDisplay, TestObserver
+	{
+		private MenuItem copyMenuItem;
+		private MenuItem selectAllMenuItem;
+		private MenuItem wordWrapMenuItem;
+		private MenuItem fontMenuItem;
+		private MenuItem increaseFontMenuItem;
+		private MenuItem decreaseFontMenuItem;
+		private MenuItem restoreFontMenuItem;
+
+		private TextDisplayContent content;
+
+		public TextBoxDisplay()
+		{
+			this.Multiline = true;
+			this.ReadOnly = true;
+			this.WordWrap = false;
+
+			this.ContextMenu = new ContextMenu();
+			this.copyMenuItem = new MenuItem( "&Copy", new EventHandler( copyMenuItem_Click ) );
+			this.selectAllMenuItem = new MenuItem( "Select &All", new EventHandler( selectAllMenuItem_Click ) );
+			this.wordWrapMenuItem = new MenuItem( "&Word Wrap", new EventHandler( wordWrapMenuItem_Click ) );
+			this.fontMenuItem = new MenuItem( "Font" );
+			this.increaseFontMenuItem = new MenuItem( "Increase", new EventHandler( increaseFontMenuItem_Click ) );
+			this.decreaseFontMenuItem = new MenuItem( "Decrease", new EventHandler( decreaseFontMenuItem_Click ) );
+			this.restoreFontMenuItem = new MenuItem( "Restore", new EventHandler( restoreFontMenuItem_Click ) );
+			this.fontMenuItem.MenuItems.AddRange( new MenuItem[] { increaseFontMenuItem, decreaseFontMenuItem, new MenuItem("-"), restoreFontMenuItem } );
+			this.ContextMenu.MenuItems.AddRange( new MenuItem[] { copyMenuItem, selectAllMenuItem, wordWrapMenuItem, fontMenuItem } );
+			this.ContextMenu.Popup += new EventHandler(ContextMenu_Popup);
+		}
+
+		private void copyMenuItem_Click(object sender, EventArgs e)
+		{
+			this.Copy();
+		}
+
+		private void selectAllMenuItem_Click(object sender, EventArgs e)
+		{
+			this.SelectAll();
+		}
+
+		private void wordWrapMenuItem_Click(object sender, EventArgs e)
+		{
+			this.WordWrap = this.wordWrapMenuItem.Checked = !this.wordWrapMenuItem.Checked;
+		}
+
+		private void increaseFontMenuItem_Click(object sender, EventArgs e)
+		{
+			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints * 1.2f, this.Font.Style ) );
+		}
+
+		private void decreaseFontMenuItem_Click(object sender, EventArgs e)
+		{
+			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints / 1.2f, this.Font.Style ) );
+		}
+
+		private void restoreFontMenuItem_Click(object sender, EventArgs e)
+		{
+			applyFont( new Font( FontFamily.GenericMonospace, 8.0f ) );
+		}
+
+		private void applyFont( Font font )
+		{
+			this.Font = font;
+			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
+			Services.UserSettings.SaveSetting( "Gui.FixedFont", 
+                converter.ConvertToString( null, System.Globalization.CultureInfo.InvariantCulture, font ) );
+		}
+		
+		private void ContextMenu_Popup(object sender, EventArgs e)
+		{
+			this.copyMenuItem.Enabled = this.SelectedText != "";
+			this.selectAllMenuItem.Enabled = this.TextLength > 0;
+		}
+
+		private string pendingTestCaseLabel = null;
+		private void OnTestOutput( object sender, TestEventArgs e )
+		{
+			if ( ShouldInclude(e.TestOutput.Type) )
+			{
+				if ( pendingTestCaseLabel != null )
+				{
+					WriteLine( pendingTestCaseLabel );
+					pendingTestCaseLabel = null;
+				}
+
+				Write( e.TestOutput.Text );
+			}
+		}
+
+        // 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.Labels != TestLabelLevel.Off)
+			{
+				string label = string.Format( "***** {0}", args.TestName.FullName );
+
+				if (this.content.Labels == TestLabelLevel.On)
+					this.pendingTestCaseLabel = label;
+				else
+					WriteLine(label);
+			}
+		}
+
+		protected override void OnFontChanged(EventArgs e)
+		{
+			// Do nothing - this control uses it's own font
+		}
+
+
+		#region TextDisplay Members
+		public TextDisplayContent Content
+		{
+			get { return content; }
+			set { content = value; }
+		}
+
+		public void Write( string text )
+		{
+			this.AppendText( text );
+		}
+
+		public void Write( NUnit.Core.TestOutput output )
+		{
+			Write( output.Text );
+		}
+
+		public void WriteLine( string text )
+		{
+			Write( text + Environment.NewLine );
+		}
+
+		public string GetText()
+		{
+			return this.Text;
+		}
+		#endregion
+
+		#region TestObserver Members
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestOutput += new TestEventHandler(OnTestOutput);
+			events.TestStarting += new TestEventHandler(OnTestStarting);
+		}
+		#endregion
+	}
+}
diff --git a/src/GuiComponents/UiKit/TextDisplay.cs b/src/GuiComponents/UiKit/TextDisplay.cs
index e1afbd6..f211158 100644
--- a/src/GuiComponents/UiKit/TextDisplay.cs
+++ b/src/GuiComponents/UiKit/TextDisplay.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// Copyright 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;
-using NUnit.Core;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// The TextDisplay interface is implemented by object - generally
-	/// controls - that display text.
-	/// </summary>
-	public interface TextDisplay : TestObserver
-	{
-		/// <summary>
-		///  The output types handled by this display
-		/// </summary>
-		TextDisplayContent Content { get; set; }
-
-		/// <summary>
-		/// Clears the display
-		/// </summary>
-		void Clear();
-
-		/// <summary>
-		/// Appends text to the display
-		/// </summary>
-		/// <param name="text">The text to append</param>
-		void Write( string text );
-
-		/// <summary>
-		/// Appends text to the display followed by a newline
-		/// </summary>
-		/// <param name="text">The text to append</param>
-		void WriteLine( string text );
-
-		void Write( NUnit.Core.TestOutput output );
-
-		/// <summary>
-		/// Gets the current text - used mainly for testing
-		/// </summary>
-		string GetText();
-	}
-}
+// ****************************************************************
+// Copyright 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;
+using NUnit.Core;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// The TextDisplay interface is implemented by object - generally
+	/// controls - that display text.
+	/// </summary>
+	public interface TextDisplay : TestObserver
+	{
+		/// <summary>
+		///  The output types handled by this display
+		/// </summary>
+		TextDisplayContent Content { get; set; }
+
+		/// <summary>
+		/// Clears the display
+		/// </summary>
+		void Clear();
+
+		/// <summary>
+		/// Appends text to the display
+		/// </summary>
+		/// <param name="text">The text to append</param>
+		void Write( string text );
+
+		/// <summary>
+		/// Appends text to the display followed by a newline
+		/// </summary>
+		/// <param name="text">The text to append</param>
+		void WriteLine( string text );
+
+		void Write( NUnit.Core.TestOutput output );
+
+		/// <summary>
+		/// Gets the current text - used mainly for testing
+		/// </summary>
+		string GetText();
+	}
+}
diff --git a/src/GuiComponents/UiKit/TextDisplayContent.cs b/src/GuiComponents/UiKit/TextDisplayContent.cs
index e9635b1..1f213fa 100644
--- a/src/GuiComponents/UiKit/TextDisplayContent.cs
+++ b/src/GuiComponents/UiKit/TextDisplayContent.cs
@@ -1,121 +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));
-        }
-    }
-}
+// ****************************************************************
+// 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/TextDisplayTabPage.cs b/src/GuiComponents/UiKit/TextDisplayTabPage.cs
index 0b95903..d92a8af 100644
--- a/src/GuiComponents/UiKit/TextDisplayTabPage.cs
+++ b/src/GuiComponents/UiKit/TextDisplayTabPage.cs
@@ -1,47 +1,47 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for TextDisplayTabPage.
-	/// </summary>
-	public class TextDisplayTabPage : TabPage
-	{
-		private TextBoxDisplay display;
-
-		public TextDisplayTabPage()
-		{
-			this.display = new TextBoxDisplay();
-			this.display.Dock = DockStyle.Fill;		
-			this.Controls.Add( display );
-		}
-
-		public System.Drawing.Font DisplayFont
-		{
-			get { return display.Font; }
-			set { display.Font = value; }
-		}
-
-		public TextDisplayTabPage( TextDisplayTabSettings.TabInfo tabInfo ) : this()
-		{
-			this.Name = tabInfo.Name;
-			this.Text = tabInfo.Title;
-			this.Display.Content = tabInfo.Content;
-		}
-
-		public TextDisplay Display
-		{
-			get { return this.display; }
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for TextDisplayTabPage.
+	/// </summary>
+	public class TextDisplayTabPage : TabPage
+	{
+		private TextBoxDisplay display;
+
+		public TextDisplayTabPage()
+		{
+			this.display = new TextBoxDisplay();
+			this.display.Dock = DockStyle.Fill;		
+			this.Controls.Add( display );
+		}
+
+		public System.Drawing.Font DisplayFont
+		{
+			get { return display.Font; }
+			set { display.Font = value; }
+		}
+
+		public TextDisplayTabPage( TextDisplayTabSettings.TabInfo tabInfo ) : this()
+		{
+			this.Name = tabInfo.Name;
+			this.Text = tabInfo.Title;
+			this.Display.Content = tabInfo.Content;
+		}
+
+		public TextDisplay Display
+		{
+			get { return this.display; }
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/TextDisplayTabSettings.cs b/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
index 4e81841..1f57bab 100644
--- a/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
+++ b/src/GuiComponents/UiKit/TextDisplayTabSettings.cs
@@ -1,162 +1,162 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	public class TextDisplayTabSettings
-	{
-		private TabInfoCollection tabInfo;
-		private NUnit.Util.ISettings settings;
-
-		public static readonly string Prefix = "Gui.TextOutput.";
-
-		public void LoadSettings()
-		{
-			LoadSettings( NUnit.Util.Services.UserSettings );
-		}
-
-		public void LoadSettings(NUnit.Util.ISettings settings)
-		{
-			this.settings = settings;
-
-			TabInfoCollection info = new TabInfoCollection();
-			string tabList = (string)settings.GetSetting( Prefix + "TabList" );
-
-			if ( tabList != null ) 
-			{
-				string[] tabNames = tabList.Split( new char[] { ',' } );
-				foreach( string name in tabNames )
-				{
-					string prefix = Prefix + name;
-					string text = (string)settings.GetSetting(prefix + ".Title");
-					if ( text == null )
-						break;
-
-					TabInfo tab = new TabInfo( name, text );
-
-                    tab.Content = TextDisplayContent.FromSettings(name);
-					tab.Enabled = settings.GetSetting( prefix + ".Enabled", true );
-
-					info.Add( tab );
-				}
-			}
-
-			if ( info.Count > 0 )		
-				tabInfo = info;
-			else 
-				LoadDefaults();
-		}
-
-		public void LoadDefaults()
-		{
-			tabInfo = new TabInfoCollection();
-
-            TabInfo tab = tabInfo.AddNewTab("Text Output");
-		    tab.Content = new TextDisplayContent();
-            tab.Content.Out = true;
-            tab.Content.Error = true;
-            tab.Content.Labels = TestLabelLevel.On;
-		    tab.Enabled = true;
-        }
-
-		public void ApplySettings()
-		{
-			System.Text.StringBuilder tabNames = new System.Text.StringBuilder();
-			foreach( TabInfo tab in tabInfo )
-			{
-				if ( tabNames.Length > 0 )
-					tabNames.Append(",");
-				tabNames.Append( tab.Name );
-
-				string prefix = Prefix + tab.Name;
-
-				settings.SaveSetting( prefix + ".Title", tab.Title );
-				settings.SaveSetting( prefix + ".Enabled", tab.Enabled );
-                tab.Content.SaveSettings(tab.Name);
-			}
-
-			string oldNames = settings.GetSetting( Prefix + "TabList", string.Empty );
-			settings.SaveSetting( Prefix + "TabList", tabNames.ToString() );
-
-			if (oldNames != string.Empty )
-			{
-				string[] oldTabs = oldNames.Split( new char[] { ',' } );
-				foreach( string tabName in oldTabs )
-					if ( tabInfo[tabName] == null )
-						settings.RemoveGroup( Prefix + tabName );
-			}
-		}
-
-		public TabInfoCollection Tabs
-		{
-			get { return tabInfo; }
-        }
-
-        #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 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 );
-                this.Add(tabInfo);
-				return tabInfo;
-			}
-
-			private string GetNextName()
-			{
-				for( int i = 0;;i++ )
-				{
-					string name = string.Format( "Tab{0}", i );
-					if ( this[name] == null )
-						return name;
-				}
-			}
-
-			public TabInfo this[string name]
-			{
-				get
-				{
-					foreach ( TabInfo info in this )
-						if ( info.Name == name )
-							return info;
-
-					return null;
-				}
-			}
-
-			public bool Contains( string name )
-			{
-				return this[name] != null;
-			}
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	public class TextDisplayTabSettings
+	{
+		private TabInfoCollection tabInfo;
+		private NUnit.Util.ISettings settings;
+
+		public static readonly string Prefix = "Gui.TextOutput.";
+
+		public void LoadSettings()
+		{
+			LoadSettings( NUnit.Util.Services.UserSettings );
+		}
+
+		public void LoadSettings(NUnit.Util.ISettings settings)
+		{
+			this.settings = settings;
+
+			TabInfoCollection info = new TabInfoCollection();
+			string tabList = (string)settings.GetSetting( Prefix + "TabList" );
+
+			if ( tabList != null ) 
+			{
+				string[] tabNames = tabList.Split( new char[] { ',' } );
+				foreach( string name in tabNames )
+				{
+					string prefix = Prefix + name;
+					string text = (string)settings.GetSetting(prefix + ".Title");
+					if ( text == null )
+						break;
+
+					TabInfo tab = new TabInfo( name, text );
+
+                    tab.Content = TextDisplayContent.FromSettings(name);
+					tab.Enabled = settings.GetSetting( prefix + ".Enabled", true );
+
+					info.Add( tab );
+				}
+			}
+
+			if ( info.Count > 0 )		
+				tabInfo = info;
+			else 
+				LoadDefaults();
+		}
+
+		public void LoadDefaults()
+		{
+			tabInfo = new TabInfoCollection();
+
+            TabInfo tab = tabInfo.AddNewTab("Text Output");
+		    tab.Content = new TextDisplayContent();
+            tab.Content.Out = true;
+            tab.Content.Error = true;
+            tab.Content.Labels = TestLabelLevel.On;
+		    tab.Enabled = true;
+        }
+
+		public void ApplySettings()
+		{
+			System.Text.StringBuilder tabNames = new System.Text.StringBuilder();
+			foreach( TabInfo tab in tabInfo )
+			{
+				if ( tabNames.Length > 0 )
+					tabNames.Append(",");
+				tabNames.Append( tab.Name );
+
+				string prefix = Prefix + tab.Name;
+
+				settings.SaveSetting( prefix + ".Title", tab.Title );
+				settings.SaveSetting( prefix + ".Enabled", tab.Enabled );
+                tab.Content.SaveSettings(tab.Name);
+			}
+
+			string oldNames = settings.GetSetting( Prefix + "TabList", string.Empty );
+			settings.SaveSetting( Prefix + "TabList", tabNames.ToString() );
+
+			if (oldNames != string.Empty )
+			{
+				string[] oldTabs = oldNames.Split( new char[] { ',' } );
+				foreach( string tabName in oldTabs )
+					if ( tabInfo[tabName] == null )
+						settings.RemoveGroup( Prefix + tabName );
+			}
+		}
+
+		public TabInfoCollection Tabs
+		{
+			get { return tabInfo; }
+        }
+
+        #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 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 );
+                this.Add(tabInfo);
+				return tabInfo;
+			}
+
+			private string GetNextName()
+			{
+				for( int i = 0;;i++ )
+				{
+					string name = string.Format( "Tab{0}", i );
+					if ( this[name] == null )
+						return name;
+				}
+			}
+
+			public TabInfo this[string name]
+			{
+				get
+				{
+					foreach ( TabInfo info in this )
+						if ( info.Name == name )
+							return info;
+
+					return null;
+				}
+			}
+
+			public bool Contains( string name )
+			{
+				return this[name] != null;
+			}
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiComponents/UiKit/TextDisplayWriter.cs b/src/GuiComponents/UiKit/TextDisplayWriter.cs
index 2e8877a..2a07bb9 100644
--- a/src/GuiComponents/UiKit/TextDisplayWriter.cs
+++ b/src/GuiComponents/UiKit/TextDisplayWriter.cs
@@ -1,83 +1,83 @@
-// ****************************************************************
-// Copyright 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 NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// Summary description for TextDisplayWriter.
-	/// </summary>
-	public class TextDisplayWriter : TextWriter, TestObserver
-	{
-		private TextDisplay textDisplay;
-
-		public TextDisplayWriter( TextDisplay textDisplay )
-		{
-			this.textDisplay = textDisplay;
-		}
-
-		public void Clear()
-		{
-			textDisplay.Clear();
-		}
-
-		#region TextWriter Overrides
-
-		/// <summary>
-		/// Write a single char
-		/// </summary>
-		/// <param name="c">The char to write</param>
-		public override void Write(char c)
-		{
-			Write( c.ToString() );
-		}
-
-		/// <summary>
-		/// Write a string
-		/// </summary>
-		/// <param name="s">The string to write</param>
-		public override void Write(String s)
-		{
-			textDisplay.Write( s );
-		}
-
-		/// <summary>
-		/// Write a string followed by a newline.
-		/// </summary>
-		/// <param name="s">The string to write</param>
-		public override void WriteLine(string s)
-		{
-			Write( s + Environment.NewLine );
-		}
-
-		/// <summary>
-		/// The encoding in use for this TextWriter.
-		/// </summary>
-		public override Encoding Encoding
-		{
-			get { return Encoding.Default; }
-		}
-		#endregion
-
-		#region TestObserver Members
-
-		public void Subscribe(ITestEvents events)
-		{
-			events.TestOutput += new TestEventHandler(OnTestOutput);
-		}
-
-		#endregion
-
-		private void OnTestOutput(object sender, TestEventArgs args)
-		{
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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 NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// Summary description for TextDisplayWriter.
+	/// </summary>
+	public class TextDisplayWriter : TextWriter, TestObserver
+	{
+		private TextDisplay textDisplay;
+
+		public TextDisplayWriter( TextDisplay textDisplay )
+		{
+			this.textDisplay = textDisplay;
+		}
+
+		public void Clear()
+		{
+			textDisplay.Clear();
+		}
+
+		#region TextWriter Overrides
+
+		/// <summary>
+		/// Write a single char
+		/// </summary>
+		/// <param name="c">The char to write</param>
+		public override void Write(char c)
+		{
+			Write( c.ToString() );
+		}
+
+		/// <summary>
+		/// Write a string
+		/// </summary>
+		/// <param name="s">The string to write</param>
+		public override void Write(String s)
+		{
+			textDisplay.Write( s );
+		}
+
+		/// <summary>
+		/// Write a string followed by a newline.
+		/// </summary>
+		/// <param name="s">The string to write</param>
+		public override void WriteLine(string s)
+		{
+			Write( s + Environment.NewLine );
+		}
+
+		/// <summary>
+		/// The encoding in use for this TextWriter.
+		/// </summary>
+		public override Encoding Encoding
+		{
+			get { return Encoding.Default; }
+		}
+		#endregion
+
+		#region TestObserver Members
+
+		public void Subscribe(ITestEvents events)
+		{
+			events.TestOutput += new TestEventHandler(OnTestOutput);
+		}
+
+		#endregion
+
+		private void OnTestOutput(object sender, TestEventArgs args)
+		{
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/TextOutputSettingsPage.cs b/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
index eb61c45..c1b7b6f 100644
--- a/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
+++ b/src/GuiComponents/UiKit/TextOutputSettingsPage.cs
@@ -1,425 +1,425 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.UiKit;
-using NUnit.Util;
-using System.Diagnostics;
-
-namespace NUnit.UiKit
-{
-	public class TextOutputSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Label label2;
-        private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.CheckBox showStandardOutput;
-        private System.Windows.Forms.CheckBox showErrorOutput;
-		private System.Windows.Forms.ComboBox tabSelectComboBox;
-        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 Label label6;
-        private ComboBox logLevelComboBox;
-        private Label label3;
-        private ComboBox labelsComboBox;
-        private CheckBox showTraceOutput;
-		private int selectedTabIndex = -1;
-
-		public TextOutputSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-            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>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            this.label1 = new System.Windows.Forms.Label();
-            this.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
-
-		public override void LoadSettings()
-		{
-			tabSettings.LoadSettings(settings);
-			InitializeTabSelectComboBox();
-		}
-
-		private void InitializeTabSelectComboBox()
-		{
-			FillTabSelectComboBox();
-
-			if ( this.tabSelectComboBox.Items.Count > 0 )
-			{
-				this.tabSelectComboBox.SelectedIndex = this.selectedTabIndex = 0;
-				this.InitDisplay(tabSettings.Tabs[0]);
-			}
-		}
-
-		private void FillTabSelectComboBox()
-		{
-			tabSelectComboBox.Items.Clear();
-
-			foreach( TextDisplayTabSettings.TabInfo tabInfo in this.tabSettings.Tabs )
-				this.tabSelectComboBox.Items.Add( tabInfo.Title );
-
-			tabSelectComboBox.Items.Add( "<New...>" );
-			tabSelectComboBox.Items.Add( "<Edit...>" );
-		}
-
-		public override void ApplySettings()
-		{
-			tabSettings.ApplySettings();
-		}
-
-		private void button1_Click(object sender, System.EventArgs e)
-		{
-			tabSettings.LoadDefaults();
-			InitializeTabSelectComboBox();
-		}
-
-		private void InitDisplay(TextDisplayTabSettings.TabInfo tabInfo)
-		{
-			textBox1.Text = tabInfo.Title;
-
-			TextDisplayContent content = tabInfo.Content;
-            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;
-		}
-
-		private void tabSelectComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			int index = tabSelectComboBox.SelectedIndex;
-			if ( index < tabSettings.Tabs.Count )
-			{
-				selectedTabIndex = index;
-				InitDisplay(tabSettings.Tabs[index]);
-			}
-			else // Not a tab, but a "menu" item
-			{
-				tabSelectComboBox.SelectedIndex = selectedTabIndex;
-
-				if ( index == tabSettings.Tabs.Count )
-					addNewTabPage();
-				else
-					editTabPages();
-			}
-		}
-
-		private void addNewTabPage()
-		{
-			using( AddTabPageDialog dlg = new AddTabPageDialog(tabSettings) )
-			{
-				this.ParentForm.Site.Container.Add( dlg );
-				if ( dlg.ShowDialog(this) == DialogResult.OK )
-				{
-					FillTabSelectComboBox();
-					this.tabSelectComboBox.SelectedIndex = tabSettings.Tabs.Count - 1;
-				}
-			}
-		}
-
-		private void editTabPages()
-		{
-			using( EditTabPagesDialog dlg = new EditTabPagesDialog( tabSettings) )
-			{
-				this.ParentForm.Site.Container.Add( dlg );
-				dlg.ShowDialog(this);
-
-				FillTabSelectComboBox();
-					
-				if ( tabSelectComboBox.Items.Count > 0 )
-					tabSelectComboBox.SelectedIndex = selectedTabIndex = 0;
-			}
-		}
-
-		private void showStandardOutput_CheckedChanged(object sender, System.EventArgs e)
-		{
-            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Out = showStandardOutput.Checked;
-        }
-
-		private void showErrorOutput_CheckedChanged(object sender, System.EventArgs e)
-		{
-            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Error = showErrorOutput.Checked;
-        }
-
-		private void textBox1_TextChanged(object sender, System.EventArgs e)
-		{
-			tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Title = textBox1.Text;
-		}
-
-		private void displayTab_CheckedChanged(object sender, System.EventArgs e)
-		{
-			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;
-        }
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Core;
+using NUnit.UiKit;
+using NUnit.Util;
+using System.Diagnostics;
+
+namespace NUnit.UiKit
+{
+	public class TextOutputSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.CheckBox showStandardOutput;
+        private System.Windows.Forms.CheckBox showErrorOutput;
+		private System.Windows.Forms.ComboBox tabSelectComboBox;
+        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 Label label6;
+        private ComboBox logLevelComboBox;
+        private Label label3;
+        private ComboBox labelsComboBox;
+        private CheckBox showTraceOutput;
+		private int selectedTabIndex = -1;
+
+		public TextOutputSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+            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>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.label1 = new System.Windows.Forms.Label();
+            this.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
+
+		public override void LoadSettings()
+		{
+			tabSettings.LoadSettings(settings);
+			InitializeTabSelectComboBox();
+		}
+
+		private void InitializeTabSelectComboBox()
+		{
+			FillTabSelectComboBox();
+
+			if ( this.tabSelectComboBox.Items.Count > 0 )
+			{
+				this.tabSelectComboBox.SelectedIndex = this.selectedTabIndex = 0;
+				this.InitDisplay(tabSettings.Tabs[0]);
+			}
+		}
+
+		private void FillTabSelectComboBox()
+		{
+			tabSelectComboBox.Items.Clear();
+
+			foreach( TextDisplayTabSettings.TabInfo tabInfo in this.tabSettings.Tabs )
+				this.tabSelectComboBox.Items.Add( tabInfo.Title );
+
+			tabSelectComboBox.Items.Add( "<New...>" );
+			tabSelectComboBox.Items.Add( "<Edit...>" );
+		}
+
+		public override void ApplySettings()
+		{
+			tabSettings.ApplySettings();
+		}
+
+		private void button1_Click(object sender, System.EventArgs e)
+		{
+			tabSettings.LoadDefaults();
+			InitializeTabSelectComboBox();
+		}
+
+		private void InitDisplay(TextDisplayTabSettings.TabInfo tabInfo)
+		{
+			textBox1.Text = tabInfo.Title;
+
+			TextDisplayContent content = tabInfo.Content;
+            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;
+		}
+
+		private void tabSelectComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			int index = tabSelectComboBox.SelectedIndex;
+			if ( index < tabSettings.Tabs.Count )
+			{
+				selectedTabIndex = index;
+				InitDisplay(tabSettings.Tabs[index]);
+			}
+			else // Not a tab, but a "menu" item
+			{
+				tabSelectComboBox.SelectedIndex = selectedTabIndex;
+
+				if ( index == tabSettings.Tabs.Count )
+					addNewTabPage();
+				else
+					editTabPages();
+			}
+		}
+
+		private void addNewTabPage()
+		{
+			using( AddTabPageDialog dlg = new AddTabPageDialog(tabSettings) )
+			{
+				this.ParentForm.Site.Container.Add( dlg );
+				if ( dlg.ShowDialog(this) == DialogResult.OK )
+				{
+					FillTabSelectComboBox();
+					this.tabSelectComboBox.SelectedIndex = tabSettings.Tabs.Count - 1;
+				}
+			}
+		}
+
+		private void editTabPages()
+		{
+			using( EditTabPagesDialog dlg = new EditTabPagesDialog( tabSettings) )
+			{
+				this.ParentForm.Site.Container.Add( dlg );
+				dlg.ShowDialog(this);
+
+				FillTabSelectComboBox();
+					
+				if ( tabSelectComboBox.Items.Count > 0 )
+					tabSelectComboBox.SelectedIndex = selectedTabIndex = 0;
+			}
+		}
+
+		private void showStandardOutput_CheckedChanged(object sender, System.EventArgs e)
+		{
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Out = showStandardOutput.Checked;
+        }
+
+		private void showErrorOutput_CheckedChanged(object sender, System.EventArgs e)
+		{
+            tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Content.Error = showErrorOutput.Checked;
+        }
+
+		private void textBox1_TextChanged(object sender, System.EventArgs e)
+		{
+			tabSettings.Tabs[tabSelectComboBox.SelectedIndex].Title = textBox1.Text;
+		}
+
+		private void displayTab_CheckedChanged(object sender, System.EventArgs e)
+		{
+			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 61bb827..c16405c 100644
--- a/src/GuiComponents/UiKit/TextOutputSettingsPage.resx
+++ b/src/GuiComponents/UiKit/TextOutputSettingsPage.resx
@@ -1,126 +1,126 @@
-<?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>
-  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
+<?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>
+  <metadata name="helpProvider1.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/GuiComponents/UiKit/TipWindow.cs b/src/GuiComponents/UiKit/TipWindow.cs
index 29fa50f..ddbd060 100644
--- a/src/GuiComponents/UiKit/TipWindow.cs
+++ b/src/GuiComponents/UiKit/TipWindow.cs
@@ -1,342 +1,342 @@
-// ****************************************************************
-// 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.Drawing;
-using System.ComponentModel;
-using System.Windows.Forms;
-using System.Runtime.InteropServices;
-
-namespace CP.Windows.Forms
-{
-	public class TipWindow : Form
-	{
-		/// <summary>
-		/// Direction in which to expand
-		/// </summary>
-		public enum ExpansionStyle
-		{
-			Horizontal,
-			Vertical,
-			Both
-		}
-
-		#region Instance Variables
-
-		/// <summary>
-		/// Text we are displaying
-		/// </summary>
-		private string tipText;
-
-		/// <summary>
-		/// The control for which we are showing expanded text
-		/// </summary>
-		private Control control;
-
-		/// <summary>
-		/// Rectangle representing bounds to overlay. For a listbox, this
-		/// is a single item rectangle. For other controls, it is usually
-		/// the entire client area.
-		/// </summary>
-		private Rectangle itemBounds;
-
-		/// <summary>
-		/// True if we may overlay control or item
-		/// </summary>
-		private bool overlay = true;
-			
-		/// <summary>
-		/// Directions we are allowed to expand
-		/// </summary>
-		private ExpansionStyle expansion = ExpansionStyle.Horizontal;
-
-		/// <summary>
-		/// Time before automatically closing
-		/// </summary>
-		private int autoCloseDelay = 0;
-
-		/// <summary>
-		/// Timer used for auto-close
-		/// </summary>
-		private System.Windows.Forms.Timer autoCloseTimer;
-
-		/// <summary>
-		/// Time to wait for after mouse leaves
-		/// the window or the label before closing.
-		/// </summary>
-		private int mouseLeaveDelay = 300;
-
-		/// <summary>
-		/// Timer used for mouse leave delay
-		/// </summary>
-		private System.Windows.Forms.Timer mouseLeaveTimer;
-
-		/// <summary>
-		/// Rectangle used to display text
-		/// </summary>
-		private Rectangle textRect;
-
-		/// <summary>
-		/// Indicates whether any clicks should be passed to the underlying control
-		/// </summary>
-		private bool wantClicks = false;
-
-		#endregion
-
-		#region Construction and Initialization
-
-		public TipWindow( Control control )
-		{
-			InitializeComponent();
-			InitControl( control );
-
-			// Note: This causes an error if called on a listbox
-			// with no item as yet selected, therefore, it is handled
-			// differently in the constructor for a listbox.
-			this.tipText = control.Text;
-		}
-
-		public TipWindow( ListBox listbox, int index )
-		{
-			InitializeComponent();
-			InitControl( listbox );
-
-			this.itemBounds = listbox.GetItemRectangle( index );
-			this.tipText = listbox.Items[ index ].ToString();
-		}
-
-		private void InitControl( Control control )
-		{
-			this.control = control;
-			this.Owner = control.FindForm();
-			this.itemBounds = control.ClientRectangle;
-
-			this.ControlBox = false;
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.BackColor = Color.LightYellow;
-			this.FormBorderStyle = FormBorderStyle.None;
-			this.StartPosition = FormStartPosition.Manual; 			
-
-			this.Font = control.Font;
-		}
-
-		private void InitializeComponent()
-		{
-			// 
-			// TipWindow
-			// 
-			this.BackColor = System.Drawing.Color.LightYellow;
-			this.ClientSize = new System.Drawing.Size(292, 268);
-			this.ControlBox = false;
-			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
-			this.MaximizeBox = false;
-			this.MinimizeBox = false;
-			this.Name = "TipWindow";
-			this.ShowInTaskbar = false;
-			this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
-
-		}
-
-		protected override void OnLoad(System.EventArgs e)
-		{
-			// At this point, further changes to the properties
-			// of the label will have no effect on the tip.
-			Point origin = control.Parent.PointToScreen( control.Location );
-			origin.Offset( itemBounds.Left, itemBounds.Top );
-			if ( !overlay )	origin.Offset( 0, itemBounds.Height );
-			this.Location = origin;
-
-			Graphics g = Graphics.FromHwnd( Handle );
-			Screen screen = Screen.FromControl( control );
-			SizeF layoutArea = new SizeF( screen.WorkingArea.Width - 40, screen.WorkingArea.Height - 40 );
-			if ( expansion == ExpansionStyle.Vertical )
-				layoutArea.Width = itemBounds.Width;
-			else if ( expansion == ExpansionStyle.Horizontal )
-				layoutArea.Height = itemBounds.Height;
-
-			Size sizeNeeded = Size.Ceiling( g.MeasureString( tipText, Font, layoutArea ) );
-
-			this.ClientSize = sizeNeeded;
-			this.Size = sizeNeeded + new Size( 2, 2 );
-			this.textRect = new Rectangle( 1, 1, sizeNeeded.Width, sizeNeeded.Height );
-
-			// Catch mouse leaving the control
-			control.MouseLeave += new EventHandler( control_MouseLeave );
-
-			// Catch the form that holds the control closing
-			control.FindForm().Closed += new EventHandler( control_FormClosed );
-
-			if ( this.Right > screen.WorkingArea.Right )
-			{
-				this.Left = Math.Max( 
-					screen.WorkingArea.Right - this.Width - 20, 
-					screen.WorkingArea.Left + 20);
-			}
-
-			if ( this.Bottom > screen.WorkingArea.Bottom - 20 )
-			{
-				if ( overlay )
-					this.Top = Math.Max(
-						screen.WorkingArea.Bottom - this.Height - 20,
-						screen.WorkingArea.Top + 20 );
-
-				if ( this.Bottom > screen.WorkingArea.Bottom - 20 )
-					this.Height = screen.WorkingArea.Bottom - 20 - this.Top;
-
-			}
-
-			if ( autoCloseDelay > 0 )
-			{
-				autoCloseTimer = new System.Windows.Forms.Timer();
-				autoCloseTimer.Interval = autoCloseDelay;
-				autoCloseTimer.Tick += new EventHandler( OnAutoClose );
-				autoCloseTimer.Start();
-			}
-		}
-
-		#endregion
-
-		#region Properties
-
-		public bool Overlay
-		{
-			get { return overlay; }
-			set { overlay = value; }
-		}
-
-		public ExpansionStyle Expansion
-		{
-			get { return expansion; }
-			set { expansion = value; }
-		}
-
-		public int AutoCloseDelay
-		{
-			get { return autoCloseDelay; }
-			set { autoCloseDelay = value; }
-		}
-
-		public int MouseLeaveDelay
-		{
-			get { return mouseLeaveDelay; }
-			set { mouseLeaveDelay = value; }
-		}
-
-		public string TipText
-		{
-			get { return tipText; }
-			set { tipText = value; }
-		}
-
-		public Rectangle ItemBounds
-		{
-			get { return itemBounds; }
-			set { itemBounds = value; }
-		}
-
-		public bool WantClicks
-		{
-			get { return wantClicks; }
-			set { wantClicks = value; }
-		}
-
-		#endregion
-
-		#region Event Handlers
-
-		protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
-		{
-			base.OnPaint( e );
-				
-			Graphics g = e.Graphics;
-			Rectangle outlineRect = this.ClientRectangle;
-			outlineRect.Inflate( -1, -1 );
-			g.DrawRectangle( Pens.Black, outlineRect );
-			g.DrawString( tipText, Font, Brushes.Black, textRect );
-		}
-
-		private void OnAutoClose( object sender, System.EventArgs e )
-		{
-			this.Close();
-		}
-
-		protected override void OnMouseEnter(System.EventArgs e)
-		{
-			if ( mouseLeaveTimer != null )
-			{
-				mouseLeaveTimer.Stop();
-				mouseLeaveTimer.Dispose();
-				System.Diagnostics.Debug.WriteLine( "Entered TipWindow - stopped mouseLeaveTimer" );
-			}
-		}
-
-		protected override void OnMouseLeave(System.EventArgs e)
-		{
-			if ( mouseLeaveDelay > 0  )
-			{
-				mouseLeaveTimer = new System.Windows.Forms.Timer();
-				mouseLeaveTimer.Interval = mouseLeaveDelay;
-				mouseLeaveTimer.Tick += new EventHandler( OnAutoClose );
-				mouseLeaveTimer.Start();
-				System.Diagnostics.Debug.WriteLine( "Left TipWindow - started mouseLeaveTimer" );
-			}
-		}
-
-		/// <summary>
-		/// The form our label is on closed, so we should. 
-		/// </summary>
-		private void control_FormClosed( object sender, System.EventArgs e )
-		{
-			this.Close();
-		}
-
-		/// <summary>
-		/// The mouse left the label. We ignore if we are
-		/// overlaying the label but otherwise start a
-		/// delay for closing the window
-		/// </summary>
-		private void control_MouseLeave( object sender, System.EventArgs e )
-		{
-			if ( mouseLeaveDelay > 0 && !overlay )
-			{
-				mouseLeaveTimer = new System.Windows.Forms.Timer();
-				mouseLeaveTimer.Interval = mouseLeaveDelay;
-				mouseLeaveTimer.Tick += new EventHandler( OnAutoClose );
-				mouseLeaveTimer.Start();
-				System.Diagnostics.Debug.WriteLine( "Left Control - started mouseLeaveTimer" );
-			}
-		}
-
-		#endregion
-	
-		[DllImport("user32.dll")]
-		static extern uint SendMessage(
-			IntPtr hwnd,
-			int msg,
-			IntPtr wparam,
-			IntPtr lparam
-			);
-	
-		protected override void WndProc(ref Message m)
-		{
-			uint WM_LBUTTONDOWN = 0x201;
-			uint WM_RBUTTONDOWN = 0x204;
-			uint WM_MBUTTONDOWN = 0x207;
-
-			if ( m.Msg == WM_LBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MBUTTONDOWN )
-			{	
-				if ( m.Msg != WM_LBUTTONDOWN )
-					this.Close();
-				SendMessage( control.Handle, m.Msg, m.WParam, m.LParam );
-			}
-			else
-			{
-				base.WndProc (ref m);
-			}
-		}
-	}
-}
+// ****************************************************************
+// 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.Drawing;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+
+namespace CP.Windows.Forms
+{
+	public class TipWindow : Form
+	{
+		/// <summary>
+		/// Direction in which to expand
+		/// </summary>
+		public enum ExpansionStyle
+		{
+			Horizontal,
+			Vertical,
+			Both
+		}
+
+		#region Instance Variables
+
+		/// <summary>
+		/// Text we are displaying
+		/// </summary>
+		private string tipText;
+
+		/// <summary>
+		/// The control for which we are showing expanded text
+		/// </summary>
+		private Control control;
+
+		/// <summary>
+		/// Rectangle representing bounds to overlay. For a listbox, this
+		/// is a single item rectangle. For other controls, it is usually
+		/// the entire client area.
+		/// </summary>
+		private Rectangle itemBounds;
+
+		/// <summary>
+		/// True if we may overlay control or item
+		/// </summary>
+		private bool overlay = true;
+			
+		/// <summary>
+		/// Directions we are allowed to expand
+		/// </summary>
+		private ExpansionStyle expansion = ExpansionStyle.Horizontal;
+
+		/// <summary>
+		/// Time before automatically closing
+		/// </summary>
+		private int autoCloseDelay = 0;
+
+		/// <summary>
+		/// Timer used for auto-close
+		/// </summary>
+		private System.Windows.Forms.Timer autoCloseTimer;
+
+		/// <summary>
+		/// Time to wait for after mouse leaves
+		/// the window or the label before closing.
+		/// </summary>
+		private int mouseLeaveDelay = 300;
+
+		/// <summary>
+		/// Timer used for mouse leave delay
+		/// </summary>
+		private System.Windows.Forms.Timer mouseLeaveTimer;
+
+		/// <summary>
+		/// Rectangle used to display text
+		/// </summary>
+		private Rectangle textRect;
+
+		/// <summary>
+		/// Indicates whether any clicks should be passed to the underlying control
+		/// </summary>
+		private bool wantClicks = false;
+
+		#endregion
+
+		#region Construction and Initialization
+
+		public TipWindow( Control control )
+		{
+			InitializeComponent();
+			InitControl( control );
+
+			// Note: This causes an error if called on a listbox
+			// with no item as yet selected, therefore, it is handled
+			// differently in the constructor for a listbox.
+			this.tipText = control.Text;
+		}
+
+		public TipWindow( ListBox listbox, int index )
+		{
+			InitializeComponent();
+			InitControl( listbox );
+
+			this.itemBounds = listbox.GetItemRectangle( index );
+			this.tipText = listbox.Items[ index ].ToString();
+		}
+
+		private void InitControl( Control control )
+		{
+			this.control = control;
+			this.Owner = control.FindForm();
+			this.itemBounds = control.ClientRectangle;
+
+			this.ControlBox = false;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.BackColor = Color.LightYellow;
+			this.FormBorderStyle = FormBorderStyle.None;
+			this.StartPosition = FormStartPosition.Manual; 			
+
+			this.Font = control.Font;
+		}
+
+		private void InitializeComponent()
+		{
+			// 
+			// TipWindow
+			// 
+			this.BackColor = System.Drawing.Color.LightYellow;
+			this.ClientSize = new System.Drawing.Size(292, 268);
+			this.ControlBox = false;
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "TipWindow";
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+
+		}
+
+		protected override void OnLoad(System.EventArgs e)
+		{
+			// At this point, further changes to the properties
+			// of the label will have no effect on the tip.
+			Point origin = control.Parent.PointToScreen( control.Location );
+			origin.Offset( itemBounds.Left, itemBounds.Top );
+			if ( !overlay )	origin.Offset( 0, itemBounds.Height );
+			this.Location = origin;
+
+			Graphics g = Graphics.FromHwnd( Handle );
+			Screen screen = Screen.FromControl( control );
+			SizeF layoutArea = new SizeF( screen.WorkingArea.Width - 40, screen.WorkingArea.Height - 40 );
+			if ( expansion == ExpansionStyle.Vertical )
+				layoutArea.Width = itemBounds.Width;
+			else if ( expansion == ExpansionStyle.Horizontal )
+				layoutArea.Height = itemBounds.Height;
+
+			Size sizeNeeded = Size.Ceiling( g.MeasureString( tipText, Font, layoutArea ) );
+
+			this.ClientSize = sizeNeeded;
+			this.Size = sizeNeeded + new Size( 2, 2 );
+			this.textRect = new Rectangle( 1, 1, sizeNeeded.Width, sizeNeeded.Height );
+
+			// Catch mouse leaving the control
+			control.MouseLeave += new EventHandler( control_MouseLeave );
+
+			// Catch the form that holds the control closing
+			control.FindForm().Closed += new EventHandler( control_FormClosed );
+
+			if ( this.Right > screen.WorkingArea.Right )
+			{
+				this.Left = Math.Max( 
+					screen.WorkingArea.Right - this.Width - 20, 
+					screen.WorkingArea.Left + 20);
+			}
+
+			if ( this.Bottom > screen.WorkingArea.Bottom - 20 )
+			{
+				if ( overlay )
+					this.Top = Math.Max(
+						screen.WorkingArea.Bottom - this.Height - 20,
+						screen.WorkingArea.Top + 20 );
+
+				if ( this.Bottom > screen.WorkingArea.Bottom - 20 )
+					this.Height = screen.WorkingArea.Bottom - 20 - this.Top;
+
+			}
+
+			if ( autoCloseDelay > 0 )
+			{
+				autoCloseTimer = new System.Windows.Forms.Timer();
+				autoCloseTimer.Interval = autoCloseDelay;
+				autoCloseTimer.Tick += new EventHandler( OnAutoClose );
+				autoCloseTimer.Start();
+			}
+		}
+
+		#endregion
+
+		#region Properties
+
+		public bool Overlay
+		{
+			get { return overlay; }
+			set { overlay = value; }
+		}
+
+		public ExpansionStyle Expansion
+		{
+			get { return expansion; }
+			set { expansion = value; }
+		}
+
+		public int AutoCloseDelay
+		{
+			get { return autoCloseDelay; }
+			set { autoCloseDelay = value; }
+		}
+
+		public int MouseLeaveDelay
+		{
+			get { return mouseLeaveDelay; }
+			set { mouseLeaveDelay = value; }
+		}
+
+		public string TipText
+		{
+			get { return tipText; }
+			set { tipText = value; }
+		}
+
+		public Rectangle ItemBounds
+		{
+			get { return itemBounds; }
+			set { itemBounds = value; }
+		}
+
+		public bool WantClicks
+		{
+			get { return wantClicks; }
+			set { wantClicks = value; }
+		}
+
+		#endregion
+
+		#region Event Handlers
+
+		protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
+		{
+			base.OnPaint( e );
+				
+			Graphics g = e.Graphics;
+			Rectangle outlineRect = this.ClientRectangle;
+			outlineRect.Inflate( -1, -1 );
+			g.DrawRectangle( Pens.Black, outlineRect );
+			g.DrawString( tipText, Font, Brushes.Black, textRect );
+		}
+
+		private void OnAutoClose( object sender, System.EventArgs e )
+		{
+			this.Close();
+		}
+
+		protected override void OnMouseEnter(System.EventArgs e)
+		{
+			if ( mouseLeaveTimer != null )
+			{
+				mouseLeaveTimer.Stop();
+				mouseLeaveTimer.Dispose();
+				System.Diagnostics.Debug.WriteLine( "Entered TipWindow - stopped mouseLeaveTimer" );
+			}
+		}
+
+		protected override void OnMouseLeave(System.EventArgs e)
+		{
+			if ( mouseLeaveDelay > 0  )
+			{
+				mouseLeaveTimer = new System.Windows.Forms.Timer();
+				mouseLeaveTimer.Interval = mouseLeaveDelay;
+				mouseLeaveTimer.Tick += new EventHandler( OnAutoClose );
+				mouseLeaveTimer.Start();
+				System.Diagnostics.Debug.WriteLine( "Left TipWindow - started mouseLeaveTimer" );
+			}
+		}
+
+		/// <summary>
+		/// The form our label is on closed, so we should. 
+		/// </summary>
+		private void control_FormClosed( object sender, System.EventArgs e )
+		{
+			this.Close();
+		}
+
+		/// <summary>
+		/// The mouse left the label. We ignore if we are
+		/// overlaying the label but otherwise start a
+		/// delay for closing the window
+		/// </summary>
+		private void control_MouseLeave( object sender, System.EventArgs e )
+		{
+			if ( mouseLeaveDelay > 0 && !overlay )
+			{
+				mouseLeaveTimer = new System.Windows.Forms.Timer();
+				mouseLeaveTimer.Interval = mouseLeaveDelay;
+				mouseLeaveTimer.Tick += new EventHandler( OnAutoClose );
+				mouseLeaveTimer.Start();
+				System.Diagnostics.Debug.WriteLine( "Left Control - started mouseLeaveTimer" );
+			}
+		}
+
+		#endregion
+	
+		[DllImport("user32.dll")]
+		static extern uint SendMessage(
+			IntPtr hwnd,
+			int msg,
+			IntPtr wparam,
+			IntPtr lparam
+			);
+	
+		protected override void WndProc(ref Message m)
+		{
+			uint WM_LBUTTONDOWN = 0x201;
+			uint WM_RBUTTONDOWN = 0x204;
+			uint WM_MBUTTONDOWN = 0x207;
+
+			if ( m.Msg == WM_LBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MBUTTONDOWN )
+			{	
+				if ( m.Msg != WM_LBUTTONDOWN )
+					this.Close();
+				SendMessage( control.Handle, m.Msg, m.WParam, m.LParam );
+			}
+			else
+			{
+				base.WndProc (ref m);
+			}
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/TipWindow.resx b/src/GuiComponents/UiKit/TipWindow.resx
index d200f51..c431b59 100644
--- a/src/GuiComponents/UiKit/TipWindow.resx
+++ b/src/GuiComponents/UiKit/TipWindow.resx
@@ -1,130 +1,130 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>TipWindow</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>TipWindow</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs b/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs
index 0d00604..fcbd4b2 100644
--- a/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs
+++ b/src/GuiComponents/UiKit/TreeBasedSettingsDialog.cs
@@ -1,256 +1,256 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.UiKit
-{
-	public class TreeBasedSettingsDialog : NUnit.UiKit.SettingsDialogBase
-	{
-		private System.Windows.Forms.TreeView treeView1;
-		private System.Windows.Forms.Panel panel1;
-		private System.ComponentModel.IContainer components = null;
-		private System.Windows.Forms.ImageList imageList1;
-		private System.Windows.Forms.GroupBox groupBox1;
-
-		private SettingsPage current;
-
-		public static void Display( Form owner, params SettingsPage[] pages )
-		{
-			using( TreeBasedSettingsDialog dialog = new TreeBasedSettingsDialog() )
-			{
-				owner.Site.Container.Add( dialog );
-				dialog.Font = owner.Font;
-				dialog.SettingsPages.AddRange( pages ); 
-				dialog.ShowDialog();
-			}
-		}
-
-		public TreeBasedSettingsDialog()
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.components = new System.ComponentModel.Container();
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TreeBasedSettingsDialog));
-			this.treeView1 = new System.Windows.Forms.TreeView();
-			this.imageList1 = new System.Windows.Forms.ImageList(this.components);
-			this.panel1 = new System.Windows.Forms.Panel();
-			this.groupBox1 = new System.Windows.Forms.GroupBox();
-			this.SuspendLayout();
-			// 
-			// cancelButton
-			// 
-			this.cancelButton.Location = new System.Drawing.Point(592, 392);
-			this.cancelButton.Name = "cancelButton";
-			// 
-			// okButton
-			// 
-			this.okButton.Location = new System.Drawing.Point(504, 392);
-			this.okButton.Name = "okButton";
-			// 
-			// treeView1
-			// 
-			this.treeView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
-			this.treeView1.HideSelection = false;
-			this.treeView1.ImageList = this.imageList1;
-			this.treeView1.Location = new System.Drawing.Point(16, 16);
-			this.treeView1.Name = "treeView1";
-			this.treeView1.PathSeparator = ".";
-			this.treeView1.Size = new System.Drawing.Size(176, 350);
-			this.treeView1.TabIndex = 19;
-			this.treeView1.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterExpand);
-			this.treeView1.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterCollapse);
-			this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
-			// 
-			// imageList1
-			// 
-			this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
-			this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
-			this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
-			// 
-			// panel1
-			// 
-			this.panel1.Location = new System.Drawing.Point(208, 16);
-			this.panel1.Name = "panel1";
-			this.panel1.Size = new System.Drawing.Size(456, 336);
-			this.panel1.TabIndex = 20;
-			// 
-			// groupBox1
-			// 
-			this.groupBox1.Location = new System.Drawing.Point(208, 360);
-			this.groupBox1.Name = "groupBox1";
-			this.groupBox1.Size = new System.Drawing.Size(456, 8);
-			this.groupBox1.TabIndex = 21;
-			this.groupBox1.TabStop = false;
-			// 
-			// TreeBasedSettingsDialog
-			// 
-			this.ClientSize = new System.Drawing.Size(682, 426);
-			this.Controls.Add(this.groupBox1);
-			this.Controls.Add(this.panel1);
-			this.Controls.Add(this.treeView1);
-			this.Name = "TreeBasedSettingsDialog";
-			this.Load += new System.EventHandler(this.TreeBasedSettingsDialog_Load);
-			this.Controls.SetChildIndex(this.treeView1, 0);
-			this.Controls.SetChildIndex(this.okButton, 0);
-			this.Controls.SetChildIndex(this.cancelButton, 0);
-			this.Controls.SetChildIndex(this.panel1, 0);
-			this.Controls.SetChildIndex(this.groupBox1, 0);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void TreeBasedSettingsDialog_Load(object sender, System.EventArgs e)
-		{
-			foreach( SettingsPage page in SettingsPages )
-				AddBranchToTree( treeView1.Nodes, page.Key );
-
-			if ( treeView1.VisibleCount >= treeView1.GetNodeCount( true ) )
-				treeView1.ExpandAll();
-
-            SelectInitialPage();
-
-			treeView1.Select();
-		}
-
-        private void SelectInitialPage()
-        {
-            string initialPage = Services.UserSettings.GetSetting("Gui.Settings.InitialPage") as string;
-
-            if (initialPage != null)
-                SelectPage(initialPage);
-            else if (treeView1.Nodes.Count > 0)
-                SelectFirstPage(treeView1.Nodes);
-        }
-
-        private void SelectPage(string initialPage)
-        {
-            TreeNode node = FindNode(treeView1.Nodes, initialPage);
-            if (node != null)
-                treeView1.SelectedNode = node;
-            else
-                SelectFirstPage(treeView1.Nodes);
-        }
-
-        private TreeNode FindNode(TreeNodeCollection nodes, string key)
-        {
-            int dot = key.IndexOf('.');
-            string tail = null;
-
-            if (dot >= 0)
-            {
-                tail = key.Substring(dot + 1);
-                key = key.Substring(0, dot);
-            }
-
-            foreach (TreeNode node in nodes)
-                if (node.Text == key)
-                    return tail == null
-                        ? node
-                        : FindNode(node.Nodes, tail);
-
-            return null;
-        }
-
-		private void SelectFirstPage(TreeNodeCollection nodes)
-		{
-			if ( nodes[0].Nodes.Count == 0 )
-				treeView1.SelectedNode = nodes[0];
-			else
-			{
-				nodes[0].Expand();
-				SelectFirstPage(nodes[0].Nodes);
-			}
-		}
-
-		private void AddBranchToTree( TreeNodeCollection nodes, string key )
-		{
-			int dot = key.IndexOf( '.' );
-			if ( dot < 0 )
-			{
-				nodes.Add( new TreeNode( key, 2, 2 ) );
-				return;
-			}
-
-			string name = key.Substring( 0, dot );
-			key = key.Substring(dot+1);
-
-			TreeNode node = FindOrAddNode( nodes, name );
-			
-			if ( key != null )
-				AddBranchToTree( node.Nodes, key );
-		}
-
-		private TreeNode FindOrAddNode( TreeNodeCollection nodes, string name )
-		{
-			foreach( TreeNode node in nodes )
-				if ( node.Text == name )
-					return node;
-
-			TreeNode newNode = new TreeNode(name, 0, 0);
-			nodes.Add( newNode );
-			return newNode;
-		}
-
-		private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
-		{
-			string key = e.Node.FullPath;
-			SettingsPage page = SettingsPages[key];
-            Services.UserSettings.SaveSetting("Gui.Settings.InitialPage", key);
-
-			if ( page != null && page != current )
-			{
-				panel1.Controls.Clear();
-				panel1.Controls.Add( page );
-				page.Dock = DockStyle.Fill;
-				current = page;
-				return;
-			}
-		}
-
-		private void treeView1_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)
-		{
-			e.Node.ImageIndex = e.Node.SelectedImageIndex = 1;
-		}
-
-		private void treeView1_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e)
-		{
-			e.Node.ImageIndex = e.Node.SelectedImageIndex = 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 System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.UiKit
+{
+	public class TreeBasedSettingsDialog : NUnit.UiKit.SettingsDialogBase
+	{
+		private System.Windows.Forms.TreeView treeView1;
+		private System.Windows.Forms.Panel panel1;
+		private System.ComponentModel.IContainer components = null;
+		private System.Windows.Forms.ImageList imageList1;
+		private System.Windows.Forms.GroupBox groupBox1;
+
+		private SettingsPage current;
+
+		public static void Display( Form owner, params SettingsPage[] pages )
+		{
+			using( TreeBasedSettingsDialog dialog = new TreeBasedSettingsDialog() )
+			{
+				owner.Site.Container.Add( dialog );
+				dialog.Font = owner.Font;
+				dialog.SettingsPages.AddRange( pages ); 
+				dialog.ShowDialog();
+			}
+		}
+
+		public TreeBasedSettingsDialog()
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.components = new System.ComponentModel.Container();
+			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TreeBasedSettingsDialog));
+			this.treeView1 = new System.Windows.Forms.TreeView();
+			this.imageList1 = new System.Windows.Forms.ImageList(this.components);
+			this.panel1 = new System.Windows.Forms.Panel();
+			this.groupBox1 = new System.Windows.Forms.GroupBox();
+			this.SuspendLayout();
+			// 
+			// cancelButton
+			// 
+			this.cancelButton.Location = new System.Drawing.Point(592, 392);
+			this.cancelButton.Name = "cancelButton";
+			// 
+			// okButton
+			// 
+			this.okButton.Location = new System.Drawing.Point(504, 392);
+			this.okButton.Name = "okButton";
+			// 
+			// treeView1
+			// 
+			this.treeView1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.treeView1.HideSelection = false;
+			this.treeView1.ImageList = this.imageList1;
+			this.treeView1.Location = new System.Drawing.Point(16, 16);
+			this.treeView1.Name = "treeView1";
+			this.treeView1.PathSeparator = ".";
+			this.treeView1.Size = new System.Drawing.Size(176, 350);
+			this.treeView1.TabIndex = 19;
+			this.treeView1.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterExpand);
+			this.treeView1.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterCollapse);
+			this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
+			// 
+			// imageList1
+			// 
+			this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
+			this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
+			this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
+			// 
+			// panel1
+			// 
+			this.panel1.Location = new System.Drawing.Point(208, 16);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size(456, 336);
+			this.panel1.TabIndex = 20;
+			// 
+			// groupBox1
+			// 
+			this.groupBox1.Location = new System.Drawing.Point(208, 360);
+			this.groupBox1.Name = "groupBox1";
+			this.groupBox1.Size = new System.Drawing.Size(456, 8);
+			this.groupBox1.TabIndex = 21;
+			this.groupBox1.TabStop = false;
+			// 
+			// TreeBasedSettingsDialog
+			// 
+			this.ClientSize = new System.Drawing.Size(682, 426);
+			this.Controls.Add(this.groupBox1);
+			this.Controls.Add(this.panel1);
+			this.Controls.Add(this.treeView1);
+			this.Name = "TreeBasedSettingsDialog";
+			this.Load += new System.EventHandler(this.TreeBasedSettingsDialog_Load);
+			this.Controls.SetChildIndex(this.treeView1, 0);
+			this.Controls.SetChildIndex(this.okButton, 0);
+			this.Controls.SetChildIndex(this.cancelButton, 0);
+			this.Controls.SetChildIndex(this.panel1, 0);
+			this.Controls.SetChildIndex(this.groupBox1, 0);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void TreeBasedSettingsDialog_Load(object sender, System.EventArgs e)
+		{
+			foreach( SettingsPage page in SettingsPages )
+				AddBranchToTree( treeView1.Nodes, page.Key );
+
+			if ( treeView1.VisibleCount >= treeView1.GetNodeCount( true ) )
+				treeView1.ExpandAll();
+
+            SelectInitialPage();
+
+			treeView1.Select();
+		}
+
+        private void SelectInitialPage()
+        {
+            string initialPage = Services.UserSettings.GetSetting("Gui.Settings.InitialPage") as string;
+
+            if (initialPage != null)
+                SelectPage(initialPage);
+            else if (treeView1.Nodes.Count > 0)
+                SelectFirstPage(treeView1.Nodes);
+        }
+
+        private void SelectPage(string initialPage)
+        {
+            TreeNode node = FindNode(treeView1.Nodes, initialPage);
+            if (node != null)
+                treeView1.SelectedNode = node;
+            else
+                SelectFirstPage(treeView1.Nodes);
+        }
+
+        private TreeNode FindNode(TreeNodeCollection nodes, string key)
+        {
+            int dot = key.IndexOf('.');
+            string tail = null;
+
+            if (dot >= 0)
+            {
+                tail = key.Substring(dot + 1);
+                key = key.Substring(0, dot);
+            }
+
+            foreach (TreeNode node in nodes)
+                if (node.Text == key)
+                    return tail == null
+                        ? node
+                        : FindNode(node.Nodes, tail);
+
+            return null;
+        }
+
+		private void SelectFirstPage(TreeNodeCollection nodes)
+		{
+			if ( nodes[0].Nodes.Count == 0 )
+				treeView1.SelectedNode = nodes[0];
+			else
+			{
+				nodes[0].Expand();
+				SelectFirstPage(nodes[0].Nodes);
+			}
+		}
+
+		private void AddBranchToTree( TreeNodeCollection nodes, string key )
+		{
+			int dot = key.IndexOf( '.' );
+			if ( dot < 0 )
+			{
+				nodes.Add( new TreeNode( key, 2, 2 ) );
+				return;
+			}
+
+			string name = key.Substring( 0, dot );
+			key = key.Substring(dot+1);
+
+			TreeNode node = FindOrAddNode( nodes, name );
+			
+			if ( key != null )
+				AddBranchToTree( node.Nodes, key );
+		}
+
+		private TreeNode FindOrAddNode( TreeNodeCollection nodes, string name )
+		{
+			foreach( TreeNode node in nodes )
+				if ( node.Text == name )
+					return node;
+
+			TreeNode newNode = new TreeNode(name, 0, 0);
+			nodes.Add( newNode );
+			return newNode;
+		}
+
+		private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
+		{
+			string key = e.Node.FullPath;
+			SettingsPage page = SettingsPages[key];
+            Services.UserSettings.SaveSetting("Gui.Settings.InitialPage", key);
+
+			if ( page != null && page != current )
+			{
+				panel1.Controls.Clear();
+				panel1.Controls.Add( page );
+				page.Dock = DockStyle.Fill;
+				current = page;
+				return;
+			}
+		}
+
+		private void treeView1_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)
+		{
+			e.Node.ImageIndex = e.Node.SelectedImageIndex = 1;
+		}
+
+		private void treeView1_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e)
+		{
+			e.Node.ImageIndex = e.Node.SelectedImageIndex = 0;
+		}
+	}
+}
+
diff --git a/src/GuiComponents/UiKit/TreeBasedSettingsDialog.resx b/src/GuiComponents/UiKit/TreeBasedSettingsDialog.resx
index 5fe28a9..cf12186 100644
--- a/src/GuiComponents/UiKit/TreeBasedSettingsDialog.resx
+++ b/src/GuiComponents/UiKit/TreeBasedSettingsDialog.resx
@@ -1,254 +1,254 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Family</value>
-  </data>
-  <data name="treeView1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treeView1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="treeView1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="imageList1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="imageList1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="imageList1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </data>
-  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw
-        MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
-        eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
-        AABgCgAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQC
-        AAEoAwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB
-        3AHAAQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IB
-        AAM5AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8B
-        MwMAAWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYC
-        AAFmAZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMC
-        AAHMAWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQAB
-        ZgEAATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8B
-        AAEzAWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQAB
-        MwGZAWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQAB
-        MwLMAQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQAB
-        MwEAAWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMB
-        mQEAAWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQAB
-        ZgGZAWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYB
-        zAH/AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMB
-        mQEAAZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgAB
-        mQFmATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwB
-        AAKZAf8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB
-        /wEzAQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQAB
-        mQEAAcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYC
-        AAHMAWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYB
-        AAHMApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8C
-        AAHMAf8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQAB
-        mQEAAcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMB
-        AAHMAmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB
-        /wGZAcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC
-        /wEzAQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC
-        /wFmAQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gB
-        AAHwAfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAD90B1g/dAdYP
-        3QHWEAAP/wHdAf8B+AptAfAC/wHdAf8B+AttAQcB/wHdEAAB/wH3DOwBBwHdAewBDwFDCRIB7AG8Af8B
-        3QH/AUMBFAnrAQ8B7AH/Ad0QAAEHARMLQwEOAW0B3QEAARABbQHvAbwBmQG8AZkBCAG8AZkBvAFDAewB
-        /wHdAf8BQwGSCf8BFAHsAf8B3REAAZILBwESAW0B3QEAAZIBEwHrAcMBXgHDAeUCoAFeAfYBEwHsAfQB
-        3QH/AUMBkgL/BPQB9QL/ARQB7AH/Ad0RAAE3AqAB5QH0AV4BwwGgAeUBGwFeAcMCbQHdAQABkgETAQMB
-        5QHDAV4CoAHlAcMBXgEaAusB3QH/AUMBkgH/AbwEhgHPAv8BFAHsAf8B3REAAZkC5QGgAeUBoAHlAqAB
-        5QGgAeUBSgFtAd0BAAKSAUoBAwHlAaAB5QKgAeUBoAHlAUoBbQHdAf8BQwGSAf8B9AS1AfAC/wEUAewB
-        /wHdEQABeQugAUoBbQHdAQABkgEHAW0BFQigAVgBUQGuAf8BQwGSAf8B8gW1Av8BFAHsAf8B3REAAVgC
-        oAHlAaAB5QKgAeUBoAHlAaABSgFtAd0BAAGSAQcB7AHqAe8BMAEcAXMBUQEcATABHAFRASkBCgH/AUMB
-        kgH/AfEErgG1Av8BFAHsAf8B3REAAQcC5QGgAV4BwwHlAqABXgHDAeUBAwFtAd0BAAGSAgcB7QcPAQAB
-        DgEQAREB/wFDAZIB/wH1A/IC9ALxARUB7AH/Ad0RAAE3AqABXgH2AV4CoAHlAcMBXgHDAesBbQHdAQAB
-        kgMHB+8BEQHsAfMB3QH/AUMBkgH/AbwDBAG1Ae8CDgEAAewB/wHdEQABIgIVASIBFAEiAhUBIgEUASIB
-        FAHsAfAB3QEAAZIDBwHvARQFQwGSAfIB/wHdAf8BQwGSAf8B9APuAfIB7wEOAewBEAHsAf8B3RAAAewB
-        DwEpAVEBcwEDAewBEQETBOwBvAH/Ad0B7AHqAxIB6gbsAfIC/wHdAf8BQwGSBv8B7wEOARMB7AG8Af8B
-        3RAAAf8B+AJRAXMBMAHtAesB7wb/Ad0B/wH4BG0B8wj/Ad0B/wFDAW0GkgFtAQ4B6gHwAv8B3RAAAv8B
-        +ARDAQcH/wHdD/8B3QH/ARIIQwETAfQD/wHdEAAP/wHdD/8B3Q//Ad0QAAFCAU0BPgcAAT4DAAEoAwAB
-        QAMAARADAAEBAQABAQUAAYAXAAP/lwAL
-</value>
-  </data>
-  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="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="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>TreeBasedSettingsDialog</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Family</value>
+  </data>
+  <data name="treeView1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="treeView1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="treeView1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="imageList1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="imageList1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="imageList1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </data>
+  <data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFpTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0xLjAuNTAw
+        MC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZT
+        eXN0ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMA
+        AABgCgAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQC
+        AAEoAwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB
+        3AHAAQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IB
+        AAM5AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8B
+        MwMAAWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYC
+        AAFmAZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMC
+        AAHMAWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQAB
+        ZgEAATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8B
+        AAEzAWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQAB
+        MwGZAWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQAB
+        MwLMAQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQAB
+        MwEAAWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMB
+        mQEAAWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQAB
+        ZgGZAWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYB
+        zAH/AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMB
+        mQEAAZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgAB
+        mQFmATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwB
+        AAKZAf8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB
+        /wEzAQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQAB
+        mQEAAcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYC
+        AAHMAWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYB
+        AAHMApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8C
+        AAHMAf8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQAB
+        mQEAAcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMB
+        AAHMAmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB
+        /wGZAcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC
+        /wEzAQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC
+        /wFmAQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gB
+        AAHwAfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAD90B1g/dAdYP
+        3QHWEAAP/wHdAf8B+AptAfAC/wHdAf8B+AttAQcB/wHdEAAB/wH3DOwBBwHdAewBDwFDCRIB7AG8Af8B
+        3QH/AUMBFAnrAQ8B7AH/Ad0QAAEHARMLQwEOAW0B3QEAARABbQHvAbwBmQG8AZkBCAG8AZkBvAFDAewB
+        /wHdAf8BQwGSCf8BFAHsAf8B3REAAZILBwESAW0B3QEAAZIBEwHrAcMBXgHDAeUCoAFeAfYBEwHsAfQB
+        3QH/AUMBkgL/BPQB9QL/ARQB7AH/Ad0RAAE3AqAB5QH0AV4BwwGgAeUBGwFeAcMCbQHdAQABkgETAQMB
+        5QHDAV4CoAHlAcMBXgEaAusB3QH/AUMBkgH/AbwEhgHPAv8BFAHsAf8B3REAAZkC5QGgAeUBoAHlAqAB
+        5QGgAeUBSgFtAd0BAAKSAUoBAwHlAaAB5QKgAeUBoAHlAUoBbQHdAf8BQwGSAf8B9AS1AfAC/wEUAewB
+        /wHdEQABeQugAUoBbQHdAQABkgEHAW0BFQigAVgBUQGuAf8BQwGSAf8B8gW1Av8BFAHsAf8B3REAAVgC
+        oAHlAaAB5QKgAeUBoAHlAaABSgFtAd0BAAGSAQcB7AHqAe8BMAEcAXMBUQEcATABHAFRASkBCgH/AUMB
+        kgH/AfEErgG1Av8BFAHsAf8B3REAAQcC5QGgAV4BwwHlAqABXgHDAeUBAwFtAd0BAAGSAgcB7QcPAQAB
+        DgEQAREB/wFDAZIB/wH1A/IC9ALxARUB7AH/Ad0RAAE3AqABXgH2AV4CoAHlAcMBXgHDAesBbQHdAQAB
+        kgMHB+8BEQHsAfMB3QH/AUMBkgH/AbwDBAG1Ae8CDgEAAewB/wHdEQABIgIVASIBFAEiAhUBIgEUASIB
+        FAHsAfAB3QEAAZIDBwHvARQFQwGSAfIB/wHdAf8BQwGSAf8B9APuAfIB7wEOAewBEAHsAf8B3RAAAewB
+        DwEpAVEBcwEDAewBEQETBOwBvAH/Ad0B7AHqAxIB6gbsAfIC/wHdAf8BQwGSBv8B7wEOARMB7AG8Af8B
+        3RAAAf8B+AJRAXMBMAHtAesB7wb/Ad0B/wH4BG0B8wj/Ad0B/wFDAW0GkgFtAQ4B6gHwAv8B3RAAAv8B
+        +ARDAQcH/wHdD/8B3QH/ARIIQwETAfQD/wHdEAAP/wHdD/8B3Q//Ad0QAAFCAU0BPgcAAT4DAAEoAwAB
+        QAMAARADAAEBAQABAQUAAYAXAAP/lwAL
+</value>
+  </data>
+  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="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="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>TreeBasedSettingsDialog</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/VisualState.cs b/src/GuiComponents/UiKit/VisualState.cs
index f19b77b..cbe7540 100644
--- a/src/GuiComponents/UiKit/VisualState.cs
+++ b/src/GuiComponents/UiKit/VisualState.cs
@@ -1,189 +1,189 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using System.Collections.Generic;
-using System.Windows.Forms;
-using System.Xml.Serialization;
-using NUnit.Core;
-using NUnit.Core.Filters;
-
-namespace NUnit.UiKit
-{
-	/// <summary>
-	/// The VisualState class holds the latest visual state for a project.
-	/// </summary>
-	[Serializable]
-	public class VisualState
-	{
-		#region Fields
-		[XmlAttribute]
-		public bool ShowCheckBoxes;
-
-		public string TopNode;
-
-		public string SelectedNode;
-
-		public string SelectedCategories;
-
-		public bool ExcludeCategories;
-
-		[XmlArrayItem("Node")]
-		public List<VisualTreeNode> Nodes;
-		#endregion
-
-		#region Static Methods
-		public static string GetVisualStateFileName( string testFileName )
-		{
-			if ( testFileName == null )
-				return "VisualState.xml";
-
-			string baseName = testFileName;
-			if ( baseName.EndsWith( ".nunit" ) )
-				baseName = baseName.Substring( 0, baseName.Length - 6 );
-			
-			return baseName + ".VisualState.xml";
-		}
-
-		public static VisualState LoadFrom( string fileName )
-		{
-			using ( StreamReader reader = new StreamReader( fileName ) )
-			{
-				return LoadFrom( reader );
-			}
-		}
-
-		public static VisualState LoadFrom( TextReader reader )
-		{
-			XmlSerializer serializer = new XmlSerializer( typeof( VisualState) );
-			return (VisualState)serializer.Deserialize( reader );
-		}
-		#endregion
-
-		#region Constructors
-		public VisualState() { }
-
-		public VisualState( TestSuiteTreeView treeView )
-		{
-			this.ShowCheckBoxes = treeView.CheckBoxes;
-			this.TopNode = ((TestSuiteTreeNode)treeView.TopNode).Test.TestName.UniqueName;
-			this.SelectedNode = ((TestSuiteTreeNode)treeView.SelectedNode).Test.TestName.UniqueName;
-			this.Nodes = new List<VisualTreeNode>();
-            ProcessTreeNodes( (TestSuiteTreeNode)treeView.Nodes[0] );
-
-			if ( !treeView.CategoryFilter.IsEmpty )
-			{
-				ITestFilter filter = treeView.CategoryFilter;
-				if ( filter is NotFilter )
-				{
-					filter = ((NotFilter)filter).BaseFilter;
-					this.ExcludeCategories = true;
-				}
-
-				this.SelectedCategories = filter.ToString();
-			}
-		}
-
-        private void ProcessTreeNodes(TestSuiteTreeNode node)
-        {
-            if (IsInteresting(node))
-                this.Nodes.Add(new VisualTreeNode(node));
-
-            foreach (TestSuiteTreeNode childNode in node.Nodes)
-                ProcessTreeNodes(childNode);
-        }
-
-        private bool IsInteresting(TestSuiteTreeNode node)
-        {
-            return node.IsExpanded || node.Checked;
-        }
-		#endregion
-
-		#region Instance Methods
-
-		public void Save( string fileName )
-		{
-			using ( StreamWriter writer = new StreamWriter( fileName ) )
-			{
-				Save( writer );
-			}
-		}
-
-		public void Save( TextWriter writer )
-		{
-			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
-	}
-
-	[Serializable]
-	public class VisualTreeNode
-	{
-		[XmlAttribute]
-		public string UniqueName;
-
-		[XmlAttribute,System.ComponentModel.DefaultValue(false)]
-		public bool Expanded;
-
-		[XmlAttribute,System.ComponentModel.DefaultValue(false)]
-		public bool Checked;
-
-		[XmlArrayItem("Node")]
-		public VisualTreeNode[] Nodes;
-
-		public VisualTreeNode() { }
-
-		public VisualTreeNode( TestSuiteTreeNode treeNode )
-		{
-			this.UniqueName = treeNode.Test.TestName.UniqueName;
-			this.Expanded = treeNode.IsExpanded;
-			this.Checked = treeNode.Checked;
-		}
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.Xml.Serialization;
+using NUnit.Core;
+using NUnit.Core.Filters;
+
+namespace NUnit.UiKit
+{
+	/// <summary>
+	/// The VisualState class holds the latest visual state for a project.
+	/// </summary>
+	[Serializable]
+	public class VisualState
+	{
+		#region Fields
+		[XmlAttribute]
+		public bool ShowCheckBoxes;
+
+		public string TopNode;
+
+		public string SelectedNode;
+
+		public string SelectedCategories;
+
+		public bool ExcludeCategories;
+
+		[XmlArrayItem("Node")]
+		public List<VisualTreeNode> Nodes;
+		#endregion
+
+		#region Static Methods
+		public static string GetVisualStateFileName( string testFileName )
+		{
+			if ( testFileName == null )
+				return "VisualState.xml";
+
+			string baseName = testFileName;
+			if ( baseName.EndsWith( ".nunit" ) )
+				baseName = baseName.Substring( 0, baseName.Length - 6 );
+			
+			return baseName + ".VisualState.xml";
+		}
+
+		public static VisualState LoadFrom( string fileName )
+		{
+			using ( StreamReader reader = new StreamReader( fileName ) )
+			{
+				return LoadFrom( reader );
+			}
+		}
+
+		public static VisualState LoadFrom( TextReader reader )
+		{
+			XmlSerializer serializer = new XmlSerializer( typeof( VisualState) );
+			return (VisualState)serializer.Deserialize( reader );
+		}
+		#endregion
+
+		#region Constructors
+		public VisualState() { }
+
+		public VisualState( TestSuiteTreeView treeView )
+		{
+			this.ShowCheckBoxes = treeView.CheckBoxes;
+			this.TopNode = ((TestSuiteTreeNode)treeView.TopNode).Test.TestName.UniqueName;
+			this.SelectedNode = ((TestSuiteTreeNode)treeView.SelectedNode).Test.TestName.UniqueName;
+			this.Nodes = new List<VisualTreeNode>();
+            ProcessTreeNodes( (TestSuiteTreeNode)treeView.Nodes[0] );
+
+			if ( !treeView.CategoryFilter.IsEmpty )
+			{
+				ITestFilter filter = treeView.CategoryFilter;
+				if ( filter is NotFilter )
+				{
+					filter = ((NotFilter)filter).BaseFilter;
+					this.ExcludeCategories = true;
+				}
+
+				this.SelectedCategories = filter.ToString();
+			}
+		}
+
+        private void ProcessTreeNodes(TestSuiteTreeNode node)
+        {
+            if (IsInteresting(node))
+                this.Nodes.Add(new VisualTreeNode(node));
+
+            foreach (TestSuiteTreeNode childNode in node.Nodes)
+                ProcessTreeNodes(childNode);
+        }
+
+        private bool IsInteresting(TestSuiteTreeNode node)
+        {
+            return node.IsExpanded || node.Checked;
+        }
+		#endregion
+
+		#region Instance Methods
+
+		public void Save( string fileName )
+		{
+			using ( StreamWriter writer = new StreamWriter( fileName ) )
+			{
+				Save( writer );
+			}
+		}
+
+		public void Save( TextWriter writer )
+		{
+			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
+	}
+
+	[Serializable]
+	public class VisualTreeNode
+	{
+		[XmlAttribute]
+		public string UniqueName;
+
+		[XmlAttribute,System.ComponentModel.DefaultValue(false)]
+		public bool Expanded;
+
+		[XmlAttribute,System.ComponentModel.DefaultValue(false)]
+		public bool Checked;
+
+		[XmlArrayItem("Node")]
+		public VisualTreeNode[] Nodes;
+
+		public VisualTreeNode() { }
+
+		public VisualTreeNode( TestSuiteTreeNode treeNode )
+		{
+			this.UniqueName = treeNode.Test.TestName.UniqueName;
+			this.Expanded = treeNode.IsExpanded;
+			this.Checked = treeNode.Checked;
+		}
+    }
+}
diff --git a/src/GuiComponents/UiKit/WaitCursor.cs b/src/GuiComponents/UiKit/WaitCursor.cs
index 1c802fc..c30a2d7 100644
--- a/src/GuiComponents/UiKit/WaitCursor.cs
+++ b/src/GuiComponents/UiKit/WaitCursor.cs
@@ -1,52 +1,52 @@
-// ****************************************************************
-// 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.Windows.Forms;
-
-namespace CP.Windows.Forms
-{
-	/// <summary>
-	/// Utility class used to display a wait cursor
-	/// while a long operation takes place and
-	/// guarantee that it will be removed on exit.
-	/// 
-	/// Use as follows:
-	/// 
-	///		using ( new WaitCursor() )
-	///		{
-	///			// Long running operation goes here
-	///		}
-	///		
-	/// </summary>
-	public class WaitCursor : IDisposable
-	{
-		private Cursor cursor;
-		private Control control;
-
-		public WaitCursor()
-		{
-			this.control = null;
-			this.cursor = Cursor.Current;
-			Cursor.Current = Cursors.WaitCursor;
-		}
-
-		public WaitCursor( Control control )
-		{
-			this.control = control;
-			this.cursor = control.Cursor;
-			control.Cursor = Cursors.WaitCursor;
-		}
-
-		public void Dispose()
-		{
-			if ( control != null )
-				control.Cursor = this.cursor;
-			else
-				Cursor.Current = this.cursor;
-		}
-	}
-}
+// ****************************************************************
+// 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.Windows.Forms;
+
+namespace CP.Windows.Forms
+{
+	/// <summary>
+	/// Utility class used to display a wait cursor
+	/// while a long operation takes place and
+	/// guarantee that it will be removed on exit.
+	/// 
+	/// Use as follows:
+	/// 
+	///		using ( new WaitCursor() )
+	///		{
+	///			// Long running operation goes here
+	///		}
+	///		
+	/// </summary>
+	public class WaitCursor : IDisposable
+	{
+		private Cursor cursor;
+		private Control control;
+
+		public WaitCursor()
+		{
+			this.control = null;
+			this.cursor = Cursor.Current;
+			Cursor.Current = Cursors.WaitCursor;
+		}
+
+		public WaitCursor( Control control )
+		{
+			this.control = control;
+			this.cursor = control.Cursor;
+			control.Cursor = Cursors.WaitCursor;
+		}
+
+		public void Dispose()
+		{
+			if ( control != null )
+				control.Cursor = this.cursor;
+			else
+				Cursor.Current = this.cursor;
+		}
+	}
+}
diff --git a/src/GuiComponents/UiKit/nunit.uikit.build b/src/GuiComponents/UiKit/nunit.uikit.build
index cb84afc..364b109 100644
--- a/src/GuiComponents/UiKit/nunit.uikit.build
+++ b/src/GuiComponents/UiKit/nunit.uikit.build
@@ -1,132 +1,132 @@
-<?xml version="1.0"?>
-<project name="NUnitUiKit" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AddConfigurationDialog.cs"/>
-        <include name="AddTabPageDialog.cs"/>
-        <include name="AppContainer.cs"/>
-        <include name="AssemblyInfo.cs"/>
-        <include name="ConfigurationEditor.cs"/>
-        <include name="EditTabPagesDialog.cs"/>
-        <include name="ErrorDisplay.cs"/>
-        <include name="ExpandingLabel.cs"/>
-        <include name="ExpandingTextBox.cs"/>
-        <include name="FolderBrowser.cs"/>
-        <include name="GuiAttachedConsole.cs"/>
-        <include name="GuiTestEventDispatcher.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="RenameConfigurationDialog.cs"/>
-        <include name="ResultTabs.cs"/>
-        <include name="SettingsDialogBase.cs"/>
-        <include name="SimpleSettingsDialog.cs"/>
-        <include name="ScrollingTextDisplayForm.cs"/>
-        <include name="SettingsPage.cs"/>
-        <include name="StatusBar.cs"/>
-        <include name="TabbedSettingsDialog.cs"/>
-        <include name="TestLoaderUI.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"/>
-        <include name="TextDisplay.cs"/>
-        <include name="TextDisplayWriter.cs"/>
-        <include name="TextOutputSettingsPage.cs"/>
-        <include name="TipWindow.cs"/>
-        <include name="TreeBasedSettingsDialog.cs"/>
-        <include name="UserMessage.cs"/>
-        <include name="VisualState.cs"/>
-        <include name="WaitCursor.cs"/>
-  </patternset>
-
-  <patternset id="resource-files">
-        <include name="AddConfigurationDialog.resx"/>
-        <include name="AddTabPageDialog.resx"/>
-        <include name="ConfigurationEditor.resx"/>
-        <include name="EditTabPagesDialog.resx"/>
-        <include name="ErrorDisplay.resx"/>
-        <include name="ExpandingLabel.resx"/>
-        <include name="ExpandingTextBox.resx"/>
-        <include name="LongRunningOperationDisplay.resx"/>
-        <include name="NotRunTree.resx"/>
-        <include name="ProgressBar.resx"/>
-        <include name="RenameConfigurationDialog.resx"/>
-        <include name="ResultTabs.resx"/>
-        <include name="SettingsDialogBase.resx"/>
-        <include name="SettingsPage.resx"/>
-        <include name="SimpleSettingsDialog.resx"/>
-        <include name="StatusBar.resx"/>
-        <include name="TabbedSettingsDialog.resx"/>
-        <include name="TestPropertiesDialog.resx"/>
-        <include name="TestSuiteTreeView.resx"/>
-        <include name="TestTree.resx"/>
-        <include name="TextBoxDisplay.resx"/>
-        <include name="TextDisplayTabPage.resx"/>
-        <include name="TextOutputSettingsPage.resx"/>
-        <include name="TipWindow.resx"/>
-        <include name="TreeBasedSettingsDialog.resx"/>
-        <include name="UserMessage.resx"/>
-        <include name="Images/Ellipsis.gif"/>
-        <include name="Images/pinned.gif"/>
-        <include name="Images/unpinned.gif"/>
-  </patternset>
-
-  <patternset id="content-files">
-    <include name="Images/**"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-    output="${current.lib.dir}/nunit.uikit.dll"
-    debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <resources prefix="NUnit.UiKit" dynamicprefix="true">
-        <patternset refid="resource-files"/>
-      </resources>
-      <references basedir="${current.lib.dir}">
-        <include name="System.Windows.Forms.dll"/>
-        <include name="System.Drawing.dll"/>
-        <include name="System.Data.dll"/>
-        <include name="nunit.uiexception.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-      </references>
-    </csc>
-
-    <copy todir="${current.lib.dir}">
-      <fileset>
-        <patternset refid="content-files"/>
-      </fileset>
-    </copy>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiComponents/UiKit">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <patternset refid="content-files"/>
-        <include name="nunit.uikit.dll.csproj"/>
-        <include name="nunit.uikit.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitUiKit" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AddConfigurationDialog.cs"/>
+        <include name="AddTabPageDialog.cs"/>
+        <include name="AppContainer.cs"/>
+        <include name="AssemblyInfo.cs"/>
+        <include name="ConfigurationEditor.cs"/>
+        <include name="EditTabPagesDialog.cs"/>
+        <include name="ErrorDisplay.cs"/>
+        <include name="ExpandingLabel.cs"/>
+        <include name="ExpandingTextBox.cs"/>
+        <include name="FolderBrowser.cs"/>
+        <include name="GuiAttachedConsole.cs"/>
+        <include name="GuiTestEventDispatcher.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="RenameConfigurationDialog.cs"/>
+        <include name="ResultTabs.cs"/>
+        <include name="SettingsDialogBase.cs"/>
+        <include name="SimpleSettingsDialog.cs"/>
+        <include name="ScrollingTextDisplayForm.cs"/>
+        <include name="SettingsPage.cs"/>
+        <include name="StatusBar.cs"/>
+        <include name="TabbedSettingsDialog.cs"/>
+        <include name="TestLoaderUI.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"/>
+        <include name="TextDisplay.cs"/>
+        <include name="TextDisplayWriter.cs"/>
+        <include name="TextOutputSettingsPage.cs"/>
+        <include name="TipWindow.cs"/>
+        <include name="TreeBasedSettingsDialog.cs"/>
+        <include name="UserMessage.cs"/>
+        <include name="VisualState.cs"/>
+        <include name="WaitCursor.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+        <include name="AddConfigurationDialog.resx"/>
+        <include name="AddTabPageDialog.resx"/>
+        <include name="ConfigurationEditor.resx"/>
+        <include name="EditTabPagesDialog.resx"/>
+        <include name="ErrorDisplay.resx"/>
+        <include name="ExpandingLabel.resx"/>
+        <include name="ExpandingTextBox.resx"/>
+        <include name="LongRunningOperationDisplay.resx"/>
+        <include name="NotRunTree.resx"/>
+        <include name="ProgressBar.resx"/>
+        <include name="RenameConfigurationDialog.resx"/>
+        <include name="ResultTabs.resx"/>
+        <include name="SettingsDialogBase.resx"/>
+        <include name="SettingsPage.resx"/>
+        <include name="SimpleSettingsDialog.resx"/>
+        <include name="StatusBar.resx"/>
+        <include name="TabbedSettingsDialog.resx"/>
+        <include name="TestPropertiesDialog.resx"/>
+        <include name="TestSuiteTreeView.resx"/>
+        <include name="TestTree.resx"/>
+        <include name="TextBoxDisplay.resx"/>
+        <include name="TextDisplayTabPage.resx"/>
+        <include name="TextOutputSettingsPage.resx"/>
+        <include name="TipWindow.resx"/>
+        <include name="TreeBasedSettingsDialog.resx"/>
+        <include name="UserMessage.resx"/>
+        <include name="Images/Ellipsis.gif"/>
+        <include name="Images/pinned.gif"/>
+        <include name="Images/unpinned.gif"/>
+  </patternset>
+
+  <patternset id="content-files">
+    <include name="Images/**"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+    output="${current.lib.dir}/nunit.uikit.dll"
+    debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <resources prefix="NUnit.UiKit" dynamicprefix="true">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.Windows.Forms.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="System.Data.dll"/>
+        <include name="nunit.uiexception.dll"/>
+        <include name="nunit.core.interfaces.dll"/>
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+      </references>
+    </csc>
+
+    <copy todir="${current.lib.dir}">
+      <fileset>
+        <patternset refid="content-files"/>
+      </fileset>
+    </copy>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiComponents/UiKit">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <patternset refid="content-files"/>
+        <include name="nunit.uikit.dll.csproj"/>
+        <include name="nunit.uikit.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/GuiComponents/UiKit/nunit.uikit.dll.csproj b/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
index 9ec2315..80c99d2 100644
--- a/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
+++ b/src/GuiComponents/UiKit/nunit.uikit.dll.csproj
@@ -1,369 +1,403 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.uikit</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.UiKit</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
-      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
-      <Name>nunit.uiexception.dll</Name>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AddConfigurationDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AddTabPageDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AppContainer.cs" />
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="ConfigurationEditor.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="EditTabPagesDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="ErrorDisplay.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExpandingLabel.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="ExpandingTextBox.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="GuiAttachedConsole.cs" />
-    <Compile Include="GuiTestEventDispatcher.cs" />
-    <Compile Include="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="RenameConfigurationDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="ResultTabs.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ScrollingTextDisplayForm.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="SettingsDialogBase.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="SettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SimpleSettingsDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="StatusBar.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TabbedSettingsDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="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>
-    </Compile>
-    <Compile Include="TestTree.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="TextBoxDisplay.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TextDisplayContent.cs" />
-    <Compile Include="TextDisplay.cs" />
-    <Compile Include="TextDisplayTabPage.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="TextDisplayTabSettings.cs" />
-    <Compile Include="TextDisplayWriter.cs" />
-    <Compile Include="TextOutputSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="TipWindow.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="TreeBasedSettingsDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="MessageDisplay.cs" />
-    <Compile Include="VisualState.cs" />
-    <Compile Include="WaitCursor.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="AddConfigurationDialog.resx">
-      <DependentUpon>AddConfigurationDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="AddTabPageDialog.resx">
-      <DependentUpon>AddTabPageDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ConfigurationEditor.resx">
-      <DependentUpon>ConfigurationEditor.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="EditTabPagesDialog.resx">
-      <DependentUpon>EditTabPagesDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ErrorDisplay.resx">
-      <DependentUpon>ErrorDisplay.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExpandingLabel.resx">
-      <DependentUpon>ExpandingLabel.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExpandingTextBox.resx">
-      <DependentUpon>ExpandingTextBox.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="LongRunningOperationDisplay.resx">
-      <DependentUpon>LongRunningOperationDisplay.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="NotRunTree.resx">
-      <DependentUpon>NotRunTree.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ProgressBar.resx">
-      <DependentUpon>ProgressBar.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="RenameConfigurationDialog.resx">
-      <DependentUpon>RenameConfigurationDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ResultTabs.resx">
-      <DependentUpon>ResultTabs.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsDialogBase.resx">
-      <DependentUpon>SettingsDialogBase.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPage.resx">
-      <DependentUpon>SettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SimpleSettingsDialog.resx">
-      <DependentUpon>SimpleSettingsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="StatusBar.resx">
-      <DependentUpon>StatusBar.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TabbedSettingsDialog.resx">
-      <DependentUpon>TabbedSettingsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TestPropertiesDialog.resx">
-      <DependentUpon>TestPropertiesDialog.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TestSuiteTreeView.resx">
-      <DependentUpon>TestSuiteTreeView.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TestTree.resx">
-      <DependentUpon>TestTree.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TextOutputSettingsPage.resx">
-      <DependentUpon>TextOutputSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TipWindow.resx">
-      <DependentUpon>TipWindow.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="TreeBasedSettingsDialog.resx">
-      <DependentUpon>TreeBasedSettingsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Images\pinned.gif" />
-    <EmbeddedResource Include="Images\unpinned.gif" />
-  </ItemGroup>
-  <ItemGroup>
-    <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" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.uikit</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.UiKit</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AddConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddTabPageDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AppContainer.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="ConfigurationEditor.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="EditTabPagesDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ErrorDisplay.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ExpandingLabel.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ExpandingTextBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="GuiAttachedConsole.cs" />
+    <Compile Include="GuiTestEventDispatcher.cs" />
+    <Compile Include="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="RenameConfigurationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ResultTabs.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScrollingTextDisplayForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SettingsDialogBase.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="SettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SimpleSettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="StatusBar.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TabbedSettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="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>
+    </Compile>
+    <Compile Include="TestTree.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TextBoxDisplay.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TextDisplayContent.cs" />
+    <Compile Include="TextDisplay.cs" />
+    <Compile Include="TextDisplayTabPage.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TextDisplayTabSettings.cs" />
+    <Compile Include="TextDisplayWriter.cs" />
+    <Compile Include="TextOutputSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TipWindow.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TreeBasedSettingsDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MessageDisplay.cs" />
+    <Compile Include="VisualState.cs" />
+    <Compile Include="WaitCursor.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="AddConfigurationDialog.resx">
+      <DependentUpon>AddConfigurationDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AddTabPageDialog.resx">
+      <DependentUpon>AddTabPageDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConfigurationEditor.resx">
+      <DependentUpon>ConfigurationEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditTabPagesDialog.resx">
+      <DependentUpon>EditTabPagesDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ErrorDisplay.resx">
+      <DependentUpon>ErrorDisplay.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExpandingLabel.resx">
+      <DependentUpon>ExpandingLabel.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExpandingTextBox.resx">
+      <DependentUpon>ExpandingTextBox.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LongRunningOperationDisplay.resx">
+      <DependentUpon>LongRunningOperationDisplay.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NotRunTree.resx">
+      <DependentUpon>NotRunTree.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProgressBar.resx">
+      <DependentUpon>ProgressBar.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="RenameConfigurationDialog.resx">
+      <DependentUpon>RenameConfigurationDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ResultTabs.resx">
+      <DependentUpon>ResultTabs.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsDialogBase.resx">
+      <DependentUpon>SettingsDialogBase.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPage.resx">
+      <DependentUpon>SettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SimpleSettingsDialog.resx">
+      <DependentUpon>SimpleSettingsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="StatusBar.resx">
+      <DependentUpon>StatusBar.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TabbedSettingsDialog.resx">
+      <DependentUpon>TabbedSettingsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TestPropertiesDialog.resx">
+      <DependentUpon>TestPropertiesDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TestSuiteTreeView.resx">
+      <DependentUpon>TestSuiteTreeView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TestTree.resx">
+      <DependentUpon>TestTree.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TextOutputSettingsPage.resx">
+      <DependentUpon>TextOutputSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TipWindow.resx">
+      <DependentUpon>TipWindow.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TreeBasedSettingsDialog.resx">
+      <DependentUpon>TreeBasedSettingsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Images\pinned.gif" />
+    <EmbeddedResource Include="Images\unpinned.gif" />
+  </ItemGroup>
+  <ItemGroup>
+    <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>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/GuiComponents/tests/AddConfigurationDialogTests.cs b/src/GuiComponents/tests/AddConfigurationDialogTests.cs
index 10d39f9..a52134d 100644
--- a/src/GuiComponents/tests/AddConfigurationDialogTests.cs
+++ b/src/GuiComponents/tests/AddConfigurationDialogTests.cs
@@ -1,93 +1,93 @@
-// ****************************************************************
-// 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.Windows.Forms;
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.TestUtilities;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class AddConfigurationDialogTests : FormTester
-	{
-		private NUnitProject project;
-		private AddConfigurationDialog dlg;
-
-		[SetUp]
-		public void SetUp()
-		{
-			project = new NUnitProject( "path" );
-			project.Configs.Add( "Debug" );
-			project.Configs.Add( "Release" );
-			dlg = new AddConfigurationDialog( project );
-			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 CheckTextBox()
-		{
-			TextBox configBox = TextBoxes["configurationNameTextBox"];
-			Assert.AreEqual( "", configBox.Text );
-		}
-
-		[Test]
-		public void CheckComboBox()
-		{
-			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( "Debug", 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.ConfigurationName );
-			Assert.AreEqual( "Debug", dlg.CopyConfigurationName );
-		}
-
-		[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( "<none>" );
-
-			okButton.PerformClick();
-			Assert.AreEqual( "Super", dlg.ConfigurationName );
-			Assert.IsNull( dlg.CopyConfigurationName );
-		}
-	}
-}
+// ****************************************************************
+// 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.Windows.Forms;
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestUtilities;
+
+namespace NUnit.UiKit.Tests
+{
+	[TestFixture]
+	public class AddConfigurationDialogTests : FormTester
+	{
+		private NUnitProject project;
+		private AddConfigurationDialog dlg;
+
+		[SetUp]
+		public void SetUp()
+		{
+			project = new NUnitProject( "path" );
+			project.Configs.Add( "Debug" );
+			project.Configs.Add( "Release" );
+			dlg = new AddConfigurationDialog( project );
+			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 CheckTextBox()
+		{
+			TextBox configBox = TextBoxes["configurationNameTextBox"];
+			Assert.AreEqual( "", configBox.Text );
+		}
+
+		[Test]
+		public void CheckComboBox()
+		{
+			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( "Debug", 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.ConfigurationName );
+			Assert.AreEqual( "Debug", dlg.CopyConfigurationName );
+		}
+
+		[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( "<none>" );
+
+			okButton.PerformClick();
+			Assert.AreEqual( "Super", dlg.ConfigurationName );
+			Assert.IsNull( dlg.CopyConfigurationName );
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/ErrorDisplayTests.cs b/src/GuiComponents/tests/ErrorDisplayTests.cs
index 9374843..284a3a9 100644
--- a/src/GuiComponents/tests/ErrorDisplayTests.cs
+++ b/src/GuiComponents/tests/ErrorDisplayTests.cs
@@ -1,43 +1,43 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Windows.Forms;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class ErrorDisplayTests : ControlTester
-	{
-		[TestFixtureSetUp]
-		public void CreateForm()
-		{
-			this.Control = new ErrorDisplay();
-		}
-
-		[TestFixtureTearDown]
-		public void CloseForm()
-		{
-			this.Control.Dispose();
-		}
-
-		[Test]
-		public void ControlsExist()
-		{
-			AssertControlExists( "detailList", typeof( ListBox ) );
-			AssertControlExists( "tabSplitter", typeof( Splitter ) );
-			AssertControlExists( "errorBrowser", typeof( NUnit.UiException.Controls.ErrorBrowser ) );
-		}
-
-		[Test]
-		public void ControlsArePositionedCorrectly()
-		{
-			AssertControlsAreStackedVertically( "detailList", "tabSplitter", "errorBrowser" );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Windows.Forms;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.UiKit.Tests
+{
+	[TestFixture]
+	public class ErrorDisplayTests : ControlTester
+	{
+		[TestFixtureSetUp]
+		public void CreateForm()
+		{
+			this.Control = new ErrorDisplay();
+		}
+
+		[TestFixtureTearDown]
+		public void CloseForm()
+		{
+			this.Control.Dispose();
+		}
+
+		[Test]
+		public void ControlsExist()
+		{
+			AssertControlExists( "detailList", typeof( ListBox ) );
+			AssertControlExists( "tabSplitter", typeof( Splitter ) );
+			AssertControlExists( "errorBrowser", typeof( NUnit.UiException.Controls.ErrorBrowser ) );
+		}
+
+		[Test]
+		public void ControlsArePositionedCorrectly()
+		{
+			AssertControlsAreStackedVertically( "detailList", "tabSplitter", "errorBrowser" );
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs b/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs
index e914d50..474e1b8 100644
--- a/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs
+++ b/src/GuiComponents/tests/LongRunningOperationDisplayTests.cs
@@ -1,39 +1,39 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Windows.Forms;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class LongRunningOperationDisplayTests : AssertionHelper
-	{
-        // This test was intermittently throwing the following exception under .NET 1.0.
-        // System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
-        //  at System.Drawing.Graphics.DrawRectangle(Pen pen, Int32 x, Int32 y, Int32 width, Int32 height)
-        //  at System.Drawing.Graphics.DrawRectangle(Pen pen, Rectangle rect)
-        //  at NUnit.UiKit.LongRunningOperationDisplay.OnPaint(PaintEventArgs e) in .\src\GuiComponents\UiKit\LongRunningOperationDisplay.cs:line 117
-        [Test, Platform(Exclude = "NET-1.0")]
-        public void CreateDisplay()
-		{
-			Form form = new Form();
-			LongRunningOperationDisplay display = new LongRunningOperationDisplay( form, "Loading..." );
-			Expect( display.Owner, EqualTo( form ) );
-			Expect( GetOperationText( display ), EqualTo( "Loading..." ) );
-		}
-
-		private string GetOperationText( Control display )
-		{
-			foreach( Control control in display.Controls )
-				if ( control.Name == "operation" )
-					return control.Text;
-
-			return null;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Windows.Forms;
+using NUnit.Framework;
+
+namespace NUnit.UiKit.Tests
+{
+	[TestFixture]
+	public class LongRunningOperationDisplayTests : AssertionHelper
+	{
+        // This test was intermittently throwing the following exception under .NET 1.0.
+        // System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
+        //  at System.Drawing.Graphics.DrawRectangle(Pen pen, Int32 x, Int32 y, Int32 width, Int32 height)
+        //  at System.Drawing.Graphics.DrawRectangle(Pen pen, Rectangle rect)
+        //  at NUnit.UiKit.LongRunningOperationDisplay.OnPaint(PaintEventArgs e) in .\src\GuiComponents\UiKit\LongRunningOperationDisplay.cs:line 117
+        [Test, Platform(Exclude = "NET-1.0")]
+        public void CreateDisplay()
+		{
+			Form form = new Form();
+			LongRunningOperationDisplay display = new LongRunningOperationDisplay( form, "Loading..." );
+			Expect( display.Owner, EqualTo( form ) );
+			Expect( GetOperationText( display ), EqualTo( "Loading..." ) );
+		}
+
+		private string GetOperationText( Control display )
+		{
+			foreach( Control control in display.Controls )
+				if ( control.Name == "operation" )
+					return control.Text;
+
+			return null;
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/ProgressBarTests.cs b/src/GuiComponents/tests/ProgressBarTests.cs
index 4a3307e..a9f4ecd 100644
--- a/src/GuiComponents/tests/ProgressBarTests.cs
+++ b/src/GuiComponents/tests/ProgressBarTests.cs
@@ -1,65 +1,65 @@
-// ****************************************************************
-// 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
-// ****************************************************************
-
-namespace NUnit.UiKit.Tests
-{
-	using System;
-	using System.Drawing;
-	using NUnit.Framework;
-	using NUnit.Core;
-	using NUnit.Util;
-	using NUnit.Tests.Assemblies;
-	using NUnit.TestUtilities;
-
-	/// <summary>
-	/// Summary description for ProgressBarTests.
-	/// </summary>
-	[TestFixture]
-	public class ProgressBarTests
-	{
-		private TestProgressBar progressBar;
-		private MockTestEventSource mockEvents;
-		private string testsDll = MockAssembly.AssemblyPath;
-		private TestSuite suite;
-		int testCount;
-
-		[SetUp]
-		public void Setup()
-		{
-			progressBar = new TestProgressBar();
-
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			suite = builder.Build( new TestPackage( testsDll ) );
-
-			mockEvents = new MockTestEventSource( suite );
-		}
-
-        // .NET 1.0 sometimes throws:
-        // ExternalException : A generic error occurred in GDI+.
-        [Test, Platform(Exclude = "Net-1.0")]
-        public void TestProgressDisplay()
-		{
-			progressBar.Subscribe( mockEvents );
-			mockEvents.TestFinished += new TestEventHandler( OnTestFinished );
-
-			testCount = 0;
-			mockEvents.SimulateTestRun();
-			
-			Assert.AreEqual( 0, progressBar.Minimum );
-			Assert.AreEqual( MockAssembly.Tests, progressBar.Maximum );
-			Assert.AreEqual( 1, progressBar.Step );
-			Assert.AreEqual( MockAssembly.ResultCount, progressBar.Value );
-			Assert.AreEqual( Color.Red, progressBar.ForeColor );
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs e )
-		{
-			++testCount;
-			// Assumes delegates are called in order of adding
-			Assert.AreEqual( testCount, progressBar.Value );
-		}
-	}
-}
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.UiKit.Tests
+{
+	using System;
+	using System.Drawing;
+	using NUnit.Framework;
+	using NUnit.Core;
+	using NUnit.Util;
+	using NUnit.Tests.Assemblies;
+	using NUnit.TestUtilities;
+
+	/// <summary>
+	/// Summary description for ProgressBarTests.
+	/// </summary>
+	[TestFixture]
+	public class ProgressBarTests
+	{
+		private TestProgressBar progressBar;
+		private MockTestEventSource mockEvents;
+		private string testsDll = MockAssembly.AssemblyPath;
+		private TestSuite suite;
+		int testCount;
+
+		[SetUp]
+		public void Setup()
+		{
+			progressBar = new TestProgressBar();
+
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			suite = builder.Build( new TestPackage( testsDll ) );
+
+			mockEvents = new MockTestEventSource( suite );
+		}
+
+        // .NET 1.0 sometimes throws:
+        // ExternalException : A generic error occurred in GDI+.
+        [Test, Platform(Exclude = "Net-1.0")]
+        public void TestProgressDisplay()
+		{
+			progressBar.Subscribe( mockEvents );
+			mockEvents.TestFinished += new TestEventHandler( OnTestFinished );
+
+			testCount = 0;
+			mockEvents.SimulateTestRun();
+			
+			Assert.AreEqual( 0, progressBar.Minimum );
+			Assert.AreEqual( MockAssembly.Tests, progressBar.Maximum );
+			Assert.AreEqual( 1, progressBar.Step );
+			Assert.AreEqual( MockAssembly.ResultCount, progressBar.Value );
+			Assert.AreEqual( Color.Red, progressBar.ForeColor );
+		}
+
+		private void OnTestFinished( object sender, TestEventArgs e )
+		{
+			++testCount;
+			// Assumes delegates are called in order of adding
+			Assert.AreEqual( testCount, progressBar.Value );
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/StatusBarTests.cs b/src/GuiComponents/tests/StatusBarTests.cs
index 53603be..80bfd4e 100644
--- a/src/GuiComponents/tests/StatusBarTests.cs
+++ b/src/GuiComponents/tests/StatusBarTests.cs
@@ -1,143 +1,143 @@
-// ****************************************************************
-// 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 NUnit.Framework;
-using NUnit.Core;
-using NUnit.Util;
-using NUnit.Tests.Assemblies;
-using NUnit.TestUtilities;
-
-namespace NUnit.UiKit.Tests
-{
-	/// <summary>
-	/// Summary description for StatusBarTests.
-	/// </summary>
-	[TestFixture]
-	public class StatusBarTests
-	{
-		private StatusBar statusBar;
-		private MockTestEventSource mockEvents;
-		private static string testsDll = MockAssembly.AssemblyPath;
-		TestSuite suite;
-	    int testCount = 0;
-
-		[SetUp]
-		public void Setup()
-		{
-			statusBar = new StatusBar();
-
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			suite = builder.Build( new TestPackage( testsDll ) );
-
-			mockEvents = new MockTestEventSource( suite );
-		}
-
-		[Test]
-		public void TestConstruction()
-		{
-			Assert.AreEqual( "Status", statusBar.Panels[0].Text );
-			Assert.AreEqual( "Test Cases : 0", statusBar.Panels[1].Text );
-			Assert.AreEqual( "", statusBar.Panels[2].Text );
-			Assert.AreEqual( "", statusBar.Panels[3].Text );
-			Assert.AreEqual( "", statusBar.Panels[4].Text );
-		}
-
-		[Test]
-		public void TestInitialization()
-		{
-			statusBar.Initialize( 0 );
-			Assert.AreEqual( "", statusBar.Panels[0].Text );
-			Assert.AreEqual( "Test Cases : 0", statusBar.Panels[1].Text );
-			Assert.AreEqual( "", statusBar.Panels[2].Text );
-			Assert.AreEqual( "", statusBar.Panels[3].Text );
-			Assert.AreEqual( "", statusBar.Panels[4].Text );
-
-			statusBar.Initialize( 50 );
-			Assert.AreEqual( "Ready", statusBar.Panels[0].Text );
-			Assert.AreEqual( "Test Cases : 50", statusBar.Panels[1].Text );
-			Assert.AreEqual( "", statusBar.Panels[2].Text );
-			Assert.AreEqual( "", statusBar.Panels[3].Text );
-			Assert.AreEqual( "", statusBar.Panels[4].Text );
-		}
-
-		[Test]
-		public void TestFinalDisplay()
-		{
-			Assert.AreEqual( false, statusBar.DisplayTestProgress );
-			statusBar.Subscribe( mockEvents );
-
-			mockEvents.SimulateTestRun();
-			Assert.AreEqual( "Completed", statusBar.Panels[0].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Test Cases", MockAssembly.Tests ), 
-				statusBar.Panels[1].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Tests Run", MockAssembly.TestsRun ),
-				statusBar.Panels[2].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Errors", MockAssembly.Errors ),
-				statusBar.Panels[3].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Failures", MockAssembly.Failures ),
-				statusBar.Panels[4].Text );
-		}
-
-        // .NET 1.0 sometimes throws:
-        // ExternalException : A generic error occurred in GDI+.
-        [Test, Platform(Exclude = "Net-1.0")]
-        public void TestProgressDisplay()
-		{
-			statusBar.DisplayTestProgress = true;
-			statusBar.Subscribe( mockEvents );
-
-			testCount = 0;
-            testCount = 0;
-			mockEvents.TestFinished += new TestEventHandler( OnTestFinished );
-
-			mockEvents.SimulateTestRun();
-			Assert.AreEqual( "Completed", statusBar.Panels[0].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Test Cases", MockAssembly.Tests ), 
-				statusBar.Panels[1].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Tests Run", MockAssembly.TestsRun ),
-				statusBar.Panels[2].Text );
-			Assert.AreEqual( 
-				PanelMessage( "Errors", MockAssembly.Errors ),
-				statusBar.Panels[3].Text );
-			Assert.AreEqual(
-				PanelMessage( "Failures", MockAssembly.Failures ),
-				statusBar.Panels[4].Text );
-		}
-
-		private void OnTestFinished( object sender, TestEventArgs e )
-		{
-			Assert.AreEqual( 
-				PanelMessage( "Test Cases", MockAssembly.Tests ),
-				statusBar.Panels[1].Text );
-
-            StringAssert.EndsWith( e.Result.Test.TestName.Name, statusBar.Panels[0].Text );
-            
-		    string runPanel = statusBar.Panels[2].Text;
-		    int testsRun = 0;
-            if (runPanel != "")
-            {
-                StringAssert.StartsWith( "Tests Run : ", runPanel );
-                testsRun = int.Parse(runPanel.Substring(12));
-            }
-
-            Assert.GreaterOrEqual( testsRun, testCount);
-            Assert.LessOrEqual( testsRun, testCount + 1);
-		    testCount = testsRun;
-   		}
-
-		private static string PanelMessage( string text, int count )
-		{
-			return string.Format( "{0} : {1}", text, count );
-		}
-	}
-}
+// ****************************************************************
+// 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 NUnit.Framework;
+using NUnit.Core;
+using NUnit.Util;
+using NUnit.Tests.Assemblies;
+using NUnit.TestUtilities;
+
+namespace NUnit.UiKit.Tests
+{
+	/// <summary>
+	/// Summary description for StatusBarTests.
+	/// </summary>
+	[TestFixture]
+	public class StatusBarTests
+	{
+		private StatusBar statusBar;
+		private MockTestEventSource mockEvents;
+		private static string testsDll = MockAssembly.AssemblyPath;
+		TestSuite suite;
+	    int testCount = 0;
+
+		[SetUp]
+		public void Setup()
+		{
+			statusBar = new StatusBar();
+
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			suite = builder.Build( new TestPackage( testsDll ) );
+
+			mockEvents = new MockTestEventSource( suite );
+		}
+
+		[Test]
+		public void TestConstruction()
+		{
+			Assert.AreEqual( "Status", statusBar.Panels[0].Text );
+			Assert.AreEqual( "Test Cases : 0", statusBar.Panels[1].Text );
+			Assert.AreEqual( "", statusBar.Panels[2].Text );
+			Assert.AreEqual( "", statusBar.Panels[3].Text );
+			Assert.AreEqual( "", statusBar.Panels[4].Text );
+		}
+
+		[Test]
+		public void TestInitialization()
+		{
+			statusBar.Initialize( 0 );
+			Assert.AreEqual( "", statusBar.Panels[0].Text );
+			Assert.AreEqual( "Test Cases : 0", statusBar.Panels[1].Text );
+			Assert.AreEqual( "", statusBar.Panels[2].Text );
+			Assert.AreEqual( "", statusBar.Panels[3].Text );
+			Assert.AreEqual( "", statusBar.Panels[4].Text );
+
+			statusBar.Initialize( 50 );
+			Assert.AreEqual( "Ready", statusBar.Panels[0].Text );
+			Assert.AreEqual( "Test Cases : 50", statusBar.Panels[1].Text );
+			Assert.AreEqual( "", statusBar.Panels[2].Text );
+			Assert.AreEqual( "", statusBar.Panels[3].Text );
+			Assert.AreEqual( "", statusBar.Panels[4].Text );
+		}
+
+		[Test]
+		public void TestFinalDisplay()
+		{
+			Assert.AreEqual( false, statusBar.DisplayTestProgress );
+			statusBar.Subscribe( mockEvents );
+
+			mockEvents.SimulateTestRun();
+			Assert.AreEqual( "Completed", statusBar.Panels[0].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Test Cases", MockAssembly.Tests ), 
+				statusBar.Panels[1].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Tests Run", MockAssembly.TestsRun ),
+				statusBar.Panels[2].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Errors", MockAssembly.Errors ),
+				statusBar.Panels[3].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Failures", MockAssembly.Failures ),
+				statusBar.Panels[4].Text );
+		}
+
+        // .NET 1.0 sometimes throws:
+        // ExternalException : A generic error occurred in GDI+.
+        [Test, Platform(Exclude = "Net-1.0")]
+        public void TestProgressDisplay()
+		{
+			statusBar.DisplayTestProgress = true;
+			statusBar.Subscribe( mockEvents );
+
+			testCount = 0;
+            testCount = 0;
+			mockEvents.TestFinished += new TestEventHandler( OnTestFinished );
+
+			mockEvents.SimulateTestRun();
+			Assert.AreEqual( "Completed", statusBar.Panels[0].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Test Cases", MockAssembly.Tests ), 
+				statusBar.Panels[1].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Tests Run", MockAssembly.TestsRun ),
+				statusBar.Panels[2].Text );
+			Assert.AreEqual( 
+				PanelMessage( "Errors", MockAssembly.Errors ),
+				statusBar.Panels[3].Text );
+			Assert.AreEqual(
+				PanelMessage( "Failures", MockAssembly.Failures ),
+				statusBar.Panels[4].Text );
+		}
+
+		private void OnTestFinished( object sender, TestEventArgs e )
+		{
+			Assert.AreEqual( 
+				PanelMessage( "Test Cases", MockAssembly.Tests ),
+				statusBar.Panels[1].Text );
+
+            StringAssert.EndsWith( e.Result.Test.TestName.Name, statusBar.Panels[0].Text );
+            
+		    string runPanel = statusBar.Panels[2].Text;
+		    int testsRun = 0;
+            if (runPanel != "")
+            {
+                StringAssert.StartsWith( "Tests Run : ", runPanel );
+                testsRun = int.Parse(runPanel.Substring(12));
+            }
+
+            Assert.GreaterOrEqual( testsRun, testCount);
+            Assert.LessOrEqual( testsRun, testCount + 1);
+		    testCount = testsRun;
+   		}
+
+		private static string PanelMessage( string text, int count )
+		{
+			return string.Format( "{0} : {1}", text, count );
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs b/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs
index c9e516f..7a0ea75 100644
--- a/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs
+++ b/src/GuiComponents/tests/TestSuiteTreeNodeTests.cs
@@ -1,180 +1,138 @@
-// ****************************************************************
-// 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
-// ****************************************************************
-
-namespace NUnit.UiKit.Tests
-{
-	using System;
-	using NUnit.Core;
-	using NUnit.Core.Builders;
-	using NUnit.Framework;
-	using NUnit.Util;
-	using NUnit.Tests.Assemblies;
-
-	/// <summary>
-	/// Summary description for TestSuiteTreeNodeTests.
-	/// </summary>
-	[TestFixture]
-	public class TestSuiteTreeNodeTests
-	{
-		TestSuite testSuite;
-		Test testFixture;
-		Test testCase;
-
-		TestInfo suiteInfo;
-		TestInfo fixtureInfo;
-		TestInfo testCaseInfo;
-
-		[SetUp]
-		public void SetUp()
-		{
-			testSuite = new TestSuite("MyTestSuite");
-			testFixture = TestFixtureBuilder.BuildFrom( typeof( MockTestFixture ) );
-			testSuite.Add( testFixture );
-
-			suiteInfo = new TestInfo( testSuite );
-			fixtureInfo = new TestInfo( testFixture );
-
-			testCase = (NUnit.Core.Test)testFixture.Tests[0];
-			testCaseInfo = new TestInfo( testCase );
-		}
-
-		[Test]
-		public void ConstructFromTestInfo()
-		{
-			TestSuiteTreeNode node;
-			
-			node = new TestSuiteTreeNode( suiteInfo );
-			Assert.AreEqual( "MyTestSuite", node.Text );
-			Assert.AreEqual( "TestSuite", node.TestType );
-
-			node = new TestSuiteTreeNode( fixtureInfo );
-			Assert.AreEqual( "MockTestFixture", node.Text );
-			Assert.AreEqual( "TestFixture", node.TestType );
-
-			node = new TestSuiteTreeNode( testCaseInfo );
-			Assert.AreEqual( "MockTest1", node.Text );
-			Assert.AreEqual( "TestMethod", node.TestType );
-		}
-
-        [Test]
-        public void ResultNotSet()
-        {
-            TestSuiteTreeNode node = new TestSuiteTreeNode(testCaseInfo);
-
-            Assert.AreEqual(TestSuiteTreeNode.InitIndex, node.ImageIndex);
-            Assert.AreEqual(TestSuiteTreeNode.InitIndex, node.SelectedImageIndex);
-        }
-
-        [Test]
-        public void SetResult_Inconclusive()
-        {
-            TestSuiteTreeNode node = new TestSuiteTreeNode(testCaseInfo);
-            TestResult result = new TestResult(testCaseInfo);
-
-            result.SetResult(ResultState.Inconclusive, null, null);
-            node.Result = result;
-            Assert.AreEqual("MockTest1", node.Result.Name);
-            Assert.AreEqual(TestSuiteTreeNode.InconclusiveIndex, node.ImageIndex);
-            Assert.AreEqual(TestSuiteTreeNode.InconclusiveIndex, node.SelectedImageIndex);
-            Assert.AreEqual(result.ResultState.ToString(), node.StatusText);
-        }
-
-        [Test]
-		public void SetResult_Ignore()
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestResult result = new TestResult( testCaseInfo );
-
-			result.Ignore( "reason" );
-			node.Result = result;
-			Assert.AreEqual( "MockTest1", node.Result.Name );
-			Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, node.SelectedImageIndex );
-			Assert.AreEqual( "Ignored", node.StatusText );
-		}
-
-		[Test]
-		public void SetResult_Success()
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestResult result = new TestResult( testCaseInfo );
-
-			result.Success();
-			node.Result = result;
-			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node.SelectedImageIndex );
-			Assert.AreEqual( "Success", node.StatusText );
-		}
-
-		[Test]
-		public void SetResult_Failure()
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestResult result = new TestResult( testCaseInfo );
-
-			result.Failure("message", "stacktrace");
-			node.Result = result;
-			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.SelectedImageIndex );
-			Assert.AreEqual( "Failure", node.StatusText );
-		}
-
-		[Test]
-		public void SetResult_Skipped()
-		{
-			TestSuiteTreeNode node = new TestSuiteTreeNode( testCaseInfo );
-			TestResult result = new TestResult( testCaseInfo );
-
-            result.Skip("");
-			node.Result = result;
-			Assert.AreEqual( TestSuiteTreeNode.SkippedIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.SkippedIndex, node.SelectedImageIndex );
-			Assert.AreEqual( "Skipped", node.StatusText );
-		}
-
-		[Test]
-		public void ClearResult()
-		{
-			TestResult result = new TestResult( testCaseInfo );
-			result.Failure("message", "stacktrace");
-
-			TestSuiteTreeNode node = new TestSuiteTreeNode( result );
-			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.SelectedImageIndex );
-
-			node.ClearResults();
-			Assert.AreEqual( null, node.Result );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node.SelectedImageIndex );
-		}
-		
-		[Test]
-		public void ClearNestedResults()
-		{
-			TestResult testCaseResult = new TestResult( testCaseInfo );
-			testCaseResult.Success();
-			TestResult testSuiteResult = new TestResult( fixtureInfo );
-			testSuiteResult.AddResult( testCaseResult );
-            testSuiteResult.Success();
-
-			TestSuiteTreeNode node1 = new TestSuiteTreeNode( testSuiteResult );
-			TestSuiteTreeNode node2 = new TestSuiteTreeNode( testCaseResult );
-			node1.Nodes.Add( node2 );
-
-			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node1.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node1.SelectedImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node2.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node2.SelectedImageIndex );
-
-			node1.ClearResults();
-
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node1.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node1.SelectedImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node2.ImageIndex );
-			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node2.SelectedImageIndex );
-		}
-	}
-}
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.UiKit.Tests
+{
+	using System;
+	using NUnit.Core;
+	using NUnit.Core.Builders;
+	using NUnit.Framework;
+	using NUnit.Util;
+	using NUnit.Tests.Assemblies;
+    using NUnit.TestUtilities;
+
+	/// <summary>
+	/// Summary description for TestSuiteTreeNodeTests.
+	/// </summary>
+	[TestFixture]
+	public class TestSuiteTreeNodeTests
+	{
+		TestSuite testSuite;
+		Test testFixture;
+		Test testCase;
+
+		[SetUp]
+		public void SetUp()
+		{
+			testSuite = new TestSuite("MyTestSuite");
+			testFixture = TestFixtureBuilder.BuildFrom( typeof( MockTestFixture ) );
+			testSuite.Add( testFixture );
+
+			testCase = TestFinder.Find("MockTest1", testFixture, false);
+		}
+
+		[Test]
+		public void CanConstructFromTestSuite()
+		{
+			TestSuiteTreeNode node = new TestSuiteTreeNode( new TestInfo(testSuite) );
+			Assert.AreEqual( "MyTestSuite", node.Text );
+			Assert.AreEqual( "TestSuite", node.TestType );
+        }
+
+        [Test]
+        public void CanConstructFromTestFixture()
+        {
+			TestSuiteTreeNode node = new TestSuiteTreeNode( new TestInfo(testFixture) );
+			Assert.AreEqual( "MockTestFixture", node.Text );
+			Assert.AreEqual( "TestFixture", node.TestType );
+        }
+
+        [Test]
+        public void CanConstructFromTestCase()
+        {
+			TestSuiteTreeNode node = new TestSuiteTreeNode( new TestInfo(testCase) );
+			Assert.AreEqual( "MockTest1", node.Text );
+			Assert.AreEqual( "TestMethod", node.TestType );
+		}
+
+        [TestCase("MockTest1", TestSuiteTreeNode.InitIndex)]
+        [TestCase("MockTest4", TestSuiteTreeNode.IgnoredIndex)]
+        [TestCase("NotRunnableTest", TestSuiteTreeNode.FailureIndex)]
+        public void WhenResultIsNotSet_IndexReflectsRunState(string testName, int expectedIndex)
+        {
+            Test test = TestFinder.Find(testName, testFixture, false);
+            TestSuiteTreeNode node = new TestSuiteTreeNode(new TestInfo(test));
+
+            Assert.AreEqual(expectedIndex, node.ImageIndex);
+            Assert.AreEqual(expectedIndex, node.SelectedImageIndex);
+        }
+
+        [TestCase(ResultState.Inconclusive, TestSuiteTreeNode.InconclusiveIndex)]
+        [TestCase(ResultState.NotRunnable, TestSuiteTreeNode.FailureIndex)]
+        [TestCase(ResultState.Skipped, TestSuiteTreeNode.SkippedIndex)]
+        [TestCase(ResultState.Ignored, TestSuiteTreeNode.IgnoredIndex)]
+        [TestCase(ResultState.Success, TestSuiteTreeNode.SuccessIndex)]
+        [TestCase(ResultState.Failure, TestSuiteTreeNode.FailureIndex)]
+        [TestCase(ResultState.Error, TestSuiteTreeNode.FailureIndex)]
+        [TestCase(ResultState.Cancelled, TestSuiteTreeNode.FailureIndex)]
+        public void WhenResultIsSet_IndexReflectsResultState(ResultState resultState, int expectedIndex)
+        {
+            TestSuiteTreeNode node = new TestSuiteTreeNode(new TestInfo(testCase));
+            TestResult result = new TestResult(testCase);
+
+            result.SetResult(resultState, null, null);
+            node.Result = result;
+            Assert.AreEqual(expectedIndex, node.ImageIndex);
+            Assert.AreEqual(expectedIndex, node.SelectedImageIndex);
+            Assert.AreEqual(resultState.ToString(), node.StatusText);
+        }
+
+        [TestCase("MockTest1", TestSuiteTreeNode.InitIndex)]
+        [TestCase("MockTest4", TestSuiteTreeNode.IgnoredIndex)]
+        [TestCase("NotRunnableTest", TestSuiteTreeNode.FailureIndex)]
+        public void WhenResultIsCleared_IndexReflectsRunState(string testName, int expectedIndex)
+		{
+            Test test = TestFinder.Find(testName, testFixture, false);
+			TestResult result = new TestResult( test );
+			result.Failure("message", "stacktrace");
+
+			TestSuiteTreeNode node = new TestSuiteTreeNode( result );
+			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.ImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.FailureIndex, node.SelectedImageIndex );
+
+			node.ClearResults();
+			Assert.AreEqual( null, node.Result );
+			Assert.AreEqual( expectedIndex, node.ImageIndex );
+			Assert.AreEqual( expectedIndex, node.SelectedImageIndex );
+		}
+		
+		[Test]
+		public void WhenResultIsCleared_NestedResultsAreAlsoCleared()
+		{
+			TestResult testCaseResult = new TestResult( testCase );
+			testCaseResult.Success();
+			TestResult testSuiteResult = new TestResult( testFixture );
+			testSuiteResult.AddResult( testCaseResult );
+            testSuiteResult.Success();
+
+			TestSuiteTreeNode node1 = new TestSuiteTreeNode( testSuiteResult );
+			TestSuiteTreeNode node2 = new TestSuiteTreeNode( testCaseResult );
+			node1.Nodes.Add( node2 );
+
+			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node1.ImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node1.SelectedImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node2.ImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, node2.SelectedImageIndex );
+
+			node1.ClearResults();
+
+			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node1.ImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node1.SelectedImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node2.ImageIndex );
+			Assert.AreEqual( TestSuiteTreeNode.InitIndex, node2.SelectedImageIndex );
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs b/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
index af7cbe1..47e42c8 100644
--- a/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
+++ b/src/GuiComponents/tests/TestSuiteTreeViewFixture.cs
@@ -1,452 +1,452 @@
-// ****************************************************************
-// 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
-// ****************************************************************
-
-namespace NUnit.UiKit.Tests
-{
-	using System;
-	using System.Reflection;
-	using System.Windows.Forms;
-	using NUnit.Framework;
-	using NUnit.Core;
-	using NUnit.Util;
-	using NUnit.Tests.Assemblies;
-
-	/// <summary>
-	/// Summary description for TestSuiteFixture.
-	/// </summary>
-	/// 
-	public class TestSuiteTreeViewFixture
-	{
-		protected string testsDll = MockAssembly.AssemblyPath;
-		protected Test suite;
-        protected TestSuiteTreeView treeView;
-
-		[SetUp]
-		public void SetUp() 
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			suite = builder.Build( new TestPackage( testsDll ) );
-
-			treeView = new TestSuiteTreeView();
-            treeView.Load(new TestNode(suite));
-		}
-    }
-
-    [TestFixture]
-    public class TestSuiteTreeViewTests : TestSuiteTreeViewFixture
-    {
-		private bool AllExpanded( TreeNode node)
-		{
-			if ( node.Nodes.Count == 0 )
-				return true;
-			
-			if ( !node.IsExpanded )
-				return false;
-			
-			return AllExpanded( node.Nodes );
-		}
-
-		private bool AllExpanded( TreeNodeCollection nodes )
-		{
-			foreach( TestSuiteTreeNode node in nodes )
-				if ( !AllExpanded( node ) )
-					return false;
-
-			return true;
-		}
-
-		[Test]
-		public void BuildTreeView()
-		{
-			Assert.IsNotNull( treeView.Nodes[0] );
-			Assert.AreEqual( MockAssembly.Nodes, treeView.GetNodeCount( true ) );
-			Assert.AreEqual( testsDll, treeView.Nodes[0].Text );	
-			Assert.AreEqual( "NUnit", treeView.Nodes[0].Nodes[0].Text );
-			Assert.AreEqual( "Tests", treeView.Nodes[0].Nodes[0].Nodes[0].Text );
-		}
-
-		[Test]
-		public void BuildFromResult()
-		{
-            TestResult result = suite.Run(new NullListener(), TestFilter.Empty);
-			treeView.Load( result );
-			Assert.AreEqual( MockAssembly.Nodes - MockAssembly.Explicit - MockAssembly.ExplicitFixtures, 
-				treeView.GetNodeCount( true ) );
-			
-			TestSuiteTreeNode node = treeView.Nodes[0] as TestSuiteTreeNode;
-			Assert.AreEqual( testsDll, node.Text );
-			Assert.IsNotNull( node.Result, "No Result on top-level Node" );
-	
-			node = node.Nodes[0].Nodes[0] as TestSuiteTreeNode;
-			Assert.AreEqual( "Tests", node.Text );
-			Assert.IsNotNull( node.Result, "No Result on TestSuite" );
-
-			foreach( TestSuiteTreeNode child in node.Nodes )
-			{
-				if ( child.Text == "Assemblies" )
-				{
-					node = child.Nodes[0] as TestSuiteTreeNode;
-					Assert.AreEqual( "MockTestFixture", node.Text );
-					Assert.IsNotNull( node.Result, "No Result on TestFixture" );
-					Assert.AreEqual( true, node.Result.Executed, "MockTestFixture: Executed" );
-
-					TestSuiteTreeNode test1 = node.Nodes[2] as TestSuiteTreeNode;
-					Assert.AreEqual( "MockTest1", test1.Text );
-					Assert.IsNotNull( test1.Result, "No Result on TestCase" );
-					Assert.AreEqual( true, test1.Result.Executed, "MockTest1: Executed" );
-					Assert.AreEqual( false, test1.Result.IsFailure, "MockTest1: IsFailure");
-					Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, test1.ImageIndex );
-
-					TestSuiteTreeNode test4 = node.Nodes[5] as TestSuiteTreeNode;
-					Assert.AreEqual( false, test4.Result.Executed, "MockTest4: Executed" );
-					Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, test4.ImageIndex );
-					return;
-				}
-			}
-
-			Assert.Fail( "Cannot locate NUnit.Tests.Assemblies node" );
-		}
-
-		/// <summary>
-		/// Return the MockTestFixture node from a tree built
-		/// from the mock-assembly dll.
-		/// </summary>
-		private TestSuiteTreeNode FixtureNode( TestSuiteTreeView treeView )
-		{
-			return (TestSuiteTreeNode)treeView.Nodes[0].Nodes[0].Nodes[0].Nodes[0].Nodes[0];
-		}
-
-		/// <summary>
-		/// The tree view CollapseAll method doesn't seem to work in
-		/// this test environment. This replaces it.
-		/// </summary>
-		private void CollapseAll( TreeNode node )
-		{
-			node.Collapse();
-			CollapseAll( node.Nodes );
-		}
-
-		private void CollapseAll( TreeNodeCollection nodes )
-		{
-			foreach( TreeNode node in nodes )
-				CollapseAll( node );
-		}
-
-		[Test]
-		public void ClearTree()
-		{
-            //treeView.Load( new TestNode( suite ) );
-			
-			treeView.Clear();
-			Assert.AreEqual( 0, treeView.Nodes.Count );
-		}
-
-		[Test]
-		public void SetTestResult()
-		{
-			TestSuite fixture = (TestSuite)findTest( "MockTestFixture", suite );		
-			TestResult result = new TestResult( new TestInfo( fixture ) );
-			treeView.SetTestResult( result );
-
-			TestSuiteTreeNode fixtureNode = FixtureNode( treeView );
-			Assert.IsNotNull(fixtureNode.Result,  "Result not set" );
-			Assert.AreEqual( fixture.TestName.Name, fixtureNode.Result.Name );
-			Assert.AreEqual( fixtureNode.Test.TestName.FullName, fixtureNode.Result.Test.TestName.FullName );
-		}
-
-		private Test findTest(string name, Test test) 
-		{
-			Test result = null;
-			if (test.TestName.Name == name)
-				result = test;
-			else if (test.Tests != null)
-			{
-				foreach(Test t in test.Tests) 
-				{
-					result = findTest(name, t);
-					if (result != null)
-						break;
-				}
-			}
-
-			return result;
-		}
-
-        [Test]
-		public void ProcessChecks()
-		{
-			Assert.AreEqual(0, treeView.CheckedTests.Length);
-			Assert.IsFalse(Checked(treeView.Nodes));
-
-			treeView.Nodes[0].Checked = true;
-
-			treeView.Nodes[0].Nodes[0].Checked = true;
-
-			Assert.AreEqual(2, treeView.CheckedTests.Length);
-			Assert.AreEqual(1, treeView.SelectedTests.Length);
-
-			Assert.IsTrue(Checked(treeView.Nodes));
-
-			treeView.ClearCheckedNodes();
-
-			Assert.AreEqual(0, treeView.CheckedTests.Length);
-			Assert.IsFalse(Checked(treeView.Nodes));
-		}
-// TODO: Unused Tests
-//		[Test]
-//		public void CheckCategory() 
-//		{
-//			treeView.Load(suite);
-//
-//			Assert.AreEqual(0, treeView.CheckedTests.Length);
-//
-//			CheckCategoryVisitor visitor = new CheckCategoryVisitor("MockCategory");
-//			treeView.Accept(visitor);
-//
-//			Assert.AreEqual(2, treeView.CheckedTests.Length);
-//		}
-//
-//		[Test]
-//		public void UnCheckCategory() 
-//		{
-//			treeView.Load(suite);
-//
-//			Assert.AreEqual(0, treeView.CheckedTests.Length);
-//
-//			CheckCategoryVisitor visitor = new CheckCategoryVisitor("MockCategory");
-//			treeView.Accept(visitor);
-//
-//			Assert.AreEqual(2, treeView.CheckedTests.Length);
-//
-//			UnCheckCategoryVisitor unvisitor = new UnCheckCategoryVisitor("MockCategory");
-//			treeView.Accept(unvisitor);
-//
-//			Assert.AreEqual(0, treeView.CheckedTests.Length);
-//		}
-
-		private bool Checked(TreeNodeCollection nodes) 
-		{
-			bool result = false;
-
-			foreach (TreeNode node in nodes) 
-			{
-				result |= node.Checked;
-				if (node.Nodes != null)
-					result |= Checked(node.Nodes);
-			}
-
-			return result;
-		}
-	}
-
-    [TestFixture]
-    public class TestSuiteTreeViewReloadTests : TestSuiteTreeViewFixture
-    {
-        private TestSuite nunitNamespaceSuite;
-        private TestSuite testsNamespaceSuite;
-        private TestSuite assembliesNamespaceSuite;
-        private TestSuite mockTestFixture;
-        private int originalTestCount;
-
-        [SetUp]
-        public void Initialize()
-        {
-            nunitNamespaceSuite = suite.Tests[0] as TestSuite;
-            testsNamespaceSuite = nunitNamespaceSuite.Tests[0] as TestSuite;
-            assembliesNamespaceSuite = testsNamespaceSuite.Tests[0] as TestSuite;
-            mockTestFixture = assembliesNamespaceSuite.Tests[0] as TestSuite;
-            originalTestCount = suite.TestCount;
-        }
-
-        [Test]
-        public void VerifyCheckTreeWorks()
-        {
-            CheckTreeAgainstSuite(suite, "initially");
-        }
-
-        [Test]
-        public void CanReloadWithoutChange()
-        {
-            treeView.Reload(new TestNode(suite));
-            CheckTreeAgainstSuite(suite, "unchanged");
-        }
-
-        [Test]
-        public void CanReloadAfterDeletingOneTestCase()
-        {
-            mockTestFixture.Tests.RemoveAt(0);
-            Assert.AreEqual(originalTestCount - 1, suite.TestCount);
-
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after removing test case");
-        }
-
-        [Test]
-        public void CanReloadAfterDeletingThreeTestCases()
-        {
-            mockTestFixture.Tests.RemoveAt(4);
-            mockTestFixture.Tests.RemoveAt(2);
-            mockTestFixture.Tests.RemoveAt(0);
-            Assert.AreEqual(originalTestCount - 3, suite.TestCount);
-            
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after removing test case");
-        }
-
-        [Test]
-        public void CanReloadAfterDeletingBranch()
-        {
-            int removeCount = ((Test)testsNamespaceSuite.Tests[0]).TestCount;
-            testsNamespaceSuite.Tests.RemoveAt(0);
-            Assert.AreEqual(originalTestCount-removeCount, suite.TestCount);
-            
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after removing branch");
-        }
-
-        [Test]
-        public void CanReloadAfterInsertingTestCase()
-        {
-            mockTestFixture.Tests.Add(new NUnitTestMethod((MethodInfo)MethodInfo.GetCurrentMethod()));
-            Assert.AreEqual(originalTestCount + 1, suite.TestCount);
-            
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after inserting test case");
-        }
-
-        [Test]
-        public void CanReloadAfterInsertingTestFixture()
-        {
-            Test fixture = new TestSuite(this.GetType());
-            testsNamespaceSuite.Tests.Add(fixture);
-            Assert.AreEqual(originalTestCount + fixture.TestCount, suite.TestCount);
-
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after inserting test case");
-        }
-
-        [Test]
-        public void ReloadTreeWithWrongTest()
-        {
-            TestSuite suite2 = new TestSuite("WrongSuite");
-            treeView.Reload(new TestNode(suite2));
-        }
-
-        [Test]
-        public void CanReloadAfterChangingOrder()
-        {
-            // Just swap the first and second test
-            object first = mockTestFixture.Tests[0];
-            mockTestFixture.Tests.RemoveAt(0);
-            mockTestFixture.Tests.Insert(1, first);
-            Assert.AreEqual(originalTestCount, suite.TestCount);
-
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after reordering");
-        }
-
-        [Test]
-        public void CanReloadAfterMultipleChanges()
-        {
-            // Add a fixture
-            Test fixture = new TestSuite(this.GetType());
-            testsNamespaceSuite.Tests.Add(fixture);
-
-            // Remove two tests
-            mockTestFixture.Tests.RemoveAt(4);
-            mockTestFixture.Tests.RemoveAt(2);
-            
-            // Interchange two tests
-            object first = mockTestFixture.Tests[0];
-            mockTestFixture.Tests.RemoveAt(0);
-            mockTestFixture.Tests.Insert(2, first);
-
-            // Add an new test case
-            mockTestFixture.Tests.Add(new NUnitTestMethod((MethodInfo)MethodInfo.GetCurrentMethod()));
-
-            int expectedCount = fixture.TestCount - 1;
-            Assert.AreEqual(originalTestCount + expectedCount, suite.TestCount);
-
-            ReassignTestIDsAndReload(suite);
-            CheckTreeAgainstSuite(suite, "after multiple changes");
-        }
-
-        [Test]
-        public void CanReloadAfterTurningOffAutoNamespaces()
-        {
-            TestSuiteBuilder builder = new TestSuiteBuilder();
-            TestPackage package = new TestPackage(testsDll);
-            package.Settings["AutoNamespaceSuites"] = false;
-            TestSuite suite2 = builder.Build(package);
-            Assert.AreEqual(originalTestCount, suite2.TestCount);
-            Assert.AreEqual(MockAssembly.Classes, suite2.Tests.Count);
-
-            ReassignTestIDsAndReload(suite2);
-            CheckTreeAgainstSuite(suite2, "after turning automatic namespaces OFF");
-
-            // TODO: This currently doesn't work
-            //ReassignTestIDsAndReload(suite);
-            //CheckTreeAgainstSuite(suite, "after turning automatic namespaces ON");
-        }
-
-        private void CheckTreeAgainstSuite(Test suite, string msg)
-        {
-            CheckThatTreeMatchesTests(treeView, suite, "Tree out of order " + msg);
-            CheckTreeMap(treeView, suite, "Map incorrect " + msg);
-        }
-
-        private void CheckThatTreeMatchesTests(TestSuiteTreeView treeView, Test suite, string msg)
-        {
-            CheckThatNodeMatchesTest((TestSuiteTreeNode)treeView.Nodes[0], suite, msg);
-        }
-
-        private void CheckThatNodeMatchesTest(TestSuiteTreeNode node, Test test, string msg)
-        {
-            Assert.AreEqual(test.TestName, node.Test.TestName, "{0}: Names do not match for {1}", msg, test.TestName.FullName);
-
-            if (test.IsSuite)
-            {
-                //if ( test.TestName.FullName == "NUnit.Tests.Assemblies.MockTestFixture" )
-                //    foreach( TestSuiteTreeNode n in node.Nodes )
-                //        Console.WriteLine( n.Test.TestName );
-
-                Assert.AreEqual(test.Tests.Count, node.Nodes.Count, "{0}: Incorrect count for {1}", msg, test.TestName.FullName);
-
-                for (int index = 0; index < test.Tests.Count; index++)
-                {
-                    CheckThatNodeMatchesTest((TestSuiteTreeNode)node.Nodes[index], (Test)test.Tests[index], msg);
-                }
-            }
-        }
-
-        private void CheckTreeMap(TestSuiteTreeView treeView, Test test, string msg)
-        {
-            TestSuiteTreeNode node = treeView[test.TestName.UniqueName];
-            Assert.IsNotNull(node, "{0}: {1} not in map", msg, test.TestName.UniqueName);
-            Assert.AreEqual(test.TestName, treeView[test.TestName.UniqueName].Test.TestName, msg);
-
-            if (test.IsSuite)
-                foreach (Test child in test.Tests)
-                    CheckTreeMap(treeView, child, msg);
-        }
-
-        // Reload re-assigns the test IDs, so we simulate it
-        private void ReassignTestIDs(Test test)
-        {
-            test.TestName.TestID = new TestID();
-
-            if (test.IsSuite)
-                foreach (Test child in test.Tests)
-                    ReassignTestIDs(child);
-        }
-
-        private void ReassignTestIDsAndReload(Test test)
-        {
-            ReassignTestIDs(test);
-            treeView.Reload(new TestNode(test));
-        }
-    }
-}
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.UiKit.Tests
+{
+	using System;
+	using System.Reflection;
+	using System.Windows.Forms;
+	using NUnit.Framework;
+	using NUnit.Core;
+	using NUnit.Util;
+	using NUnit.Tests.Assemblies;
+
+	/// <summary>
+	/// Summary description for TestSuiteFixture.
+	/// </summary>
+	/// 
+	public class TestSuiteTreeViewFixture
+	{
+		protected string testsDll = MockAssembly.AssemblyPath;
+		protected Test suite;
+        protected TestSuiteTreeView treeView;
+
+		[SetUp]
+		public void SetUp() 
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			suite = builder.Build( new TestPackage( testsDll ) );
+
+			treeView = new TestSuiteTreeView();
+            treeView.Load(new TestNode(suite));
+		}
+    }
+
+    [TestFixture]
+    public class TestSuiteTreeViewTests : TestSuiteTreeViewFixture
+    {
+		private bool AllExpanded( TreeNode node)
+		{
+			if ( node.Nodes.Count == 0 )
+				return true;
+			
+			if ( !node.IsExpanded )
+				return false;
+			
+			return AllExpanded( node.Nodes );
+		}
+
+		private bool AllExpanded( TreeNodeCollection nodes )
+		{
+			foreach( TestSuiteTreeNode node in nodes )
+				if ( !AllExpanded( node ) )
+					return false;
+
+			return true;
+		}
+
+		[Test]
+		public void BuildTreeView()
+		{
+			Assert.IsNotNull( treeView.Nodes[0] );
+			Assert.AreEqual( MockAssembly.Nodes, treeView.GetNodeCount( true ) );
+			Assert.AreEqual( testsDll, treeView.Nodes[0].Text );	
+			Assert.AreEqual( "NUnit", treeView.Nodes[0].Nodes[0].Text );
+			Assert.AreEqual( "Tests", treeView.Nodes[0].Nodes[0].Nodes[0].Text );
+		}
+
+		[Test]
+		public void BuildFromResult()
+		{
+            TestResult result = suite.Run(new NullListener(), TestFilter.Empty);
+			treeView.Load( result );
+			Assert.AreEqual( MockAssembly.Nodes - MockAssembly.Explicit - MockAssembly.ExplicitFixtures, 
+				treeView.GetNodeCount( true ) );
+			
+			TestSuiteTreeNode node = treeView.Nodes[0] as TestSuiteTreeNode;
+			Assert.AreEqual( testsDll, node.Text );
+			Assert.IsNotNull( node.Result, "No Result on top-level Node" );
+	
+			node = node.Nodes[0].Nodes[0] as TestSuiteTreeNode;
+			Assert.AreEqual( "Tests", node.Text );
+			Assert.IsNotNull( node.Result, "No Result on TestSuite" );
+
+			foreach( TestSuiteTreeNode child in node.Nodes )
+			{
+				if ( child.Text == "Assemblies" )
+				{
+					node = child.Nodes[0] as TestSuiteTreeNode;
+					Assert.AreEqual( "MockTestFixture", node.Text );
+					Assert.IsNotNull( node.Result, "No Result on TestFixture" );
+					Assert.AreEqual( true, node.Result.Executed, "MockTestFixture: Executed" );
+
+					TestSuiteTreeNode test1 = node.Nodes[2] as TestSuiteTreeNode;
+					Assert.AreEqual( "MockTest1", test1.Text );
+					Assert.IsNotNull( test1.Result, "No Result on TestCase" );
+					Assert.AreEqual( true, test1.Result.Executed, "MockTest1: Executed" );
+					Assert.AreEqual( false, test1.Result.IsFailure, "MockTest1: IsFailure");
+					Assert.AreEqual( TestSuiteTreeNode.SuccessIndex, test1.ImageIndex );
+
+					TestSuiteTreeNode test4 = node.Nodes[5] as TestSuiteTreeNode;
+					Assert.AreEqual( false, test4.Result.Executed, "MockTest4: Executed" );
+					Assert.AreEqual( TestSuiteTreeNode.IgnoredIndex, test4.ImageIndex );
+					return;
+				}
+			}
+
+			Assert.Fail( "Cannot locate NUnit.Tests.Assemblies node" );
+		}
+
+		/// <summary>
+		/// Return the MockTestFixture node from a tree built
+		/// from the mock-assembly dll.
+		/// </summary>
+		private TestSuiteTreeNode FixtureNode( TestSuiteTreeView treeView )
+		{
+			return (TestSuiteTreeNode)treeView.Nodes[0].Nodes[0].Nodes[0].Nodes[0].Nodes[0];
+		}
+
+		/// <summary>
+		/// The tree view CollapseAll method doesn't seem to work in
+		/// this test environment. This replaces it.
+		/// </summary>
+		private void CollapseAll( TreeNode node )
+		{
+			node.Collapse();
+			CollapseAll( node.Nodes );
+		}
+
+		private void CollapseAll( TreeNodeCollection nodes )
+		{
+			foreach( TreeNode node in nodes )
+				CollapseAll( node );
+		}
+
+		[Test]
+		public void ClearTree()
+		{
+            //treeView.Load( new TestNode( suite ) );
+			
+			treeView.Clear();
+			Assert.AreEqual( 0, treeView.Nodes.Count );
+		}
+
+		[Test]
+		public void SetTestResult()
+		{
+			TestSuite fixture = (TestSuite)findTest( "MockTestFixture", suite );		
+			TestResult result = new TestResult( new TestInfo( fixture ) );
+			treeView.SetTestResult( result );
+
+			TestSuiteTreeNode fixtureNode = FixtureNode( treeView );
+			Assert.IsNotNull(fixtureNode.Result,  "Result not set" );
+			Assert.AreEqual( fixture.TestName.Name, fixtureNode.Result.Name );
+			Assert.AreEqual( fixtureNode.Test.TestName.FullName, fixtureNode.Result.Test.TestName.FullName );
+		}
+
+		private Test findTest(string name, Test test) 
+		{
+			Test result = null;
+			if (test.TestName.Name == name)
+				result = test;
+			else if (test.Tests != null)
+			{
+				foreach(Test t in test.Tests) 
+				{
+					result = findTest(name, t);
+					if (result != null)
+						break;
+				}
+			}
+
+			return result;
+		}
+
+        [Test]
+		public void ProcessChecks()
+		{
+			Assert.AreEqual(0, treeView.CheckedTests.Length);
+			Assert.IsFalse(Checked(treeView.Nodes));
+
+			treeView.Nodes[0].Checked = true;
+
+			treeView.Nodes[0].Nodes[0].Checked = true;
+
+			Assert.AreEqual(2, treeView.CheckedTests.Length);
+			Assert.AreEqual(1, treeView.SelectedTests.Length);
+
+			Assert.IsTrue(Checked(treeView.Nodes));
+
+			treeView.ClearCheckedNodes();
+
+			Assert.AreEqual(0, treeView.CheckedTests.Length);
+			Assert.IsFalse(Checked(treeView.Nodes));
+		}
+// TODO: Unused Tests
+//		[Test]
+//		public void CheckCategory() 
+//		{
+//			treeView.Load(suite);
+//
+//			Assert.AreEqual(0, treeView.CheckedTests.Length);
+//
+//			CheckCategoryVisitor visitor = new CheckCategoryVisitor("MockCategory");
+//			treeView.Accept(visitor);
+//
+//			Assert.AreEqual(2, treeView.CheckedTests.Length);
+//		}
+//
+//		[Test]
+//		public void UnCheckCategory() 
+//		{
+//			treeView.Load(suite);
+//
+//			Assert.AreEqual(0, treeView.CheckedTests.Length);
+//
+//			CheckCategoryVisitor visitor = new CheckCategoryVisitor("MockCategory");
+//			treeView.Accept(visitor);
+//
+//			Assert.AreEqual(2, treeView.CheckedTests.Length);
+//
+//			UnCheckCategoryVisitor unvisitor = new UnCheckCategoryVisitor("MockCategory");
+//			treeView.Accept(unvisitor);
+//
+//			Assert.AreEqual(0, treeView.CheckedTests.Length);
+//		}
+
+		private bool Checked(TreeNodeCollection nodes) 
+		{
+			bool result = false;
+
+			foreach (TreeNode node in nodes) 
+			{
+				result |= node.Checked;
+				if (node.Nodes != null)
+					result |= Checked(node.Nodes);
+			}
+
+			return result;
+		}
+	}
+
+    [TestFixture]
+    public class TestSuiteTreeViewReloadTests : TestSuiteTreeViewFixture
+    {
+        private TestSuite nunitNamespaceSuite;
+        private TestSuite testsNamespaceSuite;
+        private TestSuite assembliesNamespaceSuite;
+        private TestSuite mockTestFixture;
+        private int originalTestCount;
+
+        [SetUp]
+        public void Initialize()
+        {
+            nunitNamespaceSuite = suite.Tests[0] as TestSuite;
+            testsNamespaceSuite = nunitNamespaceSuite.Tests[0] as TestSuite;
+            assembliesNamespaceSuite = testsNamespaceSuite.Tests[0] as TestSuite;
+            mockTestFixture = assembliesNamespaceSuite.Tests[0] as TestSuite;
+            originalTestCount = suite.TestCount;
+        }
+
+        [Test]
+        public void VerifyCheckTreeWorks()
+        {
+            CheckTreeAgainstSuite(suite, "initially");
+        }
+
+        [Test]
+        public void CanReloadWithoutChange()
+        {
+            treeView.Reload(new TestNode(suite));
+            CheckTreeAgainstSuite(suite, "unchanged");
+        }
+
+        [Test]
+        public void CanReloadAfterDeletingOneTestCase()
+        {
+            mockTestFixture.Tests.RemoveAt(0);
+            Assert.AreEqual(originalTestCount - 1, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after removing test case");
+        }
+
+        [Test]
+        public void CanReloadAfterDeletingThreeTestCases()
+        {
+            mockTestFixture.Tests.RemoveAt(4);
+            mockTestFixture.Tests.RemoveAt(2);
+            mockTestFixture.Tests.RemoveAt(0);
+            Assert.AreEqual(originalTestCount - 3, suite.TestCount);
+            
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after removing test case");
+        }
+
+        [Test]
+        public void CanReloadAfterDeletingBranch()
+        {
+            int removeCount = ((Test)testsNamespaceSuite.Tests[0]).TestCount;
+            testsNamespaceSuite.Tests.RemoveAt(0);
+            Assert.AreEqual(originalTestCount-removeCount, suite.TestCount);
+            
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after removing branch");
+        }
+
+        [Test]
+        public void CanReloadAfterInsertingTestCase()
+        {
+            mockTestFixture.Tests.Add(new NUnitTestMethod((MethodInfo)MethodInfo.GetCurrentMethod()));
+            Assert.AreEqual(originalTestCount + 1, suite.TestCount);
+            
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after inserting test case");
+        }
+
+        [Test]
+        public void CanReloadAfterInsertingTestFixture()
+        {
+            Test fixture = new TestSuite(this.GetType());
+            testsNamespaceSuite.Tests.Add(fixture);
+            Assert.AreEqual(originalTestCount + fixture.TestCount, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after inserting test case");
+        }
+
+        [Test]
+        public void ReloadTreeWithWrongTest()
+        {
+            TestSuite suite2 = new TestSuite("WrongSuite");
+            treeView.Reload(new TestNode(suite2));
+        }
+
+        [Test]
+        public void CanReloadAfterChangingOrder()
+        {
+            // Just swap the first and second test
+            object first = mockTestFixture.Tests[0];
+            mockTestFixture.Tests.RemoveAt(0);
+            mockTestFixture.Tests.Insert(1, first);
+            Assert.AreEqual(originalTestCount, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after reordering");
+        }
+
+        [Test]
+        public void CanReloadAfterMultipleChanges()
+        {
+            // Add a fixture
+            Test fixture = new TestSuite(this.GetType());
+            testsNamespaceSuite.Tests.Add(fixture);
+
+            // Remove two tests
+            mockTestFixture.Tests.RemoveAt(4);
+            mockTestFixture.Tests.RemoveAt(2);
+            
+            // Interchange two tests
+            object first = mockTestFixture.Tests[0];
+            mockTestFixture.Tests.RemoveAt(0);
+            mockTestFixture.Tests.Insert(2, first);
+
+            // Add an new test case
+            mockTestFixture.Tests.Add(new NUnitTestMethod((MethodInfo)MethodInfo.GetCurrentMethod()));
+
+            int expectedCount = fixture.TestCount - 1;
+            Assert.AreEqual(originalTestCount + expectedCount, suite.TestCount);
+
+            ReassignTestIDsAndReload(suite);
+            CheckTreeAgainstSuite(suite, "after multiple changes");
+        }
+
+        [Test]
+        public void CanReloadAfterTurningOffAutoNamespaces()
+        {
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+            TestPackage package = new TestPackage(testsDll);
+            package.Settings["AutoNamespaceSuites"] = false;
+            TestSuite suite2 = builder.Build(package);
+            Assert.AreEqual(originalTestCount, suite2.TestCount);
+            Assert.AreEqual(MockAssembly.Classes, suite2.Tests.Count);
+
+            ReassignTestIDsAndReload(suite2);
+            CheckTreeAgainstSuite(suite2, "after turning automatic namespaces OFF");
+
+            // TODO: This currently doesn't work
+            //ReassignTestIDsAndReload(suite);
+            //CheckTreeAgainstSuite(suite, "after turning automatic namespaces ON");
+        }
+
+        private void CheckTreeAgainstSuite(Test suite, string msg)
+        {
+            CheckThatTreeMatchesTests(treeView, suite, "Tree out of order " + msg);
+            CheckTreeMap(treeView, suite, "Map incorrect " + msg);
+        }
+
+        private void CheckThatTreeMatchesTests(TestSuiteTreeView treeView, Test suite, string msg)
+        {
+            CheckThatNodeMatchesTest((TestSuiteTreeNode)treeView.Nodes[0], suite, msg);
+        }
+
+        private void CheckThatNodeMatchesTest(TestSuiteTreeNode node, Test test, string msg)
+        {
+            Assert.AreEqual(test.TestName, node.Test.TestName, "{0}: Names do not match for {1}", msg, test.TestName.FullName);
+
+            if (test.IsSuite)
+            {
+                //if ( test.TestName.FullName == "NUnit.Tests.Assemblies.MockTestFixture" )
+                //    foreach( TestSuiteTreeNode n in node.Nodes )
+                //        Console.WriteLine( n.Test.TestName );
+
+                Assert.AreEqual(test.Tests.Count, node.Nodes.Count, "{0}: Incorrect count for {1}", msg, test.TestName.FullName);
+
+                for (int index = 0; index < test.Tests.Count; index++)
+                {
+                    CheckThatNodeMatchesTest((TestSuiteTreeNode)node.Nodes[index], (Test)test.Tests[index], msg);
+                }
+            }
+        }
+
+        private void CheckTreeMap(TestSuiteTreeView treeView, Test test, string msg)
+        {
+            TestSuiteTreeNode node = treeView[test.TestName.UniqueName];
+            Assert.IsNotNull(node, "{0}: {1} not in map", msg, test.TestName.UniqueName);
+            Assert.AreEqual(test.TestName, treeView[test.TestName.UniqueName].Test.TestName, msg);
+
+            if (test.IsSuite)
+                foreach (Test child in test.Tests)
+                    CheckTreeMap(treeView, child, msg);
+        }
+
+        // Reload re-assigns the test IDs, so we simulate it
+        private void ReassignTestIDs(Test test)
+        {
+            test.TestName.TestID = new TestID();
+
+            if (test.IsSuite)
+                foreach (Test child in test.Tests)
+                    ReassignTestIDs(child);
+        }
+
+        private void ReassignTestIDsAndReload(Test test)
+        {
+            ReassignTestIDs(test);
+            treeView.Reload(new TestNode(test));
+        }
+    }
+}
diff --git a/src/GuiComponents/tests/TestTreeTests.cs b/src/GuiComponents/tests/TestTreeTests.cs
index 32c96a6..f77d992 100644
--- a/src/GuiComponents/tests/TestTreeTests.cs
+++ b/src/GuiComponents/tests/TestTreeTests.cs
@@ -1,47 +1,47 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	[TestFixture]
-	public class TestTreeTests
-	{
-		[Test]
-		public void SameCategoryShouldNotBeSelectedMoreThanOnce()
-		{
-			// arrange
-			TestTree target = new TestTree();
-
-			// we need to populate the available categories
-			// this can be done via TestLoader but this way the test is isolated
-			FieldInfo fieldInfo = typeof (TestTree).GetField("availableCategories", BindingFlags.NonPublic | BindingFlags.Instance);
-			Assert.IsNotNull(fieldInfo, "The field 'availableCategories' should be found.");
-			object fieldValue = fieldInfo.GetValue(target);
-			Assert.IsNotNull(fieldValue, "The value of 'availableCategories' should not be null.");
-			IList availableCategories = fieldValue as IList;
-			Assert.IsNotNull(availableCategories, "'availableCategories' field should be of type IList.");
-
-			string[] expectedSelectedCategories = new string[] { "Foo", "MockCategory" };
-			foreach (string availableCategory in expectedSelectedCategories)
-			{
-				availableCategories.Add(availableCategory);
-			}
-
-			// act
-			target.SelectCategories(expectedSelectedCategories, true);
-			target.SelectCategories(expectedSelectedCategories, true);
-			string[] actualSelectedCategories = target.SelectedCategories;
-
-			// assert
-			CollectionAssert.AreEquivalent(expectedSelectedCategories, actualSelectedCategories);
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Framework;
+
+namespace NUnit.UiKit.Tests
+{
+	[TestFixture]
+	public class TestTreeTests
+	{
+		[Test]
+		public void SameCategoryShouldNotBeSelectedMoreThanOnce()
+		{
+			// arrange
+			TestTree target = new TestTree();
+
+			// we need to populate the available categories
+			// this can be done via TestLoader but this way the test is isolated
+			FieldInfo fieldInfo = typeof (TestTree).GetField("availableCategories", BindingFlags.NonPublic | BindingFlags.Instance);
+			Assert.IsNotNull(fieldInfo, "The field 'availableCategories' should be found.");
+			object fieldValue = fieldInfo.GetValue(target);
+			Assert.IsNotNull(fieldValue, "The value of 'availableCategories' should not be null.");
+			IList availableCategories = fieldValue as IList;
+			Assert.IsNotNull(availableCategories, "'availableCategories' field should be of type IList.");
+
+			string[] expectedSelectedCategories = new string[] { "Foo", "MockCategory" };
+			foreach (string availableCategory in expectedSelectedCategories)
+			{
+				availableCategories.Add(availableCategory);
+			}
+
+			// act
+			target.SelectCategories(expectedSelectedCategories, true);
+			target.SelectCategories(expectedSelectedCategories, true);
+			string[] actualSelectedCategories = target.SelectedCategories;
+
+			// assert
+			CollectionAssert.AreEquivalent(expectedSelectedCategories, actualSelectedCategories);
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/VisualStateTests.cs b/src/GuiComponents/tests/VisualStateTests.cs
index d27d8bc..617d561 100644
--- a/src/GuiComponents/tests/VisualStateTests.cs
+++ b/src/GuiComponents/tests/VisualStateTests.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Framework;
-
-namespace NUnit.UiKit.Tests
-{
-	/// <summary>
-	/// Summary description for VisualStateTests.
-	/// </summary>
-	[TestFixture]
-	public class VisualStateTests
-	{
-		[Test]
-		public void SaveAndRestoreVisualState()
-		{
-			VisualState state = new VisualState();
-			state.ShowCheckBoxes = true;
-			state.TopNode = "ABC.Test.dll";
-			state.SelectedNode = "NUnit.Tests.MyFixture.MyTest";
-			state.SelectedCategories = "A,B,C";
-			state.ExcludeCategories = true;
-
-			StringWriter writer = new StringWriter();
-			state.Save( writer );
-
-			string output = writer.GetStringBuilder().ToString();
-
-			StringReader reader = new StringReader( output );
-			VisualState newState = VisualState.LoadFrom( reader );
-
-			Assert.AreEqual( state.ShowCheckBoxes, newState.ShowCheckBoxes, "ShowCheckBoxes" );
-			Assert.AreEqual( state.TopNode, newState.TopNode, "TopNode" );
-			Assert.AreEqual( state.SelectedNode, newState.SelectedNode, "SelectedNode" );
-			Assert.AreEqual( state.SelectedCategories, newState.SelectedCategories, "SelectedCategories" );
-			Assert.AreEqual( state.ExcludeCategories, newState.ExcludeCategories, "ExcludeCategories" );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.UiKit.Tests
+{
+	/// <summary>
+	/// Summary description for VisualStateTests.
+	/// </summary>
+	[TestFixture]
+	public class VisualStateTests
+	{
+		[Test]
+		public void SaveAndRestoreVisualState()
+		{
+			VisualState state = new VisualState();
+			state.ShowCheckBoxes = true;
+			state.TopNode = "ABC.Test.dll";
+			state.SelectedNode = "NUnit.Tests.MyFixture.MyTest";
+			state.SelectedCategories = "A,B,C";
+			state.ExcludeCategories = true;
+
+			StringWriter writer = new StringWriter();
+			state.Save( writer );
+
+			string output = writer.GetStringBuilder().ToString();
+
+			StringReader reader = new StringReader( output );
+			VisualState newState = VisualState.LoadFrom( reader );
+
+			Assert.AreEqual( state.ShowCheckBoxes, newState.ShowCheckBoxes, "ShowCheckBoxes" );
+			Assert.AreEqual( state.TopNode, newState.TopNode, "TopNode" );
+			Assert.AreEqual( state.SelectedNode, newState.SelectedNode, "SelectedNode" );
+			Assert.AreEqual( state.SelectedCategories, newState.SelectedCategories, "SelectedCategories" );
+			Assert.AreEqual( state.ExcludeCategories, newState.ExcludeCategories, "ExcludeCategories" );
+		}
+	}
+}
diff --git a/src/GuiComponents/tests/nunit.uikit.tests.build b/src/GuiComponents/tests/nunit.uikit.tests.build
index 403fed1..3d81e4e 100644
--- a/src/GuiComponents/tests/nunit.uikit.tests.build
+++ b/src/GuiComponents/tests/nunit.uikit.tests.build
@@ -1,51 +1,51 @@
-<?xml version="1.0"?>
-<project name="NUnit.UiKit.Tests" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AddConfigurationDialogTests.cs"/>
-        <include name="ErrorDisplayTests.cs"/>
-        <include name="LongRunningOperationDisplayTests.cs"/>
-        <include name="ProgressBarTests.cs"/>
-        <include name="RecentFileMenuHandlerTests.cs"/>
-        <include name="StatusBarTests.cs"/>
-        <include name="TestSuiteTreeNodeTests.cs"/>
-        <include name="TestSuiteTreeViewFixture.cs"/>
-        <include name="TestTreeTests.cs"/>
-        <include name="VisualStateTests.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/nunit.uikit.tests.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="System.Drawing.dll"/>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.lib.dir}/nunit.uikit.dll"/>
-        <include name="${current.lib.dir}/nunit.uiexception.dll"/>
-        <include name="${current.test.dir}/test-utilities.dll"/>
-        <include name="${current.test.dir}/mock-assembly.dll"/>
-        <include name="${current.test.dir}/notestfixtures-assembly.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiComponents/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit.uikit.tests.csproj"/>
-        <include name="nunit.uikit.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnit.UiKit.Tests" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AddConfigurationDialogTests.cs"/>
+        <include name="ErrorDisplayTests.cs"/>
+        <include name="LongRunningOperationDisplayTests.cs"/>
+        <include name="ProgressBarTests.cs"/>
+        <include name="RecentFileMenuHandlerTests.cs"/>
+        <include name="StatusBarTests.cs"/>
+        <include name="TestSuiteTreeNodeTests.cs"/>
+        <include name="TestSuiteTreeViewFixture.cs"/>
+        <include name="TestTreeTests.cs"/>
+        <include name="VisualStateTests.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit.uikit.tests.dll" 
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit.uikit.dll"/>
+        <include name="${current.lib.dir}/nunit.uiexception.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+        <include name="${current.test.dir}/mock-assembly.dll"/>
+        <include name="${current.test.dir}/notestfixtures-assembly.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiComponents/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.uikit.tests.csproj"/>
+        <include name="nunit.uikit.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/GuiComponents/tests/nunit.uikit.tests.csproj b/src/GuiComponents/tests/nunit.uikit.tests.csproj
index 2852c1e..0854e79 100644
--- a/src/GuiComponents/tests/nunit.uikit.tests.csproj
+++ b/src/GuiComponents/tests/nunit.uikit.tests.csproj
@@ -1,138 +1,172 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.uikit.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.UiKit.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
-      <Name>mock-assembly</Name>
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
-      <Name>test-utilities</Name>
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\UiKit\nunit.uikit.dll.csproj">
-      <Name>nunit.uikit.dll</Name>
-      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
-      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
-      <Name>nunit.uiexception.dll</Name>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AddConfigurationDialogTests.cs" />
-    <Compile Include="ErrorDisplayTests.cs" />
-    <Compile Include="LongRunningOperationDisplayTests.cs" />
-    <Compile Include="ProgressBarTests.cs" />
-    <Compile Include="StatusBarTests.cs" />
-    <Compile Include="TestSuiteTreeNodeTests.cs" />
-    <Compile Include="TestSuiteTreeViewFixture.cs" />
-    <Compile Include="TestTreeTests.cs" />
-    <Compile Include="VisualStateTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.uikit.tests.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{63EC3999-FA6B-4C5B-8805-5A88AF4CBD7B}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.uikit.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.UiKit.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\UiKit\nunit.uikit.dll.csproj">
+      <Name>nunit.uikit.dll</Name>
+      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AddConfigurationDialogTests.cs" />
+    <Compile Include="ErrorDisplayTests.cs" />
+    <Compile Include="LongRunningOperationDisplayTests.cs" />
+    <Compile Include="ProgressBarTests.cs" />
+    <Compile Include="StatusBarTests.cs" />
+    <Compile Include="TestSuiteTreeNodeTests.cs" />
+    <Compile Include="TestSuiteTreeViewFixture.cs" />
+    <Compile Include="TestTreeTests.cs" />
+    <Compile Include="VisualStateTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uikit.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/GuiException/UiException/AssemblyInfo.cs b/src/GuiException/UiException/AssemblyInfo.cs
index 4835bf6..a676cbf 100644
--- a/src/GuiException/UiException/AssemblyInfo.cs
+++ b/src/GuiException/UiException/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/GuiException/UiException/CSharpParser/CSCode.cs b/src/GuiException/UiException/CSharpParser/CSCode.cs
index 7d7f6d1..9ac6434 100644
--- a/src/GuiException/UiException/CSharpParser/CSCode.cs
+++ b/src/GuiException/UiException/CSharpParser/CSCode.cs
@@ -1,354 +1,354 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Collections;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// (Formerly named CSCode)
-    /// 
-    /// Implements ITextManager and adds new behaviors to provide support for basic
-    /// syntax coloring. 
-    /// </summary>
-    public class FormattedCode :
-        ITextManager
-    {
-        /// <summary>
-        /// Keeps tracks of the text and the data used by the syntax coloring feature.
-        /// </summary>
-        protected CodeInfo _codeInfo;
-
-        /// <summary>
-        /// Stores the character count of the longest line in this text.
-        /// </summary>
-        private int _maxLength;
-
-        /// <summary>
-        /// Builds a new instance of FormattedCode.
-        /// </summary>
-        public FormattedCode()
-        {
-            _codeInfo = NewCodeInfo();
-            _maxLength = 0;
-
-            return;
-        }
-
-        public FormattedCode(string csharpText, int[] strIndexes, byte[] tagValues, int[] lineIndexes)
-        {
-            UiExceptionHelper.CheckNotNull(csharpText, "csharpText");
-            UiExceptionHelper.CheckNotNull(strIndexes, "strIndexes");
-            UiExceptionHelper.CheckNotNull(tagValues, "tagValues");
-            UiExceptionHelper.CheckNotNull(lineIndexes, "lineIndexes");
-
-            _codeInfo = new CodeInfo();
-
-            _codeInfo.Text = csharpText;
-
-            _codeInfo.IndexArray = new List<int>();
-            foreach (int index in strIndexes)
-                _codeInfo.IndexArray.Add(index);
-
-            _codeInfo.TagArray = new List<byte>();
-            foreach (byte tag in tagValues)
-                _codeInfo.TagArray.Add(tag);
-
-            _codeInfo.LineArray = new List<int>();
-            foreach (int line in lineIndexes)
-                _codeInfo.LineArray.Add(line);
-
-            return;
-        }
-
-        public static FormattedCode Empty
-        {
-            get { return (new FormattedCode()); }
-        }
-
-        public CodeInfo CopyInfo()
-        {
-            FormattedCode copy;
-
-            copy = new FormattedCode(_codeInfo.Text, 
-                _codeInfo.IndexArray.ToArray(),
-                _codeInfo.TagArray.ToArray(), 
-                _codeInfo.LineArray.ToArray());
-
-            return (copy._codeInfo);
-        }
-
-        /// <summary>
-        /// Builds a new instance of CodeInfo.
-        /// </summary>
-        public static CodeInfo NewCodeInfo()
-        {
-            CodeInfo res;
-
-            res = new CodeInfo();
-            res.Text = "";
-            res.IndexArray = new List<int>();
-            res.LineArray = new List<int>();
-            res.TagArray = new List<byte>();
-
-            return (res);
-        }
-
-        /// <summary>
-        /// Gets the text currently managed by this object.
-        /// </summary>
-        public string Text
-        {
-            get { return (_codeInfo.Text); }           
-        }
-
-        /// <summary>
-        /// Gets the line count in the text currently
-        /// managed by this object.
-        /// </summary>
-        public int LineCount
-        {
-            get { return (_codeInfo.LineArray.Count); }
-        }
-
-        /// <summary>
-        /// Gets the character count of the longest line
-        /// in this text.
-        /// </summary>
-        public int MaxLength
-        {
-            get 
-            {
-                int i;
-
-                if (_maxLength == 0)
-                    for (i = 0; i < LineCount; ++i)
-                        _maxLength = Math.Max(_maxLength, this[i].Text.TrimEnd().Length);
-
-                return (_maxLength); 
-            }
-        }
-
-        /// <summary>
-        /// Gives access to the collection of ClassifiedToken at the specified lineIndex.
-        /// </summary>
-        /// <param name="lineIndex">A zero based startingPosition.</param>
-        /// <returns>The ClassifiedTokenCollection instance at this startingPosition.</returns>
-        public ClassifiedTokenCollection this[int lineIndex]
-        {
-            get { return (new InternalCSTokenCollection(_codeInfo, lineIndex)); }
-        }
-
-        /// <summary>
-        /// Gets the text at the specified line.
-        /// </summary>
-        /// <param name="lineIndex">A zero based startingPosition.</param>
-        /// <returns>The text at the specified line startingPosition.</returns>
-        public string GetTextAt(int lineIndex)
-        {
-            return (this[lineIndex].Text);
-        }
-
-        /// <summary>
-        /// An utility method that check data consistency. The operation
-        /// raises an exception if an error is found.
-        /// </summary>
-        public static void CheckData(FormattedCode data)
-        {
-            List<int> lines;
-            int line;
-            int bound;
-            int i;
-
-            UiExceptionHelper.CheckNotNull(data, "data");
-
-            UiExceptionHelper.CheckTrue(
-                data._codeInfo.IndexArray.Count == data._codeInfo.TagArray.Count,
-                "IndexArray.Count and TagArray.Count must match.",
-                "data");
-
-            bound = data._codeInfo.IndexArray.Count;
-            lines = data._codeInfo.LineArray;
-            for (i = 0; i < lines.Count; ++i)
-            {
-                line = lines[i];
-
-                UiExceptionHelper.CheckTrue(
-                    line >= 0 && line < bound,
-                    "Bad LineArray value at index " + i + ", value was: " + line + ", expected to be in: [0-" + bound + "[.",
-                    "data");
-
-                if (i == 0)
-                    continue;
-
-                UiExceptionHelper.CheckTrue(
-                    lines[i] > lines[i - 1],
-                    "Bad LineArray[" + i + "], value was: " + line + ", expected to be > than LineArray[" + (i - 1) + "]=" + lines[i - 1] + ".",
-                    "data");
-            }
-
-            return;
-        }
-
-        public override bool Equals(object obj)
-        {
-            FormattedCode arg;
-            int i;
-
-            if (obj == null ||
-                !(obj is FormattedCode))
-                return (false);
-
-            arg = obj as FormattedCode;
-
-            if (arg._codeInfo.Text != _codeInfo.Text ||
-                arg._codeInfo.IndexArray.Count != _codeInfo.IndexArray.Count ||
-                arg._codeInfo.TagArray.Count != _codeInfo.TagArray.Count ||
-                arg._codeInfo.LineArray.Count != _codeInfo.LineArray.Count)
-                return (false);
-
-            for (i = 0; i < arg._codeInfo.IndexArray.Count; ++i)
-                if (arg._codeInfo.IndexArray[i] != _codeInfo.IndexArray[i])
-                    return (false);
-
-            for (i = 0; i < arg._codeInfo.TagArray.Count; ++i)
-                if (arg._codeInfo.TagArray[i] != _codeInfo.TagArray[i])
-                    return (false);
-
-            for (i = 0; i < arg._codeInfo.LineArray.Count; ++i)
-                if (arg._codeInfo.LineArray[i] != _codeInfo.LineArray[i])
-                    return (false);
-
-            return (true);
-        }
-
-        public override int GetHashCode()
-        {
-            return base.GetHashCode();
-        }
-
-        public override string ToString()
-        {
-            string res;
-            string index_array;
-            string tag_array;
-            string line_array;
-            int i;
-
-            index_array = "";
-            for (i = 0; i < _codeInfo.IndexArray.Count; ++i)
-            {
-                if (i > 0)
-                    index_array += ", ";
-                index_array += "" + _codeInfo.IndexArray[i];
-            }
-
-            tag_array = "";
-            for (i = 0; i < _codeInfo.TagArray.Count; ++i)
-            {
-                if (i > 0)
-                    tag_array += ", ";
-                tag_array += "" + _codeInfo.TagArray[i];
-            }
-
-            line_array = "";
-            for (i = 0; i < _codeInfo.LineArray.Count; ++i)
-            {
-                if (i > 0)
-                    line_array += ", ";
-                line_array += "" + _codeInfo.LineArray[i];
-            }
-
-            res = String.Format(
-                "FormattedCode: [(text=[{0}], len={1}), (startingPosition=[{2}]), (tag=[{3}]), (line=[{4}])]",
-                _codeInfo.Text, _codeInfo.Text.Length,
-                index_array, tag_array, line_array);
-
-            return (res);
-        }
-
-        /// <summary>
-        /// A naive attempt to modelize a structure of data that manages the text to be
-        /// displayed and extra data to make basic syntax coloring at rendering time,
-        /// while keeping a low memory footprint.
-        /// 
-        /// At rendering time, CodeInfo is used to make a link between the text to be drawn
-        /// and the brush color to be used during the process. So it is possible to distinguishes
-        /// code, comments, keywords and strings.
-        ///   Currently, CodeInfo is used to split the text into a collection of couple of data,
-        /// where each couple is composed of:
-        ///     - a string of characters
-        ///     - a value (called tag) that classifies this string from 0 to 3.
-        ///       Where 0 corresponds to 'Code', 1 to 'Keyword' and so on.
-        ///  These couples are named 'ClassifiedToken'. At rendering time, the process can link each
-        ///  of these values to a particular System.Drawing.Brush instance and display text
-        ///  differently.
-        ///  
-        ///  However, keeping track of all these couples at any time could have a significative
-        ///  impact on memory especially for big files. Therefore, instead of storing all theses couples,
-        ///  CodeInfo stores just primitive information that allow to build ClassifiedToken instances on the fly.        
-        /// </summary>
-        public class CodeInfo
-        {
-            /// <summary>
-            /// Holds the entire text as a simple string.
-            /// </summary>
-            public string Text;
-
-            /// <summary>
-            /// Array of character indexes that refers to
-            /// the field "Text". Each value in this array
-            /// must be interpreted as the starting index position
-            /// in the string into Text.
-            /// </summary>
-            public List<int> IndexArray;
-
-            /// <summary>
-            /// Array of ClassificationTag values held as a
-            /// byte array. There is a one-to-one correspondance
-            /// with 'IndexArray'. i.e.: TagArray[0] refers to the
-            /// ClassificationTag value for string sequence at
-            /// IndexArray[0]. TagArray[1] refers value to IndexArray[1] and
-            /// so on... Hence, the following condition:
-            ///   - IndexArray.Count == TagArray.Count must be verified.
-            /// </summary>
-            public List<byte> TagArray;
-
-            /// <summary>
-            /// This index_array is used to easily locate the start of each
-            /// line of text, for instance: startingPosition[0] refers to line startingPosition 0,
-            /// startingPosition[1] refers to line startingPosition 1 and so on...
-            ///    However, there is a small indirection in that this index_array
-            /// doesn't directly hold string indexes but refers to the startingPosition
-            /// of the item to be used in 'IndexArray'.
-            ///    Therefore, LineArray[0] gives access to the startingPosition of the
-            /// IndexArray's item to be used to get the corresponding character
-            /// position. Hence, line 0 starts at: IndexArray[LineArray[0]]
-            /// line 1: IndexArray[LineArray[1]] and so on...
-            /// </summary>
-            public List<int> LineArray;
-        }
-
-        #region InternalCSTokenCollection
-
-        class InternalCSTokenCollection :
-            ClassifiedTokenCollection
-        {
-            public InternalCSTokenCollection(CodeInfo info, int lineIndex)
-            {
-                _info = info;
-                _lineIndex = lineIndex;
-
-                return;
-            }
-        }
-
-        #endregion       
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// (Formerly named CSCode)
+    /// 
+    /// Implements ITextManager and adds new behaviors to provide support for basic
+    /// syntax coloring. 
+    /// </summary>
+    public class FormattedCode :
+        ITextManager
+    {
+        /// <summary>
+        /// Keeps tracks of the text and the data used by the syntax coloring feature.
+        /// </summary>
+        protected CodeInfo _codeInfo;
+
+        /// <summary>
+        /// Stores the character count of the longest line in this text.
+        /// </summary>
+        private int _maxLength;
+
+        /// <summary>
+        /// Builds a new instance of FormattedCode.
+        /// </summary>
+        public FormattedCode()
+        {
+            _codeInfo = NewCodeInfo();
+            _maxLength = 0;
+
+            return;
+        }
+
+        public FormattedCode(string csharpText, int[] strIndexes, byte[] tagValues, int[] lineIndexes)
+        {
+            UiExceptionHelper.CheckNotNull(csharpText, "csharpText");
+            UiExceptionHelper.CheckNotNull(strIndexes, "strIndexes");
+            UiExceptionHelper.CheckNotNull(tagValues, "tagValues");
+            UiExceptionHelper.CheckNotNull(lineIndexes, "lineIndexes");
+
+            _codeInfo = new CodeInfo();
+
+            _codeInfo.Text = csharpText;
+
+            _codeInfo.IndexArray = new List<int>();
+            foreach (int index in strIndexes)
+                _codeInfo.IndexArray.Add(index);
+
+            _codeInfo.TagArray = new List<byte>();
+            foreach (byte tag in tagValues)
+                _codeInfo.TagArray.Add(tag);
+
+            _codeInfo.LineArray = new List<int>();
+            foreach (int line in lineIndexes)
+                _codeInfo.LineArray.Add(line);
+
+            return;
+        }
+
+        public static FormattedCode Empty
+        {
+            get { return (new FormattedCode()); }
+        }
+
+        public CodeInfo CopyInfo()
+        {
+            FormattedCode copy;
+
+            copy = new FormattedCode(_codeInfo.Text, 
+                _codeInfo.IndexArray.ToArray(),
+                _codeInfo.TagArray.ToArray(), 
+                _codeInfo.LineArray.ToArray());
+
+            return (copy._codeInfo);
+        }
+
+        /// <summary>
+        /// Builds a new instance of CodeInfo.
+        /// </summary>
+        public static CodeInfo NewCodeInfo()
+        {
+            CodeInfo res;
+
+            res = new CodeInfo();
+            res.Text = "";
+            res.IndexArray = new List<int>();
+            res.LineArray = new List<int>();
+            res.TagArray = new List<byte>();
+
+            return (res);
+        }
+
+        /// <summary>
+        /// Gets the text currently managed by this object.
+        /// </summary>
+        public string Text
+        {
+            get { return (_codeInfo.Text); }           
+        }
+
+        /// <summary>
+        /// Gets the line count in the text currently
+        /// managed by this object.
+        /// </summary>
+        public int LineCount
+        {
+            get { return (_codeInfo.LineArray.Count); }
+        }
+
+        /// <summary>
+        /// Gets the character count of the longest line
+        /// in this text.
+        /// </summary>
+        public int MaxLength
+        {
+            get 
+            {
+                int i;
+
+                if (_maxLength == 0)
+                    for (i = 0; i < LineCount; ++i)
+                        _maxLength = Math.Max(_maxLength, this[i].Text.TrimEnd().Length);
+
+                return (_maxLength); 
+            }
+        }
+
+        /// <summary>
+        /// Gives access to the collection of ClassifiedToken at the specified lineIndex.
+        /// </summary>
+        /// <param name="lineIndex">A zero based startingPosition.</param>
+        /// <returns>The ClassifiedTokenCollection instance at this startingPosition.</returns>
+        public ClassifiedTokenCollection this[int lineIndex]
+        {
+            get { return (new InternalCSTokenCollection(_codeInfo, lineIndex)); }
+        }
+
+        /// <summary>
+        /// Gets the text at the specified line.
+        /// </summary>
+        /// <param name="lineIndex">A zero based startingPosition.</param>
+        /// <returns>The text at the specified line startingPosition.</returns>
+        public string GetTextAt(int lineIndex)
+        {
+            return (this[lineIndex].Text);
+        }
+
+        /// <summary>
+        /// An utility method that check data consistency. The operation
+        /// raises an exception if an error is found.
+        /// </summary>
+        public static void CheckData(FormattedCode data)
+        {
+            List<int> lines;
+            int line;
+            int bound;
+            int i;
+
+            UiExceptionHelper.CheckNotNull(data, "data");
+
+            UiExceptionHelper.CheckTrue(
+                data._codeInfo.IndexArray.Count == data._codeInfo.TagArray.Count,
+                "IndexArray.Count and TagArray.Count must match.",
+                "data");
+
+            bound = data._codeInfo.IndexArray.Count;
+            lines = data._codeInfo.LineArray;
+            for (i = 0; i < lines.Count; ++i)
+            {
+                line = lines[i];
+
+                UiExceptionHelper.CheckTrue(
+                    line >= 0 && line < bound,
+                    "Bad LineArray value at index " + i + ", value was: " + line + ", expected to be in: [0-" + bound + "[.",
+                    "data");
+
+                if (i == 0)
+                    continue;
+
+                UiExceptionHelper.CheckTrue(
+                    lines[i] > lines[i - 1],
+                    "Bad LineArray[" + i + "], value was: " + line + ", expected to be > than LineArray[" + (i - 1) + "]=" + lines[i - 1] + ".",
+                    "data");
+            }
+
+            return;
+        }
+
+        public override bool Equals(object obj)
+        {
+            FormattedCode arg;
+            int i;
+
+            if (obj == null ||
+                !(obj is FormattedCode))
+                return (false);
+
+            arg = obj as FormattedCode;
+
+            if (arg._codeInfo.Text != _codeInfo.Text ||
+                arg._codeInfo.IndexArray.Count != _codeInfo.IndexArray.Count ||
+                arg._codeInfo.TagArray.Count != _codeInfo.TagArray.Count ||
+                arg._codeInfo.LineArray.Count != _codeInfo.LineArray.Count)
+                return (false);
+
+            for (i = 0; i < arg._codeInfo.IndexArray.Count; ++i)
+                if (arg._codeInfo.IndexArray[i] != _codeInfo.IndexArray[i])
+                    return (false);
+
+            for (i = 0; i < arg._codeInfo.TagArray.Count; ++i)
+                if (arg._codeInfo.TagArray[i] != _codeInfo.TagArray[i])
+                    return (false);
+
+            for (i = 0; i < arg._codeInfo.LineArray.Count; ++i)
+                if (arg._codeInfo.LineArray[i] != _codeInfo.LineArray[i])
+                    return (false);
+
+            return (true);
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+
+        public override string ToString()
+        {
+            string res;
+            string index_array;
+            string tag_array;
+            string line_array;
+            int i;
+
+            index_array = "";
+            for (i = 0; i < _codeInfo.IndexArray.Count; ++i)
+            {
+                if (i > 0)
+                    index_array += ", ";
+                index_array += "" + _codeInfo.IndexArray[i];
+            }
+
+            tag_array = "";
+            for (i = 0; i < _codeInfo.TagArray.Count; ++i)
+            {
+                if (i > 0)
+                    tag_array += ", ";
+                tag_array += "" + _codeInfo.TagArray[i];
+            }
+
+            line_array = "";
+            for (i = 0; i < _codeInfo.LineArray.Count; ++i)
+            {
+                if (i > 0)
+                    line_array += ", ";
+                line_array += "" + _codeInfo.LineArray[i];
+            }
+
+            res = String.Format(
+                "FormattedCode: [(text=[{0}], len={1}), (startingPosition=[{2}]), (tag=[{3}]), (line=[{4}])]",
+                _codeInfo.Text, _codeInfo.Text.Length,
+                index_array, tag_array, line_array);
+
+            return (res);
+        }
+
+        /// <summary>
+        /// A naive attempt to modelize a structure of data that manages the text to be
+        /// displayed and extra data to make basic syntax coloring at rendering time,
+        /// while keeping a low memory footprint.
+        /// 
+        /// At rendering time, CodeInfo is used to make a link between the text to be drawn
+        /// and the brush color to be used during the process. So it is possible to distinguishes
+        /// code, comments, keywords and strings.
+        ///   Currently, CodeInfo is used to split the text into a collection of couple of data,
+        /// where each couple is composed of:
+        ///     - a string of characters
+        ///     - a value (called tag) that classifies this string from 0 to 3.
+        ///       Where 0 corresponds to 'Code', 1 to 'Keyword' and so on.
+        ///  These couples are named 'ClassifiedToken'. At rendering time, the process can link each
+        ///  of these values to a particular System.Drawing.Brush instance and display text
+        ///  differently.
+        ///  
+        ///  However, keeping track of all these couples at any time could have a significative
+        ///  impact on memory especially for big files. Therefore, instead of storing all theses couples,
+        ///  CodeInfo stores just primitive information that allow to build ClassifiedToken instances on the fly.        
+        /// </summary>
+        public class CodeInfo
+        {
+            /// <summary>
+            /// Holds the entire text as a simple string.
+            /// </summary>
+            public string Text;
+
+            /// <summary>
+            /// Array of character indexes that refers to
+            /// the field "Text". Each value in this array
+            /// must be interpreted as the starting index position
+            /// in the string into Text.
+            /// </summary>
+            public List<int> IndexArray;
+
+            /// <summary>
+            /// Array of ClassificationTag values held as a
+            /// byte array. There is a one-to-one correspondance
+            /// with 'IndexArray'. i.e.: TagArray[0] refers to the
+            /// ClassificationTag value for string sequence at
+            /// IndexArray[0]. TagArray[1] refers value to IndexArray[1] and
+            /// so on... Hence, the following condition:
+            ///   - IndexArray.Count == TagArray.Count must be verified.
+            /// </summary>
+            public List<byte> TagArray;
+
+            /// <summary>
+            /// This index_array is used to easily locate the start of each
+            /// line of text, for instance: startingPosition[0] refers to line startingPosition 0,
+            /// startingPosition[1] refers to line startingPosition 1 and so on...
+            ///    However, there is a small indirection in that this index_array
+            /// doesn't directly hold string indexes but refers to the startingPosition
+            /// of the item to be used in 'IndexArray'.
+            ///    Therefore, LineArray[0] gives access to the startingPosition of the
+            /// IndexArray's item to be used to get the corresponding character
+            /// position. Hence, line 0 starts at: IndexArray[LineArray[0]]
+            /// line 1: IndexArray[LineArray[1]] and so on...
+            /// </summary>
+            public List<int> LineArray;
+        }
+
+        #region InternalCSTokenCollection
+
+        class InternalCSTokenCollection :
+            ClassifiedTokenCollection
+        {
+            public InternalCSTokenCollection(CodeInfo info, int lineIndex)
+            {
+                _info = info;
+                _lineIndex = lineIndex;
+
+                return;
+            }
+        }
+
+        #endregion       
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/CSParser.cs b/src/GuiException/UiException/CSharpParser/CSParser.cs
index e75f58a..88246be 100644
--- a/src/GuiException/UiException/CSharpParser/CSParser.cs
+++ b/src/GuiException/UiException/CSharpParser/CSParser.cs
@@ -1,240 +1,240 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// (formerly named CSParser)
-    /// 
-    /// Helper class to build and setup FormattedCode instances from formatted C# texts.
-    /// </summary>
-    public class CSharpCodeFormatter :
-        ICodeFormatter
-    {
-        /// <summary>
-        /// The underlying data object of a FormattedCode instance.
-        /// </summary>
-        private FormattedCode.CodeInfo _info;
-
-        /// <summary>
-        /// Builds a new instance of CSharpCodeFormatter.
-        /// </summary>
-        public CSharpCodeFormatter()
-        {
-            _info = FormattedCode.NewCodeInfo();
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets a new instance of FormattedCode.
-        /// To get useful FormattedCode instances, caller should ensure
-        /// that TryParse() was invoked first.
-        /// </summary>
-        public FormattedCode CSCode
-        {
-            get { return (new InternalFormattedCode(_info)); }
-        }
-
-        #region ICodeFormatter Membres
-
-        /// <summary>
-        /// Returns "C#"
-        /// </summary>
-        public string Language
-        {
-            get { return ("C#"); }
-        }
-
-        /// <summary>
-        /// Interprets and highlight the given string as C# code
-        /// and return the resulting FormattedCode instance.
-        /// </summary>
-        /// <param name="csharpCode">A string read as C# code.
-        /// This parameter must not be null.</param>
-        /// <returns>A FormattedCode instance containing data
-        /// to highlight the text with basic syntax coloring.</returns>
-        public FormattedCode Format(string csharpCode)
-        {
-            UiExceptionHelper.CheckNotNull(csharpCode, "csharpCode");
-
-            _info = FormattedCode.NewCodeInfo();
-            csharpCode = PreProcess(csharpCode);
-            Parse(csharpCode);
-
-            return (CSCode);
-        }
-
-        #endregion
-
-        /// <summary>
-        /// Prepare input text for the parsing stage.
-        /// </summary>
-        /// <param name="text">The text to be pre-processed.</param>
-        /// <returns>A string ready to be parsed.</returns>
-        protected string PreProcess(string text)
-        {
-            if (text == null)
-                return (null);
-
-            // this replace tabulation by space sequences. The reason is
-            // that the technique used to measure strings at rendering time
-            // fail to measure '\t' correctly and lines of text containing those
-            // characters are badly aligned.
-            //  The simplest thing to fix that is to remove tabs altogether.
-
-            return (text.Replace("\t", "    "));
-        }
-
-        /// <summary>
-        /// Analyzes the input text as C# code. This method doesn't return anything.
-        /// Callers may retrieve the result of this process by querying the FormattedCode property.
-        ///   Passing null results in raising an exception.
-        /// </summary>
-        /// <param name="csharp">The text to be analyzed.</param>
-        protected void Parse(string csharp)
-        {
-            TokenClassifier classifier;
-            ConcreteToken csToken;
-            ClassificationTag tag;
-            Lexer lexer;
-            StringBuilder text;
-            int tokenIndex;
-
-            UiExceptionHelper.CheckNotNull(csharp, "csharp");
-
-            csharp = PreProcess(csharp);
-
-            lexer = new Lexer();
-            lexer.Parse(csharp);
-
-            classifier = new TokenClassifier();
-            text = new StringBuilder();
-            csToken = null;
-            tokenIndex = 0;
-
-            // loop through each token in the text
-            while (lexer.Next())
-            {
-                // classify the current token 
-                tag = classifier.Classify(lexer.CurrentToken);
-
-                // if the tag cannot be merged with current csToken
-                // we flush csToken into _info and build a new instance
-                // from the current tag.
-                if (csToken == null ||
-                    !csToken.CanMerge(_info.LineArray.Count, tag))
-                {
-                    _flushToken(csToken, _info);
-                    csToken = new ConcreteToken(
-                        lexer.CurrentToken.Text, tag,
-                        lexer.CurrentToken.IndexStart,
-                        _info.LineArray.Count);
-                }
-
-                // append token's text into text
-                text.Append(lexer.CurrentToken.Text);
-
-                // handle newline character. Appends tokenIndex to LineArray
-                // and set tokenIndex to the start of the newline.
-                if (lexer.CurrentToken.Text == "\n")
-                {
-                    _info.LineArray.Add(tokenIndex);
-                    tokenIndex = _info.IndexArray.Count + 1;
-                }
-            }
-
-            // flush terminal token
-            _flushToken(csToken, _info);
-
-            if (csToken != null &&
-                _info.LineArray.Count == 0)
-                _info.LineArray.Add(tokenIndex);
-
-            _info.Text = csharp;
-
-            return;
-        }
-
-        /// <summary>
-        /// Appends data in token at the end of output.
-        /// </summary>
-        /// <param name="token">Token to be merged with output.</param>
-        /// <param name="output">Target location.</param>
-        private void _flushToken(ClassifiedToken token, FormattedCode.CodeInfo output)
-        {
-            if (token == null)
-                return;
-
-            output.IndexArray.Add(token.IndexStart);
-            output.TagArray.Add((byte)token.Tag);
-
-            return;
-        }
-
-        #region InternalFormattedCode
-
-        /// <summary>
-        /// Implements FormattedCode.
-        /// </summary>
-        class InternalFormattedCode :
-            FormattedCode
-        {
-            public InternalFormattedCode(FormattedCode.CodeInfo info)
-            {
-                _codeInfo = info;
-            }
-        }
-
-        #endregion
-
-        #region ConcreteToken
-
-        /// <summary>
-        /// Implements ClassifiedToken.
-        /// </summary>
-        class ConcreteToken :
-            ClassifiedToken
-        {
-            private int _lineIndex;
-
-            /// <summary>
-            /// Builds and setup a new instance of ClassifiedToken.
-            /// </summary>
-            /// <param name="text">The text in this token.</param>
-            /// <param name="tag">The smState tag.</param>
-            /// <param name="indexStart">Starting startingPosition of the string from the beginning of the text.</param>
-            /// <param name="lineIndex">The line startingPosition.</param>
-            public ConcreteToken(string text, ClassificationTag tag, int indexStart, int lineIndex)
-            {
-                _text = text;
-                _tag = tag;
-                _indexStart = indexStart;
-                _lineIndex = lineIndex;
-
-                return;
-            }
-
-            /// <summary>
-            /// Tests whether or not the given lineIndex and tag are compatible with
-            /// the ones in the current Token.
-            /// </summary>
-            /// <param name="lineIndex">A line startingPosition.</param>
-            /// <param name="tag">A smState tag.</param>
-            /// <returns>A boolean that says whether these data are compatible.</returns>
-            public bool CanMerge(int lineIndex, ClassificationTag tag)
-            {
-                return (_tag == tag && _lineIndex == lineIndex);
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// (formerly named CSParser)
+    /// 
+    /// Helper class to build and setup FormattedCode instances from formatted C# texts.
+    /// </summary>
+    public class CSharpCodeFormatter :
+        ICodeFormatter
+    {
+        /// <summary>
+        /// The underlying data object of a FormattedCode instance.
+        /// </summary>
+        private FormattedCode.CodeInfo _info;
+
+        /// <summary>
+        /// Builds a new instance of CSharpCodeFormatter.
+        /// </summary>
+        public CSharpCodeFormatter()
+        {
+            _info = FormattedCode.NewCodeInfo();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets a new instance of FormattedCode.
+        /// To get useful FormattedCode instances, caller should ensure
+        /// that TryParse() was invoked first.
+        /// </summary>
+        public FormattedCode CSCode
+        {
+            get { return (new InternalFormattedCode(_info)); }
+        }
+
+        #region ICodeFormatter Membres
+
+        /// <summary>
+        /// Returns "C#"
+        /// </summary>
+        public string Language
+        {
+            get { return ("C#"); }
+        }
+
+        /// <summary>
+        /// Interprets and highlight the given string as C# code
+        /// and return the resulting FormattedCode instance.
+        /// </summary>
+        /// <param name="csharpCode">A string read as C# code.
+        /// This parameter must not be null.</param>
+        /// <returns>A FormattedCode instance containing data
+        /// to highlight the text with basic syntax coloring.</returns>
+        public FormattedCode Format(string csharpCode)
+        {
+            UiExceptionHelper.CheckNotNull(csharpCode, "csharpCode");
+
+            _info = FormattedCode.NewCodeInfo();
+            csharpCode = PreProcess(csharpCode);
+            Parse(csharpCode);
+
+            return (CSCode);
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Prepare input text for the parsing stage.
+        /// </summary>
+        /// <param name="text">The text to be pre-processed.</param>
+        /// <returns>A string ready to be parsed.</returns>
+        protected string PreProcess(string text)
+        {
+            if (text == null)
+                return (null);
+
+            // this replace tabulation by space sequences. The reason is
+            // that the technique used to measure strings at rendering time
+            // fail to measure '\t' correctly and lines of text containing those
+            // characters are badly aligned.
+            //  The simplest thing to fix that is to remove tabs altogether.
+
+            return (text.Replace("\t", "    "));
+        }
+
+        /// <summary>
+        /// Analyzes the input text as C# code. This method doesn't return anything.
+        /// Callers may retrieve the result of this process by querying the FormattedCode property.
+        ///   Passing null results in raising an exception.
+        /// </summary>
+        /// <param name="csharp">The text to be analyzed.</param>
+        protected void Parse(string csharp)
+        {
+            TokenClassifier classifier;
+            ConcreteToken csToken;
+            ClassificationTag tag;
+            Lexer lexer;
+            StringBuilder text;
+            int tokenIndex;
+
+            UiExceptionHelper.CheckNotNull(csharp, "csharp");
+
+            csharp = PreProcess(csharp);
+
+            lexer = new Lexer();
+            lexer.Parse(csharp);
+
+            classifier = new TokenClassifier();
+            text = new StringBuilder();
+            csToken = null;
+            tokenIndex = 0;
+
+            // loop through each token in the text
+            while (lexer.Next())
+            {
+                // classify the current token 
+                tag = classifier.Classify(lexer.CurrentToken);
+
+                // if the tag cannot be merged with current csToken
+                // we flush csToken into _info and build a new instance
+                // from the current tag.
+                if (csToken == null ||
+                    !csToken.CanMerge(_info.LineArray.Count, tag))
+                {
+                    _flushToken(csToken, _info);
+                    csToken = new ConcreteToken(
+                        lexer.CurrentToken.Text, tag,
+                        lexer.CurrentToken.IndexStart,
+                        _info.LineArray.Count);
+                }
+
+                // append token's text into text
+                text.Append(lexer.CurrentToken.Text);
+
+                // handle newline character. Appends tokenIndex to LineArray
+                // and set tokenIndex to the start of the newline.
+                if (lexer.CurrentToken.Text == "\n")
+                {
+                    _info.LineArray.Add(tokenIndex);
+                    tokenIndex = _info.IndexArray.Count + 1;
+                }
+            }
+
+            // flush terminal token
+            _flushToken(csToken, _info);
+
+            if (csToken != null &&
+                _info.LineArray.Count == 0)
+                _info.LineArray.Add(tokenIndex);
+
+            _info.Text = csharp;
+
+            return;
+        }
+
+        /// <summary>
+        /// Appends data in token at the end of output.
+        /// </summary>
+        /// <param name="token">Token to be merged with output.</param>
+        /// <param name="output">Target location.</param>
+        private void _flushToken(ClassifiedToken token, FormattedCode.CodeInfo output)
+        {
+            if (token == null)
+                return;
+
+            output.IndexArray.Add(token.IndexStart);
+            output.TagArray.Add((byte)token.Tag);
+
+            return;
+        }
+
+        #region InternalFormattedCode
+
+        /// <summary>
+        /// Implements FormattedCode.
+        /// </summary>
+        class InternalFormattedCode :
+            FormattedCode
+        {
+            public InternalFormattedCode(FormattedCode.CodeInfo info)
+            {
+                _codeInfo = info;
+            }
+        }
+
+        #endregion
+
+        #region ConcreteToken
+
+        /// <summary>
+        /// Implements ClassifiedToken.
+        /// </summary>
+        class ConcreteToken :
+            ClassifiedToken
+        {
+            private int _lineIndex;
+
+            /// <summary>
+            /// Builds and setup a new instance of ClassifiedToken.
+            /// </summary>
+            /// <param name="text">The text in this token.</param>
+            /// <param name="tag">The smState tag.</param>
+            /// <param name="indexStart">Starting startingPosition of the string from the beginning of the text.</param>
+            /// <param name="lineIndex">The line startingPosition.</param>
+            public ConcreteToken(string text, ClassificationTag tag, int indexStart, int lineIndex)
+            {
+                _text = text;
+                _tag = tag;
+                _indexStart = indexStart;
+                _lineIndex = lineIndex;
+
+                return;
+            }
+
+            /// <summary>
+            /// Tests whether or not the given lineIndex and tag are compatible with
+            /// the ones in the current Token.
+            /// </summary>
+            /// <param name="lineIndex">A line startingPosition.</param>
+            /// <param name="tag">A smState tag.</param>
+            /// <returns>A boolean that says whether these data are compatible.</returns>
+            public bool CanMerge(int lineIndex, ClassificationTag tag)
+            {
+                return (_tag == tag && _lineIndex == lineIndex);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/CSToken.cs b/src/GuiException/UiException/CSharpParser/CSToken.cs
index b85dfc1..ac11042 100644
--- a/src/GuiException/UiException/CSharpParser/CSToken.cs
+++ b/src/GuiException/UiException/CSharpParser/CSToken.cs
@@ -1,130 +1,130 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// This enum indicate the kind of a string sequence.
-    /// </summary>
-    public enum ClassificationTag : byte
-    {
-        /// <summary>
-        /// The string refer to C# source code.
-        /// </summary>
-        Code = 0,           // 0
-
-        /// <summary>
-        /// The string refers to C# keywords.
-        /// </summary>
-        Keyword = 1,        // 1
-
-        /// <summary>
-        /// The string refers to C# comments.
-        /// </summary>
-        Comment = 2,        // 2
-
-        /// <summary>
-        /// The string refers to a string/char value.
-        /// </summary>
-        String = 3          // 3
-    }
-
-    /// <summary>
-    /// (formerly named CSToken)
-    /// 
-    /// Classifies a string and make it falls into one of the categories below:
-    ///   - Code (the value should be interpreted as regular code)
-    ///   - Keyword (the value should be interpreted as a language keyword)
-    ///   - Comment (the value should be interpreted as comments)
-    ///   - String (the value should be interpreted as a string)
-    /// </summary>
-    public class ClassifiedToken
-    {
-        /// <summary>
-        /// The string held by this token.
-        /// </summary>
-        protected string _text; 
-
-        /// <summary>
-        /// The matching tag.
-        /// </summary>
-        protected ClassificationTag _tag;
-
-        /// <summary>
-        /// Starting startingPosition of the string.
-        /// </summary>
-        protected int _indexStart;
-
-        /// <summary>
-        /// This class cannot be build directly.
-        /// </summary>
-        protected ClassifiedToken()
-        {
-            // this class requires subclassing
-        }
-
-        /// <summary>
-        /// Gets the string value.
-        /// </summary>
-        public string Text
-        {
-            get { return (_text); }
-        }
-
-        /// <summary>
-        /// Gets the classification value for the string in Text.
-        ///   - Code:  Text should be interpreted as regular code,
-        ///   - Keyword: Text should be interpreted as a language keyword,
-        ///   - Comments: Text should be interpreted as comments,
-        ///   - String: Text should be interpreted as a string.
-        /// </summary>
-        public ClassificationTag Tag
-        {
-            get { return (_tag); }
-        }
-
-        /// <summary>
-        /// Gets the string's starting startingPosition.
-        /// </summary>
-        public int IndexStart
-        {
-            get { return (_indexStart); }
-        }
-
-        /// <summary>
-        /// Returns true if 'obj' is an instance of ClassifiedToken 
-        /// that contains same data that the current instance.
-        /// </summary>
-        public override bool Equals(object obj)
-        {
-            ClassifiedToken token;
-
-            if (obj == null || !(obj is ClassifiedToken))
-                return (false);
-
-            token = obj as ClassifiedToken;
-
-            return (Text == token.Text &&
-                    Tag == token.Tag);
-        }
-
-        public override int GetHashCode()
-        {
-            return base.GetHashCode();
-        }
-
-        public override string ToString()
-        {
-            return (String.Format(
-                "ClassifiedToken {Text='{0}', Tag={1}}",
-                Text,
-                Tag));
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// This enum indicate the kind of a string sequence.
+    /// </summary>
+    public enum ClassificationTag : byte
+    {
+        /// <summary>
+        /// The string refer to C# source code.
+        /// </summary>
+        Code = 0,           // 0
+
+        /// <summary>
+        /// The string refers to C# keywords.
+        /// </summary>
+        Keyword = 1,        // 1
+
+        /// <summary>
+        /// The string refers to C# comments.
+        /// </summary>
+        Comment = 2,        // 2
+
+        /// <summary>
+        /// The string refers to a string/char value.
+        /// </summary>
+        String = 3          // 3
+    }
+
+    /// <summary>
+    /// (formerly named CSToken)
+    /// 
+    /// Classifies a string and make it falls into one of the categories below:
+    ///   - Code (the value should be interpreted as regular code)
+    ///   - Keyword (the value should be interpreted as a language keyword)
+    ///   - Comment (the value should be interpreted as comments)
+    ///   - String (the value should be interpreted as a string)
+    /// </summary>
+    public class ClassifiedToken
+    {
+        /// <summary>
+        /// The string held by this token.
+        /// </summary>
+        protected string _text; 
+
+        /// <summary>
+        /// The matching tag.
+        /// </summary>
+        protected ClassificationTag _tag;
+
+        /// <summary>
+        /// Starting startingPosition of the string.
+        /// </summary>
+        protected int _indexStart;
+
+        /// <summary>
+        /// This class cannot be build directly.
+        /// </summary>
+        protected ClassifiedToken()
+        {
+            // this class requires subclassing
+        }
+
+        /// <summary>
+        /// Gets the string value.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+        }
+
+        /// <summary>
+        /// Gets the classification value for the string in Text.
+        ///   - Code:  Text should be interpreted as regular code,
+        ///   - Keyword: Text should be interpreted as a language keyword,
+        ///   - Comments: Text should be interpreted as comments,
+        ///   - String: Text should be interpreted as a string.
+        /// </summary>
+        public ClassificationTag Tag
+        {
+            get { return (_tag); }
+        }
+
+        /// <summary>
+        /// Gets the string's starting startingPosition.
+        /// </summary>
+        public int IndexStart
+        {
+            get { return (_indexStart); }
+        }
+
+        /// <summary>
+        /// Returns true if 'obj' is an instance of ClassifiedToken 
+        /// that contains same data that the current instance.
+        /// </summary>
+        public override bool Equals(object obj)
+        {
+            ClassifiedToken token;
+
+            if (obj == null || !(obj is ClassifiedToken))
+                return (false);
+
+            token = obj as ClassifiedToken;
+
+            return (Text == token.Text &&
+                    Tag == token.Tag);
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+
+        public override string ToString()
+        {
+            return (String.Format(
+                "ClassifiedToken {Text='{0}', Tag={1}}",
+                Text,
+                Tag));
+        }
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs b/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs
index 9a6c8c0..a7cb5f4 100644
--- a/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs
+++ b/src/GuiException/UiException/CSharpParser/CSTokenCollection.cs
@@ -1,219 +1,219 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Collections;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// (formerly named CSTokenCollection)
-    /// 
-    /// Manages an ordered collection of ClassifiedToken present in one line of text.
-    /// </summary>
-    public class ClassifiedTokenCollection
-    {
-        /// <summary>
-        /// Target location when building a ClassifiedToken instance on the fly.
-        /// </summary>
-        protected ClassifiedToken _token;
-
-        /// <summary>
-        /// Keeps tracks of the data source.
-        /// </summary>
-        protected FormattedCode.CodeInfo _info;
-
-        /// <summary>
-        /// Store the current line startingPosition.
-        /// </summary>
-        protected int _lineIndex;
-
-        /// <summary>
-        /// This class requires subclassing.
-        /// </summary>
-        protected ClassifiedTokenCollection()
-        {
-            _token = new InternalToken();
-        }
-
-        /// <summary>
-        /// Gets the number of ClassifiedToken present in this line of text.
-        /// </summary>
-        public int Count
-        {
-            get
-            {
-                int count;
-
-                if (_lineIndex + 1 < _info.LineArray.Count)
-                {
-                    count = _info.LineArray[_lineIndex + 1] -
-                            _info.LineArray[_lineIndex];
-                }
-                else
-                {
-                    count = _info.IndexArray.Count -
-                            _info.LineArray[_lineIndex];
-                }
-
-                return (count);
-            }
-        }
-
-        /// <summary>
-        /// Gets the ClassifiedToken instance at the specified startingPosition.
-        /// Warning: this indexer always return the same instance.
-        /// To keep data safe, it is strongly recommanded to make
-        /// a deep copy of the returned ClassifiedToken.
-        /// </summary>
-        /// <param name="startingPosition">A zero based value in the range: [0 - Count[</param>
-        /// <returns>The ClassifiedToken at this startingPosition.</returns>
-        public ClassifiedToken this[int index]
-        {
-            get
-            {
-                InternalToken result;
-
-                result = (InternalToken)_token;
-                _populateToken(_lineIndex, index, result);
-
-                return (result); 
-            }
-        }
-
-        /// <summary>
-        /// Gets the part of the text at the given position.
-        /// The returned string can be composed of one or severals words 
-        /// all with the same style.
-        /// </summary>
-        private void _populateToken(int lineIndex, int tokenIndex, InternalToken output)
-        {
-            int tagZero;
-            int tagStart;
-            int tagEnd;
-            int strIndex_start;
-            int strIndex_end;
-            string res;
-            ClassificationTag tag;
-
-            //
-            // Gets value of tagStart and tagEnd
-            // from which string indexes can be extracted 
-            //
-
-            tagZero = _info.LineArray[lineIndex];
-            tagStart = tagZero + tokenIndex;
-            tagEnd = tagStart + 1;
-
-            strIndex_start = _info.IndexArray[tagStart];
-
-            if (tagEnd < _info.IndexArray.Count)
-            {
-                strIndex_end = _info.IndexArray[tagEnd];
-                res = _info.Text.Substring(strIndex_start, strIndex_end - strIndex_start);
-            }
-            else
-                res = _info.Text.Substring(strIndex_start);
-
-            //
-            // Check the need to trimEnd() the resulting string.
-            // We only want to trimEnd when current string is the
-            // last part of the current line. Intermediary strings
-            // must not be trimed end. At display time this would
-            // lead to introduce bad shifting of text sequences.
-            //
-
-            if (res.EndsWith("\n"))
-                res = res.TrimEnd();
-
-            //
-            // Convert the byte code into a ClassificationTag
-            // for this string sequence
-            //
-
-            tag = _getTagFromByteValue(_info.TagArray[tagStart]);
-
-            // and populate result
-
-            output.Setup(res, tag);
-
-            return;
-        }
-
-        /// <summary>
-        /// Converts the given value into the matching ClassificationTag.
-        /// </summary>
-        private ClassificationTag _getTagFromByteValue(byte value)
-        {
-            switch (value)
-            {
-                case 0: return (ClassificationTag.Code);
-                case 1: return (ClassificationTag.Keyword);
-                case 2: return (ClassificationTag.Comment);
-                case 3: return (ClassificationTag.String);
-                default:
-                    UiExceptionHelper.CheckTrue(false, "should not reach this code", "value");
-                    break;
-            }
-
-            return (ClassificationTag.Code);
-        }
-
-        /// <summary>
-        /// Return a string filled with the text present at the current line startingPosition.
-        /// </summary>
-        public string Text
-        {
-            get
-            {
-                int index_start;
-                int index_start_ptr; 
-                int index_end;
-                int index_end_ptr;
-                string text;
-                
-                index_start_ptr = _info.LineArray[_lineIndex];
-                index_start = _info.IndexArray[index_start_ptr];
-
-                if (_lineIndex + 1 >= _info.LineArray.Count)
-                    index_end = _info.Text.Length;
-                else
-                {
-                    index_end_ptr = _info.LineArray[_lineIndex + 1];
-                    index_end = _info.IndexArray[index_end_ptr];
-                }
-
-                if (index_end - index_start < 0)
-                    throw new Exception(
-                        "ClassifiedTokenCollection: Text: error: calling substring with negative length");
-
-                text = _info.Text.Substring(index_start, index_end - index_start);
-                text = text.TrimEnd();
-
-                return (text);
-            }
-        }
-
-        #region InternalToken
-
-        class InternalToken : 
-            ClassifiedToken
-        {
-            public InternalToken()
-            {
-            }
-
-            public void Setup(string text, ClassificationTag tag)
-            {
-                _text = text;
-                _tag = tag;
-            }
-        }
-
-        #endregion                   
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// (formerly named CSTokenCollection)
+    /// 
+    /// Manages an ordered collection of ClassifiedToken present in one line of text.
+    /// </summary>
+    public class ClassifiedTokenCollection
+    {
+        /// <summary>
+        /// Target location when building a ClassifiedToken instance on the fly.
+        /// </summary>
+        protected ClassifiedToken _token;
+
+        /// <summary>
+        /// Keeps tracks of the data source.
+        /// </summary>
+        protected FormattedCode.CodeInfo _info;
+
+        /// <summary>
+        /// Store the current line startingPosition.
+        /// </summary>
+        protected int _lineIndex;
+
+        /// <summary>
+        /// This class requires subclassing.
+        /// </summary>
+        protected ClassifiedTokenCollection()
+        {
+            _token = new InternalToken();
+        }
+
+        /// <summary>
+        /// Gets the number of ClassifiedToken present in this line of text.
+        /// </summary>
+        public int Count
+        {
+            get
+            {
+                int count;
+
+                if (_lineIndex + 1 < _info.LineArray.Count)
+                {
+                    count = _info.LineArray[_lineIndex + 1] -
+                            _info.LineArray[_lineIndex];
+                }
+                else
+                {
+                    count = _info.IndexArray.Count -
+                            _info.LineArray[_lineIndex];
+                }
+
+                return (count);
+            }
+        }
+
+        /// <summary>
+        /// Gets the ClassifiedToken instance at the specified startingPosition.
+        /// Warning: this indexer always return the same instance.
+        /// To keep data safe, it is strongly recommanded to make
+        /// a deep copy of the returned ClassifiedToken.
+        /// </summary>
+        /// <param name="startingPosition">A zero based value in the range: [0 - Count[</param>
+        /// <returns>The ClassifiedToken at this startingPosition.</returns>
+        public ClassifiedToken this[int index]
+        {
+            get
+            {
+                InternalToken result;
+
+                result = (InternalToken)_token;
+                _populateToken(_lineIndex, index, result);
+
+                return (result); 
+            }
+        }
+
+        /// <summary>
+        /// Gets the part of the text at the given position.
+        /// The returned string can be composed of one or severals words 
+        /// all with the same style.
+        /// </summary>
+        private void _populateToken(int lineIndex, int tokenIndex, InternalToken output)
+        {
+            int tagZero;
+            int tagStart;
+            int tagEnd;
+            int strIndex_start;
+            int strIndex_end;
+            string res;
+            ClassificationTag tag;
+
+            //
+            // Gets value of tagStart and tagEnd
+            // from which string indexes can be extracted 
+            //
+
+            tagZero = _info.LineArray[lineIndex];
+            tagStart = tagZero + tokenIndex;
+            tagEnd = tagStart + 1;
+
+            strIndex_start = _info.IndexArray[tagStart];
+
+            if (tagEnd < _info.IndexArray.Count)
+            {
+                strIndex_end = _info.IndexArray[tagEnd];
+                res = _info.Text.Substring(strIndex_start, strIndex_end - strIndex_start);
+            }
+            else
+                res = _info.Text.Substring(strIndex_start);
+
+            //
+            // Check the need to trimEnd() the resulting string.
+            // We only want to trimEnd when current string is the
+            // last part of the current line. Intermediary strings
+            // must not be trimed end. At display time this would
+            // lead to introduce bad shifting of text sequences.
+            //
+
+            if (res.EndsWith("\n"))
+                res = res.TrimEnd();
+
+            //
+            // Convert the byte code into a ClassificationTag
+            // for this string sequence
+            //
+
+            tag = _getTagFromByteValue(_info.TagArray[tagStart]);
+
+            // and populate result
+
+            output.Setup(res, tag);
+
+            return;
+        }
+
+        /// <summary>
+        /// Converts the given value into the matching ClassificationTag.
+        /// </summary>
+        private ClassificationTag _getTagFromByteValue(byte value)
+        {
+            switch (value)
+            {
+                case 0: return (ClassificationTag.Code);
+                case 1: return (ClassificationTag.Keyword);
+                case 2: return (ClassificationTag.Comment);
+                case 3: return (ClassificationTag.String);
+                default:
+                    UiExceptionHelper.CheckTrue(false, "should not reach this code", "value");
+                    break;
+            }
+
+            return (ClassificationTag.Code);
+        }
+
+        /// <summary>
+        /// Return a string filled with the text present at the current line startingPosition.
+        /// </summary>
+        public string Text
+        {
+            get
+            {
+                int index_start;
+                int index_start_ptr; 
+                int index_end;
+                int index_end_ptr;
+                string text;
+                
+                index_start_ptr = _info.LineArray[_lineIndex];
+                index_start = _info.IndexArray[index_start_ptr];
+
+                if (_lineIndex + 1 >= _info.LineArray.Count)
+                    index_end = _info.Text.Length;
+                else
+                {
+                    index_end_ptr = _info.LineArray[_lineIndex + 1];
+                    index_end = _info.IndexArray[index_end_ptr];
+                }
+
+                if (index_end - index_start < 0)
+                    throw new Exception(
+                        "ClassifiedTokenCollection: Text: error: calling substring with negative length");
+
+                text = _info.Text.Substring(index_start, index_end - index_start);
+                text = text.TrimEnd();
+
+                return (text);
+            }
+        }
+
+        #region InternalToken
+
+        class InternalToken : 
+            ClassifiedToken
+        {
+            public InternalToken()
+            {
+            }
+
+            public void Setup(string text, ClassificationTag tag)
+            {
+                _text = text;
+                _tag = tag;
+            }
+        }
+
+        #endregion                   
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/LexToken.cs b/src/GuiException/UiException/CSharpParser/LexToken.cs
index f3a510d..ae4ce44 100644
--- a/src/GuiException/UiException/CSharpParser/LexToken.cs
+++ b/src/GuiException/UiException/CSharpParser/LexToken.cs
@@ -1,148 +1,148 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// This enum defines the list of all tags
-    /// that can be assigned to a particular string.
-    /// </summary>
-    public enum LexerTag
-    {
-        /// <summary>
-        /// All sequences but the ones below
-        /// </summary>
-        Text,
-
-        /// <summary>
-        /// White characters: ' ' \t \n
-        /// and other separators like:
-        ///     - '[' ']' '(' ')' ';'
-        /// </summary>
-        Separator,
-
-        /// <summary>
-        /// Char: \n
-        /// </summary>
-        EndOfLine,
-
-        /// <summary>
-        /// string: /*
-        /// </summary>
-        CommentC_Open,
-
-        /// <summary>
-        /// string: */
-        /// </summary>
-        CommentC_Close,
-
-        /// <summary>
-        /// string: //
-        /// </summary>
-        CommentCpp,
-
-        /// <summary>
-        /// Char: '
-        /// </summary>
-        SingleQuote,
-
-        /// <summary>
-        /// Char: "
-        /// </summary>
-        DoubleQuote
-    }
-
-    /// <summary>
-    /// This class is used to make the link between a string and a LexerTag value.
-    /// </summary>
-    public class LexToken
-    {
-        /// <summary>
-        /// The string in this token.
-        /// </summary>
-        protected string _text;
-
-        /// <summary>
-        /// The current tag.
-        /// </summary>
-        protected LexerTag _tag;
-
-        /// <summary>
-        /// The starting startingPosition.
-        /// </summary>
-        protected int _start;
-
-        public LexToken()
-        {
-            _text = null;
-            _tag = LexerTag.Text;
-            _start = -1;
-
-            return;
-        }
-
-        public LexToken(string text, LexerTag tag, int start)
-        {
-            _text = text;
-            _tag = tag;
-            _start = start;
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets the string value.
-        /// </summary>
-        public string Text
-        {
-            get { return (_text); }
-        }
-
-        /// <summary>
-        /// Gets the tag value
-        /// </summary>
-        public LexerTag Tag
-        {
-            get { return (_tag); }
-        }
-
-        /// <summary>
-        /// Gets the starting startingPosition of the string.
-        /// </summary>
-        public int IndexStart
-        {
-            get { return (_start); }
-        }
-
-        public override bool Equals(object obj)
-        {
-            LexToken token;
-
-            if (obj == null || !(obj is LexToken))
-                return (false);
-
-            token = (LexToken)obj;
-
-            return (token.Text == Text &&
-                    token.IndexStart == IndexStart &&
-                    token.Tag == Tag);
-        }
-
-        public override int GetHashCode()
-        {
-            return base.GetHashCode();
-        }
-
-        public override string ToString()
-        {
-            return (String.Format("Token=([{0}], Index={1}, Tag={2})",
-                Text, IndexStart, Tag));
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// This enum defines the list of all tags
+    /// that can be assigned to a particular string.
+    /// </summary>
+    public enum LexerTag
+    {
+        /// <summary>
+        /// All sequences but the ones below
+        /// </summary>
+        Text,
+
+        /// <summary>
+        /// White characters: ' ' \t \n
+        /// and other separators like:
+        ///     - '[' ']' '(' ')' ';'
+        /// </summary>
+        Separator,
+
+        /// <summary>
+        /// Char: \n
+        /// </summary>
+        EndOfLine,
+
+        /// <summary>
+        /// string: /*
+        /// </summary>
+        CommentC_Open,
+
+        /// <summary>
+        /// string: */
+        /// </summary>
+        CommentC_Close,
+
+        /// <summary>
+        /// string: //
+        /// </summary>
+        CommentCpp,
+
+        /// <summary>
+        /// Char: '
+        /// </summary>
+        SingleQuote,
+
+        /// <summary>
+        /// Char: "
+        /// </summary>
+        DoubleQuote
+    }
+
+    /// <summary>
+    /// This class is used to make the link between a string and a LexerTag value.
+    /// </summary>
+    public class LexToken
+    {
+        /// <summary>
+        /// The string in this token.
+        /// </summary>
+        protected string _text;
+
+        /// <summary>
+        /// The current tag.
+        /// </summary>
+        protected LexerTag _tag;
+
+        /// <summary>
+        /// The starting startingPosition.
+        /// </summary>
+        protected int _start;
+
+        public LexToken()
+        {
+            _text = null;
+            _tag = LexerTag.Text;
+            _start = -1;
+
+            return;
+        }
+
+        public LexToken(string text, LexerTag tag, int start)
+        {
+            _text = text;
+            _tag = tag;
+            _start = start;
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the string value.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+        }
+
+        /// <summary>
+        /// Gets the tag value
+        /// </summary>
+        public LexerTag Tag
+        {
+            get { return (_tag); }
+        }
+
+        /// <summary>
+        /// Gets the starting startingPosition of the string.
+        /// </summary>
+        public int IndexStart
+        {
+            get { return (_start); }
+        }
+
+        public override bool Equals(object obj)
+        {
+            LexToken token;
+
+            if (obj == null || !(obj is LexToken))
+                return (false);
+
+            token = (LexToken)obj;
+
+            return (token.Text == Text &&
+                    token.IndexStart == IndexStart &&
+                    token.Tag == Tag);
+        }
+
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+
+        public override string ToString()
+        {
+            return (String.Format("Token=([{0}], Index={1}, Tag={2})",
+                Text, IndexStart, Tag));
+        }
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/Lexer.cs b/src/GuiException/UiException/CSharpParser/Lexer.cs
index f831dc8..8082196 100644
--- a/src/GuiException/UiException/CSharpParser/Lexer.cs
+++ b/src/GuiException/UiException/CSharpParser/Lexer.cs
@@ -1,233 +1,233 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// Splits a text formatted as C# code into a list of identified tokens.
-    /// </summary>
-    public class Lexer
-    {
-        /// <summary>
-        /// Reading position in the current text.
-        /// </summary>
-        private int _position;
-
-        /// <summary>
-        /// Text where to fetch tokens.
-        /// </summary>
-        private string _text;
-
-        /// <summary>
-        /// Last identified token.
-        /// </summary>
-        private InternalToken _token;
-
-        /// <summary>
-        /// Holds pre-defined sequences.
-        /// </summary>
-        private TokenDictionary _dictionary;
-
-        /// <summary>
-        /// Builds a new instance of Lexer.
-        /// </summary>
-        public Lexer()
-        {
-            _position = 0;
-            _text = "";
-
-            _dictionary = new TokenDictionary();
-            _dictionary.Add("/*", LexerTag.CommentC_Open);
-            _dictionary.Add("*/", LexerTag.CommentC_Close);
-            _dictionary.Add("//", LexerTag.CommentCpp);
-
-            // Here: definition of one lengthed sequences
-            _dictionary.Add("\\", LexerTag.Text);
-            _dictionary.Add(" ", LexerTag.Separator);
-            _dictionary.Add("\t", LexerTag.Separator);
-            _dictionary.Add("\r", LexerTag.Separator);
-            _dictionary.Add(".", LexerTag.Separator);
-            _dictionary.Add(";", LexerTag.Separator);
-            _dictionary.Add("[", LexerTag.Separator);
-            _dictionary.Add("]", LexerTag.Separator);
-            _dictionary.Add("(", LexerTag.Separator);
-            _dictionary.Add(")", LexerTag.Separator);
-            _dictionary.Add("#", LexerTag.Separator);
-            _dictionary.Add(":", LexerTag.Separator);
-            _dictionary.Add("<", LexerTag.Separator);
-            _dictionary.Add(">", LexerTag.Separator);
-            _dictionary.Add("=", LexerTag.Separator);
-            _dictionary.Add(",", LexerTag.Separator);
-            _dictionary.Add("\n", LexerTag.EndOfLine);
-            _dictionary.Add("'", LexerTag.SingleQuote);
-            _dictionary.Add("\"", LexerTag.DoubleQuote);
-
-            return;
-        }
-
-        public TokenDictionary Dictionary
-        {
-            get { return (_dictionary); }
-        }
-
-        /// <summary>
-        /// Clear all previously defined sequences.
-        /// </summary>
-        protected void Clear()
-        {
-            _dictionary = new TokenDictionary();
-
-            return;
-        }
-
-        /// <summary>
-        /// Setup the text to be splitted in tokens. 
-        /// 
-        /// Client code must call Next() first before getting
-        /// the first available token (if any).
-        /// </summary>
-        public void Parse(string codeCSharp)
-        {
-            UiExceptionHelper.CheckNotNull(codeCSharp, "text");
-
-            _text = codeCSharp;
-            _position = 0;
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets the token identifed after a call to Next().
-        /// The value may be null if the end of the text has been reached.
-        /// </summary>
-        public LexToken CurrentToken
-        {
-            get { return (_token); }
-        }
-
-        /// <summary>
-        /// Checks whether there are none visited tokens.
-        /// </summary>
-        public bool HasNext()
-        {
-            return (_position < _text.Length);
-        }
-
-        /// <summary>
-        /// Call this method to visit iteratively all tokens in the source text.
-        /// Each time a token has been identifier, the method returns true and the
-        /// identified Token is place under the CurrentToken property.
-        ///   When there is not more token to visit, the method returns false
-        /// and null is set in CurrentToken property.
-        /// </summary>
-        public bool Next()
-        {
-            char c;
-            LexToken token;
-            string prediction;
-            int pos;
-            int count;
-            int prediction_length;
-
-            _token = null;
-
-            if (!HasNext())
-                return (false);
-
-            pos = _position;
-            _token = new InternalToken(pos);
-            prediction_length = _dictionary[0].Text.Length;
-
-            while (pos < _text.Length)
-            {
-                c = _text[pos];
-                _token.AppendsChar(c);
-
-                prediction = "";
-                if (pos + 1 < _text.Length)
-                {
-                    count = Math.Min(prediction_length, _text.Length - pos - 1);
-                    prediction = _text.Substring(pos + 1, count);
-                }
-
-                token = _dictionary.TryMatch(_token.Text, prediction);
-
-                if (token != null)
-                {
-                    _token.SetText(token.Text);
-                    _token.SetIndex(_position);
-                    _token.SetLexerTag(token.Tag);
-                    _position += _token.Text.Length;
-
-                    break;
-                }
-
-                pos++;
-            }
-
-            return (true);
-        }
-
-        #region InternalToken
-
-        class InternalToken :
-            LexToken
-        {
-            /// <summary>
-            /// Builds a concrete instance of LexToken. By default, created instance
-            /// are setup with LexerTag.Text value.
-            /// </summary>
-            /// <param name="startingPosition">The starting startingPosition of this token in the text.</param>
-            public InternalToken(int index)
-            {
-                _tag = LexerTag.Text;
-                _text = "";
-                _start = index;
-
-                return;
-            }
-
-            /// <summary>
-            /// Appends this character to this token.
-            /// </summary>
-            public void AppendsChar(char c)
-            {
-                _text += c;
-            }
-
-            /// <summary>
-            /// Removes the "count" ending character of this token.
-            /// </summary>
-            public void PopChars(int count)
-            {
-                _text = _text.Remove(_text.Length - count);
-            }
-
-            /// <summary>
-            /// Set a new value to the Tag property.
-            /// </summary>
-            public void SetLexerTag(LexerTag tag)
-            {
-                _tag = tag;
-            }
-
-            public void SetText(string text)
-            {
-                _text = text;
-            }
-
-            public void SetIndex(int index)
-            {
-                _start = index;
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Splits a text formatted as C# code into a list of identified tokens.
+    /// </summary>
+    public class Lexer
+    {
+        /// <summary>
+        /// Reading position in the current text.
+        /// </summary>
+        private int _position;
+
+        /// <summary>
+        /// Text where to fetch tokens.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// Last identified token.
+        /// </summary>
+        private InternalToken _token;
+
+        /// <summary>
+        /// Holds pre-defined sequences.
+        /// </summary>
+        private TokenDictionary _dictionary;
+
+        /// <summary>
+        /// Builds a new instance of Lexer.
+        /// </summary>
+        public Lexer()
+        {
+            _position = 0;
+            _text = "";
+
+            _dictionary = new TokenDictionary();
+            _dictionary.Add("/*", LexerTag.CommentC_Open);
+            _dictionary.Add("*/", LexerTag.CommentC_Close);
+            _dictionary.Add("//", LexerTag.CommentCpp);
+
+            // Here: definition of one lengthed sequences
+            _dictionary.Add("\\", LexerTag.Text);
+            _dictionary.Add(" ", LexerTag.Separator);
+            _dictionary.Add("\t", LexerTag.Separator);
+            _dictionary.Add("\r", LexerTag.Separator);
+            _dictionary.Add(".", LexerTag.Separator);
+            _dictionary.Add(";", LexerTag.Separator);
+            _dictionary.Add("[", LexerTag.Separator);
+            _dictionary.Add("]", LexerTag.Separator);
+            _dictionary.Add("(", LexerTag.Separator);
+            _dictionary.Add(")", LexerTag.Separator);
+            _dictionary.Add("#", LexerTag.Separator);
+            _dictionary.Add(":", LexerTag.Separator);
+            _dictionary.Add("<", LexerTag.Separator);
+            _dictionary.Add(">", LexerTag.Separator);
+            _dictionary.Add("=", LexerTag.Separator);
+            _dictionary.Add(",", LexerTag.Separator);
+            _dictionary.Add("\n", LexerTag.EndOfLine);
+            _dictionary.Add("'", LexerTag.SingleQuote);
+            _dictionary.Add("\"", LexerTag.DoubleQuote);
+
+            return;
+        }
+
+        public TokenDictionary Dictionary
+        {
+            get { return (_dictionary); }
+        }
+
+        /// <summary>
+        /// Clear all previously defined sequences.
+        /// </summary>
+        protected void Clear()
+        {
+            _dictionary = new TokenDictionary();
+
+            return;
+        }
+
+        /// <summary>
+        /// Setup the text to be splitted in tokens. 
+        /// 
+        /// Client code must call Next() first before getting
+        /// the first available token (if any).
+        /// </summary>
+        public void Parse(string codeCSharp)
+        {
+            UiExceptionHelper.CheckNotNull(codeCSharp, "text");
+
+            _text = codeCSharp;
+            _position = 0;
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the token identifed after a call to Next().
+        /// The value may be null if the end of the text has been reached.
+        /// </summary>
+        public LexToken CurrentToken
+        {
+            get { return (_token); }
+        }
+
+        /// <summary>
+        /// Checks whether there are none visited tokens.
+        /// </summary>
+        public bool HasNext()
+        {
+            return (_position < _text.Length);
+        }
+
+        /// <summary>
+        /// Call this method to visit iteratively all tokens in the source text.
+        /// Each time a token has been identifier, the method returns true and the
+        /// identified Token is place under the CurrentToken property.
+        ///   When there is not more token to visit, the method returns false
+        /// and null is set in CurrentToken property.
+        /// </summary>
+        public bool Next()
+        {
+            char c;
+            LexToken token;
+            string prediction;
+            int pos;
+            int count;
+            int prediction_length;
+
+            _token = null;
+
+            if (!HasNext())
+                return (false);
+
+            pos = _position;
+            _token = new InternalToken(pos);
+            prediction_length = _dictionary[0].Text.Length;
+
+            while (pos < _text.Length)
+            {
+                c = _text[pos];
+                _token.AppendsChar(c);
+
+                prediction = "";
+                if (pos + 1 < _text.Length)
+                {
+                    count = Math.Min(prediction_length, _text.Length - pos - 1);
+                    prediction = _text.Substring(pos + 1, count);
+                }
+
+                token = _dictionary.TryMatch(_token.Text, prediction);
+
+                if (token != null)
+                {
+                    _token.SetText(token.Text);
+                    _token.SetIndex(_position);
+                    _token.SetLexerTag(token.Tag);
+                    _position += _token.Text.Length;
+
+                    break;
+                }
+
+                pos++;
+            }
+
+            return (true);
+        }
+
+        #region InternalToken
+
+        class InternalToken :
+            LexToken
+        {
+            /// <summary>
+            /// Builds a concrete instance of LexToken. By default, created instance
+            /// are setup with LexerTag.Text value.
+            /// </summary>
+            /// <param name="startingPosition">The starting startingPosition of this token in the text.</param>
+            public InternalToken(int index)
+            {
+                _tag = LexerTag.Text;
+                _text = "";
+                _start = index;
+
+                return;
+            }
+
+            /// <summary>
+            /// Appends this character to this token.
+            /// </summary>
+            public void AppendsChar(char c)
+            {
+                _text += c;
+            }
+
+            /// <summary>
+            /// Removes the "count" ending character of this token.
+            /// </summary>
+            public void PopChars(int count)
+            {
+                _text = _text.Remove(_text.Length - count);
+            }
+
+            /// <summary>
+            /// Set a new value to the Tag property.
+            /// </summary>
+            public void SetLexerTag(LexerTag tag)
+            {
+                _tag = tag;
+            }
+
+            public void SetText(string text)
+            {
+                _text = text;
+            }
+
+            public void SetIndex(int index)
+            {
+                _start = index;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/TokenClassifier.cs b/src/GuiException/UiException/CSharpParser/TokenClassifier.cs
index fa8cee9..003c3f3 100644
--- a/src/GuiException/UiException/CSharpParser/TokenClassifier.cs
+++ b/src/GuiException/UiException/CSharpParser/TokenClassifier.cs
@@ -1,433 +1,433 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// Used at an internal stage to convert LexToken into ClassifiedToken. This class provides
-    /// a very basic semantic analysis to make text following in one the categories below:
-    ///     - regular code,
-    ///     - developper comments,
-    ///     - strings / character.
-    /// The output of this class is used by CSharpCodeFormatter to achieve the basic syntax coloring.
-    /// </summary>
-    public class TokenClassifier
-    {
-        #region SMSTATE code
-
-        // the list below contains constant values defining states for the finite
-        // smState machine that makes all the work of converting LexToken into ClassifiedToken.
-        // for instance, Lexer can send inputs like:
-        //
-        //   [Text][Separator][CommentC_Open][Text][CommentC_Close]
-        //
-        // This LexToken sequence can for instance be converted that way by TokenClassifier.
-        //
-        //   - [Text][Separator]                     => [Code]
-        //   - [CommentC_Open][Text][CommentC_Close] => [Comment]
-        // 
-
-        /// <summary>
-        /// State code for the smState machine.
-        /// State when reaching a code block.
-        /// </summary>
-        public const int SMSTATE_CODE = 0;
-
-        /// <summary>
-        /// State code for the smState machine.
-        /// State when reaching a C comment block.
-        /// </summary>
-        public const int SMSTATE_CCOMMENT = 1;
-
-        /// <summary>
-        /// State code for the smState machine.
-        /// State when reaching a C++ comment block.
-        /// </summary>
-        public const int SMSTATE_CPPCOMMENT = 2;
-
-        /// <summary>
-        /// State code for the smState machine.
-        /// State when reaching a char surrounded by single quotes.
-        /// </summary>
-        public const int SMSTATE_CHAR = 3;
-
-        /// <summary>
-        /// State code for the smState machine.
-        /// State when reaching a string surrounded by double quotes.
-        /// </summary>
-        public const int SMSTATE_STRING = 4;
-
-        #endregion
-
-        /// <summary>
-        /// A finite smState machine where states are: SMSTATE values and
-        /// transitions are LexToken.
-        /// </summary>
-        private StateMachine _sm;
-
-        /// <summary>
-        /// The current StateMachine's SMTATE code.
-        /// </summary>
-        private int _sm_output;
-
-        /// <summary>
-        /// Makes a link between SMSTATE code and ClassificationTag.
-        /// </summary>
-        private Dictionary<int, ClassificationTag> _tags;
-
-        /// <summary>
-        /// Contains the list of C# keywords.
-        /// </summary>
-        private Dictionary<string, bool> _keywords;
-
-        /// <summary>
-        /// Indicate whether Lexer is in escaping mode.
-        /// This flag is set to true when parsing "\\" and
-        /// can influate on the following LexerTag value.
-        /// </summary>
-        private bool _escaping;
-
-        /// <summary>
-        /// Build a new instance of TokenClassifier.
-        /// </summary>
-        public TokenClassifier()
-        {
-            string[] words;
-
-            _sm = new StateMachine();
-
-            _tags = new Dictionary<int, ClassificationTag>();
-            _tags.Add(SMSTATE_CODE, ClassificationTag.Code);
-            _tags.Add(SMSTATE_CCOMMENT, ClassificationTag.Comment);
-            _tags.Add(SMSTATE_CPPCOMMENT, ClassificationTag.Comment);
-            _tags.Add(SMSTATE_CHAR, ClassificationTag.String);
-            _tags.Add(SMSTATE_STRING, ClassificationTag.String);
-
-            // build the list of predefined keywords.
-            // this is from the official msdn site. Curiously, some keywords
-            // were ommited from the official documentation.
-            //   For instance "get", "set", "region" and "endregion" were
-            // not part of the official list. Maybe it's a mistake or a misunderstanding
-            // whatever... I want them paint in blue as well!
-
-            words = new string[] {
-                "abstract", "event", "new", "struct", "as", "explicit", "null", "switch",
-                "base", "extern", "object", "this", "bool", "false", "operator", "throw",
-                "break", "finally", "out", "true", "byte", "fixed", "override", "try", "case",
-                "float", "params", "typeof", "catch", "for", "private", "uint", "char",
-                "foreach", "protected", "ulong", "checked", "goto", "public", "unchecked",
-                "class", "if", "readonly", "unsafe", "const", "implicit", "ref", "ushort",
-                "continue", "in", "return", "using", "decimal", "int", "sbyte", "virtual",
-                "default", "interface", "sealed", "volatile", "delegate", "internal",
-                "short", "void", "do", "is", "sizeof", "while", "double", "lock", "stackalloc",
-                "else", "long", "static", "enum", "namespace", "string", "partial", "get", "set",
-                "region", "endregion",
-            };
-
-            _keywords = new Dictionary<string, bool>();
-            foreach (string key in words)
-                _keywords.Add(key, true);
-
-            Reset();
-
-            return;
-        }
-
-        /// <summary>
-        /// Tells whether TokenClassifier is currently in escaping mode. When true,
-        /// this flag causes TokenClassifier to override the final classification
-        /// of a basic entity (such as: ") to be treated as normal text instead of
-        /// being interpreted as a string delimiter.
-        /// </summary>
-        public bool Escaping
-        {
-            get { return (_escaping); }
-        }
-
-        /// <summary>
-        /// Reset the StateMachine to default value. (code block).
-        /// </summary>
-        public void Reset()
-        {
-            _sm_output = SMSTATE_CODE;
-            _escaping = false;
-
-            return;
-        }
-
-        /// <summary>
-        /// Classify the given LexToken into a ClassificationTag.
-        /// </summary>
-        /// <param name="token">The token to be classified.</param>
-        /// <returns>The smState value.</returns>
-        public ClassificationTag Classify(LexToken token)
-        {
-            int classTag;
-
-            UiExceptionHelper.CheckNotNull(token, "token");
-
-            classTag = AcceptLexToken(token);
-
-            if (classTag == SMSTATE_CODE &&
-                _keywords.ContainsKey(token.Text))
-                return (ClassificationTag.Keyword);
-
-            // Parsing a token whoose Text value is set to '\'
-            // causes the classifier to set/reset is escaping mode.
-
-            if (token.Text == "\\" &&
-                _sm_output == SMSTATE_STRING &&
-                !_escaping)
-                _escaping = true;
-            else
-                _escaping = false;
-
-            return (_tags[classTag]);
-        }
-
-        /// <summary>
-        /// Classify the given token and get its corresponding SMSTATE value.
-        /// </summary>
-        /// <param name="token">The LexToken to be classified.</param>
-        /// <returns>An SMSTATE value.</returns>
-        protected int AcceptLexToken(LexToken token)
-        {
-            int smState;
-
-            if (_escaping)
-                return (SMSTATE_STRING);
-
-            smState = GetTokenSMSTATE(_sm_output, token.Tag);
-            _sm_output = GetSMSTATE(_sm_output, token.Tag);
-
-            return (smState);
-        }
-
-        /// <summary>
-        /// Gets the SMSTATE under the "transition" going from "smState".
-        /// </summary>
-        /// <param name="smState">The current smState.</param>
-        /// <param name="transition">The current LexerTag.</param>
-        /// <returns>The new smState.</returns>
-        protected int GetSMSTATE(int smState, LexerTag transition)
-        {
-            return (_sm.GetSMSTATE(smState, transition));
-        }
-
-        /// <summary>
-        /// Gets a token SMSTATE under the "transition" going from "smState".
-        /// </summary>
-        /// <param name="smState">The current smState machine.</param>
-        /// <param name="transition">The LexerTag to be classified.</param>
-        /// <returns>The LexerTag's classification.</returns>
-        protected int GetTokenSMSTATE(int smState, LexerTag transition)
-        {
-            return (_sm.GetTokenSMSTATE(smState, transition));
-        }
-
-        #region StateMachine
-
-        /// <summary>
-        /// Defines a transition (of a state machine).
-        /// </summary>
-        class TransitionData
-        {
-            /// <summary>
-            /// The current transition.
-            /// </summary>
-            public LexerTag Transition;
-
-            /// <summary>
-            /// The SMSTATE code reached when following that transition.
-            /// </summary>
-            public int SMSTATE;
-
-            /// <summary>
-            /// The TokenSMSTATE reached when following that transition.
-            /// </summary>
-            public int TokenSMSTATE;
-
-            public TransitionData(LexerTag transition, int smState)
-            {
-                Transition = transition;
-
-                SMSTATE = smState;
-                TokenSMSTATE = smState;
-
-                return;
-            }
-
-            public TransitionData(LexerTag transition, int smState, int tokenSmState) :
-                this(transition, smState)
-            {
-                TokenSMSTATE = tokenSmState;
-            }
-        }
-
-        /// <summary>
-        /// Defines a state (of a state machine) and its associated transitions.
-        /// </summary>
-        class State
-        {
-            public int InitialState;
-            public TransitionData[] Transitions;
-
-            public State(int initialState, TransitionData[] transitions)
-            {
-                int i;
-                int j;
-
-                UiExceptionHelper.CheckNotNull(transitions, "transitions");
-                UiExceptionHelper.CheckTrue(
-                    transitions.Length == 8,
-                    "expecting transitions.Length to be 8",
-                    "transitions");
-
-                for (i = 0; i < transitions.Length; ++i)
-                    for (j = 0; j < transitions.Length; ++j)
-                    {
-                        if (j == i)
-                            continue;
-
-                        if (transitions[j].Transition == transitions[i].Transition)
-                            UiExceptionHelper.CheckTrue(false,
-                                String.Format("transition '{0}' already present", transitions[j].Transition),
-                                "transitions");
-                    }
-
-
-                InitialState = initialState;
-                Transitions = transitions;
-
-                return;
-            }
-
-            public TransitionData this[LexerTag transition]
-            {
-                get
-                {
-                    foreach (TransitionData couple in Transitions)
-                        if (couple.Transition == transition)
-                            return (couple);
-                    return (null);
-                }
-            }
-        }
-
-        /// <summary>
-        /// A finite state machine. Where states are SMSTATE codes and
-        /// transitions are LexTokens.
-        /// </summary>
-        class StateMachine
-        {
-            private State[] _states;
-
-            public StateMachine()
-            {
-                _states = new State[5];
-
-                // defines transitions from SMSTATE_CODE
-                _states[0] = new State(
-                    SMSTATE_CODE,
-                    new TransitionData[] {
-                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CODE),
-                        new TransitionData(LexerTag.Separator, SMSTATE_CODE),
-                        new TransitionData(LexerTag.Text, SMSTATE_CODE),
-                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CODE, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_STRING),
-                    });
-
-                // defines transitions from SMSTATE_CCOMMENT
-                _states[1] = new State(
-                    SMSTATE_CCOMMENT,
-                    new TransitionData[] {
-                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.Separator, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.Text, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CODE, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CCOMMENT),
-                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CCOMMENT),
-                    });
-
-                // defines transitions from SMSTATE_CPPCOMMENT
-                _states[2] = new State(
-                    SMSTATE_CPPCOMMENT,
-                    new TransitionData[] {
-                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CODE),
-                        new TransitionData(LexerTag.Separator, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.Text, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CPPCOMMENT),
-                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CPPCOMMENT),
-                    });
-
-                // defines transition from SMSTATE_CHAR
-                _states[3] = new State(
-                    SMSTATE_CHAR,
-                    new TransitionData[] {
-                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.Separator, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.Text, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CODE, SMSTATE_CHAR),
-                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CHAR),
-                    });
-
-                // defines transition from SMSTATE_STRING
-                _states[4] = new State(
-                    SMSTATE_STRING,
-                    new TransitionData[] {
-                        new TransitionData(LexerTag.EndOfLine, SMSTATE_STRING),
-                        new TransitionData(LexerTag.Separator, SMSTATE_STRING),
-                        new TransitionData(LexerTag.Text, SMSTATE_STRING),
-                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_STRING),
-                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_STRING),
-                        new TransitionData(LexerTag.CommentCpp, SMSTATE_STRING),
-                        new TransitionData(LexerTag.SingleQuote, SMSTATE_STRING),
-                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CODE, SMSTATE_STRING),
-                    });
-
-                return;
-            }
-
-            /// <summary>
-            /// Follow "transition" going from "smState" and returns reached SMSTATE.
-            /// </summary>
-            public int GetSMSTATE(int smState, LexerTag transition)
-            {
-                foreach (State st in _states)
-                    if (st.InitialState == smState)
-                        return (st[transition].SMSTATE);
-                return (SMSTATE_CODE);
-            }
-
-            /// <summary>
-            /// Follow "transition" going from "smState" and returns reached TokenSMSTATE.
-            /// </summary>
-            public int GetTokenSMSTATE(int smState, LexerTag transition)
-            {
-                foreach (State st in _states)
-                    if (st.InitialState == smState)
-                        return (st[transition].TokenSMSTATE);
-                return (SMSTATE_CODE);
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Used at an internal stage to convert LexToken into ClassifiedToken. This class provides
+    /// a very basic semantic analysis to make text following in one the categories below:
+    ///     - regular code,
+    ///     - developper comments,
+    ///     - strings / character.
+    /// The output of this class is used by CSharpCodeFormatter to achieve the basic syntax coloring.
+    /// </summary>
+    public class TokenClassifier
+    {
+        #region SMSTATE code
+
+        // the list below contains constant values defining states for the finite
+        // smState machine that makes all the work of converting LexToken into ClassifiedToken.
+        // for instance, Lexer can send inputs like:
+        //
+        //   [Text][Separator][CommentC_Open][Text][CommentC_Close]
+        //
+        // This LexToken sequence can for instance be converted that way by TokenClassifier.
+        //
+        //   - [Text][Separator]                     => [Code]
+        //   - [CommentC_Open][Text][CommentC_Close] => [Comment]
+        // 
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a code block.
+        /// </summary>
+        public const int SMSTATE_CODE = 0;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a C comment block.
+        /// </summary>
+        public const int SMSTATE_CCOMMENT = 1;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a C++ comment block.
+        /// </summary>
+        public const int SMSTATE_CPPCOMMENT = 2;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a char surrounded by single quotes.
+        /// </summary>
+        public const int SMSTATE_CHAR = 3;
+
+        /// <summary>
+        /// State code for the smState machine.
+        /// State when reaching a string surrounded by double quotes.
+        /// </summary>
+        public const int SMSTATE_STRING = 4;
+
+        #endregion
+
+        /// <summary>
+        /// A finite smState machine where states are: SMSTATE values and
+        /// transitions are LexToken.
+        /// </summary>
+        private StateMachine _sm;
+
+        /// <summary>
+        /// The current StateMachine's SMTATE code.
+        /// </summary>
+        private int _sm_output;
+
+        /// <summary>
+        /// Makes a link between SMSTATE code and ClassificationTag.
+        /// </summary>
+        private Dictionary<int, ClassificationTag> _tags;
+
+        /// <summary>
+        /// Contains the list of C# keywords.
+        /// </summary>
+        private Dictionary<string, bool> _keywords;
+
+        /// <summary>
+        /// Indicate whether Lexer is in escaping mode.
+        /// This flag is set to true when parsing "\\" and
+        /// can influate on the following LexerTag value.
+        /// </summary>
+        private bool _escaping;
+
+        /// <summary>
+        /// Build a new instance of TokenClassifier.
+        /// </summary>
+        public TokenClassifier()
+        {
+            string[] words;
+
+            _sm = new StateMachine();
+
+            _tags = new Dictionary<int, ClassificationTag>();
+            _tags.Add(SMSTATE_CODE, ClassificationTag.Code);
+            _tags.Add(SMSTATE_CCOMMENT, ClassificationTag.Comment);
+            _tags.Add(SMSTATE_CPPCOMMENT, ClassificationTag.Comment);
+            _tags.Add(SMSTATE_CHAR, ClassificationTag.String);
+            _tags.Add(SMSTATE_STRING, ClassificationTag.String);
+
+            // build the list of predefined keywords.
+            // this is from the official msdn site. Curiously, some keywords
+            // were ommited from the official documentation.
+            //   For instance "get", "set", "region" and "endregion" were
+            // not part of the official list. Maybe it's a mistake or a misunderstanding
+            // whatever... I want them paint in blue as well!
+
+            words = new string[] {
+                "abstract", "event", "new", "struct", "as", "explicit", "null", "switch",
+                "base", "extern", "object", "this", "bool", "false", "operator", "throw",
+                "break", "finally", "out", "true", "byte", "fixed", "override", "try", "case",
+                "float", "params", "typeof", "catch", "for", "private", "uint", "char",
+                "foreach", "protected", "ulong", "checked", "goto", "public", "unchecked",
+                "class", "if", "readonly", "unsafe", "const", "implicit", "ref", "ushort",
+                "continue", "in", "return", "using", "decimal", "int", "sbyte", "virtual",
+                "default", "interface", "sealed", "volatile", "delegate", "internal",
+                "short", "void", "do", "is", "sizeof", "while", "double", "lock", "stackalloc",
+                "else", "long", "static", "enum", "namespace", "string", "partial", "get", "set",
+                "region", "endregion",
+            };
+
+            _keywords = new Dictionary<string, bool>();
+            foreach (string key in words)
+                _keywords.Add(key, true);
+
+            Reset();
+
+            return;
+        }
+
+        /// <summary>
+        /// Tells whether TokenClassifier is currently in escaping mode. When true,
+        /// this flag causes TokenClassifier to override the final classification
+        /// of a basic entity (such as: ") to be treated as normal text instead of
+        /// being interpreted as a string delimiter.
+        /// </summary>
+        public bool Escaping
+        {
+            get { return (_escaping); }
+        }
+
+        /// <summary>
+        /// Reset the StateMachine to default value. (code block).
+        /// </summary>
+        public void Reset()
+        {
+            _sm_output = SMSTATE_CODE;
+            _escaping = false;
+
+            return;
+        }
+
+        /// <summary>
+        /// Classify the given LexToken into a ClassificationTag.
+        /// </summary>
+        /// <param name="token">The token to be classified.</param>
+        /// <returns>The smState value.</returns>
+        public ClassificationTag Classify(LexToken token)
+        {
+            int classTag;
+
+            UiExceptionHelper.CheckNotNull(token, "token");
+
+            classTag = AcceptLexToken(token);
+
+            if (classTag == SMSTATE_CODE &&
+                _keywords.ContainsKey(token.Text))
+                return (ClassificationTag.Keyword);
+
+            // Parsing a token whoose Text value is set to '\'
+            // causes the classifier to set/reset is escaping mode.
+
+            if (token.Text == "\\" &&
+                _sm_output == SMSTATE_STRING &&
+                !_escaping)
+                _escaping = true;
+            else
+                _escaping = false;
+
+            return (_tags[classTag]);
+        }
+
+        /// <summary>
+        /// Classify the given token and get its corresponding SMSTATE value.
+        /// </summary>
+        /// <param name="token">The LexToken to be classified.</param>
+        /// <returns>An SMSTATE value.</returns>
+        protected int AcceptLexToken(LexToken token)
+        {
+            int smState;
+
+            if (_escaping)
+                return (SMSTATE_STRING);
+
+            smState = GetTokenSMSTATE(_sm_output, token.Tag);
+            _sm_output = GetSMSTATE(_sm_output, token.Tag);
+
+            return (smState);
+        }
+
+        /// <summary>
+        /// Gets the SMSTATE under the "transition" going from "smState".
+        /// </summary>
+        /// <param name="smState">The current smState.</param>
+        /// <param name="transition">The current LexerTag.</param>
+        /// <returns>The new smState.</returns>
+        protected int GetSMSTATE(int smState, LexerTag transition)
+        {
+            return (_sm.GetSMSTATE(smState, transition));
+        }
+
+        /// <summary>
+        /// Gets a token SMSTATE under the "transition" going from "smState".
+        /// </summary>
+        /// <param name="smState">The current smState machine.</param>
+        /// <param name="transition">The LexerTag to be classified.</param>
+        /// <returns>The LexerTag's classification.</returns>
+        protected int GetTokenSMSTATE(int smState, LexerTag transition)
+        {
+            return (_sm.GetTokenSMSTATE(smState, transition));
+        }
+
+        #region StateMachine
+
+        /// <summary>
+        /// Defines a transition (of a state machine).
+        /// </summary>
+        class TransitionData
+        {
+            /// <summary>
+            /// The current transition.
+            /// </summary>
+            public LexerTag Transition;
+
+            /// <summary>
+            /// The SMSTATE code reached when following that transition.
+            /// </summary>
+            public int SMSTATE;
+
+            /// <summary>
+            /// The TokenSMSTATE reached when following that transition.
+            /// </summary>
+            public int TokenSMSTATE;
+
+            public TransitionData(LexerTag transition, int smState)
+            {
+                Transition = transition;
+
+                SMSTATE = smState;
+                TokenSMSTATE = smState;
+
+                return;
+            }
+
+            public TransitionData(LexerTag transition, int smState, int tokenSmState) :
+                this(transition, smState)
+            {
+                TokenSMSTATE = tokenSmState;
+            }
+        }
+
+        /// <summary>
+        /// Defines a state (of a state machine) and its associated transitions.
+        /// </summary>
+        class State
+        {
+            public int InitialState;
+            public TransitionData[] Transitions;
+
+            public State(int initialState, TransitionData[] transitions)
+            {
+                int i;
+                int j;
+
+                UiExceptionHelper.CheckNotNull(transitions, "transitions");
+                UiExceptionHelper.CheckTrue(
+                    transitions.Length == 8,
+                    "expecting transitions.Length to be 8",
+                    "transitions");
+
+                for (i = 0; i < transitions.Length; ++i)
+                    for (j = 0; j < transitions.Length; ++j)
+                    {
+                        if (j == i)
+                            continue;
+
+                        if (transitions[j].Transition == transitions[i].Transition)
+                            UiExceptionHelper.CheckTrue(false,
+                                String.Format("transition '{0}' already present", transitions[j].Transition),
+                                "transitions");
+                    }
+
+
+                InitialState = initialState;
+                Transitions = transitions;
+
+                return;
+            }
+
+            public TransitionData this[LexerTag transition]
+            {
+                get
+                {
+                    foreach (TransitionData couple in Transitions)
+                        if (couple.Transition == transition)
+                            return (couple);
+                    return (null);
+                }
+            }
+        }
+
+        /// <summary>
+        /// A finite state machine. Where states are SMSTATE codes and
+        /// transitions are LexTokens.
+        /// </summary>
+        class StateMachine
+        {
+            private State[] _states;
+
+            public StateMachine()
+            {
+                _states = new State[5];
+
+                // defines transitions from SMSTATE_CODE
+                _states[0] = new State(
+                    SMSTATE_CODE,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CODE),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CODE),
+                        new TransitionData(LexerTag.Text, SMSTATE_CODE),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CODE, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_STRING),
+                    });
+
+                // defines transitions from SMSTATE_CCOMMENT
+                _states[1] = new State(
+                    SMSTATE_CCOMMENT,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.Text, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CODE, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CCOMMENT),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CCOMMENT),
+                    });
+
+                // defines transitions from SMSTATE_CPPCOMMENT
+                _states[2] = new State(
+                    SMSTATE_CPPCOMMENT,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CODE),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.Text, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CPPCOMMENT),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CPPCOMMENT),
+                    });
+
+                // defines transition from SMSTATE_CHAR
+                _states[3] = new State(
+                    SMSTATE_CHAR,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.Separator, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.Text, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_CODE, SMSTATE_CHAR),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CHAR),
+                    });
+
+                // defines transition from SMSTATE_STRING
+                _states[4] = new State(
+                    SMSTATE_STRING,
+                    new TransitionData[] {
+                        new TransitionData(LexerTag.EndOfLine, SMSTATE_STRING),
+                        new TransitionData(LexerTag.Separator, SMSTATE_STRING),
+                        new TransitionData(LexerTag.Text, SMSTATE_STRING),
+                        new TransitionData(LexerTag.CommentC_Open, SMSTATE_STRING),
+                        new TransitionData(LexerTag.CommentC_Close, SMSTATE_STRING),
+                        new TransitionData(LexerTag.CommentCpp, SMSTATE_STRING),
+                        new TransitionData(LexerTag.SingleQuote, SMSTATE_STRING),
+                        new TransitionData(LexerTag.DoubleQuote, SMSTATE_CODE, SMSTATE_STRING),
+                    });
+
+                return;
+            }
+
+            /// <summary>
+            /// Follow "transition" going from "smState" and returns reached SMSTATE.
+            /// </summary>
+            public int GetSMSTATE(int smState, LexerTag transition)
+            {
+                foreach (State st in _states)
+                    if (st.InitialState == smState)
+                        return (st[transition].SMSTATE);
+                return (SMSTATE_CODE);
+            }
+
+            /// <summary>
+            /// Follow "transition" going from "smState" and returns reached TokenSMSTATE.
+            /// </summary>
+            public int GetTokenSMSTATE(int smState, LexerTag transition)
+            {
+                foreach (State st in _states)
+                    if (st.InitialState == smState)
+                        return (st[transition].TokenSMSTATE);
+                return (SMSTATE_CODE);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CSharpParser/TokenDictionary.cs b/src/GuiException/UiException/CSharpParser/TokenDictionary.cs
index e76a4ee..052795e 100644
--- a/src/GuiException/UiException/CSharpParser/TokenDictionary.cs
+++ b/src/GuiException/UiException/CSharpParser/TokenDictionary.cs
@@ -1,286 +1,286 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Collections;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// TokenDictionary is responsible for defining and identifying a set of basic
-    /// strings in a given text that have a particular meaning. For instance:
-    ///  - Separator, (ex: "{" ";" "]" ...)
-    ///  - comment markers, (ex: "//" "/*" "*/")
-    ///  - string markers, (ex: '"' '\'')
-    ///  - Other -> "Text" (all other strings but the ones aboves).
-    /// To achieve this, TokenDictionary firstly defines methods to register and query which
-    /// strings have been registered. Secondly it defines a convenient method: TryMatch()
-    /// responsible for splitting a given string in one or two parts where the first one will
-    /// fall in one of the above categories. When calling TryMatch() iteratively --see Lexer--,
-    /// one can tag a text into a list of tokens that might server for a semantic analysis.
-    ///
-    /// TokenDictionary and Lexer are both responsible for dealing with the lexical analysis
-    /// job that is the first step to make basic syntax coloring. 
-    /// </summary>
-    /// <see cref="Lexer">Front class for the lexical analysis.</see>
-    public class TokenDictionary :
-        IEnumerable
-    {
-        private List<InternalLexToken> _list;
-        private List<LexToken> _working;
-
-        /// <summary>
-        /// Build an empty instance of TokenDictionary.
-        /// </summary>
-        public TokenDictionary()
-        {
-            _list = new List<InternalLexToken>();
-            _working = new List<LexToken>();
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets the token count defined in this instance.
-        /// </summary>
-        public int Count
-        {
-            get { return (_list.Count); }
-        }
-
-        /// <summary>
-        /// Gets the token at the given index.
-        /// </summary>
-        /// <param name="index">Index of the token to be returned.</param>
-        /// <returns>The token at the specified index.</returns>
-        public LexToken this[int index]
-        {
-            get { return (_list[index]); }
-        }
-
-        /// <summary>
-        /// Build a new token and add it to the list of tokens known by TokenDictionary.
-        /// Tokens must be added from the longest text value to the shortest otherwise
-        /// an exception will be raised.
-        /// </summary>
-        /// <param name="value">
-        /// The token's text value. It must not be null nor empty. It must not be already
-        /// defined neither. If there are tokens already defined, value's length must not
-        /// be longer than the previous added token.
-        /// </param>
-        /// <param name="tag">The token's tag value.</param>
-        public void Add(string value, LexerTag tag)
-        {
-            InternalLexToken newToken;
-
-            UiExceptionHelper.CheckNotNull(value, "value");
-            UiExceptionHelper.CheckFalse(value == "",
-                "Token value must not be empty.", "value");
-            UiExceptionHelper.CheckFalse(
-                Contains(value),
-                String.Format("Token '{0}' is already defined.", value),
-                "value");
-            if (Count > 0)
-                UiExceptionHelper.CheckTrue(
-                    _list[Count - 1].Text.Length >= value.Length,
-                    "Tokens must be inserted from the longest to the shortest value.",
-                    "value");
-
-            newToken = new InternalLexToken(value, tag);
-
-            // loop through each item to populate
-            // newToken.StartingWith list.
-
-            foreach (InternalLexToken item in _list)
-                if (item.Text.StartsWith(value))
-                    newToken.StartingWith.Add(item);
-
-            _list.Add(newToken);
-
-            return;
-        }
-
-        /// <summary>
-        /// Tests whether the given string matches a token known by this instance.
-        /// </summary>
-        /// <param name="value">
-        ///     A string to be identify with a token in this instance.
-        /// </param>
-        /// <returns>
-        ///     True if the string matches a token's text
-        ///     value in this instance, false otherwise.
-        /// </returns>
-        public bool Contains(string value)
-        {
-            foreach (LexToken item in _list)
-                if (item.Text == value)
-                    return (true);
-            return (false);
-        }
-
-        /// <summary>
-        /// Try to match in "text" + "prediction" a token previously defined with the Add() method.
-        /// Since TryMatch() may return null, it should be called from a loop that scans iteratively
-        /// all characters of an input text.
-        ///
-        /// TryMatch() can put the caller in the two following situations: 
-        /// 1) if parameters "text"+"prediction" don't hold any token, null will be returned. In this
-        ///    case caller is expected to append to "text" one character more and to shift "prediction"
-        ///    by one character ahead before calling TryMatch() again.
-        /// 2) if parameters "text"+"prediction" look like [data]TOKEN --where [data] is any other string
-        ///    but the ones in tokens-- TryMatch() will return an instance of LexToken which LexToken.Text
-        ///    and LexToken.Tag properties will be setup with identified data. In this case caller is
-        ///    expected to shift its reading position by the lenght of text put in LexToken.Text. Besides
-        ///    "text" parameter should reset its length to 1 again.
-        /// </summary>
-        /// <param name="text">
-        /// At the very beginning, text should be of size 1 and set up with the first character from the
-        /// input text. Each time TryMatch() return null, the following character from the input text
-        /// should be appended to "text". Once a token is returned, this parameter should reset its size
-        /// to 1 and be filled with the character coming just after the identified string.
-        /// This parameter cannot be null.
-        /// </param>
-        /// <param name="prediction">
-        /// This parameter represents a constant sized string that goes just before the data in "text".
-        /// If the caller reach the end of the text and there are not enough character to fill "prediction"
-        /// completely this parameter can be filled with remaining character and eventually becoming empty.
-        /// The size of this string should be equal to the lenght of the longest token defined in
-        /// this instance of TokenDictionary.
-        /// This parameter cannot be null.
-        /// </param>
-        /// <returns>
-        /// The first identifiable LexToken in "text"+"prediction". Returns may be null.
-        /// </returns>
-        /// <see cref="Lexer.Next()">
-        /// To have a look on the loop implementation..
-        /// </see>
-        public LexToken TryMatch(string text, string prediction)
-        {
-            UiExceptionHelper.CheckNotNull(text, "text");
-            UiExceptionHelper.CheckNotNull(prediction, "prediction");
-
-            foreach (InternalLexToken token in _list)
-            {
-                if (text.EndsWith(token.Text))
-                {
-                    // text may look like [data]TOKEN
-                    // where [data] is normal text possibly empty.
-
-                    if (text.Length > token.Text.Length)
-                    {
-                        // get only [data] part
-                        return (new LexToken(
-                            text.Substring(0, text.Length - token.Text.Length),
-                            LexerTag.Text, -1));
-                    }
-
-                    // text looks like TOKEN, however we can't return text at
-                    // this stage before testing content of prediction. Since
-                    // there is a possibility that a longer TOKEN be in the concatenated
-                    // string: text + prediction. (note: longer TOKENs have higher
-                    // priority over shorter ones)
-
-                    if (prediction != "")
-                    {
-                        string pattern;
-                        int i;
-
-                        _working.Clear();
-                        PopulateTokenStartingWith(token, _working);
-
-                        for (i = 1; i < _working.Count; ++i)
-                        {
-                            if (_working[i].Text.Length <= text.Length ||
-                                _working[i].Text.Length > text.Length + prediction.Length)
-                                continue;
-                            pattern = text + prediction.Substring(0,
-                                _working[i].Text.Length - text.Length);
-                            if (_working[i].Text == pattern)
-                                return (_working[i]);
-                        }
-                    }
-
-                    return (token);
-                }
-            }
-
-            // no match found, if prediction is empty
-            // this means we reach end of text and return
-            // text as a LexerToken.Text
-
-            if (prediction == "")
-                return (new LexToken(text, LexerTag.Text, -1));
-
-            return (null);
-        }
-
-        /// <summary>
-        /// Builds the list of all LexToken which text value starts with the one in starter.
-        /// </summary>
-        /// <param name="starter">The token that the reference text.</param>
-        /// <param name="output">The list of tokens which text starts with the one in starter.</param>
-        protected void PopulateTokenStartingWith(LexToken starter, List<LexToken> output)
-        {
-            InternalLexToken token;
-
-            UiExceptionHelper.CheckNotNull(starter, "starter");
-            UiExceptionHelper.CheckNotNull(output, "output");
-
-            output.Add(starter);
-
-            token = (InternalLexToken)starter;
-            foreach (LexToken item in token.StartingWith)
-                output.Add(item);
-
-            return;
-        }
-
-        #region InternalLexToken
-
-        /// <summary>
-        /// Inherits of LexToken and add a public array that holds the list of all other tokens
-        /// which text values start with the one in the current instance.
-        /// </summary>
-        class InternalLexToken :
-            LexToken
-        {
-            /// <summary>
-            /// Holds the list of all other tokens which text values start like the one
-            /// in this instance. This array is used to solve ambiguity when finding a
-            /// string that could possibly represents more than one token.
-            /// </summary>
-            public List<LexToken> StartingWith;
-
-            /// <summary>
-            /// Build a new instance of InternalLexToken with the given data.
-            /// </summary>
-            /// <param name="value">The token's text value.</param>
-            /// <param name="tag">The token's tag value.</param>
-            public InternalLexToken(string value, LexerTag tag)
-            {
-                _start = -1;
-                _text = value;
-                _tag = tag;
-
-                StartingWith = new List<LexToken>();
-
-                return;
-            }
-        }
-
-        #endregion
-
-        #region IEnumerable Membres
-
-        public IEnumerator GetEnumerator()
-        {
-            return (_list.GetEnumerator());
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// TokenDictionary is responsible for defining and identifying a set of basic
+    /// strings in a given text that have a particular meaning. For instance:
+    ///  - Separator, (ex: "{" ";" "]" ...)
+    ///  - comment markers, (ex: "//" "/*" "*/")
+    ///  - string markers, (ex: '"' '\'')
+    ///  - Other -> "Text" (all other strings but the ones aboves).
+    /// To achieve this, TokenDictionary firstly defines methods to register and query which
+    /// strings have been registered. Secondly it defines a convenient method: TryMatch()
+    /// responsible for splitting a given string in one or two parts where the first one will
+    /// fall in one of the above categories. When calling TryMatch() iteratively --see Lexer--,
+    /// one can tag a text into a list of tokens that might server for a semantic analysis.
+    ///
+    /// TokenDictionary and Lexer are both responsible for dealing with the lexical analysis
+    /// job that is the first step to make basic syntax coloring. 
+    /// </summary>
+    /// <see cref="Lexer">Front class for the lexical analysis.</see>
+    public class TokenDictionary :
+        IEnumerable
+    {
+        private List<InternalLexToken> _list;
+        private List<LexToken> _working;
+
+        /// <summary>
+        /// Build an empty instance of TokenDictionary.
+        /// </summary>
+        public TokenDictionary()
+        {
+            _list = new List<InternalLexToken>();
+            _working = new List<LexToken>();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the token count defined in this instance.
+        /// </summary>
+        public int Count
+        {
+            get { return (_list.Count); }
+        }
+
+        /// <summary>
+        /// Gets the token at the given index.
+        /// </summary>
+        /// <param name="index">Index of the token to be returned.</param>
+        /// <returns>The token at the specified index.</returns>
+        public LexToken this[int index]
+        {
+            get { return (_list[index]); }
+        }
+
+        /// <summary>
+        /// Build a new token and add it to the list of tokens known by TokenDictionary.
+        /// Tokens must be added from the longest text value to the shortest otherwise
+        /// an exception will be raised.
+        /// </summary>
+        /// <param name="value">
+        /// The token's text value. It must not be null nor empty. It must not be already
+        /// defined neither. If there are tokens already defined, value's length must not
+        /// be longer than the previous added token.
+        /// </param>
+        /// <param name="tag">The token's tag value.</param>
+        public void Add(string value, LexerTag tag)
+        {
+            InternalLexToken newToken;
+
+            UiExceptionHelper.CheckNotNull(value, "value");
+            UiExceptionHelper.CheckFalse(value == "",
+                "Token value must not be empty.", "value");
+            UiExceptionHelper.CheckFalse(
+                Contains(value),
+                String.Format("Token '{0}' is already defined.", value),
+                "value");
+            if (Count > 0)
+                UiExceptionHelper.CheckTrue(
+                    _list[Count - 1].Text.Length >= value.Length,
+                    "Tokens must be inserted from the longest to the shortest value.",
+                    "value");
+
+            newToken = new InternalLexToken(value, tag);
+
+            // loop through each item to populate
+            // newToken.StartingWith list.
+
+            foreach (InternalLexToken item in _list)
+                if (item.Text.StartsWith(value))
+                    newToken.StartingWith.Add(item);
+
+            _list.Add(newToken);
+
+            return;
+        }
+
+        /// <summary>
+        /// Tests whether the given string matches a token known by this instance.
+        /// </summary>
+        /// <param name="value">
+        ///     A string to be identify with a token in this instance.
+        /// </param>
+        /// <returns>
+        ///     True if the string matches a token's text
+        ///     value in this instance, false otherwise.
+        /// </returns>
+        public bool Contains(string value)
+        {
+            foreach (LexToken item in _list)
+                if (item.Text == value)
+                    return (true);
+            return (false);
+        }
+
+        /// <summary>
+        /// Try to match in "text" + "prediction" a token previously defined with the Add() method.
+        /// Since TryMatch() may return null, it should be called from a loop that scans iteratively
+        /// all characters of an input text.
+        ///
+        /// TryMatch() can put the caller in the two following situations: 
+        /// 1) if parameters "text"+"prediction" don't hold any token, null will be returned. In this
+        ///    case caller is expected to append to "text" one character more and to shift "prediction"
+        ///    by one character ahead before calling TryMatch() again.
+        /// 2) if parameters "text"+"prediction" look like [data]TOKEN --where [data] is any other string
+        ///    but the ones in tokens-- TryMatch() will return an instance of LexToken which LexToken.Text
+        ///    and LexToken.Tag properties will be setup with identified data. In this case caller is
+        ///    expected to shift its reading position by the lenght of text put in LexToken.Text. Besides
+        ///    "text" parameter should reset its length to 1 again.
+        /// </summary>
+        /// <param name="text">
+        /// At the very beginning, text should be of size 1 and set up with the first character from the
+        /// input text. Each time TryMatch() return null, the following character from the input text
+        /// should be appended to "text". Once a token is returned, this parameter should reset its size
+        /// to 1 and be filled with the character coming just after the identified string.
+        /// This parameter cannot be null.
+        /// </param>
+        /// <param name="prediction">
+        /// This parameter represents a constant sized string that goes just before the data in "text".
+        /// If the caller reach the end of the text and there are not enough character to fill "prediction"
+        /// completely this parameter can be filled with remaining character and eventually becoming empty.
+        /// The size of this string should be equal to the lenght of the longest token defined in
+        /// this instance of TokenDictionary.
+        /// This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// The first identifiable LexToken in "text"+"prediction". Returns may be null.
+        /// </returns>
+        /// <see cref="Lexer.Next()">
+        /// To have a look on the loop implementation..
+        /// </see>
+        public LexToken TryMatch(string text, string prediction)
+        {
+            UiExceptionHelper.CheckNotNull(text, "text");
+            UiExceptionHelper.CheckNotNull(prediction, "prediction");
+
+            foreach (InternalLexToken token in _list)
+            {
+                if (text.EndsWith(token.Text))
+                {
+                    // text may look like [data]TOKEN
+                    // where [data] is normal text possibly empty.
+
+                    if (text.Length > token.Text.Length)
+                    {
+                        // get only [data] part
+                        return (new LexToken(
+                            text.Substring(0, text.Length - token.Text.Length),
+                            LexerTag.Text, -1));
+                    }
+
+                    // text looks like TOKEN, however we can't return text at
+                    // this stage before testing content of prediction. Since
+                    // there is a possibility that a longer TOKEN be in the concatenated
+                    // string: text + prediction. (note: longer TOKENs have higher
+                    // priority over shorter ones)
+
+                    if (prediction != "")
+                    {
+                        string pattern;
+                        int i;
+
+                        _working.Clear();
+                        PopulateTokenStartingWith(token, _working);
+
+                        for (i = 1; i < _working.Count; ++i)
+                        {
+                            if (_working[i].Text.Length <= text.Length ||
+                                _working[i].Text.Length > text.Length + prediction.Length)
+                                continue;
+                            pattern = text + prediction.Substring(0,
+                                _working[i].Text.Length - text.Length);
+                            if (_working[i].Text == pattern)
+                                return (_working[i]);
+                        }
+                    }
+
+                    return (token);
+                }
+            }
+
+            // no match found, if prediction is empty
+            // this means we reach end of text and return
+            // text as a LexerToken.Text
+
+            if (prediction == "")
+                return (new LexToken(text, LexerTag.Text, -1));
+
+            return (null);
+        }
+
+        /// <summary>
+        /// Builds the list of all LexToken which text value starts with the one in starter.
+        /// </summary>
+        /// <param name="starter">The token that the reference text.</param>
+        /// <param name="output">The list of tokens which text starts with the one in starter.</param>
+        protected void PopulateTokenStartingWith(LexToken starter, List<LexToken> output)
+        {
+            InternalLexToken token;
+
+            UiExceptionHelper.CheckNotNull(starter, "starter");
+            UiExceptionHelper.CheckNotNull(output, "output");
+
+            output.Add(starter);
+
+            token = (InternalLexToken)starter;
+            foreach (LexToken item in token.StartingWith)
+                output.Add(item);
+
+            return;
+        }
+
+        #region InternalLexToken
+
+        /// <summary>
+        /// Inherits of LexToken and add a public array that holds the list of all other tokens
+        /// which text values start with the one in the current instance.
+        /// </summary>
+        class InternalLexToken :
+            LexToken
+        {
+            /// <summary>
+            /// Holds the list of all other tokens which text values start like the one
+            /// in this instance. This array is used to solve ambiguity when finding a
+            /// string that could possibly represents more than one token.
+            /// </summary>
+            public List<LexToken> StartingWith;
+
+            /// <summary>
+            /// Build a new instance of InternalLexToken with the given data.
+            /// </summary>
+            /// <param name="value">The token's text value.</param>
+            /// <param name="tag">The token's tag value.</param>
+            public InternalLexToken(string value, LexerTag tag)
+            {
+                _start = -1;
+                _text = value;
+                _tag = tag;
+
+                StartingWith = new List<LexToken>();
+
+                return;
+            }
+        }
+
+        #endregion
+
+        #region IEnumerable Membres
+
+        public IEnumerator GetEnumerator()
+        {
+            return (_list.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs b/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs
index c5ca018..ff2b1d3 100644
--- a/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs
+++ b/src/GuiException/UiException/CodeFormatters/CodeFormatterCollection.cs
@@ -1,203 +1,203 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// Makes the link between a file language and an ICodeFormatter.
-    /// This class is used to know which formatter need to be call
-    /// when displaying an ErrorItem.
-    /// </summary>
-    public class CodeFormatterCollection :
-        IEnumerable
-    {
-        /// <summary>
-        /// Maps language files to ICodeFormatters.
-        /// </summary>
-        private Dictionary<string, ICodeFormatter> _toFormatter;
-
-        /// <summary>
-        /// Builds an empty CodeFormatterCollection.
-        /// </summary>
-        public CodeFormatterCollection()
-        {
-            _toFormatter = new Dictionary<string, ICodeFormatter>();
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets the size of the collection.
-        /// </summary>
-        public int Count
-        {
-            get { return (_toFormatter.Count); }
-        }
-
-        /// <summary>
-        /// Returns the ICodeFormatter that fit the given language.
-        /// </summary>
-        /// <param name="language">
-        /// A language name, such as: "C#" or "Java".
-        /// This parameter cannot be null.
-        /// </param>
-        /// <returns>
-        /// The ICodeFormatter that fit this language.
-        /// </returns>
-        /// <see cref="HasExtension"/>
-        public ICodeFormatter this[string language]
-        {
-            get
-            {
-                UiExceptionHelper.CheckNotNull(language, "language");
-
-                foreach (ICodeFormatter item in _toFormatter.Values)
-                    if (item.Language == language)
-                        return (item);
-
-                throw new ArgumentException("unknown language: '" + language + "'");
-            }
-        }
-        
-        /// <summary>
-        /// Checks whether there is a formatter that has been
-        /// assigned to the given file extension.
-        /// </summary>
-        /// <param name="language">A file extension such as: "cs".</param>
-        /// <returns>True if there is such formatter, false otherwise.</returns>
-        public bool HasExtension(string extension)
-        {
-            if (extension == null)
-                return (false);
-
-            extension = extension.ToLower();
-
-            return (_toFormatter.ContainsKey(extension));
-        }
-
-        /// <summary>
-        /// Tests whether the collection contains a formatter for the given language.
-        /// </summary>
-        /// <param name="language">
-        /// A language name. Ex: "C#", "Java"</param>
-        /// <returns>True if such formatter exists.</returns>
-        public bool HasLanguage(string languageName)
-        {
-            if (languageName == null)
-                return (false);
-
-            foreach (ICodeFormatter item in _toFormatter.Values)
-                if (item.Language == languageName)
-                    return (true);
-
-            return (false);
-        }
-
-        /// <summary>
-        /// Gets the ICodeFormatter that has been assigned to this extension.
-        /// </summary>
-        /// <param name="extension">The file extension. This parameter
-        /// cannot be null.</param>
-        /// <returns>The ICodeFormatter assigned to.</returns>
-        public ICodeFormatter GetFromExtension(string extension)
-        {
-            UiExceptionHelper.CheckNotNull(extension, "extension");
-            extension = extension.ToLower();
-            return (_toFormatter[extension]);
-        }
-       
-        /// <summary>
-        /// Registers an ICodeFormatter for the given language. The system
-        /// is not case sensitive.
-        /// </summary>
-        /// <param name="formatter">
-        /// A non null formatter.
-        /// </param>
-        /// <param name="language">
-        /// A non null file language.
-        /// The value must not be empty nor contain '.' and
-        /// must not have been already registered.
-        /// </param>
-        public void Register(ICodeFormatter formatter, string extension)
-        {
-            UiExceptionHelper.CheckNotNull(formatter, "formatter");
-            UiExceptionHelper.CheckNotNull(extension, "language");
-
-            extension = extension.ToLower();
-
-            UiExceptionHelper.CheckTrue(extension.Length > 0,
-                "language cannot be empty", "language");
-            UiExceptionHelper.CheckTrue(extension.LastIndexOf('.') == -1,
-                "language cannot contain '.'", "language");
-            UiExceptionHelper.CheckFalse(_toFormatter.ContainsKey(extension),
-                "language '" + extension + "' has already an handler. Remove handler first.",
-                "language");
-
-            _toFormatter.Add(extension, formatter);
-
-            return;
-        }
-
-        /// <summary>
-        /// Removes the formatter for the given file language.
-        /// The language is not case sensitive.
-        /// </summary>
-        /// <param name="language">A file language.</param>
-        public void Remove(string extension)
-        {
-            if (extension == null)
-                return;
-
-            extension = extension.ToLower();
-
-            _toFormatter.Remove(extension);
-
-            return;
-        }
-
-        /// <summary>
-        /// Removes all formatters.
-        /// </summary>
-        public void Clear()
-        {
-            _toFormatter.Clear();
-        }
-
-        /// <summary>
-        /// Returns a string collection with all registered extensions.
-        /// </summary>
-        public StringCollection Extensions
-        {
-            get
-            {
-                StringCollection res;
-
-                res = new StringCollection();
-                foreach (string extension in _toFormatter.Keys)
-                    res.Add(extension);
-
-                return (res);
-            }
-        }
-
-        #region IEnumerable Membres
-
-        /// <summary>
-        /// Returns an IEnumerator on all registered ICodeFormatter.
-        /// </summary>
-        public IEnumerator GetEnumerator()
-        {
-            return (_toFormatter.Values.GetEnumerator());
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Makes the link between a file language and an ICodeFormatter.
+    /// This class is used to know which formatter need to be call
+    /// when displaying an ErrorItem.
+    /// </summary>
+    public class CodeFormatterCollection :
+        IEnumerable
+    {
+        /// <summary>
+        /// Maps language files to ICodeFormatters.
+        /// </summary>
+        private Dictionary<string, ICodeFormatter> _toFormatter;
+
+        /// <summary>
+        /// Builds an empty CodeFormatterCollection.
+        /// </summary>
+        public CodeFormatterCollection()
+        {
+            _toFormatter = new Dictionary<string, ICodeFormatter>();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the size of the collection.
+        /// </summary>
+        public int Count
+        {
+            get { return (_toFormatter.Count); }
+        }
+
+        /// <summary>
+        /// Returns the ICodeFormatter that fit the given language.
+        /// </summary>
+        /// <param name="language">
+        /// A language name, such as: "C#" or "Java".
+        /// This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// The ICodeFormatter that fit this language.
+        /// </returns>
+        /// <see cref="HasExtension"/>
+        public ICodeFormatter this[string language]
+        {
+            get
+            {
+                UiExceptionHelper.CheckNotNull(language, "language");
+
+                foreach (ICodeFormatter item in _toFormatter.Values)
+                    if (item.Language == language)
+                        return (item);
+
+                throw new ArgumentException("unknown language: '" + language + "'");
+            }
+        }
+        
+        /// <summary>
+        /// Checks whether there is a formatter that has been
+        /// assigned to the given file extension.
+        /// </summary>
+        /// <param name="language">A file extension such as: "cs".</param>
+        /// <returns>True if there is such formatter, false otherwise.</returns>
+        public bool HasExtension(string extension)
+        {
+            if (extension == null)
+                return (false);
+
+            extension = extension.ToLower();
+
+            return (_toFormatter.ContainsKey(extension));
+        }
+
+        /// <summary>
+        /// Tests whether the collection contains a formatter for the given language.
+        /// </summary>
+        /// <param name="language">
+        /// A language name. Ex: "C#", "Java"</param>
+        /// <returns>True if such formatter exists.</returns>
+        public bool HasLanguage(string languageName)
+        {
+            if (languageName == null)
+                return (false);
+
+            foreach (ICodeFormatter item in _toFormatter.Values)
+                if (item.Language == languageName)
+                    return (true);
+
+            return (false);
+        }
+
+        /// <summary>
+        /// Gets the ICodeFormatter that has been assigned to this extension.
+        /// </summary>
+        /// <param name="extension">The file extension. This parameter
+        /// cannot be null.</param>
+        /// <returns>The ICodeFormatter assigned to.</returns>
+        public ICodeFormatter GetFromExtension(string extension)
+        {
+            UiExceptionHelper.CheckNotNull(extension, "extension");
+            extension = extension.ToLower();
+            return (_toFormatter[extension]);
+        }
+       
+        /// <summary>
+        /// Registers an ICodeFormatter for the given language. The system
+        /// is not case sensitive.
+        /// </summary>
+        /// <param name="formatter">
+        /// A non null formatter.
+        /// </param>
+        /// <param name="language">
+        /// A non null file language.
+        /// The value must not be empty nor contain '.' and
+        /// must not have been already registered.
+        /// </param>
+        public void Register(ICodeFormatter formatter, string extension)
+        {
+            UiExceptionHelper.CheckNotNull(formatter, "formatter");
+            UiExceptionHelper.CheckNotNull(extension, "language");
+
+            extension = extension.ToLower();
+
+            UiExceptionHelper.CheckTrue(extension.Length > 0,
+                "language cannot be empty", "language");
+            UiExceptionHelper.CheckTrue(extension.LastIndexOf('.') == -1,
+                "language cannot contain '.'", "language");
+            UiExceptionHelper.CheckFalse(_toFormatter.ContainsKey(extension),
+                "language '" + extension + "' has already an handler. Remove handler first.",
+                "language");
+
+            _toFormatter.Add(extension, formatter);
+
+            return;
+        }
+
+        /// <summary>
+        /// Removes the formatter for the given file language.
+        /// The language is not case sensitive.
+        /// </summary>
+        /// <param name="language">A file language.</param>
+        public void Remove(string extension)
+        {
+            if (extension == null)
+                return;
+
+            extension = extension.ToLower();
+
+            _toFormatter.Remove(extension);
+
+            return;
+        }
+
+        /// <summary>
+        /// Removes all formatters.
+        /// </summary>
+        public void Clear()
+        {
+            _toFormatter.Clear();
+        }
+
+        /// <summary>
+        /// Returns a string collection with all registered extensions.
+        /// </summary>
+        public StringCollection Extensions
+        {
+            get
+            {
+                StringCollection res;
+
+                res = new StringCollection();
+                foreach (string extension in _toFormatter.Keys)
+                    res.Add(extension);
+
+                return (res);
+            }
+        }
+
+        #region IEnumerable Membres
+
+        /// <summary>
+        /// Returns an IEnumerator on all registered ICodeFormatter.
+        /// </summary>
+        public IEnumerator GetEnumerator()
+        {
+            return (_toFormatter.Values.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs b/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs
index 4fa3db2..c58c604 100644
--- a/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs
+++ b/src/GuiException/UiException/CodeFormatters/GeneralCodeFormatter.cs
@@ -1,168 +1,168 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    ///   GeneralCodeFormatter is the front class responsible for making a basic
-    /// syntax coloring of a string of text for a set of specific languages.
-    ///  The class encapsulates a set of algorithms where each of them addresses
-    /// a specific language formatting. The use of one or another algorithm at
-    /// analysing time is made through an language registering mechanism.
-    /// For instance C# files are covered by CSharpCodeFormatter which has
-    /// been assigned to "cs" language.
-    ///  If a query is made to GeneralCodeFormatter while there is no formatter
-    /// that fit the given file language a default formatting is applyied
-    /// through the use of the formatter registered into the property
-    /// DefaultFormatter.
-    /// </summary>
-    public class GeneralCodeFormatter :
-        IFormatterCatalog
-    {
-        /// <summary>
-        /// The set of formatting algorithms.
-        /// </summary>
-        private CodeFormatterCollection _formatters;
-
-        /// <summary>
-        /// The default formatter to be used as last resort.
-        /// </summary>
-        private ICodeFormatter _default;
-
-        /// <summary>
-        /// Build and initialises GeneralCodeFormatter.
-        /// </summary>
-        public GeneralCodeFormatter()
-        {
-            _formatters = new CodeFormatterCollection();
-            _formatters.Register(new CSharpCodeFormatter(), "cs");
-
-            _default = new PlainTextCodeFormatter();
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets or sets the formatter to be used as last resort when
-        /// no formatter fit the given source language.
-        ///   The value cannot be null.
-        /// </summary>
-        public ICodeFormatter DefaultFormatter
-        {
-            get { return (_default); }
-            set 
-            {
-                UiExceptionHelper.CheckNotNull(value, "value");
-                _default = value;
-            }
-        }
-
-        /// <summary>
-        /// Gives access to the underlying formatter collection.
-        /// </summary>
-        public CodeFormatterCollection Formatters
-        {
-            get { return (_formatters); }
-        }
-        
-        /// <summary>
-        /// Gets the best formatter that fits the given language. If there
-        /// is no such formatter, a default one is returned.
-        /// </summary>
-        /// <param name="language">
-        /// The language name. Ex: "C#", "Java. This parameter cannot be null.
-        /// </param>
-        /// <returns>
-        /// A non-null ICodeFormatter that best fits the request.
-        /// </returns>
-        public ICodeFormatter GetFormatterFromLanguage(string languageName)
-        {
-            UiExceptionHelper.CheckNotNull(languageName, "language");
-
-            if (_formatters.HasLanguage(languageName))
-                return (_formatters[languageName]);
-
-            return (DefaultFormatter);
-        }
-
-        /// <summary>
-        /// Gets the formatter assigned to the given extension. If there
-        /// is no such assignment, the default formatter is returned.
-        /// </summary>
-        /// <param name="extension">
-        /// A file extension. Ex: "cs", "txt". This parameter cannot be null.
-        /// </param>
-        /// <returns>A non-null ICodeFormatter.</returns>
-        public ICodeFormatter GetFormatterFromExtension(string extension)
-        {
-            UiExceptionHelper.CheckNotNull(extension, "extension");
-
-            if (_formatters.HasExtension(extension))
-                return (_formatters.GetFromExtension(extension));
-
-            return (DefaultFormatter);
-        }
-
-        /// <summary>
-        /// A convenient method to make the formatting of a piece of code when
-        /// only the file extension is known. 
-        /// </summary>
-        /// <param name="code">The piece of code to be formatted. This parameter
-        /// cannot be null.</param>
-        /// <param name="extension">The file extension associated to this piece of code.
-        /// Ex: "cs", "cpp". This is used to pick the formatter assigned to. If no such
-        /// formatter exists, the default one is picked up.</param>
-        /// <returns>The FormattedCode for this piece of code.</returns>
-        public FormattedCode FormatFromExtension(string code, string extension)
-        {
-            UiExceptionHelper.CheckNotNull(code, "code");
-            UiExceptionHelper.CheckNotNull(extension, "extension");
-
-            if (_formatters.HasExtension(extension))
-                return (_formatters.GetFromExtension(extension).Format(code));
-
-            return (DefaultFormatter.Format(code));
-        }
-
-        #region IFormatterCatalog Membres
-
-        /// <summary>
-        /// Pick the best available formatter to format the given piece of code.
-        /// </summary>
-        /// <param name="code">The code to be formatted. This parameter cannot be null.</param>
-        /// <param name="language">
-        /// The language into which code has been written. Ex: "C#", "Java".
-        /// If no such formatter is available, a default formatting is applied.
-        /// This parameter cannot be null.
-        /// </param>
-        /// <returns>
-        /// The formatting for this piece of code.
-        /// </returns>
-        public FormattedCode Format(string code, string language)
-        {
-            UiExceptionHelper.CheckNotNull(code, "code");
-            UiExceptionHelper.CheckNotNull(language, "language");
-
-            if (_formatters.HasLanguage(language))
-                return (_formatters[language].Format(code));
-
-            return (DefaultFormatter.Format(code));
-        }
-
-        public string LanguageFromExtension(string extension)
-        {
-            if (_formatters.HasExtension(extension))
-                return (_formatters.GetFromExtension(extension).Language);
-            return (_default.Language);
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    ///   GeneralCodeFormatter is the front class responsible for making a basic
+    /// syntax coloring of a string of text for a set of specific languages.
+    ///  The class encapsulates a set of algorithms where each of them addresses
+    /// a specific language formatting. The use of one or another algorithm at
+    /// analysing time is made through an language registering mechanism.
+    /// For instance C# files are covered by CSharpCodeFormatter which has
+    /// been assigned to "cs" language.
+    ///  If a query is made to GeneralCodeFormatter while there is no formatter
+    /// that fit the given file language a default formatting is applyied
+    /// through the use of the formatter registered into the property
+    /// DefaultFormatter.
+    /// </summary>
+    public class GeneralCodeFormatter :
+        IFormatterCatalog
+    {
+        /// <summary>
+        /// The set of formatting algorithms.
+        /// </summary>
+        private CodeFormatterCollection _formatters;
+
+        /// <summary>
+        /// The default formatter to be used as last resort.
+        /// </summary>
+        private ICodeFormatter _default;
+
+        /// <summary>
+        /// Build and initialises GeneralCodeFormatter.
+        /// </summary>
+        public GeneralCodeFormatter()
+        {
+            _formatters = new CodeFormatterCollection();
+            _formatters.Register(new CSharpCodeFormatter(), "cs");
+
+            _default = new PlainTextCodeFormatter();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets or sets the formatter to be used as last resort when
+        /// no formatter fit the given source language.
+        ///   The value cannot be null.
+        /// </summary>
+        public ICodeFormatter DefaultFormatter
+        {
+            get { return (_default); }
+            set 
+            {
+                UiExceptionHelper.CheckNotNull(value, "value");
+                _default = value;
+            }
+        }
+
+        /// <summary>
+        /// Gives access to the underlying formatter collection.
+        /// </summary>
+        public CodeFormatterCollection Formatters
+        {
+            get { return (_formatters); }
+        }
+        
+        /// <summary>
+        /// Gets the best formatter that fits the given language. If there
+        /// is no such formatter, a default one is returned.
+        /// </summary>
+        /// <param name="language">
+        /// The language name. Ex: "C#", "Java. This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// A non-null ICodeFormatter that best fits the request.
+        /// </returns>
+        public ICodeFormatter GetFormatterFromLanguage(string languageName)
+        {
+            UiExceptionHelper.CheckNotNull(languageName, "language");
+
+            if (_formatters.HasLanguage(languageName))
+                return (_formatters[languageName]);
+
+            return (DefaultFormatter);
+        }
+
+        /// <summary>
+        /// Gets the formatter assigned to the given extension. If there
+        /// is no such assignment, the default formatter is returned.
+        /// </summary>
+        /// <param name="extension">
+        /// A file extension. Ex: "cs", "txt". This parameter cannot be null.
+        /// </param>
+        /// <returns>A non-null ICodeFormatter.</returns>
+        public ICodeFormatter GetFormatterFromExtension(string extension)
+        {
+            UiExceptionHelper.CheckNotNull(extension, "extension");
+
+            if (_formatters.HasExtension(extension))
+                return (_formatters.GetFromExtension(extension));
+
+            return (DefaultFormatter);
+        }
+
+        /// <summary>
+        /// A convenient method to make the formatting of a piece of code when
+        /// only the file extension is known. 
+        /// </summary>
+        /// <param name="code">The piece of code to be formatted. This parameter
+        /// cannot be null.</param>
+        /// <param name="extension">The file extension associated to this piece of code.
+        /// Ex: "cs", "cpp". This is used to pick the formatter assigned to. If no such
+        /// formatter exists, the default one is picked up.</param>
+        /// <returns>The FormattedCode for this piece of code.</returns>
+        public FormattedCode FormatFromExtension(string code, string extension)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(extension, "extension");
+
+            if (_formatters.HasExtension(extension))
+                return (_formatters.GetFromExtension(extension).Format(code));
+
+            return (DefaultFormatter.Format(code));
+        }
+
+        #region IFormatterCatalog Membres
+
+        /// <summary>
+        /// Pick the best available formatter to format the given piece of code.
+        /// </summary>
+        /// <param name="code">The code to be formatted. This parameter cannot be null.</param>
+        /// <param name="language">
+        /// The language into which code has been written. Ex: "C#", "Java".
+        /// If no such formatter is available, a default formatting is applied.
+        /// This parameter cannot be null.
+        /// </param>
+        /// <returns>
+        /// The formatting for this piece of code.
+        /// </returns>
+        public FormattedCode Format(string code, string language)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(language, "language");
+
+            if (_formatters.HasLanguage(language))
+                return (_formatters[language].Format(code));
+
+            return (DefaultFormatter.Format(code));
+        }
+
+        public string LanguageFromExtension(string extension)
+        {
+            if (_formatters.HasExtension(extension))
+                return (_formatters.GetFromExtension(extension).Language);
+            return (_default.Language);
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs b/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs
index adc096a..3c6ccf8 100644
--- a/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs
+++ b/src/GuiException/UiException/CodeFormatters/ICodeFormatter.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// ICodeFormatter is the interface to make the syntax
-    /// coloring of a string for a specific developpment language.
-    /// </summary>
-    public interface ICodeFormatter
-    {
-        /// <summary>
-        /// The language name handled by this formatter.
-        /// Ex: "C#", "Java", "C++" and so on...
-        /// </summary>
-        string Language { get; }
-
-        /// <summary>
-        /// Makes the coloring syntax of the given text.
-        /// </summary>
-        /// <param name="code">The text to be formatted. This
-        /// parameter cannot be null.</param>
-        /// <returns>A FormattedCode instance.</returns>
-        FormattedCode Format(string code);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// ICodeFormatter is the interface to make the syntax
+    /// coloring of a string for a specific developpment language.
+    /// </summary>
+    public interface ICodeFormatter
+    {
+        /// <summary>
+        /// The language name handled by this formatter.
+        /// Ex: "C#", "Java", "C++" and so on...
+        /// </summary>
+        string Language { get; }
+
+        /// <summary>
+        /// Makes the coloring syntax of the given text.
+        /// </summary>
+        /// <param name="code">The text to be formatted. This
+        /// parameter cannot be null.</param>
+        /// <returns>A FormattedCode instance.</returns>
+        FormattedCode Format(string code);
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs b/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs
index a254205..703198e 100644
--- a/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs
+++ b/src/GuiException/UiException/CodeFormatters/IFormatterCatalog.cs
@@ -1,36 +1,36 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// The interface through which SourceCodeDisplay interacts to guess
-    /// the language from a file extension.
-    /// 
-    /// Direct implementation is:
-    ///     - GeneralCodeFormatter
-    /// </summary>
-    public interface IFormatterCatalog
-    {
-        /// <summary>
-        /// Format the text using the given language formatting.
-        /// </summary>
-        /// <param name="text">A text to be formatted</param>
-        /// <param name="language">The language with which formatting the text</param>
-        /// <returns>A FormatterCode object</returns>
-        FormattedCode Format(string text, string language);
-
-        /// <summary>
-        /// Gets the language from the given extension.
-        /// </summary>
-        /// <param name="extension">An extension without the dot, like 'cs'</param>
-        /// <returns>A language name, like 'C#'</returns>
-        string LanguageFromExtension(string extension);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// The interface through which SourceCodeDisplay interacts to guess
+    /// the language from a file extension.
+    /// 
+    /// Direct implementation is:
+    ///     - GeneralCodeFormatter
+    /// </summary>
+    public interface IFormatterCatalog
+    {
+        /// <summary>
+        /// Format the text using the given language formatting.
+        /// </summary>
+        /// <param name="text">A text to be formatted</param>
+        /// <param name="language">The language with which formatting the text</param>
+        /// <returns>A FormatterCode object</returns>
+        FormattedCode Format(string text, string language);
+
+        /// <summary>
+        /// Gets the language from the given extension.
+        /// </summary>
+        /// <param name="extension">An extension without the dot, like 'cs'</param>
+        /// <returns>A language name, like 'C#'</returns>
+        string LanguageFromExtension(string extension);
+    }
+}
diff --git a/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs b/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs
index ab0cc50..bb3fc82 100644
--- a/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs
+++ b/src/GuiException/UiException/CodeFormatters/PlainTextCodeFormatter.cs
@@ -1,100 +1,100 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.CodeFormatters
-{
-    /// <summary>
-    /// Create a default FormattedCode for any string value.
-    /// This should be used as a last resort when there is not ICodeFormatter
-    /// that fit source code for an ErrorItem.
-    /// </summary>
-    public class PlainTextCodeFormatter :
-        ICodeFormatter
-    {
-        #region ICodeFormatter Membres
-
-        /// <summary>
-        /// Returns "Plain text"
-        /// </summary>
-        public string Language
-        {
-            get { return ("Plain text"); }
-        }
-
-        public FormattedCode Format(string sourceCode)
-        {
-            DefaultTextManager text;
-            byte[] byteArray;
-            int[] strArray;
-            int[] lineArray;
-            int index;
-            int posLineStart;
-            int posChar;
-
-            UiExceptionHelper.CheckNotNull(sourceCode, "sourceCode");
-
-            sourceCode = PreProcess(sourceCode);
-
-            text = new DefaultTextManager();
-            text.Text = sourceCode;
-
-            strArray = new int[text.LineCount];
-            lineArray = new int[text.LineCount];
-
-            index = 0;
-            posLineStart = 0;
-            posChar = 0;
-
-            foreach (char c in sourceCode)
-            {
-                if (c == '\n')
-                {
-                    strArray[index] = posLineStart;
-                    lineArray[index] = index;
-                    posLineStart = posChar + 1;
-                    index++;
-                }
-
-                posChar++;
-            }
-
-            if (index <= text.LineCount - 1)
-            {
-                strArray[index] = posLineStart;
-                lineArray[index] = index;
-            }
-
-            byteArray = new byte[text.LineCount];
-
-            return (new FormattedCode(sourceCode, strArray, byteArray, lineArray));
-        }
-
-        #endregion
-
-        /// <summary>
-        /// Prepare input text for the parsing stage.
-        /// </summary>
-        /// <param name="text">The text to be pre-processed.</param>
-        /// <returns>A string ready to be parsed.</returns>
-        public string PreProcess(string text)
-        {
-            if (text == null)
-                return (null);
-
-            // this replace tabulation by space sequences. The reason is
-            // that the technique used to measure strings at rendering time
-            // fail to measure '\t' correctly and lines of text containing those
-            // characters are badly aligned.
-            //  The simplest thing to fix that is to remove tabs altogether.
-
-            return (text.Replace("\t", "    "));
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.CodeFormatters
+{
+    /// <summary>
+    /// Create a default FormattedCode for any string value.
+    /// This should be used as a last resort when there is not ICodeFormatter
+    /// that fit source code for an ErrorItem.
+    /// </summary>
+    public class PlainTextCodeFormatter :
+        ICodeFormatter
+    {
+        #region ICodeFormatter Membres
+
+        /// <summary>
+        /// Returns "Plain text"
+        /// </summary>
+        public string Language
+        {
+            get { return ("Plain text"); }
+        }
+
+        public FormattedCode Format(string sourceCode)
+        {
+            DefaultTextManager text;
+            byte[] byteArray;
+            int[] strArray;
+            int[] lineArray;
+            int index;
+            int posLineStart;
+            int posChar;
+
+            UiExceptionHelper.CheckNotNull(sourceCode, "sourceCode");
+
+            sourceCode = PreProcess(sourceCode);
+
+            text = new DefaultTextManager();
+            text.Text = sourceCode;
+
+            strArray = new int[text.LineCount];
+            lineArray = new int[text.LineCount];
+
+            index = 0;
+            posLineStart = 0;
+            posChar = 0;
+
+            foreach (char c in sourceCode)
+            {
+                if (c == '\n')
+                {
+                    strArray[index] = posLineStart;
+                    lineArray[index] = index;
+                    posLineStart = posChar + 1;
+                    index++;
+                }
+
+                posChar++;
+            }
+
+            if (index <= text.LineCount - 1)
+            {
+                strArray[index] = posLineStart;
+                lineArray[index] = index;
+            }
+
+            byteArray = new byte[text.LineCount];
+
+            return (new FormattedCode(sourceCode, strArray, byteArray, lineArray));
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Prepare input text for the parsing stage.
+        /// </summary>
+        /// <param name="text">The text to be pre-processed.</param>
+        /// <returns>A string ready to be parsed.</returns>
+        public string PreProcess(string text)
+        {
+            if (text == null)
+                return (null);
+
+            // this replace tabulation by space sequences. The reason is
+            // that the technique used to measure strings at rendering time
+            // fail to measure '\t' correctly and lines of text containing those
+            // characters are badly aligned.
+            //  The simplest thing to fix that is to remove tabs altogether.
+
+            return (text.Replace("\t", "    "));
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/CodeBox.cs b/src/GuiException/UiException/Controls/CodeBox.cs
index 9a7de82..452e007 100644
--- a/src/GuiException/UiException/Controls/CodeBox.cs
+++ b/src/GuiException/UiException/Controls/CodeBox.cs
@@ -1,227 +1,227 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-using NUnit.UiException.CodeFormatters;
-using System.Diagnostics;
-
-/// This control could have been replaced by a standard RichTextBox control, but
-/// it turned out that RichTextBox:
-///     - was hard to configure
-///     - was hard to set the viewport
-///     - doesn't use double buffer optimization
-///     - scrolls text one line at a time without be configurable.
-/// 
-/// CodeBox has been written to address these specific issues in order to display
-/// C# source code where exceptions occured.
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// A control that implements ICodeView.
-    /// </summary>
-    public class CodeBox : UserControl, ICodeView
-    {
-        protected CodeRenderingContext _workingContext;
-        protected FormattedCode _formattedCode;
-
-        private IFormatterCatalog _formatter;
-        private ICodeRenderer _renderer;
-        private string _language;
-
-        private bool _showCurrentLine;
-        private int _currentLine;
-        
-        public CodeBox() :
-            this(new GeneralCodeFormatter(), new DefaultCodeRenderer()) { }
-
-        #region ICodeView Members
-
-        public override string Text
-        {
-            get { return (_formattedCode.Text); }
-            set
-            {
-                if (value == null)
-                    value = "";
-
-                SizeF docSize;
-
-                _formattedCode = _formatter.Format(value, _language);
-                docSize = _renderer.GetDocumentSize(
-                    _formattedCode, _workingContext.Graphics, _workingContext.Font);
-                AutoScrollMinSize = new Size((int)docSize.Width, (int)docSize.Height);
-
-                Invalidate();
-
-                return;
-            }
-        }
-
-        public string Language
-        {
-            get { return (_language); }
-            set
-            {
-                if (value == null)
-                    value = "";
-                if (_language == value)
-                    return;
-
-                _language = value;
-                Text = Text;
-            }
-        }
-
-        public int CurrentLine
-        {
-            get { return (_currentLine); }
-            set
-            {
-                float y = _renderer.LineIndexToYCoordinate(value,
-                    _workingContext.Graphics, _workingContext.Font);
-
-                y -= Height / 2;
-
-                _currentLine = value;
-                AutoScrollPosition = new Point(0, (int)y);
-
-                Invalidate();
-            }
-        }
-
-        public IFormatterCatalog Formatter
-        {
-            get { return (_formatter); }
-        }
-
-        #endregion
-
-        /// <summary>
-        /// Gets or sets a value telling whether or not displaying a special
-        /// feature for the current line at drawing time.
-        /// </summary>        
-        public bool ShowCurrentLine
-        {
-            get { return (_showCurrentLine); }
-            set { _showCurrentLine = value; }
-        }
-
-        /// <summary>
-        /// If ShowCurrentLine is set, this set the current line's background color.
-        /// </summary>
-        public Color CurrentLineBackColor
-        {
-            get { return (_workingContext.CurrentLineBackColor); }
-            set { 
-                _workingContext.CurrentLineBackColor = value;
-                Invalidate();
-            }
-        }
-
-        /// <summary>
-        /// If ShowCurrentLine is set, this set current line's foreground color.
-        /// </summary>
-        public Color CurrentLineForeColor
-        {
-            get { return (_workingContext.CurrentLineForeColor); }
-            set { 
-                _workingContext.CurrentLineForeColor = value;
-                Invalidate();
-            }
-        }
-       
-        protected CodeBox(IFormatterCatalog formatter, ICodeRenderer renderer)
-        {
-            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
-            SetStyle(ControlStyles.UserPaint, true);
-            DoubleBuffered = true;
-
-            _formatter = formatter;
-            _formattedCode = FormattedCode.Empty;
-
-            _renderer = renderer;
-
-            _currentLine = -1;
-            _showCurrentLine = false;
-
-            _language = "";
-
-            this.Font = new Font(FontFamily.GenericMonospace, 8);
-            this.BackColor = Color.White;
-
-            createGraphics();
-            AutoScroll = true;
-
-            return;
-        }
-
-        protected override void OnMouseHover(EventArgs e)
-        {
-            base.OnMouseHover(e);
-            Focus();
-        }
-
-        protected override void OnPaint(PaintEventArgs e)
-        {
-            Graphics backup;
-
-            base.OnPaint(e);
-
-            backup = _workingContext.Graphics;
-            _workingContext.Graphics = e.Graphics;
-            _workingContext.CurrentLine = (_showCurrentLine ? _currentLine : -1);
-
-            _renderer.DrawToGraphics(_formattedCode, _workingContext,
-                new Rectangle(-AutoScrollPosition.X, -AutoScrollPosition.Y, Width, Height));
-
-            _workingContext.Graphics = backup;
-
-            return;
-        }
-
-        protected override void OnFontChanged(EventArgs e)
-        {
-            base.OnFontChanged(e);
-
-            if (_workingContext != null)
-            {
-                _workingContext.Font = Font;
-                Text = Text;
-            }
-
-            return;
-        }
-
-        private void createGraphics()
-        {
-            Graphics gCurrent = CreateGraphics();
-            Image img = new Bitmap(10, 10, gCurrent);
-            Graphics gImg = Graphics.FromImage(img);
-
-            gCurrent.Dispose();
-
-            _workingContext = new CodeRenderingContext();
-            _workingContext.Graphics = gImg;
-            _workingContext.Font = Font;
-
-            _workingContext.CurrentLine = -1;
-            _workingContext.BackgroundColor = Color.White;
-            _workingContext.CurrentLineBackColor = Color.Red;
-            _workingContext.CurrentLineForeColor = Color.White;
-            _workingContext.CodeColor = Color.Black;
-            _workingContext.CommentColor = Color.Green;
-            _workingContext.KeywordColor = Color.Blue;
-            _workingContext.StringColor = Color.Red;
-
-            return;
-        }
-    }    
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using NUnit.UiException.CodeFormatters;
+using System.Diagnostics;
+
+/// This control could have been replaced by a standard RichTextBox control, but
+/// it turned out that RichTextBox:
+///     - was hard to configure
+///     - was hard to set the viewport
+///     - doesn't use double buffer optimization
+///     - scrolls text one line at a time without be configurable.
+/// 
+/// CodeBox has been written to address these specific issues in order to display
+/// C# source code where exceptions occured.
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// A control that implements ICodeView.
+    /// </summary>
+    public class CodeBox : UserControl, ICodeView
+    {
+        protected CodeRenderingContext _workingContext;
+        protected FormattedCode _formattedCode;
+
+        private IFormatterCatalog _formatter;
+        private ICodeRenderer _renderer;
+        private string _language;
+
+        private bool _showCurrentLine;
+        private int _currentLine;
+        
+        public CodeBox() :
+            this(new GeneralCodeFormatter(), new DefaultCodeRenderer()) { }
+
+        #region ICodeView Members
+
+        public override string Text
+        {
+            get { return (_formattedCode.Text); }
+            set
+            {
+                if (value == null)
+                    value = "";
+
+                SizeF docSize;
+
+                _formattedCode = _formatter.Format(value, _language);
+                docSize = _renderer.GetDocumentSize(
+                    _formattedCode, _workingContext.Graphics, _workingContext.Font);
+                AutoScrollMinSize = new Size((int)docSize.Width, (int)docSize.Height);
+
+                Invalidate();
+
+                return;
+            }
+        }
+
+        public string Language
+        {
+            get { return (_language); }
+            set
+            {
+                if (value == null)
+                    value = "";
+                if (_language == value)
+                    return;
+
+                _language = value;
+                Text = Text;
+            }
+        }
+
+        public int CurrentLine
+        {
+            get { return (_currentLine); }
+            set
+            {
+                float y = _renderer.LineIndexToYCoordinate(value,
+                    _workingContext.Graphics, _workingContext.Font);
+
+                y -= Height / 2;
+
+                _currentLine = value;
+                AutoScrollPosition = new Point(0, (int)y);
+
+                Invalidate();
+            }
+        }
+
+        public IFormatterCatalog Formatter
+        {
+            get { return (_formatter); }
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Gets or sets a value telling whether or not displaying a special
+        /// feature for the current line at drawing time.
+        /// </summary>        
+        public bool ShowCurrentLine
+        {
+            get { return (_showCurrentLine); }
+            set { _showCurrentLine = value; }
+        }
+
+        /// <summary>
+        /// If ShowCurrentLine is set, this set the current line's background color.
+        /// </summary>
+        public Color CurrentLineBackColor
+        {
+            get { return (_workingContext.CurrentLineBackColor); }
+            set { 
+                _workingContext.CurrentLineBackColor = value;
+                Invalidate();
+            }
+        }
+
+        /// <summary>
+        /// If ShowCurrentLine is set, this set current line's foreground color.
+        /// </summary>
+        public Color CurrentLineForeColor
+        {
+            get { return (_workingContext.CurrentLineForeColor); }
+            set { 
+                _workingContext.CurrentLineForeColor = value;
+                Invalidate();
+            }
+        }
+       
+        protected CodeBox(IFormatterCatalog formatter, ICodeRenderer renderer)
+        {
+            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            SetStyle(ControlStyles.UserPaint, true);
+            DoubleBuffered = true;
+
+            _formatter = formatter;
+            _formattedCode = FormattedCode.Empty;
+
+            _renderer = renderer;
+
+            _currentLine = -1;
+            _showCurrentLine = false;
+
+            _language = "";
+
+            this.Font = new Font(FontFamily.GenericMonospace, 8);
+            this.BackColor = Color.White;
+
+            createGraphics();
+            AutoScroll = true;
+
+            return;
+        }
+
+        protected override void OnMouseHover(EventArgs e)
+        {
+            base.OnMouseHover(e);
+            Focus();
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            Graphics backup;
+
+            base.OnPaint(e);
+
+            backup = _workingContext.Graphics;
+            _workingContext.Graphics = e.Graphics;
+            _workingContext.CurrentLine = (_showCurrentLine ? _currentLine : -1);
+
+            _renderer.DrawToGraphics(_formattedCode, _workingContext,
+                new Rectangle(-AutoScrollPosition.X, -AutoScrollPosition.Y, Width, Height));
+
+            _workingContext.Graphics = backup;
+
+            return;
+        }
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            base.OnFontChanged(e);
+
+            if (_workingContext != null)
+            {
+                _workingContext.Font = Font;
+                Text = Text;
+            }
+
+            return;
+        }
+
+        private void createGraphics()
+        {
+            Graphics gCurrent = CreateGraphics();
+            Image img = new Bitmap(10, 10, gCurrent);
+            Graphics gImg = Graphics.FromImage(img);
+
+            gCurrent.Dispose();
+
+            _workingContext = new CodeRenderingContext();
+            _workingContext.Graphics = gImg;
+            _workingContext.Font = Font;
+
+            _workingContext.CurrentLine = -1;
+            _workingContext.BackgroundColor = Color.White;
+            _workingContext.CurrentLineBackColor = Color.Red;
+            _workingContext.CurrentLineForeColor = Color.White;
+            _workingContext.CodeColor = Color.Black;
+            _workingContext.CommentColor = Color.Green;
+            _workingContext.KeywordColor = Color.Blue;
+            _workingContext.StringColor = Color.Red;
+
+            return;
+        }
+    }    
+}
diff --git a/src/GuiException/UiException/Controls/CodeRenderingContext.cs b/src/GuiException/UiException/Controls/CodeRenderingContext.cs
index cf6d5d7..7cd511a 100644
--- a/src/GuiException/UiException/Controls/CodeRenderingContext.cs
+++ b/src/GuiException/UiException/Controls/CodeRenderingContext.cs
@@ -1,226 +1,226 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Encapsulates basic colors settings to format a text according a language.
-    /// </summary>
-    public class CodeRenderingContext
-    {
-        private static readonly int INDEX_CODE = 0;
-        private static readonly int INDEX_KEYWORD = 1;
-        private static readonly int INDEX_COMMENT = 2;
-        private static readonly int INDEX_STRING = 3;
-        private static readonly int INDEX_BACKGROUND = 4;
-        private static readonly int INDEX_CURRBACK = 5;
-        private static readonly int INDEX_CURRFORE = 6;
-
-        private Graphics _graphics;
-        private Font _font;
-
-        private int _currentLine;
-
-        private ColorMaterial[] _colors;
-
-        public CodeRenderingContext()
-        {
-            _colors = new ColorMaterial[] 
-            {
-                new ColorMaterial(Color.Black),        // code color
-                new ColorMaterial(Color.Blue),         // keyword color
-                new ColorMaterial(Color.Green),        // comment color
-                new ColorMaterial(Color.Red),          // string color
-
-                new ColorMaterial(Color.White),        // background
-                new ColorMaterial(Color.Red),          // current line back color
-                new ColorMaterial(Color.White),        // current line fore color                
-            };
-
-            return;
-        }
-
-        public Graphics Graphics {
-            get { return (_graphics); }
-            set { _graphics = value; }
-        }       
-
-        public Font Font {
-            get { return (_font); }
-            set { _font = value; }
-        }
-
-        public int CurrentLine {
-            get { return (_currentLine); }
-            set { _currentLine = value; }
-        }
-
-        public Color BackgroundColor {
-            get { return (_colors[INDEX_BACKGROUND].Color); }
-            set
-            {
-                _colors[INDEX_BACKGROUND].Dispose();
-                _colors[INDEX_BACKGROUND] = new ColorMaterial(value);
-            }
-        }
-
-        public Color CurrentLineBackColor {
-            get { return (_colors[INDEX_CURRBACK].Color); }
-            set {
-                _colors[INDEX_CURRBACK].Dispose();
-                _colors[INDEX_CURRBACK] = new ColorMaterial(value);
-            }
-        }
-
-        public Color CurrentLineForeColor {
-            get { return (_colors[INDEX_CURRFORE].Color); }
-            set {
-                _colors[INDEX_CURRFORE].Dispose();
-                _colors[INDEX_CURRFORE] = new ColorMaterial(value);
-            }
-        }
-
-        public Color KeywordColor {
-            get { return (_colors[INDEX_KEYWORD].Color); }
-            set {
-                _colors[INDEX_KEYWORD].Dispose();
-                _colors[INDEX_KEYWORD] = new ColorMaterial(value);
-            }
-        }
-
-        public Color CommentColor {
-            get { return (_colors[INDEX_COMMENT].Color); }
-            set {
-                _colors[INDEX_COMMENT].Dispose();
-                _colors[INDEX_COMMENT] = new ColorMaterial(value);
-            }
-        }
-
-        public Color CodeColor {
-            get { return (_colors[INDEX_CODE].Color); }
-            set {
-                _colors[INDEX_CODE].Dispose();
-                _colors[INDEX_CODE] = new ColorMaterial(value);
-            }
-        }
-
-        public Color StringColor {
-            get { return (_colors[INDEX_STRING].Color); }
-            set {
-                _colors[INDEX_STRING].Dispose();
-                _colors[INDEX_STRING] = new ColorMaterial(value);
-            }
-        }
-
-        public Color this[ClassificationTag tag]
-        {
-            get
-            {
-                int idx = (int)tag;
-                return (_colors[idx].Color);
-            }
-        }    
-
-        public Brush GetBrush(ClassificationTag tag) {
-            return (_colors[(int)tag].Brush);
-        }
-      
-        public Pen GetPen(ClassificationTag tag) {
-            return (_colors[(int)tag].Pen);
-        }
-
-        #region Brushes
-
-        public Brush BackgroundBrush {
-            get { return (_colors[INDEX_BACKGROUND].Brush); }
-        }
-
-        public Brush CurrentLineBackBrush {
-            get { return (_colors[INDEX_CURRBACK].Brush); }
-        }
-
-        public Brush CurrentLineForeBrush {
-            get { return (_colors[INDEX_CURRFORE].Brush); }
-        }
-
-        public Brush KeywordBrush {
-            get { return (_colors[INDEX_KEYWORD].Brush); }
-        }
-
-        public Brush CommentBrush {
-            get { return (_colors[INDEX_COMMENT].Brush); }
-        }
-
-        public Brush CodeBrush {
-            get { return (_colors[INDEX_CODE].Brush); }
-        }
-
-        public Brush StringBrush {
-            get { return (_colors[INDEX_STRING].Brush); }
-        }
-
-        #endregion
-
-        #region Pens
-
-        public Pen BackgroundPen {
-            get { return (_colors[INDEX_BACKGROUND].Pen); }
-        }
-
-        public Pen CurrentLineBackPen {
-            get { return (_colors[INDEX_CURRBACK].Pen); }
-        }
-
-        public Pen CurrentLineForePen {
-            get { return (_colors[INDEX_CURRFORE].Pen); }
-        }
-
-        public Pen KeywordPen {
-            get { return (_colors[INDEX_KEYWORD].Pen); }
-        }
-
-        public Pen CommentPen {
-            get { return (_colors[INDEX_COMMENT].Pen); }
-        }
-
-        public Pen CodePen {
-            get { return (_colors[INDEX_CODE].Pen); }
-        }
-
-        public Pen StringPen {
-            get { return (_colors[INDEX_STRING].Pen); }
-        }
-
-        #endregion
-
-        class ColorMaterial
-        {
-            public Color Color;
-            public Brush Brush;
-            public Pen Pen;
-
-            public ColorMaterial(Color color)
-            {
-                this.Color = color;
-                this.Brush = new SolidBrush(color);
-                this.Pen = new Pen(color);
-
-                return;
-            }
-
-            public void Dispose()
-            {
-                this.Brush.Dispose();
-                this.Pen.Dispose();
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Encapsulates basic colors settings to format a text according a language.
+    /// </summary>
+    public class CodeRenderingContext
+    {
+        private static readonly int INDEX_CODE = 0;
+        private static readonly int INDEX_KEYWORD = 1;
+        private static readonly int INDEX_COMMENT = 2;
+        private static readonly int INDEX_STRING = 3;
+        private static readonly int INDEX_BACKGROUND = 4;
+        private static readonly int INDEX_CURRBACK = 5;
+        private static readonly int INDEX_CURRFORE = 6;
+
+        private Graphics _graphics;
+        private Font _font;
+
+        private int _currentLine;
+
+        private ColorMaterial[] _colors;
+
+        public CodeRenderingContext()
+        {
+            _colors = new ColorMaterial[] 
+            {
+                new ColorMaterial(Color.Black),        // code color
+                new ColorMaterial(Color.Blue),         // keyword color
+                new ColorMaterial(Color.Green),        // comment color
+                new ColorMaterial(Color.Red),          // string color
+
+                new ColorMaterial(Color.White),        // background
+                new ColorMaterial(Color.Red),          // current line back color
+                new ColorMaterial(Color.White),        // current line fore color                
+            };
+
+            return;
+        }
+
+        public Graphics Graphics {
+            get { return (_graphics); }
+            set { _graphics = value; }
+        }       
+
+        public Font Font {
+            get { return (_font); }
+            set { _font = value; }
+        }
+
+        public int CurrentLine {
+            get { return (_currentLine); }
+            set { _currentLine = value; }
+        }
+
+        public Color BackgroundColor {
+            get { return (_colors[INDEX_BACKGROUND].Color); }
+            set
+            {
+                _colors[INDEX_BACKGROUND].Dispose();
+                _colors[INDEX_BACKGROUND] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CurrentLineBackColor {
+            get { return (_colors[INDEX_CURRBACK].Color); }
+            set {
+                _colors[INDEX_CURRBACK].Dispose();
+                _colors[INDEX_CURRBACK] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CurrentLineForeColor {
+            get { return (_colors[INDEX_CURRFORE].Color); }
+            set {
+                _colors[INDEX_CURRFORE].Dispose();
+                _colors[INDEX_CURRFORE] = new ColorMaterial(value);
+            }
+        }
+
+        public Color KeywordColor {
+            get { return (_colors[INDEX_KEYWORD].Color); }
+            set {
+                _colors[INDEX_KEYWORD].Dispose();
+                _colors[INDEX_KEYWORD] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CommentColor {
+            get { return (_colors[INDEX_COMMENT].Color); }
+            set {
+                _colors[INDEX_COMMENT].Dispose();
+                _colors[INDEX_COMMENT] = new ColorMaterial(value);
+            }
+        }
+
+        public Color CodeColor {
+            get { return (_colors[INDEX_CODE].Color); }
+            set {
+                _colors[INDEX_CODE].Dispose();
+                _colors[INDEX_CODE] = new ColorMaterial(value);
+            }
+        }
+
+        public Color StringColor {
+            get { return (_colors[INDEX_STRING].Color); }
+            set {
+                _colors[INDEX_STRING].Dispose();
+                _colors[INDEX_STRING] = new ColorMaterial(value);
+            }
+        }
+
+        public Color this[ClassificationTag tag]
+        {
+            get
+            {
+                int idx = (int)tag;
+                return (_colors[idx].Color);
+            }
+        }    
+
+        public Brush GetBrush(ClassificationTag tag) {
+            return (_colors[(int)tag].Brush);
+        }
+      
+        public Pen GetPen(ClassificationTag tag) {
+            return (_colors[(int)tag].Pen);
+        }
+
+        #region Brushes
+
+        public Brush BackgroundBrush {
+            get { return (_colors[INDEX_BACKGROUND].Brush); }
+        }
+
+        public Brush CurrentLineBackBrush {
+            get { return (_colors[INDEX_CURRBACK].Brush); }
+        }
+
+        public Brush CurrentLineForeBrush {
+            get { return (_colors[INDEX_CURRFORE].Brush); }
+        }
+
+        public Brush KeywordBrush {
+            get { return (_colors[INDEX_KEYWORD].Brush); }
+        }
+
+        public Brush CommentBrush {
+            get { return (_colors[INDEX_COMMENT].Brush); }
+        }
+
+        public Brush CodeBrush {
+            get { return (_colors[INDEX_CODE].Brush); }
+        }
+
+        public Brush StringBrush {
+            get { return (_colors[INDEX_STRING].Brush); }
+        }
+
+        #endregion
+
+        #region Pens
+
+        public Pen BackgroundPen {
+            get { return (_colors[INDEX_BACKGROUND].Pen); }
+        }
+
+        public Pen CurrentLineBackPen {
+            get { return (_colors[INDEX_CURRBACK].Pen); }
+        }
+
+        public Pen CurrentLineForePen {
+            get { return (_colors[INDEX_CURRFORE].Pen); }
+        }
+
+        public Pen KeywordPen {
+            get { return (_colors[INDEX_KEYWORD].Pen); }
+        }
+
+        public Pen CommentPen {
+            get { return (_colors[INDEX_COMMENT].Pen); }
+        }
+
+        public Pen CodePen {
+            get { return (_colors[INDEX_CODE].Pen); }
+        }
+
+        public Pen StringPen {
+            get { return (_colors[INDEX_STRING].Pen); }
+        }
+
+        #endregion
+
+        class ColorMaterial
+        {
+            public Color Color;
+            public Brush Brush;
+            public Pen Pen;
+
+            public ColorMaterial(Color color)
+            {
+                this.Color = color;
+                this.Brush = new SolidBrush(color);
+                this.Pen = new Pen(color);
+
+                return;
+            }
+
+            public void Dispose()
+            {
+                this.Brush.Dispose();
+                this.Pen.Dispose();
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs b/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs
index 4b313ef..ede89a0 100644
--- a/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs
+++ b/src/GuiException/UiException/Controls/DefaultCodeRenderer.cs
@@ -1,199 +1,199 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-using System.Drawing;
-using System.Diagnostics;
-
-namespace NUnit.UiException.Controls
-{
-    public class DefaultCodeRenderer :
-        ICodeRenderer
-    {
-        /// <summary>
-        /// These constants below address an issue at measure text time
-        /// that sometimes can cause big lines of text to be misaligned.
-        /// </summary>
-        private readonly static float MEASURECHAR_BIG_WIDTH = 5000f;
-        private readonly static float MEASURECHAR_BIG_HEIGHT = 100f;
-
-        public PaintLineLocation[] ViewportLines(FormattedCode code, RectangleF viewport, float fontHeight)
-        {
-            List<PaintLineLocation> list = new List<PaintLineLocation>();
-            int visibles = CountVisibleLines(viewport.Height, fontHeight);
-//            int topIndex = YCoordinateToLineIndex(viewport.Top, fontHeight);
-            int lineIndex = YCoordinateToLineIndex(viewport.Top, fontHeight);
-            int i;
-
-            for (i = 0; i < visibles; ++i, lineIndex++)
-            {
-                if (lineIndex < 0)
-                    continue;
-
-                if (lineIndex >= code.LineCount)
-                    break;
-
-                list.Add(
-                    new PaintLineLocation(lineIndex, code.GetTextAt(lineIndex),
-                    new PointF(-viewport.Left,
-                        LineIndexToYCoordinate(lineIndex, fontHeight) -
-                        viewport.Top)));
-            }
-
-            return (list.ToArray());
-        }
-
-        #region ICodeRenderer Membres
-
-        public void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport)
-        {
-            UiExceptionHelper.CheckNotNull(code, "code");
-            UiExceptionHelper.CheckNotNull(args, "args");
-
-            ClassifiedTokenCollection line;
-            PaintLineLocation[] lines;
-            ClassifiedToken token;
-            float fontHeight;
-            string text;
-            float tk_width;
-            int i;
-            float x;
-
-            fontHeight = LineIndexToYCoordinate(1, args.Graphics, args.Font);
-            lines = ViewportLines(code, viewport, fontHeight);
-
-            foreach (PaintLineLocation paintLine in lines)
-            {
-                // All lines that differ from CurrentLine are displayed
-                // in using different styles of Brush to make a distinction
-                // between code, keyword, comments.
-                if (paintLine.LineIndex != args.CurrentLine)
-                {
-                    line = code[paintLine.LineIndex];
-                    x = 0;
-                    text = line.Text;
-
-                    for (i = 0; i < line.Count; ++i)
-                    {
-                        token = line[i];
-
-                        args.Graphics.DrawString(token.Text, args.Font, args.GetBrush(token.Tag),
-                            paintLine.Location.X + x, paintLine.Location.Y);
-
-                        tk_width = measureStringWidth(args.Graphics, args.Font, text,
-                            token.IndexStart, token.Text.Length);
-
-                        x += tk_width;
-                    }
-
-                    continue;
-                }
-
-                // The current line is emphasized by using a 
-                // specific couples of Background & Foreground colors
-
-                args.Graphics.FillRectangle(
-                    args.CurrentLineBackBrush,
-                    0, paintLine.Location.Y,
-                    viewport.Width, fontHeight);
-
-                args.Graphics.DrawString(
-                    paintLine.Text, args.Font,
-                    args.CurrentLineForeBrush,
-                    paintLine.Location.X, paintLine.Location.Y);
-            }
-
-            return;
-        }
-
-        public SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font)
-        {
-            UiExceptionHelper.CheckNotNull(code, "code");
-            UiExceptionHelper.CheckNotNull(g, "g");
-            UiExceptionHelper.CheckNotNull(font, "font");
-
-            StringBuilder sample;
-            SizeF measure;
-            int i;
-
-            sample = new StringBuilder();
-            for (i = code.MaxLength; i > 0; --i)
-                sample.Append("m");
-
-            measure = g.MeasureString(sample.ToString(), font);
-
-            return (new SizeF(measure.Width, measure.Height * code.LineCount));
-        }
-
-        public float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font)
-        {
-            UiExceptionHelper.CheckNotNull(g, "g");
-            UiExceptionHelper.CheckNotNull(font, "font");
-
-            SizeF sz = g.MeasureString("m", font);
-            return (lineIndex * sz.Height);
-        }
-
-        #endregion                
-
-        /// <summary>
-        /// Utility method that measures a region of text in the given string.
-        /// </summary>
-        /// <param name="g">The graphics instance used to render this text.</param>
-        /// <param name="font">The font instance used to render this text.</param>
-        /// <param name="text">The text that contains the region to be rendered.</param>
-        /// <param name="indexStart">Starting startingPosition of this region.</param>
-        /// <param name="length">Length of this region.</param>
-        /// <returns>The width of this region of text.</returns>
-        private float measureStringWidth(Graphics g, Font font, string text, int indexStart, int length)
-        {
-            CharacterRange[] ranges;
-            StringFormat sf;
-            Region[] regions;
-
-            if (length == 0)
-                return (0);
-
-            length = Math.Min(length, text.Length);
-
-            ranges = new CharacterRange[] { new CharacterRange(indexStart, length) };
-            sf = new StringFormat();
-
-            // the string of text may contains white spaces that need to
-            // be measured correctly.
-
-            sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
-
-            sf.SetMeasurableCharacterRanges(ranges);
-
-            // here : giving a layout too small can cause returned measure
-            // to be wrong.
-
-            regions = g.MeasureCharacterRanges(
-                text, font, new RectangleF(
-                    0, 0, MEASURECHAR_BIG_WIDTH, MEASURECHAR_BIG_HEIGHT), sf);
-
-            return (regions[0].GetBounds(g).Width);
-        }
-
-        int CountVisibleLines(float viewportHeight, float fontHeight)
-        {
-            return ((int)(viewportHeight / fontHeight) + 1);
-        }
-
-        int YCoordinateToLineIndex(float y, float fontHeight)
-        {
-            return (int)(y / fontHeight);
-        }
-
-        float LineIndexToYCoordinate(int index, float fontHeight)
-        {
-            return (index * fontHeight);
-        }        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+using System.Drawing;
+using System.Diagnostics;
+
+namespace NUnit.UiException.Controls
+{
+    public class DefaultCodeRenderer :
+        ICodeRenderer
+    {
+        /// <summary>
+        /// These constants below address an issue at measure text time
+        /// that sometimes can cause big lines of text to be misaligned.
+        /// </summary>
+        private readonly static float MEASURECHAR_BIG_WIDTH = 5000f;
+        private readonly static float MEASURECHAR_BIG_HEIGHT = 100f;
+
+        public PaintLineLocation[] ViewportLines(FormattedCode code, RectangleF viewport, float fontHeight)
+        {
+            List<PaintLineLocation> list = new List<PaintLineLocation>();
+            int visibles = CountVisibleLines(viewport.Height, fontHeight);
+//            int topIndex = YCoordinateToLineIndex(viewport.Top, fontHeight);
+            int lineIndex = YCoordinateToLineIndex(viewport.Top, fontHeight);
+            int i;
+
+            for (i = 0; i < visibles; ++i, lineIndex++)
+            {
+                if (lineIndex < 0)
+                    continue;
+
+                if (lineIndex >= code.LineCount)
+                    break;
+
+                list.Add(
+                    new PaintLineLocation(lineIndex, code.GetTextAt(lineIndex),
+                    new PointF(-viewport.Left,
+                        LineIndexToYCoordinate(lineIndex, fontHeight) -
+                        viewport.Top)));
+            }
+
+            return (list.ToArray());
+        }
+
+        #region ICodeRenderer Membres
+
+        public void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            ClassifiedTokenCollection line;
+            PaintLineLocation[] lines;
+            ClassifiedToken token;
+            float fontHeight;
+            string text;
+            float tk_width;
+            int i;
+            float x;
+
+            fontHeight = LineIndexToYCoordinate(1, args.Graphics, args.Font);
+            lines = ViewportLines(code, viewport, fontHeight);
+
+            foreach (PaintLineLocation paintLine in lines)
+            {
+                // All lines that differ from CurrentLine are displayed
+                // in using different styles of Brush to make a distinction
+                // between code, keyword, comments.
+                if (paintLine.LineIndex != args.CurrentLine)
+                {
+                    line = code[paintLine.LineIndex];
+                    x = 0;
+                    text = line.Text;
+
+                    for (i = 0; i < line.Count; ++i)
+                    {
+                        token = line[i];
+
+                        args.Graphics.DrawString(token.Text, args.Font, args.GetBrush(token.Tag),
+                            paintLine.Location.X + x, paintLine.Location.Y);
+
+                        tk_width = measureStringWidth(args.Graphics, args.Font, text,
+                            token.IndexStart, token.Text.Length);
+
+                        x += tk_width;
+                    }
+
+                    continue;
+                }
+
+                // The current line is emphasized by using a 
+                // specific couples of Background & Foreground colors
+
+                args.Graphics.FillRectangle(
+                    args.CurrentLineBackBrush,
+                    0, paintLine.Location.Y,
+                    viewport.Width, fontHeight);
+
+                args.Graphics.DrawString(
+                    paintLine.Text, args.Font,
+                    args.CurrentLineForeBrush,
+                    paintLine.Location.X, paintLine.Location.Y);
+            }
+
+            return;
+        }
+
+        public SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font)
+        {
+            UiExceptionHelper.CheckNotNull(code, "code");
+            UiExceptionHelper.CheckNotNull(g, "g");
+            UiExceptionHelper.CheckNotNull(font, "font");
+
+            StringBuilder sample;
+            SizeF measure;
+            int i;
+
+            sample = new StringBuilder();
+            for (i = code.MaxLength; i > 0; --i)
+                sample.Append("m");
+
+            measure = g.MeasureString(sample.ToString(), font);
+
+            return (new SizeF(measure.Width, measure.Height * code.LineCount));
+        }
+
+        public float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font)
+        {
+            UiExceptionHelper.CheckNotNull(g, "g");
+            UiExceptionHelper.CheckNotNull(font, "font");
+
+            SizeF sz = g.MeasureString("m", font);
+            return (lineIndex * sz.Height);
+        }
+
+        #endregion                
+
+        /// <summary>
+        /// Utility method that measures a region of text in the given string.
+        /// </summary>
+        /// <param name="g">The graphics instance used to render this text.</param>
+        /// <param name="font">The font instance used to render this text.</param>
+        /// <param name="text">The text that contains the region to be rendered.</param>
+        /// <param name="indexStart">Starting startingPosition of this region.</param>
+        /// <param name="length">Length of this region.</param>
+        /// <returns>The width of this region of text.</returns>
+        private float measureStringWidth(Graphics g, Font font, string text, int indexStart, int length)
+        {
+            CharacterRange[] ranges;
+            StringFormat sf;
+            Region[] regions;
+
+            if (length == 0)
+                return (0);
+
+            length = Math.Min(length, text.Length);
+
+            ranges = new CharacterRange[] { new CharacterRange(indexStart, length) };
+            sf = new StringFormat();
+
+            // the string of text may contains white spaces that need to
+            // be measured correctly.
+
+            sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
+
+            sf.SetMeasurableCharacterRanges(ranges);
+
+            // here : giving a layout too small can cause returned measure
+            // to be wrong.
+
+            regions = g.MeasureCharacterRanges(
+                text, font, new RectangleF(
+                    0, 0, MEASURECHAR_BIG_WIDTH, MEASURECHAR_BIG_HEIGHT), sf);
+
+            return (regions[0].GetBounds(g).Width);
+        }
+
+        int CountVisibleLines(float viewportHeight, float fontHeight)
+        {
+            return ((int)(viewportHeight / fontHeight) + 1);
+        }
+
+        int YCoordinateToLineIndex(float y, float fontHeight)
+        {
+            return (int)(y / fontHeight);
+        }
+
+        float LineIndexToYCoordinate(int index, float fontHeight)
+        {
+            return (index * fontHeight);
+        }        
+    }
+}
diff --git a/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs b/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs
index 3b5b8d2..a1286fb 100644
--- a/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs
+++ b/src/GuiException/UiException/Controls/DefaultErrorListRenderer.cs
@@ -1,337 +1,337 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-using NUnit.UiException.Properties;
-using System.Diagnostics;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Implements IErrorListRenderer.
-    /// </summary>
-    public class DefaultErrorListRenderer :
-        IErrorListRenderer
-    {
-        //private static readonly int ITEM_HEIGHT = 54;
-        private static readonly int TEXT_MARGIN_X = 16;
-
-        private Font _font;
-        private Font _fontUnderlined;
-        private int _itemHeight;
-        private Brush _brushBlue;
-        private Brush _brushGray;
-        private float _offsetLine;
-        
-        private Rectangle _rectListShadow;
-        private Rectangle _rectListBackground;
-        private Rectangle _rectItemGray;
-        private Rectangle _rectItemWhite;
-        private Rectangle _rectSelectionMiddle;
-        private Rectangle _rectIconDll;
-        private Rectangle _rectIconCSharp;
-        private Rectangle _rectIconArrow;
-//        private Rectangle _rectShadow;
-
-        private PaintData _paintData;
-
-        public DefaultErrorListRenderer()
-        {
-            this.Font = new Font(FontFamily.GenericSansSerif, 8.25f);
-            //_fontUnderlined = new Font(_font, FontStyle.Underline);
-            //_itemHeight = _font.Height * 4 + 6;
-
-            _brushBlue = new SolidBrush(Color.FromArgb(0, 43, 114));
-            _brushGray = new SolidBrush(Color.FromArgb(64, 64, 64));
-
-            _rectListShadow = new Rectangle(0, 0, 48, 9);
-            _rectListBackground = new Rectangle(0, 10, 48, 48);
-            _rectItemGray = new Rectangle(71, 0, 9, 54);
-            _rectItemWhite = new Rectangle(60, 0, 9, 54);
-            _rectSelectionMiddle = new Rectangle(49, 0, 9, 54);
-            _rectIconDll = new Rectangle(1, 59, 16, 15);
-            _rectIconCSharp = new Rectangle(18, 59, 14, 15);
-            _rectIconArrow = new Rectangle(35, 60, 9, 5);
-//            _rectShadow = new Rectangle(49, 60, 4, 8);
-
-            _paintData = new PaintData();
-
-            return;
-        }
-
-        public Font Font
-        {
-            get { return (_font); }
-            set 
-            { 
-                _fontUnderlined = _font = value;
-                if (_font.FontFamily.IsStyleAvailable(FontStyle.Underline))
-                    _fontUnderlined = new Font(_font, FontStyle.Underline);
-                _itemHeight = _font.Height * 4 + 6;
-            }
-        }
-
-        #region IErrorListRenderer Membres
-
-        public void DrawToGraphics(ErrorItemCollection items,
-            ErrorItem selected, Graphics g, Rectangle viewport)
-        {
-            SizeF sizeLineSource;
-            int last;
-            int i;
-
-            UiExceptionHelper.CheckNotNull(items, "items");
-            UiExceptionHelper.CheckNotNull(g, "g");
-
-            if (!_paintData.Equals(items, selected, viewport))
-            {
-                _paintData.Dispose();
-                _paintData = new PaintData(items, selected, viewport, g);
-
-                PaintBackground(Resources.ImageErrorList, _paintData.WorkingGraphics,
-                    _rectListBackground, viewport);
-
-                sizeLineSource = g.MeasureString("Line 9999", _font);
-                _offsetLine = viewport.Width - sizeLineSource.Width;
-
-                last = LastIndexVisible(items.Count, viewport);
-                for (i = FirstIndexVisible(items.Count, viewport); i <= last; ++i)
-                    DrawItem(items[i], i, selected == items[i], i == items.Count - 1, false, 
-                        _paintData.WorkingGraphics, viewport);
-
-                //_paintData.WorkingGraphics.DrawImage(Resources.ErrorList,
-                //new Rectangle(0, 0, viewport.Width, _rectShadow.Height),
-                //_rectShadow, GraphicsUnit.Pixel);
-            }
-            
-            _paintData.PaintTo(g);           
-
-            return;
-        }
-
-        public void DrawItem(ErrorItem item, int index, bool hovered, bool selected, Graphics g, Rectangle viewport)
-        {
-            DrawItem(item, index, selected, false, hovered, g, viewport);
-        }
-
-        public Size GetDocumentSize(ErrorItemCollection items, Graphics g)
-        {
-            SizeF current;
-            float w;
-
-            _paintData = new PaintData();
-
-            if (items.Count == 0)
-                return (new Size());
-
-            w = 0;
-            foreach (ErrorItem item in items)
-            {
-                current = MeasureItem(g, item);
-                w = Math.Max(w, current.Width);
-            }            
-
-            return (new Size((int)w, items.Count * _itemHeight));
-        }
-
-        public ErrorItem ItemAt(ErrorItemCollection items, Graphics g, Point point)
-        {
-            int idx = point.Y / _itemHeight;
-
-            if (items == null || point.Y < 0 || idx >= items.Count)
-                return (null);
-
-            return (items[idx]);
-        }
-
-        #endregion
-
-        protected bool IsDirty(ErrorItemCollection items, ErrorItem selection, Rectangle viewport)
-        {
-            return (!_paintData.Equals(items, selection, viewport));
-        }
-
-        protected SizeF MeasureItem(Graphics g, ErrorItem item)
-        {
-            SizeF sizeMethod;
-            SizeF sizeClass;
-            SizeF sizeFile;
-
-            UiExceptionHelper.CheckNotNull(g, "g");
-            UiExceptionHelper.CheckNotNull(item, "item");
-
-            sizeClass = g.MeasureString(item.ClassName, _font);
-            sizeMethod = g.MeasureString(item.MethodName, _font);
-            sizeFile = g.MeasureString(item.FileName, _font);
-
-            return (new SizeF(
-                Math.Max(sizeClass.Width, Math.Max(sizeMethod.Width, sizeFile.Width)) + TEXT_MARGIN_X,
-                _itemHeight));
-        }
-
-        private void DrawItem(ErrorItem item, int index, bool selected, bool last, bool hover, Graphics g, Rectangle viewport)
-        {
-            Rectangle src;
-            Font font;
-
-            int x = -viewport.X;
-            int y = _itemHeight * index - viewport.Y;
-
-            src = (index % 2 == 0) ? _rectItemWhite : _rectItemGray ;
-            font = (hover == true) ? _fontUnderlined : _font;
-
-            g.DrawImage(Resources.ImageErrorList,
-                new Rectangle(0, y, viewport.Width, _itemHeight), src,
-                GraphicsUnit.Pixel);
-
-            if (selected)
-            {
-                g.DrawImage(Resources.ImageErrorList,
-                    new Rectangle(0, y + 1, viewport.Width, _itemHeight ),
-                    _rectSelectionMiddle, GraphicsUnit.Pixel);
-            }
-
-            if (item.HasSourceAttachment)
-            {
-                g.DrawImage(Resources.ImageErrorList, new Rectangle(x + 1, y + 2 + font.Height, 14, 15),
-                   _rectIconCSharp, GraphicsUnit.Pixel);
-                g.DrawImage(Resources.ImageErrorList, 
-                    new Rectangle(TEXT_MARGIN_X - 3 + x, y + 5 + 2 * font.Height, 9, 5),
-                    _rectIconArrow, GraphicsUnit.Pixel);
-
-                g.DrawString(String.Format("Line {0}", item.LineNumber),
-                    font, _brushGray, _offsetLine, y + 2);
-                g.DrawString(item.ClassName, font, _brushBlue, x + TEXT_MARGIN_X, y + 2 + font.Height);
-                g.DrawString(item.BaseMethodName + "()", font, _brushBlue,
-                    x + TEXT_MARGIN_X + 5, y + 2 + 2 * font.Height);
-                g.DrawString(item.FileName, font, _brushGray,
-                    x + TEXT_MARGIN_X, y + 2 + 3 * _font.Height);
-            }
-            else
-            {
-                g.DrawImage(Resources.ImageErrorList, new Rectangle(x + 1, y + 2 + font.Height, 16, 15),
-                   _rectIconDll, GraphicsUnit.Pixel);
-
-                g.DrawString("N/A", font, _brushGray, _offsetLine, y + 2);
-                g.DrawString(item.ClassName, font, _brushGray, 
-                    x + TEXT_MARGIN_X, y + 2 + font.Height);
-                g.DrawString(item.BaseMethodName + "()", font, _brushGray,
-                    x + TEXT_MARGIN_X, y + 2 + 2 * font.Height);                
-            }
-
-            if (!last)
-                return;
-
-            PaintTile(Resources.ImageErrorList, g, _rectListShadow,
-                new Rectangle(0, y + _itemHeight, viewport.Width, 9));
-
-            return;
-        }
-
-        private static void PaintBackground(Image img, Graphics g, Rectangle bkg, Rectangle viewport)
-        {
-            Rectangle destTile;
-            int x;
-            int y;
-            int startY;
-            int startX;
-
-            startY = -viewport.Y % viewport.Height;
-            startX = -viewport.X % viewport.Width;
-
-            for (y = startY; y < viewport.Height; y += bkg.Height)
-                for (x = startX; x < viewport.Width; x += bkg.Width)
-                {
-                    destTile = new Rectangle(x, y, bkg.Width, bkg.Height);
-                    g.DrawImage(img, destTile, bkg, GraphicsUnit.Pixel);
-                }
-
-            return;
-        }
-
-        private static void PaintTile(Image tile, Graphics g, Rectangle src, Rectangle dst)
-        {
-            Rectangle destTile;
-            int x;
-            int y;
-
-            for (y = dst.Top; y < dst.Bottom; y += src.Height)
-                for (x = dst.Left; x < dst.Right; x += src.Width)
-                {
-                    destTile = new Rectangle(x, y, src.Width, src.Height);
-                    g.DrawImage(tile, destTile, src, GraphicsUnit.Pixel);
-                }
-
-            return;
-        }
-
-        private int FirstIndexVisible(int count, Rectangle viewport)
-        {
-            return (Math.Max(0, viewport.Y / _itemHeight));
-        }
-
-        private int LastIndexVisible(int count, Rectangle viewport)
-        {
-            return (Math.Min(count - 1,
-                FirstIndexVisible(count, viewport) + 1 + viewport.Height / _itemHeight));
-        }
-
-        class PaintData
-        {
-            public Graphics WorkingGraphics;
-
-            private ErrorItem _firstItem;
-            private ErrorItem selection;
-            private Rectangle viewport;
-            private Image _workingImage;
-
-            public PaintData() { }
-
-            public PaintData(ErrorItemCollection items, ErrorItem item, Rectangle rectangle, Graphics g)
-            {
-                if (item == null)
-                    item = new ErrorItem();
-                selection = item;
-
-                _firstItem = ((items.Count > 0) ? items[0] : null);
-
-                viewport = rectangle;
-
-                _workingImage = new Bitmap(rectangle.Width, rectangle.Height, g);
-                WorkingGraphics = Graphics.FromImage(_workingImage);
-
-                return;
-            }
-
-            public void Dispose()
-            {
-                if (_workingImage != null)
-                {
-                    _workingImage.Dispose();
-                    WorkingGraphics.Dispose();
-                }
-
-                return;
-            }
-
-            public void PaintTo(Graphics g)
-            {
-                g.DrawImage(_workingImage, 0, 0);
-            }
-
-            public bool Equals(ErrorItemCollection items, ErrorItem item, Rectangle rectangle)
-            {               
-                ErrorItem first = ((items.Count > 0) ? items[0] : null);
-
-                return (viewport.Equals(rectangle) &&
-                        object.ReferenceEquals(item, selection) &&
-                        object.ReferenceEquals(first, _firstItem));
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using NUnit.UiException.Properties;
+using System.Diagnostics;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements IErrorListRenderer.
+    /// </summary>
+    public class DefaultErrorListRenderer :
+        IErrorListRenderer
+    {
+        //private static readonly int ITEM_HEIGHT = 54;
+        private static readonly int TEXT_MARGIN_X = 16;
+
+        private Font _font;
+        private Font _fontUnderlined;
+        private int _itemHeight;
+        private Brush _brushBlue;
+        private Brush _brushGray;
+        private float _offsetLine;
+        
+        private Rectangle _rectListShadow;
+        private Rectangle _rectListBackground;
+        private Rectangle _rectItemGray;
+        private Rectangle _rectItemWhite;
+        private Rectangle _rectSelectionMiddle;
+        private Rectangle _rectIconDll;
+        private Rectangle _rectIconCSharp;
+        private Rectangle _rectIconArrow;
+//        private Rectangle _rectShadow;
+
+        private PaintData _paintData;
+
+        public DefaultErrorListRenderer()
+        {
+            this.Font = new Font(FontFamily.GenericSansSerif, 8.25f);
+            //_fontUnderlined = new Font(_font, FontStyle.Underline);
+            //_itemHeight = _font.Height * 4 + 6;
+
+            _brushBlue = new SolidBrush(Color.FromArgb(0, 43, 114));
+            _brushGray = new SolidBrush(Color.FromArgb(64, 64, 64));
+
+            _rectListShadow = new Rectangle(0, 0, 48, 9);
+            _rectListBackground = new Rectangle(0, 10, 48, 48);
+            _rectItemGray = new Rectangle(71, 0, 9, 54);
+            _rectItemWhite = new Rectangle(60, 0, 9, 54);
+            _rectSelectionMiddle = new Rectangle(49, 0, 9, 54);
+            _rectIconDll = new Rectangle(1, 59, 16, 15);
+            _rectIconCSharp = new Rectangle(18, 59, 14, 15);
+            _rectIconArrow = new Rectangle(35, 60, 9, 5);
+//            _rectShadow = new Rectangle(49, 60, 4, 8);
+
+            _paintData = new PaintData();
+
+            return;
+        }
+
+        public Font Font
+        {
+            get { return (_font); }
+            set 
+            { 
+                _fontUnderlined = _font = value;
+                if (_font.FontFamily.IsStyleAvailable(FontStyle.Underline))
+                    _fontUnderlined = new Font(_font, FontStyle.Underline);
+                _itemHeight = _font.Height * 4 + 6;
+            }
+        }
+
+        #region IErrorListRenderer Membres
+
+        public void DrawToGraphics(ErrorItemCollection items,
+            ErrorItem selected, Graphics g, Rectangle viewport)
+        {
+            SizeF sizeLineSource;
+            int last;
+            int i;
+
+            UiExceptionHelper.CheckNotNull(items, "items");
+            UiExceptionHelper.CheckNotNull(g, "g");
+
+            if (!_paintData.Equals(items, selected, viewport))
+            {
+                _paintData.Dispose();
+                _paintData = new PaintData(items, selected, viewport, g);
+
+                PaintBackground(Resources.ImageErrorList, _paintData.WorkingGraphics,
+                    _rectListBackground, viewport);
+
+                sizeLineSource = g.MeasureString("Line 9999", _font);
+                _offsetLine = viewport.Width - sizeLineSource.Width;
+
+                last = LastIndexVisible(items.Count, viewport);
+                for (i = FirstIndexVisible(items.Count, viewport); i <= last; ++i)
+                    DrawItem(items[i], i, selected == items[i], i == items.Count - 1, false, 
+                        _paintData.WorkingGraphics, viewport);
+
+                //_paintData.WorkingGraphics.DrawImage(Resources.ErrorList,
+                //new Rectangle(0, 0, viewport.Width, _rectShadow.Height),
+                //_rectShadow, GraphicsUnit.Pixel);
+            }
+            
+            _paintData.PaintTo(g);           
+
+            return;
+        }
+
+        public void DrawItem(ErrorItem item, int index, bool hovered, bool selected, Graphics g, Rectangle viewport)
+        {
+            DrawItem(item, index, selected, false, hovered, g, viewport);
+        }
+
+        public Size GetDocumentSize(ErrorItemCollection items, Graphics g)
+        {
+            SizeF current;
+            float w;
+
+            _paintData = new PaintData();
+
+            if (items.Count == 0)
+                return (new Size());
+
+            w = 0;
+            foreach (ErrorItem item in items)
+            {
+                current = MeasureItem(g, item);
+                w = Math.Max(w, current.Width);
+            }            
+
+            return (new Size((int)w, items.Count * _itemHeight));
+        }
+
+        public ErrorItem ItemAt(ErrorItemCollection items, Graphics g, Point point)
+        {
+            int idx = point.Y / _itemHeight;
+
+            if (items == null || point.Y < 0 || idx >= items.Count)
+                return (null);
+
+            return (items[idx]);
+        }
+
+        #endregion
+
+        protected bool IsDirty(ErrorItemCollection items, ErrorItem selection, Rectangle viewport)
+        {
+            return (!_paintData.Equals(items, selection, viewport));
+        }
+
+        protected SizeF MeasureItem(Graphics g, ErrorItem item)
+        {
+            SizeF sizeMethod;
+            SizeF sizeClass;
+            SizeF sizeFile;
+
+            UiExceptionHelper.CheckNotNull(g, "g");
+            UiExceptionHelper.CheckNotNull(item, "item");
+
+            sizeClass = g.MeasureString(item.ClassName, _font);
+            sizeMethod = g.MeasureString(item.MethodName, _font);
+            sizeFile = g.MeasureString(item.FileName, _font);
+
+            return (new SizeF(
+                Math.Max(sizeClass.Width, Math.Max(sizeMethod.Width, sizeFile.Width)) + TEXT_MARGIN_X,
+                _itemHeight));
+        }
+
+        private void DrawItem(ErrorItem item, int index, bool selected, bool last, bool hover, Graphics g, Rectangle viewport)
+        {
+            Rectangle src;
+            Font font;
+
+            int x = -viewport.X;
+            int y = _itemHeight * index - viewport.Y;
+
+            src = (index % 2 == 0) ? _rectItemWhite : _rectItemGray ;
+            font = (hover == true) ? _fontUnderlined : _font;
+
+            g.DrawImage(Resources.ImageErrorList,
+                new Rectangle(0, y, viewport.Width, _itemHeight), src,
+                GraphicsUnit.Pixel);
+
+            if (selected)
+            {
+                g.DrawImage(Resources.ImageErrorList,
+                    new Rectangle(0, y + 1, viewport.Width, _itemHeight ),
+                    _rectSelectionMiddle, GraphicsUnit.Pixel);
+            }
+
+            if (item.HasSourceAttachment)
+            {
+                g.DrawImage(Resources.ImageErrorList, new Rectangle(x + 1, y + 2 + font.Height, 14, 15),
+                   _rectIconCSharp, GraphicsUnit.Pixel);
+                g.DrawImage(Resources.ImageErrorList, 
+                    new Rectangle(TEXT_MARGIN_X - 3 + x, y + 5 + 2 * font.Height, 9, 5),
+                    _rectIconArrow, GraphicsUnit.Pixel);
+
+                g.DrawString(String.Format("Line {0}", item.LineNumber),
+                    font, _brushGray, _offsetLine, y + 2);
+                g.DrawString(item.ClassName, font, _brushBlue, x + TEXT_MARGIN_X, y + 2 + font.Height);
+                g.DrawString(item.BaseMethodName + "()", font, _brushBlue,
+                    x + TEXT_MARGIN_X + 5, y + 2 + 2 * font.Height);
+                g.DrawString(item.FileName, font, _brushGray,
+                    x + TEXT_MARGIN_X, y + 2 + 3 * _font.Height);
+            }
+            else
+            {
+                g.DrawImage(Resources.ImageErrorList, new Rectangle(x + 1, y + 2 + font.Height, 16, 15),
+                   _rectIconDll, GraphicsUnit.Pixel);
+
+                g.DrawString("N/A", font, _brushGray, _offsetLine, y + 2);
+                g.DrawString(item.ClassName, font, _brushGray, 
+                    x + TEXT_MARGIN_X, y + 2 + font.Height);
+                g.DrawString(item.BaseMethodName + "()", font, _brushGray,
+                    x + TEXT_MARGIN_X, y + 2 + 2 * font.Height);                
+            }
+
+            if (!last)
+                return;
+
+            PaintTile(Resources.ImageErrorList, g, _rectListShadow,
+                new Rectangle(0, y + _itemHeight, viewport.Width, 9));
+
+            return;
+        }
+
+        private static void PaintBackground(Image img, Graphics g, Rectangle bkg, Rectangle viewport)
+        {
+            Rectangle destTile;
+            int x;
+            int y;
+            int startY;
+            int startX;
+
+            startY = -viewport.Y % viewport.Height;
+            startX = -viewport.X % viewport.Width;
+
+            for (y = startY; y < viewport.Height; y += bkg.Height)
+                for (x = startX; x < viewport.Width; x += bkg.Width)
+                {
+                    destTile = new Rectangle(x, y, bkg.Width, bkg.Height);
+                    g.DrawImage(img, destTile, bkg, GraphicsUnit.Pixel);
+                }
+
+            return;
+        }
+
+        private static void PaintTile(Image tile, Graphics g, Rectangle src, Rectangle dst)
+        {
+            Rectangle destTile;
+            int x;
+            int y;
+
+            for (y = dst.Top; y < dst.Bottom; y += src.Height)
+                for (x = dst.Left; x < dst.Right; x += src.Width)
+                {
+                    destTile = new Rectangle(x, y, src.Width, src.Height);
+                    g.DrawImage(tile, destTile, src, GraphicsUnit.Pixel);
+                }
+
+            return;
+        }
+
+        private int FirstIndexVisible(int count, Rectangle viewport)
+        {
+            return (Math.Max(0, viewport.Y / _itemHeight));
+        }
+
+        private int LastIndexVisible(int count, Rectangle viewport)
+        {
+            return (Math.Min(count - 1,
+                FirstIndexVisible(count, viewport) + 1 + viewport.Height / _itemHeight));
+        }
+
+        class PaintData
+        {
+            public Graphics WorkingGraphics;
+
+            private ErrorItem _firstItem;
+            private ErrorItem selection;
+            private Rectangle viewport;
+            private Image _workingImage;
+
+            public PaintData() { }
+
+            public PaintData(ErrorItemCollection items, ErrorItem item, Rectangle rectangle, Graphics g)
+            {
+                if (item == null)
+                    item = new ErrorItem();
+                selection = item;
+
+                _firstItem = ((items.Count > 0) ? items[0] : null);
+
+                viewport = rectangle;
+
+                _workingImage = new Bitmap(rectangle.Width, rectangle.Height, g);
+                WorkingGraphics = Graphics.FromImage(_workingImage);
+
+                return;
+            }
+
+            public void Dispose()
+            {
+                if (_workingImage != null)
+                {
+                    _workingImage.Dispose();
+                    WorkingGraphics.Dispose();
+                }
+
+                return;
+            }
+
+            public void PaintTo(Graphics g)
+            {
+                g.DrawImage(_workingImage, 0, 0);
+            }
+
+            public bool Equals(ErrorItemCollection items, ErrorItem item, Rectangle rectangle)
+            {               
+                ErrorItem first = ((items.Count > 0) ? items[0] : null);
+
+                return (viewport.Equals(rectangle) &&
+                        object.ReferenceEquals(item, selection) &&
+                        object.ReferenceEquals(first, _firstItem));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorBrowser.cs b/src/GuiException/UiException/Controls/ErrorBrowser.cs
index d9829be..824b99c 100644
--- a/src/GuiException/UiException/Controls/ErrorBrowser.cs
+++ b/src/GuiException/UiException/Controls/ErrorBrowser.cs
@@ -1,158 +1,158 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// A control that encapsulates a collection of IErrorDisplay instances
-    /// and which shows relevant information about failures & errors after
-    /// a test suite run.
-    ///     By default, ErrorBrowser is empty and should be populated with
-    /// IErrorDisplay instances at loading time. The example below shows how
-    /// to achieve this:
-    /// <code>
-    /// ErrorBrowser errorBrowser = new ErrorBrowser();
-    /// 
-    /// // configure and register a SourceCodeDisplay
-    /// // that will display source code context on failure
-    /// 
-    /// SourceCodeDisplay sourceCode = new SourceCodeDisplay();
-    /// sourceCode.AutoSelectFirstItem = true;
-    /// sourceCode.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
-    /// sourceCode.SplitOrientation = Orientation.Vertical;
-    /// sourceCode.SplitterDistance = 0.3f;
-    ///
-    /// errorBrowser.RegisterDisplay(sourceCode);
-    /// 
-    /// // configure and register a StackTraceDisplay
-    /// // that will display the stack trace details on failure
-    /// 
-    /// errorBrowser.RegisterDisplay(new StackTraceDisplay());
-    /// [...]
-    /// // set the stack trace information
-    /// errorBrowser.StackTraceSource = [a stack trace here]
-    /// </code>
-    /// </summary>
-    public class ErrorBrowser : UserControl
-    {
-        public event EventHandler StackTraceSourceChanged;
-        public event EventHandler StackTraceDisplayChanged;
-        private ErrorPanelLayout _layout;
-
-        private string _stackStace;
-
-        /// <summary>
-        /// Builds a new instance of ErrorBrowser.
-        /// </summary>
-        public ErrorBrowser()
-        {            
-            _layout = new ErrorPanelLayout();
-            _layout.Toolbar = new ErrorToolbar();            
-            Toolbar.SelectedRendererChanged += new EventHandler(Toolbar_SelectedRendererChanged);
-
-            Controls.Add(_layout);
-            _layout.Left = 0;
-            _layout.Top = 0;
-            _layout.Width = Width;
-            _layout.Height = Height;
-
-            _layout.Anchor = AnchorStyles.Top |
-                             AnchorStyles.Left |
-                             AnchorStyles.Bottom |
-                             AnchorStyles.Right;
-
-            return;
-        }        
-
-        /// <summary>
-        /// Use this property to get or set the new stack trace details.
-        /// The changes are repercuted on the registered displays.
-        /// </summary>
-        public string StackTraceSource
-        {
-            get { return (_stackStace); }
-            set {
-                if (_stackStace == value)
-                    return;
-
-                _stackStace = value;
-
-                foreach (IErrorDisplay item in Toolbar)
-                    item.OnStackTraceChanged(value);
-
-                if (StackTraceSourceChanged != null)
-                    StackTraceSourceChanged(this, new EventArgs());
-
-                return;
-            }
-        }
-
-        /// <summary>
-        /// Gets the selected display.
-        /// </summary>
-        public IErrorDisplay SelectedDisplay
-        {
-            get { return (Toolbar.SelectedDisplay); }
-            set { Toolbar.SelectedDisplay = value; }
-        }
-
-        /// <summary>
-        /// Populates ErrorBrowser with the new display passed in parameter.
-        /// If ErrorBrowser is empty, the display becomes automatically the
-        /// new selected display.
-        /// </summary>
-        /// <param name="display"></param>
-        public void RegisterDisplay(IErrorDisplay display)
-        {
-            UiExceptionHelper.CheckNotNull(display, "display");
-
-            Toolbar.Register(display);
-            display.OnStackTraceChanged(_stackStace);
-
-            if (Toolbar.SelectedDisplay == null)
-                Toolbar.SelectedDisplay = display;
-
-            return;
-        }
-
-        /// <summary>
-        /// Removes all display from ErrorBrowser.
-        /// </summary>
-        public void ClearAll()
-        {
-            Toolbar.Clear();
-
-            LayoutPanel.Option = null;
-            LayoutPanel.Content = null;
-
-            return;
-        }
-
-        void Toolbar_SelectedRendererChanged(object sender, EventArgs e)
-        {
-            LayoutPanel.Content = Toolbar.SelectedDisplay.Content;
-
-            if (StackTraceDisplayChanged != null)
-                StackTraceDisplayChanged(this, EventArgs.Empty);
-
-            return;
-        }
-
-        protected ErrorPanelLayout LayoutPanel
-        {
-            get { return (_layout); }
-        }
-
-        protected ErrorToolbar Toolbar
-        {
-            get { return ((ErrorToolbar)_layout.Toolbar); }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// A control that encapsulates a collection of IErrorDisplay instances
+    /// and which shows relevant information about failures & errors after
+    /// a test suite run.
+    ///     By default, ErrorBrowser is empty and should be populated with
+    /// IErrorDisplay instances at loading time. The example below shows how
+    /// to achieve this:
+    /// <code>
+    /// ErrorBrowser errorBrowser = new ErrorBrowser();
+    /// 
+    /// // configure and register a SourceCodeDisplay
+    /// // that will display source code context on failure
+    /// 
+    /// SourceCodeDisplay sourceCode = new SourceCodeDisplay();
+    /// sourceCode.AutoSelectFirstItem = true;
+    /// sourceCode.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+    /// sourceCode.SplitOrientation = Orientation.Vertical;
+    /// sourceCode.SplitterDistance = 0.3f;
+    ///
+    /// errorBrowser.RegisterDisplay(sourceCode);
+    /// 
+    /// // configure and register a StackTraceDisplay
+    /// // that will display the stack trace details on failure
+    /// 
+    /// errorBrowser.RegisterDisplay(new StackTraceDisplay());
+    /// [...]
+    /// // set the stack trace information
+    /// errorBrowser.StackTraceSource = [a stack trace here]
+    /// </code>
+    /// </summary>
+    public class ErrorBrowser : UserControl
+    {
+        public event EventHandler StackTraceSourceChanged;
+        public event EventHandler StackTraceDisplayChanged;
+        private ErrorPanelLayout _layout;
+
+        private string _stackStace;
+
+        /// <summary>
+        /// Builds a new instance of ErrorBrowser.
+        /// </summary>
+        public ErrorBrowser()
+        {            
+            _layout = new ErrorPanelLayout();
+            _layout.Toolbar = new ErrorToolbar();            
+            Toolbar.SelectedRendererChanged += new EventHandler(Toolbar_SelectedRendererChanged);
+
+            Controls.Add(_layout);
+            _layout.Left = 0;
+            _layout.Top = 0;
+            _layout.Width = Width;
+            _layout.Height = Height;
+
+            _layout.Anchor = AnchorStyles.Top |
+                             AnchorStyles.Left |
+                             AnchorStyles.Bottom |
+                             AnchorStyles.Right;
+
+            return;
+        }        
+
+        /// <summary>
+        /// Use this property to get or set the new stack trace details.
+        /// The changes are repercuted on the registered displays.
+        /// </summary>
+        public string StackTraceSource
+        {
+            get { return (_stackStace); }
+            set {
+                if (_stackStace == value)
+                    return;
+
+                _stackStace = value;
+
+                foreach (IErrorDisplay item in Toolbar)
+                    item.OnStackTraceChanged(value);
+
+                if (StackTraceSourceChanged != null)
+                    StackTraceSourceChanged(this, new EventArgs());
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Gets the selected display.
+        /// </summary>
+        public IErrorDisplay SelectedDisplay
+        {
+            get { return (Toolbar.SelectedDisplay); }
+            set { Toolbar.SelectedDisplay = value; }
+        }
+
+        /// <summary>
+        /// Populates ErrorBrowser with the new display passed in parameter.
+        /// If ErrorBrowser is empty, the display becomes automatically the
+        /// new selected display.
+        /// </summary>
+        /// <param name="display"></param>
+        public void RegisterDisplay(IErrorDisplay display)
+        {
+            UiExceptionHelper.CheckNotNull(display, "display");
+
+            Toolbar.Register(display);
+            display.OnStackTraceChanged(_stackStace);
+
+            if (Toolbar.SelectedDisplay == null)
+                Toolbar.SelectedDisplay = display;
+
+            return;
+        }
+
+        /// <summary>
+        /// Removes all display from ErrorBrowser.
+        /// </summary>
+        public void ClearAll()
+        {
+            Toolbar.Clear();
+
+            LayoutPanel.Option = null;
+            LayoutPanel.Content = null;
+
+            return;
+        }
+
+        void Toolbar_SelectedRendererChanged(object sender, EventArgs e)
+        {
+            LayoutPanel.Content = Toolbar.SelectedDisplay.Content;
+
+            if (StackTraceDisplayChanged != null)
+                StackTraceDisplayChanged(this, EventArgs.Empty);
+
+            return;
+        }
+
+        protected ErrorPanelLayout LayoutPanel
+        {
+            get { return (_layout); }
+        }
+
+        protected ErrorToolbar Toolbar
+        {
+            get { return ((ErrorToolbar)_layout.Toolbar); }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorList.cs b/src/GuiException/UiException/Controls/ErrorList.cs
index 2a16221..2af9435 100644
--- a/src/GuiException/UiException/Controls/ErrorList.cs
+++ b/src/GuiException/UiException/Controls/ErrorList.cs
@@ -1,263 +1,263 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Drawing;
-using System.Diagnostics;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Displays a control which implements IStackTraceView.
-    /// </summary>
-    public class ErrorList :
-        UserControl,
-        IStackTraceView
-    {
-        public event EventHandler SelectedItemChanged;
-
-        private ErrorListOrderPolicy _listOrder;
-        private ErrorItemCollection _items;
-        private ErrorItem _selection;
-        private string _stackTrace;
-        protected IErrorListRenderer _renderer;
-        protected Graphics _workingGraphics;
-        protected int _hoveredIndex;
-
-        private Point _mouse;
-        private bool _autoSelectFirstItem;
-
-        /// <summary>
-        /// Builds a new instance of ErrorList.
-        /// </summary>
-        public ErrorList() :
-            this(new DefaultErrorListRenderer())
-        {
-        }
-
-        /// <summary>
-        /// Gives access to the item collection.
-        /// </summary>
-        public ErrorItemCollection Items
-        {
-            get { return (_items); }
-        }
-
-        #region IStackTraceView Members
-
-        public bool AutoSelectFirstItem
-        {
-            get { return (_autoSelectFirstItem); }
-            set { _autoSelectFirstItem = value; }
-        }
-
-        public string StackTrace
-        {
-            get { return (_stackTrace); }
-            set
-            {
-                ErrorItem candidate;
-
-                candidate = PopulateList(value);
-
-                if (!String.IsNullOrEmpty(value) &&
-                    _items.Count == 0)
-                    _items.Add(new ErrorItem(null, "Fail to parse stack trace", -1));
-
-                AutoScrollMinSize = _renderer.GetDocumentSize(_items, _workingGraphics);
-
-                _hoveredIndex = -1;
-                SelectedItem = (AutoSelectFirstItem ? candidate : null);
-                Invalidate();
-
-                return;
-            }
-        }
-
-        public ErrorItem SelectedItem
-        {
-            get { return (_selection); }
-            set
-            {
-                bool fireEvent;
-
-                if (value != null &&
-                    (!_items.Contains(value) || !value.HasSourceAttachment))
-                    return;
-
-                fireEvent = (_selection != value);
-                _selection = value;
-
-                if (fireEvent && SelectedItemChanged != null)
-                    SelectedItemChanged(this, new EventArgs());
-
-                Invalidate();
-            }
-        }
-
-        public ErrorListOrderPolicy ListOrderPolicy
-        {
-            get { return (_listOrder); }
-            set
-            {
-                if (_listOrder == value)
-                    return;
-                _listOrder = value;
-                _items.Reverse();
-                Invalidate();
-            }
-        }
-
-        #endregion
-
-        protected ErrorList(IErrorListRenderer renderer)
-        {
-            UiExceptionHelper.CheckNotNull(renderer, "display");
-
-            SetStyle(ControlStyles.UserPaint, true);
-            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
-            DoubleBuffered = true;
-
-            _renderer = renderer;
-            _items = new ErrorItemCollection();
-            _stackTrace = null;
-            _selection = null;
-            _workingGraphics = CreateGraphics();
-            _hoveredIndex = -1;
-
-            _autoSelectFirstItem = false;
-            _listOrder = ErrorListOrderPolicy.InitialOrder;
-
-            return;
-        }
-
-        protected virtual void ItemEntered(int index)
-        {
-            Cursor = Cursors.Hand;
-        }
-
-        protected virtual void ItemLeaved(int index)
-        {
-            Cursor = Cursors.Default;
-        }
-
-        protected override void OnPaint(PaintEventArgs e)
-        {
-            Rectangle viewport;
-
-            base.OnPaint(e);
-
-            viewport = new Rectangle(-AutoScrollPosition.X, -AutoScrollPosition.Y, 
-                ClientRectangle.Width, ClientRectangle.Height);
-            _renderer.DrawToGraphics(_items, _selection, e.Graphics, viewport);
-
-            if (_hoveredIndex != -1)
-                _renderer.DrawItem(_items[_hoveredIndex], _hoveredIndex, true,
-                    _items[_hoveredIndex] == _selection, e.Graphics, viewport);
-
-            return;
-        }
-
-        protected override void OnMouseHover(EventArgs e)
-        {
-            base.OnMouseHover(e);
-            Focus();
-        }
-       
-        protected override void OnMouseDown(MouseEventArgs e)
-        {
-            base.OnMouseDown(e);
-            _mouse = new Point(e.X, e.Y - AutoScrollPosition.Y);
-        }
-
-        protected override void OnMouseMove(MouseEventArgs e)
-        {
-            ErrorItem item;
-            int itemIndex;
-
-            base.OnMouseMove(e);
-
-            item = _renderer.ItemAt(_items, _workingGraphics, new Point(e.X, e.Y - AutoScrollPosition.Y));
-
-            itemIndex = -1;
-            for (int i = 0; i < _items.Count; ++i)
-                if (Object.ReferenceEquals(_items[i], item))
-                {
-                    itemIndex = i;
-                    break;
-                }            
-
-            if (itemIndex != _hoveredIndex)
-            {
-                if (_hoveredIndex != -1)
-                    ItemLeaved(_hoveredIndex);
-
-                if (itemIndex != -1 && _items[itemIndex].HasSourceAttachment)
-                {
-                    ItemEntered(itemIndex);
-                    _hoveredIndex = itemIndex;
-                }
-                else
-                    _hoveredIndex = -1;
-                Invalidate();
-            }
-
-            return;
-        }
-
-        protected override void OnClick(EventArgs e)
-        {
-            base.OnClick(e);
-            OnClick(_mouse);
-
-            return;
-        }
-
-        protected override void OnFontChanged(EventArgs e)
-        {
-            this._renderer.Font = this.Font;
-
-            base.OnFontChanged(e);
-        }
-
-        protected void OnClick(Point point)
-        {
-            SelectedItem = _renderer.ItemAt(_items, _workingGraphics, point);
-
-            return;
-        }
-
-        protected override void OnSizeChanged(EventArgs e)
-        {
-            base.OnSizeChanged(e);
-            Invalidate();
-        }
-
-        private ErrorItem PopulateList(string stackTrace)
-        {
-            StackTraceParser parser = new StackTraceParser();
-            ErrorItem candidate;
-
-            _stackTrace = stackTrace;
-            parser.Parse(stackTrace);
-            if (_listOrder == ErrorListOrderPolicy.ReverseOrder)
-                parser.Items.Reverse();
-
-            candidate = null;
-            _items.Clear();
-            foreach (ErrorItem item in parser.Items)
-            {
-                if (candidate == null && item.HasSourceAttachment)
-                    candidate = item;
-                _items.Add(item);
-            }
-
-            return (candidate);
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Diagnostics;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Displays a control which implements IStackTraceView.
+    /// </summary>
+    public class ErrorList :
+        UserControl,
+        IStackTraceView
+    {
+        public event EventHandler SelectedItemChanged;
+
+        private ErrorListOrderPolicy _listOrder;
+        private ErrorItemCollection _items;
+        private ErrorItem _selection;
+        private string _stackTrace;
+        protected IErrorListRenderer _renderer;
+        protected Graphics _workingGraphics;
+        protected int _hoveredIndex;
+
+        private Point _mouse;
+        private bool _autoSelectFirstItem;
+
+        /// <summary>
+        /// Builds a new instance of ErrorList.
+        /// </summary>
+        public ErrorList() :
+            this(new DefaultErrorListRenderer())
+        {
+        }
+
+        /// <summary>
+        /// Gives access to the item collection.
+        /// </summary>
+        public ErrorItemCollection Items
+        {
+            get { return (_items); }
+        }
+
+        #region IStackTraceView Members
+
+        public bool AutoSelectFirstItem
+        {
+            get { return (_autoSelectFirstItem); }
+            set { _autoSelectFirstItem = value; }
+        }
+
+        public string StackTrace
+        {
+            get { return (_stackTrace); }
+            set
+            {
+                ErrorItem candidate;
+
+                candidate = PopulateList(value);
+
+                if (!String.IsNullOrEmpty(value) &&
+                    _items.Count == 0)
+                    _items.Add(new ErrorItem(null, "Fail to parse stack trace", -1));
+
+                AutoScrollMinSize = _renderer.GetDocumentSize(_items, _workingGraphics);
+
+                _hoveredIndex = -1;
+                SelectedItem = (AutoSelectFirstItem ? candidate : null);
+                Invalidate();
+
+                return;
+            }
+        }
+
+        public ErrorItem SelectedItem
+        {
+            get { return (_selection); }
+            set
+            {
+                bool fireEvent;
+
+                if (value != null &&
+                    (!_items.Contains(value) || !value.HasSourceAttachment))
+                    return;
+
+                fireEvent = (_selection != value);
+                _selection = value;
+
+                if (fireEvent && SelectedItemChanged != null)
+                    SelectedItemChanged(this, new EventArgs());
+
+                Invalidate();
+            }
+        }
+
+        public ErrorListOrderPolicy ListOrderPolicy
+        {
+            get { return (_listOrder); }
+            set
+            {
+                if (_listOrder == value)
+                    return;
+                _listOrder = value;
+                _items.Reverse();
+                Invalidate();
+            }
+        }
+
+        #endregion
+
+        protected ErrorList(IErrorListRenderer renderer)
+        {
+            UiExceptionHelper.CheckNotNull(renderer, "display");
+
+            SetStyle(ControlStyles.UserPaint, true);
+            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            DoubleBuffered = true;
+
+            _renderer = renderer;
+            _items = new ErrorItemCollection();
+            _stackTrace = null;
+            _selection = null;
+            _workingGraphics = CreateGraphics();
+            _hoveredIndex = -1;
+
+            _autoSelectFirstItem = false;
+            _listOrder = ErrorListOrderPolicy.InitialOrder;
+
+            return;
+        }
+
+        protected virtual void ItemEntered(int index)
+        {
+            Cursor = Cursors.Hand;
+        }
+
+        protected virtual void ItemLeaved(int index)
+        {
+            Cursor = Cursors.Default;
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            Rectangle viewport;
+
+            base.OnPaint(e);
+
+            viewport = new Rectangle(-AutoScrollPosition.X, -AutoScrollPosition.Y, 
+                ClientRectangle.Width, ClientRectangle.Height);
+            _renderer.DrawToGraphics(_items, _selection, e.Graphics, viewport);
+
+            if (_hoveredIndex != -1)
+                _renderer.DrawItem(_items[_hoveredIndex], _hoveredIndex, true,
+                    _items[_hoveredIndex] == _selection, e.Graphics, viewport);
+
+            return;
+        }
+
+        protected override void OnMouseHover(EventArgs e)
+        {
+            base.OnMouseHover(e);
+            Focus();
+        }
+       
+        protected override void OnMouseDown(MouseEventArgs e)
+        {
+            base.OnMouseDown(e);
+            _mouse = new Point(e.X, e.Y - AutoScrollPosition.Y);
+        }
+
+        protected override void OnMouseMove(MouseEventArgs e)
+        {
+            ErrorItem item;
+            int itemIndex;
+
+            base.OnMouseMove(e);
+
+            item = _renderer.ItemAt(_items, _workingGraphics, new Point(e.X, e.Y - AutoScrollPosition.Y));
+
+            itemIndex = -1;
+            for (int i = 0; i < _items.Count; ++i)
+                if (Object.ReferenceEquals(_items[i], item))
+                {
+                    itemIndex = i;
+                    break;
+                }            
+
+            if (itemIndex != _hoveredIndex)
+            {
+                if (_hoveredIndex != -1)
+                    ItemLeaved(_hoveredIndex);
+
+                if (itemIndex != -1 && _items[itemIndex].HasSourceAttachment)
+                {
+                    ItemEntered(itemIndex);
+                    _hoveredIndex = itemIndex;
+                }
+                else
+                    _hoveredIndex = -1;
+                Invalidate();
+            }
+
+            return;
+        }
+
+        protected override void OnClick(EventArgs e)
+        {
+            base.OnClick(e);
+            OnClick(_mouse);
+
+            return;
+        }
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            this._renderer.Font = this.Font;
+
+            base.OnFontChanged(e);
+        }
+
+        protected void OnClick(Point point)
+        {
+            SelectedItem = _renderer.ItemAt(_items, _workingGraphics, point);
+
+            return;
+        }
+
+        protected override void OnSizeChanged(EventArgs e)
+        {
+            base.OnSizeChanged(e);
+            Invalidate();
+        }
+
+        private ErrorItem PopulateList(string stackTrace)
+        {
+            StackTraceParser parser = new StackTraceParser();
+            ErrorItem candidate;
+
+            _stackTrace = stackTrace;
+            parser.Parse(stackTrace);
+            if (_listOrder == ErrorListOrderPolicy.ReverseOrder)
+                parser.Items.Reverse();
+
+            candidate = null;
+            _items.Clear();
+            foreach (ErrorItem item in parser.Items)
+            {
+                if (candidate == null && item.HasSourceAttachment)
+                    candidate = item;
+                _items.Add(item);
+            }
+
+            return (candidate);
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorPanelLayout.cs b/src/GuiException/UiException/Controls/ErrorPanelLayout.cs
index 091636e..ff4e0f9 100644
--- a/src/GuiException/UiException/Controls/ErrorPanelLayout.cs
+++ b/src/GuiException/UiException/Controls/ErrorPanelLayout.cs
@@ -1,222 +1,222 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Drawing;
-using NUnit.UiException.Properties;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Provides the panels and layout of ErrorBrowser as
-    /// shown below:
-    /// 
-    /// +--------------------------------------------+
-    /// |                  Toolbar                   |
-    /// +--------------------------------------------+
-    /// |                                            |
-    /// |                                            |
-    /// |                  Content                   |
-    /// |                                            |
-    /// |                                            |
-    /// +--------------------------------------------+
-    /// 
-    /// Toolbar: the control which shows buttons
-    ///          to alternate between the StackTraceDisplay
-    ///          and BrowserDisplay back and forth.
-    ///          The control collection of this control
-    ///          never changes.
-    ///               
-    /// Option:  a free place holder to show subfeature
-    ///          for a specific display (e.g: StackTraceDisplay
-    ///          or BrowserDisplay). This control's
-    ///          collection changes in relation with the
-    ///          selected display.
-    ///               
-    /// Content: the place where to put the main content
-    ///          for the current display. This control's 
-    ///          collection changes in regard of the
-    ///          selected display.
-    /// </summary>
-    public class ErrorPanelLayout : 
-        UserControl
-    {
-        private static readonly int PANEL_LEFT = 0;
-        private static readonly int PANEL_RIGHT = 1;
-        public static readonly int TOOLBAR_HEIGHT = 26;
-
-        private InternalSplitter _header;
-        private Panel _contentDefault;
-        private Control _contentCurrent;
-
-        public ErrorPanelLayout()
-        {
-            _header = new InternalSplitter();
-            _contentDefault = new Panel();
-            _contentCurrent = _contentDefault;
-
-            Controls.Add(_header[PANEL_LEFT]);
-            //Controls.Add(_header[PANEL_RIGHT]);
-            Controls.Add(_contentDefault);
-
-            //_header[PANEL_LEFT].BackColor = Color.Yellow;
-            //_header[PANEL_RIGHT].BackColor = Color.Violet;
-            //_contentDefault.BackColor = Color.Green;
-
-            SizeChanged += new EventHandler(ErrorPanelLayout_SizeChanged);
-
-            _header[PANEL_RIGHT].ControlAdded += new ControlEventHandler(ErrorPanelLayout_ControlAddedOrRemoved);
-
-            _header[PANEL_RIGHT].ControlRemoved += new ControlEventHandler(ErrorPanelLayout_ControlAddedOrRemoved);
-
-            Width = 200;
-            Height = 200;
-
-            return;
-        }
-
-        void ErrorPanelLayout_ControlAddedOrRemoved(object sender, ControlEventArgs e)
-        {
-            doLayout();
-        }
-
-        void ErrorPanelLayout_SizeChanged(object sender, EventArgs e)
-        {
-            doLayout();
-        }
-
-        /// <summary>
-        /// Gets or sets the control to be placed in Toolbar location.
-        /// Pass null to reset Toolbar to its default state.
-        /// 
-        /// When setting a control, the control's hierarchy of
-        /// ErrorPanelLayout is automatically updated with the
-        /// passed component. Besides, the passed component is
-        /// automatically positionned to the right coordinates.
-        /// </summary>
-        public Control Toolbar
-        {
-            get { return (_header[PANEL_LEFT]); }
-            set {                                
-                Controls.Remove(_header[PANEL_LEFT]);
-                _header[PANEL_LEFT] = value;
-                Controls.Add(_header[PANEL_LEFT]);
-                doLayout();
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the control to be placed in Option location.
-        /// Pass null to reset Option to its default state.
-        /// 
-        /// When setting a control, the control's hierarchy of
-        /// ErrorPanelLayout is automatically updated with the
-        /// passed component. Besides, the passed component is
-        /// automatically positionned to the right coordinates.
-        /// </summary>
-        public Control Option
-        {
-            get { return (_header[PANEL_RIGHT]); }
-            set {
-                Controls.Remove(_header[PANEL_RIGHT]);
-                _header[PANEL_RIGHT] = value;
-                Controls.Add(_header[PANEL_RIGHT]);
-                doLayout();
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the control to be placed in Content location.
-        /// Pass null to reset content to its default state.
-        /// 
-        /// When setting a control, the control's hierarchy of
-        /// ErrorPanelLayout is automatically updated with the
-        /// passed component. Besides, the passed component is
-        /// automatically positionned to the right coordinates.
-        /// </summary>
-        public Control Content
-        {
-            get { return (_contentCurrent); }
-            set {
-                if (value == null)
-                    value = _contentDefault;
-                Controls.Remove(_contentCurrent);
-                _contentCurrent = value;
-                Controls.Add(_contentCurrent);
-                doLayout();
-            }
-        }
-
-        //protected override void OnPaint(PaintEventArgs e)
-        //{
-        //    e.Graphics.DrawImage(Resources.ErrorBrowserHeader,
-        //        new Rectangle(0, 0, Width, TOOLBAR_HEIGHT),
-        //        new Rectangle(0, 0, Resources.ErrorBrowserHeader.Width - 1,
-        //            Resources.ErrorBrowserHeader.Height),
-        //        GraphicsUnit.Pixel);
-
-        //    return;
-        //}
-
-        private void doLayout()
-        {
-//            int widthLeft;
-            int widthRight;
-
-            widthRight = _header.WidthAt(PANEL_RIGHT);
-//            widthLeft = _header.WidthAt(PANEL_LEFT);
-
-            _header[PANEL_LEFT].Width = Math.Max(0, Width - widthRight);
-            _contentCurrent.Width = Width;
-
-            _header[PANEL_LEFT].Height = TOOLBAR_HEIGHT;
-            _header[PANEL_RIGHT].Height = Math.Min(TOOLBAR_HEIGHT, _header[PANEL_RIGHT].Height);
-            _header[PANEL_RIGHT].Width = widthRight;
-            _header[PANEL_RIGHT].Left = _header[PANEL_LEFT].Width;
-
-            _contentCurrent.Height = Height - TOOLBAR_HEIGHT;
-            _contentCurrent.Top = TOOLBAR_HEIGHT;
-
-            return;
-        }
-
-        class InternalSplitter : UserControl
-        {
-            private Panel[] _panels;
-            private Control[] _currents;
-
-            public InternalSplitter()
-            {
-                _panels = new Panel[] { new Panel(), new Panel() };
-                _currents = new Control[] { _panels[0], _panels[1] };
-
-                _panels[0].Width = 0;
-                _panels[1].Width = 0;
-
-                return;
-            }
-
-            public Control this[int index]
-            {
-                get { return (_currents[index]); }
-                set {
-                    if (value == null)
-                        value = _panels[index];
-                    _currents[index] = value; 
-                }
-            }
-
-            public int WidthAt(int index)
-            {
-                if (_currents[index] == _panels[index])
-                    return (0);
-                return (_currents[index].Width);
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.UiException.Properties;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Provides the panels and layout of ErrorBrowser as
+    /// shown below:
+    /// 
+    /// +--------------------------------------------+
+    /// |                  Toolbar                   |
+    /// +--------------------------------------------+
+    /// |                                            |
+    /// |                                            |
+    /// |                  Content                   |
+    /// |                                            |
+    /// |                                            |
+    /// +--------------------------------------------+
+    /// 
+    /// Toolbar: the control which shows buttons
+    ///          to alternate between the StackTraceDisplay
+    ///          and BrowserDisplay back and forth.
+    ///          The control collection of this control
+    ///          never changes.
+    ///               
+    /// Option:  a free place holder to show subfeature
+    ///          for a specific display (e.g: StackTraceDisplay
+    ///          or BrowserDisplay). This control's
+    ///          collection changes in relation with the
+    ///          selected display.
+    ///               
+    /// Content: the place where to put the main content
+    ///          for the current display. This control's 
+    ///          collection changes in regard of the
+    ///          selected display.
+    /// </summary>
+    public class ErrorPanelLayout : 
+        UserControl
+    {
+        private static readonly int PANEL_LEFT = 0;
+        private static readonly int PANEL_RIGHT = 1;
+        public static readonly int TOOLBAR_HEIGHT = 26;
+
+        private InternalSplitter _header;
+        private Panel _contentDefault;
+        private Control _contentCurrent;
+
+        public ErrorPanelLayout()
+        {
+            _header = new InternalSplitter();
+            _contentDefault = new Panel();
+            _contentCurrent = _contentDefault;
+
+            Controls.Add(_header[PANEL_LEFT]);
+            //Controls.Add(_header[PANEL_RIGHT]);
+            Controls.Add(_contentDefault);
+
+            //_header[PANEL_LEFT].BackColor = Color.Yellow;
+            //_header[PANEL_RIGHT].BackColor = Color.Violet;
+            //_contentDefault.BackColor = Color.Green;
+
+            SizeChanged += new EventHandler(ErrorPanelLayout_SizeChanged);
+
+            _header[PANEL_RIGHT].ControlAdded += new ControlEventHandler(ErrorPanelLayout_ControlAddedOrRemoved);
+
+            _header[PANEL_RIGHT].ControlRemoved += new ControlEventHandler(ErrorPanelLayout_ControlAddedOrRemoved);
+
+            Width = 200;
+            Height = 200;
+
+            return;
+        }
+
+        void ErrorPanelLayout_ControlAddedOrRemoved(object sender, ControlEventArgs e)
+        {
+            doLayout();
+        }
+
+        void ErrorPanelLayout_SizeChanged(object sender, EventArgs e)
+        {
+            doLayout();
+        }
+
+        /// <summary>
+        /// Gets or sets the control to be placed in Toolbar location.
+        /// Pass null to reset Toolbar to its default state.
+        /// 
+        /// When setting a control, the control's hierarchy of
+        /// ErrorPanelLayout is automatically updated with the
+        /// passed component. Besides, the passed component is
+        /// automatically positionned to the right coordinates.
+        /// </summary>
+        public Control Toolbar
+        {
+            get { return (_header[PANEL_LEFT]); }
+            set {                                
+                Controls.Remove(_header[PANEL_LEFT]);
+                _header[PANEL_LEFT] = value;
+                Controls.Add(_header[PANEL_LEFT]);
+                doLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the control to be placed in Option location.
+        /// Pass null to reset Option to its default state.
+        /// 
+        /// When setting a control, the control's hierarchy of
+        /// ErrorPanelLayout is automatically updated with the
+        /// passed component. Besides, the passed component is
+        /// automatically positionned to the right coordinates.
+        /// </summary>
+        public Control Option
+        {
+            get { return (_header[PANEL_RIGHT]); }
+            set {
+                Controls.Remove(_header[PANEL_RIGHT]);
+                _header[PANEL_RIGHT] = value;
+                Controls.Add(_header[PANEL_RIGHT]);
+                doLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the control to be placed in Content location.
+        /// Pass null to reset content to its default state.
+        /// 
+        /// When setting a control, the control's hierarchy of
+        /// ErrorPanelLayout is automatically updated with the
+        /// passed component. Besides, the passed component is
+        /// automatically positionned to the right coordinates.
+        /// </summary>
+        public Control Content
+        {
+            get { return (_contentCurrent); }
+            set {
+                if (value == null)
+                    value = _contentDefault;
+                Controls.Remove(_contentCurrent);
+                _contentCurrent = value;
+                Controls.Add(_contentCurrent);
+                doLayout();
+            }
+        }
+
+        //protected override void OnPaint(PaintEventArgs e)
+        //{
+        //    e.Graphics.DrawImage(Resources.ErrorBrowserHeader,
+        //        new Rectangle(0, 0, Width, TOOLBAR_HEIGHT),
+        //        new Rectangle(0, 0, Resources.ErrorBrowserHeader.Width - 1,
+        //            Resources.ErrorBrowserHeader.Height),
+        //        GraphicsUnit.Pixel);
+
+        //    return;
+        //}
+
+        private void doLayout()
+        {
+//            int widthLeft;
+            int widthRight;
+
+            widthRight = _header.WidthAt(PANEL_RIGHT);
+//            widthLeft = _header.WidthAt(PANEL_LEFT);
+
+            _header[PANEL_LEFT].Width = Math.Max(0, Width - widthRight);
+            _contentCurrent.Width = Width;
+
+            _header[PANEL_LEFT].Height = TOOLBAR_HEIGHT;
+            _header[PANEL_RIGHT].Height = Math.Min(TOOLBAR_HEIGHT, _header[PANEL_RIGHT].Height);
+            _header[PANEL_RIGHT].Width = widthRight;
+            _header[PANEL_RIGHT].Left = _header[PANEL_LEFT].Width;
+
+            _contentCurrent.Height = Height - TOOLBAR_HEIGHT;
+            _contentCurrent.Top = TOOLBAR_HEIGHT;
+
+            return;
+        }
+
+        class InternalSplitter : UserControl
+        {
+            private Panel[] _panels;
+            private Control[] _currents;
+
+            public InternalSplitter()
+            {
+                _panels = new Panel[] { new Panel(), new Panel() };
+                _currents = new Control[] { _panels[0], _panels[1] };
+
+                _panels[0].Width = 0;
+                _panels[1].Width = 0;
+
+                return;
+            }
+
+            public Control this[int index]
+            {
+                get { return (_currents[index]); }
+                set {
+                    if (value == null)
+                        value = _panels[index];
+                    _currents[index] = value; 
+                }
+            }
+
+            public int WidthAt(int index)
+            {
+                if (_currents[index] == _panels[index])
+                    return (0);
+                return (_currents[index].Width);
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ErrorToolbar.cs b/src/GuiException/UiException/Controls/ErrorToolbar.cs
index fd521bd..eb5b0e8 100644
--- a/src/GuiException/UiException/Controls/ErrorToolbar.cs
+++ b/src/GuiException/UiException/Controls/ErrorToolbar.cs
@@ -1,232 +1,232 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Collections;
-using System.Drawing;
-using System.Diagnostics;
-using NUnit.UiException.Properties;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// A specialization of a ToolStrip to show instances of IErrorDisplay.
-    /// </summary>
-    public class ErrorToolbar :
-        ToolStrip,
-        IEnumerable
-    {
-        public event EventHandler SelectedRendererChanged;
-
-        private List<IErrorDisplay> _displays;
-
-        private ToolStripItem _separator;
-        private int _selection;
-
-        public ErrorToolbar()
-        {
-            _displays = new List<IErrorDisplay>();
-
-            _separator = CreateDefaultItem("-", null, null);
-            Items.Add(_separator);
-
-            _selection = -1;
-            
-            BackgroundImage = Resources.ImageErrorBrowserHeader;
-            BackgroundImageLayout = ImageLayout.Tile;
-
-            return;
-        }
-
-        /// <summary>
-        /// Create and configure a ToolStripButton.
-        /// </summary>
-        public static ToolStripButton NewStripButton(
-            bool canCheck, string text, Image image, EventHandler onClick)
-        {
-            ToolStripButton button;
-
-            button = new ToolStripButton(text, image, onClick);
-            button.CheckOnClick = canCheck;
-            button.Image = image;
-            button.ImageScaling = ToolStripItemImageScaling.None;
-            button.TextImageRelation = TextImageRelation.ImageBeforeText;
-            button.DisplayStyle = ToolStripItemDisplayStyle.Image;
-
-            return (button);
-        }
-
-        /// <summary>
-        /// Gets the count of IErrorDisplay instances.
-        /// </summary>
-        public int Count
-        {
-            get { return (_displays.Count); }
-        }
-
-        /// <summary>
-        /// Gets the display at the given index.
-        /// </summary>
-        public IErrorDisplay this[int index]
-        {
-            get { return (_displays[index]); }
-        }
-
-        /// <summary>
-        /// Gets or sets the IErrorDisplay to be selected.
-        /// </summary>
-        public IErrorDisplay SelectedDisplay
-        {
-            get {
-                if (_selection == -1)
-                    return (null);
-                return ((IErrorDisplay)Items[_selection].Tag); 
-            }
-            set
-            {
-                int index = IndexOf(value);
-
-                UiExceptionHelper.CheckFalse(index == -1 && value != null,
-                    "Cannot select unregistered display.", "SelectedDisplay");
-
-                if (index == _selection)
-                    return;
-
-                _selection = index;
-                SetOrUnsetCheckedFlag(_selection);
-                ShowOrHideOptionItems(_selection);
-                
-                if (SelectedRendererChanged != null)
-                    SelectedRendererChanged(this, new EventArgs());
-
-                return;
-            }
-        }
-
-        /// <summary>
-        /// Register a new IErrorDisplay in the toolbar.
-        /// </summary>
-        public void Register(IErrorDisplay display)
-        {
-            ToolStripItem item;
-            int sepIndex;
-
-            UiExceptionHelper.CheckNotNull(display, "display");
-            UiExceptionHelper.CheckNotNull(display.PluginItem, "display.PluginItem");
-
-            item = display.PluginItem;
-            item.Tag = display;
-            item.Click += new EventHandler(item_Click);
-
-            _displays.Add(display);
-            sepIndex = Items.IndexOf(_separator);
-            Items.Insert(sepIndex, item);
-
-            if (display.OptionItems != null)
-            {
-                ToolStripItem[] array = display.OptionItems;
-                foreach (ToolStripItem value in array)
-                {
-                    value.Visible = false;
-                    Items.Add(value);
-                }
-            }
-
-            if (_displays.Count == 1)
-                SelectedDisplay = display;
-
-            return;
-        }
-
-        /// <summary>
-        /// Clears all IErrorDisplay in the toolbar.
-        /// </summary>
-        public void Clear()
-        {
-            _displays.Clear();
-            Items.Clear();
-            Items.Add(_separator);
-
-            return;
-        }        
-
-        private void ShowOrHideOptionItems(int selectedIndex)
-        {
-            int index;
-
-            foreach (IErrorDisplay item in _displays)
-            {
-                if ((index = IndexOf(item)) == -1)                     
-                    continue;
-
-                if (item.OptionItems == null)
-                    continue;
-
-                foreach (ToolStripItem stripItem in item.OptionItems)
-                    stripItem.Visible = (index == selectedIndex);
-            }
-
-            return;
-        }
-
-        private void SetOrUnsetCheckedFlag(int selectedIndex)
-        {
-            int index;
-
-            foreach (IErrorDisplay item in _displays)
-            {
-                index = IndexOf(item);
-                if (index == -1)
-                    continue;
-                item.PluginItem.Checked = (index == selectedIndex);
-            }
-
-            return;
-        }
-
-        private int IndexOf(IErrorDisplay renderer)
-        {
-            int i;
-
-            if (renderer == null)
-                return (-1);
-
-            for (i = 0; i < Items.Count; ++i)
-                if (object.ReferenceEquals(Items[i].Tag, renderer))
-                    return (i);
-
-            return (-1);
-        }       
-
-        private void item_Click(object sender, EventArgs e)
-        {
-            ToolStripItem item = sender as ToolStripItem;
-            IErrorDisplay renderer;
-
-            if (item == null || item.Tag == null)
-                return;
-
-            renderer = item.Tag as IErrorDisplay;
-            if (renderer == null)
-                return;
-
-            SelectedDisplay = renderer;
-
-            return;
-        }                
-
-        #region IEnumerable Membres
-
-        public IEnumerator GetEnumerator()
-        {
-            return (_displays.GetEnumerator());
-        }
-
-        #endregion
-    }      
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Collections;
+using System.Drawing;
+using System.Diagnostics;
+using NUnit.UiException.Properties;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// A specialization of a ToolStrip to show instances of IErrorDisplay.
+    /// </summary>
+    public class ErrorToolbar :
+        ToolStrip,
+        IEnumerable
+    {
+        public event EventHandler SelectedRendererChanged;
+
+        private List<IErrorDisplay> _displays;
+
+        private ToolStripItem _separator;
+        private int _selection;
+
+        public ErrorToolbar()
+        {
+            _displays = new List<IErrorDisplay>();
+
+            _separator = CreateDefaultItem("-", null, null);
+            Items.Add(_separator);
+
+            _selection = -1;
+            
+            BackgroundImage = Resources.ImageErrorBrowserHeader;
+            BackgroundImageLayout = ImageLayout.Tile;
+
+            return;
+        }
+
+        /// <summary>
+        /// Create and configure a ToolStripButton.
+        /// </summary>
+        public static ToolStripButton NewStripButton(
+            bool canCheck, string text, Image image, EventHandler onClick)
+        {
+            ToolStripButton button;
+
+            button = new ToolStripButton(text, image, onClick);
+            button.CheckOnClick = canCheck;
+            button.Image = image;
+            button.ImageScaling = ToolStripItemImageScaling.None;
+            button.TextImageRelation = TextImageRelation.ImageBeforeText;
+            button.DisplayStyle = ToolStripItemDisplayStyle.Image;
+
+            return (button);
+        }
+
+        /// <summary>
+        /// Gets the count of IErrorDisplay instances.
+        /// </summary>
+        public int Count
+        {
+            get { return (_displays.Count); }
+        }
+
+        /// <summary>
+        /// Gets the display at the given index.
+        /// </summary>
+        public IErrorDisplay this[int index]
+        {
+            get { return (_displays[index]); }
+        }
+
+        /// <summary>
+        /// Gets or sets the IErrorDisplay to be selected.
+        /// </summary>
+        public IErrorDisplay SelectedDisplay
+        {
+            get {
+                if (_selection == -1)
+                    return (null);
+                return ((IErrorDisplay)Items[_selection].Tag); 
+            }
+            set
+            {
+                int index = IndexOf(value);
+
+                UiExceptionHelper.CheckFalse(index == -1 && value != null,
+                    "Cannot select unregistered display.", "SelectedDisplay");
+
+                if (index == _selection)
+                    return;
+
+                _selection = index;
+                SetOrUnsetCheckedFlag(_selection);
+                ShowOrHideOptionItems(_selection);
+                
+                if (SelectedRendererChanged != null)
+                    SelectedRendererChanged(this, new EventArgs());
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Register a new IErrorDisplay in the toolbar.
+        /// </summary>
+        public void Register(IErrorDisplay display)
+        {
+            ToolStripItem item;
+            int sepIndex;
+
+            UiExceptionHelper.CheckNotNull(display, "display");
+            UiExceptionHelper.CheckNotNull(display.PluginItem, "display.PluginItem");
+
+            item = display.PluginItem;
+            item.Tag = display;
+            item.Click += new EventHandler(item_Click);
+
+            _displays.Add(display);
+            sepIndex = Items.IndexOf(_separator);
+            Items.Insert(sepIndex, item);
+
+            if (display.OptionItems != null)
+            {
+                ToolStripItem[] array = display.OptionItems;
+                foreach (ToolStripItem value in array)
+                {
+                    value.Visible = false;
+                    Items.Add(value);
+                }
+            }
+
+            if (_displays.Count == 1)
+                SelectedDisplay = display;
+
+            return;
+        }
+
+        /// <summary>
+        /// Clears all IErrorDisplay in the toolbar.
+        /// </summary>
+        public void Clear()
+        {
+            _displays.Clear();
+            Items.Clear();
+            Items.Add(_separator);
+
+            return;
+        }        
+
+        private void ShowOrHideOptionItems(int selectedIndex)
+        {
+            int index;
+
+            foreach (IErrorDisplay item in _displays)
+            {
+                if ((index = IndexOf(item)) == -1)                     
+                    continue;
+
+                if (item.OptionItems == null)
+                    continue;
+
+                foreach (ToolStripItem stripItem in item.OptionItems)
+                    stripItem.Visible = (index == selectedIndex);
+            }
+
+            return;
+        }
+
+        private void SetOrUnsetCheckedFlag(int selectedIndex)
+        {
+            int index;
+
+            foreach (IErrorDisplay item in _displays)
+            {
+                index = IndexOf(item);
+                if (index == -1)
+                    continue;
+                item.PluginItem.Checked = (index == selectedIndex);
+            }
+
+            return;
+        }
+
+        private int IndexOf(IErrorDisplay renderer)
+        {
+            int i;
+
+            if (renderer == null)
+                return (-1);
+
+            for (i = 0; i < Items.Count; ++i)
+                if (object.ReferenceEquals(Items[i].Tag, renderer))
+                    return (i);
+
+            return (-1);
+        }       
+
+        private void item_Click(object sender, EventArgs e)
+        {
+            ToolStripItem item = sender as ToolStripItem;
+            IErrorDisplay renderer;
+
+            if (item == null || item.Tag == null)
+                return;
+
+            renderer = item.Tag as IErrorDisplay;
+            if (renderer == null)
+                return;
+
+            SelectedDisplay = renderer;
+
+            return;
+        }                
+
+        #region IEnumerable Membres
+
+        public IEnumerator GetEnumerator()
+        {
+            return (_displays.GetEnumerator());
+        }
+
+        #endregion
+    }      
+}
diff --git a/src/GuiException/UiException/Controls/ICodeRenderer.cs b/src/GuiException/UiException/Controls/ICodeRenderer.cs
index e8c20fc..376e6ef 100644
--- a/src/GuiException/UiException/Controls/ICodeRenderer.cs
+++ b/src/GuiException/UiException/Controls/ICodeRenderer.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-using System.Drawing;
-
-namespace NUnit.UiException.Controls
-{   
-    /// <summary>
-    /// The interface through which CodeBox interacts with a display to display itself.
-    /// 
-    /// Direct implementation is:
-    ///     - DefaultCodeRenderer
-    /// </summary>
-    public interface ICodeRenderer
-    {
-        /// <summary>
-        /// Draw the given code to be displayed in the actual viewport.
-        /// </summary>
-        /// <param name="code">The code to draw</param>
-        /// <param name="args">Encapsulate graphic information about how to display the code</param>
-        /// <param name="viewport">The portion of interest</param>
-        void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport);
-
-        /// <summary>
-        /// Measures the code size in pixels.
-        /// </summary>
-        /// <param name="code">The code to measure</param>
-        /// <param name="g">The target graphics object</param>
-        /// <param name="font">The font with which displaying the code</param>
-        /// <returns>The size in pixels</returns>
-        SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font);
-
-        /// <summary>
-        /// Converts a line index to its matching Y client coordinate.
-        /// </summary>
-        /// <param name="lineIndex">The line index to convert</param>
-        /// <param name="g">The target graphics object</param>
-        /// <param name="font">The font with which displaying the code</param>
-        /// <returns>The Y client coordinate</returns>
-        float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+using System.Drawing;
+
+namespace NUnit.UiException.Controls
+{   
+    /// <summary>
+    /// The interface through which CodeBox interacts with a display to display itself.
+    /// 
+    /// Direct implementation is:
+    ///     - DefaultCodeRenderer
+    /// </summary>
+    public interface ICodeRenderer
+    {
+        /// <summary>
+        /// Draw the given code to be displayed in the actual viewport.
+        /// </summary>
+        /// <param name="code">The code to draw</param>
+        /// <param name="args">Encapsulate graphic information about how to display the code</param>
+        /// <param name="viewport">The portion of interest</param>
+        void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport);
+
+        /// <summary>
+        /// Measures the code size in pixels.
+        /// </summary>
+        /// <param name="code">The code to measure</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="font">The font with which displaying the code</param>
+        /// <returns>The size in pixels</returns>
+        SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font);
+
+        /// <summary>
+        /// Converts a line index to its matching Y client coordinate.
+        /// </summary>
+        /// <param name="lineIndex">The line index to convert</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="font">The font with which displaying the code</param>
+        /// <returns>The Y client coordinate</returns>
+        float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font);
+    }
+}
diff --git a/src/GuiException/UiException/Controls/ICodeView.cs b/src/GuiException/UiException/Controls/ICodeView.cs
index ff6ac19..9890014 100644
--- a/src/GuiException/UiException/Controls/ICodeView.cs
+++ b/src/GuiException/UiException/Controls/ICodeView.cs
@@ -1,42 +1,42 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.CodeFormatters;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// The interface through which SourceCodeDisplay interacts with the code display.
-    /// 
-    /// Direct implementation is:
-    ///     - CodeBox
-    /// </summary>
-    public interface ICodeView
-    {
-        /// <summary>
-        /// Gets or sets a text to display in the code display.
-        /// </summary>
-        string Text { get; set; }
-
-        /// <summary>
-        /// Gets or sets the language formatting of the code display.
-        /// </summary>
-        string Language { get; set; }
-
-        /// <summary>
-        /// Gets or sets the viewport location from a 0 based line index
-        /// </summary>
-        int CurrentLine { get; set; }
-
-        /// <summary>
-        /// Gives access to the underlying IFormatterCatalog.
-        /// </summary>
-        IFormatterCatalog Formatter { get; }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.CodeFormatters;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// The interface through which SourceCodeDisplay interacts with the code display.
+    /// 
+    /// Direct implementation is:
+    ///     - CodeBox
+    /// </summary>
+    public interface ICodeView
+    {
+        /// <summary>
+        /// Gets or sets a text to display in the code display.
+        /// </summary>
+        string Text { get; set; }
+
+        /// <summary>
+        /// Gets or sets the language formatting of the code display.
+        /// </summary>
+        string Language { get; set; }
+
+        /// <summary>
+        /// Gets or sets the viewport location from a 0 based line index
+        /// </summary>
+        int CurrentLine { get; set; }
+
+        /// <summary>
+        /// Gives access to the underlying IFormatterCatalog.
+        /// </summary>
+        IFormatterCatalog Formatter { get; }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/IErrorDisplay.cs b/src/GuiException/UiException/Controls/IErrorDisplay.cs
index d39f5d3..e75ab2d 100644
--- a/src/GuiException/UiException/Controls/IErrorDisplay.cs
+++ b/src/GuiException/UiException/Controls/IErrorDisplay.cs
@@ -1,51 +1,51 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// This interface describes a feature that can be added to the ErrorWindow
-    /// in order to show relevant information about failures/errors after a
-    /// test suite run.
-    ///     Clients who wants to add their own display should implement this
-    /// interface and register their instance to ErrorBrowser at run-time.
-    /// 
-    /// Direct known implementations are:
-    ///     StackTraceDisplay
-    ///     SourceCodeDisplay
-    /// </summary>
-    public interface IErrorDisplay
-    {
-        /// <summary>
-        /// Gives access to the ToolStripButton that enables this display.
-        /// </summary>
-        ToolStripButton PluginItem { get; }
-
-        /// <summary>
-        /// Gives access to a possibly null collection of option controls that will
-        /// be shown when this display has the focus.
-        /// </summary>
-        ToolStripItem[] OptionItems { get; }
-
-        /// <summary>
-        /// Gives access to the content control of this display.
-        /// </summary>
-        Control Content { get; }
-
-        /// <summary>
-        /// Called whenever the user changes the error selection in the detail list.
-        /// This method is called to allow the display to update its content according
-        /// the given stack trace.
-        /// </summary>
-        /// <param name="stackTrace"></param>
-        void OnStackTraceChanged(string stackTrace);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// This interface describes a feature that can be added to the ErrorWindow
+    /// in order to show relevant information about failures/errors after a
+    /// test suite run.
+    ///     Clients who wants to add their own display should implement this
+    /// interface and register their instance to ErrorBrowser at run-time.
+    /// 
+    /// Direct known implementations are:
+    ///     StackTraceDisplay
+    ///     SourceCodeDisplay
+    /// </summary>
+    public interface IErrorDisplay
+    {
+        /// <summary>
+        /// Gives access to the ToolStripButton that enables this display.
+        /// </summary>
+        ToolStripButton PluginItem { get; }
+
+        /// <summary>
+        /// Gives access to a possibly null collection of option controls that will
+        /// be shown when this display has the focus.
+        /// </summary>
+        ToolStripItem[] OptionItems { get; }
+
+        /// <summary>
+        /// Gives access to the content control of this display.
+        /// </summary>
+        Control Content { get; }
+
+        /// <summary>
+        /// Called whenever the user changes the error selection in the detail list.
+        /// This method is called to allow the display to update its content according
+        /// the given stack trace.
+        /// </summary>
+        /// <param name="stackTrace"></param>
+        void OnStackTraceChanged(string stackTrace);
+    }
+}
diff --git a/src/GuiException/UiException/Controls/IErrorListRenderer.cs b/src/GuiException/UiException/Controls/IErrorListRenderer.cs
index 9cb48d3..7da68ee 100644
--- a/src/GuiException/UiException/Controls/IErrorListRenderer.cs
+++ b/src/GuiException/UiException/Controls/IErrorListRenderer.cs
@@ -1,64 +1,64 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// The interface through which ErrorList interacts with a painter to paint itself.
-    /// 
-    /// Direct implementation is:
-    ///     - DefaultErrorListRenderer
-    /// </summary>
-    public interface IErrorListRenderer
-    {
-        /// <summary>
-        /// Draws the list on the given graphics.
-        /// </summary>
-        /// <param name="items">The item collection to paint on the graphics object</param>
-        /// <param name="selected">The item to paint with selection feature</param>
-        /// <param name="g">The target graphics object</param>
-        /// <param name="viewport">The viewport location</param>
-        void DrawToGraphics(ErrorItemCollection items, ErrorItem selected, Graphics g, Rectangle viewport);
-
-        /// <summary>
-        /// Draw the given item on the given graphics object.
-        /// </summary>
-        /// <param name="item">The item to be painted</param>
-        /// <param name="index">The item's index</param>
-        /// <param name="hovered">If true, this item can display hover feature</param>
-        /// <param name="selected">If true, this item can display selection feature</param>
-        /// <param name="g">The target graphics object</param>
-        /// <param name="viewport">The current viewport</param>
-        void DrawItem(ErrorItem item, int index, bool hovered, bool selected, Graphics g, Rectangle viewport);
-
-        /// <summary>
-        /// Given a collection of items and a graphics object, this method
-        /// measures in pixels the size of the collection.
-        /// </summary>
-        /// <param name="items">The collection</param>
-        /// <param name="g">The target graphics object</param>
-        /// <returns>The size in pixels of the collection</returns>
-        Size GetDocumentSize(ErrorItemCollection items, Graphics g);
-
-        /// <summary>
-        /// Gets the Item right under point.
-        /// </summary>
-        /// <param name="items">A collection of items</param>
-        /// <param name="g">The target graphics object</param>
-        /// <param name="point">Some client coordinate values</param>
-        /// <returns>One item in the collection or null the location doesn't match any item</returns>
-        ErrorItem ItemAt(ErrorItemCollection items, Graphics g, Point point);
-
-        /// <summary>
-        /// Gets and sets the font for this renderer
-        /// </summary>
-        Font Font { get; set; }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// The interface through which ErrorList interacts with a painter to paint itself.
+    /// 
+    /// Direct implementation is:
+    ///     - DefaultErrorListRenderer
+    /// </summary>
+    public interface IErrorListRenderer
+    {
+        /// <summary>
+        /// Draws the list on the given graphics.
+        /// </summary>
+        /// <param name="items">The item collection to paint on the graphics object</param>
+        /// <param name="selected">The item to paint with selection feature</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="viewport">The viewport location</param>
+        void DrawToGraphics(ErrorItemCollection items, ErrorItem selected, Graphics g, Rectangle viewport);
+
+        /// <summary>
+        /// Draw the given item on the given graphics object.
+        /// </summary>
+        /// <param name="item">The item to be painted</param>
+        /// <param name="index">The item's index</param>
+        /// <param name="hovered">If true, this item can display hover feature</param>
+        /// <param name="selected">If true, this item can display selection feature</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="viewport">The current viewport</param>
+        void DrawItem(ErrorItem item, int index, bool hovered, bool selected, Graphics g, Rectangle viewport);
+
+        /// <summary>
+        /// Given a collection of items and a graphics object, this method
+        /// measures in pixels the size of the collection.
+        /// </summary>
+        /// <param name="items">The collection</param>
+        /// <param name="g">The target graphics object</param>
+        /// <returns>The size in pixels of the collection</returns>
+        Size GetDocumentSize(ErrorItemCollection items, Graphics g);
+
+        /// <summary>
+        /// Gets the Item right under point.
+        /// </summary>
+        /// <param name="items">A collection of items</param>
+        /// <param name="g">The target graphics object</param>
+        /// <param name="point">Some client coordinate values</param>
+        /// <returns>One item in the collection or null the location doesn't match any item</returns>
+        ErrorItem ItemAt(ErrorItemCollection items, Graphics g, Point point);
+
+        /// <summary>
+        /// Gets and sets the font for this renderer
+        /// </summary>
+        Font Font { get; set; }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/IStackTraceView.cs b/src/GuiException/UiException/Controls/IStackTraceView.cs
index f7777bc..a6d005b 100644
--- a/src/GuiException/UiException/Controls/IStackTraceView.cs
+++ b/src/GuiException/UiException/Controls/IStackTraceView.cs
@@ -1,49 +1,49 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// This enum defines indicators telling how instances of IStackTraceView
-    /// should deal with item order in their list.
-    /// </summary>
-    public enum ErrorListOrderPolicy
-    {
-        /// <summary>
-        /// Tells IStackTraceView to order items in the list in the same
-        /// order they appear in the stack trace.
-        /// </summary>
-        InitialOrder,
-
-        /// <summary>
-        /// Tells IStackTraceView to order items in the list in the reverse
-        /// order they appear in the stack trace. At Test Driven Development time
-        /// this value is useful to point out the location where a test is expected
-        /// to fail.
-        /// </summary>
-        ReverseOrder,
-    }
-
-    /// <summary>
-    /// The interface through which SourceCodeDisplay interacts with the error list.
-    /// 
-    /// Direct implementations are:
-    ///     - ErrorList
-    /// </summary>
-    public interface IStackTraceView
-    {
-        event EventHandler SelectedItemChanged;
-
-        string StackTrace { get; set; }
-        ErrorItem SelectedItem { get; }
-        bool AutoSelectFirstItem { get; set; }
-        ErrorListOrderPolicy ListOrderPolicy { get; set; }        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// This enum defines indicators telling how instances of IStackTraceView
+    /// should deal with item order in their list.
+    /// </summary>
+    public enum ErrorListOrderPolicy
+    {
+        /// <summary>
+        /// Tells IStackTraceView to order items in the list in the same
+        /// order they appear in the stack trace.
+        /// </summary>
+        InitialOrder,
+
+        /// <summary>
+        /// Tells IStackTraceView to order items in the list in the reverse
+        /// order they appear in the stack trace. At Test Driven Development time
+        /// this value is useful to point out the location where a test is expected
+        /// to fail.
+        /// </summary>
+        ReverseOrder,
+    }
+
+    /// <summary>
+    /// The interface through which SourceCodeDisplay interacts with the error list.
+    /// 
+    /// Direct implementations are:
+    ///     - ErrorList
+    /// </summary>
+    public interface IStackTraceView
+    {
+        event EventHandler SelectedItemChanged;
+
+        string StackTrace { get; set; }
+        ErrorItem SelectedItem { get; }
+        bool AutoSelectFirstItem { get; set; }
+        ErrorListOrderPolicy ListOrderPolicy { get; set; }        
+    }
+}
diff --git a/src/GuiException/UiException/Controls/PaintLineLocation.cs b/src/GuiException/UiException/Controls/PaintLineLocation.cs
index c9a32d3..d9c8146 100644
--- a/src/GuiException/UiException/Controls/PaintLineLocation.cs
+++ b/src/GuiException/UiException/Controls/PaintLineLocation.cs
@@ -1,117 +1,117 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Encapsulate data to draw a line of text.
-    /// </summary>
-    public class PaintLineLocation
-    {
-        /// <summary>
-        /// Index of the current line.
-        /// </summary>
-        private int _lineIndex;
-
-        /// <summary>
-        /// The string value at this line.
-        /// </summary>
-        private string _text;
-
-        /// <summary>
-        /// A client coordinate from where beginning the drawing.
-        /// </summary>
-        private PointF _location;        
-
-        /// <summary>
-        /// Build a new instance of this object given some data.
-        /// </summary>
-        /// <param name="lineIndex">Index of the current line.</param>
-        /// <param name="text">String value at this line.</param>
-        /// <param name="location">Client coordinate where beginning the drawing.</param>
-        public PaintLineLocation(int lineIndex, string text, PointF location)
-        {
-            SetLine(lineIndex);
-            SetText(text);
-            SetLocation(location);
-
-            return;
-        }
-
-        /// <summary>
-        /// Index of the current line.
-        /// </summary>
-        public int LineIndex
-        {
-            get { return (_lineIndex); }
-        }
-
-        /// <summary>
-        /// String value at this line.
-        /// </summary>
-        public string Text
-        {
-            get { return (_text); }
-        }
-
-        /// <summary>
-        /// Client coordinate where to beginning the drawing.
-        /// </summary>
-        public PointF Location
-        {
-            get { return (_location); }
-        }
-       
-        public override bool Equals(object obj)
-        {
-            PaintLineLocation line;
-
-            if (obj == null ||
-                !(obj is PaintLineLocation))
-                return (false);
-
-            line = obj as PaintLineLocation;
-
-            return (line.LineIndex == LineIndex &&
-                line.Text == Text &&
-                line.Location == Location);
-        }
-
-        public override int GetHashCode() {
-            return base.GetHashCode();
-        }
-
-        public override string ToString() {
-            return ("PaintLineLocation: {" + LineIndex + ":[" + Text + "]:(" +
-                     Location.X + ", " + Location.Y + ")}");
-        }
-
-        #region private definitions
-
-        protected void SetLine(int lineIndex)
-        {
-            _lineIndex = lineIndex;
-
-            return;
-        }
-
-        protected void SetText(string text) 
-        {
-            UiExceptionHelper.CheckNotNull(text, "text");
-            _text = text;
-        }
-
-        protected void SetLocation(PointF location) {
-            _location = location;
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Encapsulate data to draw a line of text.
+    /// </summary>
+    public class PaintLineLocation
+    {
+        /// <summary>
+        /// Index of the current line.
+        /// </summary>
+        private int _lineIndex;
+
+        /// <summary>
+        /// The string value at this line.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// A client coordinate from where beginning the drawing.
+        /// </summary>
+        private PointF _location;        
+
+        /// <summary>
+        /// Build a new instance of this object given some data.
+        /// </summary>
+        /// <param name="lineIndex">Index of the current line.</param>
+        /// <param name="text">String value at this line.</param>
+        /// <param name="location">Client coordinate where beginning the drawing.</param>
+        public PaintLineLocation(int lineIndex, string text, PointF location)
+        {
+            SetLine(lineIndex);
+            SetText(text);
+            SetLocation(location);
+
+            return;
+        }
+
+        /// <summary>
+        /// Index of the current line.
+        /// </summary>
+        public int LineIndex
+        {
+            get { return (_lineIndex); }
+        }
+
+        /// <summary>
+        /// String value at this line.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+        }
+
+        /// <summary>
+        /// Client coordinate where to beginning the drawing.
+        /// </summary>
+        public PointF Location
+        {
+            get { return (_location); }
+        }
+       
+        public override bool Equals(object obj)
+        {
+            PaintLineLocation line;
+
+            if (obj == null ||
+                !(obj is PaintLineLocation))
+                return (false);
+
+            line = obj as PaintLineLocation;
+
+            return (line.LineIndex == LineIndex &&
+                line.Text == Text &&
+                line.Location == Location);
+        }
+
+        public override int GetHashCode() {
+            return base.GetHashCode();
+        }
+
+        public override string ToString() {
+            return ("PaintLineLocation: {" + LineIndex + ":[" + Text + "]:(" +
+                     Location.X + ", " + Location.Y + ")}");
+        }
+
+        #region private definitions
+
+        protected void SetLine(int lineIndex)
+        {
+            _lineIndex = lineIndex;
+
+            return;
+        }
+
+        protected void SetText(string text) 
+        {
+            UiExceptionHelper.CheckNotNull(text, "text");
+            _text = text;
+        }
+
+        protected void SetLocation(PointF location) {
+            _location = location;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/Controls/SourceCodeDisplay.cs b/src/GuiException/UiException/Controls/SourceCodeDisplay.cs
index 98547e5..228432e 100644
--- a/src/GuiException/UiException/Controls/SourceCodeDisplay.cs
+++ b/src/GuiException/UiException/Controls/SourceCodeDisplay.cs
@@ -1,194 +1,194 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.UiException.Properties;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Implements IErrorDisplay and displays data about failures and error
-    /// after a test suite run. SourceCodeDisplay is a control composed of two
-    /// views. 
-    /// 
-    /// The first view displays the stack trace in an ordered list of items
-    /// where each item contains the context about a specific failure (file, class
-    /// method, line number).
-    /// 
-    /// The second view displays a CodeBox control and shows the source code
-    /// of one element in this list when the localization is available.
-    /// </summary>
-    public class SourceCodeDisplay :
-        IErrorDisplay
-    {
-        protected IStackTraceView _stacktraceView;
-        protected ICodeView _codeView;
-        protected SplitterBox _splitter;
-        private CodeBox _codeBox;
-
-        private ToolStripButton _btnPlugin;
-        private ToolStripButton _btnSwap;
-
-        public event EventHandler SplitOrientationChanged;
-        public event EventHandler SplitterDistanceChanged;
-
-        /// <summary>
-        /// Builds a new instance of SourceCodeDisplay.
-        /// </summary>
-        public SourceCodeDisplay()
-        {
-            ErrorList errorList = new ErrorList();
-            _codeBox = new CodeBox();
-
-            _stacktraceView = errorList;
-            _stacktraceView.AutoSelectFirstItem = true;
-            _stacktraceView.SelectedItemChanged += new EventHandler(SelectedItemChanged);
-            _codeView = _codeBox;
-
-            _btnPlugin = ErrorToolbar.NewStripButton(true, "Display source code context", Resources.ImageSourceCodeDisplay, null);
-            _btnSwap = ErrorToolbar.NewStripButton(false, "ReverseOrder item order", Resources.ImageReverseItemOrder, OnClick);
-
-            SplitterBox splitter = new SplitterBox();
-            _splitter = splitter;
-            _splitter.SplitterDistanceChanged += new EventHandler(_splitter_DistanceChanged);
-            _splitter.OrientationChanged += new EventHandler(_splitter_OrientationChanged);
-
-            splitter.Control1 = errorList;
-            splitter.Control2 = _codeBox;
-
-            _codeBox.ShowCurrentLine = true;
-
-            return;
-        }
-
-        void _splitter_DistanceChanged(object sender, EventArgs e)
-        {
-            if (SplitterDistanceChanged != null)
-                SplitterDistanceChanged(sender, e);
-        }
-
-        void _splitter_OrientationChanged(object sender, EventArgs e)
-        {
-            if (SplitOrientationChanged != null)
-                SplitOrientationChanged(sender, e);
-        }
-
-        public Font CodeDisplayFont
-        {
-            get { return _codeBox.Font; }
-            set { _codeBox.Font = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets a value telling whether or not to select automatically
-        /// the first localizable item each time the stack trace changes.
-        ///   When set to true, the first localizable item will be selected 
-        /// and the source code context for this item displayed automatically.
-        /// Default is True.
-        /// </summary>
-        public bool AutoSelectFirstItem
-        {
-            get { return (_stacktraceView.AutoSelectFirstItem); }
-            set { _stacktraceView.AutoSelectFirstItem = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets a value defining the order of the item in the error list.
-        /// </summary>
-        public ErrorListOrderPolicy ListOrderPolicy
-        {
-            get { return (_stacktraceView.ListOrderPolicy); }
-            set { _stacktraceView.ListOrderPolicy = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the splitter orientation in the SourceCodeDisplay.
-        /// </summary>
-        public Orientation SplitOrientation
-        {
-            get { return (_splitter.Orientation); }
-            set { _splitter.Orientation = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the splitter distance in the SourceCodeDisplay.
-        /// </summary>
-        public float SplitterDistance
-        {
-            get { return (_splitter.SplitterDistance); }
-            set { _splitter.SplitterDistance = value; }
-        }
-
-        private void OnClick(object sender, EventArgs e)
-        {
-            ListOrderPolicy = ListOrderPolicy == ErrorListOrderPolicy.InitialOrder ?
-                ErrorListOrderPolicy.ReverseOrder :
-                ErrorListOrderPolicy.InitialOrder;
-
-            return;
-        }
-
-        protected void SelectedItemChanged(object sender, EventArgs e)
-        {
-            ErrorItem item;
-            IFormatterCatalog formatter;
-
-            item = _stacktraceView.SelectedItem;
-
-            if (item == null)
-            {
-                _codeView.Text = null;
-                return;
-            }
-
-            formatter = _codeView.Formatter;
-            _codeView.Language = formatter.LanguageFromExtension(item.FileExtension);
-
-            try
-            {
-                _codeView.Text = item.ReadFile();
-            }
-            catch (Exception ex)
-            {
-                _codeView.Text = String.Format(
-                    "Cannot open file: '{0}'\r\nError: '{1}'\r\n",
-                    item.Path, ex.Message);
-            }
-
-            _codeView.CurrentLine = item.LineNumber - 1;
-
-            return;
-        }
-
-        #region IErrorDisplay Membres
-
-        public ToolStripButton PluginItem
-        {
-            get { return (_btnPlugin); }
-        }
-
-        public ToolStripItem[] OptionItems
-        {
-            get { return (new ToolStripItem[] { _btnSwap }); }
-        }             
-
-        public Control Content
-        {
-            get { return (_splitter); }
-        }
-
-        public void OnStackTraceChanged(string stackTrace)
-        {
-            _stacktraceView.StackTrace = stackTrace;
-        }
-
-        #endregion        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.UiException.Properties;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements IErrorDisplay and displays data about failures and error
+    /// after a test suite run. SourceCodeDisplay is a control composed of two
+    /// views. 
+    /// 
+    /// The first view displays the stack trace in an ordered list of items
+    /// where each item contains the context about a specific failure (file, class
+    /// method, line number).
+    /// 
+    /// The second view displays a CodeBox control and shows the source code
+    /// of one element in this list when the localization is available.
+    /// </summary>
+    public class SourceCodeDisplay :
+        IErrorDisplay
+    {
+        protected IStackTraceView _stacktraceView;
+        protected ICodeView _codeView;
+        protected SplitterBox _splitter;
+        private CodeBox _codeBox;
+
+        private ToolStripButton _btnPlugin;
+        private ToolStripButton _btnSwap;
+
+        public event EventHandler SplitOrientationChanged;
+        public event EventHandler SplitterDistanceChanged;
+
+        /// <summary>
+        /// Builds a new instance of SourceCodeDisplay.
+        /// </summary>
+        public SourceCodeDisplay()
+        {
+            ErrorList errorList = new ErrorList();
+            _codeBox = new CodeBox();
+
+            _stacktraceView = errorList;
+            _stacktraceView.AutoSelectFirstItem = true;
+            _stacktraceView.SelectedItemChanged += new EventHandler(SelectedItemChanged);
+            _codeView = _codeBox;
+
+            _btnPlugin = ErrorToolbar.NewStripButton(true, "Display source code context", Resources.ImageSourceCodeDisplay, null);
+            _btnSwap = ErrorToolbar.NewStripButton(false, "ReverseOrder item order", Resources.ImageReverseItemOrder, OnClick);
+
+            SplitterBox splitter = new SplitterBox();
+            _splitter = splitter;
+            _splitter.SplitterDistanceChanged += new EventHandler(_splitter_DistanceChanged);
+            _splitter.OrientationChanged += new EventHandler(_splitter_OrientationChanged);
+
+            splitter.Control1 = errorList;
+            splitter.Control2 = _codeBox;
+
+            _codeBox.ShowCurrentLine = true;
+
+            return;
+        }
+
+        void _splitter_DistanceChanged(object sender, EventArgs e)
+        {
+            if (SplitterDistanceChanged != null)
+                SplitterDistanceChanged(sender, e);
+        }
+
+        void _splitter_OrientationChanged(object sender, EventArgs e)
+        {
+            if (SplitOrientationChanged != null)
+                SplitOrientationChanged(sender, e);
+        }
+
+        public Font CodeDisplayFont
+        {
+            get { return _codeBox.Font; }
+            set { _codeBox.Font = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value telling whether or not to select automatically
+        /// the first localizable item each time the stack trace changes.
+        ///   When set to true, the first localizable item will be selected 
+        /// and the source code context for this item displayed automatically.
+        /// Default is True.
+        /// </summary>
+        public bool AutoSelectFirstItem
+        {
+            get { return (_stacktraceView.AutoSelectFirstItem); }
+            set { _stacktraceView.AutoSelectFirstItem = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value defining the order of the item in the error list.
+        /// </summary>
+        public ErrorListOrderPolicy ListOrderPolicy
+        {
+            get { return (_stacktraceView.ListOrderPolicy); }
+            set { _stacktraceView.ListOrderPolicy = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the splitter orientation in the SourceCodeDisplay.
+        /// </summary>
+        public Orientation SplitOrientation
+        {
+            get { return (_splitter.Orientation); }
+            set { _splitter.Orientation = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the splitter distance in the SourceCodeDisplay.
+        /// </summary>
+        public float SplitterDistance
+        {
+            get { return (_splitter.SplitterDistance); }
+            set { _splitter.SplitterDistance = value; }
+        }
+
+        private void OnClick(object sender, EventArgs e)
+        {
+            ListOrderPolicy = ListOrderPolicy == ErrorListOrderPolicy.InitialOrder ?
+                ErrorListOrderPolicy.ReverseOrder :
+                ErrorListOrderPolicy.InitialOrder;
+
+            return;
+        }
+
+        protected void SelectedItemChanged(object sender, EventArgs e)
+        {
+            ErrorItem item;
+            IFormatterCatalog formatter;
+
+            item = _stacktraceView.SelectedItem;
+
+            if (item == null)
+            {
+                _codeView.Text = null;
+                return;
+            }
+
+            formatter = _codeView.Formatter;
+            _codeView.Language = formatter.LanguageFromExtension(item.FileExtension);
+
+            try
+            {
+                _codeView.Text = item.ReadFile();
+            }
+            catch (Exception ex)
+            {
+                _codeView.Text = String.Format(
+                    "Cannot open file: '{0}'\r\nError: '{1}'\r\n",
+                    item.Path, ex.Message);
+            }
+
+            _codeView.CurrentLine = item.LineNumber - 1;
+
+            return;
+        }
+
+        #region IErrorDisplay Membres
+
+        public ToolStripButton PluginItem
+        {
+            get { return (_btnPlugin); }
+        }
+
+        public ToolStripItem[] OptionItems
+        {
+            get { return (new ToolStripItem[] { _btnSwap }); }
+        }             
+
+        public Control Content
+        {
+            get { return (_splitter); }
+        }
+
+        public void OnStackTraceChanged(string stackTrace)
+        {
+            _stacktraceView.StackTrace = stackTrace;
+        }
+
+        #endregion        
+    }
+}
diff --git a/src/GuiException/UiException/Controls/SplitterBox.cs b/src/GuiException/UiException/Controls/SplitterBox.cs
index ce3036c..514e339 100644
--- a/src/GuiException/UiException/Controls/SplitterBox.cs
+++ b/src/GuiException/UiException/Controls/SplitterBox.cs
@@ -1,517 +1,517 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Drawing;
-using NUnit.UiException.Properties;
-using System.Diagnostics;
-
-//
-// This re-implements SplitContainer. Why re-inventing the wheel?
-// Well... I faced some strange behaviors in SplitContainer in particular
-// when I started to provide a custom paint method. It seems to me
-// that there is a kind of defect that affects how the Invalidate or
-// paint event is called. In some situations I faced a SplitContainer
-// that didn't redraw itself while having some parts of its window
-// dirty. I didn't found out the cause of the problem.
-//
-// Another feature that is quite annoying is the unability to change
-// the mouse cursor while hovering some special areas of the splitter
-// bar. Maybe there is a trick or something but the normal way doesn't
-// look like to work.
-//
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Implements a place holder that can be splitted either horizontally or vertically.
-    /// The SplitterBox is layouted with two place holders, respectively named Control1
-    /// and Control2 where clients can put their controls.
-    /// 
-    /// Unlike SplitContainer, the place holders in SplitterBox are the client controls
-    /// itself. The direct consequence is the layout policy will be to dock the client
-    /// controls in filling the maximum possible space.
-    /// 
-    /// SplitterBox also add three buttons on the splitter bar that to change the split
-    /// orientation and collapse either Control1 or Control2. The example below shows
-    /// how to intialize and set up SplitterBox with two controls.
-    /// <code>
-    /// // creates a new SplitterBox, with a vertical split
-    /// // and position splitter to appear in the middle of the window
-    /// SplitterBox splitter = new SplitterBox();
-    /// splitter.Orientation = Orientation.Vertical;
-    /// splitter.SplitterDistance = 0.5f;
-    /// splitter.Control1 = oneControl;
-    /// splitter.Control2 = anotherControl;
-    /// </code>
-    /// </summary>
-    public class SplitterBox : Control
-    {
-        public static readonly int SPLITTER_SIZE = 9;
-        public static readonly int SPLITTER_HALFSIZE = SPLITTER_SIZE / 2;
-        public static readonly int BUTTON_SIZE = 13;
-        
-        private Control _emptyControl1;
-        private Control _emptyControl2;
-
-        private Control _control1;
-        private Control _control2;
-
-        private Orientation _orientation;        
-        private float _x;
-        private float _y;
-
-        private Rectangle _splitterRectangle;
-        private Rectangle _collapse1Rectangle;
-        private Rectangle _collapse2Rectangle;
-        private Rectangle _directionRectangle;
-
-        private bool _movingSplitter;
-
-        private Brush _brush;
-        private Pen _pen;
-
-        private Rectangle _rVerticalCollapse1;
-        private Rectangle _rVerticalDirection;
-        private Rectangle _rVerticalCollapse2;
-
-        private Rectangle _rHorizontalCollapse1;
-        private Rectangle _rHorizontalDirection;
-        private Rectangle _rHorizontalCollapse2;
-
-        public event EventHandler OrientationChanged;
-        public event EventHandler SplitterDistanceChanged;
-
-        /// <summary>
-        /// Creates a new SplitterBox.
-        /// </summary>
-        public SplitterBox()
-        {
-            _brush = new SolidBrush(Color.FromArgb(146, 180, 224));
-            _pen = new Pen(Color.FromArgb(103, 136, 190));
-
-            _rVerticalCollapse1 = new Rectangle(0, 0, 9, 13);
-            _rVerticalDirection = new Rectangle(10, 0, 9, 13);
-            _rVerticalCollapse2 = new Rectangle(20, 0, 9, 13);
-
-            _rHorizontalCollapse1 = new Rectangle(0, 24, 13, 9);
-            _rHorizontalDirection = new Rectangle(14, 14, 13, 9);
-            _rHorizontalCollapse2 = new Rectangle(0, 14, 13, 9);     
-
-            _emptyControl1 = new Control();
-            _emptyControl2 = new Control();
-
-            Width = 150;
-            Height = 150;
-
-            _control1 = _emptyControl1;
-            _control2 = _emptyControl2;
-
-            Controls.Add(_control1);
-            Controls.Add(_control2);
-
-            _x = _y = 0.5f;
-
-            Orientation = Orientation.Vertical;
-
-            DoLayout();
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets or sets the orientation of the splitter in the SplitterBox.
-        /// </summary>
-        public Orientation Orientation
-        {
-            get { return (_orientation); }
-            set { 
-                _orientation = value;
-                DoLayout();
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the splitter distance expressed as a float number in the
-        /// range [0 - 1]. A value of 0 collapses Control1 and makes Control2 take
-        /// the whole space in the window. A value of 1 collapses Control2 and makes
-        /// Control1 take the whole space in the window. A value of 0.5 makes the
-        /// splitter appear in the middle of the window.
-        /// 
-        /// Values that don't fall in [0 - 1] are automatically clipped to this range.
-        /// </summary>
-        public float SplitterDistance
-        {
-            get { return (_orientation == Orientation.Vertical ? _x : _y); }
-            set {
-                value = Math.Max(0, Math.Min(1, value));
-                if (_orientation == Orientation.Vertical)
-                    _x = value;
-                else
-                    _y = value;
-                DoLayout();
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the "first" control to be shown. This control will appear
-        /// either at the top or on the left when the orientation is respectively
-        /// vertical or horizontal.
-        ///   If the value is not null, the control will automatically be added
-        /// to the SplitterBox's hierarchy of controls.
-        ///   If the value is null, the former control is removed and replaced
-        /// by a default and empty area.
-        /// </summary>
-        public Control Control1
-        {
-            get { return (_control1); }
-            set 
-            {
-                if (_control1 == value)
-                    return;
-
-                Controls.Remove(_control1);
-                if (value == null)
-                    value = _emptyControl1;
-                _control1 = value;
-                Controls.Add(value);
-                DoLayout();
-
-                return;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the "second" control to be shown. This control will appear
-        /// either at the bottom or on the right when the orientation is respectively
-        /// vertical or horizontal.
-        ///   If the value is not null, the control will automatically be added
-        /// to the SplitterBox's hierarchy of controls.
-        ///   If the value is null, the former control is removed and replaced
-        /// by a default and empty area.
-        /// </summary>
-        public Control Control2
-        {
-            get { return (_control2); }
-            set 
-            {
-                if (_control2 == value)
-                    return;
-
-                if (value == null)
-                    value = _emptyControl2;
-
-                Controls.Remove(_control2);
-                _control2 = value;
-                Controls.Add(value);
-                DoLayout();
-
-                return;
-            }
-        }
-
-        /// <summary>
-        /// Gets the rectangle occupied with the splitter.
-        /// </summary>
-        public Rectangle SplitterRectangle
-        {
-            get { return (_splitterRectangle); }            
-        }
-
-        /// <summary>
-        /// Sets a new location for the splitter expressed as client coordinate.
-        /// </summary>
-        /// <param name="x">The new location in pixels when orientation is set to Vertical.</param>
-        /// <param name="y">The new location in pixels when orientation is set to Horizontal.</param>
-        public void PointToSplit(int x, int y)
-        {
-            if (_orientation == Orientation.Vertical)
-            {
-                x = Math.Max(0, Math.Min(Width, x));
-                _x = (float)x / (float)Width;
-            }
-            else
-            {
-                y = Math.Max(0, Math.Min(Height, y));
-                _y = (float)y / (float)Height;
-            }
-
-            DoLayout();
-
-            return;
-        }
-
-        /// <summary>
-        /// Collapses Control1.
-        /// </summary>
-        public void CollapseControl1()
-        {
-            PointToSplit(0, 0);
-        }
-
-        /// <summary>
-        /// Collapses Control2.
-        /// </summary>
-        public void CollapseControl2()
-        {
-            PointToSplit(Width, Height);
-        }
-
-        protected Rectangle Collapse1Rectangle
-        {
-            get { return (_collapse1Rectangle); }
-        }
-
-        protected Rectangle Collapse2Rectangle
-        {
-            get { return (_collapse2Rectangle); }
-        }
-
-        protected Rectangle DirectionRectangle
-        {
-            get { return (_directionRectangle); }
-        }        
-
-        private void HorizontalLayout()
-        {
-            int x = (Width - 41) / 2;
-            int y;
-            int top;
-
-            top = (int)Math.Max(0, _y * Height - SPLITTER_HALFSIZE);
-            top = Math.Min(top, Height - SPLITTER_SIZE);
-
-            _splitterRectangle = new Rectangle(0, top, Width, SPLITTER_SIZE);
-
-            y = _splitterRectangle.Top;
-
-            _collapse1Rectangle = new Rectangle(x, y, BUTTON_SIZE, SPLITTER_SIZE);
-            _directionRectangle = new Rectangle(_collapse1Rectangle.Right + 2, y, BUTTON_SIZE, SPLITTER_SIZE);
-            _collapse2Rectangle = new Rectangle(_directionRectangle.Right + 2, y, BUTTON_SIZE, SPLITTER_SIZE);
-
-            _control1.SetBounds(0, 0, Width, _splitterRectangle.Top);
-            _control2.SetBounds(0, _splitterRectangle.Bottom, Width, Height - _splitterRectangle.Bottom);
-
-            return;
-        }
-
-        private void VerticalLayout()
-        {
-            int y = (Height - 41) / 2;
-            int left;
-            int x;
-
-            left = (int)Math.Max(0, _x * Width - SPLITTER_HALFSIZE);
-            left = Math.Min(left, Width - SPLITTER_SIZE);
-
-            _splitterRectangle = new Rectangle(left, 0, SPLITTER_SIZE, Height);
-
-            x = _splitterRectangle.Left;
-
-            _collapse1Rectangle = new Rectangle(x, y, SPLITTER_SIZE, BUTTON_SIZE);
-            _directionRectangle = new Rectangle(x, _collapse1Rectangle.Bottom + 2, SPLITTER_SIZE, BUTTON_SIZE);
-            _collapse2Rectangle = new Rectangle(x, _directionRectangle.Bottom + 2, SPLITTER_SIZE, BUTTON_SIZE);
-
-            _control1.SetBounds(0, 0, _splitterRectangle.Left, Height);
-            _control2.SetBounds(_splitterRectangle.Right, 0, Width - _splitterRectangle.Right, Height);
-
-            return;
-        }
-
-        private void DoLayout()
-        {
-            if (_orientation == Orientation.Vertical)
-                VerticalLayout();
-            else
-                HorizontalLayout();
-
-            Invalidate();
-
-            return;
-        }
-
-        protected override void OnSizeChanged(EventArgs e)
-        {
-            if (_control1 != null)
-                DoLayout();
-            base.OnSizeChanged(e);
-        }
-
-        protected override void OnMouseLeave(EventArgs e)
-        {
-            Cursor = Cursors.Default;
-            base.OnMouseLeave(e);
-        }
-
-        protected override void OnMouseDown(MouseEventArgs e)
-        {
-            UpdateCursor(e.X, e.Y);
-
-            if (_splitterRectangle.Contains(e.X, e.Y))
-            {
-                if (HoveringButtons(e.X, e.Y))
-                    return;
-
-                _movingSplitter = true;
-            }
-
-            base.OnMouseDown(e);
-
-            return;
-        }
-
-        protected override void OnMouseMove(MouseEventArgs e)
-        {
-            UpdateCursor(e.X, e.Y);
-
-            if (_movingSplitter == true)
-            {                
-                PointToSplit(e.X, e.Y);
-                Invalidate();
-            }
-
-            base.OnMouseMove(e);
-
-            return;
-        }
-
-        protected override void OnMouseUp(MouseEventArgs e)
-        {
-            bool wasMovingSplitter;
-
-            UpdateCursor(e.X, e.Y);
-
-            wasMovingSplitter = _movingSplitter;
-            _movingSplitter = false;
-
-            if (wasMovingSplitter)
-                FireSplitterDistanceChanged();
-            else
-            {
-                if (_collapse1Rectangle.Contains(e.X, e.Y))
-                {
-                    CollapseControl1();
-                    FireSplitterDistanceChanged();
-                    return;
-                }
-
-                if (_collapse2Rectangle.Contains(e.X, e.Y))
-                {
-                    CollapseControl2();
-                    FireSplitterDistanceChanged();
-                    return;
-                }
-
-                if (_directionRectangle.Contains(e.X, e.Y))
-                {
-                    Orientation = (_orientation == Orientation.Vertical) ?
-                            Orientation.Horizontal :
-                            Orientation.Vertical;
-
-                    FireOrientationChanged();
-
-                    return;
-                }
-            }
-
-            base.OnMouseUp(e);
-
-            return;
-        }
-
-        private void FireOrientationChanged()
-        {
-            if (OrientationChanged != null)
-                OrientationChanged(this, EventArgs.Empty);
-        }
-
-        private void FireSplitterDistanceChanged()
-        {
-            if (SplitterDistanceChanged != null)
-                SplitterDistanceChanged(this, EventArgs.Empty);
-        }
-
-        protected override void OnPaint(PaintEventArgs e)
-        {
-            e.Graphics.FillRectangle(_brush, _splitterRectangle);
-
-            if (Orientation == Orientation.Vertical)
-            {
-                e.Graphics.DrawLine(_pen, _splitterRectangle.Left, 0,
-                    SplitterRectangle.Left, _splitterRectangle.Height);
-                e.Graphics.DrawLine(_pen, _splitterRectangle.Right - 1, 0,
-                    SplitterRectangle.Right - 1, _splitterRectangle.Height);
-
-                e.Graphics.DrawImage(Resources.ImageSplitterBox,
-                    _collapse1Rectangle,
-                    _rVerticalCollapse1,
-                    GraphicsUnit.Pixel);
-
-                e.Graphics.DrawImage(Resources.ImageSplitterBox,
-                    _directionRectangle,
-                    _rVerticalDirection,
-                    GraphicsUnit.Pixel);
-
-                e.Graphics.DrawImage(Resources.ImageSplitterBox,
-                    _collapse2Rectangle,
-                    _rVerticalCollapse2,
-                    GraphicsUnit.Pixel);
-            }
-            else
-            {
-                e.Graphics.DrawLine(_pen, 0, _splitterRectangle.Top,
-                    Width, _splitterRectangle.Top);
-                e.Graphics.DrawLine(_pen, 0, _splitterRectangle.Bottom - 1,
-                    Width, _splitterRectangle.Bottom - 1);
-
-                e.Graphics.DrawImage(Resources.ImageSplitterBox,
-                    _collapse1Rectangle,
-                    _rHorizontalCollapse1,
-                    GraphicsUnit.Pixel);
-
-                e.Graphics.DrawImage(Resources.ImageSplitterBox,
-                    _directionRectangle,
-                    _rHorizontalDirection,
-                    GraphicsUnit.Pixel);
-
-                e.Graphics.DrawImage(Resources.ImageSplitterBox,
-                    _collapse2Rectangle,
-                    _rHorizontalCollapse2,
-                    GraphicsUnit.Pixel);
-            }
-
-            base.OnPaint(e);
-
-            return;
-        }
-
-        private bool HoveringButtons(int x, int y)
-        {
-            if (!SplitterRectangle.Contains(x, y))
-                return (false);
-
-            return (_collapse1Rectangle.Contains(x, y) ||
-                    _collapse2Rectangle.Contains(x, y) ||
-                    _directionRectangle.Contains(x, y));
-        }
-
-        private void UpdateCursor(int x, int y)
-        {
-            if (!SplitterRectangle.Contains(x, y) ||
-                HoveringButtons(x, y))
-            {
-                Cursor = Cursors.Default;
-                return;
-            }
-
-            Cursor = (Orientation == Orientation.Vertical ? Cursors.VSplit : Cursors.HSplit);
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.UiException.Properties;
+using System.Diagnostics;
+
+//
+// This re-implements SplitContainer. Why re-inventing the wheel?
+// Well... I faced some strange behaviors in SplitContainer in particular
+// when I started to provide a custom paint method. It seems to me
+// that there is a kind of defect that affects how the Invalidate or
+// paint event is called. In some situations I faced a SplitContainer
+// that didn't redraw itself while having some parts of its window
+// dirty. I didn't found out the cause of the problem.
+//
+// Another feature that is quite annoying is the unability to change
+// the mouse cursor while hovering some special areas of the splitter
+// bar. Maybe there is a trick or something but the normal way doesn't
+// look like to work.
+//
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements a place holder that can be splitted either horizontally or vertically.
+    /// The SplitterBox is layouted with two place holders, respectively named Control1
+    /// and Control2 where clients can put their controls.
+    /// 
+    /// Unlike SplitContainer, the place holders in SplitterBox are the client controls
+    /// itself. The direct consequence is the layout policy will be to dock the client
+    /// controls in filling the maximum possible space.
+    /// 
+    /// SplitterBox also add three buttons on the splitter bar that to change the split
+    /// orientation and collapse either Control1 or Control2. The example below shows
+    /// how to intialize and set up SplitterBox with two controls.
+    /// <code>
+    /// // creates a new SplitterBox, with a vertical split
+    /// // and position splitter to appear in the middle of the window
+    /// SplitterBox splitter = new SplitterBox();
+    /// splitter.Orientation = Orientation.Vertical;
+    /// splitter.SplitterDistance = 0.5f;
+    /// splitter.Control1 = oneControl;
+    /// splitter.Control2 = anotherControl;
+    /// </code>
+    /// </summary>
+    public class SplitterBox : Control
+    {
+        public static readonly int SPLITTER_SIZE = 9;
+        public static readonly int SPLITTER_HALFSIZE = SPLITTER_SIZE / 2;
+        public static readonly int BUTTON_SIZE = 13;
+        
+        private Control _emptyControl1;
+        private Control _emptyControl2;
+
+        private Control _control1;
+        private Control _control2;
+
+        private Orientation _orientation;        
+        private float _x;
+        private float _y;
+
+        private Rectangle _splitterRectangle;
+        private Rectangle _collapse1Rectangle;
+        private Rectangle _collapse2Rectangle;
+        private Rectangle _directionRectangle;
+
+        private bool _movingSplitter;
+
+        private Brush _brush;
+        private Pen _pen;
+
+        private Rectangle _rVerticalCollapse1;
+        private Rectangle _rVerticalDirection;
+        private Rectangle _rVerticalCollapse2;
+
+        private Rectangle _rHorizontalCollapse1;
+        private Rectangle _rHorizontalDirection;
+        private Rectangle _rHorizontalCollapse2;
+
+        public event EventHandler OrientationChanged;
+        public event EventHandler SplitterDistanceChanged;
+
+        /// <summary>
+        /// Creates a new SplitterBox.
+        /// </summary>
+        public SplitterBox()
+        {
+            _brush = new SolidBrush(Color.FromArgb(146, 180, 224));
+            _pen = new Pen(Color.FromArgb(103, 136, 190));
+
+            _rVerticalCollapse1 = new Rectangle(0, 0, 9, 13);
+            _rVerticalDirection = new Rectangle(10, 0, 9, 13);
+            _rVerticalCollapse2 = new Rectangle(20, 0, 9, 13);
+
+            _rHorizontalCollapse1 = new Rectangle(0, 24, 13, 9);
+            _rHorizontalDirection = new Rectangle(14, 14, 13, 9);
+            _rHorizontalCollapse2 = new Rectangle(0, 14, 13, 9);     
+
+            _emptyControl1 = new Control();
+            _emptyControl2 = new Control();
+
+            Width = 150;
+            Height = 150;
+
+            _control1 = _emptyControl1;
+            _control2 = _emptyControl2;
+
+            Controls.Add(_control1);
+            Controls.Add(_control2);
+
+            _x = _y = 0.5f;
+
+            Orientation = Orientation.Vertical;
+
+            DoLayout();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets or sets the orientation of the splitter in the SplitterBox.
+        /// </summary>
+        public Orientation Orientation
+        {
+            get { return (_orientation); }
+            set { 
+                _orientation = value;
+                DoLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the splitter distance expressed as a float number in the
+        /// range [0 - 1]. A value of 0 collapses Control1 and makes Control2 take
+        /// the whole space in the window. A value of 1 collapses Control2 and makes
+        /// Control1 take the whole space in the window. A value of 0.5 makes the
+        /// splitter appear in the middle of the window.
+        /// 
+        /// Values that don't fall in [0 - 1] are automatically clipped to this range.
+        /// </summary>
+        public float SplitterDistance
+        {
+            get { return (_orientation == Orientation.Vertical ? _x : _y); }
+            set {
+                value = Math.Max(0, Math.Min(1, value));
+                if (_orientation == Orientation.Vertical)
+                    _x = value;
+                else
+                    _y = value;
+                DoLayout();
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the "first" control to be shown. This control will appear
+        /// either at the top or on the left when the orientation is respectively
+        /// vertical or horizontal.
+        ///   If the value is not null, the control will automatically be added
+        /// to the SplitterBox's hierarchy of controls.
+        ///   If the value is null, the former control is removed and replaced
+        /// by a default and empty area.
+        /// </summary>
+        public Control Control1
+        {
+            get { return (_control1); }
+            set 
+            {
+                if (_control1 == value)
+                    return;
+
+                Controls.Remove(_control1);
+                if (value == null)
+                    value = _emptyControl1;
+                _control1 = value;
+                Controls.Add(value);
+                DoLayout();
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the "second" control to be shown. This control will appear
+        /// either at the bottom or on the right when the orientation is respectively
+        /// vertical or horizontal.
+        ///   If the value is not null, the control will automatically be added
+        /// to the SplitterBox's hierarchy of controls.
+        ///   If the value is null, the former control is removed and replaced
+        /// by a default and empty area.
+        /// </summary>
+        public Control Control2
+        {
+            get { return (_control2); }
+            set 
+            {
+                if (_control2 == value)
+                    return;
+
+                if (value == null)
+                    value = _emptyControl2;
+
+                Controls.Remove(_control2);
+                _control2 = value;
+                Controls.Add(value);
+                DoLayout();
+
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Gets the rectangle occupied with the splitter.
+        /// </summary>
+        public Rectangle SplitterRectangle
+        {
+            get { return (_splitterRectangle); }            
+        }
+
+        /// <summary>
+        /// Sets a new location for the splitter expressed as client coordinate.
+        /// </summary>
+        /// <param name="x">The new location in pixels when orientation is set to Vertical.</param>
+        /// <param name="y">The new location in pixels when orientation is set to Horizontal.</param>
+        public void PointToSplit(int x, int y)
+        {
+            if (_orientation == Orientation.Vertical)
+            {
+                x = Math.Max(0, Math.Min(Width, x));
+                _x = (float)x / (float)Width;
+            }
+            else
+            {
+                y = Math.Max(0, Math.Min(Height, y));
+                _y = (float)y / (float)Height;
+            }
+
+            DoLayout();
+
+            return;
+        }
+
+        /// <summary>
+        /// Collapses Control1.
+        /// </summary>
+        public void CollapseControl1()
+        {
+            PointToSplit(0, 0);
+        }
+
+        /// <summary>
+        /// Collapses Control2.
+        /// </summary>
+        public void CollapseControl2()
+        {
+            PointToSplit(Width, Height);
+        }
+
+        protected Rectangle Collapse1Rectangle
+        {
+            get { return (_collapse1Rectangle); }
+        }
+
+        protected Rectangle Collapse2Rectangle
+        {
+            get { return (_collapse2Rectangle); }
+        }
+
+        protected Rectangle DirectionRectangle
+        {
+            get { return (_directionRectangle); }
+        }        
+
+        private void HorizontalLayout()
+        {
+            int x = (Width - 41) / 2;
+            int y;
+            int top;
+
+            top = (int)Math.Max(0, _y * Height - SPLITTER_HALFSIZE);
+            top = Math.Min(top, Height - SPLITTER_SIZE);
+
+            _splitterRectangle = new Rectangle(0, top, Width, SPLITTER_SIZE);
+
+            y = _splitterRectangle.Top;
+
+            _collapse1Rectangle = new Rectangle(x, y, BUTTON_SIZE, SPLITTER_SIZE);
+            _directionRectangle = new Rectangle(_collapse1Rectangle.Right + 2, y, BUTTON_SIZE, SPLITTER_SIZE);
+            _collapse2Rectangle = new Rectangle(_directionRectangle.Right + 2, y, BUTTON_SIZE, SPLITTER_SIZE);
+
+            _control1.SetBounds(0, 0, Width, _splitterRectangle.Top);
+            _control2.SetBounds(0, _splitterRectangle.Bottom, Width, Height - _splitterRectangle.Bottom);
+
+            return;
+        }
+
+        private void VerticalLayout()
+        {
+            int y = (Height - 41) / 2;
+            int left;
+            int x;
+
+            left = (int)Math.Max(0, _x * Width - SPLITTER_HALFSIZE);
+            left = Math.Min(left, Width - SPLITTER_SIZE);
+
+            _splitterRectangle = new Rectangle(left, 0, SPLITTER_SIZE, Height);
+
+            x = _splitterRectangle.Left;
+
+            _collapse1Rectangle = new Rectangle(x, y, SPLITTER_SIZE, BUTTON_SIZE);
+            _directionRectangle = new Rectangle(x, _collapse1Rectangle.Bottom + 2, SPLITTER_SIZE, BUTTON_SIZE);
+            _collapse2Rectangle = new Rectangle(x, _directionRectangle.Bottom + 2, SPLITTER_SIZE, BUTTON_SIZE);
+
+            _control1.SetBounds(0, 0, _splitterRectangle.Left, Height);
+            _control2.SetBounds(_splitterRectangle.Right, 0, Width - _splitterRectangle.Right, Height);
+
+            return;
+        }
+
+        private void DoLayout()
+        {
+            if (_orientation == Orientation.Vertical)
+                VerticalLayout();
+            else
+                HorizontalLayout();
+
+            Invalidate();
+
+            return;
+        }
+
+        protected override void OnSizeChanged(EventArgs e)
+        {
+            if (_control1 != null)
+                DoLayout();
+            base.OnSizeChanged(e);
+        }
+
+        protected override void OnMouseLeave(EventArgs e)
+        {
+            Cursor = Cursors.Default;
+            base.OnMouseLeave(e);
+        }
+
+        protected override void OnMouseDown(MouseEventArgs e)
+        {
+            UpdateCursor(e.X, e.Y);
+
+            if (_splitterRectangle.Contains(e.X, e.Y))
+            {
+                if (HoveringButtons(e.X, e.Y))
+                    return;
+
+                _movingSplitter = true;
+            }
+
+            base.OnMouseDown(e);
+
+            return;
+        }
+
+        protected override void OnMouseMove(MouseEventArgs e)
+        {
+            UpdateCursor(e.X, e.Y);
+
+            if (_movingSplitter == true)
+            {                
+                PointToSplit(e.X, e.Y);
+                Invalidate();
+            }
+
+            base.OnMouseMove(e);
+
+            return;
+        }
+
+        protected override void OnMouseUp(MouseEventArgs e)
+        {
+            bool wasMovingSplitter;
+
+            UpdateCursor(e.X, e.Y);
+
+            wasMovingSplitter = _movingSplitter;
+            _movingSplitter = false;
+
+            if (wasMovingSplitter)
+                FireSplitterDistanceChanged();
+            else
+            {
+                if (_collapse1Rectangle.Contains(e.X, e.Y))
+                {
+                    CollapseControl1();
+                    FireSplitterDistanceChanged();
+                    return;
+                }
+
+                if (_collapse2Rectangle.Contains(e.X, e.Y))
+                {
+                    CollapseControl2();
+                    FireSplitterDistanceChanged();
+                    return;
+                }
+
+                if (_directionRectangle.Contains(e.X, e.Y))
+                {
+                    Orientation = (_orientation == Orientation.Vertical) ?
+                            Orientation.Horizontal :
+                            Orientation.Vertical;
+
+                    FireOrientationChanged();
+
+                    return;
+                }
+            }
+
+            base.OnMouseUp(e);
+
+            return;
+        }
+
+        private void FireOrientationChanged()
+        {
+            if (OrientationChanged != null)
+                OrientationChanged(this, EventArgs.Empty);
+        }
+
+        private void FireSplitterDistanceChanged()
+        {
+            if (SplitterDistanceChanged != null)
+                SplitterDistanceChanged(this, EventArgs.Empty);
+        }
+
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            e.Graphics.FillRectangle(_brush, _splitterRectangle);
+
+            if (Orientation == Orientation.Vertical)
+            {
+                e.Graphics.DrawLine(_pen, _splitterRectangle.Left, 0,
+                    SplitterRectangle.Left, _splitterRectangle.Height);
+                e.Graphics.DrawLine(_pen, _splitterRectangle.Right - 1, 0,
+                    SplitterRectangle.Right - 1, _splitterRectangle.Height);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse1Rectangle,
+                    _rVerticalCollapse1,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _directionRectangle,
+                    _rVerticalDirection,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse2Rectangle,
+                    _rVerticalCollapse2,
+                    GraphicsUnit.Pixel);
+            }
+            else
+            {
+                e.Graphics.DrawLine(_pen, 0, _splitterRectangle.Top,
+                    Width, _splitterRectangle.Top);
+                e.Graphics.DrawLine(_pen, 0, _splitterRectangle.Bottom - 1,
+                    Width, _splitterRectangle.Bottom - 1);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse1Rectangle,
+                    _rHorizontalCollapse1,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _directionRectangle,
+                    _rHorizontalDirection,
+                    GraphicsUnit.Pixel);
+
+                e.Graphics.DrawImage(Resources.ImageSplitterBox,
+                    _collapse2Rectangle,
+                    _rHorizontalCollapse2,
+                    GraphicsUnit.Pixel);
+            }
+
+            base.OnPaint(e);
+
+            return;
+        }
+
+        private bool HoveringButtons(int x, int y)
+        {
+            if (!SplitterRectangle.Contains(x, y))
+                return (false);
+
+            return (_collapse1Rectangle.Contains(x, y) ||
+                    _collapse2Rectangle.Contains(x, y) ||
+                    _directionRectangle.Contains(x, y));
+        }
+
+        private void UpdateCursor(int x, int y)
+        {
+            if (!SplitterRectangle.Contains(x, y) ||
+                HoveringButtons(x, y))
+            {
+                Cursor = Cursors.Default;
+                return;
+            }
+
+            Cursor = (Orientation == Orientation.Vertical ? Cursors.VSplit : Cursors.HSplit);
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Controls/StackTraceDisplay.cs b/src/GuiException/UiException/Controls/StackTraceDisplay.cs
index e40a5d6..9766983 100644
--- a/src/GuiException/UiException/Controls/StackTraceDisplay.cs
+++ b/src/GuiException/UiException/Controls/StackTraceDisplay.cs
@@ -1,94 +1,94 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Windows.Forms;
-using System.Drawing;
-using NUnit.UiException.Properties;
-
-namespace NUnit.UiException.Controls
-{
-    /// <summary>
-    /// Implements IErrorDisplay to show the actual stack trace in a TextBox control.
-    /// </summary>
-    public class StackTraceDisplay :
-        UserControl,
-        IErrorDisplay
-    {
-        private TextBox _textContent;
-        private ToolStripButton _btnPlugin;
-        private ToolStripButton _btnCopy;
-
-        /// <summary>
-        /// Builds a new instance of StackTraceDisplay.
-        /// </summary>
-        public StackTraceDisplay()
-        {
-            _btnPlugin = ErrorToolbar.NewStripButton(true, "Display actual stack trace", Resources.ImageStackTraceDisplay, null);
-            _btnCopy = ErrorToolbar.NewStripButton(false, "Copy stack trace to clipboard", Resources.ImageCopyToClipboard, OnClick);
-
-            _textContent = new TextBox();
-            _textContent.ReadOnly = true;
-            _textContent.Multiline = true;
-            _textContent.ScrollBars = ScrollBars.Both;
-
-           return;
-        }
-
-        protected override void OnFontChanged(EventArgs e)
-        {
-            _textContent.Font = this.Font;
-
-            base.OnFontChanged(e);
-        }
-
-        /// <summary>
-        /// Copies the actual stack trace to the clipboard.
-        /// </summary>
-        public void CopyToClipBoard()
-        {
-            if (String.IsNullOrEmpty(_textContent.Text))
-            {
-                Clipboard.Clear();
-                return;
-            }
-
-            Clipboard.SetText(_textContent.Text);
-
-            return;
-        }
-
-        #region IErrorDisplay Membres
-
-        public ToolStripButton PluginItem
-        {
-            get { return (_btnPlugin); }
-        }
-
-        public ToolStripItem[] OptionItems
-        {
-            get { return (new ToolStripItem[] { _btnCopy }); }
-        }
-        
-        public Control Content
-        {
-            get { return (_textContent); }
-        }
-
-        public void OnStackTraceChanged(string stackTrace)
-        {
-            _textContent.Text = stackTrace;
-        }
-
-        #endregion
-
-        private void OnClick(object sender, EventArgs args)
-        {
-            CopyToClipBoard();
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing;
+using NUnit.UiException.Properties;
+
+namespace NUnit.UiException.Controls
+{
+    /// <summary>
+    /// Implements IErrorDisplay to show the actual stack trace in a TextBox control.
+    /// </summary>
+    public class StackTraceDisplay :
+        UserControl,
+        IErrorDisplay
+    {
+        private TextBox _textContent;
+        private ToolStripButton _btnPlugin;
+        private ToolStripButton _btnCopy;
+
+        /// <summary>
+        /// Builds a new instance of StackTraceDisplay.
+        /// </summary>
+        public StackTraceDisplay()
+        {
+            _btnPlugin = ErrorToolbar.NewStripButton(true, "Display actual stack trace", Resources.ImageStackTraceDisplay, null);
+            _btnCopy = ErrorToolbar.NewStripButton(false, "Copy stack trace to clipboard", Resources.ImageCopyToClipboard, OnClick);
+
+            _textContent = new TextBox();
+            _textContent.ReadOnly = true;
+            _textContent.Multiline = true;
+            _textContent.ScrollBars = ScrollBars.Both;
+
+           return;
+        }
+
+        protected override void OnFontChanged(EventArgs e)
+        {
+            _textContent.Font = this.Font;
+
+            base.OnFontChanged(e);
+        }
+
+        /// <summary>
+        /// Copies the actual stack trace to the clipboard.
+        /// </summary>
+        public void CopyToClipBoard()
+        {
+            if (String.IsNullOrEmpty(_textContent.Text))
+            {
+                Clipboard.Clear();
+                return;
+            }
+
+            Clipboard.SetText(_textContent.Text);
+
+            return;
+        }
+
+        #region IErrorDisplay Membres
+
+        public ToolStripButton PluginItem
+        {
+            get { return (_btnPlugin); }
+        }
+
+        public ToolStripItem[] OptionItems
+        {
+            get { return (new ToolStripItem[] { _btnCopy }); }
+        }
+        
+        public Control Content
+        {
+            get { return (_textContent); }
+        }
+
+        public void OnStackTraceChanged(string stackTrace)
+        {
+            _textContent.Text = stackTrace;
+        }
+
+        #endregion
+
+        private void OnClick(object sender, EventArgs args)
+        {
+            CopyToClipBoard();
+        }
+    }
+}
diff --git a/src/GuiException/UiException/DefaultTextManager.cs b/src/GuiException/UiException/DefaultTextManager.cs
index 74e529b..383e639 100644
--- a/src/GuiException/UiException/DefaultTextManager.cs
+++ b/src/GuiException/UiException/DefaultTextManager.cs
@@ -1,141 +1,141 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Collections;
-
-namespace NUnit.UiException
-{
-    /// <summary>
-    /// This is a default implementation of ITextManager interface.
-    /// </summary>
-    public class DefaultTextManager :
-        IEnumerable,
-        ITextManager
-    {
-        /// <summary>
-        /// Hold the text to be managed by this instance.
-        /// </summary>
-        private string _text;
-
-        /// <summary>
-        /// Array of strings where each string is a line in this text.
-        /// </summary>
-        private List<string> _lines;
-
-        /// <summary>
-        /// Stores the character count of the longest line in this text.
-        /// </summary>
-        private int _maxLength;
-
-        /// <summary>
-        /// Builds a new instance of TextManager.
-        /// </summary>
-        public DefaultTextManager()
-        {
-            _lines = new List<string>();
-            Text = "";
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets the number of lines in the text.
-        /// </summary>
-        public int LineCount
-        {
-            get { return (_lines.Count); }
-        }
-
-        /// <summary>
-        /// Gets or sets the text to be managed by this object.
-        /// </summary>
-        public string Text
-        {
-            get { return (_text); }
-            set
-            {
-                if (value == null)
-                    value = "";
-
-                _text = value;
-                _populateLineCollection(value);
-            }
-        }
-
-        /// <summary>
-        /// Gets the line of text at the specified startingPosition.
-        /// (zero based startingPosition).
-        /// </summary>
-        /// <param name="lineIndex">The startingPosition of the line to get.</param>
-        /// <returns>A string that represents the content of the specified line without
-        /// the trailing characters.</returns>
-        public string GetTextAt(int lineIndex)
-        {
-            return (_lines[lineIndex]);
-        }
-
-        /// <summary>
-        /// Gets the character count of the longest line in this text.
-        /// </summary>
-        public int MaxLength
-        {
-            get { return (_maxLength); }
-        }
-
-        #region private definitions
-
-        /// <summary>
-        /// setup member data with the input text.
-        /// </summary>
-        private void _populateLineCollection(string text)
-        {
-            string line;
-            int textIndex;
-            int newIndex;
-
-            textIndex = 0;
-
-            _lines.Clear();
-            _maxLength = 0;
-
-            while ((newIndex = text.IndexOf("\n", textIndex, StringComparison.Ordinal)) > textIndex)
-            {
-                line = text.Substring(textIndex, newIndex - textIndex).TrimEnd();
-                _maxLength = Math.Max(_maxLength, line.Length);
-
-                _lines.Add(line);
-                textIndex = newIndex + 1;
-            }
-
-            if (textIndex < text.Length)
-            {
-                line = text.Substring(textIndex).TrimEnd();
-                _maxLength = Math.Max(_maxLength, line.Length);
-                _lines.Add(line);
-            }
-
-            return;
-        }
-
-        #endregion
-
-        #region IEnumerable Membres
-
-        /// <summary>
-        /// Gets an IEnumerator that iterate through each line of the
-        /// current text. 
-        /// </summary>
-        /// <returns>An IEnumerator that iterate through each line of this text.</returns>
-        public IEnumerator GetEnumerator()
-        {
-            return (_lines.GetEnumerator());
-        }
-
-        #endregion      
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// This is a default implementation of ITextManager interface.
+    /// </summary>
+    public class DefaultTextManager :
+        IEnumerable,
+        ITextManager
+    {
+        /// <summary>
+        /// Hold the text to be managed by this instance.
+        /// </summary>
+        private string _text;
+
+        /// <summary>
+        /// Array of strings where each string is a line in this text.
+        /// </summary>
+        private List<string> _lines;
+
+        /// <summary>
+        /// Stores the character count of the longest line in this text.
+        /// </summary>
+        private int _maxLength;
+
+        /// <summary>
+        /// Builds a new instance of TextManager.
+        /// </summary>
+        public DefaultTextManager()
+        {
+            _lines = new List<string>();
+            Text = "";
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the number of lines in the text.
+        /// </summary>
+        public int LineCount
+        {
+            get { return (_lines.Count); }
+        }
+
+        /// <summary>
+        /// Gets or sets the text to be managed by this object.
+        /// </summary>
+        public string Text
+        {
+            get { return (_text); }
+            set
+            {
+                if (value == null)
+                    value = "";
+
+                _text = value;
+                _populateLineCollection(value);
+            }
+        }
+
+        /// <summary>
+        /// Gets the line of text at the specified startingPosition.
+        /// (zero based startingPosition).
+        /// </summary>
+        /// <param name="lineIndex">The startingPosition of the line to get.</param>
+        /// <returns>A string that represents the content of the specified line without
+        /// the trailing characters.</returns>
+        public string GetTextAt(int lineIndex)
+        {
+            return (_lines[lineIndex]);
+        }
+
+        /// <summary>
+        /// Gets the character count of the longest line in this text.
+        /// </summary>
+        public int MaxLength
+        {
+            get { return (_maxLength); }
+        }
+
+        #region private definitions
+
+        /// <summary>
+        /// setup member data with the input text.
+        /// </summary>
+        private void _populateLineCollection(string text)
+        {
+            string line;
+            int textIndex;
+            int newIndex;
+
+            textIndex = 0;
+
+            _lines.Clear();
+            _maxLength = 0;
+
+            while ((newIndex = text.IndexOf("\n", textIndex, StringComparison.Ordinal)) > textIndex)
+            {
+                line = text.Substring(textIndex, newIndex - textIndex).TrimEnd();
+                _maxLength = Math.Max(_maxLength, line.Length);
+
+                _lines.Add(line);
+                textIndex = newIndex + 1;
+            }
+
+            if (textIndex < text.Length)
+            {
+                line = text.Substring(textIndex).TrimEnd();
+                _maxLength = Math.Max(_maxLength, line.Length);
+                _lines.Add(line);
+            }
+
+            return;
+        }
+
+        #endregion
+
+        #region IEnumerable Membres
+
+        /// <summary>
+        /// Gets an IEnumerator that iterate through each line of the
+        /// current text. 
+        /// </summary>
+        /// <returns>An IEnumerator that iterate through each line of this text.</returns>
+        public IEnumerator GetEnumerator()
+        {
+            return (_lines.GetEnumerator());
+        }
+
+        #endregion      
+    }
+}
diff --git a/src/GuiException/UiException/ExceptionItem.cs b/src/GuiException/UiException/ExceptionItem.cs
index 4b772a0..df568d0 100644
--- a/src/GuiException/UiException/ExceptionItem.cs
+++ b/src/GuiException/UiException/ExceptionItem.cs
@@ -1,252 +1,252 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.IO;
-
-namespace NUnit.UiException
-{    
-    /// <summary>
-    /// (Formerly named ExceptionItem)
-    /// 
-    /// This is the output analysis of one error line coming from
-    /// a stack trace that still gathers the same data but in more
-    /// convenient way to be read from.
-    ///   An ErrorItem represents one error with possible location
-    /// informations such as:
-    ///   - filename where the error has occured
-    ///   - file's line number
-    ///   - method name
-    /// </summary>
-    public class ErrorItem
-    {
-        /// <summary>
-        /// An access path to the source file referred by this item.
-        /// </summary>
-        private string _path;
-
-        /// <summary>
-        /// The full qualified name of the member method referred by this item.
-        /// </summary>
-        private string _fullyQualifiedMethodName;
-
-        /// <summary>
-        /// The line index where the exception occured.
-        /// </summary>
-        private int _line;
-
-        /// <summary>
-        /// Store the content of the file pointed by _path.
-        /// </summary>
-        private string _text;
-      
-        /// <summary>
-        /// Create an instance of ErrorItem that
-        /// has source code attachments.
-        /// </summary>
-        public ErrorItem(string path, int lineNumber)
-        {
-            UiExceptionHelper.CheckNotNull(path, "path");
-
-            _path = path;
-            _line = lineNumber;
-
-            return;
-        }
-
-        /// <summary>
-        /// Create a new exception item.
-        /// </summary>
-        /// <param name="path">An absolute path to the source code file.</param>
-        /// <param name="fullMethodName">A full qualified name of a member method.</param>
-        /// <param name="lineNumber">A line index where the exception occured.</param>
-        public ErrorItem(string path, string fullMethodName, int lineNumber)
-        {
-            _path = path;
-            _fullyQualifiedMethodName = fullMethodName;
-            _line = lineNumber;
-
-            return;
-        }
-
-        /// <summary>
-        /// Create an instance of ErrorItem that doesn't have
-        /// any source code attachments.
-        /// </summary>
-        public ErrorItem()
-        {
-            // nothing to do
-        }
-
-        /// <summary>
-        /// Reads and returns the part of Path that contains the filename
-        /// of the source code file.
-        /// </summary>
-        public string FileName 
-        {
-            get { return (System.IO.Path.GetFileName(_path)); }
-        }
-
-        /// <summary>
-        /// Gets the absolute path to the source code file.
-        /// </summary>
-        public string Path 
-        {
-            get { return (_path); }
-        }
-
-        /// <summary>
-        /// Returns the file language - e.g.: the string after
-        /// the last dot or null -
-        /// </summary>
-        public string FileExtension
-        {
-            get 
-            {
-                int dotIndex;
-
-                if (_path == null)
-                    return (null);
-
-                dotIndex = _path.LastIndexOf(".", StringComparison.Ordinal);
-                if (dotIndex > -1 && dotIndex < _path.Length - 1)
-                    return (_path.Substring(dotIndex + 1));
-
-                return (null); 
-            }
-        }
-
-        /// <summary>
-        /// Gets the full qualified name of the member method.
-        /// </summary>
-        public string FullyQualifiedMethodName
-        {
-            get { return (_fullyQualifiedMethodName); }
-        }
-
-        /// <summary>
-        /// Reads and return the method part from the FullyQualifiedMethodName.
-        /// The value contains the signature of the method.
-        /// </summary>
-        public string MethodName
-        {
-            get
-            {
-                int index;
-
-                if (FullyQualifiedMethodName == null)
-                    return ("");
-
-                if ((index = FullyQualifiedMethodName.LastIndexOf(".", 
-                            StringComparison.Ordinal)) == -1)
-                    return (FullyQualifiedMethodName);
-
-                return (FullyQualifiedMethodName.Substring(index + 1));
-            }
-        }
-
-        /// <summary>
-        /// Gets the method name without the argument list.
-        /// </summary>
-        public string BaseMethodName
-        {
-            get
-            {
-                string method = MethodName;
-                int index = method.IndexOf("(", StringComparison.Ordinal);
-
-                if (index > 0)
-                    return (method.Substring(0, index));
-
-                return (method);
-            }
-        }
-
-        /// <summary>
-        /// Reads and returns the class part from the FullyQualifiedMethodName.
-        /// </summary>
-        public string ClassName
-        {
-            get
-            {
-                int end_index;
-                int start_index;
-
-                if (FullyQualifiedMethodName == null)
-                    return ("");
-
-                if ((end_index = FullyQualifiedMethodName.LastIndexOf(".", 
-                                StringComparison.Ordinal)) == -1)
-                    return ("");
-
-                start_index = end_index - 1;
-                while (start_index > 0 && FullyQualifiedMethodName[start_index] != '.')
-                    start_index--;
-
-                if (start_index >= 0 && FullyQualifiedMethodName[start_index] == '.')
-                    start_index++;
-
-                return (FullyQualifiedMethodName.Substring(start_index, end_index - start_index));
-            }
-        }
-
-        /// <summary>
-        /// Gets the line number where the exception occured.
-        /// </summary>
-        public int LineNumber 
-        {
-            get { return (_line); }
-        }
-
-        /// <summary>
-        /// Gets a boolean that says whether this item has source
-        /// code localization attachments.
-        /// </summary>
-        public bool HasSourceAttachment {
-            get { return (_path != null); }
-        }
-
-        /// <summary>
-        /// Read and return the content of the underlying file. If the file
-        /// cannot be found or read an exception is raised.
-        /// </summary>
-        public string ReadFile()
-        {
-            if (!System.IO.File.Exists(_path))
-                throw new FileNotFoundException("File does not exist. File: " + _path);
-
-            if (_text == null)
-            {
-                StreamReader rder = new StreamReader(_path);
-                _text = rder.ReadToEnd();
-                rder.Close();
-            }
-
-            return (_text);
-        }
-
-        public override string ToString() {
-            return ("TraceItem: {'" + _path + "', " + _fullyQualifiedMethodName + ", " + _line + "}");
-        }
-
-        public override bool Equals(object obj)
-        {
-            ErrorItem item = obj as ErrorItem;
-
-            if (item == null)
-                return (false);
-
-            return (_path == item._path &&
-                    _fullyQualifiedMethodName == item._fullyQualifiedMethodName &&
-                    _line == item._line);
-        }
-
-        public override int GetHashCode() {
-            return base.GetHashCode();
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+
+namespace NUnit.UiException
+{    
+    /// <summary>
+    /// (Formerly named ExceptionItem)
+    /// 
+    /// This is the output analysis of one error line coming from
+    /// a stack trace that still gathers the same data but in more
+    /// convenient way to be read from.
+    ///   An ErrorItem represents one error with possible location
+    /// informations such as:
+    ///   - filename where the error has occured
+    ///   - file's line number
+    ///   - method name
+    /// </summary>
+    public class ErrorItem
+    {
+        /// <summary>
+        /// An access path to the source file referred by this item.
+        /// </summary>
+        private string _path;
+
+        /// <summary>
+        /// The full qualified name of the member method referred by this item.
+        /// </summary>
+        private string _fullyQualifiedMethodName;
+
+        /// <summary>
+        /// The line index where the exception occured.
+        /// </summary>
+        private int _line;
+
+        /// <summary>
+        /// Store the content of the file pointed by _path.
+        /// </summary>
+        private string _text;
+      
+        /// <summary>
+        /// Create an instance of ErrorItem that
+        /// has source code attachments.
+        /// </summary>
+        public ErrorItem(string path, int lineNumber)
+        {
+            UiExceptionHelper.CheckNotNull(path, "path");
+
+            _path = path;
+            _line = lineNumber;
+
+            return;
+        }
+
+        /// <summary>
+        /// Create a new exception item.
+        /// </summary>
+        /// <param name="path">An absolute path to the source code file.</param>
+        /// <param name="fullMethodName">A full qualified name of a member method.</param>
+        /// <param name="lineNumber">A line index where the exception occured.</param>
+        public ErrorItem(string path, string fullMethodName, int lineNumber)
+        {
+            _path = path;
+            _fullyQualifiedMethodName = fullMethodName;
+            _line = lineNumber;
+
+            return;
+        }
+
+        /// <summary>
+        /// Create an instance of ErrorItem that doesn't have
+        /// any source code attachments.
+        /// </summary>
+        public ErrorItem()
+        {
+            // nothing to do
+        }
+
+        /// <summary>
+        /// Reads and returns the part of Path that contains the filename
+        /// of the source code file.
+        /// </summary>
+        public string FileName 
+        {
+            get { return (System.IO.Path.GetFileName(_path)); }
+        }
+
+        /// <summary>
+        /// Gets the absolute path to the source code file.
+        /// </summary>
+        public string Path 
+        {
+            get { return (_path); }
+        }
+
+        /// <summary>
+        /// Returns the file language - e.g.: the string after
+        /// the last dot or null -
+        /// </summary>
+        public string FileExtension
+        {
+            get 
+            {
+                int dotIndex;
+
+                if (_path == null)
+                    return (null);
+
+                dotIndex = _path.LastIndexOf(".", StringComparison.Ordinal);
+                if (dotIndex > -1 && dotIndex < _path.Length - 1)
+                    return (_path.Substring(dotIndex + 1));
+
+                return (null); 
+            }
+        }
+
+        /// <summary>
+        /// Gets the full qualified name of the member method.
+        /// </summary>
+        public string FullyQualifiedMethodName
+        {
+            get { return (_fullyQualifiedMethodName); }
+        }
+
+        /// <summary>
+        /// Reads and return the method part from the FullyQualifiedMethodName.
+        /// The value contains the signature of the method.
+        /// </summary>
+        public string MethodName
+        {
+            get
+            {
+                int index;
+
+                if (FullyQualifiedMethodName == null)
+                    return ("");
+
+                if ((index = FullyQualifiedMethodName.LastIndexOf(".", 
+                            StringComparison.Ordinal)) == -1)
+                    return (FullyQualifiedMethodName);
+
+                return (FullyQualifiedMethodName.Substring(index + 1));
+            }
+        }
+
+        /// <summary>
+        /// Gets the method name without the argument list.
+        /// </summary>
+        public string BaseMethodName
+        {
+            get
+            {
+                string method = MethodName;
+                int index = method.IndexOf("(", StringComparison.Ordinal);
+
+                if (index > 0)
+                    return (method.Substring(0, index));
+
+                return (method);
+            }
+        }
+
+        /// <summary>
+        /// Reads and returns the class part from the FullyQualifiedMethodName.
+        /// </summary>
+        public string ClassName
+        {
+            get
+            {
+                int end_index;
+                int start_index;
+
+                if (FullyQualifiedMethodName == null)
+                    return ("");
+
+                if ((end_index = FullyQualifiedMethodName.LastIndexOf(".", 
+                                StringComparison.Ordinal)) == -1)
+                    return ("");
+
+                start_index = end_index - 1;
+                while (start_index > 0 && FullyQualifiedMethodName[start_index] != '.')
+                    start_index--;
+
+                if (start_index >= 0 && FullyQualifiedMethodName[start_index] == '.')
+                    start_index++;
+
+                return (FullyQualifiedMethodName.Substring(start_index, end_index - start_index));
+            }
+        }
+
+        /// <summary>
+        /// Gets the line number where the exception occured.
+        /// </summary>
+        public int LineNumber 
+        {
+            get { return (_line); }
+        }
+
+        /// <summary>
+        /// Gets a boolean that says whether this item has source
+        /// code localization attachments.
+        /// </summary>
+        public bool HasSourceAttachment {
+            get { return (_path != null); }
+        }
+
+        /// <summary>
+        /// Read and return the content of the underlying file. If the file
+        /// cannot be found or read an exception is raised.
+        /// </summary>
+        public string ReadFile()
+        {
+            if (!System.IO.File.Exists(_path))
+                throw new FileNotFoundException("File does not exist. File: " + _path);
+
+            if (_text == null)
+            {
+                StreamReader rder = new StreamReader(_path);
+                _text = rder.ReadToEnd();
+                rder.Close();
+            }
+
+            return (_text);
+        }
+
+        public override string ToString() {
+            return ("TraceItem: {'" + _path + "', " + _fullyQualifiedMethodName + ", " + _line + "}");
+        }
+
+        public override bool Equals(object obj)
+        {
+            ErrorItem item = obj as ErrorItem;
+
+            if (item == null)
+                return (false);
+
+            return (_path == item._path &&
+                    _fullyQualifiedMethodName == item._fullyQualifiedMethodName &&
+                    _line == item._line);
+        }
+
+        public override int GetHashCode() {
+            return base.GetHashCode();
+        }
+    }
+}
diff --git a/src/GuiException/UiException/ExceptionItemCollection.cs b/src/GuiException/UiException/ExceptionItemCollection.cs
index 3b56463..fbbc64b 100644
--- a/src/GuiException/UiException/ExceptionItemCollection.cs
+++ b/src/GuiException/UiException/ExceptionItemCollection.cs
@@ -1,108 +1,108 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Collections;
-
-namespace NUnit.UiException
-{
-    /// <summary>
-    /// (formerly named ExceptionItemCollection)
-    /// 
-    /// Manages an ordered set of ErrorItem.
-    /// </summary>
-    public class ErrorItemCollection :
-        IEnumerable
-    {
-        /// <summary>
-        /// The underlying item list.
-        /// </summary>
-        List<ErrorItem> _items;
-
-        /// <summary>
-        /// Build a new ErrorItemCollection.
-        /// </summary>
-        public ErrorItemCollection()
-        {
-            _items = new List<ErrorItem>();
-
-            return;
-        }
-
-        /// <summary>
-        /// Gets the number of item in this collection.
-        /// </summary>
-        public int Count {
-            get { return (_items.Count); }
-        }
-
-        /// <summary>
-        /// Gets the ErrorItem at the specified index.
-        /// </summary>
-        /// <param name="index">The index of the wanted ErrorItem.</param>
-        /// <returns>The ErrorItem.</returns>
-        public ErrorItem this[int index] {
-            get { return (_items[index]); }
-        }
-
-        /// <summary>
-        /// Appends the given item to the end of the collection.
-        /// </summary>
-        /// <param name="item">The ErrorItem to be added to the collection.</param>
-        public void Add(ErrorItem item)
-        {
-            UiExceptionHelper.CheckNotNull(item, "item");
-            _items.Add(item);
-
-            return;
-        }
-
-        /// <summary>
-        /// Clears all items from this collection.
-        /// </summary>
-        public void Clear()
-        {
-            if (_items.Count == 0)
-                return;
-
-            _items.Clear();
-
-            return;
-        }
-
-        /// <summary>
-        /// Checks whether the given item belongs to this collection.
-        /// </summary>
-        /// <param name="item">The item to be checked.</param>
-        /// <returns>True if the item belongs to this collection.</returns>
-        public bool Contains(ErrorItem item) {
-            return (_items.Contains(item));
-        }        
-
-        /// <summary>
-        /// Reverses the sequence order of this collection.
-        /// </summary>
-        public void Reverse()
-        {
-            _items.Reverse();
-        }
-
-        #region IEnumerable Membres
-
-        /// <summary>
-        /// Gets an IEnumerator able to iterate through all ExceptionItems
-        /// managed by this collection.
-        /// </summary>
-        /// <returns>An iterator to be used to iterator through all items
-        /// in this collection.</returns>
-        public IEnumerator GetEnumerator() {
-            return (_items.GetEnumerator());
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// (formerly named ExceptionItemCollection)
+    /// 
+    /// Manages an ordered set of ErrorItem.
+    /// </summary>
+    public class ErrorItemCollection :
+        IEnumerable
+    {
+        /// <summary>
+        /// The underlying item list.
+        /// </summary>
+        List<ErrorItem> _items;
+
+        /// <summary>
+        /// Build a new ErrorItemCollection.
+        /// </summary>
+        public ErrorItemCollection()
+        {
+            _items = new List<ErrorItem>();
+
+            return;
+        }
+
+        /// <summary>
+        /// Gets the number of item in this collection.
+        /// </summary>
+        public int Count {
+            get { return (_items.Count); }
+        }
+
+        /// <summary>
+        /// Gets the ErrorItem at the specified index.
+        /// </summary>
+        /// <param name="index">The index of the wanted ErrorItem.</param>
+        /// <returns>The ErrorItem.</returns>
+        public ErrorItem this[int index] {
+            get { return (_items[index]); }
+        }
+
+        /// <summary>
+        /// Appends the given item to the end of the collection.
+        /// </summary>
+        /// <param name="item">The ErrorItem to be added to the collection.</param>
+        public void Add(ErrorItem item)
+        {
+            UiExceptionHelper.CheckNotNull(item, "item");
+            _items.Add(item);
+
+            return;
+        }
+
+        /// <summary>
+        /// Clears all items from this collection.
+        /// </summary>
+        public void Clear()
+        {
+            if (_items.Count == 0)
+                return;
+
+            _items.Clear();
+
+            return;
+        }
+
+        /// <summary>
+        /// Checks whether the given item belongs to this collection.
+        /// </summary>
+        /// <param name="item">The item to be checked.</param>
+        /// <returns>True if the item belongs to this collection.</returns>
+        public bool Contains(ErrorItem item) {
+            return (_items.Contains(item));
+        }        
+
+        /// <summary>
+        /// Reverses the sequence order of this collection.
+        /// </summary>
+        public void Reverse()
+        {
+            _items.Reverse();
+        }
+
+        #region IEnumerable Membres
+
+        /// <summary>
+        /// Gets an IEnumerator able to iterate through all ExceptionItems
+        /// managed by this collection.
+        /// </summary>
+        /// <returns>An iterator to be used to iterator through all items
+        /// in this collection.</returns>
+        public IEnumerator GetEnumerator() {
+            return (_items.GetEnumerator());
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/ITextManager.cs b/src/GuiException/UiException/ITextManager.cs
index acfca6f..723ddde 100644
--- a/src/GuiException/UiException/ITextManager.cs
+++ b/src/GuiException/UiException/ITextManager.cs
@@ -1,42 +1,42 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException
-{
-    /// <summary>
-    /// Provides an abstract way to manipulate a text as a whole and as separate
-    /// sequences that can randomly be accessed one line at a time.
-    /// </summary>
-    public interface ITextManager
-    {
-        /// <summary>
-        /// Gets the number of line in text managed by this object.
-        /// </summary>
-        int LineCount { get; }
-
-        /// <summary>
-        /// Gets the character count of the longest line in the text managed
-        /// by this object.
-        /// </summary>
-        int MaxLength { get; }
-
-        /// <summary>
-        /// Gets the complete text managed by this object.
-        /// </summary>
-        string Text { get; }
-
-        /// <summary>
-        /// Gets a string filled with all characters in the line
-        /// at the specified startingPosition without the trailing '\r\n' characters.
-        /// </summary>
-        /// <param name="lineIndex"></param>
-        /// <returns></returns>
-        string GetTextAt(int lineIndex);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// Provides an abstract way to manipulate a text as a whole and as separate
+    /// sequences that can randomly be accessed one line at a time.
+    /// </summary>
+    public interface ITextManager
+    {
+        /// <summary>
+        /// Gets the number of line in text managed by this object.
+        /// </summary>
+        int LineCount { get; }
+
+        /// <summary>
+        /// Gets the character count of the longest line in the text managed
+        /// by this object.
+        /// </summary>
+        int MaxLength { get; }
+
+        /// <summary>
+        /// Gets the complete text managed by this object.
+        /// </summary>
+        string Text { get; }
+
+        /// <summary>
+        /// Gets a string filled with all characters in the line
+        /// at the specified startingPosition without the trailing '\r\n' characters.
+        /// </summary>
+        /// <param name="lineIndex"></param>
+        /// <returns></returns>
+        string GetTextAt(int lineIndex);
+    }
+}
diff --git a/src/GuiException/UiException/Properties/Resources.Designer.cs b/src/GuiException/UiException/Properties/Resources.Designer.cs
index 13acf1b..7c83561 100644
--- a/src/GuiException/UiException/Properties/Resources.Designer.cs
+++ b/src/GuiException/UiException/Properties/Resources.Designer.cs
@@ -1,112 +1,112 @@
-//------------------------------------------------------------------------------
-// <auto-generated>
-//     Ce code a été généré par un outil.
-//     Version du runtime :2.0.50727.1434
-//
-//     Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
-//     le code est régénéré.
-// </auto-generated>
-//------------------------------------------------------------------------------
-
-namespace NUnit.UiException.Properties {
-    using System;
-    
-    
-    /// <summary>
-    ///   Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées.
-    /// </summary>
-    // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
-    // à l'aide d'un outil, tel que ResGen ou Visual Studio.
-    // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
-    // avec l'option /str ou régénérez votre projet VS.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    internal class Resources {
-        
-        private static global::System.Resources.ResourceManager resourceMan;
-        
-        private static global::System.Globalization.CultureInfo resourceCulture;
-        
-        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
-        internal Resources() {
-        }
-        
-        /// <summary>
-        ///   Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Resources.ResourceManager ResourceManager {
-            get {
-                if (object.ReferenceEquals(resourceMan, null)) {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NUnit.UiException.Properties.Resources", typeof(Resources).Assembly);
-                    resourceMan = temp;
-                }
-                return resourceMan;
-            }
-        }
-        
-        /// <summary>
-        ///   Remplace la propriété CurrentUICulture du thread actuel pour toutes
-        ///   les recherches de ressources à l'aide de cette classe de ressource fortement typée.
-        /// </summary>
-        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
-        internal static global::System.Globalization.CultureInfo Culture {
-            get {
-                return resourceCulture;
-            }
-            set {
-                resourceCulture = value;
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageCopyToClipboard {
-            get {
-                object obj = ResourceManager.GetObject("ImageCopyToClipboard", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageErrorBrowserHeader {
-            get {
-                object obj = ResourceManager.GetObject("ImageErrorBrowserHeader", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageErrorList {
-            get {
-                object obj = ResourceManager.GetObject("ImageErrorList", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageReverseItemOrder {
-            get {
-                object obj = ResourceManager.GetObject("ImageReverseItemOrder", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageSourceCodeDisplay {
-            get {
-                object obj = ResourceManager.GetObject("ImageSourceCodeDisplay", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageSplitterBox {
-            get {
-                object obj = ResourceManager.GetObject("ImageSplitterBox", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-        
-        internal static System.Drawing.Bitmap ImageStackTraceDisplay {
-            get {
-                object obj = ResourceManager.GetObject("ImageStackTraceDisplay", resourceCulture);
-                return ((System.Drawing.Bitmap)(obj));
-            }
-        }
-    }
-}
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     Ce code a été généré par un outil.
+//     Version du runtime :2.0.50727.1434
+//
+//     Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
+//     le code est régénéré.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace NUnit.UiException.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées.
+    /// </summary>
+    // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
+    // à l'aide d'un outil, tel que ResGen ou Visual Studio.
+    // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
+    // avec l'option /str ou régénérez votre projet VS.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NUnit.UiException.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Remplace la propriété CurrentUICulture du thread actuel pour toutes
+        ///   les recherches de ressources à l'aide de cette classe de ressource fortement typée.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageCopyToClipboard {
+            get {
+                object obj = ResourceManager.GetObject("ImageCopyToClipboard", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageErrorBrowserHeader {
+            get {
+                object obj = ResourceManager.GetObject("ImageErrorBrowserHeader", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageErrorList {
+            get {
+                object obj = ResourceManager.GetObject("ImageErrorList", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageReverseItemOrder {
+            get {
+                object obj = ResourceManager.GetObject("ImageReverseItemOrder", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageSourceCodeDisplay {
+            get {
+                object obj = ResourceManager.GetObject("ImageSourceCodeDisplay", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageSplitterBox {
+            get {
+                object obj = ResourceManager.GetObject("ImageSplitterBox", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ImageStackTraceDisplay {
+            get {
+                object obj = ResourceManager.GetObject("ImageStackTraceDisplay", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/UiException/Properties/Resources.resx b/src/GuiException/UiException/Properties/Resources.resx
index ec1d525..266f5a1 100644
--- a/src/GuiException/UiException/Properties/Resources.resx
+++ b/src/GuiException/UiException/Properties/Resources.resx
@@ -1,142 +1,142 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="ImageCopyToClipboard" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageCopyToClipboard.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ImageErrorBrowserHeader" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageErrorBrowserHeader.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ImageErrorList" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageErrorList.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ImageReverseItemOrder" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageReverseItemOrder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ImageSourceCodeDisplay" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageSourceCodeDisplay.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ImageSplitterBox" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageSplitterBox.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-  <data name="ImageStackTraceDisplay" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>../../../../src/GuiException/UiException/Resources/ImageStackTraceDisplay.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
-  </data>
-</root>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="ImageCopyToClipboard" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageCopyToClipboard.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageErrorBrowserHeader" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageErrorBrowserHeader.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageErrorList" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageErrorList.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageReverseItemOrder" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageReverseItemOrder.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageSourceCodeDisplay" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageSourceCodeDisplay.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageSplitterBox" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageSplitterBox.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ImageStackTraceDisplay" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>../../../../src/GuiException/UiException/Resources/ImageStackTraceDisplay.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
diff --git a/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs b/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs
index 24016c6..79970ce 100644
--- a/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs
+++ b/src/GuiException/UiException/StackTraceAnalysers/FunctionParser.cs
@@ -1,92 +1,92 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.StackTraceAnalyzers;
-
-namespace NUnit.UiException.StackTraceAnalysers
-{
-    /// <summary>
-    /// This class is responsible for locating and initializing
-    /// RawError.Function property with the function name as it
-    /// is mentioned in the stack trace line.
-    ///   To work correclty, the class makes some
-    /// assumptions concerning the function format.
-    ///   A function name is made of two parts: [name][args]
-    /// where [name] refers to a string of characters that doesn't
-    /// contain ' ' and [args] refers to a string delimited by
-    /// '(' and ')'.
-    /// </summary>
-    public class FunctionParser :
-        IErrorParser
-    {
-        #region IErrorParser Membres
-
-        /// <summary>
-        /// Try to match a function name by reading RawError.Input.
-        /// If a match is found, the method outputs the result into
-        /// RawError.Function and returns true.
-        /// </summary>
-        /// <param name="parser">An instance of parser, this parameter
-        /// cannot be null.</param>
-        /// <param name="args">An instance of RawError. This parameter
-        /// cannot be null.</param>
-        /// <returns>True if a match occurs, false otherwise.</returns>
-        public bool TryParse(StackTraceParser parser, RawError args)
-        {
-            int posEndingParenthesis;
-            int posOpeningParenthesis;
-            int posName;
-            int endName;
-            string res;
-            int i;
-
-            UiExceptionHelper.CheckNotNull(parser, "parser");
-            UiExceptionHelper.CheckNotNull(args, "args");
-
-            posEndingParenthesis = args.Input.LastIndexOf(")");
-            posOpeningParenthesis = args.Input.LastIndexOf("(");
-
-            if (posEndingParenthesis == -1 || posOpeningParenthesis == -1 ||
-                posOpeningParenthesis > posEndingParenthesis)
-                return (false);
-
-            endName = posOpeningParenthesis;
-            for (i = posOpeningParenthesis - 1; i >= 0; i--)
-            {
-                if (args.Input[i] != ' ')
-                    break;
-
-                endName = i;
-            }
-
-            posName = -1;
-            for (i = endName - 1; i >= 0; i--)
-            {
-                if (args.Input[i] == ' ')
-                    break;
-
-                posName = i;
-            }
-
-            // Added this test to allow for odd case where we would
-            // otherwise include the leading "at" or "à" in name.
-            if (posName == 0)
-                return false;
-
-            if (posName == -1)
-                return (false);
-
-            res = args.Input.Substring(posName, posEndingParenthesis - posName + 1);
-            args.Function = res;
-            
-            return (true);
-        }       
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// This class is responsible for locating and initializing
+    /// RawError.Function property with the function name as it
+    /// is mentioned in the stack trace line.
+    ///   To work correclty, the class makes some
+    /// assumptions concerning the function format.
+    ///   A function name is made of two parts: [name][args]
+    /// where [name] refers to a string of characters that doesn't
+    /// contain ' ' and [args] refers to a string delimited by
+    /// '(' and ')'.
+    /// </summary>
+    public class FunctionParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Try to match a function name by reading RawError.Input.
+        /// If a match is found, the method outputs the result into
+        /// RawError.Function and returns true.
+        /// </summary>
+        /// <param name="parser">An instance of parser, this parameter
+        /// cannot be null.</param>
+        /// <param name="args">An instance of RawError. This parameter
+        /// cannot be null.</param>
+        /// <returns>True if a match occurs, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posEndingParenthesis;
+            int posOpeningParenthesis;
+            int posName;
+            int endName;
+            string res;
+            int i;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            posEndingParenthesis = args.Input.LastIndexOf(")");
+            posOpeningParenthesis = args.Input.LastIndexOf("(");
+
+            if (posEndingParenthesis == -1 || posOpeningParenthesis == -1 ||
+                posOpeningParenthesis > posEndingParenthesis)
+                return (false);
+
+            endName = posOpeningParenthesis;
+            for (i = posOpeningParenthesis - 1; i >= 0; i--)
+            {
+                if (args.Input[i] != ' ')
+                    break;
+
+                endName = i;
+            }
+
+            posName = -1;
+            for (i = endName - 1; i >= 0; i--)
+            {
+                if (args.Input[i] == ' ')
+                    break;
+
+                posName = i;
+            }
+
+            // Added this test to allow for odd case where we would
+            // otherwise include the leading "at" or "à" in name.
+            if (posName == 0)
+                return false;
+
+            if (posName == -1)
+                return (false);
+
+            res = args.Input.Substring(posName, posEndingParenthesis - posName + 1);
+            args.Function = res;
+            
+            return (true);
+        }       
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs b/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs
index 5f8dba8..fc70526 100644
--- a/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs
+++ b/src/GuiException/UiException/StackTraceAnalysers/IErrorParser.cs
@@ -1,65 +1,65 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.StackTraceAnalyzers
-{
-    public class RawError
-    {
-        private string _function;
-        private string _path;
-        private int _line;
-        private string _input;
-
-        public RawError(string input)
-        {
-            UiExceptionHelper.CheckNotNull(input, "input");
-            _input = input;
-
-            return;
-        }
-
-        public string Input
-        {
-            get { return (_input); }
-        }
-
-        public string Function
-        {
-            get { return (_function); }
-            set { _function = value; }
-        }
-
-        public string Path
-        {
-            get { return (_path); }
-            set { _path = value; }
-        }
-
-        public int Line
-        {
-            get { return (_line); }
-            set { _line = value; }
-        }
-
-        public ErrorItem ToErrorItem()
-        {
-            UiExceptionHelper.CheckTrue(
-                _function != null,
-                "Cannot create instance of ErrorItem without a valid value in Function",
-                "Function");
-
-            return (new ErrorItem(_path, _function, _line));
-        }
-    }
-
-    public interface IErrorParser
-    {
-        bool TryParse(StackTraceParser parser, RawError args);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.StackTraceAnalyzers
+{
+    public class RawError
+    {
+        private string _function;
+        private string _path;
+        private int _line;
+        private string _input;
+
+        public RawError(string input)
+        {
+            UiExceptionHelper.CheckNotNull(input, "input");
+            _input = input;
+
+            return;
+        }
+
+        public string Input
+        {
+            get { return (_input); }
+        }
+
+        public string Function
+        {
+            get { return (_function); }
+            set { _function = value; }
+        }
+
+        public string Path
+        {
+            get { return (_path); }
+            set { _path = value; }
+        }
+
+        public int Line
+        {
+            get { return (_line); }
+            set { _line = value; }
+        }
+
+        public ErrorItem ToErrorItem()
+        {
+            UiExceptionHelper.CheckTrue(
+                _function != null,
+                "Cannot create instance of ErrorItem without a valid value in Function",
+                "Function");
+
+            return (new ErrorItem(_path, _function, _line));
+        }
+    }
+
+    public interface IErrorParser
+    {
+        bool TryParse(StackTraceParser parser, RawError args);
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs b/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs
index 6711c79..a27192c 100644
--- a/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs
+++ b/src/GuiException/UiException/StackTraceAnalysers/LineNumberParser.cs
@@ -1,101 +1,101 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.StackTraceAnalyzers;
-
-namespace NUnit.UiException.StackTraceAnalysers
-{
-    /// <summary>
-    /// LineNumberParser tries to match a line number information
-    /// given in a stack trace line. It relies on the following
-    /// assumptions:
-    ///     - the line number is located after the last ':' character,
-    ///     - the line number is not part of a word,
-    ///     - there cannot be more than one line number after the last ':'
-    ///     - the line number must be > 0
-    /// </summary>
-    public class LineNumberParser :
-        IErrorParser
-    {
-        #region IErrorParser Membres
-
-        /// <summary>
-        /// Reads args.Input and try to locate a line number information.
-        /// If a match occurs the method fills args.Line with the identified
-        /// integer.
-        /// </summary>
-        /// <param name="parser">The StackTraceParser instance. The
-        /// parameter cannot be null.</param>
-        /// <param name="args">The RawError instance from where read and
-        /// write Input and Line properties. The parameter cannot be null.</param>
-        /// <returns>True if a match occurs, false otherwise.</returns>
-        public bool TryParse(StackTraceParser parser, RawError args)
-        {
-            int posTrailingColon;
-            int line;
-
-            UiExceptionHelper.CheckNotNull(parser, "parser");
-            UiExceptionHelper.CheckNotNull(args, "args");
-
-            if ((posTrailingColon = args.Input.LastIndexOf(":")) == -1)
-                return (false);
-
-            if ((line = lookForLastInteger(args.Input, posTrailingColon)) <= 0)                
-                return (false);
-
-            args.Line = line;
-
-            return (true);
-        }
-
-        #endregion
-
-        private int lookForLastInteger(string error, int startIndex)
-        {
-            int res;
-            int workPos;
-
-            for (; startIndex < error.Length; ++startIndex)
-                if (error[startIndex] >= '0' && error[startIndex] <= '9')
-                {
-                    // the integer we are looking for
-                    // is following either a ' ' or ':' character.
-                    // ex: "line 42" or ":42"
-                    // but rejects values like: "line42"
-
-                    if (startIndex > 0 &&
-                        error[startIndex - 1] != ' ' &&
-                        error[startIndex - 1] != ':')
-                        return (-1);
-
-                    break;
-                }
-
-            if (startIndex >= error.Length)
-                return (-1);
-
-            // it is assumes that only one line number information will be
-            // present on a line (if any). If two integers are found (should
-            // never happen) we cannot distinguish which one refers to the
-            // line number. In this case we prefer returning -1.
-            // The next loop checks this point by moving the cursor to a
-            // place after the current number and expects the inner call
-            // to return -1
-
-            for (workPos = startIndex; workPos < error.Length; ++workPos)
-                if (error[workPos] < '0' || error[workPos] > '9')
-                    break;
-            if (lookForLastInteger(error, workPos) != -1)
-                return (-1);
-
-            Int32.TryParse(error.Substring(startIndex, workPos-startIndex), out res);
-
-            return (res);
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// LineNumberParser tries to match a line number information
+    /// given in a stack trace line. It relies on the following
+    /// assumptions:
+    ///     - the line number is located after the last ':' character,
+    ///     - the line number is not part of a word,
+    ///     - there cannot be more than one line number after the last ':'
+    ///     - the line number must be > 0
+    /// </summary>
+    public class LineNumberParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Reads args.Input and try to locate a line number information.
+        /// If a match occurs the method fills args.Line with the identified
+        /// integer.
+        /// </summary>
+        /// <param name="parser">The StackTraceParser instance. The
+        /// parameter cannot be null.</param>
+        /// <param name="args">The RawError instance from where read and
+        /// write Input and Line properties. The parameter cannot be null.</param>
+        /// <returns>True if a match occurs, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posTrailingColon;
+            int line;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            if ((posTrailingColon = args.Input.LastIndexOf(":")) == -1)
+                return (false);
+
+            if ((line = lookForLastInteger(args.Input, posTrailingColon)) <= 0)                
+                return (false);
+
+            args.Line = line;
+
+            return (true);
+        }
+
+        #endregion
+
+        private int lookForLastInteger(string error, int startIndex)
+        {
+            int res;
+            int workPos;
+
+            for (; startIndex < error.Length; ++startIndex)
+                if (error[startIndex] >= '0' && error[startIndex] <= '9')
+                {
+                    // the integer we are looking for
+                    // is following either a ' ' or ':' character.
+                    // ex: "line 42" or ":42"
+                    // but rejects values like: "line42"
+
+                    if (startIndex > 0 &&
+                        error[startIndex - 1] != ' ' &&
+                        error[startIndex - 1] != ':')
+                        return (-1);
+
+                    break;
+                }
+
+            if (startIndex >= error.Length)
+                return (-1);
+
+            // it is assumes that only one line number information will be
+            // present on a line (if any). If two integers are found (should
+            // never happen) we cannot distinguish which one refers to the
+            // line number. In this case we prefer returning -1.
+            // The next loop checks this point by moving the cursor to a
+            // place after the current number and expects the inner call
+            // to return -1
+
+            for (workPos = startIndex; workPos < error.Length; ++workPos)
+                if (error[workPos] < '0' || error[workPos] > '9')
+                    break;
+            if (lookForLastInteger(error, workPos) != -1)
+                return (-1);
+
+            Int32.TryParse(error.Substring(startIndex, workPos-startIndex), out res);
+
+            return (res);
+        }
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs b/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs
index 01beaa0..8f3e7da 100644
--- a/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs
+++ b/src/GuiException/UiException/StackTraceAnalysers/PathCompositeParser.cs
@@ -1,102 +1,102 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.StackTraceAnalyzers;
-
-namespace NUnit.UiException.StackTraceAnalysers
-{
-    /// <summary>
-    /// Encapsulates a set of algorithms that try to match and locate
-    /// a path value coming from a raw stack trace line.
-    /// </summary>
-    public class PathCompositeParser :
-        IErrorParser
-    {
-        /// <summary>
-        /// This array encapsulates a list of classes that inherit from
-        /// IErrorParser. Each instance is made for handling a path from
-        /// a specific file system such as: Windows or UNIX.
-        /// </summary>
-        private IErrorParser[] _array;
-
-        /// <summary>
-        /// Build a new instance of PathParser.
-        /// </summary>
-        public PathCompositeParser()
-        {
-            // setup this array with a couple of algorithms
-            // that handle respectively Windows and Unix like paths.
-            
-            _array = new IErrorParser[] { 
-                new WindowsPathParser(),
-                new UnixPathParser()
-
-                // add your own parser here
-            };
-
-            return;
-        }
-
-        /// <summary>
-        /// Gives access to the IErrorParser instance that handles
-        /// Windows like path values.
-        /// </summary>
-        public IErrorParser WindowsPathParser
-        {
-            get { return (_array[0]); }
-        }
-
-        /// <summary>
-        /// Gives access to the IErrorParser instance that handles
-        /// Unix like path values.
-        /// </summary>
-        public IErrorParser UnixPathParser
-        {
-            get { return (_array[1]); }
-        }
-
-        #region IErrorParser Membres
-
-        /// <summary>
-        /// Try to read from a stack trace line a path value given either
-        /// under the form of a Windows path or a UNIX path. If a match occurs
-        /// the method fills args.Function with the identified data.
-        /// </summary>
-        /// <param name="parser">The instance of StackTraceParser, this parameter
-        /// cannot be null.</param>
-        /// <param name="args">The instance of RawError from where read and write
-        /// RawError.Input and RawError.Function properties. This parameter
-        /// cannot be null.</param>
-        /// <returns>True if a match occurs, false otherwise.</returns>
-        public bool TryParse(StackTraceParser parser, RawError args)
-        {
-            foreach (IErrorParser item in _array)
-                if (item.TryParse(parser, args))
-                    return (true);
-
-            return (false);
-        }
-
-        #endregion
-
-        /// <summary>
-        /// Helper method that locate the trailing ':' in a stack trace row.
-        /// </summary>
-        /// <returns>The index position of ':' in the string or -1 if not found.</returns>
-        public static int IndexOfTrailingColon(string error, int startIndex)
-        {
-            int i;
-
-            for (i = startIndex; i < error.Length; ++i)
-                if (error[i] == ':')
-                    return (i);
-
-            return (-1);
-        }                                
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// Encapsulates a set of algorithms that try to match and locate
+    /// a path value coming from a raw stack trace line.
+    /// </summary>
+    public class PathCompositeParser :
+        IErrorParser
+    {
+        /// <summary>
+        /// This array encapsulates a list of classes that inherit from
+        /// IErrorParser. Each instance is made for handling a path from
+        /// a specific file system such as: Windows or UNIX.
+        /// </summary>
+        private IErrorParser[] _array;
+
+        /// <summary>
+        /// Build a new instance of PathParser.
+        /// </summary>
+        public PathCompositeParser()
+        {
+            // setup this array with a couple of algorithms
+            // that handle respectively Windows and Unix like paths.
+            
+            _array = new IErrorParser[] { 
+                new WindowsPathParser(),
+                new UnixPathParser()
+
+                // add your own parser here
+            };
+
+            return;
+        }
+
+        /// <summary>
+        /// Gives access to the IErrorParser instance that handles
+        /// Windows like path values.
+        /// </summary>
+        public IErrorParser WindowsPathParser
+        {
+            get { return (_array[0]); }
+        }
+
+        /// <summary>
+        /// Gives access to the IErrorParser instance that handles
+        /// Unix like path values.
+        /// </summary>
+        public IErrorParser UnixPathParser
+        {
+            get { return (_array[1]); }
+        }
+
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Try to read from a stack trace line a path value given either
+        /// under the form of a Windows path or a UNIX path. If a match occurs
+        /// the method fills args.Function with the identified data.
+        /// </summary>
+        /// <param name="parser">The instance of StackTraceParser, this parameter
+        /// cannot be null.</param>
+        /// <param name="args">The instance of RawError from where read and write
+        /// RawError.Input and RawError.Function properties. This parameter
+        /// cannot be null.</param>
+        /// <returns>True if a match occurs, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            foreach (IErrorParser item in _array)
+                if (item.TryParse(parser, args))
+                    return (true);
+
+            return (false);
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Helper method that locate the trailing ':' in a stack trace row.
+        /// </summary>
+        /// <returns>The index position of ':' in the string or -1 if not found.</returns>
+        public static int IndexOfTrailingColon(string error, int startIndex)
+        {
+            int i;
+
+            for (i = startIndex; i < error.Length; ++i)
+                if (error[i] == ':')
+                    return (i);
+
+            return (-1);
+        }                                
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs b/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs
index 29f2b1a..33f2c6a 100644
--- a/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs
+++ b/src/GuiException/UiException/StackTraceAnalysers/UnixPathParser.cs
@@ -1,79 +1,79 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.StackTraceAnalyzers;
-
-namespace NUnit.UiException.StackTraceAnalysers
-{
-    /// <summary>
-    /// This class is responsible for extracting a Unix like path value
-    /// from a line of the given stack trace. This class bases its work
-    /// on the following assumptions:
-    /// - paths are supposed to be absolute,
-    /// - paths are supposed to be made of two parts: [/][path]
-    /// Where [/] refers to the Unix mount point 
-    /// and [path] a non empty string of characters that extends to the
-    /// trailing ':' (as given in stack trace).
-    /// </summary>
-    class UnixPathParser :
-        IErrorParser
-    {
-        #region IErrorParser Membres
-
-        /// <summary>
-        /// Locates and fills RawError.Path property with the first
-        /// Unix path values found from RawError.Input property.
-        /// </summary>
-        /// <param name="parser">The stack trace parser. This parameter
-        /// must not be null.</param>
-        /// <param name="args">The RawError from which retrieving and
-        /// filling Input and Path properties. This parameter cannot not
-        /// be null.</param>
-        /// <returns>True if a match occured, false otherwise.</returns>
-        public bool TryParse(StackTraceParser parser, RawError args)
-        {
-            int posSlash;
-            int posColon;
-            string path;
-
-            UiExceptionHelper.CheckNotNull(parser, "parser");
-            UiExceptionHelper.CheckNotNull(args, "args");
-
-            if ((posSlash = indexOfFirstSlash(args.Input, 0)) == -1)
-                return (false);
-
-            if ((posColon = PathCompositeParser.IndexOfTrailingColon(args.Input, posSlash + 1)) == -1)
-                return (false);
-
-            path = args.Input.Substring(posSlash, posColon - posSlash);
-            path = path.Trim();
-
-            if (path.Length <= 1)
-                return (false);
-
-            args.Path = path;
-
-            return (true);
-        }
-
-        #endregion
-
-        private int indexOfFirstSlash(string error, int startIndex)
-        {
-            for (; startIndex < error.Length; startIndex++)
-                if (error[startIndex] == '/')
-                {
-                    if (startIndex == 0 ||
-                        startIndex > 0 && error[startIndex - 1] == ' ')
-                        return (startIndex);
-                }
-
-            return (-1);
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// This class is responsible for extracting a Unix like path value
+    /// from a line of the given stack trace. This class bases its work
+    /// on the following assumptions:
+    /// - paths are supposed to be absolute,
+    /// - paths are supposed to be made of two parts: [/][path]
+    /// Where [/] refers to the Unix mount point 
+    /// and [path] a non empty string of characters that extends to the
+    /// trailing ':' (as given in stack trace).
+    /// </summary>
+    class UnixPathParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Locates and fills RawError.Path property with the first
+        /// Unix path values found from RawError.Input property.
+        /// </summary>
+        /// <param name="parser">The stack trace parser. This parameter
+        /// must not be null.</param>
+        /// <param name="args">The RawError from which retrieving and
+        /// filling Input and Path properties. This parameter cannot not
+        /// be null.</param>
+        /// <returns>True if a match occured, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posSlash;
+            int posColon;
+            string path;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            if ((posSlash = indexOfFirstSlash(args.Input, 0)) == -1)
+                return (false);
+
+            if ((posColon = PathCompositeParser.IndexOfTrailingColon(args.Input, posSlash + 1)) == -1)
+                return (false);
+
+            path = args.Input.Substring(posSlash, posColon - posSlash);
+            path = path.Trim();
+
+            if (path.Length <= 1)
+                return (false);
+
+            args.Path = path;
+
+            return (true);
+        }
+
+        #endregion
+
+        private int indexOfFirstSlash(string error, int startIndex)
+        {
+            for (; startIndex < error.Length; startIndex++)
+                if (error[startIndex] == '/')
+                {
+                    if (startIndex == 0 ||
+                        startIndex > 0 && error[startIndex - 1] == ' ')
+                        return (startIndex);
+                }
+
+            return (-1);
+        }
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs b/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs
index 6eac791..b84f2e6 100644
--- a/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs
+++ b/src/GuiException/UiException/StackTraceAnalysers/WindowsPathParser.cs
@@ -1,84 +1,84 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.StackTraceAnalyzers;
-
-namespace NUnit.UiException.StackTraceAnalysers
-{
-    /// <summary>
-    /// This class is responsible for extracting a Windows like path value
-    /// from a line of the given stack trace. This class bases its work
-    /// on the following assumptions:
-    /// - paths are supposed to be absolute,
-    /// - paths are supposed to be made of two parts: [drive][path]
-    /// Where [drive] refers to a sequence like: "C:\\"
-    /// and [path] a non empty string of characters that extends to the
-    /// trailing ':' (as given in stack trace).
-    /// </summary>
-    public class WindowsPathParser :
-        IErrorParser
-    {
-        #region IErrorParser Membres
-
-        /// <summary>
-        /// Locates and fills RawError.Path property with the first
-        /// Windows path values found from RawError.Input property.
-        /// </summary>
-        /// <param name="parser">The stack trace parser. This parameter
-        /// must not be null.</param>
-        /// <param name="args">The RawError from which retrieving and
-        /// filling Input and Path properties. This parameter cannot not
-        /// be null.</param>
-        /// <returns>True if a match occured, false otherwise.</returns>
-        public bool TryParse(StackTraceParser parser, RawError args)
-        {
-            int posDriveLetter;
-            int posTrailingColon;
-            string path;
-
-            UiExceptionHelper.CheckNotNull(parser, "parser");
-            UiExceptionHelper.CheckNotNull(args, "args");
-
-            posDriveLetter = lookForDriveLetter(args.Input, 0);
-            if (posDriveLetter == -1)
-                return (false);
-
-            posTrailingColon = PathCompositeParser.IndexOfTrailingColon(args.Input, posDriveLetter + 3);
-            if (posTrailingColon == -1)
-                return (false);
-
-            path = args.Input.Substring(posDriveLetter, posTrailingColon - posDriveLetter);
-            path = path.Trim();
-
-            if (path.Length <= 3)
-                return (false);
-
-            args.Path = path;
-
-            return (true);
-        }
-
-        #endregion
-
-        private int lookForDriveLetter(string error, int startIndex)
-        {
-            int i;
-
-            for (i = startIndex; i < error.Length - 2; ++i)
-            {
-                if (((error[i] >= 'a' && error[i] <= 'z') ||
-                    (error[i] >= 'A' && error[i] <= 'Z')) &&
-                    error[i + 1] == ':' &&
-                    error[i + 2] == '\\')
-                    return (i);
-            }
-
-            return (-1);
-        }   
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+
+namespace NUnit.UiException.StackTraceAnalysers
+{
+    /// <summary>
+    /// This class is responsible for extracting a Windows like path value
+    /// from a line of the given stack trace. This class bases its work
+    /// on the following assumptions:
+    /// - paths are supposed to be absolute,
+    /// - paths are supposed to be made of two parts: [drive][path]
+    /// Where [drive] refers to a sequence like: "C:\\"
+    /// and [path] a non empty string of characters that extends to the
+    /// trailing ':' (as given in stack trace).
+    /// </summary>
+    public class WindowsPathParser :
+        IErrorParser
+    {
+        #region IErrorParser Membres
+
+        /// <summary>
+        /// Locates and fills RawError.Path property with the first
+        /// Windows path values found from RawError.Input property.
+        /// </summary>
+        /// <param name="parser">The stack trace parser. This parameter
+        /// must not be null.</param>
+        /// <param name="args">The RawError from which retrieving and
+        /// filling Input and Path properties. This parameter cannot not
+        /// be null.</param>
+        /// <returns>True if a match occured, false otherwise.</returns>
+        public bool TryParse(StackTraceParser parser, RawError args)
+        {
+            int posDriveLetter;
+            int posTrailingColon;
+            string path;
+
+            UiExceptionHelper.CheckNotNull(parser, "parser");
+            UiExceptionHelper.CheckNotNull(args, "args");
+
+            posDriveLetter = lookForDriveLetter(args.Input, 0);
+            if (posDriveLetter == -1)
+                return (false);
+
+            posTrailingColon = PathCompositeParser.IndexOfTrailingColon(args.Input, posDriveLetter + 3);
+            if (posTrailingColon == -1)
+                return (false);
+
+            path = args.Input.Substring(posDriveLetter, posTrailingColon - posDriveLetter);
+            path = path.Trim();
+
+            if (path.Length <= 3)
+                return (false);
+
+            args.Path = path;
+
+            return (true);
+        }
+
+        #endregion
+
+        private int lookForDriveLetter(string error, int startIndex)
+        {
+            int i;
+
+            for (i = startIndex; i < error.Length - 2; ++i)
+            {
+                if (((error[i] >= 'a' && error[i] <= 'z') ||
+                    (error[i] >= 'A' && error[i] <= 'Z')) &&
+                    error[i + 1] == ':' &&
+                    error[i + 2] == '\\')
+                    return (i);
+            }
+
+            return (-1);
+        }   
+    }
+}
diff --git a/src/GuiException/UiException/StackTraceParser.cs b/src/GuiException/UiException/StackTraceParser.cs
index 1090b06..129261b 100644
--- a/src/GuiException/UiException/StackTraceParser.cs
+++ b/src/GuiException/UiException/StackTraceParser.cs
@@ -1,106 +1,106 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.UiException.StackTraceAnalyzers;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException
-{
-    /// <summary>
-    /// StackTraceParser is the entry class for analyzing and converting a stack
-    /// trace - as given by .NET - into a manageable and ordered set of ErrorItem
-    /// instances.
-    ///   StackTraceParser contains internaly a set of autonom, independent and
-    /// interchangeable algorithms that makes the analysis of the stack robust and
-    /// opened to changes. Its architecture is designed to abstract callers from
-    /// secondary details such as the type of culture or file system that can
-    /// both affect the format of the final stack as provided by .NET.
-    ///   In the future, this class could easily be extended by exposing a
-    /// kind of register() method that would allow client code to append
-    /// new algorithms of analysis in its internal list.
-    /// </summary>
-    public class StackTraceParser
-    {
-        /// <summary>
-        /// Output list build from the StackTrace analyze .
-        /// </summary>
-        private ErrorItemCollection _items;
-
-        /// <summary>
-        /// One or more algorithms designed to locate function names
-        /// inside a stack trace line.
-        /// </summary>
-        private IErrorParser _functionParsers;
-
-        /// <summary>
-        /// One or more algorithms designed to locate path names
-        /// inside a stack strace line.
-        /// </summary>
-        private IErrorParser _pathParsers;
-
-        /// <summary>
-        /// One or more algorithms designed to locate line number
-        /// information inside a stack strace line.
-        /// </summary>
-        private IErrorParser _lineNumberParsers;
-
-        /// <summary>
-        /// Build a new instance of StackTraceParser.
-        /// </summary>
-        public StackTraceParser()            
-        {
-            _items = new ErrorItemCollection();
-            
-            _functionParsers = new FunctionParser();
-            _pathParsers = new PathCompositeParser();
-            _lineNumberParsers = new LineNumberParser();
-
-            return;
-        }
-               
-        /// <summary>
-        /// Gives access to the collection of ErrorItem
-        /// build during the analyze of the StackTrace.
-        /// </summary>
-        public ErrorItemCollection Items
-        {
-            get { return (_items); }
-        }
-
-        /// <summary>
-        /// Reads and transforms the given stack trace into a manageable and ordered
-        /// set of ErrorItem instances. The resulting set is stored into Items property.
-        /// </summary>
-        /// <param name="stackTrace">A string value that should contain a .Net stack trace.</param>
-        public void Parse(string stackTrace)
-        {
-            DefaultTextManager lines;
-            RawError rawError;
-
-            _items.Clear();
-
-            lines = new DefaultTextManager();
-            lines.Text = stackTrace;
-
-            foreach (string line in lines)
-            {
-                rawError = new RawError(line);
-
-                if (!_functionParsers.TryParse(this, rawError))
-                    continue;
-
-                _pathParsers.TryParse(this, rawError);
-                _lineNumberParsers.TryParse(this, rawError);
-
-                _items.Add(rawError.ToErrorItem());
-            }
-
-            return;
-        }                                        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// StackTraceParser is the entry class for analyzing and converting a stack
+    /// trace - as given by .NET - into a manageable and ordered set of ErrorItem
+    /// instances.
+    ///   StackTraceParser contains internaly a set of autonom, independent and
+    /// interchangeable algorithms that makes the analysis of the stack robust and
+    /// opened to changes. Its architecture is designed to abstract callers from
+    /// secondary details such as the type of culture or file system that can
+    /// both affect the format of the final stack as provided by .NET.
+    ///   In the future, this class could easily be extended by exposing a
+    /// kind of register() method that would allow client code to append
+    /// new algorithms of analysis in its internal list.
+    /// </summary>
+    public class StackTraceParser
+    {
+        /// <summary>
+        /// Output list build from the StackTrace analyze .
+        /// </summary>
+        private ErrorItemCollection _items;
+
+        /// <summary>
+        /// One or more algorithms designed to locate function names
+        /// inside a stack trace line.
+        /// </summary>
+        private IErrorParser _functionParsers;
+
+        /// <summary>
+        /// One or more algorithms designed to locate path names
+        /// inside a stack strace line.
+        /// </summary>
+        private IErrorParser _pathParsers;
+
+        /// <summary>
+        /// One or more algorithms designed to locate line number
+        /// information inside a stack strace line.
+        /// </summary>
+        private IErrorParser _lineNumberParsers;
+
+        /// <summary>
+        /// Build a new instance of StackTraceParser.
+        /// </summary>
+        public StackTraceParser()            
+        {
+            _items = new ErrorItemCollection();
+            
+            _functionParsers = new FunctionParser();
+            _pathParsers = new PathCompositeParser();
+            _lineNumberParsers = new LineNumberParser();
+
+            return;
+        }
+               
+        /// <summary>
+        /// Gives access to the collection of ErrorItem
+        /// build during the analyze of the StackTrace.
+        /// </summary>
+        public ErrorItemCollection Items
+        {
+            get { return (_items); }
+        }
+
+        /// <summary>
+        /// Reads and transforms the given stack trace into a manageable and ordered
+        /// set of ErrorItem instances. The resulting set is stored into Items property.
+        /// </summary>
+        /// <param name="stackTrace">A string value that should contain a .Net stack trace.</param>
+        public void Parse(string stackTrace)
+        {
+            DefaultTextManager lines;
+            RawError rawError;
+
+            _items.Clear();
+
+            lines = new DefaultTextManager();
+            lines.Text = stackTrace;
+
+            foreach (string line in lines)
+            {
+                rawError = new RawError(line);
+
+                if (!_functionParsers.TryParse(this, rawError))
+                    continue;
+
+                _pathParsers.TryParse(this, rawError);
+                _lineNumberParsers.TryParse(this, rawError);
+
+                _items.Add(rawError.ToErrorItem());
+            }
+
+            return;
+        }                                        
+    }
+}
diff --git a/src/GuiException/UiException/TraceExceptionHelper.cs b/src/GuiException/UiException/TraceExceptionHelper.cs
index 13df1b4..1a1a1bc 100644
--- a/src/GuiException/UiException/TraceExceptionHelper.cs
+++ b/src/GuiException/UiException/TraceExceptionHelper.cs
@@ -1,76 +1,76 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Diagnostics;
-
-namespace NUnit.UiException
-{
-    /// <summary>
-    /// (formerly named TraceExceptionHelper)
-    /// 
-    /// Exposes static methods to assert predicates and throw exceptions
-    /// as needed.
-    /// </summary>
-    public class UiExceptionHelper
-    {
-        /// <summary>
-        /// Asserts that reference is not null; otherwise throws an
-        /// ArgumentNullException.
-        /// </summary>
-        /// <param name="value">The reference to be tested.</param>
-        /// <param name="paramName">The name of this reference</param>
-        [DebuggerStepThrough]
-        public static void CheckNotNull(object value, string paramName)
-        {
-            if (value == null)
-                throw new ArgumentNullException(paramName);
-
-            return;
-        }
-
-        /// <summary>
-        /// Asserts that 'test' is true or throws an ArgumentException.
-        /// </summary>
-        /// <param name="test">The boolean to be tested.</param>
-        /// <param name="message">The error message.</param>
-        /// <param name="paramName">The parameter name to be passed to ArgumentException.</param>
-        [DebuggerStepThrough]
-        public static void CheckTrue(bool test, string message, string paramName)
-        {
-            if (!test)
-                throw new ArgumentException(message, paramName);
-
-            return;
-        }
-
-        /// <summary>
-        /// Asserts that 'test' is false or throws an ArgumentException.
-        /// </summary>
-        /// <param name="test">The boolean to be tested.</param>
-        /// <param name="message">The error message.</param>
-        /// <param name="paramName">The parameter name to be passed to ArgumentException.</param>
-        [DebuggerStepThrough]
-        public static void CheckFalse(bool test, string message, string paramName)
-        {
-            if (test)
-                throw new ArgumentException(message, paramName);
-
-            return;
-        }
-
-        /// <summary>
-        /// Throws an ApplicationException with the given message.
-        /// </summary>
-        /// <param name="message">The error message.</param>
-        [DebuggerStepThrough]
-        public static void Fail(string message)
-        {
-            throw new ApplicationException(message);
-        }        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+
+namespace NUnit.UiException
+{
+    /// <summary>
+    /// (formerly named TraceExceptionHelper)
+    /// 
+    /// Exposes static methods to assert predicates and throw exceptions
+    /// as needed.
+    /// </summary>
+    public class UiExceptionHelper
+    {
+        /// <summary>
+        /// Asserts that reference is not null; otherwise throws an
+        /// ArgumentNullException.
+        /// </summary>
+        /// <param name="value">The reference to be tested.</param>
+        /// <param name="paramName">The name of this reference</param>
+        [DebuggerStepThrough]
+        public static void CheckNotNull(object value, string paramName)
+        {
+            if (value == null)
+                throw new ArgumentNullException(paramName);
+
+            return;
+        }
+
+        /// <summary>
+        /// Asserts that 'test' is true or throws an ArgumentException.
+        /// </summary>
+        /// <param name="test">The boolean to be tested.</param>
+        /// <param name="message">The error message.</param>
+        /// <param name="paramName">The parameter name to be passed to ArgumentException.</param>
+        [DebuggerStepThrough]
+        public static void CheckTrue(bool test, string message, string paramName)
+        {
+            if (!test)
+                throw new ArgumentException(message, paramName);
+
+            return;
+        }
+
+        /// <summary>
+        /// Asserts that 'test' is false or throws an ArgumentException.
+        /// </summary>
+        /// <param name="test">The boolean to be tested.</param>
+        /// <param name="message">The error message.</param>
+        /// <param name="paramName">The parameter name to be passed to ArgumentException.</param>
+        [DebuggerStepThrough]
+        public static void CheckFalse(bool test, string message, string paramName)
+        {
+            if (test)
+                throw new ArgumentException(message, paramName);
+
+            return;
+        }
+
+        /// <summary>
+        /// Throws an ApplicationException with the given message.
+        /// </summary>
+        /// <param name="message">The error message.</param>
+        [DebuggerStepThrough]
+        public static void Fail(string message)
+        {
+            throw new ApplicationException(message);
+        }        
+    }
+}
diff --git a/src/GuiException/UiException/data/Image.png b/src/GuiException/UiException/data/Image.png
new file mode 100644
index 0000000..1206548
Binary files /dev/null and b/src/GuiException/UiException/data/Image.png differ
diff --git a/src/GuiException/UiException/data/OneLine.txt b/src/GuiException/UiException/data/OneLine.txt
new file mode 100644
index 0000000..3d57040
--- /dev/null
+++ b/src/GuiException/UiException/data/OneLine.txt
@@ -0,0 +1 @@
+Hi, there!
\ No newline at end of file
diff --git a/src/GuiException/UiException/data/Resource.cs b/src/GuiException/UiException/data/Resource.cs
new file mode 100644
index 0000000..f2cb7f4
--- /dev/null
+++ b/src/GuiException/UiException/data/Resource.cs
@@ -0,0 +1,38 @@
+// ----------------------------------------------------------------
+// ExceptionBrowser
+// Version 1.0.0
+// Copyright 2008, Irénée HOTTIER,
+// 
+// This is free software licensed under the NUnit license, You may
+// obtain a copy of the license at http://nunit.org/?p=license&r=2.4
+// ----------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.Tests.data
+{
+    public class Resource
+    {
+        public const string HelloWorld_txt = "HelloWorld.txt";
+        public const string TextCode_cs = "TextCode.cs";
+        public const string Image_png = "Image.png";
+        public const string OneLine_txt = "OneLine.txt";
+
+        public static string GetFilename(string filename)
+        {
+            string path;
+
+            path = System.IO.Path.Combine(
+                AppDomain.CurrentDomain.BaseDirectory,
+                "..\\..\\data\\");
+
+            path = System.IO.Path.GetFullPath(path);
+
+            path += filename;
+
+            return (path);
+        }        
+    }
+}
diff --git a/src/GuiException/UiException/data/TextCode.cs b/src/GuiException/UiException/data/TextCode.cs
new file mode 100644
index 0000000..aaf3a69
--- /dev/null
+++ b/src/GuiException/UiException/data/TextCode.cs
@@ -0,0 +1,59 @@
+01	#include <stdio.h>
+02	#include <stdlib.h>
+03	#include <string.h>
+04	#include <ctype.h>
+05	#include <time.h>
+06	#include <sys/types.h>
+07	#include <sys/stat.h>
+08
+09	/* logic */
+10	#ifndef TRUE
+11	# define TRUE 1
+12	#endif /* TRUE */
+13	#ifndef FALSE
+14	# define FALSE 0
+15	#endif /* FALSE */
+16	#define EOF_OK TRUE
+17	#define EOF_NOT_OK FALSE
+18
+19	/* global limits */
+20	#define RULE_YEAR 2004		/* NOTE: should match the current year */
+21	#define START_DATE "07Jan2004 00:00 UTC" /* first confirmation received */
+22	#define MAX_COL 79		/* max column a line should hit */
+23	#define MAX_BUILD_SIZE 521	/* max how to build size */
+24	#define MAX_PROGRAM_SIZE 4096	/* max program source size */
+25	#define MAX_PROGRAM_SIZE2 2048	/* max program source size not counting
+26					   whitespace and {}; not followed by
+27					   whitespace or EOF */
+28	#define MAX_TITLE_LEN 31	/* max chars in the title */
+29	#define MAX_ENTRY_LEN 1		/* max length in the entry input line */
+30	#define MAX_ENTRY 8		/* max number of entries per person per year */
+31	#define MAX_FILE_LEN 1024	/* max filename length for a info file */
+32
+33	/* where to send entries */
+34	#define ENTRY_USER "e.2004"
+35	#define ENTRY_HOST "ioccc.org"
+36
+37	/* uuencode process - assumes ASCII */
+38	#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`')
+39	#define UUENCODE_LEN 45		/* max uuencode chunk size */
+40	#define UUINFO_MODE 0444	/* mode of an info file's uuencode file */
+41	#define UUBUILD_MODE 0444	/* mode of the build file's uuencode file */
+42	#define UUBUILD_NAME "build"	/* name for the build file's uuencode file */
+43	#define UUPROG_MODE 0444	/* mode of the program's uuencode file */
+44	#define UUPROG_NAME "prog.c"	/* name for the program's uuencode file */
+45
+46	/* encode_str[(char)val] is the uuencoded character of val */
+47	char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
+48
+49	/* global declarations */
+50	char *program;			/* our name */
+51	long start_time;		/* the startup time */
+52
+53	/* forward declarations */
+54	void parse_args(int argc, char **argv, char **rname,
+55				char **bname, char **pname, char **oname);
+56	void usage(int exitval);
+57	FILE *open_remark(char *filename);
+58	FILE *open_build(char *filename);
+59	FILE *open_program(char *filename);
\ No newline at end of file
diff --git a/src/GuiException/UiException/data/test.txt b/src/GuiException/UiException/data/test.txt
new file mode 100644
index 0000000..37d4e6c
--- /dev/null
+++ b/src/GuiException/UiException/data/test.txt
@@ -0,0 +1 @@
+hi there
diff --git a/src/GuiException/UiException/nunit.uiexception.build b/src/GuiException/UiException/nunit.uiexception.build
index 11bab99..e2b2212 100644
--- a/src/GuiException/UiException/nunit.uiexception.build
+++ b/src/GuiException/UiException/nunit.uiexception.build
@@ -1,95 +1,95 @@
-<?xml version="1.0"?>
-<project name="NUnitUiException" default="build" basedir=".">
-
-  <patternset id="source-files">
-    <include name="Properties/Resources.Designer.cs"/>
-    <include name="CodeFormatters/CodeFormatterCollection.cs"/>
-    <include name="CodeFormatters/GeneralCodeFormatter.cs"/>
-    <include name="CodeFormatters/ICodeFormatter.cs"/>
-    <include name="CodeFormatters/IFormatterCatalog.cs"/>
-    <include name="CodeFormatters/PlainTextCodeFormatter.cs"/>
-    <include name="Controls/CodeBox.cs"/>
-    <include name="Controls/CodeRenderingContext.cs"/>
-    <include name="Controls/DefaultCodeRenderer.cs"/>
-    <include name="Controls/DefaultErrorListRenderer.cs"/>
-    <include name="Controls/ErrorBrowser.cs"/>
-    <include name="Controls/ErrorList.cs"/>
-    <include name="Controls/ErrorPanelLayout.cs"/>
-    <include name="Controls/ErrorToolbar.cs"/>
-    <include name="Controls/ICodeRenderer.cs"/>
-    <include name="Controls/ICodeView.cs"/>
-    <include name="Controls/IErrorDisplay.cs"/>
-    <include name="Controls/IErrorListRenderer.cs"/>
-    <include name="Controls/IStackTraceView.cs"/>
-    <include name="Controls/PaintLineLocation.cs"/>
-    <include name="Controls/SourceCodeDisplay.cs"/>
-    <include name="Controls/SplitterBox.cs"/>
-    <include name="Controls/StackTraceDisplay.cs"/>
-    <include name="CSharpParser/CSCode.cs"/>
-    <include name="CSharpParser/CSParser.cs"/>
-    <include name="CSharpParser/CSToken.cs"/>
-    <include name="CSharpParser/CSTokenCollection.cs"/>
-    <include name="CSharpParser/Lexer.cs"/>
-    <include name="CSharpParser/LexToken.cs"/>
-    <include name="CSharpParser/TokenClassifier.cs"/>
-    <include name="CSharpParser/TokenDictionary.cs"/>
-    <include name="StackTraceAnalysers/FunctionParser.cs"/>
-    <include name="StackTraceAnalysers/IErrorParser.cs"/>
-    <include name="StackTraceAnalysers/LineNumberParser.cs"/>
-    <include name="StackTraceAnalysers/PathCompositeParser.cs"/>
-    <include name="StackTraceAnalysers/UnixPathParser.cs"/>
-    <include name="StackTraceAnalysers/WindowsPathParser.cs"/>
-    <include name="AssemblyInfo.cs"/>
-    <include name="DefaultTextManager.cs"/>
-    <include name="ExceptionItem.cs"/>
-    <include name="ExceptionItemCollection.cs"/>
-    <include name="ITextManager.cs"/>
-    <include name="StackTraceParser.cs"/>
-    <include name="TraceExceptionHelper.cs"/>
-  </patternset>
-
-  <patternset id="resource-files">
-    <include name="Properties/Resources.resx"/>
-  </patternset>
-
-  <patternset id="content-files">
-    <include name="Resources/*.png"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-    output="${current.lib.dir}/nunit.uiexception.dll"
-    debug="${build.debug}" define="${build.defines}"
-    if="${runtime.version >= '2.0'}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699"/>
-      </nowarn>
-      <resources prefix="NUnit.UiException" dynamicprefix="true">
-        <patternset refid="resource-files"/>
-      </resources>
-      <references basedir="${current.lib.dir}">
-        <include name="System.dll"/>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="System.Drawing.dll"/>
-      </references>
-    </csc>
-
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiException/UiException">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <patternset refid="content-files"/>
-        <include name="nunit.uiexception.dll.csproj"/>
-        <include name="nunit.uiexception.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnitUiException" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Properties/Resources.Designer.cs"/>
+    <include name="CodeFormatters/CodeFormatterCollection.cs"/>
+    <include name="CodeFormatters/GeneralCodeFormatter.cs"/>
+    <include name="CodeFormatters/ICodeFormatter.cs"/>
+    <include name="CodeFormatters/IFormatterCatalog.cs"/>
+    <include name="CodeFormatters/PlainTextCodeFormatter.cs"/>
+    <include name="Controls/CodeBox.cs"/>
+    <include name="Controls/CodeRenderingContext.cs"/>
+    <include name="Controls/DefaultCodeRenderer.cs"/>
+    <include name="Controls/DefaultErrorListRenderer.cs"/>
+    <include name="Controls/ErrorBrowser.cs"/>
+    <include name="Controls/ErrorList.cs"/>
+    <include name="Controls/ErrorPanelLayout.cs"/>
+    <include name="Controls/ErrorToolbar.cs"/>
+    <include name="Controls/ICodeRenderer.cs"/>
+    <include name="Controls/ICodeView.cs"/>
+    <include name="Controls/IErrorDisplay.cs"/>
+    <include name="Controls/IErrorListRenderer.cs"/>
+    <include name="Controls/IStackTraceView.cs"/>
+    <include name="Controls/PaintLineLocation.cs"/>
+    <include name="Controls/SourceCodeDisplay.cs"/>
+    <include name="Controls/SplitterBox.cs"/>
+    <include name="Controls/StackTraceDisplay.cs"/>
+    <include name="CSharpParser/CSCode.cs"/>
+    <include name="CSharpParser/CSParser.cs"/>
+    <include name="CSharpParser/CSToken.cs"/>
+    <include name="CSharpParser/CSTokenCollection.cs"/>
+    <include name="CSharpParser/Lexer.cs"/>
+    <include name="CSharpParser/LexToken.cs"/>
+    <include name="CSharpParser/TokenClassifier.cs"/>
+    <include name="CSharpParser/TokenDictionary.cs"/>
+    <include name="StackTraceAnalysers/FunctionParser.cs"/>
+    <include name="StackTraceAnalysers/IErrorParser.cs"/>
+    <include name="StackTraceAnalysers/LineNumberParser.cs"/>
+    <include name="StackTraceAnalysers/PathCompositeParser.cs"/>
+    <include name="StackTraceAnalysers/UnixPathParser.cs"/>
+    <include name="StackTraceAnalysers/WindowsPathParser.cs"/>
+    <include name="AssemblyInfo.cs"/>
+    <include name="DefaultTextManager.cs"/>
+    <include name="ExceptionItem.cs"/>
+    <include name="ExceptionItemCollection.cs"/>
+    <include name="ITextManager.cs"/>
+    <include name="StackTraceParser.cs"/>
+    <include name="TraceExceptionHelper.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="Properties/Resources.resx"/>
+  </patternset>
+
+  <patternset id="content-files">
+    <include name="Resources/*.png"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+    output="${current.lib.dir}/nunit.uiexception.dll"
+    debug="${build.debug}" define="${build.defines}"
+    if="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699"/>
+      </nowarn>
+      <resources prefix="NUnit.UiException" dynamicprefix="true">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="System.Drawing.dll"/>
+      </references>
+    </csc>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiException/UiException">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <patternset refid="content-files"/>
+        <include name="nunit.uiexception.dll.csproj"/>
+        <include name="nunit.uiexception.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/GuiException/UiException/nunit.uiexception.dll.csproj b/src/GuiException/UiException/nunit.uiexception.dll.csproj
index ddc2dbc..42623b2 100644
--- a/src/GuiException/UiException/nunit.uiexception.dll.csproj
+++ b/src/GuiException/UiException/nunit.uiexception.dll.csproj
@@ -1,125 +1,163 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>NUnit.UiException</RootNamespace>
-    <AssemblyName>nunit.uiexception</AssemblyName>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <AssemblyOriginatorKeyFile>..\..\..\..\src\GuiException\UiException\stackSgKey.snk</AssemblyOriginatorKeyFile>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <NoWarn>1699</NoWarn>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Windows.Forms" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="CodeFormatters\CodeFormatterCollection.cs" />
-    <Compile Include="CodeFormatters\GeneralCodeFormatter.cs" />
-    <Compile Include="CodeFormatters\ICodeFormatter.cs" />
-    <Compile Include="CodeFormatters\IFormatterCatalog.cs" />
-    <Compile Include="CodeFormatters\PlainTextCodeFormatter.cs" />
-    <Compile Include="Controls\CodeBox.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Controls\CodeRenderingContext.cs" />
-    <Compile Include="Controls\DefaultCodeRenderer.cs" />
-    <Compile Include="Controls\DefaultErrorListRenderer.cs" />
-    <Compile Include="Controls\ErrorBrowser.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Controls\ErrorList.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Controls\ErrorPanelLayout.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Controls\ErrorToolbar.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="Controls\ICodeRenderer.cs" />
-    <Compile Include="Controls\ICodeView.cs" />
-    <Compile Include="Controls\IErrorDisplay.cs" />
-    <Compile Include="Controls\IErrorListRenderer.cs" />
-    <Compile Include="Controls\IStackTraceView.cs" />
-    <Compile Include="Controls\PaintLineLocation.cs" />
-    <Compile Include="Controls\SourceCodeDisplay.cs" />
-    <Compile Include="Controls\SplitterBox.cs">
-      <SubType>Component</SubType>
-    </Compile>
-    <Compile Include="Controls\StackTraceDisplay.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="CSharpParser\CSCode.cs" />
-    <Compile Include="CSharpParser\CSParser.cs" />
-    <Compile Include="CSharpParser\CSToken.cs" />
-    <Compile Include="CSharpParser\CSTokenCollection.cs" />
-    <Compile Include="CSharpParser\Lexer.cs" />
-    <Compile Include="CSharpParser\LexToken.cs" />
-    <Compile Include="CSharpParser\TokenClassifier.cs" />
-    <Compile Include="CSharpParser\TokenDictionary.cs" />
-    <Compile Include="DefaultTextManager.cs" />
-    <Compile Include="ExceptionItem.cs" />
-    <Compile Include="ExceptionItemCollection.cs" />
-    <Compile Include="ITextManager.cs" />
-    <Compile Include="Properties\Resources.Designer.cs" />
-    <Compile Include="StackTraceAnalysers\FunctionParser.cs" />
-    <Compile Include="StackTraceAnalysers\IErrorParser.cs" />
-    <Compile Include="StackTraceAnalysers\LineNumberParser.cs" />
-    <Compile Include="StackTraceAnalysers\PathCompositeParser.cs" />
-    <Compile Include="StackTraceAnalysers\UnixPathParser.cs" />
-    <Compile Include="StackTraceAnalysers\WindowsPathParser.cs" />
-    <Compile Include="StackTraceParser.cs" />
-    <Compile Include="TraceExceptionHelper.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Properties\Resources.resx">
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.uiexception.build" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="data\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NUnit.UiException</RootNamespace>
+    <AssemblyName>nunit.uiexception</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AssemblyOriginatorKeyFile>..\..\..\..\src\GuiException\UiException\stackSgKey.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>1699</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>1699</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="CodeFormatters\CodeFormatterCollection.cs" />
+    <Compile Include="CodeFormatters\GeneralCodeFormatter.cs" />
+    <Compile Include="CodeFormatters\ICodeFormatter.cs" />
+    <Compile Include="CodeFormatters\IFormatterCatalog.cs" />
+    <Compile Include="CodeFormatters\PlainTextCodeFormatter.cs" />
+    <Compile Include="Controls\CodeBox.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\CodeRenderingContext.cs" />
+    <Compile Include="Controls\DefaultCodeRenderer.cs" />
+    <Compile Include="Controls\DefaultErrorListRenderer.cs" />
+    <Compile Include="Controls\ErrorBrowser.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ErrorList.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ErrorPanelLayout.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Controls\ErrorToolbar.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Controls\ICodeRenderer.cs" />
+    <Compile Include="Controls\ICodeView.cs" />
+    <Compile Include="Controls\IErrorDisplay.cs" />
+    <Compile Include="Controls\IErrorListRenderer.cs" />
+    <Compile Include="Controls\IStackTraceView.cs" />
+    <Compile Include="Controls\PaintLineLocation.cs" />
+    <Compile Include="Controls\SourceCodeDisplay.cs" />
+    <Compile Include="Controls\SplitterBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Controls\StackTraceDisplay.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="CSharpParser\CSCode.cs" />
+    <Compile Include="CSharpParser\CSParser.cs" />
+    <Compile Include="CSharpParser\CSToken.cs" />
+    <Compile Include="CSharpParser\CSTokenCollection.cs" />
+    <Compile Include="CSharpParser\Lexer.cs" />
+    <Compile Include="CSharpParser\LexToken.cs" />
+    <Compile Include="CSharpParser\TokenClassifier.cs" />
+    <Compile Include="CSharpParser\TokenDictionary.cs" />
+    <Compile Include="DefaultTextManager.cs" />
+    <Compile Include="ExceptionItem.cs" />
+    <Compile Include="ExceptionItemCollection.cs" />
+    <Compile Include="ITextManager.cs" />
+    <Compile Include="Properties\Resources.Designer.cs" />
+    <Compile Include="StackTraceAnalysers\FunctionParser.cs" />
+    <Compile Include="StackTraceAnalysers\IErrorParser.cs" />
+    <Compile Include="StackTraceAnalysers\LineNumberParser.cs" />
+    <Compile Include="StackTraceAnalysers\PathCompositeParser.cs" />
+    <Compile Include="StackTraceAnalysers\UnixPathParser.cs" />
+    <Compile Include="StackTraceAnalysers\WindowsPathParser.cs" />
+    <Compile Include="StackTraceParser.cs" />
+    <Compile Include="TraceExceptionHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uiexception.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="data\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
 </Project>
\ No newline at end of file
diff --git a/src/GuiException/UiException/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/GuiException/UiException/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..cf9b11a
Binary files /dev/null and b/src/GuiException/UiException/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/GuiException/UiException/obj/Debug/NUnit.UiException.Properties.Resources.resources b/src/GuiException/UiException/obj/Debug/NUnit.UiException.Properties.Resources.resources
new file mode 100644
index 0000000..7e9551b
Binary files /dev/null and b/src/GuiException/UiException/obj/Debug/NUnit.UiException.Properties.Resources.resources differ
diff --git a/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csproj.FileListAbsolute.txt b/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..cd81956
--- /dev/null
+++ b/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csproj.FileListAbsolute.txt
@@ -0,0 +1,7 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit.uiexception.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit.uiexception.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\UiException\obj\Debug\nunit.uiexception.dll.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\UiException\obj\Debug\NUnit.UiException.Properties.Resources.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\UiException\obj\Debug\nunit.uiexception.dll.csproj.GenerateResource.Cache
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\UiException\obj\Debug\nunit.uiexception.dll
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\UiException\obj\Debug\nunit.uiexception.pdb
diff --git a/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csproj.GenerateResource.Cache b/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csproj.GenerateResource.Cache
new file mode 100644
index 0000000..27253f1
Binary files /dev/null and b/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csproj.GenerateResource.Cache differ
diff --git a/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csprojResolveAssemblyReference.cache b/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..4fcce86
Binary files /dev/null and b/src/GuiException/UiException/obj/Debug/nunit.uiexception.dll.csprojResolveAssemblyReference.cache differ
diff --git a/src/GuiException/UiException/obj/Debug/nunit.uiexception.pdb b/src/GuiException/UiException/obj/Debug/nunit.uiexception.pdb
new file mode 100644
index 0000000..b8d2cd1
Binary files /dev/null and b/src/GuiException/UiException/obj/Debug/nunit.uiexception.pdb differ
diff --git a/src/GuiException/tests/CSharpParser/TestCSCode.cs b/src/GuiException/tests/CSharpParser/TestCSCode.cs
index 46f2ab0..0cb00b9 100644
--- a/src/GuiException/tests/CSharpParser/TestCSCode.cs
+++ b/src/GuiException/tests/CSharpParser/TestCSCode.cs
@@ -1,246 +1,246 @@
-// ****************************************************************
-// This 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.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestFormattedCode
-    {
-        private FormattedCode _code;       
-
-        [Test]
-        public void Test_SimpleCollection()
-        {
-            _code = new TestingCSCode(
-                "line 1\n  line 2\nline 3\n",
-                new int[] { 0, 7, 16 },
-                new byte[] { 0, 0,  0 },
-                new int[] { 0, 1, 2 }
-                );
-
-            Assert.That(_code.Text, Is.EqualTo("line 1\n  line 2\nline 3\n"));
-            Assert.That(_code.LineCount, Is.EqualTo(3));
-
-            Assert.That(_code[0], Is.Not.Null);
-            Assert.That(_code[0].Text, Is.EqualTo("line 1"));
-
-            Assert.That(_code[1], Is.Not.Null);
-            Assert.That(_code[1].Text, Is.EqualTo("  line 2"));
-
-            Assert.That(_code[2], Is.Not.Null);
-            Assert.That(_code[2].Text, Is.EqualTo("line 3"));
-
-            // check internal data
-
-            Assert.That(_code[0].Count, Is.EqualTo(1));
-            Assert.That(_code[0][0].Text, Is.EqualTo("line 1"));
-            Assert.That(_code[0][0].Tag, Is.EqualTo(ClassificationTag.Code));
-
-            Assert.That(_code[1].Count, Is.EqualTo(1));
-            Assert.That(_code[1][0].Text, Is.EqualTo("  line 2"));
-            Assert.That(_code[1][0].Tag, Is.EqualTo(ClassificationTag.Code));
-
-            Assert.That(_code[2].Count, Is.EqualTo(1));
-            Assert.That(_code[2][0].Text, Is.EqualTo("line 3"));
-            Assert.That(_code[2][0].Tag, Is.EqualTo(ClassificationTag.Code));
-
-            return;
-        }
-
-        [Test]
-        public void Empty()
-        {
-            Assert.NotNull(FormattedCode.Empty);
-            Assert.That(FormattedCode.Empty, Is.EqualTo(new FormattedCode()));
-        }
-
-        [Test]
-        public void Test_ComplexCollection()
-        {
-            _code = new TestingCSCode(
-                "int i; //comment\n" +
-                "char c='a';\n",
-                new int[] { 0, 4, 7, 17, 22, 24, 27 },
-                new byte[] { 1, 0, 2,  1,  0,  3,  0 },
-                new int[] { 0, 3 }
-            );
-
-            Assert.That(_code.Text, Is.EqualTo("int i; //comment\nchar c='a';\n"));
-            Assert.That(_code.LineCount, Is.EqualTo(2));
-
-            Assert.That(_code[0], Is.Not.Null);
-            Assert.That(_code[0].Text, Is.EqualTo("int i; //comment"));
-
-            Assert.That(_code[1], Is.Not.Null);
-            Assert.That(_code[1].Text, Is.EqualTo("char c='a';"));
-
-            // check internal data
-
-            Assert.That(_code[0].Count, Is.EqualTo(3));
-            Assert.That(_code[0][0].Text, Is.EqualTo("int "));
-            Assert.That(_code[0][0].Tag, Is.EqualTo(ClassificationTag.Keyword));
-            Assert.That(_code[0][1].Text, Is.EqualTo("i; "));
-            Assert.That(_code[0][1].Tag, Is.EqualTo(ClassificationTag.Code));
-            Assert.That(_code[0][2].Text, Is.EqualTo("//comment"));
-            Assert.That(_code[0][2].Tag, Is.EqualTo(ClassificationTag.Comment));
-
-            Assert.That(_code[1].Count, Is.EqualTo(4));
-            Assert.That(_code[1][0].Text, Is.EqualTo("char "));
-            Assert.That(_code[1][0].Tag, Is.EqualTo(ClassificationTag.Keyword));
-            Assert.That(_code[1][1].Text, Is.EqualTo("c="));
-            Assert.That(_code[1][1].Tag, Is.EqualTo(ClassificationTag.Code));
-            Assert.That(_code[1][2].Text, Is.EqualTo("'a'"));
-            Assert.That(_code[1][2].Tag, Is.EqualTo(ClassificationTag.String));
-            Assert.That(_code[1][3].Text, Is.EqualTo(";"));
-            Assert.That(_code[1][3].Tag, Is.EqualTo(ClassificationTag.Code));
-
-            return;
-        }
-
-        [Test]
-        public void Test_MaxLength()
-        {
-            _code = new TestingCSCode(
-                "", new int[] { }, new byte[] { }, new int[] { });
-            Assert.That(_code.MaxLength, Is.EqualTo(0));
-
-            _code = new TestingCSCode(
-                "a\r\nabc\r\nab",
-                new int[] { 0, 3, 8 },
-                new byte[] { 0, 0, 0 },
-                new int[] { 0, 1, 2 });
-            Assert.That(_code.MaxLength, Is.EqualTo(3));
-
-            _code = new TestingCSCode(
-                "a\r\nab\r\nabc",
-                new int[] { 0, 3, 7 },
-                new byte[] { 0, 0, 0 },
-                new int[] { 0, 1, 2 });
-            Assert.That(_code.MaxLength, Is.EqualTo(3));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void CheckData_Can_Throw_NullDataException()
-        {
-            FormattedCode.CheckData(null); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "IndexArray.Count and TagArray.Count must match.",
-            MatchType = MessageMatch.Contains)]
-        public void CheckData_IndexArray_And_TagArray_Count_Must_Match()
-        {
-            FormattedCode.CheckData(
-                new FormattedCode("hello", new int[] { 0 }, new byte[0], new int[] { 0 })); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "Bad LineArray value at index 0, value was: 1, expected to be in: [0-1[.",
-            MatchType = MessageMatch.Contains)]
-        public void CheckData_LineArray_Values_Must_Be_In_IndexArray_Count()
-        {
-            FormattedCode.CheckData(
-                new FormattedCode("hi there!", new int[] { 0 }, new byte[] { 0 }, new int[] { 1 })); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "Bad LineArray[1], value was: 0, expected to be > than LineArray[0]=0.",
-            MatchType = MessageMatch.Contains)]
-        public void CheckData_LineArray_Values_Must_Always_Grow_Up()
-        {
-            FormattedCode.CheckData(
-                new FormattedCode("hi\r\nthere\r\n",
-                    new int[] { 0, 3 },
-                    new byte[] { 0, 0 },
-                    new int[] { 0, 0 })); // throws exception
-        }
-
-        [Test]
-        public void Test_Equals()
-        {
-            _code = new TestingCSCode(
-               "line",
-               new int[] { 0 },
-               new byte[] { 0 },
-               new int[] { 0 }
-               );
-
-            // Tests to fail
-
-            Assert.That(_code.Equals(null), Is.False);
-            Assert.That(_code.Equals("hello"), Is.False);
-            Assert.That(_code.Equals(
-                new TestingCSCode("a", new int[] { 0 }, new byte[] { 0 }, new int[] { 0 })),
-                Is.False);
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 1 }, new byte[] { 0 }, new int[] { 0 })),
-                Is.False);
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 0 }, new byte[] { 1 }, new int[] { 0 })),
-                Is.False);
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 1 })),
-                Is.False);
-
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 0, 0 }, new byte[] { 0 }, new int[] { 0 })),
-                Is.False);
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0, 0 }, new int[] { 0 })),
-                Is.False);
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 0, 0 })),
-                Is.False);
-
-            // NUnit.UiException.Tests to pass
-
-            Assert.That(_code.Equals(
-                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 0 })),
-                Is.True);
-
-            return;
-        }
-
-        #region TestingCSCode
-
-        class TestingCSCode :
-            FormattedCode
-        {
-            public TestingCSCode(string csharpText, int[] strIndexes, byte[] tagValues, int[] lineIndexes)
-            {
-                _codeInfo = new CodeInfo();
-
-                _codeInfo.Text = csharpText;
-
-                _codeInfo.IndexArray = new List<int>();
-                foreach (int index in strIndexes)
-                    _codeInfo.IndexArray.Add(index);
-
-                _codeInfo.TagArray = new List<byte>();
-                foreach (byte tag in tagValues)
-                    _codeInfo.TagArray.Add(tag);
-
-                _codeInfo.LineArray = new List<int>();
-                foreach (int line in lineIndexes)
-                    _codeInfo.LineArray.Add(line);
-
-                return;
-            }         
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This 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.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestFormattedCode
+    {
+        private FormattedCode _code;       
+
+        [Test]
+        public void Test_SimpleCollection()
+        {
+            _code = new TestingCSCode(
+                "line 1\n  line 2\nline 3\n",
+                new int[] { 0, 7, 16 },
+                new byte[] { 0, 0,  0 },
+                new int[] { 0, 1, 2 }
+                );
+
+            Assert.That(_code.Text, Is.EqualTo("line 1\n  line 2\nline 3\n"));
+            Assert.That(_code.LineCount, Is.EqualTo(3));
+
+            Assert.That(_code[0], Is.Not.Null);
+            Assert.That(_code[0].Text, Is.EqualTo("line 1"));
+
+            Assert.That(_code[1], Is.Not.Null);
+            Assert.That(_code[1].Text, Is.EqualTo("  line 2"));
+
+            Assert.That(_code[2], Is.Not.Null);
+            Assert.That(_code[2].Text, Is.EqualTo("line 3"));
+
+            // check internal data
+
+            Assert.That(_code[0].Count, Is.EqualTo(1));
+            Assert.That(_code[0][0].Text, Is.EqualTo("line 1"));
+            Assert.That(_code[0][0].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            Assert.That(_code[1].Count, Is.EqualTo(1));
+            Assert.That(_code[1][0].Text, Is.EqualTo("  line 2"));
+            Assert.That(_code[1][0].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            Assert.That(_code[2].Count, Is.EqualTo(1));
+            Assert.That(_code[2][0].Text, Is.EqualTo("line 3"));
+            Assert.That(_code[2][0].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            return;
+        }
+
+        [Test]
+        public void Empty()
+        {
+            Assert.NotNull(FormattedCode.Empty);
+            Assert.That(FormattedCode.Empty, Is.EqualTo(new FormattedCode()));
+        }
+
+        [Test]
+        public void Test_ComplexCollection()
+        {
+            _code = new TestingCSCode(
+                "int i; //comment\n" +
+                "char c='a';\n",
+                new int[] { 0, 4, 7, 17, 22, 24, 27 },
+                new byte[] { 1, 0, 2,  1,  0,  3,  0 },
+                new int[] { 0, 3 }
+            );
+
+            Assert.That(_code.Text, Is.EqualTo("int i; //comment\nchar c='a';\n"));
+            Assert.That(_code.LineCount, Is.EqualTo(2));
+
+            Assert.That(_code[0], Is.Not.Null);
+            Assert.That(_code[0].Text, Is.EqualTo("int i; //comment"));
+
+            Assert.That(_code[1], Is.Not.Null);
+            Assert.That(_code[1].Text, Is.EqualTo("char c='a';"));
+
+            // check internal data
+
+            Assert.That(_code[0].Count, Is.EqualTo(3));
+            Assert.That(_code[0][0].Text, Is.EqualTo("int "));
+            Assert.That(_code[0][0].Tag, Is.EqualTo(ClassificationTag.Keyword));
+            Assert.That(_code[0][1].Text, Is.EqualTo("i; "));
+            Assert.That(_code[0][1].Tag, Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_code[0][2].Text, Is.EqualTo("//comment"));
+            Assert.That(_code[0][2].Tag, Is.EqualTo(ClassificationTag.Comment));
+
+            Assert.That(_code[1].Count, Is.EqualTo(4));
+            Assert.That(_code[1][0].Text, Is.EqualTo("char "));
+            Assert.That(_code[1][0].Tag, Is.EqualTo(ClassificationTag.Keyword));
+            Assert.That(_code[1][1].Text, Is.EqualTo("c="));
+            Assert.That(_code[1][1].Tag, Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_code[1][2].Text, Is.EqualTo("'a'"));
+            Assert.That(_code[1][2].Tag, Is.EqualTo(ClassificationTag.String));
+            Assert.That(_code[1][3].Text, Is.EqualTo(";"));
+            Assert.That(_code[1][3].Tag, Is.EqualTo(ClassificationTag.Code));
+
+            return;
+        }
+
+        [Test]
+        public void Test_MaxLength()
+        {
+            _code = new TestingCSCode(
+                "", new int[] { }, new byte[] { }, new int[] { });
+            Assert.That(_code.MaxLength, Is.EqualTo(0));
+
+            _code = new TestingCSCode(
+                "a\r\nabc\r\nab",
+                new int[] { 0, 3, 8 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 });
+            Assert.That(_code.MaxLength, Is.EqualTo(3));
+
+            _code = new TestingCSCode(
+                "a\r\nab\r\nabc",
+                new int[] { 0, 3, 7 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 });
+            Assert.That(_code.MaxLength, Is.EqualTo(3));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void CheckData_Can_Throw_NullDataException()
+        {
+            FormattedCode.CheckData(null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "IndexArray.Count and TagArray.Count must match.",
+            MatchType = MessageMatch.Contains)]
+        public void CheckData_IndexArray_And_TagArray_Count_Must_Match()
+        {
+            FormattedCode.CheckData(
+                new FormattedCode("hello", new int[] { 0 }, new byte[0], new int[] { 0 })); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Bad LineArray value at index 0, value was: 1, expected to be in: [0-1[.",
+            MatchType = MessageMatch.Contains)]
+        public void CheckData_LineArray_Values_Must_Be_In_IndexArray_Count()
+        {
+            FormattedCode.CheckData(
+                new FormattedCode("hi there!", new int[] { 0 }, new byte[] { 0 }, new int[] { 1 })); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Bad LineArray[1], value was: 0, expected to be > than LineArray[0]=0.",
+            MatchType = MessageMatch.Contains)]
+        public void CheckData_LineArray_Values_Must_Always_Grow_Up()
+        {
+            FormattedCode.CheckData(
+                new FormattedCode("hi\r\nthere\r\n",
+                    new int[] { 0, 3 },
+                    new byte[] { 0, 0 },
+                    new int[] { 0, 0 })); // throws exception
+        }
+
+        [Test]
+        public void Test_Equals()
+        {
+            _code = new TestingCSCode(
+               "line",
+               new int[] { 0 },
+               new byte[] { 0 },
+               new int[] { 0 }
+               );
+
+            // Tests to fail
+
+            Assert.That(_code.Equals(null), Is.False);
+            Assert.That(_code.Equals("hello"), Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("a", new int[] { 0 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 1 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 1 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 1 })),
+                Is.False);
+
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0, 0 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0, 0 }, new int[] { 0 })),
+                Is.False);
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 0, 0 })),
+                Is.False);
+
+            // NUnit.UiException.Tests to pass
+
+            Assert.That(_code.Equals(
+                new TestingCSCode("line", new int[] { 0 }, new byte[] { 0 }, new int[] { 0 })),
+                Is.True);
+
+            return;
+        }
+
+        #region TestingCSCode
+
+        class TestingCSCode :
+            FormattedCode
+        {
+            public TestingCSCode(string csharpText, int[] strIndexes, byte[] tagValues, int[] lineIndexes)
+            {
+                _codeInfo = new CodeInfo();
+
+                _codeInfo.Text = csharpText;
+
+                _codeInfo.IndexArray = new List<int>();
+                foreach (int index in strIndexes)
+                    _codeInfo.IndexArray.Add(index);
+
+                _codeInfo.TagArray = new List<byte>();
+                foreach (byte tag in tagValues)
+                    _codeInfo.TagArray.Add(tag);
+
+                _codeInfo.LineArray = new List<int>();
+                foreach (int line in lineIndexes)
+                    _codeInfo.LineArray.Add(line);
+
+                return;
+            }         
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestCSParser.cs b/src/GuiException/tests/CSharpParser/TestCSParser.cs
index 884771d..93ba1cb 100644
--- a/src/GuiException/tests/CSharpParser/TestCSParser.cs
+++ b/src/GuiException/tests/CSharpParser/TestCSParser.cs
@@ -1,175 +1,175 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestCSharpCodeFormatter
-    {
-        private TestingCSharpCodeFormatter _parser;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _parser = new TestingCSharpCodeFormatter();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Default()
-        {
-            Assert.That(_parser.CSCode, Is.Not.Null);
-            Assert.That(_parser.CSCode.Text, Is.EqualTo(""));
-            Assert.That(_parser.CSCode.LineCount, Is.EqualTo(0));
-
-            Assert.That(_parser.Language, Is.EqualTo("C#"));
-
-            return;
-        }        
-
-        [Test]
-        public void Test_PreProcess()
-        {
-            // PreProcess is expected to remove '\t' sequences.
-            // This test expects that normal strings are left untouched.
-
-            Assert.That(_parser.PreProcess("hello world"), Is.EqualTo("hello world"));
-
-            // This test expects to see differences
-            Assert.That(_parser.PreProcess("hello\tworld"), Is.EqualTo("hello    world"));
-
-            // test to fail: passing null has no effect.
-            Assert.That(_parser.PreProcess(null), Is.Null);
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Format_Can_Throw_CSharpNullException()
-        {
-            _parser.Format(null); // throws exception
-        }
-
-        [Test]
-        public void Test_Format()
-        {
-            FormattedCode exp;
-            FormattedCode res;
-
-            res = _parser.Format("line 1\n  line 2\nline 3\n");
-
-            exp = new FormattedCode(
-                "line 1\n  line 2\nline 3\n",
-                new int[] { 0, 7, 16 },
-                new byte[] { 0, 0, 0 },
-                new int[] { 0, 1, 2 }
-                );
-
-            Assert.That(res, Is.EqualTo(exp));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Format_2()
-        {
-            FormattedCode exp;
-            FormattedCode res;
-
-            res = _parser.Format(
-                "int i; //comment\n" +
-                "char c='a';\n");
-
-            exp = new FormattedCode(
-                "int i; //comment\n" +
-                "char c='a';\n",
-                new int[] { 0, 3, 7, 16, 17, 21, 24, 27 },
-                new byte[] { 1, 0, 2, 0, 1, 0, 3, 0 },
-                new int[] { 0, 4 }
-            );
-
-            Assert.That(res, Is.EqualTo(exp));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Format_3()
-        {
-            FormattedCode exp;
-            FormattedCode res;
-
-            // Ensure that escaping sequences are
-            // handled correctly
-            //                    0  2           14   17    21        
-            res = _parser.Format("s=\"<font class=\\\"cls\\\">hi, there!</font>");
-
-            exp = new FormattedCode(
-                "s=\"<font class=\\\"cls\\\">hi, there!</font>",
-                new int[] { 0, 2 },
-                new byte[] { 0, 3 },
-                new int[] { 0 });
-
-            Assert.That(res, Is.EqualTo(exp));
-
-            _parser = new TestingCSharpCodeFormatter();
-
-            //                   0  2              
-            res = _parser.Format("s=\"<font class=\\\\\"cls\\\">hi, there!</font>");
-            exp = new FormattedCode(
-                "s=\"<font class=\\\\\"cls\\\">hi, there!</font>",
-                new int[] { 0, 2, 18, 22 },
-                new byte[] { 0, 3, 0, 3 },
-                new int[] { 0 });
-
-            Assert.That(res, Is.EqualTo(exp));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Conserve_Intermediary_Spaces()
-        {
-            FormattedCode res;
-
-            res = _parser.Format(
-                         "{\r\n" + 
-                         "    class A { }\r\n" +
-                         "}\r\n");
-
-            Assert.That(res.LineCount, Is.EqualTo(3));
-            Assert.That(res[0].Text, Is.EqualTo("{"));
-            Assert.That(res[1].Text, Is.EqualTo("    class A { }"));
-            Assert.That(res[2].Text, Is.EqualTo("}"));
-
-            Assert.That(res[0][0].Text, Is.EqualTo("{"));
-            Assert.That(res[1][0].Text, Is.EqualTo("    "));
-            Assert.That(res[1][1].Text, Is.EqualTo("class"));
-            Assert.That(res[1][2].Text, Is.EqualTo(" A { }"));
-            Assert.That(res[2][0].Text, Is.EqualTo("}"));
-
-            return;
-        }
-
-        #region TestingCSharpCodeFormatter
-
-        class TestingCSharpCodeFormatter :
-            CSharpCodeFormatter
-        {
-            public new string PreProcess(string text)
-            {
-                return (base.PreProcess(text));
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestCSharpCodeFormatter
+    {
+        private TestingCSharpCodeFormatter _parser;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _parser = new TestingCSharpCodeFormatter();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_parser.CSCode, Is.Not.Null);
+            Assert.That(_parser.CSCode.Text, Is.EqualTo(""));
+            Assert.That(_parser.CSCode.LineCount, Is.EqualTo(0));
+
+            Assert.That(_parser.Language, Is.EqualTo("C#"));
+
+            return;
+        }        
+
+        [Test]
+        public void Test_PreProcess()
+        {
+            // PreProcess is expected to remove '\t' sequences.
+            // This test expects that normal strings are left untouched.
+
+            Assert.That(_parser.PreProcess("hello world"), Is.EqualTo("hello world"));
+
+            // This test expects to see differences
+            Assert.That(_parser.PreProcess("hello\tworld"), Is.EqualTo("hello    world"));
+
+            // test to fail: passing null has no effect.
+            Assert.That(_parser.PreProcess(null), Is.Null);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Format_Can_Throw_CSharpNullException()
+        {
+            _parser.Format(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Format()
+        {
+            FormattedCode exp;
+            FormattedCode res;
+
+            res = _parser.Format("line 1\n  line 2\nline 3\n");
+
+            exp = new FormattedCode(
+                "line 1\n  line 2\nline 3\n",
+                new int[] { 0, 7, 16 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 }
+                );
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Format_2()
+        {
+            FormattedCode exp;
+            FormattedCode res;
+
+            res = _parser.Format(
+                "int i; //comment\n" +
+                "char c='a';\n");
+
+            exp = new FormattedCode(
+                "int i; //comment\n" +
+                "char c='a';\n",
+                new int[] { 0, 3, 7, 16, 17, 21, 24, 27 },
+                new byte[] { 1, 0, 2, 0, 1, 0, 3, 0 },
+                new int[] { 0, 4 }
+            );
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Format_3()
+        {
+            FormattedCode exp;
+            FormattedCode res;
+
+            // Ensure that escaping sequences are
+            // handled correctly
+            //                    0  2           14   17    21        
+            res = _parser.Format("s=\"<font class=\\\"cls\\\">hi, there!</font>");
+
+            exp = new FormattedCode(
+                "s=\"<font class=\\\"cls\\\">hi, there!</font>",
+                new int[] { 0, 2 },
+                new byte[] { 0, 3 },
+                new int[] { 0 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            _parser = new TestingCSharpCodeFormatter();
+
+            //                   0  2              
+            res = _parser.Format("s=\"<font class=\\\\\"cls\\\">hi, there!</font>");
+            exp = new FormattedCode(
+                "s=\"<font class=\\\\\"cls\\\">hi, there!</font>",
+                new int[] { 0, 2, 18, 22 },
+                new byte[] { 0, 3, 0, 3 },
+                new int[] { 0 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Conserve_Intermediary_Spaces()
+        {
+            FormattedCode res;
+
+            res = _parser.Format(
+                         "{\r\n" + 
+                         "    class A { }\r\n" +
+                         "}\r\n");
+
+            Assert.That(res.LineCount, Is.EqualTo(3));
+            Assert.That(res[0].Text, Is.EqualTo("{"));
+            Assert.That(res[1].Text, Is.EqualTo("    class A { }"));
+            Assert.That(res[2].Text, Is.EqualTo("}"));
+
+            Assert.That(res[0][0].Text, Is.EqualTo("{"));
+            Assert.That(res[1][0].Text, Is.EqualTo("    "));
+            Assert.That(res[1][1].Text, Is.EqualTo("class"));
+            Assert.That(res[1][2].Text, Is.EqualTo(" A { }"));
+            Assert.That(res[2][0].Text, Is.EqualTo("}"));
+
+            return;
+        }
+
+        #region TestingCSharpCodeFormatter
+
+        class TestingCSharpCodeFormatter :
+            CSharpCodeFormatter
+        {
+            public new string PreProcess(string text)
+            {
+                return (base.PreProcess(text));
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestLexer.cs b/src/GuiException/tests/CSharpParser/TestLexer.cs
index cda15db..9ab04ff 100644
--- a/src/GuiException/tests/CSharpParser/TestLexer.cs
+++ b/src/GuiException/tests/CSharpParser/TestLexer.cs
@@ -1,393 +1,393 @@
-// ****************************************************************
-// This 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 NUnit.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestLexer
-    {
-        private TestingLexer _lexer;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _lexer = new TestingLexer();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Default()
-        {
-            Assert.That(_lexer.CurrentToken, Is.Null);
-            Assert.That(_lexer.HasNext(), Is.False);
-            Assert.That(_lexer.Next(), Is.False);
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_SetText_Throws_NullArgumentException()
-        {
-            _lexer.Parse(null); // throws exception
-        }
-
-        private void _checkOutput(string sequence, LexToken[] expected)
-        {
-            Lexer lexer;
-            StringBuilder recognized;
-            string error;
-            int i;
-            int j;
-
-            lexer = new Lexer();
-            lexer.Parse(sequence);
-
-            recognized = new StringBuilder();
-
-            i = 0;
-            while (lexer.Next())
-            {
-                recognized.Append(lexer.CurrentToken.Text);
-
-                error = String.Format("Token [{0}] was expected, but lexer returned [{1}] instead, near: [{2}].",
-                    expected[i],
-                    lexer.CurrentToken,
-                    recognized.ToString());
-
-                Assert.That(lexer.CurrentToken, Is.EqualTo(expected[i]), error);
-
-                i++;
-            }
-
-            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
-
-            error = "missing ";
-            j = i;
-            while (j < expected.Length)
-            {
-                error += expected[j].ToString();
-                error += ", ";
-                ++j;
-            }
-
-            Assert.That(i == expected.Length, "Error, more tokens were expected. {0}", error);
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_Words()
-        {
-            _checkOutput("one two three\r\n'",
-                new LexToken[] {
-                    new TestingToken("one", 0, LexerTag.Text),
-                    new TestingToken(" ", 3, LexerTag.Separator),
-                    new TestingToken("two", 4, LexerTag.Text),
-                    new TestingToken(" ", 7, LexerTag.Separator),
-                    new TestingToken("three", 8, LexerTag.Text),
-                    new TestingToken("\r", 13, LexerTag.Separator),
-                    new TestingToken("\n", 14, LexerTag.EndOfLine),
-                    new TestingToken("'", 15, LexerTag.SingleQuote)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_SingleQuote()
-        {
-            _checkOutput("'hello'",
-                new LexToken[] {
-                    new TestingToken("'", 0, LexerTag.SingleQuote),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("'", 6, LexerTag.SingleQuote)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_DoubleQuote()
-        {
-            _checkOutput("\"hello\"",
-                new LexToken[] {
-                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("\"", 6, LexerTag.DoubleQuote)
-                });
-
-            // test to fail
-            // lexer should not be confused by escapment character \"
-            // expecting:
-            //  - \"
-            //  - \\\"
-            //  - hello
-            //  - \\\"
-            //  - \"
-
-            _checkOutput("\"\"hello\"\"",
-                new LexToken[] {
-                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
-                    new TestingToken("\"", 1, LexerTag.DoubleQuote),
-                    new TestingToken("hello", 2, LexerTag.Text),
-                    new TestingToken("\"", 7, LexerTag.DoubleQuote),
-                    new TestingToken("\"", 8, LexerTag.DoubleQuote)
-                });
-
-            // test to fail
-            // lexer should not be confused by escapment character \'
-            // expecting:
-            //  - \"
-            //  - \\\'
-            //  - A
-            //  - \\\'
-            //  - \"
-
-            _checkOutput("\"\'A\'\"",
-                new LexToken[] {
-                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
-                    new TestingToken("\'", 1, LexerTag.SingleQuote),
-                    new TestingToken("A", 2, LexerTag.Text),
-                    new TestingToken("\'", 3, LexerTag.SingleQuote),
-                    new TestingToken("\"", 4, LexerTag.DoubleQuote)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_NumberSign()
-        {
-            _checkOutput("#hello#",
-                new LexToken[] {
-                    new TestingToken("#", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("#", 6, LexerTag.Separator)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Dot_Character()
-        {
-            _checkOutput("this.Something",
-                new LexToken[] {
-                    new TestingToken("this", 0, LexerTag.Text),
-                    new TestingToken(".", 4, LexerTag.Separator),
-                    new TestingToken("Something", 5, LexerTag.Text)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_ColonCharacter()
-        {
-            _checkOutput(":a:",
-                new LexToken[] {
-                    new TestingToken(":", 0, LexerTag.Separator),
-                    new TestingToken("a", 1, LexerTag.Text),
-                    new TestingToken(":", 2, LexerTag.Separator)
-                });
-
-            _checkOutput("<a<",
-                new LexToken[] {
-                    new TestingToken("<", 0, LexerTag.Separator),
-                    new TestingToken("a", 1, LexerTag.Text),
-                    new TestingToken("<", 2, LexerTag.Separator)
-                });
-
-            _checkOutput(">a>",
-                new LexToken[] {
-                    new TestingToken(">", 0, LexerTag.Separator),
-                    new TestingToken("a", 1, LexerTag.Text),
-                    new TestingToken(">", 2, LexerTag.Separator)
-                });
-
-            _checkOutput(",a,",
-                new LexToken[] {
-                    new TestingToken(",", 0, LexerTag.Separator),
-                    new TestingToken("a", 1, LexerTag.Text),
-                    new TestingToken(",", 2, LexerTag.Separator)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_Equals()
-        {
-            _checkOutput("=a=",
-                new LexToken[] {
-                    new TestingToken("=", 0, LexerTag.Separator),
-                    new TestingToken("a", 1, LexerTag.Text),
-                    new TestingToken("=", 2, LexerTag.Separator)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_New_Line()
-        {
-            _checkOutput("\none\n",
-                new LexToken[] {
-                    new TestingToken("\n", 0, LexerTag.EndOfLine),
-                    new TestingToken("one", 1, LexerTag.Text),
-                    new TestingToken("\n", 4, LexerTag.EndOfLine)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_WhiteSpaces()
-        {
-            // test with space
-
-            _checkOutput(" hello ",
-                new LexToken[] {
-                    new TestingToken(" ", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken(" ", 6, LexerTag.Separator)
-                });
-
-            /// test with '\r'
-
-            _checkOutput("\rhello\r",
-                new LexToken[] {
-                    new TestingToken("\r", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("\r", 6, LexerTag.Separator)
-            });
-
-            // test with ';'
-
-            _checkOutput(";hello;",
-                new LexToken[] {
-                    new TestingToken(";", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken(";", 6, LexerTag.Separator)
-                });
-
-            // test with '['
-
-            _checkOutput("[hello[",
-                new LexToken[] {
-                    new TestingToken("[", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("[", 6, LexerTag.Separator)
-                });
-
-            // test with ']'
-
-            _checkOutput("]hello]",
-                new LexToken[] {
-                    new TestingToken("]", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("]", 6, LexerTag.Separator)
-                });
-
-            // test with '('
-
-            _checkOutput("(hello(",
-                new LexToken[] {
-                    new TestingToken("(", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken("(", 6, LexerTag.Separator)
-                });
-
-            // test with ')'
-
-            _checkOutput(")hello)",
-                new LexToken[] {
-                    new TestingToken(")", 0, LexerTag.Separator),
-                    new TestingToken("hello", 1, LexerTag.Text),
-                    new TestingToken(")", 6, LexerTag.Separator)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_CommentC()
-        {
-            _checkOutput("/*plop/*",
-                new LexToken[] {
-                    new TestingToken("/*", 0, LexerTag.CommentC_Open),
-                    new TestingToken("plop", 2, LexerTag.Text),
-                    new TestingToken("/*", 6, LexerTag.CommentC_Open)
-                });
-
-            // test with */
-            _checkOutput("*/plop*/",
-                new LexToken[] {
-                new TestingToken("*/", 0, LexerTag.CommentC_Close),
-                new TestingToken("plop", 2, LexerTag.Text),
-                new TestingToken("*/", 6, LexerTag.CommentC_Close)
-                });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Split_CommentCpp()
-        {
-            _checkOutput("//plop//",
-                new LexToken[] {
-                    new TestingToken("//", 0, LexerTag.CommentCpp),
-                    new TestingToken("plop", 2, LexerTag.Text),
-                    new TestingToken("//", 6, LexerTag.CommentCpp)
-                });
-
-            return;
-        }
-
-        #region TestingLexer
-
-        /// <summary>
-        /// Subclasses Lexer to access and test internal methods.
-        /// </summary>
-        class TestingLexer :
-            Lexer
-        {
-            public TestingLexer()
-            {
-            }
-
-            public new void Clear()
-            {
-                base.Clear();
-            }
-        }
-
-        #endregion
-
-        #region TestingToken
-
-        class TestingToken :
-            LexToken
-        {
-            public TestingToken(string text, int index, LexerTag tag)
-            {
-                _text = text;
-                _start = index;
-                _tag = tag;
-
-                return;
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This 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 NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestLexer
+    {
+        private TestingLexer _lexer;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _lexer = new TestingLexer();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_lexer.CurrentToken, Is.Null);
+            Assert.That(_lexer.HasNext(), Is.False);
+            Assert.That(_lexer.Next(), Is.False);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_SetText_Throws_NullArgumentException()
+        {
+            _lexer.Parse(null); // throws exception
+        }
+
+        private void _checkOutput(string sequence, LexToken[] expected)
+        {
+            Lexer lexer;
+            StringBuilder recognized;
+            string error;
+            int i;
+            int j;
+
+            lexer = new Lexer();
+            lexer.Parse(sequence);
+
+            recognized = new StringBuilder();
+
+            i = 0;
+            while (lexer.Next())
+            {
+                recognized.Append(lexer.CurrentToken.Text);
+
+                error = String.Format("Token [{0}] was expected, but lexer returned [{1}] instead, near: [{2}].",
+                    expected[i],
+                    lexer.CurrentToken,
+                    recognized.ToString());
+
+                Assert.That(lexer.CurrentToken, Is.EqualTo(expected[i]), error);
+
+                i++;
+            }
+
+            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
+
+            error = "missing ";
+            j = i;
+            while (j < expected.Length)
+            {
+                error += expected[j].ToString();
+                error += ", ";
+                ++j;
+            }
+
+            Assert.That(i == expected.Length, "Error, more tokens were expected. {0}", error);
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_Words()
+        {
+            _checkOutput("one two three\r\n'",
+                new LexToken[] {
+                    new TestingToken("one", 0, LexerTag.Text),
+                    new TestingToken(" ", 3, LexerTag.Separator),
+                    new TestingToken("two", 4, LexerTag.Text),
+                    new TestingToken(" ", 7, LexerTag.Separator),
+                    new TestingToken("three", 8, LexerTag.Text),
+                    new TestingToken("\r", 13, LexerTag.Separator),
+                    new TestingToken("\n", 14, LexerTag.EndOfLine),
+                    new TestingToken("'", 15, LexerTag.SingleQuote)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_SingleQuote()
+        {
+            _checkOutput("'hello'",
+                new LexToken[] {
+                    new TestingToken("'", 0, LexerTag.SingleQuote),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("'", 6, LexerTag.SingleQuote)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_DoubleQuote()
+        {
+            _checkOutput("\"hello\"",
+                new LexToken[] {
+                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("\"", 6, LexerTag.DoubleQuote)
+                });
+
+            // test to fail
+            // lexer should not be confused by escapment character \"
+            // expecting:
+            //  - \"
+            //  - \\\"
+            //  - hello
+            //  - \\\"
+            //  - \"
+
+            _checkOutput("\"\"hello\"\"",
+                new LexToken[] {
+                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
+                    new TestingToken("\"", 1, LexerTag.DoubleQuote),
+                    new TestingToken("hello", 2, LexerTag.Text),
+                    new TestingToken("\"", 7, LexerTag.DoubleQuote),
+                    new TestingToken("\"", 8, LexerTag.DoubleQuote)
+                });
+
+            // test to fail
+            // lexer should not be confused by escapment character \'
+            // expecting:
+            //  - \"
+            //  - \\\'
+            //  - A
+            //  - \\\'
+            //  - \"
+
+            _checkOutput("\"\'A\'\"",
+                new LexToken[] {
+                    new TestingToken("\"", 0, LexerTag.DoubleQuote),
+                    new TestingToken("\'", 1, LexerTag.SingleQuote),
+                    new TestingToken("A", 2, LexerTag.Text),
+                    new TestingToken("\'", 3, LexerTag.SingleQuote),
+                    new TestingToken("\"", 4, LexerTag.DoubleQuote)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_NumberSign()
+        {
+            _checkOutput("#hello#",
+                new LexToken[] {
+                    new TestingToken("#", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("#", 6, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Dot_Character()
+        {
+            _checkOutput("this.Something",
+                new LexToken[] {
+                    new TestingToken("this", 0, LexerTag.Text),
+                    new TestingToken(".", 4, LexerTag.Separator),
+                    new TestingToken("Something", 5, LexerTag.Text)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_ColonCharacter()
+        {
+            _checkOutput(":a:",
+                new LexToken[] {
+                    new TestingToken(":", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken(":", 2, LexerTag.Separator)
+                });
+
+            _checkOutput("<a<",
+                new LexToken[] {
+                    new TestingToken("<", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken("<", 2, LexerTag.Separator)
+                });
+
+            _checkOutput(">a>",
+                new LexToken[] {
+                    new TestingToken(">", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken(">", 2, LexerTag.Separator)
+                });
+
+            _checkOutput(",a,",
+                new LexToken[] {
+                    new TestingToken(",", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken(",", 2, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_Equals()
+        {
+            _checkOutput("=a=",
+                new LexToken[] {
+                    new TestingToken("=", 0, LexerTag.Separator),
+                    new TestingToken("a", 1, LexerTag.Text),
+                    new TestingToken("=", 2, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_New_Line()
+        {
+            _checkOutput("\none\n",
+                new LexToken[] {
+                    new TestingToken("\n", 0, LexerTag.EndOfLine),
+                    new TestingToken("one", 1, LexerTag.Text),
+                    new TestingToken("\n", 4, LexerTag.EndOfLine)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_WhiteSpaces()
+        {
+            // test with space
+
+            _checkOutput(" hello ",
+                new LexToken[] {
+                    new TestingToken(" ", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken(" ", 6, LexerTag.Separator)
+                });
+
+            /// test with '\r'
+
+            _checkOutput("\rhello\r",
+                new LexToken[] {
+                    new TestingToken("\r", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("\r", 6, LexerTag.Separator)
+            });
+
+            // test with ';'
+
+            _checkOutput(";hello;",
+                new LexToken[] {
+                    new TestingToken(";", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken(";", 6, LexerTag.Separator)
+                });
+
+            // test with '['
+
+            _checkOutput("[hello[",
+                new LexToken[] {
+                    new TestingToken("[", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("[", 6, LexerTag.Separator)
+                });
+
+            // test with ']'
+
+            _checkOutput("]hello]",
+                new LexToken[] {
+                    new TestingToken("]", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("]", 6, LexerTag.Separator)
+                });
+
+            // test with '('
+
+            _checkOutput("(hello(",
+                new LexToken[] {
+                    new TestingToken("(", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken("(", 6, LexerTag.Separator)
+                });
+
+            // test with ')'
+
+            _checkOutput(")hello)",
+                new LexToken[] {
+                    new TestingToken(")", 0, LexerTag.Separator),
+                    new TestingToken("hello", 1, LexerTag.Text),
+                    new TestingToken(")", 6, LexerTag.Separator)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_CommentC()
+        {
+            _checkOutput("/*plop/*",
+                new LexToken[] {
+                    new TestingToken("/*", 0, LexerTag.CommentC_Open),
+                    new TestingToken("plop", 2, LexerTag.Text),
+                    new TestingToken("/*", 6, LexerTag.CommentC_Open)
+                });
+
+            // test with */
+            _checkOutput("*/plop*/",
+                new LexToken[] {
+                new TestingToken("*/", 0, LexerTag.CommentC_Close),
+                new TestingToken("plop", 2, LexerTag.Text),
+                new TestingToken("*/", 6, LexerTag.CommentC_Close)
+                });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Split_CommentCpp()
+        {
+            _checkOutput("//plop//",
+                new LexToken[] {
+                    new TestingToken("//", 0, LexerTag.CommentCpp),
+                    new TestingToken("plop", 2, LexerTag.Text),
+                    new TestingToken("//", 6, LexerTag.CommentCpp)
+                });
+
+            return;
+        }
+
+        #region TestingLexer
+
+        /// <summary>
+        /// Subclasses Lexer to access and test internal methods.
+        /// </summary>
+        class TestingLexer :
+            Lexer
+        {
+            public TestingLexer()
+            {
+            }
+
+            public new void Clear()
+            {
+                base.Clear();
+            }
+        }
+
+        #endregion
+
+        #region TestingToken
+
+        class TestingToken :
+            LexToken
+        {
+            public TestingToken(string text, int index, LexerTag tag)
+            {
+                _text = text;
+                _start = index;
+                _tag = tag;
+
+                return;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestToken.cs b/src/GuiException/tests/CSharpParser/TestToken.cs
index b0d1426..e8d2141 100644
--- a/src/GuiException/tests/CSharpParser/TestToken.cs
+++ b/src/GuiException/tests/CSharpParser/TestToken.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestToken
-    {
-        [Test]
-        public void Test_Equals()
-        {
-            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(null), Is.False);
-            Assert.That(new TestingToken("text", 1, LexerTag.Text).Equals("text"), Is.False);
-            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
-                new TestingToken("", 0, LexerTag.Text)), Is.False);
-            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
-                new TestingToken("text", 1, LexerTag.Text)), Is.False);
-            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
-                new TestingToken("text", 0, LexerTag.SingleQuote)), Is.False);
-            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
-                new TestingToken("text", 0, LexerTag.Text)), Is.True);
-
-            return;
-        }
-
-        #region TestingToken
-
-        class TestingToken :
-            LexToken
-        {
-            public TestingToken(string text, int start, LexerTag attr)
-            {
-                _text = text;
-                _start = start;
-                _tag = attr;
-
-                return;
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestToken
+    {
+        [Test]
+        public void Test_Equals()
+        {
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(null), Is.False);
+            Assert.That(new TestingToken("text", 1, LexerTag.Text).Equals("text"), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("", 0, LexerTag.Text)), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("text", 1, LexerTag.Text)), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("text", 0, LexerTag.SingleQuote)), Is.False);
+            Assert.That(new TestingToken("text", 0, LexerTag.Text).Equals(
+                new TestingToken("text", 0, LexerTag.Text)), Is.True);
+
+            return;
+        }
+
+        #region TestingToken
+
+        class TestingToken :
+            LexToken
+        {
+            public TestingToken(string text, int start, LexerTag attr)
+            {
+                _text = text;
+                _start = start;
+                _tag = attr;
+
+                return;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs b/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
index ab2afc1..b43b78a 100644
--- a/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
+++ b/src/GuiException/tests/CSharpParser/TestTokenClassifier.cs
@@ -1,632 +1,632 @@
-// ****************************************************************
-// This 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 NUnit.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestTokenClassifier
-    {
-        private TestingClassifier _classifier;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _classifier = new TestingClassifier();
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_Classify_Can_Throw_ArgumentNullException()
-        {
-            _classifier.Classify(null); // throws exception
-        }
-
-        [Test]
-        public void Test_NewState()
-        {
-            // STATE_CODE
-
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.EndOfLine),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.Separator),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.Text),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentC_Open),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentC_Close),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentCpp),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.SingleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.DoubleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-
-            // STATE_COMMENT_C
-
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.EndOfLine),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.Separator),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.Text),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentC_Open),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentC_Close),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentCpp),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.SingleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.DoubleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
-
-            // STATE_COMMENT_CPP
-
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.EndOfLine),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.Separator),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.Text),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentC_Open),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentC_Close),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentCpp),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.SingleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.DoubleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
-
-            // SMSTATE_CHAR
-
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.EndOfLine),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.Separator),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.Text),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentC_Open),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentC_Close),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentCpp),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.SingleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.DoubleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
-
-            // SMSTATE_STRING
-
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.EndOfLine),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.Separator),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.Text),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentC_Open),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentC_Close),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentCpp),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.SingleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
-            Assert.That(
-                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.DoubleQuote),
-                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
-
-            return;
-        }
-
-        [Test]
-        public void test_AcceptToken()
-        {
-            _checkTag(
-                "\ncode/*comment*/\nint i;//comment2\nchar c='i';string s=\"test\";",
-                new Couple[] {
-                    new Couple(TokenClassifier.SMSTATE_CODE,            "\n"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,            "code"),
-                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "/*"),
-                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "comment"),
-                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "*/"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,            "\n"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,            "int"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "i"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             ";"),
-
-                    new Couple(TokenClassifier.SMSTATE_CPPCOMMENT,       "//"),
-                    new Couple(TokenClassifier.SMSTATE_CPPCOMMENT,       "comment2"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "\n"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "char"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "c"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "="),
-                    new Couple(TokenClassifier.SMSTATE_CHAR,             "'"),
-                    new Couple(TokenClassifier.SMSTATE_CHAR,             "i"),
-                    new Couple(TokenClassifier.SMSTATE_CHAR,             "'"),
-
-                    new Couple(TokenClassifier.SMSTATE_CODE,             ";"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "string"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "s"),
-                    new Couple(TokenClassifier.SMSTATE_CODE,             "="),
-                    new Couple(TokenClassifier.SMSTATE_STRING,           "\""),
-                    new Couple(TokenClassifier.SMSTATE_STRING,           "test"),
-                    new Couple(TokenClassifier.SMSTATE_STRING,           "\""),
-
-                    new Couple(TokenClassifier.SMSTATE_CODE,             ";")
-                });
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Test_Classify_Throw_NullArgException()
-        {
-            _classifier.Classify(null); // throws exception
-        }
-
-        [Test]
-        public void Test_Classify()
-        {
-            _checkClassification(
-                "\ncode/*comment*/\nint i;//comment2\nchar c='i';string s=\"test\";",
-                new Couple[] {
-                new Couple(ClassificationTag.Code,         "\n"),
-                new Couple(ClassificationTag.Code,         "code"),
-                new Couple(ClassificationTag.Comment,      "/*"),
-                new Couple(ClassificationTag.Comment,      "comment"),
-                new Couple(ClassificationTag.Comment,      "*/"),
-                new Couple(ClassificationTag.Code,         "\n"),
-                new Couple(ClassificationTag.Keyword,      "int"),
-                new Couple(ClassificationTag.Code,         " "),
-                new Couple(ClassificationTag.Code,         "i"),
-                new Couple(ClassificationTag.Code,         ";"),
-
-                new Couple(ClassificationTag.Comment,      "//"),
-                new Couple(ClassificationTag.Comment,      "comment2"),
-                new Couple(ClassificationTag.Code,         "\n"),
-                new Couple(ClassificationTag.Keyword,      "char"),
-                new Couple(ClassificationTag.Code,         " "),
-                new Couple(ClassificationTag.Code,         "c"),
-                new Couple(ClassificationTag.Code,         "="),
-                new Couple(ClassificationTag.String,       "'"),
-                new Couple(ClassificationTag.String,       "i"),
-                new Couple(ClassificationTag.String,       "'"),
-
-                new Couple(ClassificationTag.Code,         ";"),
-                new Couple(ClassificationTag.Keyword,      "string"),
-                new Couple(ClassificationTag.Code,         " "),
-                new Couple(ClassificationTag.Code,         "s"),
-                new Couple(ClassificationTag.Code,         "="),
-                new Couple(ClassificationTag.String,       "\""),
-                new Couple(ClassificationTag.String,       "test"),
-                new Couple(ClassificationTag.String,       "\""),
-
-                new Couple(ClassificationTag.Code,         ";")
-            });
-
-            return;
-        }
-
-        [Test]
-        public void Test_Classification_Cases()
-        {
-            _checkClassification("default:",
-                new Couple[] {
-                    new Couple(ClassificationTag.Keyword, "default"),
-                    new Couple(ClassificationTag.Code, ":")
-                });
-
-            _checkClassification("List<string>",
-                new Couple[]{
-                    new Couple(ClassificationTag.Code, "List"),
-                    new Couple(ClassificationTag.Code, "<"),
-                    new Couple(ClassificationTag.Keyword, "string"),
-                    new Couple(ClassificationTag.Code, ">")
-                });
-
-            _checkClassification("Dictionary<string, int>",
-                new Couple[] {
-                    new Couple(ClassificationTag.Code, "Dictionary"),
-                    new Couple(ClassificationTag.Code, "<"),
-                    new Couple(ClassificationTag.Keyword, "string"),
-                    new Couple(ClassificationTag.Code, ","),
-                    new Couple(ClassificationTag.Code, " "),
-                    new Couple(ClassificationTag.Keyword, "int"),
-                    new Couple(ClassificationTag.Code, ">")
-                });
-
-            return;
-        }
-
-
-        [Test]
-        public void Test_Classify_As_Keyword()
-        {
-            TokenClassifier classifier;
-            ClassificationTag result;
-            string error;
-            Lexer lexer;
-
-            lexer = new Lexer();
-            lexer.Parse(
-                "abstract event new struct as explicit null switch " +
-                "base extern object this bool false operator throw " +
-                "break finally out true byte fixed override try case " +
-                "float params typeof catch for private uint char " +
-                "foreach protected ulong checked goto public unchecked " +
-                "class if readonly unsafe const implicit ref ushort " +
-                "continue in return using decimal int sbyte virtual " +
-                "default interface sealed volatile delegate internal " +
-                "short void do is sizeof while double lock stackalloc " +
-                "else long static enum namespace string get set region " +
-                "endregion ");
-
-            classifier = new TokenClassifier();
-
-            while (lexer.Next())
-            {
-                if (lexer.CurrentToken.Text.Trim() == "")
-                    continue;
-
-                result = classifier.Classify(lexer.CurrentToken);
-
-                error = String.Format("Classification: [{0}] was expected for token [{1}] but [{2}] was returned.",
-                    ClassificationTag.Keyword,
-                    lexer.CurrentToken,
-                    result);
-
-                Assert.That(
-                    result,
-                    Is.EqualTo(ClassificationTag.Keyword),
-                    error);
-            }
-
-            return;
-        }
-
-        [Test]
-        public void Test_Reset()
-        {
-            Lexer lexer;
-
-            lexer = new Lexer();
-            lexer.Parse("/*int");
-
-            lexer.Next();
-            _classifier.Classify(lexer.CurrentToken);
-
-            _classifier.Reset();
-            lexer.Next();
-            Assert.That(_classifier.Classify(lexer.CurrentToken), Is.EqualTo(ClassificationTag.Keyword));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Escaping_sequence()
-        {
-            Lexer _lexer;
-
-            _lexer = new Lexer();
-
-            // this ensure that escaping can be set in string context only
-
-            _lexer.Parse("\\\\");
-            _classifier.Reset();
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
-            Assert.That(_classifier.Escaping, Is.False);
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
-            Assert.That(_classifier.Escaping, Is.False);
-
-
-            // this ensure that parsing "\\\\" two times
-            // set and unset Escaping flag correctly
-
-            _lexer.Parse("\"\\\\\"");
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_classifier.Escaping, Is.False);
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-            Assert.That(_classifier.Escaping, Is.True);
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-            Assert.That(_classifier.Escaping, Is.False);
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-            Assert.That(_classifier.Escaping, Is.False);
-
-
-            // this ensure that first 'a' is considered as string, second as code
-
-            _lexer.Parse("\"\\\"a\"a");
-            _classifier.Reset();
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-            Assert.That(_classifier.Escaping, Is.True);
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-            Assert.That(_classifier.Escaping, Is.False);
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
-
-
-            // another test, this time 'a' should be considered as code
-
-            _lexer.Parse("\"\\\\\"a\"");
-            _classifier.Reset();
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
-
-            Assert.That(_lexer.Next(), Is.True);
-            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
-            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
-
-
-            // this ensure that Reset() reset escaping to false
-
-            _lexer.Parse("\"\\");
-            _lexer.Next();
-            _classifier.Classify(_lexer.CurrentToken);
-            _lexer.Next();
-            _classifier.Classify(_lexer.CurrentToken);
-            Assert.That(_classifier.Escaping, Is.True);
-            _classifier.Reset();
-            Assert.That(_classifier.Escaping, Is.False);
-
-            return;
-        }
-
-        #region utility methods
-
-        private void _checkTag(string sequence, Couple[] expected)
-        {
-            Lexer lexer;
-            int returned_tag;
-            TestingClassifier classifier;
-            StringBuilder recognized;
-            string error;
-
-            int i;
-
-            classifier = new TestingClassifier();
-            lexer = new Lexer();
-            lexer.Parse(sequence);
-
-            recognized = new StringBuilder();
-
-            i = 0;
-            while (lexer.Next())
-            {
-                recognized.Append(lexer.CurrentToken.Text);
-
-                error = String.Format(
-                    "Token [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
-                    expected[i].Text,
-                    lexer.CurrentToken.Text,
-                    recognized.ToString());
-                Assert.That(lexer.CurrentToken.Text, Is.EqualTo(expected[i].Text), error);
-
-                returned_tag = classifier.AcceptLexToken(lexer.CurrentToken);
-
-                error = String.Format(
-                    "Tag [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
-                    expected[i].Value,
-                    returned_tag,
-                    recognized.ToString());
-                Assert.That(returned_tag, Is.EqualTo(expected[i].Value), error);
-
-                i++;
-            }
-
-            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
-            Assert.That(i == expected.Length, "Error, more tokens were expected.");
-
-            return;
-        }
-
-        private void _checkClassification(string sequence, Couple[] expected)
-        {
-            Lexer lexer;
-            ClassificationTag returned_tag;
-            TestingClassifier classifier;
-            StringBuilder recognized;
-            string error;
-
-            int i;
-
-            classifier = new TestingClassifier();
-            lexer = new Lexer();
-            lexer.Parse(sequence);
-
-            recognized = new StringBuilder();
-
-            i = 0;
-            while (lexer.Next())
-            {
-                recognized.Append(lexer.CurrentToken.Text);
-
-                error = String.Format(
-                    "Token [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
-                    expected[i].Text,
-                    lexer.CurrentToken.Text,
-                    recognized.ToString());
-                Assert.That(lexer.CurrentToken.Text, Is.EqualTo(expected[i].Text), error);
-
-                returned_tag = classifier.Classify(lexer.CurrentToken);
-
-                error = String.Format(
-                    "ClassificationTag [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
-                    expected[i].Value,
-                    returned_tag,
-                    recognized.ToString());
-                Assert.That(returned_tag, Is.EqualTo(expected[i].Value), error);
-
-                i++;
-            }
-
-            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
-            Assert.That(i == expected.Length, "Error, more tokens were expected.");
-
-            return;
-        }
-
-        #endregion
-
-        #region TestingClassifier
-
-        class TestingClassifier :
-            TokenClassifier
-        {
-            public static string ClassString(int code)
-            {
-                switch (code)
-                {
-                    case TokenClassifier.SMSTATE_CODE:
-                        return ("STATE_CODE");
-                    case TokenClassifier.SMSTATE_CCOMMENT:
-                        return ("STATE_COMMENT_C");
-                    case TokenClassifier.SMSTATE_CPPCOMMENT:
-                        return ("STATE_COMMENT_CPP");
-                    case TokenClassifier.SMSTATE_CHAR:
-                        return ("SMSTATE_CHAR");
-                    case TokenClassifier.SMSTATE_STRING:
-                        return ("SMSTATE_STRING");
-                    default:
-                        break;
-                }
-
-                return ("unknown code=" + code);
-            }
-
-            public new int AcceptLexToken(LexToken token)
-            {
-                return (base.AcceptLexToken(token));
-            }
-
-            public new int GetSMSTATE(int stateCode, LexerTag transition)
-            {
-                return (base.GetSMSTATE(stateCode, transition));
-            }
-        }
-
-        #endregion
-
-        #region Couple
-
-        class Couple
-        {
-            public object Value;
-            public string Text;
-
-            public Couple(object value, string text)
-            {
-                Value = value;
-                Text = text;
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This 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 NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestTokenClassifier
+    {
+        private TestingClassifier _classifier;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _classifier = new TestingClassifier();
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Classify_Can_Throw_ArgumentNullException()
+        {
+            _classifier.Classify(null); // throws exception
+        }
+
+        [Test]
+        public void Test_NewState()
+        {
+            // STATE_CODE
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CODE, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+
+            // STATE_COMMENT_C
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CCOMMENT, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CCOMMENT));
+
+            // STATE_COMMENT_CPP
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CPPCOMMENT, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CPPCOMMENT));
+
+            // SMSTATE_CHAR
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_CHAR, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CHAR));
+
+            // SMSTATE_STRING
+
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.EndOfLine),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.Separator),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.Text),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentC_Open),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentC_Close),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.CommentCpp),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.SingleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_STRING));
+            Assert.That(
+                _classifier.GetSMSTATE(TokenClassifier.SMSTATE_STRING, LexerTag.DoubleQuote),
+                Is.EqualTo(TokenClassifier.SMSTATE_CODE));
+
+            return;
+        }
+
+        [Test]
+        public void test_AcceptToken()
+        {
+            _checkTag(
+                "\ncode/*comment*/\nint i;//comment2\nchar c='i';string s=\"test\";",
+                new Couple[] {
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "\n"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "code"),
+                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "/*"),
+                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "comment"),
+                    new Couple(TokenClassifier.SMSTATE_CCOMMENT,        "*/"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "\n"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,            "int"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "i"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             ";"),
+
+                    new Couple(TokenClassifier.SMSTATE_CPPCOMMENT,       "//"),
+                    new Couple(TokenClassifier.SMSTATE_CPPCOMMENT,       "comment2"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "\n"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "char"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "c"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "="),
+                    new Couple(TokenClassifier.SMSTATE_CHAR,             "'"),
+                    new Couple(TokenClassifier.SMSTATE_CHAR,             "i"),
+                    new Couple(TokenClassifier.SMSTATE_CHAR,             "'"),
+
+                    new Couple(TokenClassifier.SMSTATE_CODE,             ";"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "string"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             " "),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "s"),
+                    new Couple(TokenClassifier.SMSTATE_CODE,             "="),
+                    new Couple(TokenClassifier.SMSTATE_STRING,           "\""),
+                    new Couple(TokenClassifier.SMSTATE_STRING,           "test"),
+                    new Couple(TokenClassifier.SMSTATE_STRING,           "\""),
+
+                    new Couple(TokenClassifier.SMSTATE_CODE,             ";")
+                });
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Test_Classify_Throw_NullArgException()
+        {
+            _classifier.Classify(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Classify()
+        {
+            _checkClassification(
+                "\ncode/*comment*/\nint i;//comment2\nchar c='i';string s=\"test\";",
+                new Couple[] {
+                new Couple(ClassificationTag.Code,         "\n"),
+                new Couple(ClassificationTag.Code,         "code"),
+                new Couple(ClassificationTag.Comment,      "/*"),
+                new Couple(ClassificationTag.Comment,      "comment"),
+                new Couple(ClassificationTag.Comment,      "*/"),
+                new Couple(ClassificationTag.Code,         "\n"),
+                new Couple(ClassificationTag.Keyword,      "int"),
+                new Couple(ClassificationTag.Code,         " "),
+                new Couple(ClassificationTag.Code,         "i"),
+                new Couple(ClassificationTag.Code,         ";"),
+
+                new Couple(ClassificationTag.Comment,      "//"),
+                new Couple(ClassificationTag.Comment,      "comment2"),
+                new Couple(ClassificationTag.Code,         "\n"),
+                new Couple(ClassificationTag.Keyword,      "char"),
+                new Couple(ClassificationTag.Code,         " "),
+                new Couple(ClassificationTag.Code,         "c"),
+                new Couple(ClassificationTag.Code,         "="),
+                new Couple(ClassificationTag.String,       "'"),
+                new Couple(ClassificationTag.String,       "i"),
+                new Couple(ClassificationTag.String,       "'"),
+
+                new Couple(ClassificationTag.Code,         ";"),
+                new Couple(ClassificationTag.Keyword,      "string"),
+                new Couple(ClassificationTag.Code,         " "),
+                new Couple(ClassificationTag.Code,         "s"),
+                new Couple(ClassificationTag.Code,         "="),
+                new Couple(ClassificationTag.String,       "\""),
+                new Couple(ClassificationTag.String,       "test"),
+                new Couple(ClassificationTag.String,       "\""),
+
+                new Couple(ClassificationTag.Code,         ";")
+            });
+
+            return;
+        }
+
+        [Test]
+        public void Test_Classification_Cases()
+        {
+            _checkClassification("default:",
+                new Couple[] {
+                    new Couple(ClassificationTag.Keyword, "default"),
+                    new Couple(ClassificationTag.Code, ":")
+                });
+
+            _checkClassification("List<string>",
+                new Couple[]{
+                    new Couple(ClassificationTag.Code, "List"),
+                    new Couple(ClassificationTag.Code, "<"),
+                    new Couple(ClassificationTag.Keyword, "string"),
+                    new Couple(ClassificationTag.Code, ">")
+                });
+
+            _checkClassification("Dictionary<string, int>",
+                new Couple[] {
+                    new Couple(ClassificationTag.Code, "Dictionary"),
+                    new Couple(ClassificationTag.Code, "<"),
+                    new Couple(ClassificationTag.Keyword, "string"),
+                    new Couple(ClassificationTag.Code, ","),
+                    new Couple(ClassificationTag.Code, " "),
+                    new Couple(ClassificationTag.Keyword, "int"),
+                    new Couple(ClassificationTag.Code, ">")
+                });
+
+            return;
+        }
+
+
+        [Test]
+        public void Test_Classify_As_Keyword()
+        {
+            TokenClassifier classifier;
+            ClassificationTag result;
+            string error;
+            Lexer lexer;
+
+            lexer = new Lexer();
+            lexer.Parse(
+                "abstract event new struct as explicit null switch " +
+                "base extern object this bool false operator throw " +
+                "break finally out true byte fixed override try case " +
+                "float params typeof catch for private uint char " +
+                "foreach protected ulong checked goto public unchecked " +
+                "class if readonly unsafe const implicit ref ushort " +
+                "continue in return using decimal int sbyte virtual " +
+                "default interface sealed volatile delegate internal " +
+                "short void do is sizeof while double lock stackalloc " +
+                "else long static enum namespace string get set region " +
+                "endregion ");
+
+            classifier = new TokenClassifier();
+
+            while (lexer.Next())
+            {
+                if (lexer.CurrentToken.Text.Trim() == "")
+                    continue;
+
+                result = classifier.Classify(lexer.CurrentToken);
+
+                error = String.Format("Classification: [{0}] was expected for token [{1}] but [{2}] was returned.",
+                    ClassificationTag.Keyword,
+                    lexer.CurrentToken,
+                    result);
+
+                Assert.That(
+                    result,
+                    Is.EqualTo(ClassificationTag.Keyword),
+                    error);
+            }
+
+            return;
+        }
+
+        [Test]
+        public void Test_Reset()
+        {
+            Lexer lexer;
+
+            lexer = new Lexer();
+            lexer.Parse("/*int");
+
+            lexer.Next();
+            _classifier.Classify(lexer.CurrentToken);
+
+            _classifier.Reset();
+            lexer.Next();
+            Assert.That(_classifier.Classify(lexer.CurrentToken), Is.EqualTo(ClassificationTag.Keyword));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Escaping_sequence()
+        {
+            Lexer _lexer;
+
+            _lexer = new Lexer();
+
+            // this ensure that escaping can be set in string context only
+
+            _lexer.Parse("\\\\");
+            _classifier.Reset();
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_classifier.Escaping, Is.False);
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+            Assert.That(_classifier.Escaping, Is.False);
+
+
+            // this ensure that parsing "\\\\" two times
+            // set and unset Escaping flag correctly
+
+            _lexer.Parse("\"\\\\\"");
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_classifier.Escaping, Is.False);
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.True);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.False);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.False);
+
+
+            // this ensure that first 'a' is considered as string, second as code
+
+            _lexer.Parse("\"\\\"a\"a");
+            _classifier.Reset();
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.True);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+            Assert.That(_classifier.Escaping, Is.False);
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+
+
+            // another test, this time 'a' should be considered as code
+
+            _lexer.Parse("\"\\\\\"a\"");
+            _classifier.Reset();
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\\"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("\""));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.String));
+
+            Assert.That(_lexer.Next(), Is.True);
+            Assert.That(_lexer.CurrentToken.Text, Is.EqualTo("a"));
+            Assert.That(_classifier.Classify(_lexer.CurrentToken), Is.EqualTo(ClassificationTag.Code));
+
+
+            // this ensure that Reset() reset escaping to false
+
+            _lexer.Parse("\"\\");
+            _lexer.Next();
+            _classifier.Classify(_lexer.CurrentToken);
+            _lexer.Next();
+            _classifier.Classify(_lexer.CurrentToken);
+            Assert.That(_classifier.Escaping, Is.True);
+            _classifier.Reset();
+            Assert.That(_classifier.Escaping, Is.False);
+
+            return;
+        }
+
+        #region utility methods
+
+        private void _checkTag(string sequence, Couple[] expected)
+        {
+            Lexer lexer;
+            int returned_tag;
+            TestingClassifier classifier;
+            StringBuilder recognized;
+            string error;
+
+            int i;
+
+            classifier = new TestingClassifier();
+            lexer = new Lexer();
+            lexer.Parse(sequence);
+
+            recognized = new StringBuilder();
+
+            i = 0;
+            while (lexer.Next())
+            {
+                recognized.Append(lexer.CurrentToken.Text);
+
+                error = String.Format(
+                    "Token [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Text,
+                    lexer.CurrentToken.Text,
+                    recognized.ToString());
+                Assert.That(lexer.CurrentToken.Text, Is.EqualTo(expected[i].Text), error);
+
+                returned_tag = classifier.AcceptLexToken(lexer.CurrentToken);
+
+                error = String.Format(
+                    "Tag [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Value,
+                    returned_tag,
+                    recognized.ToString());
+                Assert.That(returned_tag, Is.EqualTo(expected[i].Value), error);
+
+                i++;
+            }
+
+            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
+            Assert.That(i == expected.Length, "Error, more tokens were expected.");
+
+            return;
+        }
+
+        private void _checkClassification(string sequence, Couple[] expected)
+        {
+            Lexer lexer;
+            ClassificationTag returned_tag;
+            TestingClassifier classifier;
+            StringBuilder recognized;
+            string error;
+
+            int i;
+
+            classifier = new TestingClassifier();
+            lexer = new Lexer();
+            lexer.Parse(sequence);
+
+            recognized = new StringBuilder();
+
+            i = 0;
+            while (lexer.Next())
+            {
+                recognized.Append(lexer.CurrentToken.Text);
+
+                error = String.Format(
+                    "Token [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Text,
+                    lexer.CurrentToken.Text,
+                    recognized.ToString());
+                Assert.That(lexer.CurrentToken.Text, Is.EqualTo(expected[i].Text), error);
+
+                returned_tag = classifier.Classify(lexer.CurrentToken);
+
+                error = String.Format(
+                    "ClassificationTag [{0}] was expected, but [{1}] was returned instead, near: [{2}].",
+                    expected[i].Value,
+                    returned_tag,
+                    recognized.ToString());
+                Assert.That(returned_tag, Is.EqualTo(expected[i].Value), error);
+
+                i++;
+            }
+
+            Assert.That(lexer.Next(), Is.False, "Error, there are unvisited tokens left.");
+            Assert.That(i == expected.Length, "Error, more tokens were expected.");
+
+            return;
+        }
+
+        #endregion
+
+        #region TestingClassifier
+
+        class TestingClassifier :
+            TokenClassifier
+        {
+            public static string ClassString(int code)
+            {
+                switch (code)
+                {
+                    case TokenClassifier.SMSTATE_CODE:
+                        return ("STATE_CODE");
+                    case TokenClassifier.SMSTATE_CCOMMENT:
+                        return ("STATE_COMMENT_C");
+                    case TokenClassifier.SMSTATE_CPPCOMMENT:
+                        return ("STATE_COMMENT_CPP");
+                    case TokenClassifier.SMSTATE_CHAR:
+                        return ("SMSTATE_CHAR");
+                    case TokenClassifier.SMSTATE_STRING:
+                        return ("SMSTATE_STRING");
+                    default:
+                        break;
+                }
+
+                return ("unknown code=" + code);
+            }
+
+            public new int AcceptLexToken(LexToken token)
+            {
+                return (base.AcceptLexToken(token));
+            }
+
+            public new int GetSMSTATE(int stateCode, LexerTag transition)
+            {
+                return (base.GetSMSTATE(stateCode, transition));
+            }
+        }
+
+        #endregion
+
+        #region Couple
+
+        class Couple
+        {
+            public object Value;
+            public string Text;
+
+            public Couple(object value, string text)
+            {
+                Value = value;
+                Text = text;
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs b/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs
index c7b9da6..e586aee 100644
--- a/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs
+++ b/src/GuiException/tests/CSharpParser/TestTokenDictionary.cs
@@ -1,290 +1,290 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestTokenDictionary
-    {
-        private TestingTokenDictionary _emptyDictionary;
-        private TokenDictionary _filledDictionary;
-
-        [SetUp]
-        public void SetUp()
-        {
-            Lexer lexer;
-
-            _emptyDictionary = new TestingTokenDictionary();
-
-            lexer = new Lexer();
-            _filledDictionary = lexer.Dictionary;
-            Assert.That(_filledDictionary, Is.Not.Null);
-            Assert.That(_filledDictionary.Count, Is.GreaterThan(0));
-
-            return;
-        }
-
-        [Test]
-        public void test_default()
-        {
-            Assert.That(_emptyDictionary.Count, Is.EqualTo(0));
-
-            return;
-        }
-
-        [Test]
-        public void add_token()
-        {
-            _emptyDictionary.Add("=", LexerTag.Separator);
-
-            Assert.That(_emptyDictionary.Count, Is.EqualTo(1));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Add_can_throw_NullValueException()
-        {
-            _emptyDictionary.Add(null, LexerTag.Separator); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "Token 'one' is already defined.",
-            MatchType = MessageMatch.Contains)]
-        public void Add_can_throw_AlreadyDefinedException()
-        {
-            _emptyDictionary.Add("one", LexerTag.Text);
-            _emptyDictionary.Add("one", LexerTag.Text); // throws exception
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "Token value must not be empty.",
-            MatchType = MessageMatch.Contains)]
-        public void Add_can_throw_EmptySequenceException()
-        {
-            _emptyDictionary.Add("", LexerTag.Text); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "Tokens must be inserted from the longest to the shortest value.",
-            MatchType = MessageMatch.Contains)]
-        public void Add_can_throw_InvalidSortException()
-        {
-            _emptyDictionary.Add("one", LexerTag.CommentC_Close);
-            _emptyDictionary.Add("to", LexerTag.CommentC_Close);
-            _emptyDictionary.Add("four", LexerTag.CommentC_Close); // throws exception
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void PopulateTokenStartingWith_can_throw_NullStarterException()
-        {
-            _emptyDictionary.PopulateTokenStartingWith(
-                null, new List<LexToken>()); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void PopulateTokenStartingWith_can_throw_NullOutputException()
-        {
-            LexToken token;
-
-            _emptyDictionary.Add("=", LexerTag.Separator);
-            token = _emptyDictionary[0];
-
-            _emptyDictionary.PopulateTokenStartingWith(token, null); // throws exception
-
-            return;
-        }
-
-        [Test]
-        public void PopulateTokenStartingWith()
-        {
-            List<LexToken> list;
-            LexToken token_0;
-            LexToken token_1;
-            LexToken token_2;
-            LexToken token_3;
-            LexToken token_4;
-
-            _emptyDictionary.Add("==", LexerTag.Separator);
-            _emptyDictionary.Add("<=", LexerTag.Separator);
-            _emptyDictionary.Add("=", LexerTag.Separator);
-            _emptyDictionary.Add("<", LexerTag.Separator);
-            _emptyDictionary.Add(";", LexerTag.Separator);
-
-            token_0 = _emptyDictionary[0]; // ==
-            token_1 = _emptyDictionary[1]; // <=
-            token_2 = _emptyDictionary[2]; // =
-            token_3 = _emptyDictionary[3]; // <
-            token_4 = _emptyDictionary[4]; // ;
-
-            list = new List<LexToken>();
-
-            // there is only one token starting with text: "=="
-
-            list.Clear();
-            _emptyDictionary.PopulateTokenStartingWith(token_0, list);
-            Assert.That(list.Count, Is.EqualTo(1));
-            Assert.That(list[0], Is.EqualTo(token_0));
-
-            // there is only one token starting with text: "<="
-
-            list.Clear();
-            _emptyDictionary.PopulateTokenStartingWith(token_1, list);
-            Assert.That(list.Count, Is.EqualTo(1));
-            Assert.That(list[0], Is.EqualTo(token_1));
-
-            // but, two tokens start with: "="
-
-            list.Clear();
-            _emptyDictionary.PopulateTokenStartingWith(token_2, list);
-            Assert.That(list.Count, Is.EqualTo(2));
-            Assert.That(list[0], Is.EqualTo(token_2));
-            Assert.That(list[1], Is.EqualTo(token_0));
-
-            // two tokens start with: "<"
-
-            list.Clear();
-            _emptyDictionary.PopulateTokenStartingWith(token_3, list);
-            Assert.That(list.Count, Is.EqualTo(2));
-            Assert.That(list[0], Is.EqualTo(token_3));
-            Assert.That(list[1], Is.EqualTo(token_1));
-
-            // only one token starts with: ";"
-
-            list.Clear();
-            _emptyDictionary.PopulateTokenStartingWith(token_4, list);
-            Assert.That(list.Count, Is.EqualTo(1));
-            Assert.That(list[0], Is.EqualTo(token_4));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void TryMatch_can_throw_NullTextException()
-        {
-            _emptyDictionary.TryMatch(null, ""); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void TryMatch_can_throw_NullPredictionException()
-        {
-            _emptyDictionary.TryMatch("", null); // throws exception
-        }
-
-        [Test]
-        public void TryMatch_no_prediction()
-        {
-            LexToken match;
-            string[] tab;
-
-            tab = new string[] {
-                "\\\"", "\\\'", "/*", "*/", "//", "\\", " ", "\t", "\r", 
-                ".", ";", "[", "]", "(", ")", "#", ":", "<", ">", "=", 
-                ",", "\n", "'", "\""};
-
-            foreach (string item in tab)
-                _emptyDictionary.Add(item, LexerTag.Separator);
-
-            // this test checks that TryMatch() doesn't fail
-            // to identify tokens when they are passed to the method
-            // as they are declared
-
-            foreach (string item in tab)
-            {
-                match = _emptyDictionary.TryMatch(item, "");
-                Assert.That(match, Is.Not.Null);
-                Assert.That(match.Text, Is.EqualTo(item));
-                Assert.That(match.Tag, Is.EqualTo(LexerTag.Separator));
-            }
-
-            foreach (string item in tab)
-            {
-                match = _emptyDictionary.TryMatch("123" + item, "");
-                Assert.That(match, Is.Not.Null);
-                Assert.That(match.Text, Is.EqualTo("123"));
-                Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
-            }
-
-            return;
-        }
-
-        [Test]
-        public void TryMatch_prediction()
-        {
-            LexToken match;
-
-            _emptyDictionary.Add("===", LexerTag.Separator);
-            _emptyDictionary.Add("=", LexerTag.Separator);
-
-            // Use TryMatch as it would be by Lexer when analyzing "a=a" sequence.
-
-            Assert.That(_emptyDictionary.TryMatch("a", "=a"), Is.Null);
-
-            match = _emptyDictionary.TryMatch("a=", "a");      // the first 'a' should be consummed
-            Assert.That(match, Is.Not.Null);
-            Assert.That(match.Text, Is.EqualTo("a"));
-            Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
-
-            match = _emptyDictionary.TryMatch("=", "a");       // this should consume '='
-            Assert.That(match, Is.Not.Null);
-            Assert.That(match.Text, Is.EqualTo("="));
-            Assert.That(match.Tag, Is.EqualTo(LexerTag.Separator));
-
-            match = _emptyDictionary.TryMatch("a", "");       // this should consume last 'a'
-            Assert.That(match, Is.Not.Null);
-            Assert.That(match.Text, Is.EqualTo("a"));
-            Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
-
-            // Use TryMatch as it would be by Lexer when analyzing "a===a" sequence
-
-            Assert.That(_emptyDictionary.TryMatch("a", "==="), Is.Null);
-
-            match = _emptyDictionary.TryMatch("a=", "==a");  // this should consume 'a'
-            Assert.That(match, Is.Not.Null);
-            Assert.That(match.Text, Is.EqualTo("a"));
-
-            match = _emptyDictionary.TryMatch("=", "==a");
-            Assert.That(match, Is.Not.Null);
-            Assert.That(match.Text, Is.EqualTo("==="));
-
-            match = _emptyDictionary.TryMatch("a", "");
-            Assert.That(match, Is.Not.Null);
-            Assert.That(match.Text, Is.EqualTo("a"));       // this should consume last 'a'
-
-            return;
-        }
-
-        #region TestingTokenDictionary
-
-        class TestingTokenDictionary :
-            TokenDictionary
-        {
-            public new void PopulateTokenStartingWith(LexToken starter, List<LexToken> output)
-            {
-                base.PopulateTokenStartingWith(starter, output);
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestTokenDictionary
+    {
+        private TestingTokenDictionary _emptyDictionary;
+        private TokenDictionary _filledDictionary;
+
+        [SetUp]
+        public void SetUp()
+        {
+            Lexer lexer;
+
+            _emptyDictionary = new TestingTokenDictionary();
+
+            lexer = new Lexer();
+            _filledDictionary = lexer.Dictionary;
+            Assert.That(_filledDictionary, Is.Not.Null);
+            Assert.That(_filledDictionary.Count, Is.GreaterThan(0));
+
+            return;
+        }
+
+        [Test]
+        public void test_default()
+        {
+            Assert.That(_emptyDictionary.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void add_token()
+        {
+            _emptyDictionary.Add("=", LexerTag.Separator);
+
+            Assert.That(_emptyDictionary.Count, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Add_can_throw_NullValueException()
+        {
+            _emptyDictionary.Add(null, LexerTag.Separator); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Token 'one' is already defined.",
+            MatchType = MessageMatch.Contains)]
+        public void Add_can_throw_AlreadyDefinedException()
+        {
+            _emptyDictionary.Add("one", LexerTag.Text);
+            _emptyDictionary.Add("one", LexerTag.Text); // throws exception
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Token value must not be empty.",
+            MatchType = MessageMatch.Contains)]
+        public void Add_can_throw_EmptySequenceException()
+        {
+            _emptyDictionary.Add("", LexerTag.Text); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "Tokens must be inserted from the longest to the shortest value.",
+            MatchType = MessageMatch.Contains)]
+        public void Add_can_throw_InvalidSortException()
+        {
+            _emptyDictionary.Add("one", LexerTag.CommentC_Close);
+            _emptyDictionary.Add("to", LexerTag.CommentC_Close);
+            _emptyDictionary.Add("four", LexerTag.CommentC_Close); // throws exception
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void PopulateTokenStartingWith_can_throw_NullStarterException()
+        {
+            _emptyDictionary.PopulateTokenStartingWith(
+                null, new List<LexToken>()); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void PopulateTokenStartingWith_can_throw_NullOutputException()
+        {
+            LexToken token;
+
+            _emptyDictionary.Add("=", LexerTag.Separator);
+            token = _emptyDictionary[0];
+
+            _emptyDictionary.PopulateTokenStartingWith(token, null); // throws exception
+
+            return;
+        }
+
+        [Test]
+        public void PopulateTokenStartingWith()
+        {
+            List<LexToken> list;
+            LexToken token_0;
+            LexToken token_1;
+            LexToken token_2;
+            LexToken token_3;
+            LexToken token_4;
+
+            _emptyDictionary.Add("==", LexerTag.Separator);
+            _emptyDictionary.Add("<=", LexerTag.Separator);
+            _emptyDictionary.Add("=", LexerTag.Separator);
+            _emptyDictionary.Add("<", LexerTag.Separator);
+            _emptyDictionary.Add(";", LexerTag.Separator);
+
+            token_0 = _emptyDictionary[0]; // ==
+            token_1 = _emptyDictionary[1]; // <=
+            token_2 = _emptyDictionary[2]; // =
+            token_3 = _emptyDictionary[3]; // <
+            token_4 = _emptyDictionary[4]; // ;
+
+            list = new List<LexToken>();
+
+            // there is only one token starting with text: "=="
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_0, list);
+            Assert.That(list.Count, Is.EqualTo(1));
+            Assert.That(list[0], Is.EqualTo(token_0));
+
+            // there is only one token starting with text: "<="
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_1, list);
+            Assert.That(list.Count, Is.EqualTo(1));
+            Assert.That(list[0], Is.EqualTo(token_1));
+
+            // but, two tokens start with: "="
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_2, list);
+            Assert.That(list.Count, Is.EqualTo(2));
+            Assert.That(list[0], Is.EqualTo(token_2));
+            Assert.That(list[1], Is.EqualTo(token_0));
+
+            // two tokens start with: "<"
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_3, list);
+            Assert.That(list.Count, Is.EqualTo(2));
+            Assert.That(list[0], Is.EqualTo(token_3));
+            Assert.That(list[1], Is.EqualTo(token_1));
+
+            // only one token starts with: ";"
+
+            list.Clear();
+            _emptyDictionary.PopulateTokenStartingWith(token_4, list);
+            Assert.That(list.Count, Is.EqualTo(1));
+            Assert.That(list[0], Is.EqualTo(token_4));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TryMatch_can_throw_NullTextException()
+        {
+            _emptyDictionary.TryMatch(null, ""); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void TryMatch_can_throw_NullPredictionException()
+        {
+            _emptyDictionary.TryMatch("", null); // throws exception
+        }
+
+        [Test]
+        public void TryMatch_no_prediction()
+        {
+            LexToken match;
+            string[] tab;
+
+            tab = new string[] {
+                "\\\"", "\\\'", "/*", "*/", "//", "\\", " ", "\t", "\r", 
+                ".", ";", "[", "]", "(", ")", "#", ":", "<", ">", "=", 
+                ",", "\n", "'", "\""};
+
+            foreach (string item in tab)
+                _emptyDictionary.Add(item, LexerTag.Separator);
+
+            // this test checks that TryMatch() doesn't fail
+            // to identify tokens when they are passed to the method
+            // as they are declared
+
+            foreach (string item in tab)
+            {
+                match = _emptyDictionary.TryMatch(item, "");
+                Assert.That(match, Is.Not.Null);
+                Assert.That(match.Text, Is.EqualTo(item));
+                Assert.That(match.Tag, Is.EqualTo(LexerTag.Separator));
+            }
+
+            foreach (string item in tab)
+            {
+                match = _emptyDictionary.TryMatch("123" + item, "");
+                Assert.That(match, Is.Not.Null);
+                Assert.That(match.Text, Is.EqualTo("123"));
+                Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
+            }
+
+            return;
+        }
+
+        [Test]
+        public void TryMatch_prediction()
+        {
+            LexToken match;
+
+            _emptyDictionary.Add("===", LexerTag.Separator);
+            _emptyDictionary.Add("=", LexerTag.Separator);
+
+            // Use TryMatch as it would be by Lexer when analyzing "a=a" sequence.
+
+            Assert.That(_emptyDictionary.TryMatch("a", "=a"), Is.Null);
+
+            match = _emptyDictionary.TryMatch("a=", "a");      // the first 'a' should be consummed
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));
+            Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
+
+            match = _emptyDictionary.TryMatch("=", "a");       // this should consume '='
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("="));
+            Assert.That(match.Tag, Is.EqualTo(LexerTag.Separator));
+
+            match = _emptyDictionary.TryMatch("a", "");       // this should consume last 'a'
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));
+            Assert.That(match.Tag, Is.EqualTo(LexerTag.Text));
+
+            // Use TryMatch as it would be by Lexer when analyzing "a===a" sequence
+
+            Assert.That(_emptyDictionary.TryMatch("a", "==="), Is.Null);
+
+            match = _emptyDictionary.TryMatch("a=", "==a");  // this should consume 'a'
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));
+
+            match = _emptyDictionary.TryMatch("=", "==a");
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("==="));
+
+            match = _emptyDictionary.TryMatch("a", "");
+            Assert.That(match, Is.Not.Null);
+            Assert.That(match.Text, Is.EqualTo("a"));       // this should consume last 'a'
+
+            return;
+        }
+
+        #region TestingTokenDictionary
+
+        class TestingTokenDictionary :
+            TokenDictionary
+        {
+            public new void PopulateTokenStartingWith(LexToken starter, List<LexToken> output)
+            {
+                base.PopulateTokenStartingWith(starter, output);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs b/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
index 9ee6d10..9645bbb 100644
--- a/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
+++ b/src/GuiException/tests/CodeFormatters/TestCodeFormatterCollection.cs
@@ -1,192 +1,192 @@
-// ****************************************************************
-// This 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.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestCodeFormatterCollection
-    {
-        private CodeFormatterCollection _empty;
-        private CodeFormatterCollection _filled;
-        private ICodeFormatter _csFormatter;
-        private ICodeFormatter _defaultFormatter;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _empty = new CodeFormatterCollection();
-
-            _csFormatter = new CSharpCodeFormatter();
-            _defaultFormatter = new PlainTextCodeFormatter();
-            _filled = new CodeFormatterCollection();
-            _filled.Register(_csFormatter, "cs");
-            _filled.Register(_defaultFormatter, "txt");
-
-            return;
-        }
-
-        [Test]
-        public void Test_Default()
-        {
-            List<string> extensions;
-//            ErrorItem errorCS;
-//            ErrorItem errorCS_Upper;
-//            ErrorItem errorTxt;
-
-//            errorCS = new ErrorItem("C:\\dir\\file.cs", 1);
-//            errorCS_Upper = new ErrorItem("C:\\dir\\file.CS", 1);
-//            errorTxt = new ErrorItem("C:\\dir\\file.txt", 1);
-
-            Assert.That(_empty.Count, Is.EqualTo(0));
-            Assert.That(_empty.HasExtension("cs"), Is.False);
-            Assert.That(_empty.HasLanguage("C#"), Is.False);
-            Assert.That(_empty, Is.EquivalentTo(new List<string>()));                
-                
-            Assert.That(_filled.Count, Is.EqualTo(2));
-
-            Assert.That(_filled["C#"], Is.EqualTo(_csFormatter));
-            Assert.That(_filled["Plain text"], Is.EqualTo(_defaultFormatter));
-
-            Assert.That(_filled.HasExtension("cs"), Is.True);
-            Assert.That(_filled.HasLanguage("C#"), Is.True);
-
-            extensions = new List<string>();
-            extensions.Add("cs");
-            extensions.Add("txt");
-            Assert.That(_filled.Extensions, Is.EquivalentTo(extensions));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "formatter",
-            MatchType = MessageMatch.Contains)]
-        public void Register_Can_Throw_NullFormatterException()
-        {
-            _empty.Register(null, "cs"); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "language",
-            MatchType = MessageMatch.Contains)]
-        public void Register_Can_Throw_NullExtensionException()
-        {
-            _empty.Register(_csFormatter, null); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "language cannot be empty",
-            MatchType = MessageMatch.Contains)]
-        public void Register_Check_Extension_Is_Not_Empty()
-        {
-            _empty.Register(_csFormatter, ""); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "language cannot contain '.'",
-            MatchType = MessageMatch.Contains)]
-        public void Register_Check_Extension_Not_Contain_Dot_Character()
-        {
-            _empty.Register(_csFormatter, ".cs"); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "language 'cs' has already an handler. Remove handler first.",
-            MatchType = MessageMatch.Contains)]
-        public void Register_Check_Multiple_Extension_Definition()
-        {
-            _empty.Register(_csFormatter, "cs"); // OK
-            _empty.Register(_defaultFormatter, "cs"); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "language 'cs' has already an handler. Remove handler first.",
-            MatchType = MessageMatch.Contains)]
-        public void Register_Check_Extension_Case()
-        {
-            _empty.Register(_csFormatter, "cs"); // OK
-            _empty.Register(_csFormatter, "CS"); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void StringIndexer_Can_Throw_NullExtensionException()
-        {
-            if (_empty[(string)null] == null) // throws exception
-				return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void ItemIndexer_Can_Throw_NullExtensionException()
-        {
-            if (_empty[null] == null) // throws exception
-				return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "unknown language: 'unk'",
-            MatchType = MessageMatch.Contains)]
-        public void Indexer_Can_Throw_UnknownExtensionException()
-        {
-            if (_empty["unk"] == null) // throws exception
-				return;
-        }
-
-        [Test]
-        public void Remove()
-        {
-            _filled.Remove("cs");
-            Assert.That(_filled.Count, Is.EqualTo(1));
-            Assert.That(_filled.HasExtension("cs"), Is.False);
-
-            _filled.Remove("txt");
-            Assert.That(_filled.Count, Is.EqualTo(0));
-            Assert.That(_filled, Is.EquivalentTo(new List<string>()));
-
-            // should not fail
-            _filled.Remove(null);
-            _filled.Remove("unknown");
-
-            return;
-        }
-
-        [Test]
-        public void Remove_Is_Not_Case_Sensitive()
-        {
-            _filled.Remove("CS");
-            _filled.Remove("TxT");
-            Assert.That(_filled.Count, Is.EqualTo(0));
-
-            return;
-        }
-
-
-        [Test]
-        public void Clear()
-        {
-            _filled.Clear();
-            Assert.That(_filled.Count, Is.EqualTo(0));
-        }
-
-        [Test]
-        public void ContainsFormatterFromExtension()
-        {
-            Assert.That(_filled.HasExtension((string)null), Is.False);
-        }
-    }
-}
+// ****************************************************************
+// This 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.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestCodeFormatterCollection
+    {
+        private CodeFormatterCollection _empty;
+        private CodeFormatterCollection _filled;
+        private ICodeFormatter _csFormatter;
+        private ICodeFormatter _defaultFormatter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _empty = new CodeFormatterCollection();
+
+            _csFormatter = new CSharpCodeFormatter();
+            _defaultFormatter = new PlainTextCodeFormatter();
+            _filled = new CodeFormatterCollection();
+            _filled.Register(_csFormatter, "cs");
+            _filled.Register(_defaultFormatter, "txt");
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            List<string> extensions;
+//            ErrorItem errorCS;
+//            ErrorItem errorCS_Upper;
+//            ErrorItem errorTxt;
+
+//            errorCS = new ErrorItem("C:\\dir\\file.cs", 1);
+//            errorCS_Upper = new ErrorItem("C:\\dir\\file.CS", 1);
+//            errorTxt = new ErrorItem("C:\\dir\\file.txt", 1);
+
+            Assert.That(_empty.Count, Is.EqualTo(0));
+            Assert.That(_empty.HasExtension("cs"), Is.False);
+            Assert.That(_empty.HasLanguage("C#"), Is.False);
+            Assert.That(_empty, Is.EquivalentTo(new List<string>()));                
+                
+            Assert.That(_filled.Count, Is.EqualTo(2));
+
+            Assert.That(_filled["C#"], Is.EqualTo(_csFormatter));
+            Assert.That(_filled["Plain text"], Is.EqualTo(_defaultFormatter));
+
+            Assert.That(_filled.HasExtension("cs"), Is.True);
+            Assert.That(_filled.HasLanguage("C#"), Is.True);
+
+            extensions = new List<string>();
+            extensions.Add("cs");
+            extensions.Add("txt");
+            Assert.That(_filled.Extensions, Is.EquivalentTo(extensions));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "formatter",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Can_Throw_NullFormatterException()
+        {
+            _empty.Register(null, "cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "language",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Can_Throw_NullExtensionException()
+        {
+            _empty.Register(_csFormatter, null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language cannot be empty",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Extension_Is_Not_Empty()
+        {
+            _empty.Register(_csFormatter, ""); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language cannot contain '.'",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Extension_Not_Contain_Dot_Character()
+        {
+            _empty.Register(_csFormatter, ".cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language 'cs' has already an handler. Remove handler first.",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Multiple_Extension_Definition()
+        {
+            _empty.Register(_csFormatter, "cs"); // OK
+            _empty.Register(_defaultFormatter, "cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "language 'cs' has already an handler. Remove handler first.",
+            MatchType = MessageMatch.Contains)]
+        public void Register_Check_Extension_Case()
+        {
+            _empty.Register(_csFormatter, "cs"); // OK
+            _empty.Register(_csFormatter, "CS"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void StringIndexer_Can_Throw_NullExtensionException()
+        {
+            if (_empty[(string)null] == null) // throws exception
+				return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void ItemIndexer_Can_Throw_NullExtensionException()
+        {
+            if (_empty[null] == null) // throws exception
+				return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "unknown language: 'unk'",
+            MatchType = MessageMatch.Contains)]
+        public void Indexer_Can_Throw_UnknownExtensionException()
+        {
+            if (_empty["unk"] == null) // throws exception
+				return;
+        }
+
+        [Test]
+        public void Remove()
+        {
+            _filled.Remove("cs");
+            Assert.That(_filled.Count, Is.EqualTo(1));
+            Assert.That(_filled.HasExtension("cs"), Is.False);
+
+            _filled.Remove("txt");
+            Assert.That(_filled.Count, Is.EqualTo(0));
+            Assert.That(_filled, Is.EquivalentTo(new List<string>()));
+
+            // should not fail
+            _filled.Remove(null);
+            _filled.Remove("unknown");
+
+            return;
+        }
+
+        [Test]
+        public void Remove_Is_Not_Case_Sensitive()
+        {
+            _filled.Remove("CS");
+            _filled.Remove("TxT");
+            Assert.That(_filled.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+
+        [Test]
+        public void Clear()
+        {
+            _filled.Clear();
+            Assert.That(_filled.Count, Is.EqualTo(0));
+        }
+
+        [Test]
+        public void ContainsFormatterFromExtension()
+        {
+            Assert.That(_filled.HasExtension((string)null), Is.False);
+        }
+    }
+}
diff --git a/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs b/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
index de8fce0..5561644 100644
--- a/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
+++ b/src/GuiException/tests/CodeFormatters/TestGeneralCodeFormatter.cs
@@ -1,311 +1,311 @@
-// ****************************************************************
-// This 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.Framework;
-using NUnit.UiException.CodeFormatters;
-using NUnit.UiException.Tests.data;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestGeneralCodeFormatter
-    {
-        private GeneralCodeFormatter _formatter;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _formatter = new GeneralCodeFormatter();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Default()
-        {
-            Assert.That(_formatter.DefaultFormatter, Is.Not.Null);
-
-            Assert.That(_formatter.Formatters, Is.Not.Null);
-            Assert.That(_formatter.Formatters.Extensions, Is.EquivalentTo(new string[] { "cs" }));
-
-            return;
-        }
-
-        [Test]
-        public void LanguageFromExtension()
-        {
-            Assert.That(_formatter.LanguageFromExtension("cs"), Is.EqualTo("C#"));
-            Assert.That(_formatter.LanguageFromExtension(""), Is.EqualTo("Plain text"));
-            Assert.That(_formatter.LanguageFromExtension(null), Is.EqualTo("Plain text"));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void DefaultFormatter_Can_Throw_FormatterNullException()
-        {
-            _formatter.DefaultFormatter = null; // throws exception
-        }
-
-        [Test]
-        public void DefaultFormatter()
-        {
-            CSharpCodeFormatter csFormatter;
-
-            csFormatter = new CSharpCodeFormatter();
-            _formatter.DefaultFormatter = csFormatter;
-            Assert.That(_formatter.DefaultFormatter, Is.EqualTo(csFormatter));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void GetFormatterFromExtension_Can_Throw_ExtensionNullException()
-        {
-            _formatter.GetFormatterFromExtension(null); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void GetFormatterFromLanguage_Can_Throw_LanguageNullException()
-        {
-            _formatter.GetFormatterFromLanguage(null); // throws exception
-        }
-
-        [Test]
-        public void GetFormatterFroms()
-        {
-            // using extension first
-
-            Assert.That(_formatter.GetFormatterFromExtension("cs"), Is.EqualTo(_formatter.Formatters["C#"]));
-            Assert.That(_formatter.GetFormatterFromExtension("txt"), Is.EqualTo(_formatter.DefaultFormatter));
-
-            // using language name
-
-            Assert.That(_formatter.GetFormatterFromLanguage("C#"), Is.EqualTo(_formatter.Formatters["C#"]));
-            Assert.That(_formatter.GetFormatterFromLanguage("txt"), Is.EqualTo(_formatter.DefaultFormatter));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "code",
-            MatchType = MessageMatch.Contains)]
-        public void FormatFromExtension_Can_Throw_CodeNullException()
-        {
-            _formatter.FormatFromExtension(null, "cs"); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "extension",
-            MatchType = MessageMatch.Contains)]
-        public void FormatFromExtension_Can_Throw_ExtensionNullException()
-        {
-            _formatter.FormatFromExtension("test", null); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "code",
-            MatchType = MessageMatch.Contains)]
-        public void Format_Can_Throw_CodeNullException()
-        {
-            _formatter.Format(null, "C#"); // throws exception
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "language",
-            MatchType = MessageMatch.Contains)]
-        public void Format_Can_Throw_LanguageNameNullException()
-        {
-            _formatter.Format("test", null); // throws exception
-        }
-
-        public void FormatResource(TestResource res)
-        {
-            ErrorItem error;
-            FormattedCode code;
-            List<ICodeFormatter> array = GetAllFormatters();
-
-            foreach (ICodeFormatter item in array)
-            {
-                error = new ErrorItem(res.Path, 1);
-                code = item.Format(error.ReadFile());
-
-                Assert.That(code, Is.Not.Null,
-                    "Formatter: " + item + " failed to format resource.");
-
-                try
-                {
-                    FormattedCode.CheckData(code);
-                }
-                catch (Exception e)
-                {
-                    Assert.Fail("Formatter: " + item + " has created an ill-formed data. Error: " + e.Message);
-                }
-            }
-
-            return;
-        }
-
-        /// <summary>
-        /// Returns a list containing all formatters in GeneralCodeFormatter
-        /// and the one in DefaultFormatter.
-        /// </summary>
-        /// <returns></returns>
-        private List<ICodeFormatter> GetAllFormatters()
-        {
-            List<ICodeFormatter> array;
-
-            array = new List<ICodeFormatter>();
-            foreach (ICodeFormatter item in _formatter.Formatters)
-                array.Add(item);
-            array.Add(_formatter.DefaultFormatter);
-
-            return (array);
-        }
-
-        [Test]
-        public void All_Formatters_Have_Unique_Language_Value()
-        {
-            List<ICodeFormatter> formatters;
-            List<string> languages;
-
-            formatters = GetAllFormatters();
-            languages = new List<string>();
-
-            foreach (ICodeFormatter item in formatters)
-                languages.Add(item.Language);
-
-            Assert.That(languages, Is.All.Not.Null);
-            Assert.That(languages, Is.Unique);
-
-            return;
-        }
-
-        [Test]
-        public void All_Formatters_Should_PreProcess_Tab_Character()
-        {
-            List<ICodeFormatter> formatters;
-            FormattedCode res;
-
-            // We don't have reliable way to measure '\t' at drawing time,
-            // hence, each textFormatter should replace '\t' by one or more white spaces.
-
-            formatters = GetAllFormatters();
-            foreach (ICodeFormatter formatter in formatters)
-            {
-                res = formatter.Format("hi\tthere!");
-
-                Assert.That(
-                    res.Text.IndexOf("\t") == -1,
-                    "Formatter: " + formatter + " failed to remove initial '\\t' characters.");
-            }
-
-            return;
-        }
-
-        [Test]
-        public void All_Formatters_Should_Have_Overwrite_Behavior()
-        {
-            List<ICodeFormatter> formatters;
-            FormattedCode res;
-
-            // check that formatters reset their state before
-            // processing new data. So new data overwrite former one.
-
-            formatters = GetAllFormatters();
-            foreach (ICodeFormatter formatter in formatters)
-            {
-                // process this text first
-                formatter.Format("line 1\r\nline 2\r\nline 3");
-
-                // after processing "hi", we expect res to contain
-                // just one line of text.
-                res = formatter.Format("hi");
-                Assert.That(
-                    res.CopyInfo().LineArray.Count,
-                    Is.EqualTo(1),
-                    "Formatter: " + formatter + " failed to reset its state.");
-            }
-
-            return;
-        }
-
-        [Test]
-        public void Any_Formatter_Should_Format_Any_Text()
-        {
-            TestResource res;
-
-            using (res = new TestResource("HelloWorld.txt"))
-            {
-                FormatResource(res);
-            }
-
-            using (res = new TestResource("Basic.cs"))
-            {
-                FormatResource(res);
-            }
-
-            using (res = new TestResource("TextCode.txt"))
-            {
-                FormatResource(res);
-            }
-
-
-            return;
-        }
-
-        [Test]
-        public void Format()
-        {
-            Assert.That(_formatter.Format("test", "C#"), Is.Not.Null);
-            Assert.That(_formatter.Format("test", "txt"), Is.Not.Null);
-
-            return;
-        }
-
-        [Test]
-        public void Format_Pick_Best_Formatter()
-        {
-            ErrorItem itemHelloTxt;
-            ErrorItem itemBasicCs;
-            ICodeFormatter txtFormatter;
-            ICodeFormatter csFormatter;
-            FormattedCode exp;
-
-            using (TestResource resource = new TestResource("HelloWorld.txt"))
-            {
-                itemHelloTxt = new ErrorItem(resource.Path, 1);
-                txtFormatter = new PlainTextCodeFormatter();
-                exp = txtFormatter.Format(itemHelloTxt.ReadFile());
-                Assert.That(
-                    _formatter.FormatFromExtension(itemHelloTxt.ReadFile(), itemHelloTxt.FileExtension),
-                    Is.EqualTo(exp));
-                FormattedCode.CheckData(exp);
-            }
-
-            using (TestResource resource = new TestResource("Basic.cs"))
-            {
-                itemBasicCs = new ErrorItem(resource.Path, 1);
-                csFormatter = new CSharpCodeFormatter();
-                exp = csFormatter.Format(itemBasicCs.ReadFile());
-                Assert.That(
-                    _formatter.FormatFromExtension(itemBasicCs.ReadFile(), itemBasicCs.FileExtension),
-                    Is.EqualTo(exp));
-                FormattedCode.CheckData(exp);
-            }
-
-            return;
-        }
-    }    
-}
+// ****************************************************************
+// This 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.Framework;
+using NUnit.UiException.CodeFormatters;
+using NUnit.UiException.Tests.data;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestGeneralCodeFormatter
+    {
+        private GeneralCodeFormatter _formatter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _formatter = new GeneralCodeFormatter();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_formatter.DefaultFormatter, Is.Not.Null);
+
+            Assert.That(_formatter.Formatters, Is.Not.Null);
+            Assert.That(_formatter.Formatters.Extensions, Is.EquivalentTo(new string[] { "cs" }));
+
+            return;
+        }
+
+        [Test]
+        public void LanguageFromExtension()
+        {
+            Assert.That(_formatter.LanguageFromExtension("cs"), Is.EqualTo("C#"));
+            Assert.That(_formatter.LanguageFromExtension(""), Is.EqualTo("Plain text"));
+            Assert.That(_formatter.LanguageFromExtension(null), Is.EqualTo("Plain text"));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void DefaultFormatter_Can_Throw_FormatterNullException()
+        {
+            _formatter.DefaultFormatter = null; // throws exception
+        }
+
+        [Test]
+        public void DefaultFormatter()
+        {
+            CSharpCodeFormatter csFormatter;
+
+            csFormatter = new CSharpCodeFormatter();
+            _formatter.DefaultFormatter = csFormatter;
+            Assert.That(_formatter.DefaultFormatter, Is.EqualTo(csFormatter));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void GetFormatterFromExtension_Can_Throw_ExtensionNullException()
+        {
+            _formatter.GetFormatterFromExtension(null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void GetFormatterFromLanguage_Can_Throw_LanguageNullException()
+        {
+            _formatter.GetFormatterFromLanguage(null); // throws exception
+        }
+
+        [Test]
+        public void GetFormatterFroms()
+        {
+            // using extension first
+
+            Assert.That(_formatter.GetFormatterFromExtension("cs"), Is.EqualTo(_formatter.Formatters["C#"]));
+            Assert.That(_formatter.GetFormatterFromExtension("txt"), Is.EqualTo(_formatter.DefaultFormatter));
+
+            // using language name
+
+            Assert.That(_formatter.GetFormatterFromLanguage("C#"), Is.EqualTo(_formatter.Formatters["C#"]));
+            Assert.That(_formatter.GetFormatterFromLanguage("txt"), Is.EqualTo(_formatter.DefaultFormatter));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "code",
+            MatchType = MessageMatch.Contains)]
+        public void FormatFromExtension_Can_Throw_CodeNullException()
+        {
+            _formatter.FormatFromExtension(null, "cs"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "extension",
+            MatchType = MessageMatch.Contains)]
+        public void FormatFromExtension_Can_Throw_ExtensionNullException()
+        {
+            _formatter.FormatFromExtension("test", null); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "code",
+            MatchType = MessageMatch.Contains)]
+        public void Format_Can_Throw_CodeNullException()
+        {
+            _formatter.Format(null, "C#"); // throws exception
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "language",
+            MatchType = MessageMatch.Contains)]
+        public void Format_Can_Throw_LanguageNameNullException()
+        {
+            _formatter.Format("test", null); // throws exception
+        }
+
+        public void FormatResource(TestResource res)
+        {
+            ErrorItem error;
+            FormattedCode code;
+            List<ICodeFormatter> array = GetAllFormatters();
+
+            foreach (ICodeFormatter item in array)
+            {
+                error = new ErrorItem(res.Path, 1);
+                code = item.Format(error.ReadFile());
+
+                Assert.That(code, Is.Not.Null,
+                    "Formatter: " + item + " failed to format resource.");
+
+                try
+                {
+                    FormattedCode.CheckData(code);
+                }
+                catch (Exception e)
+                {
+                    Assert.Fail("Formatter: " + item + " has created an ill-formed data. Error: " + e.Message);
+                }
+            }
+
+            return;
+        }
+
+        /// <summary>
+        /// Returns a list containing all formatters in GeneralCodeFormatter
+        /// and the one in DefaultFormatter.
+        /// </summary>
+        /// <returns></returns>
+        private List<ICodeFormatter> GetAllFormatters()
+        {
+            List<ICodeFormatter> array;
+
+            array = new List<ICodeFormatter>();
+            foreach (ICodeFormatter item in _formatter.Formatters)
+                array.Add(item);
+            array.Add(_formatter.DefaultFormatter);
+
+            return (array);
+        }
+
+        [Test]
+        public void All_Formatters_Have_Unique_Language_Value()
+        {
+            List<ICodeFormatter> formatters;
+            List<string> languages;
+
+            formatters = GetAllFormatters();
+            languages = new List<string>();
+
+            foreach (ICodeFormatter item in formatters)
+                languages.Add(item.Language);
+
+            Assert.That(languages, Is.All.Not.Null);
+            Assert.That(languages, Is.Unique);
+
+            return;
+        }
+
+        [Test]
+        public void All_Formatters_Should_PreProcess_Tab_Character()
+        {
+            List<ICodeFormatter> formatters;
+            FormattedCode res;
+
+            // We don't have reliable way to measure '\t' at drawing time,
+            // hence, each textFormatter should replace '\t' by one or more white spaces.
+
+            formatters = GetAllFormatters();
+            foreach (ICodeFormatter formatter in formatters)
+            {
+                res = formatter.Format("hi\tthere!");
+
+                Assert.That(
+                    res.Text.IndexOf("\t") == -1,
+                    "Formatter: " + formatter + " failed to remove initial '\\t' characters.");
+            }
+
+            return;
+        }
+
+        [Test]
+        public void All_Formatters_Should_Have_Overwrite_Behavior()
+        {
+            List<ICodeFormatter> formatters;
+            FormattedCode res;
+
+            // check that formatters reset their state before
+            // processing new data. So new data overwrite former one.
+
+            formatters = GetAllFormatters();
+            foreach (ICodeFormatter formatter in formatters)
+            {
+                // process this text first
+                formatter.Format("line 1\r\nline 2\r\nline 3");
+
+                // after processing "hi", we expect res to contain
+                // just one line of text.
+                res = formatter.Format("hi");
+                Assert.That(
+                    res.CopyInfo().LineArray.Count,
+                    Is.EqualTo(1),
+                    "Formatter: " + formatter + " failed to reset its state.");
+            }
+
+            return;
+        }
+
+        [Test]
+        public void Any_Formatter_Should_Format_Any_Text()
+        {
+            TestResource res;
+
+            using (res = new TestResource("HelloWorld.txt"))
+            {
+                FormatResource(res);
+            }
+
+            using (res = new TestResource("Basic.cs"))
+            {
+                FormatResource(res);
+            }
+
+            using (res = new TestResource("TextCode.txt"))
+            {
+                FormatResource(res);
+            }
+
+
+            return;
+        }
+
+        [Test]
+        public void Format()
+        {
+            Assert.That(_formatter.Format("test", "C#"), Is.Not.Null);
+            Assert.That(_formatter.Format("test", "txt"), Is.Not.Null);
+
+            return;
+        }
+
+        [Test]
+        public void Format_Pick_Best_Formatter()
+        {
+            ErrorItem itemHelloTxt;
+            ErrorItem itemBasicCs;
+            ICodeFormatter txtFormatter;
+            ICodeFormatter csFormatter;
+            FormattedCode exp;
+
+            using (TestResource resource = new TestResource("HelloWorld.txt"))
+            {
+                itemHelloTxt = new ErrorItem(resource.Path, 1);
+                txtFormatter = new PlainTextCodeFormatter();
+                exp = txtFormatter.Format(itemHelloTxt.ReadFile());
+                Assert.That(
+                    _formatter.FormatFromExtension(itemHelloTxt.ReadFile(), itemHelloTxt.FileExtension),
+                    Is.EqualTo(exp));
+                FormattedCode.CheckData(exp);
+            }
+
+            using (TestResource resource = new TestResource("Basic.cs"))
+            {
+                itemBasicCs = new ErrorItem(resource.Path, 1);
+                csFormatter = new CSharpCodeFormatter();
+                exp = csFormatter.Format(itemBasicCs.ReadFile());
+                Assert.That(
+                    _formatter.FormatFromExtension(itemBasicCs.ReadFile(), itemBasicCs.FileExtension),
+                    Is.EqualTo(exp));
+                FormattedCode.CheckData(exp);
+            }
+
+            return;
+        }
+    }    
+}
diff --git a/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs b/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
index b35360b..e6047a3 100644
--- a/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
+++ b/src/GuiException/tests/CodeFormatters/TestPlainTextCodeFormatter.cs
@@ -1,96 +1,96 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.CodeFormatters
-{
-    [TestFixture]
-    public class TestPlainTextCodeFormatter
-    {
-        private PlainTextCodeFormatter _formatter;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _formatter = new PlainTextCodeFormatter();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Language()
-        {
-            Assert.That(_formatter.Language, Is.EqualTo("Plain text"));
-        }
-
-        [Test]
-        public void Test_PreProcess()
-        {
-            // PreProcess is expected to remove '\t' sequences.
-            // This test expects that normal strings are left untouched.
-
-            Assert.That(_formatter.PreProcess("hello world"), Is.EqualTo("hello world"));
-
-            // This test expects to see differences
-            Assert.That(_formatter.PreProcess("hello\tworld"), Is.EqualTo("hello    world"));
-
-            // test to fail: passing null has no effect.
-            Assert.That(_formatter.PreProcess(null), Is.Null);
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void Format_Can_Throw_CodeNullException()
-        {
-            _formatter.Format(null); // throws exception
-        }
-
-        [Test]
-        public void Format_HelloWorld()
-        {
-            FormattedCode res;
-            FormattedCode exp;
-            
-            res = _formatter.Format("Hello world!");
-
-            exp = new FormattedCode(
-                "Hello world!",
-                new int[] { 0 },
-                new byte[] { 0 },
-                new int[] { 0 });
-
-            Assert.That(res, Is.EqualTo(exp));
-
-            return;
-        }
-
-        [Test]
-        public void Format_Lines()
-        {
-            FormattedCode res;
-            FormattedCode exp;
-
-            res = _formatter.Format(
-                "line 1\r\n" +
-                "line 2\r\n" +
-                "line 3\r\n");
-
-            exp = new FormattedCode(
-                res.Text,
-                new int[] { 0, 8, 16 },
-                new byte[] { 0, 0, 0 },
-                new int[] { 0, 1, 2 });
-
-            Assert.That(res, Is.EqualTo(exp));
-
-            return;
-        }
-    }    
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.CodeFormatters
+{
+    [TestFixture]
+    public class TestPlainTextCodeFormatter
+    {
+        private PlainTextCodeFormatter _formatter;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _formatter = new PlainTextCodeFormatter();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Language()
+        {
+            Assert.That(_formatter.Language, Is.EqualTo("Plain text"));
+        }
+
+        [Test]
+        public void Test_PreProcess()
+        {
+            // PreProcess is expected to remove '\t' sequences.
+            // This test expects that normal strings are left untouched.
+
+            Assert.That(_formatter.PreProcess("hello world"), Is.EqualTo("hello world"));
+
+            // This test expects to see differences
+            Assert.That(_formatter.PreProcess("hello\tworld"), Is.EqualTo("hello    world"));
+
+            // test to fail: passing null has no effect.
+            Assert.That(_formatter.PreProcess(null), Is.Null);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void Format_Can_Throw_CodeNullException()
+        {
+            _formatter.Format(null); // throws exception
+        }
+
+        [Test]
+        public void Format_HelloWorld()
+        {
+            FormattedCode res;
+            FormattedCode exp;
+            
+            res = _formatter.Format("Hello world!");
+
+            exp = new FormattedCode(
+                "Hello world!",
+                new int[] { 0 },
+                new byte[] { 0 },
+                new int[] { 0 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+
+        [Test]
+        public void Format_Lines()
+        {
+            FormattedCode res;
+            FormattedCode exp;
+
+            res = _formatter.Format(
+                "line 1\r\n" +
+                "line 2\r\n" +
+                "line 3\r\n");
+
+            exp = new FormattedCode(
+                res.Text,
+                new int[] { 0, 8, 16 },
+                new byte[] { 0, 0, 0 },
+                new int[] { 0, 1, 2 });
+
+            Assert.That(res, Is.EqualTo(exp));
+
+            return;
+        }
+    }    
+}
diff --git a/src/GuiException/tests/Controls/TestCodeBox.cs b/src/GuiException/tests/Controls/TestCodeBox.cs
index 18c2ac8..6c92106 100644
--- a/src/GuiException/tests/Controls/TestCodeBox.cs
+++ b/src/GuiException/tests/Controls/TestCodeBox.cs
@@ -1,557 +1,557 @@
-// ****************************************************************
-// 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 NSubstitute;
-using NUnit.Framework;
-using System.Drawing;
-using NUnit.UiException.Controls;
-using NUnit.UiException.CodeFormatters;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-    public class TestCodeBox
-    {
-        private TestingCodeBox _box;
-
-        private FormattedCode _someText;
-        private FormattedCode _someCode;
-
-        private IFormatterCatalog _mockFormatter;
-        private ICodeRenderer _mockRenderer;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _mockFormatter = Substitute.For<IFormatterCatalog>();
-            _mockRenderer = Substitute.For<ICodeRenderer>();
-
-            _box = new TestingCodeBox(_mockFormatter, _mockRenderer);
-            _box.Width = 150;
-            _box.Height = 150;
-
-            _someText = Format("some C# code", "");
-            _someCode = Format("some C# code", "C#");
-
-            return;
-        }
-
-        FormattedCode Format(string text, string language)
-        {
-            ICodeFormatter formatter;
-
-            if (language == "C#")
-                formatter = new CSharpCodeFormatter();
-            else
-                formatter = new PlainTextCodeFormatter();
-
-            return (formatter.Format(text));
-        }
-
-        TestingCodeBox SetupCodeBox(FormattedCode code, SizeF size)
-        {
-            TestingCodeBox box;
-
-            box = new TestingCodeBox(_mockFormatter, _mockRenderer);
-
-            _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));
-
-            return (box);
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            CodeBox box = new CodeBox();
-
-            Assert.That(box.Text, Is.EqualTo(""));
-
-            Assert.That(box.Language, Is.EqualTo(""));
-
-            Assert.True(box.AutoScroll);
-            Assert.That(box.AutoScrollPosition, Is.EqualTo(new Point(0, 0)));
-            Assert.That(box.AutoScrollMinSize, Is.EqualTo(new Size(0, 0)));
-
-            Assert.False(box.ShowCurrentLine);
-            Assert.That(box.CurrentLine, Is.EqualTo(-1));
-            Assert.That(box.CurrentLineBackColor, Is.EqualTo(Color.Red));
-            Assert.That(box.CurrentLineForeColor, Is.EqualTo(Color.White));
-
-            Assert.That(box.BackColor, Is.EqualTo(Color.White));
-            Assert.That(box.Font.Size, Is.EqualTo(8));
-
-            return;
-        }
-
-        [Test]
-        public void Format_Text_With_Language()
-        {
-            // when setting a text, the underlying textFormatter should be called
-            // to format data in the current language mode.
-            // The result should be assigned to the underlying display.
-
-            _mockFormatter.Format(_someText.Text, "").Returns(_someText);
-            _mockRenderer.GetDocumentSize(_someText, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(100, 100));
-
-            _box.Text = _someText.Text;
-
-            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.Format("", "").Returns(FormattedCode.Empty);
-            _mockRenderer.GetDocumentSize(FormattedCode.Empty, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(0, 0));
-
-            _box.Text = null;
-
-            Assert.That(_box.Text, Is.EqualTo(""));           
-
-            return;
-        }
-
-        [Test]
-        public void OnPaint()
-        {
-            TestingCodeBox box = SetupCodeBox(_someText, new SizeF(300, 400));
-
-            box.Width = 150;
-            box.Height = 150;
-
-            box.FireOnPaint();
-
-            _mockRenderer.Received().DrawToGraphics(_someText, box.RenderingContext, new Rectangle(0, 0, 150, 150));
-
-            return;
-        }
-
-        [Test]
-        public void Changing_Language_Causes_Reformatting()
-        {
-            _box = SetupCodeBox(_someCode, new SizeF(200, 400));
-
-            _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#"));
-
-            // setting null in language is same as setting "" or "Plain text"
-
-            _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(""));
-
-            return;
-        }
-
-        [Test]
-        public void Changing_Font_Causes_Reformatting()
-        {
-            Font courier14 = new Font("Courier New", 14);
-
-            _box = SetupCodeBox(_someCode, new SizeF(200, 400));
-
-            _mockFormatter.Format(_someCode.Text, "").Returns(_someCode);
-            _mockRenderer.GetDocumentSize(_someCode, _box.RenderingContext.Graphics, courier14).Returns(new SizeF(200, 400));
-
-            _box.Font = courier14;
-
-            Assert.That(_box.RenderingContext.Font, Is.SameAs(_box.Font));
-
-            return;
-        }
-       
-        [Test]
-        public void CurrentLine()
-        {
-            FormattedCode data = Format(
-                "line 0\r\nline 1\r\nline 2\r\nline 3\r\nline 4\r\nline 5\r\nline 6\r\nline 7\r\n", "");
-
-            _box = SetupCodeBox(data, new SizeF(200, 400));
-            _box.Height = 30;
-
-            // CurrentLine: 0
-
-            _mockRenderer.LineIndexToYCoordinate(0, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(0f);
-
-            _box.CurrentLine = 0;
-
-            Assert.That(_box.CurrentLine, Is.EqualTo(0));
-            Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, 0)));
-
-            // CurrentLine: 7
-
-            _mockRenderer.LineIndexToYCoordinate(7, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(390f);
-
-            _box.CurrentLine = 7;
-
-            Assert.That(_box.CurrentLine, Is.EqualTo(7));
-            Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, -375)));
-
-            return;
-        }
-
-        [Test]
-        public void Can_Disable_ShowCurrentLine()
-        {
-            TestingRenderer renderer = new TestingRenderer();
-
-            _box = new TestingCodeBox(new GeneralCodeFormatter(), renderer);
-            _box.Text = "line 1\r\nline 2\r\nline 3\r\n";
-            _box.ShowCurrentLine = true;
-            
-            _box.CurrentLine = 1;
-            _box.FireOnPaint();
-            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(1));            
-
-            _box.ShowCurrentLine = false;
-            _box.FireOnPaint();
-            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(-1));
-
-            _box.ShowCurrentLine = true;
-            _box.FireOnPaint();
-            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(1));
-
-            return;
-        }
-
-        [Test]
-        public void Can_Set_Back_And_Fore_Colors()
-        {
-            CodeBox box;
-
-            box = new CodeBox();
-            box.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
-
-            box.CurrentLineBackColor = Color.Black;
-            Assert.That(box.CurrentLineBackColor, Is.EqualTo(Color.Black));
-
-            box.CurrentLineForeColor = Color.Blue;
-            Assert.That(box.CurrentLineForeColor, Is.EqualTo(Color.Blue));
-
-            return;
-        }
-
-        class TestingCodeBox : CodeBox
-        {
-            public TestingCodeBox()
-            {
-            }
-
-            public TestingCodeBox(IFormatterCatalog formatter, ICodeRenderer renderer) :
-                base(formatter, renderer) { }
-
-            public CodeRenderingContext RenderingContext {
-                get { return (_workingContext); }
-            }
-
-            public FormattedCode FormattedCode {
-                get { return (_formattedCode); }
-            }
-
-            public new void OnScroll(ScrollEventArgs args)
-            {
-                base.OnScroll(args);
-            }                        
-
-            public void FireOnPaint()
-            {
-                OnPaint(new PaintEventArgs(_workingContext.Graphics,
-                    new Rectangle(0, 0, Width, Height)));
-
-                return;
-            }
-        }
-
-        class TestingRenderer : ICodeRenderer
-        {
-            public int CURRENTLINE_INDEX;            
-
-            #region ICodeRenderer Membres
-
-            public void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport)
-            {
-                CURRENTLINE_INDEX = args.CurrentLine;
-            }
-
-            public SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font)
-            {
-                return (new SizeF(200, 400));
-            }
-
-            public float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font)
-            {
-                return (0);   
-            }
-
-            #endregion
-        }
-    }
-
-/*    [TestFixture]
-    public class TestCodeBox
-    {
-        private InternalCodeBox _empty;
-        private InternalCodeBox _filled;
-
-        private int _repaintNotification;
-        private int _textChangedNotification;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _empty = new InternalCodeBox();
-
-            _filled = new InternalCodeBox();
-            _filled.Text = "111\r\n" +
-                           "222\r\n" +
-                           "333\r\n";
-            _filled.HighlightedLine = 1;
-
-            _filled.Repainted += new RepaintEventArgs(_filled_Repainted);
-            _filled.TextChanged += new EventHandler(_filled_TextChanged);
-
-            _repaintNotification = 0;            
-
-            return;
-        }
-
-        void _filled_TextChanged(object sender, EventArgs e)
-        {
-            _textChangedNotification++;
-        }
-
-        void _filled_Repainted(object sender, EventArgs e)
-        {
-            _repaintNotification++;
-        }
-
-        [Test]
-        public void Test_Default()
-        {
-            Assert.That(_empty.Text, Is.EqualTo(""));
-            Assert.That(_empty.HighlightedLine, Is.EqualTo(0));
-            Assert.That(_empty.Viewport, Is.Not.Null);
-            Assert.That(_empty.FirstLine, Is.EqualTo(""));
-            Assert.That(_empty.CurrentLineNumber, Is.EqualTo(1));
-            Assert.That(_empty.MouseWheelDistance, Is.EqualTo(OLD_CodeBox.DEFAULT_MOUSEWHEEL_DISTANCE));
-
-            Assert.That(_empty.Viewport.CharHeight, Is.GreaterThan(1));
-            Assert.That(_empty.Viewport.CharWidth, Is.GreaterThan(1));
-            Assert.That(_empty.Viewport.Width, Is.GreaterThan(1));
-            Assert.That(_empty.Viewport.Height, Is.GreaterThan(1));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Filled()
-        {
-            Assert.That(_filled.Text, Is.EqualTo("111\r\n222\r\n333\r\n"));
-            Assert.That(_filled.HighlightedLine, Is.EqualTo(1));
-            Assert.That(_filled.FirstLine, Is.EqualTo("111"));
-            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Setting_MouseWheelDistance()
-        {
-            _filled.MouseWheelDistance = 4;
-            Assert.That(_filled.MouseWheelDistance, Is.EqualTo(4));
-
-            _filled.MouseWheelDistance = 6;
-            Assert.That(_filled.MouseWheelDistance, Is.EqualTo(6));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Setting_Text()
-        {
-            _textChangedNotification = 0;
-
-            _filled.Text = "hello world";
-            Assert.That(_repaintNotification, Is.EqualTo(1));
-            Assert.That(_textChangedNotification, Is.EqualTo(1));
-
-            // test to fail
-            _filled.Text = null;
-            Assert.That(_filled.Text, Is.EqualTo(""));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException))]
-        public void SetFormattedCode_Can_Throw_FormatNullException()
-        {
-            _filled.SetFormattedCode(null); // throws exception
-        }
-
-        [Test]
-        public void Test_Setting_FormattedCode()
-        {
-            CSharpCodeFormatter textFormatter;
-            FormattedCode format;
-
-            textFormatter = new CSharpCodeFormatter();
-            format = textFormatter.Format("namespace test { class MyClass { } }\r\n");
-
-            _filled.SetFormattedCode(format);
-            Assert.That(_filled.Text, Is.EqualTo("namespace test { class MyClass { } }\r\n"));           
-
-            return;
-        }
-
-        [Test]
-        public void Test_Setting_Size_Invalidate_Box()
-        {
-            _filled.Width = 200;
-            Assert.That(_repaintNotification, Is.EqualTo(1));
-
-            _filled.Height = 400;
-            Assert.That(_repaintNotification, Is.EqualTo(2));
-
-            Assert.That(_filled.Viewport.Width, Is.EqualTo(200));
-            Assert.That(_filled.Viewport.Height, Is.EqualTo(400));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Setting_HighlighedLine_Invalidate_Box()
-        {
-            _filled.HighlightedLine = 2;
-            Assert.That(_repaintNotification, Is.EqualTo(1));
-        }
-
-        [Test]
-        public void Test_Changing_Location_Invalidate_Box()
-        {
-            _filled.Viewport.Location = new PointF(0, 1);
-            Assert.That(_repaintNotification, Is.EqualTo(1));
-        }
-
-        [Test]
-        public void Test_TranslateView()
-        {
-            _filled.Text = "******\r\n******\r\n******\r\n******\r\n******\r\n";
-            _filled.Viewport.SetCharSize(1, 1);
-            _filled.Viewport.SetViewport(1, 1);
-
-            _filled.TranslateView(0, 0);
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 0)));
-
-            _filled.TranslateView(2, 1);
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(2, 1)));
-
-            _filled.TranslateView(3, 1);
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(5, 2)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_CurrentLineNumber()
-        {
-            _filled.Viewport.SetViewport(1, 1);
-            _filled.Viewport.SetCharSize(1, 1);
-
-            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
-
-            _filled.TranslateView(0, 1000);
-
-            Assert.That(_filled.CurrentLineNumber,
-                Is.EqualTo(_filled.Viewport.TextSource.LineCount));
-
-            _filled.TranslateView(0, -2000);
-            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
-
-            return;
-        }
-
-        [Test]
-        public void Test_MouseWheel_Up()
-        {
-            _filled.Viewport.SetViewport(1, 1);
-            _filled.Viewport.SetCharSize(1, 1);
-
-            _filled.Viewport.SetPosition(0, 2);
-
-            _filled.MouseWheelDistance = 1;           
-
-            _filled.HandleMouseWheelUp();
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 1)));
-
-            _filled.HandleMouseWheelUp();
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 0)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_MouseWheel_Down()
-        {
-            _filled.Viewport.SetViewport(1, 1);
-            _filled.Viewport.SetCharSize(1, 1);
-
-            _filled.Viewport.SetPosition(0, 0);
-
-            _filled.MouseWheelDistance = 1;
-
-            _filled.HandleMouseWheelDown();
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 1)));
-
-            _filled.HandleMouseWheelDown();
-            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 2)));
-
-            return;
-        }
-
-        #region InternalCodeBox
-
-        delegate void RepaintEventArgs(object sender, EventArgs e);
-
-        class InternalCodeBox :
-            OLD_CodeBox
-        {
-            public event RepaintEventArgs Repainted;
-
-            protected override void Repaint()
-            {
-                base.Repaint();
-
-                if (Repainted != null)
-                    Repainted(this, new EventArgs());
-
-                return;
-            }
-
-            public new void HandleMouseWheelUp()
-            {
-                base.HandleMouseWheelUp();
-            }
-
-            public new void HandleMouseWheelDown()
-            {
-                base.HandleMouseWheelDown();
-            }
-        }
-
-        #endregion
-    } */
-}
+// ****************************************************************
+// 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 || NET_4_5
+using NSubstitute;
+using NUnit.Framework;
+using System.Drawing;
+using NUnit.UiException.Controls;
+using NUnit.UiException.CodeFormatters;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class TestCodeBox
+    {
+        private TestingCodeBox _box;
+
+        private FormattedCode _someText;
+        private FormattedCode _someCode;
+
+        private IFormatterCatalog _mockFormatter;
+        private ICodeRenderer _mockRenderer;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _mockFormatter = Substitute.For<IFormatterCatalog>();
+            _mockRenderer = Substitute.For<ICodeRenderer>();
+
+            _box = new TestingCodeBox(_mockFormatter, _mockRenderer);
+            _box.Width = 150;
+            _box.Height = 150;
+
+            _someText = Format("some C# code", "");
+            _someCode = Format("some C# code", "C#");
+
+            return;
+        }
+
+        FormattedCode Format(string text, string language)
+        {
+            ICodeFormatter formatter;
+
+            if (language == "C#")
+                formatter = new CSharpCodeFormatter();
+            else
+                formatter = new PlainTextCodeFormatter();
+
+            return (formatter.Format(text));
+        }
+
+        TestingCodeBox SetupCodeBox(FormattedCode code, SizeF size)
+        {
+            TestingCodeBox box;
+
+            box = new TestingCodeBox(_mockFormatter, _mockRenderer);
+
+            _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));
+
+            return (box);
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            CodeBox box = new CodeBox();
+
+            Assert.That(box.Text, Is.EqualTo(""));
+
+            Assert.That(box.Language, Is.EqualTo(""));
+
+            Assert.True(box.AutoScroll);
+            Assert.That(box.AutoScrollPosition, Is.EqualTo(new Point(0, 0)));
+            Assert.That(box.AutoScrollMinSize, Is.EqualTo(new Size(0, 0)));
+
+            Assert.False(box.ShowCurrentLine);
+            Assert.That(box.CurrentLine, Is.EqualTo(-1));
+            Assert.That(box.CurrentLineBackColor, Is.EqualTo(Color.Red));
+            Assert.That(box.CurrentLineForeColor, Is.EqualTo(Color.White));
+
+            Assert.That(box.BackColor, Is.EqualTo(Color.White));
+            Assert.That(box.Font.Size, Is.EqualTo(8));
+
+            return;
+        }
+
+        [Test]
+        public void Format_Text_With_Language()
+        {
+            // when setting a text, the underlying textFormatter should be called
+            // to format data in the current language mode.
+            // The result should be assigned to the underlying display.
+
+            _mockFormatter.Format(_someText.Text, "").Returns(_someText);
+            _mockRenderer.GetDocumentSize(_someText, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(100, 100));
+
+            _box.Text = _someText.Text;
+
+            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.Format("", "").Returns(FormattedCode.Empty);
+            _mockRenderer.GetDocumentSize(FormattedCode.Empty, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(new SizeF(0, 0));
+
+            _box.Text = null;
+
+            Assert.That(_box.Text, Is.EqualTo(""));           
+
+            return;
+        }
+
+        [Test]
+        public void OnPaint()
+        {
+            TestingCodeBox box = SetupCodeBox(_someText, new SizeF(300, 400));
+
+            box.Width = 150;
+            box.Height = 150;
+
+            box.FireOnPaint();
+
+            _mockRenderer.Received().DrawToGraphics(_someText, box.RenderingContext, new Rectangle(0, 0, 150, 150));
+
+            return;
+        }
+
+        [Test]
+        public void Changing_Language_Causes_Reformatting()
+        {
+            _box = SetupCodeBox(_someCode, new SizeF(200, 400));
+
+            _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#"));
+
+            // setting null in language is same as setting "" or "Plain text"
+
+            _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(""));
+
+            return;
+        }
+
+        [Test]
+        public void Changing_Font_Causes_Reformatting()
+        {
+            Font courier14 = new Font("Courier New", 14);
+
+            _box = SetupCodeBox(_someCode, new SizeF(200, 400));
+
+            _mockFormatter.Format(_someCode.Text, "").Returns(_someCode);
+            _mockRenderer.GetDocumentSize(_someCode, _box.RenderingContext.Graphics, courier14).Returns(new SizeF(200, 400));
+
+            _box.Font = courier14;
+
+            Assert.That(_box.RenderingContext.Font, Is.SameAs(_box.Font));
+
+            return;
+        }
+       
+        [Test]
+        public void CurrentLine()
+        {
+            FormattedCode data = Format(
+                "line 0\r\nline 1\r\nline 2\r\nline 3\r\nline 4\r\nline 5\r\nline 6\r\nline 7\r\n", "");
+
+            _box = SetupCodeBox(data, new SizeF(200, 400));
+            _box.Height = 30;
+
+            // CurrentLine: 0
+
+            _mockRenderer.LineIndexToYCoordinate(0, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(0f);
+
+            _box.CurrentLine = 0;
+
+            Assert.That(_box.CurrentLine, Is.EqualTo(0));
+            Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, 0)));
+
+            // CurrentLine: 7
+
+            _mockRenderer.LineIndexToYCoordinate(7, _box.RenderingContext.Graphics, _box.RenderingContext.Font).Returns(390f);
+
+            _box.CurrentLine = 7;
+
+            Assert.That(_box.CurrentLine, Is.EqualTo(7));
+            Assert.That(_box.AutoScrollPosition, Is.EqualTo(new Point(0, -375)));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Disable_ShowCurrentLine()
+        {
+            TestingRenderer renderer = new TestingRenderer();
+
+            _box = new TestingCodeBox(new GeneralCodeFormatter(), renderer);
+            _box.Text = "line 1\r\nline 2\r\nline 3\r\n";
+            _box.ShowCurrentLine = true;
+            
+            _box.CurrentLine = 1;
+            _box.FireOnPaint();
+            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(1));            
+
+            _box.ShowCurrentLine = false;
+            _box.FireOnPaint();
+            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(-1));
+
+            _box.ShowCurrentLine = true;
+            _box.FireOnPaint();
+            Assert.That(renderer.CURRENTLINE_INDEX, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Set_Back_And_Fore_Colors()
+        {
+            CodeBox box;
+
+            box = new CodeBox();
+            box.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
+
+            box.CurrentLineBackColor = Color.Black;
+            Assert.That(box.CurrentLineBackColor, Is.EqualTo(Color.Black));
+
+            box.CurrentLineForeColor = Color.Blue;
+            Assert.That(box.CurrentLineForeColor, Is.EqualTo(Color.Blue));
+
+            return;
+        }
+
+        class TestingCodeBox : CodeBox
+        {
+            public TestingCodeBox()
+            {
+            }
+
+            public TestingCodeBox(IFormatterCatalog formatter, ICodeRenderer renderer) :
+                base(formatter, renderer) { }
+
+            public CodeRenderingContext RenderingContext {
+                get { return (_workingContext); }
+            }
+
+            public FormattedCode FormattedCode {
+                get { return (_formattedCode); }
+            }
+
+            public new void OnScroll(ScrollEventArgs args)
+            {
+                base.OnScroll(args);
+            }                        
+
+            public void FireOnPaint()
+            {
+                OnPaint(new PaintEventArgs(_workingContext.Graphics,
+                    new Rectangle(0, 0, Width, Height)));
+
+                return;
+            }
+        }
+
+        class TestingRenderer : ICodeRenderer
+        {
+            public int CURRENTLINE_INDEX;            
+
+            #region ICodeRenderer Membres
+
+            public void DrawToGraphics(FormattedCode code, CodeRenderingContext args, Rectangle viewport)
+            {
+                CURRENTLINE_INDEX = args.CurrentLine;
+            }
+
+            public SizeF GetDocumentSize(FormattedCode code, Graphics g, Font font)
+            {
+                return (new SizeF(200, 400));
+            }
+
+            public float LineIndexToYCoordinate(int lineIndex, Graphics g, Font font)
+            {
+                return (0);   
+            }
+
+            #endregion
+        }
+    }
+
+/*    [TestFixture]
+    public class TestCodeBox
+    {
+        private InternalCodeBox _empty;
+        private InternalCodeBox _filled;
+
+        private int _repaintNotification;
+        private int _textChangedNotification;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _empty = new InternalCodeBox();
+
+            _filled = new InternalCodeBox();
+            _filled.Text = "111\r\n" +
+                           "222\r\n" +
+                           "333\r\n";
+            _filled.HighlightedLine = 1;
+
+            _filled.Repainted += new RepaintEventArgs(_filled_Repainted);
+            _filled.TextChanged += new EventHandler(_filled_TextChanged);
+
+            _repaintNotification = 0;            
+
+            return;
+        }
+
+        void _filled_TextChanged(object sender, EventArgs e)
+        {
+            _textChangedNotification++;
+        }
+
+        void _filled_Repainted(object sender, EventArgs e)
+        {
+            _repaintNotification++;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_empty.Text, Is.EqualTo(""));
+            Assert.That(_empty.HighlightedLine, Is.EqualTo(0));
+            Assert.That(_empty.Viewport, Is.Not.Null);
+            Assert.That(_empty.FirstLine, Is.EqualTo(""));
+            Assert.That(_empty.CurrentLineNumber, Is.EqualTo(1));
+            Assert.That(_empty.MouseWheelDistance, Is.EqualTo(OLD_CodeBox.DEFAULT_MOUSEWHEEL_DISTANCE));
+
+            Assert.That(_empty.Viewport.CharHeight, Is.GreaterThan(1));
+            Assert.That(_empty.Viewport.CharWidth, Is.GreaterThan(1));
+            Assert.That(_empty.Viewport.Width, Is.GreaterThan(1));
+            Assert.That(_empty.Viewport.Height, Is.GreaterThan(1));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Filled()
+        {
+            Assert.That(_filled.Text, Is.EqualTo("111\r\n222\r\n333\r\n"));
+            Assert.That(_filled.HighlightedLine, Is.EqualTo(1));
+            Assert.That(_filled.FirstLine, Is.EqualTo("111"));
+            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_MouseWheelDistance()
+        {
+            _filled.MouseWheelDistance = 4;
+            Assert.That(_filled.MouseWheelDistance, Is.EqualTo(4));
+
+            _filled.MouseWheelDistance = 6;
+            Assert.That(_filled.MouseWheelDistance, Is.EqualTo(6));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_Text()
+        {
+            _textChangedNotification = 0;
+
+            _filled.Text = "hello world";
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+            Assert.That(_textChangedNotification, Is.EqualTo(1));
+
+            // test to fail
+            _filled.Text = null;
+            Assert.That(_filled.Text, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException))]
+        public void SetFormattedCode_Can_Throw_FormatNullException()
+        {
+            _filled.SetFormattedCode(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Setting_FormattedCode()
+        {
+            CSharpCodeFormatter textFormatter;
+            FormattedCode format;
+
+            textFormatter = new CSharpCodeFormatter();
+            format = textFormatter.Format("namespace test { class MyClass { } }\r\n");
+
+            _filled.SetFormattedCode(format);
+            Assert.That(_filled.Text, Is.EqualTo("namespace test { class MyClass { } }\r\n"));           
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_Size_Invalidate_Box()
+        {
+            _filled.Width = 200;
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+
+            _filled.Height = 400;
+            Assert.That(_repaintNotification, Is.EqualTo(2));
+
+            Assert.That(_filled.Viewport.Width, Is.EqualTo(200));
+            Assert.That(_filled.Viewport.Height, Is.EqualTo(400));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Setting_HighlighedLine_Invalidate_Box()
+        {
+            _filled.HighlightedLine = 2;
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+        }
+
+        [Test]
+        public void Test_Changing_Location_Invalidate_Box()
+        {
+            _filled.Viewport.Location = new PointF(0, 1);
+            Assert.That(_repaintNotification, Is.EqualTo(1));
+        }
+
+        [Test]
+        public void Test_TranslateView()
+        {
+            _filled.Text = "******\r\n******\r\n******\r\n******\r\n******\r\n";
+            _filled.Viewport.SetCharSize(1, 1);
+            _filled.Viewport.SetViewport(1, 1);
+
+            _filled.TranslateView(0, 0);
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 0)));
+
+            _filled.TranslateView(2, 1);
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(2, 1)));
+
+            _filled.TranslateView(3, 1);
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(5, 2)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_CurrentLineNumber()
+        {
+            _filled.Viewport.SetViewport(1, 1);
+            _filled.Viewport.SetCharSize(1, 1);
+
+            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
+
+            _filled.TranslateView(0, 1000);
+
+            Assert.That(_filled.CurrentLineNumber,
+                Is.EqualTo(_filled.Viewport.TextSource.LineCount));
+
+            _filled.TranslateView(0, -2000);
+            Assert.That(_filled.CurrentLineNumber, Is.EqualTo(1));
+
+            return;
+        }
+
+        [Test]
+        public void Test_MouseWheel_Up()
+        {
+            _filled.Viewport.SetViewport(1, 1);
+            _filled.Viewport.SetCharSize(1, 1);
+
+            _filled.Viewport.SetPosition(0, 2);
+
+            _filled.MouseWheelDistance = 1;           
+
+            _filled.HandleMouseWheelUp();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 1)));
+
+            _filled.HandleMouseWheelUp();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 0)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_MouseWheel_Down()
+        {
+            _filled.Viewport.SetViewport(1, 1);
+            _filled.Viewport.SetCharSize(1, 1);
+
+            _filled.Viewport.SetPosition(0, 0);
+
+            _filled.MouseWheelDistance = 1;
+
+            _filled.HandleMouseWheelDown();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 1)));
+
+            _filled.HandleMouseWheelDown();
+            Assert.That(_filled.Viewport.Location, Is.EqualTo(new PointF(0, 2)));
+
+            return;
+        }
+
+        #region InternalCodeBox
+
+        delegate void RepaintEventArgs(object sender, EventArgs e);
+
+        class InternalCodeBox :
+            OLD_CodeBox
+        {
+            public event RepaintEventArgs Repainted;
+
+            protected override void Repaint()
+            {
+                base.Repaint();
+
+                if (Repainted != null)
+                    Repainted(this, new EventArgs());
+
+                return;
+            }
+
+            public new void HandleMouseWheelUp()
+            {
+                base.HandleMouseWheelUp();
+            }
+
+            public new void HandleMouseWheelDown()
+            {
+                base.HandleMouseWheelDown();
+            }
+        }
+
+        #endregion
+    } */
+}
 #endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestCodeRenderingContext.cs b/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
index 63440ab..cbd1d70 100644
--- a/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
+++ b/src/GuiException/tests/Controls/TestCodeRenderingContext.cs
@@ -1,167 +1,167 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using System.Drawing;
-using NUnit.UiException.CodeFormatters;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture]
-    public class TestCodeRenderingContext
-    {
-        private CodeRenderingContext _context;
-
-        [SetUp]
-        public void SetUp()
-        {
-            TestingCodeBox box = new TestingCodeBox();
-            _context = box.RenderingContext;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.NotNull(_context);
-            Assert.NotNull(_context.Graphics);
-            Assert.NotNull(_context.Font);
-            Assert.That(_context.Font.Size, Is.EqualTo(8));
-
-            Assert.That(_context.CurrentLine, Is.EqualTo(-1));
-
-            Assert.That(_context.BackgroundColor, Is.EqualTo(Color.White));
-            Assert.That(_context.CurrentLineBackColor, Is.EqualTo(Color.Red));
-            Assert.That(_context.CurrentLineForeColor, Is.EqualTo(Color.White));
-            Assert.That(_context.KeywordColor, Is.EqualTo(Color.Blue));
-            Assert.That(_context.CommentColor, Is.EqualTo(Color.Green));
-            Assert.That(_context.CodeColor, Is.EqualTo(Color.Black));
-            Assert.That(_context.StringColor, Is.EqualTo(Color.Red));
-
-            Assert.That(_context[ClassificationTag.Code], Is.EqualTo(_context.CodeColor));
-            Assert.That(_context[ClassificationTag.Comment], Is.EqualTo(_context.CommentColor));
-            Assert.That(_context[ClassificationTag.Keyword], Is.EqualTo(_context.KeywordColor));
-            Assert.That(_context[ClassificationTag.String], Is.EqualTo(_context.StringColor));
-
-            CheckBrushes(_context);
-            CheckPens(_context);
-
-            return;
-        }
-
-        void CheckBrushes(CodeRenderingContext context)
-        {
-            Assert.NotNull(_context.BackgroundBrush);
-            Assert.NotNull(_context.CurrentLineBackBrush);
-            Assert.NotNull(_context.CurrentLineForeBrush);
-            Assert.NotNull(_context.KeywordBrush);
-            Assert.NotNull(_context.CommentBrush);
-            Assert.NotNull(_context.CodeBrush);
-            Assert.NotNull(_context.StringBrush);
-
-            Assert.That(_context.GetBrush(ClassificationTag.Code),
-                Is.SameAs(_context.CodeBrush));
-            Assert.That(_context.GetBrush(ClassificationTag.Comment),
-                Is.SameAs(_context.CommentBrush));
-            Assert.That(_context.GetBrush(ClassificationTag.Keyword),
-                Is.SameAs(_context.KeywordBrush));
-            Assert.That(_context.GetBrush(ClassificationTag.String),
-                Is.SameAs(_context.StringBrush));
-
-            return;
-        }
-
-        void CheckPens(CodeRenderingContext context)
-        {
-            Assert.NotNull(_context.BackgroundPen);
-            Assert.NotNull(_context.CurrentLineBackPen);
-            Assert.NotNull(_context.CurrentLineForePen);
-            Assert.NotNull(_context.KeywordPen);
-            Assert.NotNull(_context.CommentPen);
-            Assert.NotNull(_context.CodePen);
-            Assert.NotNull(_context.StringPen);
-
-            Assert.That(_context.GetPen(ClassificationTag.Code),
-               Is.SameAs(_context.CodePen));
-            Assert.That(_context.GetPen(ClassificationTag.Comment),
-                Is.SameAs(_context.CommentPen));
-            Assert.That(_context.GetPen(ClassificationTag.Keyword),
-                Is.SameAs(_context.KeywordPen));
-            Assert.That(_context.GetPen(ClassificationTag.String),
-                Is.SameAs(_context.StringPen));
-
-            return;
-        }
-
-        [Test]
-        public void Can_Change_Colors()
-        {
-            Brush formerBrush;
-            Pen formerPen;
-
-            formerBrush = _context.BackgroundBrush;
-            formerPen = _context.BackgroundPen;
-            _context.BackgroundColor = Color.Pink;
-            Assert.That(_context.BackgroundColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.BackgroundPen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.BackgroundBrush, Is.Not.SameAs(formerBrush));
-
-            formerBrush = _context.CodeBrush;
-            formerPen = _context.CodePen;
-            _context.CodeColor = Color.Pink;
-            Assert.That(_context.CodeColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.CodePen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.CodeBrush, Is.Not.SameAs(formerBrush));
-
-            formerBrush = _context.CommentBrush;
-            formerPen = _context.CommentPen;
-            _context.CommentColor = Color.Pink;
-            Assert.That(_context.CommentColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.CommentPen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.CommentBrush, Is.Not.SameAs(formerBrush));
-
-            formerBrush = _context.CurrentLineBackBrush;
-            formerPen = _context.CurrentLineBackPen;
-            _context.CurrentLineBackColor = Color.Pink;
-            Assert.That(_context.CurrentLineBackColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.CurrentLineBackPen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.CurrentLineBackBrush, Is.Not.SameAs(formerBrush));
-
-            formerBrush = _context.CurrentLineForeBrush;
-            formerPen = _context.CurrentLineForePen;
-            _context.CurrentLineForeColor = Color.Pink;
-            Assert.That(_context.CurrentLineForeColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.CurrentLineForePen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.CurrentLineForeBrush, Is.Not.SameAs(formerBrush));
-
-            formerBrush = _context.KeywordBrush;
-            formerPen = _context.KeywordPen;
-            _context.KeywordColor = Color.Pink;
-            Assert.That(_context.KeywordColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.KeywordPen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.KeywordBrush, Is.Not.SameAs(formerBrush));
-
-            formerBrush = _context.StringBrush;
-            formerPen = _context.StringPen;
-            _context.StringColor = Color.Pink;
-            Assert.That(_context.StringColor, Is.EqualTo(Color.Pink));
-            Assert.That(_context.StringPen, Is.Not.SameAs(formerPen));
-            Assert.That(_context.StringBrush, Is.Not.SameAs(formerBrush));
-
-            CheckPens(_context);
-            CheckBrushes(_context);
-
-            return;
-        }
-
-        class TestingCodeBox : CodeBox
-        {
-            public CodeRenderingContext RenderingContext
-            {
-                get { return (_workingContext); }
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Drawing;
+using NUnit.UiException.CodeFormatters;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestCodeRenderingContext
+    {
+        private CodeRenderingContext _context;
+
+        [SetUp]
+        public void SetUp()
+        {
+            TestingCodeBox box = new TestingCodeBox();
+            _context = box.RenderingContext;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.NotNull(_context);
+            Assert.NotNull(_context.Graphics);
+            Assert.NotNull(_context.Font);
+            Assert.That(_context.Font.Size, Is.EqualTo(8));
+
+            Assert.That(_context.CurrentLine, Is.EqualTo(-1));
+
+            Assert.That(_context.BackgroundColor, Is.EqualTo(Color.White));
+            Assert.That(_context.CurrentLineBackColor, Is.EqualTo(Color.Red));
+            Assert.That(_context.CurrentLineForeColor, Is.EqualTo(Color.White));
+            Assert.That(_context.KeywordColor, Is.EqualTo(Color.Blue));
+            Assert.That(_context.CommentColor, Is.EqualTo(Color.Green));
+            Assert.That(_context.CodeColor, Is.EqualTo(Color.Black));
+            Assert.That(_context.StringColor, Is.EqualTo(Color.Red));
+
+            Assert.That(_context[ClassificationTag.Code], Is.EqualTo(_context.CodeColor));
+            Assert.That(_context[ClassificationTag.Comment], Is.EqualTo(_context.CommentColor));
+            Assert.That(_context[ClassificationTag.Keyword], Is.EqualTo(_context.KeywordColor));
+            Assert.That(_context[ClassificationTag.String], Is.EqualTo(_context.StringColor));
+
+            CheckBrushes(_context);
+            CheckPens(_context);
+
+            return;
+        }
+
+        void CheckBrushes(CodeRenderingContext context)
+        {
+            Assert.NotNull(_context.BackgroundBrush);
+            Assert.NotNull(_context.CurrentLineBackBrush);
+            Assert.NotNull(_context.CurrentLineForeBrush);
+            Assert.NotNull(_context.KeywordBrush);
+            Assert.NotNull(_context.CommentBrush);
+            Assert.NotNull(_context.CodeBrush);
+            Assert.NotNull(_context.StringBrush);
+
+            Assert.That(_context.GetBrush(ClassificationTag.Code),
+                Is.SameAs(_context.CodeBrush));
+            Assert.That(_context.GetBrush(ClassificationTag.Comment),
+                Is.SameAs(_context.CommentBrush));
+            Assert.That(_context.GetBrush(ClassificationTag.Keyword),
+                Is.SameAs(_context.KeywordBrush));
+            Assert.That(_context.GetBrush(ClassificationTag.String),
+                Is.SameAs(_context.StringBrush));
+
+            return;
+        }
+
+        void CheckPens(CodeRenderingContext context)
+        {
+            Assert.NotNull(_context.BackgroundPen);
+            Assert.NotNull(_context.CurrentLineBackPen);
+            Assert.NotNull(_context.CurrentLineForePen);
+            Assert.NotNull(_context.KeywordPen);
+            Assert.NotNull(_context.CommentPen);
+            Assert.NotNull(_context.CodePen);
+            Assert.NotNull(_context.StringPen);
+
+            Assert.That(_context.GetPen(ClassificationTag.Code),
+               Is.SameAs(_context.CodePen));
+            Assert.That(_context.GetPen(ClassificationTag.Comment),
+                Is.SameAs(_context.CommentPen));
+            Assert.That(_context.GetPen(ClassificationTag.Keyword),
+                Is.SameAs(_context.KeywordPen));
+            Assert.That(_context.GetPen(ClassificationTag.String),
+                Is.SameAs(_context.StringPen));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Change_Colors()
+        {
+            Brush formerBrush;
+            Pen formerPen;
+
+            formerBrush = _context.BackgroundBrush;
+            formerPen = _context.BackgroundPen;
+            _context.BackgroundColor = Color.Pink;
+            Assert.That(_context.BackgroundColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.BackgroundPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.BackgroundBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CodeBrush;
+            formerPen = _context.CodePen;
+            _context.CodeColor = Color.Pink;
+            Assert.That(_context.CodeColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CodePen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CodeBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CommentBrush;
+            formerPen = _context.CommentPen;
+            _context.CommentColor = Color.Pink;
+            Assert.That(_context.CommentColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CommentPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CommentBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CurrentLineBackBrush;
+            formerPen = _context.CurrentLineBackPen;
+            _context.CurrentLineBackColor = Color.Pink;
+            Assert.That(_context.CurrentLineBackColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CurrentLineBackPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CurrentLineBackBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.CurrentLineForeBrush;
+            formerPen = _context.CurrentLineForePen;
+            _context.CurrentLineForeColor = Color.Pink;
+            Assert.That(_context.CurrentLineForeColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.CurrentLineForePen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.CurrentLineForeBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.KeywordBrush;
+            formerPen = _context.KeywordPen;
+            _context.KeywordColor = Color.Pink;
+            Assert.That(_context.KeywordColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.KeywordPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.KeywordBrush, Is.Not.SameAs(formerBrush));
+
+            formerBrush = _context.StringBrush;
+            formerPen = _context.StringPen;
+            _context.StringColor = Color.Pink;
+            Assert.That(_context.StringColor, Is.EqualTo(Color.Pink));
+            Assert.That(_context.StringPen, Is.Not.SameAs(formerPen));
+            Assert.That(_context.StringBrush, Is.Not.SameAs(formerBrush));
+
+            CheckPens(_context);
+            CheckBrushes(_context);
+
+            return;
+        }
+
+        class TestingCodeBox : CodeBox
+        {
+            public CodeRenderingContext RenderingContext
+            {
+                get { return (_workingContext); }
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs b/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
index 3f32c38..ac52851 100644
--- a/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
+++ b/src/GuiException/tests/Controls/TestDefaultCodeRenderer.cs
@@ -1,257 +1,257 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using NUnit.UiException.CodeFormatters;
-using System.Drawing;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture]
-    public class TestDefaultCodeRenderer
-    {
-        private ICodeRenderer _renderer;
-        private FormattedCode _empty;
-        private FormattedCode _loremIpsum;
-        private FormattedCode _text3x7;
-        private CodeRenderingContext _args;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _renderer = new DefaultCodeRenderer();
-
-            ICodeFormatter formatter = new PlainTextCodeFormatter();
-
-            _empty = formatter.Format("");
-
-            _text3x7 = formatter.Format(
-                    "111\r\n" +
-                    "222\r\n" +
-                    "333\r\n" +
-                    "444\r\n" +
-                    "555\r\n" +
-                    "666\r\n" +
-                    "777\r\n");
-
-            _loremIpsum = formatter.Format(
-                "Lorem ipsum dolor sit\r\n" +
-                "amet, consectetur adipiscing elit.\r\n" +
-                "Maecenas a nisi. In imperdiet, orci in\r\n" +
-                "porta facilisis,\r\n" +
-                "odio purus iaculis est, non varius urna turpis in mi.\r\n" + // longest line
-                "Nullam dictum. Ut iaculis dignissim nulla.\r\n" +
-                "Nullam condimentum porttitor leo.\r\n" +
-                "Integer a odio et\r\n" +
-                "velit suscipit pulvinar.");
-
-            Image img = new Bitmap(100, 100);
-            _args = new CodeRenderingContext();
-            _args.Graphics = Graphics.FromImage(img);
-            _args.Font = new Font("Courier New", 12);
-
-            return;
-        }
-
-        [Test]
-        public void DrawToGraphics_Can_Raise_ArgumentNullException()
-        {
-            try {
-                _renderer.DrawToGraphics(null, _args, new Rectangle()); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("code"));
-            }
-
-            try {
-                _renderer.DrawToGraphics(_loremIpsum, null, new Rectangle()); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("g"));
-            }            
-
-            return;
-        }
-
-        [Test]
-        public void GetDocumentSize_Can_Raise_ArgumentNullException()
-        {
-            try {
-                _renderer.GetDocumentSize(null, _args.Graphics, _args.Font); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("code"));
-            }
-
-            try {
-                _renderer.GetDocumentSize(_loremIpsum, null, _args.Font); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("g"));
-            }
-
-            try {
-                _renderer.GetDocumentSize(_loremIpsum, _args.Graphics, null); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("font"));
-            }
-           
-            return;
-        }
-
-        [Test]
-        public void LineIndexToYCoordinate_Can_Raise_ArgumentNullException()
-        {
-            try {
-                _renderer.LineIndexToYCoordinate(0, null, _args.Font); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("g"));
-            }
-
-            try {
-                _renderer.LineIndexToYCoordinate(0, _args.Graphics, null); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("font"));
-            }
-        }
-       
-        [Test]
-        public void LineIndexToYCoordinate()
-        {
-            SizeF sz = _args.Graphics.MeasureString("m", _args.Font);
-
-            Assert.That(_renderer.LineIndexToYCoordinate(0, _args.Graphics, _args.Font),
-                Is.EqualTo(0));
-
-            Assert.That(_renderer.LineIndexToYCoordinate(1, _args.Graphics, _args.Font),
-                Is.EqualTo(sz.Height));
-
-            Assert.That(_renderer.LineIndexToYCoordinate(2, _args.Graphics, _args.Font),
-                Is.EqualTo(sz.Height * 2));
-
-            Assert.That(_renderer.LineIndexToYCoordinate(3, _args.Graphics, _args.Font),
-                Is.EqualTo(sz.Height * 3));
-
-            return;
-        }
-
-        [Test]
-        public void GetDocumentSize()
-        {           
-            SizeF expSize;
-            SizeF docSize;
-
-            // measures text3x7's size
-
-            expSize = _args.Graphics.MeasureString("111", _args.Font);
-            docSize = _renderer.GetDocumentSize(_text3x7, _args.Graphics, _args.Font);
-
-            Assert.That(docSize.Width, Is.EqualTo(expSize.Width));
-            Assert.That(docSize.Height, Is.EqualTo(7 * expSize.Height));
-            
-            // measures loremIpsum's size
-
-            expSize = _args.Graphics.MeasureString(
-                "odio purus iaculis est, non varius urna turpis in mi.", _args.Font);
-            docSize = _renderer.GetDocumentSize(_loremIpsum, _args.Graphics, _args.Font);
-
-            Assert.That(docSize.Width, Is.EqualTo(expSize.Width));
-            Assert.That(docSize.Height, Is.EqualTo(9 * expSize.Height));
-
-            return;
-        }
-       
-        [Test]
-        public void ViewportLines()
-        {
-            DefaultCodeRenderer renderer = new DefaultCodeRenderer();
-            PaintLineLocation[] lines;
-            RectangleF viewport = new RectangleF(0, 0, 2, 4);
-            
-            Assert.That(renderer.ViewportLines(_empty, viewport, 1), Is.Not.Null);
-            Assert.That(renderer.ViewportLines(_empty, viewport, 1).Length, Is.EqualTo(0));
-            
-            // Using the given text and viewport
-            //
-            // document   viewport
-            //    1 1 1   * *
-            //    2 2 2   * *
-            //    3 3 3   * *                                
-            //    4 4 4   * *
-            //    5 5 5
-            //    6 6 6
-            //    7 7 7
-            //
-            // Tests below check what area of the document will be seen
-            // through the viewport window. For simplicity issue, we assume
-            // the code is using a Font of docSize 1x1 in pixel.
-
-            lines = renderer.ViewportLines(_text3x7, viewport, 1);
-            Assert.That(lines.Length, Is.EqualTo(5));
-            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(0, 0))));
-            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(0, 1))));
-            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(0, 2))));
-            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(0, 3))));
-            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(0, 4))));
-
-            viewport = new RectangleF(2, 0, 2, 4);
-            lines = renderer.ViewportLines(_text3x7, viewport, 1);
-            Assert.That(lines.Length, Is.EqualTo(5));
-            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(-2, 0))));
-            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(-2, 1))));
-            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-2, 2))));
-            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-2, 3))));
-            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-2, 4))));
-
-            viewport = new RectangleF(0, -3, 2, 4);
-            lines = renderer.ViewportLines(_text3x7, viewport, 1);
-            Assert.That(lines.Length, Is.EqualTo(2));
-            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(0, 3))));
-            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(0, 4))));
-
-            viewport = new RectangleF(1, 5, 2, 4);
-            lines = renderer.ViewportLines(_text3x7, viewport, 1);
-            Assert.That(lines.Length, Is.EqualTo(2));
-            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1, 0))));
-            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1, 1))));
-
-            // using float values for location
-
-            viewport = new RectangleF(1.5f, 2.5f, 2, 4);
-            lines = renderer.ViewportLines(_text3x7, viewport, 1);
-            Assert.That(lines.Length, Is.EqualTo(5));
-            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-1.5f, -0.5f))));
-            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-1.5f, 0.5f))));
-            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-1.5f, 1.5f))));
-            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1.5f, 2.5f))));
-            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1.5f, 3.5f))));
-
-            // using a font sized as 8x15
-
-            viewport = new RectangleF(1.5f * 8, 2.5f * 15, 2 * 8, 4 * 15);
-            lines = renderer.ViewportLines(_text3x7, viewport, 15);
-            Assert.That(lines.Length, Is.EqualTo(5));
-            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-1.5f * 8, -7.5f))));
-            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-1.5f * 8, 7.5f))));
-            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-1.5f * 8, 22.5f))));
-            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1.5f * 8, 37.5f))));
-            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1.5f * 8, 52.5f))));
-
-            return;
-        }        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using NUnit.UiException.CodeFormatters;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestDefaultCodeRenderer
+    {
+        private ICodeRenderer _renderer;
+        private FormattedCode _empty;
+        private FormattedCode _loremIpsum;
+        private FormattedCode _text3x7;
+        private CodeRenderingContext _args;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _renderer = new DefaultCodeRenderer();
+
+            ICodeFormatter formatter = new PlainTextCodeFormatter();
+
+            _empty = formatter.Format("");
+
+            _text3x7 = formatter.Format(
+                    "111\r\n" +
+                    "222\r\n" +
+                    "333\r\n" +
+                    "444\r\n" +
+                    "555\r\n" +
+                    "666\r\n" +
+                    "777\r\n");
+
+            _loremIpsum = formatter.Format(
+                "Lorem ipsum dolor sit\r\n" +
+                "amet, consectetur adipiscing elit.\r\n" +
+                "Maecenas a nisi. In imperdiet, orci in\r\n" +
+                "porta facilisis,\r\n" +
+                "odio purus iaculis est, non varius urna turpis in mi.\r\n" + // longest line
+                "Nullam dictum. Ut iaculis dignissim nulla.\r\n" +
+                "Nullam condimentum porttitor leo.\r\n" +
+                "Integer a odio et\r\n" +
+                "velit suscipit pulvinar.");
+
+            Image img = new Bitmap(100, 100);
+            _args = new CodeRenderingContext();
+            _args.Graphics = Graphics.FromImage(img);
+            _args.Font = new Font("Courier New", 12);
+
+            return;
+        }
+
+        [Test]
+        public void DrawToGraphics_Can_Raise_ArgumentNullException()
+        {
+            try {
+                _renderer.DrawToGraphics(null, _args, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("code"));
+            }
+
+            try {
+                _renderer.DrawToGraphics(_loremIpsum, null, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("g"));
+            }            
+
+            return;
+        }
+
+        [Test]
+        public void GetDocumentSize_Can_Raise_ArgumentNullException()
+        {
+            try {
+                _renderer.GetDocumentSize(null, _args.Graphics, _args.Font); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("code"));
+            }
+
+            try {
+                _renderer.GetDocumentSize(_loremIpsum, null, _args.Font); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("g"));
+            }
+
+            try {
+                _renderer.GetDocumentSize(_loremIpsum, _args.Graphics, null); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("font"));
+            }
+           
+            return;
+        }
+
+        [Test]
+        public void LineIndexToYCoordinate_Can_Raise_ArgumentNullException()
+        {
+            try {
+                _renderer.LineIndexToYCoordinate(0, null, _args.Font); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("g"));
+            }
+
+            try {
+                _renderer.LineIndexToYCoordinate(0, _args.Graphics, null); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("font"));
+            }
+        }
+       
+        [Test]
+        public void LineIndexToYCoordinate()
+        {
+            SizeF sz = _args.Graphics.MeasureString("m", _args.Font);
+
+            Assert.That(_renderer.LineIndexToYCoordinate(0, _args.Graphics, _args.Font),
+                Is.EqualTo(0));
+
+            Assert.That(_renderer.LineIndexToYCoordinate(1, _args.Graphics, _args.Font),
+                Is.EqualTo(sz.Height));
+
+            Assert.That(_renderer.LineIndexToYCoordinate(2, _args.Graphics, _args.Font),
+                Is.EqualTo(sz.Height * 2));
+
+            Assert.That(_renderer.LineIndexToYCoordinate(3, _args.Graphics, _args.Font),
+                Is.EqualTo(sz.Height * 3));
+
+            return;
+        }
+
+        [Test]
+        public void GetDocumentSize()
+        {           
+            SizeF expSize;
+            SizeF docSize;
+
+            // measures text3x7's size
+
+            expSize = _args.Graphics.MeasureString("111", _args.Font);
+            docSize = _renderer.GetDocumentSize(_text3x7, _args.Graphics, _args.Font);
+
+            Assert.That(docSize.Width, Is.EqualTo(expSize.Width));
+            Assert.That(docSize.Height, Is.EqualTo(7 * expSize.Height));
+            
+            // measures loremIpsum's size
+
+            expSize = _args.Graphics.MeasureString(
+                "odio purus iaculis est, non varius urna turpis in mi.", _args.Font);
+            docSize = _renderer.GetDocumentSize(_loremIpsum, _args.Graphics, _args.Font);
+
+            Assert.That(docSize.Width, Is.EqualTo(expSize.Width));
+            Assert.That(docSize.Height, Is.EqualTo(9 * expSize.Height));
+
+            return;
+        }
+       
+        [Test]
+        public void ViewportLines()
+        {
+            DefaultCodeRenderer renderer = new DefaultCodeRenderer();
+            PaintLineLocation[] lines;
+            RectangleF viewport = new RectangleF(0, 0, 2, 4);
+            
+            Assert.That(renderer.ViewportLines(_empty, viewport, 1), Is.Not.Null);
+            Assert.That(renderer.ViewportLines(_empty, viewport, 1).Length, Is.EqualTo(0));
+            
+            // Using the given text and viewport
+            //
+            // document   viewport
+            //    1 1 1   * *
+            //    2 2 2   * *
+            //    3 3 3   * *                                
+            //    4 4 4   * *
+            //    5 5 5
+            //    6 6 6
+            //    7 7 7
+            //
+            // Tests below check what area of the document will be seen
+            // through the viewport window. For simplicity issue, we assume
+            // the code is using a Font of docSize 1x1 in pixel.
+
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(0, 0))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(0, 1))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(0, 2))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(0, 3))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(0, 4))));
+
+            viewport = new RectangleF(2, 0, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(-2, 0))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(-2, 1))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-2, 2))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-2, 3))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-2, 4))));
+
+            viewport = new RectangleF(0, -3, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(2));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(0, "111", new PointF(0, 3))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(1, "222", new PointF(0, 4))));
+
+            viewport = new RectangleF(1, 5, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(2));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1, 0))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1, 1))));
+
+            // using float values for location
+
+            viewport = new RectangleF(1.5f, 2.5f, 2, 4);
+            lines = renderer.ViewportLines(_text3x7, viewport, 1);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-1.5f, -0.5f))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-1.5f, 0.5f))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-1.5f, 1.5f))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1.5f, 2.5f))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1.5f, 3.5f))));
+
+            // using a font sized as 8x15
+
+            viewport = new RectangleF(1.5f * 8, 2.5f * 15, 2 * 8, 4 * 15);
+            lines = renderer.ViewportLines(_text3x7, viewport, 15);
+            Assert.That(lines.Length, Is.EqualTo(5));
+            Assert.That(lines[0], Is.EqualTo(new PaintLineLocation(2, "333", new PointF(-1.5f * 8, -7.5f))));
+            Assert.That(lines[1], Is.EqualTo(new PaintLineLocation(3, "444", new PointF(-1.5f * 8, 7.5f))));
+            Assert.That(lines[2], Is.EqualTo(new PaintLineLocation(4, "555", new PointF(-1.5f * 8, 22.5f))));
+            Assert.That(lines[3], Is.EqualTo(new PaintLineLocation(5, "666", new PointF(-1.5f * 8, 37.5f))));
+            Assert.That(lines[4], Is.EqualTo(new PaintLineLocation(6, "777", new PointF(-1.5f * 8, 52.5f))));
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs b/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
index c0fdcab..c56b633 100644
--- a/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
+++ b/src/GuiException/tests/Controls/TestDefaultErrorListRenderer.cs
@@ -1,223 +1,223 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using System.Drawing;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture]
-    public class TestDefaultErrorListRenderer
-    {
-        private ErrorList _empty;
-        private ErrorList _filled;
-        private DefaultErrorListRenderer _renderer;
-        private Graphics _gr;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _empty = new ErrorList();
-            _filled = new ErrorList();
-            _filled.StackTrace =
-                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
-                "à ExternClass.ExternMethod()\r\n" +
-                "à AnotherExternClass.AnotherExternMethod()\r\n" +
-                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n" +
-                "à SomeClass3.SomeMethod3() dans C:\\folder\\AnotherFile2.cs:ligne 93\r\n";
-
-            _renderer = new DefaultErrorListRenderer();
-
-            Image img = new Bitmap(300, 100);
-            _gr = Graphics.FromImage(img);
-            
-            return;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.NotNull(_renderer.Font);
-            Assert.That(_renderer.Font.Size, Is.EqualTo(8.25f));
-
-            return;
-        }
-
-        [Test]
-        public void MeasureItem()
-        {
-            TestingRenderer renderer = new TestingRenderer();
-            SizeF exp;
-            SizeF actual;
-
-            ErrorItem itemClass = new ErrorItem("/dir/f.cs", "0123456789012.a()", 3);
-            ErrorItem itemMethod = new ErrorItem("/dir/f.cs", "a.0123456789012()", 3);
-            ErrorItem itemFile = new ErrorItem("/dir/0123456789012.cs", "a.b()", 3);
-
-            // measure an item whoose width should be determined
-            // by class field value
-
-            exp = _gr.MeasureString("0123456789012", renderer.Font);
-            actual = renderer.MeasureItem(_gr, itemClass);
-            int itemHeight = renderer.Font.Height * 4 + 6;
-            
-            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
-            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
-
-            // measure an item whoose width should be determined
-            // by method field value
-
-            exp = _gr.MeasureString("0123456789012()", renderer.Font);
-            actual = renderer.MeasureItem(_gr, itemMethod);
-            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
-            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
-
-            // measure an item whoose width should be determined
-            // by filename field value
-
-            exp = _gr.MeasureString("0123456789012.cs", renderer.Font);
-            actual = renderer.MeasureItem(_gr, itemFile);
-            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
-            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
-
-            return;
-        }        
-
-        [Test]
-        public void ItemAt()
-        {
-            ErrorItem item;
-
-            int itemHeight = _renderer.Font.Height * 4 + 6;
-
-            item = _renderer.ItemAt(_filled.Items, _gr, new Point(0, 0));
-            Assert.NotNull(item);
-            Assert.That(item, Is.EqualTo(_filled.Items[0]));
-
-            item = _renderer.ItemAt(_filled.Items, _gr, new Point(0, itemHeight + 1));
-            Assert.NotNull(item);
-            Assert.That(item, Is.EqualTo(_filled.Items[1]));
-
-            Assert.Null(_renderer.ItemAt(_filled.Items, _gr, new Point(0, 480)));
-            Assert.Null(_renderer.ItemAt(_filled.Items, _gr, new Point(0, -1)));
-            Assert.Null(_renderer.ItemAt(null, _gr, new Point(0, 0)));
-
-            return;
-        }
-
-        [Test]
-        public void GetDocumentSize()
-        {
-            TestingRenderer renderer = new TestingRenderer();
-            Size docSize;
-            SizeF maxSize = SizeF.Empty;
-
-            // measuring an empty list returns 0x0
-            
-            docSize = renderer.GetDocumentSize(_empty.Items, _gr);
-            Assert.NotNull(docSize);
-            Assert.That(docSize, Is.EqualTo(new Size(0, 0)));
-
-            // measure for a non empty list relies on the longest item
-            // in that list
-			
-			foreach(ErrorItem item in _filled.Items)
-			{
-				SizeF sz = renderer.MeasureItem(_gr, item);
-				if (sz.Width > maxSize.Width)
-					maxSize = sz;
-			}
-
-            docSize = renderer.GetDocumentSize(_filled.Items, _gr);
-            Assert.NotNull(docSize);
-            Assert.That(docSize.Width, Is.EqualTo((int)maxSize.Width));
-            int itemHeight = renderer.Font.Height * 4 + 6;
-            Assert.That(docSize.Height, Is.EqualTo(_filled.Items.Count * itemHeight));
-
-            return;
-        }
-
-        [Test]
-        public void DrawToGraphics_Can_Throw_ArgumentNullException()
-        {
-            try {
-                _renderer.DrawToGraphics(null, null, _gr, new Rectangle()); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.That(e.Message.Contains("items"));
-            }
-
-            try {
-                _renderer.DrawToGraphics(_filled.Items, null, null, new Rectangle()); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.That(e.Message.Contains("g"));
-            }
-
-            return;
-        }
-
-        [Test]
-        public void IsDirty()
-        {
-            Rectangle viewport = new Rectangle(0, 0, 200, 200);
-            TestingRenderer renderer = new TestingRenderer();
-
-            // no change - true the second time
-
-            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
-            Assert.False(renderer.IsDirty(_filled.Items, _filled.Items[0], viewport));
-
-            // changing the list set dirty flag
-
-            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
-            Assert.True(renderer.IsDirty(_empty.Items, _filled.Items[0], viewport));
-           
-            // changes selected item
-
-            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
-            Assert.True(renderer.IsDirty(_filled.Items, null, viewport));
-            Assert.True(renderer.IsDirty(_filled.Items,
-                new ErrorItem(_filled.Items[0].Path,
-                              _filled.Items[0].FullyQualifiedMethodName,
-                              _filled.Items[0].LineNumber),
-                    viewport));
-
-            // changes viewport
-
-            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
-            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[0], new Rectangle()));
-
-            // reversing item order set dirty flag
-
-            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
-            _filled.Items.Reverse();
-            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[_filled.Items.Count - 1], viewport));
-
-            // Calling GetDocumentSize set dirty flag
-
-            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
-            renderer.GetDocumentSize(_filled.Items, _gr);
-            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[0], viewport));
-
-            return;
-        }
-
-        class TestingRenderer : DefaultErrorListRenderer
-        {
-            public new SizeF MeasureItem(Graphics g, ErrorItem item) {
-                return (base.MeasureItem(g, item));
-            }
-
-            public new bool IsDirty(ErrorItemCollection items, ErrorItem selection, Rectangle viewport) {
-                return (base.IsDirty(items, selection, viewport));
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestDefaultErrorListRenderer
+    {
+        private ErrorList _empty;
+        private ErrorList _filled;
+        private DefaultErrorListRenderer _renderer;
+        private Graphics _gr;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _empty = new ErrorList();
+            _filled = new ErrorList();
+            _filled.StackTrace =
+                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
+                "à ExternClass.ExternMethod()\r\n" +
+                "à AnotherExternClass.AnotherExternMethod()\r\n" +
+                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n" +
+                "à SomeClass3.SomeMethod3() dans C:\\folder\\AnotherFile2.cs:ligne 93\r\n";
+
+            _renderer = new DefaultErrorListRenderer();
+
+            Image img = new Bitmap(300, 100);
+            _gr = Graphics.FromImage(img);
+            
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.NotNull(_renderer.Font);
+            Assert.That(_renderer.Font.Size, Is.EqualTo(8.25f));
+
+            return;
+        }
+
+        [Test]
+        public void MeasureItem()
+        {
+            TestingRenderer renderer = new TestingRenderer();
+            SizeF exp;
+            SizeF actual;
+
+            ErrorItem itemClass = new ErrorItem("/dir/f.cs", "0123456789012.a()", 3);
+            ErrorItem itemMethod = new ErrorItem("/dir/f.cs", "a.0123456789012()", 3);
+            ErrorItem itemFile = new ErrorItem("/dir/0123456789012.cs", "a.b()", 3);
+
+            // measure an item whoose width should be determined
+            // by class field value
+
+            exp = _gr.MeasureString("0123456789012", renderer.Font);
+            actual = renderer.MeasureItem(_gr, itemClass);
+            int itemHeight = renderer.Font.Height * 4 + 6;
+            
+            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
+            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
+
+            // measure an item whoose width should be determined
+            // by method field value
+
+            exp = _gr.MeasureString("0123456789012()", renderer.Font);
+            actual = renderer.MeasureItem(_gr, itemMethod);
+            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
+            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
+
+            // measure an item whoose width should be determined
+            // by filename field value
+
+            exp = _gr.MeasureString("0123456789012.cs", renderer.Font);
+            actual = renderer.MeasureItem(_gr, itemFile);
+            Assert.That((int)actual.Width, Is.EqualTo((int)exp.Width + 16));
+            Assert.That((int)actual.Height, Is.EqualTo(itemHeight));
+
+            return;
+        }        
+
+        [Test]
+        public void ItemAt()
+        {
+            ErrorItem item;
+
+            int itemHeight = _renderer.Font.Height * 4 + 6;
+
+            item = _renderer.ItemAt(_filled.Items, _gr, new Point(0, 0));
+            Assert.NotNull(item);
+            Assert.That(item, Is.EqualTo(_filled.Items[0]));
+
+            item = _renderer.ItemAt(_filled.Items, _gr, new Point(0, itemHeight + 1));
+            Assert.NotNull(item);
+            Assert.That(item, Is.EqualTo(_filled.Items[1]));
+
+            Assert.Null(_renderer.ItemAt(_filled.Items, _gr, new Point(0, 480)));
+            Assert.Null(_renderer.ItemAt(_filled.Items, _gr, new Point(0, -1)));
+            Assert.Null(_renderer.ItemAt(null, _gr, new Point(0, 0)));
+
+            return;
+        }
+
+        [Test]
+        public void GetDocumentSize()
+        {
+            TestingRenderer renderer = new TestingRenderer();
+            Size docSize;
+            SizeF maxSize = SizeF.Empty;
+
+            // measuring an empty list returns 0x0
+            
+            docSize = renderer.GetDocumentSize(_empty.Items, _gr);
+            Assert.NotNull(docSize);
+            Assert.That(docSize, Is.EqualTo(new Size(0, 0)));
+
+            // measure for a non empty list relies on the longest item
+            // in that list
+			
+			foreach(ErrorItem item in _filled.Items)
+			{
+				SizeF sz = renderer.MeasureItem(_gr, item);
+				if (sz.Width > maxSize.Width)
+					maxSize = sz;
+			}
+
+            docSize = renderer.GetDocumentSize(_filled.Items, _gr);
+            Assert.NotNull(docSize);
+            Assert.That(docSize.Width, Is.EqualTo((int)maxSize.Width));
+            int itemHeight = renderer.Font.Height * 4 + 6;
+            Assert.That(docSize.Height, Is.EqualTo(_filled.Items.Count * itemHeight));
+
+            return;
+        }
+
+        [Test]
+        public void DrawToGraphics_Can_Throw_ArgumentNullException()
+        {
+            try {
+                _renderer.DrawToGraphics(null, null, _gr, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.That(e.Message.Contains("items"));
+            }
+
+            try {
+                _renderer.DrawToGraphics(_filled.Items, null, null, new Rectangle()); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.That(e.Message.Contains("g"));
+            }
+
+            return;
+        }
+
+        [Test]
+        public void IsDirty()
+        {
+            Rectangle viewport = new Rectangle(0, 0, 200, 200);
+            TestingRenderer renderer = new TestingRenderer();
+
+            // no change - true the second time
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.False(renderer.IsDirty(_filled.Items, _filled.Items[0], viewport));
+
+            // changing the list set dirty flag
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.True(renderer.IsDirty(_empty.Items, _filled.Items[0], viewport));
+           
+            // changes selected item
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.True(renderer.IsDirty(_filled.Items, null, viewport));
+            Assert.True(renderer.IsDirty(_filled.Items,
+                new ErrorItem(_filled.Items[0].Path,
+                              _filled.Items[0].FullyQualifiedMethodName,
+                              _filled.Items[0].LineNumber),
+                    viewport));
+
+            // changes viewport
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[0], new Rectangle()));
+
+            // reversing item order set dirty flag
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            _filled.Items.Reverse();
+            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[_filled.Items.Count - 1], viewport));
+
+            // Calling GetDocumentSize set dirty flag
+
+            renderer.DrawToGraphics(_filled.Items, _filled.Items[0], _gr, viewport);
+            renderer.GetDocumentSize(_filled.Items, _gr);
+            Assert.True(renderer.IsDirty(_filled.Items, _filled.Items[0], viewport));
+
+            return;
+        }
+
+        class TestingRenderer : DefaultErrorListRenderer
+        {
+            public new SizeF MeasureItem(Graphics g, ErrorItem item) {
+                return (base.MeasureItem(g, item));
+            }
+
+            public new bool IsDirty(ErrorItemCollection items, ErrorItem selection, Rectangle viewport) {
+                return (base.IsDirty(items, selection, viewport));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestErrorBrowser.cs b/src/GuiException/tests/Controls/TestErrorBrowser.cs
index ce2d440..1e2f280 100644
--- a/src/GuiException/tests/Controls/TestErrorBrowser.cs
+++ b/src/GuiException/tests/Controls/TestErrorBrowser.cs
@@ -1,190 +1,190 @@
-// ****************************************************************
-// 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.UiException.Controls;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-    public class TestErrorBrowser
-    {
-        private TestingErrorBrowser _errorBrowser;
-        private bool _stackTraceChanged;
-
-        [SetUp]
-        public void Setup()
-        {
-            _errorBrowser = new TestingErrorBrowser();
-            _stackTraceChanged = false;
-            _errorBrowser.StackTraceSourceChanged += new EventHandler(_errorBrowser_StackTraceSourceChanged);
-
-            return;
-        }
-
-        void _errorBrowser_StackTraceSourceChanged(object sender, EventArgs e)
-        {
-            _stackTraceChanged = true;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.That(_errorBrowser.LayoutPanel, Is.Not.Null);
-            Assert.That(_errorBrowser.Toolbar, Is.Not.Null);
-            Assert.That(_errorBrowser.SelectedDisplay, Is.Null);
-            Assert.That(_errorBrowser.StackTraceSource, Is.Null);
-
-            Assert.That(_errorBrowser.Controls.Contains(_errorBrowser.LayoutPanel), Is.True);
-            Assert.That(_errorBrowser.LayoutPanel.Left, Is.EqualTo(0));
-            Assert.That(_errorBrowser.LayoutPanel.Top, Is.EqualTo(0));
-            Assert.That(_errorBrowser.LayoutPanel.Toolbar.Height, Is.GreaterThan(0));
-
-            Assert.That(_errorBrowser.LayoutPanel.Toolbar, Is.SameAs(_errorBrowser.Toolbar));
-            Assert.That(_errorBrowser.Toolbar.Count, Is.EqualTo(0));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "display",
-            MatchType = MessageMatch.Contains)]
-        public void Cannot_Register_Null_Display()
-        {
-            _errorBrowser.RegisterDisplay(null); // throws exception
-        }        
-
-        [Test]
-        public void ErrorDisplay_Plugins_life_cycle_events()
-        {
-            // test #1: Asks ErrorBrowser to register an instance of IErrorDisplay
-            //
-            // - check the process calls successively IErrorDisplay's
-            //   properties & methods.
-            //
-            // - when registering an IErrorDisplay for the first time, ErrorBrowser
-            //   should select the instance automatically.
-
-            IErrorDisplay mockTraceDisplay = Substitute.For<IErrorDisplay>();
-            IErrorDisplay mockSourceDisplay = Substitute.For<IErrorDisplay>();
-
-            ToolStripButton tracePlugin = new ToolStripButton();
-            Control traceContent = new TextBox();
-            
-            mockTraceDisplay.PluginItem.Returns(tracePlugin);
-            mockTraceDisplay.Content.Returns(traceContent);
-
-            _errorBrowser.RegisterDisplay(mockTraceDisplay);
-
-            mockTraceDisplay.Received().OnStackTraceChanged(_errorBrowser.StackTraceSource);
-
-            Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
-            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
-            //
-            // - Selection should not change
-
-            ToolStripItem sourcePluginItem = new ToolStripButton();
-            Control sourceContent = new Button();
-
-            mockSourceDisplay.PluginItem.Returns(sourcePluginItem);
-
-            _errorBrowser.RegisterDisplay(mockSourceDisplay);
-
-            Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
-            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay));
-
-            // test #3: changes current selection
-
-            mockTraceDisplay.PluginItem.Returns(tracePlugin);
-            mockSourceDisplay.Content.Returns(sourceContent);
-
-            _errorBrowser.Toolbar.SelectedDisplay = mockSourceDisplay;
-
-            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";
-
-            _errorBrowser.StackTraceSource = stack;
-            Assert.That(_errorBrowser.LayoutPanel.Content, Is.TypeOf(typeof(Button)));
-
-            mockTraceDisplay.Received().OnStackTraceChanged(stack);
-            mockSourceDisplay.Received().OnStackTraceChanged(stack);
-            
-            // clears all renderers
-
-            _errorBrowser.ClearAll();
-            Assert.That(_errorBrowser.Toolbar.Count, Is.EqualTo(0));
-
-            Assert.That(_errorBrowser.LayoutPanel.Option, Is.Not.Null);
-            Assert.That(_errorBrowser.LayoutPanel.Option, Is.TypeOf(typeof(Panel)));
-
-            Assert.That(_errorBrowser.LayoutPanel.Content, Is.Not.Null);
-            Assert.That(_errorBrowser.LayoutPanel.Content, Is.TypeOf(typeof(Panel)));          
-            
-            return;
-        }
-
-        [Test]
-        public void Can_Raise_ErrorSourceChanged()
-        {
-            _errorBrowser.StackTraceSource = "à test() C:\\file.cs:ligne 1";
-            Assert.That(_stackTraceChanged, Is.True);
-
-            _stackTraceChanged = false;
-            _errorBrowser.StackTraceSource = null;
-            Assert.That(_stackTraceChanged, Is.True);
-
-            _stackTraceChanged = false;
-            _errorBrowser.StackTraceSource = null;
-            Assert.That(_stackTraceChanged, Is.False);
-
-            return;
-        }
-
-        [Test]
-        public void LayoutPanel_Auto_Resizes_When_Parent_Sizes_Change()
-        {
-            _errorBrowser.Width = 250;
-            _errorBrowser.Height = 300;
-
-            Assert.That(_errorBrowser.LayoutPanel.Width, Is.EqualTo(_errorBrowser.Width));
-            Assert.That(_errorBrowser.LayoutPanel.Height, Is.EqualTo(_errorBrowser.Height));
-
-            _errorBrowser.Width = 50;
-            _errorBrowser.Height = 70;
-
-            Assert.That(_errorBrowser.LayoutPanel.Width, Is.EqualTo(_errorBrowser.Width));
-            Assert.That(_errorBrowser.LayoutPanel.Height, Is.EqualTo(_errorBrowser.Height));
-
-            return;
-        }
-
-        class TestingErrorBrowser :
-            ErrorBrowser
-        {
-            public new ErrorToolbar Toolbar
-            {
-                get { return (base.Toolbar); }
-            }
-
-            public new ErrorPanelLayout LayoutPanel
-            {
-                get { return (base.LayoutPanel); }
-            }
-        }
-    }
-}
-#endif
+// ****************************************************************
+// 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 || NET_4_5
+using System;
+using NSubstitute;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class TestErrorBrowser
+    {
+        private TestingErrorBrowser _errorBrowser;
+        private bool _stackTraceChanged;
+
+        [SetUp]
+        public void Setup()
+        {
+            _errorBrowser = new TestingErrorBrowser();
+            _stackTraceChanged = false;
+            _errorBrowser.StackTraceSourceChanged += new EventHandler(_errorBrowser_StackTraceSourceChanged);
+
+            return;
+        }
+
+        void _errorBrowser_StackTraceSourceChanged(object sender, EventArgs e)
+        {
+            _stackTraceChanged = true;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_errorBrowser.LayoutPanel, Is.Not.Null);
+            Assert.That(_errorBrowser.Toolbar, Is.Not.Null);
+            Assert.That(_errorBrowser.SelectedDisplay, Is.Null);
+            Assert.That(_errorBrowser.StackTraceSource, Is.Null);
+
+            Assert.That(_errorBrowser.Controls.Contains(_errorBrowser.LayoutPanel), Is.True);
+            Assert.That(_errorBrowser.LayoutPanel.Left, Is.EqualTo(0));
+            Assert.That(_errorBrowser.LayoutPanel.Top, Is.EqualTo(0));
+            Assert.That(_errorBrowser.LayoutPanel.Toolbar.Height, Is.GreaterThan(0));
+
+            Assert.That(_errorBrowser.LayoutPanel.Toolbar, Is.SameAs(_errorBrowser.Toolbar));
+            Assert.That(_errorBrowser.Toolbar.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "display",
+            MatchType = MessageMatch.Contains)]
+        public void Cannot_Register_Null_Display()
+        {
+            _errorBrowser.RegisterDisplay(null); // throws exception
+        }        
+
+        [Test]
+        public void ErrorDisplay_Plugins_life_cycle_events()
+        {
+            // test #1: Asks ErrorBrowser to register an instance of IErrorDisplay
+            //
+            // - check the process calls successively IErrorDisplay's
+            //   properties & methods.
+            //
+            // - when registering an IErrorDisplay for the first time, ErrorBrowser
+            //   should select the instance automatically.
+
+            IErrorDisplay mockTraceDisplay = Substitute.For<IErrorDisplay>();
+            IErrorDisplay mockSourceDisplay = Substitute.For<IErrorDisplay>();
+
+            ToolStripButton tracePlugin = new ToolStripButton();
+            Control traceContent = new TextBox();
+            
+            mockTraceDisplay.PluginItem.Returns(tracePlugin);
+            mockTraceDisplay.Content.Returns(traceContent);
+
+            _errorBrowser.RegisterDisplay(mockTraceDisplay);
+
+            mockTraceDisplay.Received().OnStackTraceChanged(_errorBrowser.StackTraceSource);
+
+            Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
+            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
+            //
+            // - Selection should not change
+
+            ToolStripItem sourcePluginItem = new ToolStripButton();
+            Control sourceContent = new Button();
+
+            mockSourceDisplay.PluginItem.Returns(sourcePluginItem);
+
+            _errorBrowser.RegisterDisplay(mockSourceDisplay);
+
+            Assert.That(_errorBrowser.SelectedDisplay, Is.Not.Null);
+            Assert.That(_errorBrowser.SelectedDisplay, Is.SameAs(mockTraceDisplay));
+
+            // test #3: changes current selection
+
+            mockTraceDisplay.PluginItem.Returns(tracePlugin);
+            mockSourceDisplay.Content.Returns(sourceContent);
+
+            _errorBrowser.Toolbar.SelectedDisplay = mockSourceDisplay;
+
+            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";
+
+            _errorBrowser.StackTraceSource = stack;
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.TypeOf(typeof(Button)));
+
+            mockTraceDisplay.Received().OnStackTraceChanged(stack);
+            mockSourceDisplay.Received().OnStackTraceChanged(stack);
+            
+            // clears all renderers
+
+            _errorBrowser.ClearAll();
+            Assert.That(_errorBrowser.Toolbar.Count, Is.EqualTo(0));
+
+            Assert.That(_errorBrowser.LayoutPanel.Option, Is.Not.Null);
+            Assert.That(_errorBrowser.LayoutPanel.Option, Is.TypeOf(typeof(Panel)));
+
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.Not.Null);
+            Assert.That(_errorBrowser.LayoutPanel.Content, Is.TypeOf(typeof(Panel)));          
+            
+            return;
+        }
+
+        [Test]
+        public void Can_Raise_ErrorSourceChanged()
+        {
+            _errorBrowser.StackTraceSource = "à test() C:\\file.cs:ligne 1";
+            Assert.That(_stackTraceChanged, Is.True);
+
+            _stackTraceChanged = false;
+            _errorBrowser.StackTraceSource = null;
+            Assert.That(_stackTraceChanged, Is.True);
+
+            _stackTraceChanged = false;
+            _errorBrowser.StackTraceSource = null;
+            Assert.That(_stackTraceChanged, Is.False);
+
+            return;
+        }
+
+        [Test]
+        public void LayoutPanel_Auto_Resizes_When_Parent_Sizes_Change()
+        {
+            _errorBrowser.Width = 250;
+            _errorBrowser.Height = 300;
+
+            Assert.That(_errorBrowser.LayoutPanel.Width, Is.EqualTo(_errorBrowser.Width));
+            Assert.That(_errorBrowser.LayoutPanel.Height, Is.EqualTo(_errorBrowser.Height));
+
+            _errorBrowser.Width = 50;
+            _errorBrowser.Height = 70;
+
+            Assert.That(_errorBrowser.LayoutPanel.Width, Is.EqualTo(_errorBrowser.Width));
+            Assert.That(_errorBrowser.LayoutPanel.Height, Is.EqualTo(_errorBrowser.Height));
+
+            return;
+        }
+
+        class TestingErrorBrowser :
+            ErrorBrowser
+        {
+            public new ErrorToolbar Toolbar
+            {
+                get { return (base.Toolbar); }
+            }
+
+            public new ErrorPanelLayout LayoutPanel
+            {
+                get { return (base.LayoutPanel); }
+            }
+        }
+    }
+}
+#endif
diff --git a/src/GuiException/tests/Controls/TestErrorList.cs b/src/GuiException/tests/Controls/TestErrorList.cs
index 5535e65..4a49ebe 100644
--- a/src/GuiException/tests/Controls/TestErrorList.cs
+++ b/src/GuiException/tests/Controls/TestErrorList.cs
@@ -1,409 +1,409 @@
-// ****************************************************************
-// 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.UiException.Controls;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-    public class TestErrorList
-    {
-        private TestingErrorList _list;
-        private bool _selectionNotification;
-
-        private string _trace1;
-        private string _trace2;
-
-        private IErrorListRenderer _mockRenderer;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _mockRenderer = Substitute.For<IErrorListRenderer>();
-
-            _list = new TestingErrorList(_mockRenderer);
-
-            _trace1 =
-                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
-                "à ExternClass.ExternMethod()\r\n" +
-                "à AnotherExternClass.AnotherExternMethod()\r\n" +
-                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n" +
-                "à SomeClass3.SomeMethod3() dans C:\\folder\\AnotherFile2.cs:ligne 93\r\n";
-
-            _trace2 =
-                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
-                "à ExternClass.ExternMethod()\r\n" +
-                "à AnotherExternClass.AnotherExternMethod()\r\n" +
-                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n";
-
-            _selectionNotification = false;
-
-            _list.SelectedItemChanged += new EventHandler(_list_SelectedItemChanged);
-
-            return;
-        }
-
-        void _list_SelectedItemChanged(object sender, EventArgs e)
-        {
-            this._selectionNotification = true;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.False(_list.AutoSelectFirstItem);
-            Assert.Null(_list.StackTrace);
-            Assert.NotNull(_list.Items);
-            Assert.That(_list.Items.Count, Is.EqualTo(0));
-            Assert.Null(_list.SelectedItem);
-            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
-            Assert.That(_list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
-
-            return;
-        }
-
-        [Test]
-        public void AutoSelectFirstItem()
-        {
-            _list.UseDefaultRenderer();
-
-            // Test #1:
-            // Populate StackTrace with one localizable item
-            // When AutoSelectFirstItem is set, we expect the
-            // first item to be automatically selected.
-
-            _list.AutoSelectFirstItem = true;
-            _list.StackTrace = _trace1;
-            Assert.NotNull(_list.SelectedItem);
-            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
-
-            // Test #2:
-            // Populate StackTrace with no localizable item
-            // Though AutoSelectFirstItem is set, selection
-            // should be null
-
-            _list.StackTrace = "à SomeClass.SomeMethod()";
-            Assert.Null(_list.SelectedItem);
-
-            // Test #3
-            // Populate StackTrace with one localizable item.
-            // This time AutoSelectFirstItem is not set. We
-            // expect selection to be null.
-
-            _list.AutoSelectFirstItem = false;
-            _list.StackTrace = "à SomeClass.SomeMethod() dans C:\\folder\\file.cs:ligne 1";
-            Assert.Null(_list.SelectedItem);
-
-            return;
-        }
-
-        [Test]
-        public void Populate_StackTraceSource()
-        {
-            Size docSize = new Size(200, 500);
-
-            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
-
-            _list.StackTrace = _trace1;
-            Assert.That(_list.AutoScrollMinSize, Is.EqualTo(new Size(200, 500)));
-
-            Assert.That(_list.StackTrace, Is.EqualTo(_trace1));
-            Assert.That(_list.Items.Count, Is.EqualTo(5));
-            Assert.That(_list.Items[0].LineNumber, Is.EqualTo(20));
-            Assert.That(_list.Items[3].LineNumber, Is.EqualTo(42));
-            Assert.That(_list.Items[4].LineNumber, Is.EqualTo(93));
-
-            return;
-        }
-
-        [Test]
-        public void CurrentSelection()
-        {
-            _list.UseDefaultRenderer();
-            _list.StackTrace = _trace1;
-
-            // can select an item with underlying source code
-
-            _selectionNotification = false;
-            _list.SelectedItem = _list.Items[0];
-            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
-            Assert.True(_selectionNotification);
-
-            // attempting to select an item not localizable
-            // has no effect
-
-            _selectionNotification = false;
-            _list.SelectedItem = _list.Items[1];
-            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
-            Assert.False(_selectionNotification);
-
-            // attempting to select an item not in the list
-            // has no effect
-
-            _selectionNotification = false;
-            _list.SelectedItem = new ErrorItem("C:\\folder\\file42.cs", "SomeClass42.SomeMethod42()", 3);
-            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
-            Assert.False(_selectionNotification);
-
-            // can pass null to SelectedItem
-            _list.SelectedItem = null;
-            Assert.Null(_list.SelectedItem);
-            Assert.True(_selectionNotification);
-
-            // select an item an clear StackTrace
-            // selection should be reset to null
-
-            _list.SelectedItem = _list.Items[0];
-            _selectionNotification = false;
-            _list.StackTrace = null;
-            Assert.Null(_list.SelectedItem);
-            Assert.True(_selectionNotification);
-
-            return;
-        }
-
-        [Test]
-        public void ListOrderPolicy()
-        {
-            ErrorList list = new ErrorList();
-
-            // Check ListOrderPolicy behavior when AutoSelectFirstItem is not set
-
-            list.AutoSelectFirstItem = false;
-            list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
-            Assert.That(list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
-
-            list.StackTrace = _trace1;
-            Assert.That(list.Items[0].LineNumber, Is.EqualTo(93));
-            Assert.That(list.Items[1].LineNumber, Is.EqualTo(42));
-            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[3].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[4].LineNumber, Is.EqualTo(20));
-
-            list.StackTrace = _trace2;
-            Assert.That(list.Items[0].LineNumber, Is.EqualTo(42));
-            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[3].LineNumber, Is.EqualTo(20));
-
-            list.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
-            Assert.That(list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
-
-            Assert.That(list.Items[0].LineNumber, Is.EqualTo(20));
-            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[3].LineNumber, Is.EqualTo(42));
-
-            list.StackTrace = _trace1;
-            Assert.That(list.Items[0].LineNumber, Is.EqualTo(20));
-            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
-            Assert.That(list.Items[3].LineNumber, Is.EqualTo(42));
-            Assert.That(list.Items[4].LineNumber, Is.EqualTo(93));
-
-            // When the AutoSelectFirstItem flag is set, the selected item
-            // is the one the most on top of the list, with source attachment.
-            // Where the most on top depends whether the order is kept unchanged
-            // or reversed.
-
-            list.AutoSelectFirstItem = true;
-            list.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
-            list.StackTrace = _trace1;
-            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(20));
-
-            list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
-            list.StackTrace = _trace1;
-            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(93));
-
-            return;
-        }
-
-        [Test]
-        public void CanReportInvalidItems()
-        {
-            ErrorList list = new ErrorList();
-
-            // feeding ErrorList with garbage details should make it
-            // fail gracefully.
-
-            list.StackTrace =
-                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
-                "Nam at nisi ut neque sollicitudin ultrices. Sed rhoncus\r\n" +
-                "rhoncus arcu. Morbi eu elit ut augue congue luctus. Nullam\r\n" +
-                "eu eros. Nunc blandit varius orci. Mauris condimentum diam\r\n" +
-                "ac ligula. Nullam ut metus. Maecenas sagittis nibh in nisl.\r\n" +
-                "Phasellus rhoncus diam a nulla. Integer vestibulum.\r\n";
-
-            Assert.That(list.Items.Count, Is.EqualTo(1));
-            Assert.That(list.Items[0].BaseMethodName, Is.EqualTo("Fail to parse stack trace"));
-            Assert.IsFalse(list.Items[0].HasSourceAttachment);
-
-            return;
-        }
-
-
-        [Test]
-        public void Invoking_DrawToGraphics()
-        {
-            Size docSize = new Size(200, 500);
-
-            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
-
-            _list.StackTrace = _trace1;
-
-            _list.HoveredIndex = 0;
-            _list.FireOnPaint();
-
-            _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()
-        {
-            Size docSize = new Size(200, 500);
-            Point point;
-            ErrorItem selection;
-
-            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
-            _list.StackTrace = _trace1;
-
-            // simulate a click to 10, 10 - a clickable element
-
-            point = new Point(10, 10);
-            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[0]);
-            _list.FireClick(point);
-
-            Assert.NotNull(_list.SelectedItem);
-            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
-
-            // simulate a click in 10, 110 - this element is not clickable => no source
-
-            selection = _list.SelectedItem;
-            point = new Point(10, 110);
-            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[1]);
-            _list.FireClick(point);
-
-            Assert.NotNull(_list.SelectedItem);
-            Assert.That(_list.SelectedItem, Is.SameAs(selection));
-
-            return;
-        }
-
-        [Test]
-        public void DrawItem()
-        {
-            Size docSize = new Size(200, 500);
-            Point point;
-
-            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
-
-            _list.StackTrace = _trace1;
-
-            // mouse move hover a selectable item
-
-            point = new Point(0, 0);
-            _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));
-
-            _list.ResetFlags();
-            point = new Point(0, 50);
-            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[1]);
-            _list.FireMouseMove(point);
-            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);
-            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[3]);
-            _list.FireMouseMove(point);
-            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
-
-            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
-            _list.StackTrace = null;
-            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
-
-            return;
-        }
-
-        class TestingErrorList : ErrorList
-        {
-            public bool ITEM_ENTERED_NOTIFICATION;
-            public bool ITEM_LEAVED_NOTIFICATION;
-
-            public TestingErrorList(IErrorListRenderer renderer) :
-                base(renderer)
-            {
-            }
-
-            public void ResetFlags()
-            {
-                ITEM_ENTERED_NOTIFICATION = false;
-                ITEM_LEAVED_NOTIFICATION = false;
-            }
-
-            public void FireClick(Point point)
-            {
-                OnClick(point);
-            }
-
-            public void FireMouseMove(Point point)
-            {
-                OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0));
-            }
-
-            public void UseDefaultRenderer()
-            {
-                _renderer = new DefaultErrorListRenderer();
-            }
-
-            public int HoveredIndex
-            {
-                get { return (_hoveredIndex); }
-                set { _hoveredIndex = value; }
-            }
-
-            public Graphics WorkingGraphics
-            {
-                get { return (_workingGraphics); }
-            }
-
-            public void FireOnPaint()
-            {
-                OnPaint(new PaintEventArgs(WorkingGraphics, ClientRectangle));
-
-                return;
-            }
-
-            protected override void ItemEntered(int index)
-            {
-                base.ItemEntered(index);
-                ITEM_ENTERED_NOTIFICATION = true;
-            }
-
-            protected override void ItemLeaved(int index)
-            {
-                base.ItemLeaved(index);
-                ITEM_LEAVED_NOTIFICATION = true;
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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 || NET_4_5
+using System;
+using NSubstitute;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class TestErrorList
+    {
+        private TestingErrorList _list;
+        private bool _selectionNotification;
+
+        private string _trace1;
+        private string _trace2;
+
+        private IErrorListRenderer _mockRenderer;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _mockRenderer = Substitute.For<IErrorListRenderer>();
+
+            _list = new TestingErrorList(_mockRenderer);
+
+            _trace1 =
+                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
+                "à ExternClass.ExternMethod()\r\n" +
+                "à AnotherExternClass.AnotherExternMethod()\r\n" +
+                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n" +
+                "à SomeClass3.SomeMethod3() dans C:\\folder\\AnotherFile2.cs:ligne 93\r\n";
+
+            _trace2 =
+                "à SomeClass.SomeMethod() dans C:\\folder\\file1.cs:ligne 20\r\n" +
+                "à ExternClass.ExternMethod()\r\n" +
+                "à AnotherExternClass.AnotherExternMethod()\r\n" +
+                "à SomeClass2.SomeMethod2() dans C:\\folder\\file2.cs:ligne 42\r\n";
+
+            _selectionNotification = false;
+
+            _list.SelectedItemChanged += new EventHandler(_list_SelectedItemChanged);
+
+            return;
+        }
+
+        void _list_SelectedItemChanged(object sender, EventArgs e)
+        {
+            this._selectionNotification = true;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.False(_list.AutoSelectFirstItem);
+            Assert.Null(_list.StackTrace);
+            Assert.NotNull(_list.Items);
+            Assert.That(_list.Items.Count, Is.EqualTo(0));
+            Assert.Null(_list.SelectedItem);
+            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
+            Assert.That(_list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
+
+            return;
+        }
+
+        [Test]
+        public void AutoSelectFirstItem()
+        {
+            _list.UseDefaultRenderer();
+
+            // Test #1:
+            // Populate StackTrace with one localizable item
+            // When AutoSelectFirstItem is set, we expect the
+            // first item to be automatically selected.
+
+            _list.AutoSelectFirstItem = true;
+            _list.StackTrace = _trace1;
+            Assert.NotNull(_list.SelectedItem);
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+
+            // Test #2:
+            // Populate StackTrace with no localizable item
+            // Though AutoSelectFirstItem is set, selection
+            // should be null
+
+            _list.StackTrace = "à SomeClass.SomeMethod()";
+            Assert.Null(_list.SelectedItem);
+
+            // Test #3
+            // Populate StackTrace with one localizable item.
+            // This time AutoSelectFirstItem is not set. We
+            // expect selection to be null.
+
+            _list.AutoSelectFirstItem = false;
+            _list.StackTrace = "à SomeClass.SomeMethod() dans C:\\folder\\file.cs:ligne 1";
+            Assert.Null(_list.SelectedItem);
+
+            return;
+        }
+
+        [Test]
+        public void Populate_StackTraceSource()
+        {
+            Size docSize = new Size(200, 500);
+
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
+
+            _list.StackTrace = _trace1;
+            Assert.That(_list.AutoScrollMinSize, Is.EqualTo(new Size(200, 500)));
+
+            Assert.That(_list.StackTrace, Is.EqualTo(_trace1));
+            Assert.That(_list.Items.Count, Is.EqualTo(5));
+            Assert.That(_list.Items[0].LineNumber, Is.EqualTo(20));
+            Assert.That(_list.Items[3].LineNumber, Is.EqualTo(42));
+            Assert.That(_list.Items[4].LineNumber, Is.EqualTo(93));
+
+            return;
+        }
+
+        [Test]
+        public void CurrentSelection()
+        {
+            _list.UseDefaultRenderer();
+            _list.StackTrace = _trace1;
+
+            // can select an item with underlying source code
+
+            _selectionNotification = false;
+            _list.SelectedItem = _list.Items[0];
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+            Assert.True(_selectionNotification);
+
+            // attempting to select an item not localizable
+            // has no effect
+
+            _selectionNotification = false;
+            _list.SelectedItem = _list.Items[1];
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+            Assert.False(_selectionNotification);
+
+            // attempting to select an item not in the list
+            // has no effect
+
+            _selectionNotification = false;
+            _list.SelectedItem = new ErrorItem("C:\\folder\\file42.cs", "SomeClass42.SomeMethod42()", 3);
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+            Assert.False(_selectionNotification);
+
+            // can pass null to SelectedItem
+            _list.SelectedItem = null;
+            Assert.Null(_list.SelectedItem);
+            Assert.True(_selectionNotification);
+
+            // select an item an clear StackTrace
+            // selection should be reset to null
+
+            _list.SelectedItem = _list.Items[0];
+            _selectionNotification = false;
+            _list.StackTrace = null;
+            Assert.Null(_list.SelectedItem);
+            Assert.True(_selectionNotification);
+
+            return;
+        }
+
+        [Test]
+        public void ListOrderPolicy()
+        {
+            ErrorList list = new ErrorList();
+
+            // Check ListOrderPolicy behavior when AutoSelectFirstItem is not set
+
+            list.AutoSelectFirstItem = false;
+            list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            Assert.That(list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
+
+            list.StackTrace = _trace1;
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(93));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(42));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[4].LineNumber, Is.EqualTo(20));
+
+            list.StackTrace = _trace2;
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(42));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(20));
+
+            list.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+            Assert.That(list.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
+
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(20));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(42));
+
+            list.StackTrace = _trace1;
+            Assert.That(list.Items[0].LineNumber, Is.EqualTo(20));
+            Assert.That(list.Items[1].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[2].LineNumber, Is.EqualTo(0));
+            Assert.That(list.Items[3].LineNumber, Is.EqualTo(42));
+            Assert.That(list.Items[4].LineNumber, Is.EqualTo(93));
+
+            // When the AutoSelectFirstItem flag is set, the selected item
+            // is the one the most on top of the list, with source attachment.
+            // Where the most on top depends whether the order is kept unchanged
+            // or reversed.
+
+            list.AutoSelectFirstItem = true;
+            list.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+            list.StackTrace = _trace1;
+            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(20));
+
+            list.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            list.StackTrace = _trace1;
+            Assert.That(list.SelectedItem.LineNumber, Is.EqualTo(93));
+
+            return;
+        }
+
+        [Test]
+        public void CanReportInvalidItems()
+        {
+            ErrorList list = new ErrorList();
+
+            // feeding ErrorList with garbage details should make it
+            // fail gracefully.
+
+            list.StackTrace =
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
+                "Nam at nisi ut neque sollicitudin ultrices. Sed rhoncus\r\n" +
+                "rhoncus arcu. Morbi eu elit ut augue congue luctus. Nullam\r\n" +
+                "eu eros. Nunc blandit varius orci. Mauris condimentum diam\r\n" +
+                "ac ligula. Nullam ut metus. Maecenas sagittis nibh in nisl.\r\n" +
+                "Phasellus rhoncus diam a nulla. Integer vestibulum.\r\n";
+
+            Assert.That(list.Items.Count, Is.EqualTo(1));
+            Assert.That(list.Items[0].BaseMethodName, Is.EqualTo("Fail to parse stack trace"));
+            Assert.IsFalse(list.Items[0].HasSourceAttachment);
+
+            return;
+        }
+
+
+        [Test]
+        public void Invoking_DrawToGraphics()
+        {
+            Size docSize = new Size(200, 500);
+
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
+
+            _list.StackTrace = _trace1;
+
+            _list.HoveredIndex = 0;
+            _list.FireOnPaint();
+
+            _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()
+        {
+            Size docSize = new Size(200, 500);
+            Point point;
+            ErrorItem selection;
+
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
+            _list.StackTrace = _trace1;
+
+            // simulate a click to 10, 10 - a clickable element
+
+            point = new Point(10, 10);
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[0]);
+            _list.FireClick(point);
+
+            Assert.NotNull(_list.SelectedItem);
+            Assert.That(_list.SelectedItem, Is.EqualTo(_list.Items[0]));
+
+            // simulate a click in 10, 110 - this element is not clickable => no source
+
+            selection = _list.SelectedItem;
+            point = new Point(10, 110);
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[1]);
+            _list.FireClick(point);
+
+            Assert.NotNull(_list.SelectedItem);
+            Assert.That(_list.SelectedItem, Is.SameAs(selection));
+
+            return;
+        }
+
+        [Test]
+        public void DrawItem()
+        {
+            Size docSize = new Size(200, 500);
+            Point point;
+
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
+
+            _list.StackTrace = _trace1;
+
+            // mouse move hover a selectable item
+
+            point = new Point(0, 0);
+            _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));
+
+            _list.ResetFlags();
+            point = new Point(0, 50);
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[1]);
+            _list.FireMouseMove(point);
+            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);
+            _mockRenderer.ItemAt(_list.Items, _list.WorkingGraphics, point).Returns(_list.Items[3]);
+            _list.FireMouseMove(point);
+            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
+
+            _mockRenderer.GetDocumentSize(_list.Items, _list.WorkingGraphics).Returns(docSize);
+            _list.StackTrace = null;
+            Assert.That(_list.HoveredIndex, Is.EqualTo(-1));
+
+            return;
+        }
+
+        class TestingErrorList : ErrorList
+        {
+            public bool ITEM_ENTERED_NOTIFICATION;
+            public bool ITEM_LEAVED_NOTIFICATION;
+
+            public TestingErrorList(IErrorListRenderer renderer) :
+                base(renderer)
+            {
+            }
+
+            public void ResetFlags()
+            {
+                ITEM_ENTERED_NOTIFICATION = false;
+                ITEM_LEAVED_NOTIFICATION = false;
+            }
+
+            public void FireClick(Point point)
+            {
+                OnClick(point);
+            }
+
+            public void FireMouseMove(Point point)
+            {
+                OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0));
+            }
+
+            public void UseDefaultRenderer()
+            {
+                _renderer = new DefaultErrorListRenderer();
+            }
+
+            public int HoveredIndex
+            {
+                get { return (_hoveredIndex); }
+                set { _hoveredIndex = value; }
+            }
+
+            public Graphics WorkingGraphics
+            {
+                get { return (_workingGraphics); }
+            }
+
+            public void FireOnPaint()
+            {
+                OnPaint(new PaintEventArgs(WorkingGraphics, ClientRectangle));
+
+                return;
+            }
+
+            protected override void ItemEntered(int index)
+            {
+                base.ItemEntered(index);
+                ITEM_ENTERED_NOTIFICATION = true;
+            }
+
+            protected override void ItemLeaved(int index)
+            {
+                base.ItemLeaved(index);
+                ITEM_LEAVED_NOTIFICATION = true;
+            }
+        }
+    }
+}
 #endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestErrorPanelLayout.cs b/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
index 27253f7..52c38e6 100644
--- a/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
+++ b/src/GuiException/tests/Controls/TestErrorPanelLayout.cs
@@ -1,143 +1,143 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture]
-    public class TestErrorPanelLayout
-    {
-        private ErrorPanelLayout _panel;
-        private Control _aToolbar;
-        private Control _aContent;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _panel = new ErrorPanelLayout();
-
-            _aToolbar = new Panel();
-            _aContent = new Panel();
-
-            return;
-        }
-
-        public static void CheckLayout(Control control, int left, int top, int width, int height)
-        {
-            Assert.That(control.Left, Is.EqualTo(left), "invalid control.Left value");
-            Assert.That(control.Top, Is.EqualTo(top), "invalid control.Top value");
-            Assert.That(control.Width, Is.EqualTo(width), "invalid control.Width value");
-            Assert.That(control.Height, Is.EqualTo(height), "invalid control.Height value");
-
-            return;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.That(_panel.Toolbar, Is.Not.Null);
-            Assert.That(_panel.Content, Is.Not.Null);
-
-            Assert.That(_panel.Controls.Count, Is.EqualTo(2));
-
-            Assert.That(_panel.Width, Is.EqualTo(200));
-            Assert.That(_panel.Height, Is.EqualTo(200));
-
-            // checks default position and docSize for child panels
-
-            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
-            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
-                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            return;
-        }
-
-        [Test]
-        public void Setting_Toolbar()
-        {
-            Control prev;
-
-            prev = _panel.Toolbar;
-
-            // replacing toolbar
-
-            _panel.Toolbar = _aToolbar;
-
-            Assert.That(_panel.Toolbar, Is.EqualTo(_aToolbar));
-            Assert.True(_panel.Controls.Contains(_aToolbar));
-            Assert.False(_panel.Controls.Contains(prev));
-            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            // restoring default state
-
-            _panel.Toolbar = null; 
-
-            Assert.That(_panel.Toolbar, Is.EqualTo(prev));
-            Assert.False(_panel.Controls.Contains(_aToolbar));
-            Assert.True(_panel.Controls.Contains(prev));
-            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            return;
-        }        
-
-        [Test]
-        public void Setting_Content()
-        {
-            Control prev;
-
-            // replacing Content
-
-            prev = _panel.Content;
-            _panel.Content = _aContent;
-
-            Assert.That(_panel.Content, Is.EqualTo(_aContent));
-            Assert.True(_panel.Controls.Contains(_aContent));
-            Assert.False(_panel.Controls.Contains(prev));
-            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200, 
-                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            // restoring Content to its default state
-
-            _panel.Content = null; 
-
-            Assert.That(_panel.Content, Is.EqualTo(prev));
-            Assert.False(_panel.Controls.Contains(_aContent));
-            Assert.True(_panel.Controls.Contains(prev));
-            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
-                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            _panel.Content = _panel.Content; // should not cause error
-
-            Assert.That(_panel.Content, Is.EqualTo(_panel.Content));
-            Assert.That(_panel.Controls.Contains(_panel.Content));
-            Assert.That(_panel.Controls.Count, Is.EqualTo(2));
-            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
-                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            return;
-        }
-
-        [Test]
-        public void Can_Layout_Child_Controls_When_Size_Changed()
-        {
-            _panel.Width = 300;
-
-            CheckLayout(_panel.Toolbar, 0, 0, 300, ErrorPanelLayout.TOOLBAR_HEIGHT);
-            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 300,
-                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            _panel.Height = 400;
-
-            CheckLayout(_panel.Toolbar, 0, 0, 300, ErrorPanelLayout.TOOLBAR_HEIGHT);
-            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 300,
-                400 - ErrorPanelLayout.TOOLBAR_HEIGHT);
-
-            return;
-        }        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestErrorPanelLayout
+    {
+        private ErrorPanelLayout _panel;
+        private Control _aToolbar;
+        private Control _aContent;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _panel = new ErrorPanelLayout();
+
+            _aToolbar = new Panel();
+            _aContent = new Panel();
+
+            return;
+        }
+
+        public static void CheckLayout(Control control, int left, int top, int width, int height)
+        {
+            Assert.That(control.Left, Is.EqualTo(left), "invalid control.Left value");
+            Assert.That(control.Top, Is.EqualTo(top), "invalid control.Top value");
+            Assert.That(control.Width, Is.EqualTo(width), "invalid control.Width value");
+            Assert.That(control.Height, Is.EqualTo(height), "invalid control.Height value");
+
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_panel.Toolbar, Is.Not.Null);
+            Assert.That(_panel.Content, Is.Not.Null);
+
+            Assert.That(_panel.Controls.Count, Is.EqualTo(2));
+
+            Assert.That(_panel.Width, Is.EqualTo(200));
+            Assert.That(_panel.Height, Is.EqualTo(200));
+
+            // checks default position and docSize for child panels
+
+            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }
+
+        [Test]
+        public void Setting_Toolbar()
+        {
+            Control prev;
+
+            prev = _panel.Toolbar;
+
+            // replacing toolbar
+
+            _panel.Toolbar = _aToolbar;
+
+            Assert.That(_panel.Toolbar, Is.EqualTo(_aToolbar));
+            Assert.True(_panel.Controls.Contains(_aToolbar));
+            Assert.False(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            // restoring default state
+
+            _panel.Toolbar = null; 
+
+            Assert.That(_panel.Toolbar, Is.EqualTo(prev));
+            Assert.False(_panel.Controls.Contains(_aToolbar));
+            Assert.True(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Toolbar, 0, 0, 200, ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }        
+
+        [Test]
+        public void Setting_Content()
+        {
+            Control prev;
+
+            // replacing Content
+
+            prev = _panel.Content;
+            _panel.Content = _aContent;
+
+            Assert.That(_panel.Content, Is.EqualTo(_aContent));
+            Assert.True(_panel.Controls.Contains(_aContent));
+            Assert.False(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200, 
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            // restoring Content to its default state
+
+            _panel.Content = null; 
+
+            Assert.That(_panel.Content, Is.EqualTo(prev));
+            Assert.False(_panel.Controls.Contains(_aContent));
+            Assert.True(_panel.Controls.Contains(prev));
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            _panel.Content = _panel.Content; // should not cause error
+
+            Assert.That(_panel.Content, Is.EqualTo(_panel.Content));
+            Assert.That(_panel.Controls.Contains(_panel.Content));
+            Assert.That(_panel.Controls.Count, Is.EqualTo(2));
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 200,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }
+
+        [Test]
+        public void Can_Layout_Child_Controls_When_Size_Changed()
+        {
+            _panel.Width = 300;
+
+            CheckLayout(_panel.Toolbar, 0, 0, 300, ErrorPanelLayout.TOOLBAR_HEIGHT);
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 300,
+                200 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            _panel.Height = 400;
+
+            CheckLayout(_panel.Toolbar, 0, 0, 300, ErrorPanelLayout.TOOLBAR_HEIGHT);
+            CheckLayout(_panel.Content, 0, ErrorPanelLayout.TOOLBAR_HEIGHT, 300,
+                400 - ErrorPanelLayout.TOOLBAR_HEIGHT);
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestErrorToolbar.cs b/src/GuiException/tests/Controls/TestErrorToolbar.cs
index 0c81a3d..4660b93 100644
--- a/src/GuiException/tests/Controls/TestErrorToolbar.cs
+++ b/src/GuiException/tests/Controls/TestErrorToolbar.cs
@@ -1,228 +1,228 @@
-// ****************************************************************
-// 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.UiException.Controls;
-using System.Windows.Forms;
-using System.Drawing;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-    public class TestErrorToolbar
-    {
-        private ErrorToolbar _emptyToolbar;
-        private ErrorToolbar _filledToolbar;
-
-        private IErrorDisplay _raw;
-        private IErrorDisplay _browser;
-
-        private bool _rendererChangeNotification;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _emptyToolbar = new ErrorToolbar();
-            _filledToolbar = new ErrorToolbar();
-
-            _raw = Substitute.For<IErrorDisplay>();
-            _raw.PluginItem.Returns(new ToolStripButton());
-            
-            _browser = Substitute.For<IErrorDisplay>();
-            _browser.PluginItem.Returns(new ToolStripButton());
-
-            _filledToolbar.Register(_raw);
-            _filledToolbar.Register(_browser);
-
-            _rendererChangeNotification = false;
-            _filledToolbar.SelectedRendererChanged += new EventHandler(_filledToolbar_SelectedRendererChanged);
-
-            return;
-        }
-
-        void _filledToolbar_SelectedRendererChanged(object sender, EventArgs e)
-        {
-            _rendererChangeNotification = true;
-        }
-
-        [Test]
-        public void NewStripButton()
-        {
-            Assert.NotNull(ErrorToolbar.NewStripButton(true, "text", new Bitmap(10, 10), null));
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.That(_emptyToolbar.Controls.Count, Is.EqualTo(0));
-            Assert.That(_emptyToolbar.Count, Is.EqualTo(0));
-            Assert.That(_emptyToolbar.SelectedDisplay, Is.Null);
-
-            Assert.That(_filledToolbar.Count, Is.EqualTo(2));
-            Assert.That(_filledToolbar[0], Is.Not.Null);
-            Assert.That(_filledToolbar[1], Is.Not.Null);
-            Assert.NotNull(_filledToolbar.SelectedDisplay);
-            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_raw));
-
-            return;
-        }
-
-        [Test]
-        public void Cannot_Register_Null_Display()
-        {
-            try {
-                _emptyToolbar.Register(null); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("display"));
-            }
-
-            try {
-                _raw.PluginItem.Returns((ToolStripButton) null); 
-                _emptyToolbar.Register(_raw); // throws exception
-                Assert.Fail();
-            }
-            catch (Exception e) {
-                Assert.True(e.Message.Contains("PluginItem"));
-            }
-
-            return;
-        }
-
-        [Test,
-         ExpectedException(typeof(ArgumentException),
-             ExpectedMessage = "Cannot select unregistered display.",
-             MatchType = MessageMatch.Contains)]
-        public void Cannot_Select_UnRegistered_Display()
-        {
-            IErrorDisplay unknown = Substitute.For<IErrorDisplay>();
-
-            _filledToolbar.SelectedDisplay = unknown; // throws exception
-
-            return;
-        }
-
-        [Test]
-        public void SelectedDisplay()
-        {
-            // clear selection if any
-
-            _filledToolbar.SelectedDisplay = null;
-
-            // check ability to select raw display
-            
-            _filledToolbar.SelectedDisplay = _raw;
-            Assert.NotNull(_filledToolbar.SelectedDisplay);
-            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_raw));
-            Assert.True(_rendererChangeNotification);
-
-            // check ability to select browser display
-
-            _rendererChangeNotification = false;
-            _filledToolbar.SelectedDisplay = _browser;
-            Assert.NotNull(_filledToolbar.SelectedDisplay);
-            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_browser));
-            Assert.True(_rendererChangeNotification);
-
-            // check ability to clear selection
-
-            _rendererChangeNotification = false;
-            _filledToolbar.SelectedDisplay = null;
-            Assert.That(_filledToolbar.SelectedDisplay, Is.Null);
-            Assert.True(_rendererChangeNotification);
-
-            // event should be raised when a real
-            // change occurs
-
-            _rendererChangeNotification = false;
-            _filledToolbar.SelectedDisplay = null;
-            Assert.False(_rendererChangeNotification);
-
-            return;
-        }
-
-        [Test]
-        public void Registering_displays_adds_ToolStripItem()
-        {
-            ToolStripButton rawView = new ToolStripButton("raw display");
-            ToolStripButton browserView = new ToolStripButton("code display");
-            ToolStripItem[] btns = new ToolStripItem[] { new ToolStripButton("swap") };
-
-            // add part            
-            _raw.PluginItem.Returns(rawView);
-            _raw.OptionItems.Returns((ToolStripItem[]) null);
-            _emptyToolbar.Register(_raw);
-            Assert.True(_emptyToolbar.Items.Contains(rawView));
-
-            _browser.PluginItem.Returns(browserView);
-            _browser.OptionItems.Returns(btns);
-            _emptyToolbar.Register(_browser);
-            Assert.True(_emptyToolbar.Items.Contains(rawView));
-            Assert.True(_emptyToolbar.Items.Contains(browserView));
-            Assert.True(_emptyToolbar.Items.Contains(btns[0]));
-
-            // clear part
-
-            _emptyToolbar.Clear();
-            Assert.That(_emptyToolbar.Count, Is.EqualTo(0));
-            Assert.False(_emptyToolbar.Items.Contains(rawView));
-            Assert.False(_emptyToolbar.Items.Contains(browserView));
-            Assert.False(_emptyToolbar.Items.Contains(btns[0]));
-            
-            return;
-        }
-
-        [Test]
-        public void PluginItem_Click_Raises_SelectedRenderedChanged()
-        {
-            ErrorToolbar toolbar = new ErrorToolbar();
-            StackTraceDisplay raw = new StackTraceDisplay();
-            SourceCodeDisplay code = new SourceCodeDisplay();
-
-            toolbar.Register(raw);
-            toolbar.Register(code);
-
-            raw.PluginItem.PerformClick();
-            Assert.NotNull(toolbar.SelectedDisplay);
-            Assert.That(toolbar.SelectedDisplay, Is.EqualTo(raw));
-
-            code.PluginItem.PerformClick();
-            Assert.NotNull(toolbar.SelectedDisplay);
-            Assert.That(toolbar.SelectedDisplay, Is.EqualTo(code));
-
-            return;
-        }
-
-        [Test]
-        public void Set_Or_Unset_Check_Flag_On_Selection()
-        {
-            ErrorToolbar toolbar = new ErrorToolbar();
-            StackTraceDisplay raw = new StackTraceDisplay();
-            SourceCodeDisplay code = new SourceCodeDisplay();
-
-            toolbar.Register(raw);
-            toolbar.Register(code);
-
-            toolbar.SelectedDisplay = raw;
-            Assert.True(((ToolStripButton)raw.PluginItem).Checked);
-            Assert.False(((ToolStripButton)code.PluginItem).Checked);
-
-            toolbar.SelectedDisplay = code;
-            Assert.False(((ToolStripButton)raw.PluginItem).Checked);
-            Assert.True(((ToolStripButton)code.PluginItem).Checked);
-
-            toolbar.SelectedDisplay = null;
-            Assert.False(((ToolStripButton)raw.PluginItem).Checked);
-            Assert.False(((ToolStripButton)code.PluginItem).Checked);
-
-            return;
-        }        
-    }
-}
+// ****************************************************************
+// 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 || NET_4_5
+using System;
+using NSubstitute;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class TestErrorToolbar
+    {
+        private ErrorToolbar _emptyToolbar;
+        private ErrorToolbar _filledToolbar;
+
+        private IErrorDisplay _raw;
+        private IErrorDisplay _browser;
+
+        private bool _rendererChangeNotification;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _emptyToolbar = new ErrorToolbar();
+            _filledToolbar = new ErrorToolbar();
+
+            _raw = Substitute.For<IErrorDisplay>();
+            _raw.PluginItem.Returns(new ToolStripButton());
+            
+            _browser = Substitute.For<IErrorDisplay>();
+            _browser.PluginItem.Returns(new ToolStripButton());
+
+            _filledToolbar.Register(_raw);
+            _filledToolbar.Register(_browser);
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedRendererChanged += new EventHandler(_filledToolbar_SelectedRendererChanged);
+
+            return;
+        }
+
+        void _filledToolbar_SelectedRendererChanged(object sender, EventArgs e)
+        {
+            _rendererChangeNotification = true;
+        }
+
+        [Test]
+        public void NewStripButton()
+        {
+            Assert.NotNull(ErrorToolbar.NewStripButton(true, "text", new Bitmap(10, 10), null));
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_emptyToolbar.Controls.Count, Is.EqualTo(0));
+            Assert.That(_emptyToolbar.Count, Is.EqualTo(0));
+            Assert.That(_emptyToolbar.SelectedDisplay, Is.Null);
+
+            Assert.That(_filledToolbar.Count, Is.EqualTo(2));
+            Assert.That(_filledToolbar[0], Is.Not.Null);
+            Assert.That(_filledToolbar[1], Is.Not.Null);
+            Assert.NotNull(_filledToolbar.SelectedDisplay);
+            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_raw));
+
+            return;
+        }
+
+        [Test]
+        public void Cannot_Register_Null_Display()
+        {
+            try {
+                _emptyToolbar.Register(null); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("display"));
+            }
+
+            try {
+                _raw.PluginItem.Returns((ToolStripButton) null); 
+                _emptyToolbar.Register(_raw); // throws exception
+                Assert.Fail();
+            }
+            catch (Exception e) {
+                Assert.True(e.Message.Contains("PluginItem"));
+            }
+
+            return;
+        }
+
+        [Test,
+         ExpectedException(typeof(ArgumentException),
+             ExpectedMessage = "Cannot select unregistered display.",
+             MatchType = MessageMatch.Contains)]
+        public void Cannot_Select_UnRegistered_Display()
+        {
+            IErrorDisplay unknown = Substitute.For<IErrorDisplay>();
+
+            _filledToolbar.SelectedDisplay = unknown; // throws exception
+
+            return;
+        }
+
+        [Test]
+        public void SelectedDisplay()
+        {
+            // clear selection if any
+
+            _filledToolbar.SelectedDisplay = null;
+
+            // check ability to select raw display
+            
+            _filledToolbar.SelectedDisplay = _raw;
+            Assert.NotNull(_filledToolbar.SelectedDisplay);
+            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_raw));
+            Assert.True(_rendererChangeNotification);
+
+            // check ability to select browser display
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedDisplay = _browser;
+            Assert.NotNull(_filledToolbar.SelectedDisplay);
+            Assert.That(_filledToolbar.SelectedDisplay, Is.SameAs(_browser));
+            Assert.True(_rendererChangeNotification);
+
+            // check ability to clear selection
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedDisplay = null;
+            Assert.That(_filledToolbar.SelectedDisplay, Is.Null);
+            Assert.True(_rendererChangeNotification);
+
+            // event should be raised when a real
+            // change occurs
+
+            _rendererChangeNotification = false;
+            _filledToolbar.SelectedDisplay = null;
+            Assert.False(_rendererChangeNotification);
+
+            return;
+        }
+
+        [Test]
+        public void Registering_displays_adds_ToolStripItem()
+        {
+            ToolStripButton rawView = new ToolStripButton("raw display");
+            ToolStripButton browserView = new ToolStripButton("code display");
+            ToolStripItem[] btns = new ToolStripItem[] { new ToolStripButton("swap") };
+
+            // add part            
+            _raw.PluginItem.Returns(rawView);
+            _raw.OptionItems.Returns((ToolStripItem[]) null);
+            _emptyToolbar.Register(_raw);
+            Assert.True(_emptyToolbar.Items.Contains(rawView));
+
+            _browser.PluginItem.Returns(browserView);
+            _browser.OptionItems.Returns(btns);
+            _emptyToolbar.Register(_browser);
+            Assert.True(_emptyToolbar.Items.Contains(rawView));
+            Assert.True(_emptyToolbar.Items.Contains(browserView));
+            Assert.True(_emptyToolbar.Items.Contains(btns[0]));
+
+            // clear part
+
+            _emptyToolbar.Clear();
+            Assert.That(_emptyToolbar.Count, Is.EqualTo(0));
+            Assert.False(_emptyToolbar.Items.Contains(rawView));
+            Assert.False(_emptyToolbar.Items.Contains(browserView));
+            Assert.False(_emptyToolbar.Items.Contains(btns[0]));
+            
+            return;
+        }
+
+        [Test]
+        public void PluginItem_Click_Raises_SelectedRenderedChanged()
+        {
+            ErrorToolbar toolbar = new ErrorToolbar();
+            StackTraceDisplay raw = new StackTraceDisplay();
+            SourceCodeDisplay code = new SourceCodeDisplay();
+
+            toolbar.Register(raw);
+            toolbar.Register(code);
+
+            raw.PluginItem.PerformClick();
+            Assert.NotNull(toolbar.SelectedDisplay);
+            Assert.That(toolbar.SelectedDisplay, Is.EqualTo(raw));
+
+            code.PluginItem.PerformClick();
+            Assert.NotNull(toolbar.SelectedDisplay);
+            Assert.That(toolbar.SelectedDisplay, Is.EqualTo(code));
+
+            return;
+        }
+
+        [Test]
+        public void Set_Or_Unset_Check_Flag_On_Selection()
+        {
+            ErrorToolbar toolbar = new ErrorToolbar();
+            StackTraceDisplay raw = new StackTraceDisplay();
+            SourceCodeDisplay code = new SourceCodeDisplay();
+
+            toolbar.Register(raw);
+            toolbar.Register(code);
+
+            toolbar.SelectedDisplay = raw;
+            Assert.True(((ToolStripButton)raw.PluginItem).Checked);
+            Assert.False(((ToolStripButton)code.PluginItem).Checked);
+
+            toolbar.SelectedDisplay = code;
+            Assert.False(((ToolStripButton)raw.PluginItem).Checked);
+            Assert.True(((ToolStripButton)code.PluginItem).Checked);
+
+            toolbar.SelectedDisplay = null;
+            Assert.False(((ToolStripButton)raw.PluginItem).Checked);
+            Assert.False(((ToolStripButton)code.PluginItem).Checked);
+
+            return;
+        }        
+    }
+}
 #endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs b/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
index 75af05b..d1131be 100644
--- a/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
+++ b/src/GuiException/tests/Controls/TestSourceCodeDisplay.cs
@@ -1,185 +1,185 @@
-// ****************************************************************
-// 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 NSubstitute;
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using System.Windows.Forms;
-using NUnit.UiException.CodeFormatters;
-using NUnit.UiException.Tests.data;
-using System.Drawing;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-    public class TestSourceCodeDisplay
-    {
-        private TestingCode _code;
-        private IStackTraceView _mockStack;
-        private ICodeView _mockCode;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _mockStack = Substitute.For<IStackTraceView>();
-            _mockCode = Substitute.For<ICodeView>();
-
-            _code = new TestingCode(_mockStack, _mockCode);
-
-            return;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            SourceCodeDisplay code = new SourceCodeDisplay();
-
-            Assert.NotNull(code.PluginItem);
-            Assert.That(code.PluginItem.Text, Is.EqualTo("Display source code context"));
-            Assert.NotNull(code.OptionItems);
-            Assert.That(code.OptionItems.Length, Is.EqualTo(1));
-            Assert.NotNull(code.Content);
-            Assert.That(code.Content, Is.TypeOf(typeof(SplitterBox)));
-
-            SplitterBox splitter = code.Content as SplitterBox;
-            Assert.That(splitter.Controls.Count, Is.EqualTo(2));
-
-            CodeBox codeBox = splitter.Control2 as CodeBox;
-            Assert.NotNull(codeBox);
-            Assert.True(codeBox.ShowCurrentLine);            
-            Assert.That(codeBox.CurrentLineBackColor, Is.EqualTo(Color.Red));
-            Assert.That(codeBox.CurrentLineForeColor, Is.EqualTo(Color.White));
-
-            Assert.True(code.AutoSelectFirstItem);
-            Assert.That(code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
-            Assert.That(code.SplitOrientation, Is.EqualTo(Orientation.Vertical));
-            Assert.That(code.SplitterDistance, Is.EqualTo(0.5f));
-
-            return;
-        }
-
-        [Test]
-        public void SplitOrientation()
-        {
-            _code.SplitOrientation = Orientation.Horizontal;
-            Assert.That(_code.SplitOrientation, Is.EqualTo(Orientation.Horizontal));
-            Assert.That(_code.Splitter.Orientation, Is.EqualTo(Orientation.Horizontal));
-
-            _code.SplitOrientation = Orientation.Vertical;
-            Assert.That(_code.SplitOrientation, Is.EqualTo(Orientation.Vertical));
-            Assert.That(_code.Splitter.Orientation, Is.EqualTo(Orientation.Vertical));
-
-            return;
-        }
-
-        [Test]
-        public void SplitterDistance()
-        {
-            _code.SplitterDistance = 0.1f;
-            Assert.That(_code.Splitter.SplitterDistance, Is.EqualTo(0.1f));
-
-            _code.SplitterDistance = 0.4f;
-            Assert.That(_code.Splitter.SplitterDistance, Is.EqualTo(0.4f));
-
-            return;
-        }
-
-        [Test]
-        public void SelectedItemChanged()
-        {
-            GeneralCodeFormatter formatter = new GeneralCodeFormatter();
-            ErrorItem item;
-
-            // test to pass:
-            //
-            // handle selection changed event when there
-            // is a non null selected item
-
-            using (TestResource resource = new TestResource("Basic.cs"))
-            {
-                item = new ErrorItem(resource.Path, 2);
-                Assert.That(item.ReadFile(), Is.Not.Null);
-
-                _mockStack.SelectedItem.Returns(item);
-                _mockCode.Formatter.Returns(formatter);
-                
-                _code.RaiseSelectedItemChanged();
-
-                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:
-            //
-            // should handle selection changed event even
-            // if selection comes to null
-
-            _mockStack.SelectedItem.Returns((ErrorItem) null); 
-
-            _code.RaiseSelectedItemChanged();
-
-            Assert.That(_mockCode.Text, Is.EqualTo(null));
-
-            return;
-        }
-
-        [Test]
-        public void ListOrderPolicy()
-        {
-            _code.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
-            Assert.That(_mockStack.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
-
-            _mockStack.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
-            Assert.That(_code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
-
-            _mockStack.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
-            _code.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
-
-            return;
-        }
-
-        [Test]
-        public void CanReportFileException()
-        {
-            SourceCodeDisplay sourceDisplay = new SourceCodeDisplay();
-
-            sourceDisplay.AutoSelectFirstItem = true;
-
-            sourceDisplay.OnStackTraceChanged(
-                "à SomeClass.SomeMethod() dans C:\\unknownFolder\\unknownFile.cs:ligne 1");
-
-            SplitterBox splitter = sourceDisplay.Content as SplitterBox;
-            CodeBox box = splitter.Control2 as CodeBox;
-
-            Assert.IsTrue(box.Text.Contains("Cannot open file: 'C:\\unknownFolder\\unknownFile.cs'"));
-            Assert.IsTrue(box.Text.Contains("Error:"));
-
-            return;
-        }
-
-        class TestingCode : SourceCodeDisplay
-        {
-            public TestingCode(IStackTraceView stack, ICodeView code)
-            {
-                _stacktraceView = stack;
-                _codeView = code;
-            }
-
-            public void RaiseSelectedItemChanged()
-            {
-                base.SelectedItemChanged(null, null);
-            }
-
-            public SplitterBox Splitter
-            {
-                get { return (_splitter); }
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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 || NET_4_5
+using NSubstitute;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+using NUnit.UiException.CodeFormatters;
+using NUnit.UiException.Tests.data;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+    public class TestSourceCodeDisplay
+    {
+        private TestingCode _code;
+        private IStackTraceView _mockStack;
+        private ICodeView _mockCode;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _mockStack = Substitute.For<IStackTraceView>();
+            _mockCode = Substitute.For<ICodeView>();
+
+            _code = new TestingCode(_mockStack, _mockCode);
+
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            SourceCodeDisplay code = new SourceCodeDisplay();
+
+            Assert.NotNull(code.PluginItem);
+            Assert.That(code.PluginItem.Text, Is.EqualTo("Display source code context"));
+            Assert.NotNull(code.OptionItems);
+            Assert.That(code.OptionItems.Length, Is.EqualTo(1));
+            Assert.NotNull(code.Content);
+            Assert.That(code.Content, Is.TypeOf(typeof(SplitterBox)));
+
+            SplitterBox splitter = code.Content as SplitterBox;
+            Assert.That(splitter.Controls.Count, Is.EqualTo(2));
+
+            CodeBox codeBox = splitter.Control2 as CodeBox;
+            Assert.NotNull(codeBox);
+            Assert.True(codeBox.ShowCurrentLine);            
+            Assert.That(codeBox.CurrentLineBackColor, Is.EqualTo(Color.Red));
+            Assert.That(codeBox.CurrentLineForeColor, Is.EqualTo(Color.White));
+
+            Assert.True(code.AutoSelectFirstItem);
+            Assert.That(code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.InitialOrder));
+            Assert.That(code.SplitOrientation, Is.EqualTo(Orientation.Vertical));
+            Assert.That(code.SplitterDistance, Is.EqualTo(0.5f));
+
+            return;
+        }
+
+        [Test]
+        public void SplitOrientation()
+        {
+            _code.SplitOrientation = Orientation.Horizontal;
+            Assert.That(_code.SplitOrientation, Is.EqualTo(Orientation.Horizontal));
+            Assert.That(_code.Splitter.Orientation, Is.EqualTo(Orientation.Horizontal));
+
+            _code.SplitOrientation = Orientation.Vertical;
+            Assert.That(_code.SplitOrientation, Is.EqualTo(Orientation.Vertical));
+            Assert.That(_code.Splitter.Orientation, Is.EqualTo(Orientation.Vertical));
+
+            return;
+        }
+
+        [Test]
+        public void SplitterDistance()
+        {
+            _code.SplitterDistance = 0.1f;
+            Assert.That(_code.Splitter.SplitterDistance, Is.EqualTo(0.1f));
+
+            _code.SplitterDistance = 0.4f;
+            Assert.That(_code.Splitter.SplitterDistance, Is.EqualTo(0.4f));
+
+            return;
+        }
+
+        [Test]
+        public void SelectedItemChanged()
+        {
+            GeneralCodeFormatter formatter = new GeneralCodeFormatter();
+            ErrorItem item;
+
+            // test to pass:
+            //
+            // handle selection changed event when there
+            // is a non null selected item
+
+            using (TestResource resource = new TestResource("Basic.cs"))
+            {
+                item = new ErrorItem(resource.Path, 2);
+                Assert.That(item.ReadFile(), Is.Not.Null);
+
+                _mockStack.SelectedItem.Returns(item);
+                _mockCode.Formatter.Returns(formatter);
+                
+                _code.RaiseSelectedItemChanged();
+
+                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:
+            //
+            // should handle selection changed event even
+            // if selection comes to null
+
+            _mockStack.SelectedItem.Returns((ErrorItem) null); 
+
+            _code.RaiseSelectedItemChanged();
+
+            Assert.That(_mockCode.Text, Is.EqualTo(null));
+
+            return;
+        }
+
+        [Test]
+        public void ListOrderPolicy()
+        {
+            _code.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            Assert.That(_mockStack.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
+
+            _mockStack.ListOrderPolicy = ErrorListOrderPolicy.ReverseOrder;
+            Assert.That(_code.ListOrderPolicy, Is.EqualTo(ErrorListOrderPolicy.ReverseOrder));
+
+            _mockStack.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+            _code.ListOrderPolicy = ErrorListOrderPolicy.InitialOrder;
+
+            return;
+        }
+
+        [Test]
+        public void CanReportFileException()
+        {
+            SourceCodeDisplay sourceDisplay = new SourceCodeDisplay();
+
+            sourceDisplay.AutoSelectFirstItem = true;
+
+            sourceDisplay.OnStackTraceChanged(
+                "à SomeClass.SomeMethod() dans C:\\unknownFolder\\unknownFile.cs:ligne 1");
+
+            SplitterBox splitter = sourceDisplay.Content as SplitterBox;
+            CodeBox box = splitter.Control2 as CodeBox;
+
+            Assert.IsTrue(box.Text.Contains("Cannot open file: 'C:\\unknownFolder\\unknownFile.cs'"));
+            Assert.IsTrue(box.Text.Contains("Error:"));
+
+            return;
+        }
+
+        class TestingCode : SourceCodeDisplay
+        {
+            public TestingCode(IStackTraceView stack, ICodeView code)
+            {
+                _stacktraceView = stack;
+                _codeView = code;
+            }
+
+            public void RaiseSelectedItemChanged()
+            {
+                base.SelectedItemChanged(null, null);
+            }
+
+            public SplitterBox Splitter
+            {
+                get { return (_splitter); }
+            }
+        }
+    }
+}
 #endif
\ No newline at end of file
diff --git a/src/GuiException/tests/Controls/TestSplitterBox.cs b/src/GuiException/tests/Controls/TestSplitterBox.cs
index e561e58..2055a71 100644
--- a/src/GuiException/tests/Controls/TestSplitterBox.cs
+++ b/src/GuiException/tests/Controls/TestSplitterBox.cs
@@ -1,414 +1,414 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using System.Windows.Forms;
-using System.Drawing;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture]
-    public class TestSplitterBox
-    {
-        private TestingSplitterBox _vertical;
-        private TestingSplitterBox _horizontal;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _vertical = new TestingSplitterBox();
-
-            _horizontal = new TestingSplitterBox();
-            _horizontal.Orientation = Orientation.Horizontal;
-
-            return;
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.That(_vertical.Orientation, Is.EqualTo(Orientation.Vertical));
-            Assert.That(_vertical.Width, Is.EqualTo(150));
-            Assert.That(_vertical.Height, Is.EqualTo(150));
-
-            Assert.NotNull(_vertical.Control1);
-            Assert.NotNull(_vertical.Control2);
-
-            Assert.That(_vertical.Controls.Count, Is.EqualTo(2));
-            Assert.That(_vertical.Controls[0], Is.SameAs(_vertical.Control1));
-            Assert.That(_vertical.Controls[1], Is.SameAs(_vertical.Control2));
-
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.5f));
-            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0.5f));
-
-            CheckVerticalLayout(_vertical, 0.5f);
-            CheckVerticalRectangles(_vertical);
-
-            CheckHorizontalLayout(_horizontal, 0.5f);
-            CheckHorizontalRectangles(_horizontal);
-
-            return;
-        }
-
-        void CheckVerticalLayout(TestingSplitterBox splitter, float x)
-        {
-            int left = (int)Math.Max(0, x * splitter.Width - SplitterBox.SPLITTER_HALFSIZE);
-            left = Math.Min(left, splitter.Width - SplitterBox.SPLITTER_SIZE);
-
-            Assert.That(splitter.Orientation, Is.EqualTo(Orientation.Vertical));
-            Assert.False(splitter.SplitterRectangle.IsEmpty);
-
-            Assert.That(splitter.SplitterRectangle.Left, Is.EqualTo(left));
-            Assert.That(splitter.SplitterRectangle.Top, Is.EqualTo(0));
-            Assert.That(splitter.SplitterRectangle.Width, Is.EqualTo(SplitterBox.SPLITTER_SIZE));
-            Assert.That(splitter.SplitterRectangle.Height, Is.EqualTo(splitter.Height));
-
-            Assert.That(splitter.Control1.Left, Is.EqualTo(0));
-            Assert.That(splitter.Control1.Top, Is.EqualTo(0));
-            Assert.That(splitter.Control1.Right, Is.EqualTo(splitter.SplitterRectangle.Left));
-            Assert.That(splitter.Control1.Height, Is.EqualTo(splitter.Height));
-
-            Assert.That(splitter.Control2.Left, Is.EqualTo(splitter.SplitterRectangle.Right));
-            Assert.That(splitter.Control2.Top, Is.EqualTo(0));
-            Assert.That(splitter.Control2.Right, Is.EqualTo(splitter.Width));
-            Assert.That(splitter.Control2.Height, Is.EqualTo(splitter.Height));
-
-            return;
-        }
-
-        void CheckHorizontalLayout(TestingSplitterBox splitter, float y)
-        {
-            int top = (int)Math.Max(0, y * splitter.Height - SplitterBox.SPLITTER_HALFSIZE);
-            top = Math.Min(top, splitter.Height - SplitterBox.SPLITTER_SIZE);
-
-            Assert.That(splitter.Orientation, Is.EqualTo(Orientation.Horizontal));
-            Assert.False(splitter.SplitterRectangle.IsEmpty);
-            Assert.That(splitter.SplitterRectangle,
-                Is.EqualTo(new Rectangle(0, top, splitter.Width, SplitterBox.SPLITTER_SIZE)));
-
-            Assert.That(splitter.Control1.Left, Is.EqualTo(0));
-            Assert.That(splitter.Control1.Top, Is.EqualTo(0));
-            Assert.That(splitter.Control1.Right, Is.EqualTo(splitter.Width));
-            Assert.That(splitter.Control1.Height, Is.EqualTo(splitter.SplitterRectangle.Top));
-
-            Assert.That(splitter.Control2.Left, Is.EqualTo(0));
-            Assert.That(splitter.Control2.Top, Is.EqualTo(splitter.SplitterRectangle.Bottom));
-            Assert.That(splitter.Control2.Right, Is.EqualTo(splitter.Width));
-            Assert.That(splitter.Control2.Bottom, Is.EqualTo(splitter.Height));
-
-            return;
-        }
-
-        void CheckVerticalRectangles(TestingSplitterBox splitter)
-        {
-            Assert.False(splitter.Collapse1Rectangle.IsEmpty);
-            Assert.False(splitter.DirectionRectangle.IsEmpty);
-            Assert.False(splitter.Collapse2Rectangle.IsEmpty);
-
-            int y = (splitter.Height - 41) / 2;
-
-            Assert.That(splitter.SplitterRectangle.Left, Is.GreaterThanOrEqualTo(0));
-            Assert.That(splitter.SplitterRectangle.Right, Is.LessThanOrEqualTo(150));
-
-            Assert.That(splitter.Collapse1Rectangle,
-                Is.EqualTo(new Rectangle(splitter.SplitterRectangle.Left, y, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
-
-            Assert.That(splitter.DirectionRectangle,
-                Is.EqualTo(new Rectangle(
-                    splitter.SplitterRectangle.Left,
-                    splitter.Collapse1Rectangle.Bottom + 2, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
-
-            Assert.That(splitter.Collapse2Rectangle,
-                Is.EqualTo(new Rectangle(
-                    splitter.SplitterRectangle.Left,
-                    splitter.DirectionRectangle.Bottom + 2, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
-            
-            return;
-        }
-
-        void CheckHorizontalRectangles(TestingSplitterBox splitter)
-        {
-            Assert.False(splitter.Collapse1Rectangle.IsEmpty);
-            Assert.False(splitter.DirectionRectangle.IsEmpty);
-            Assert.False(splitter.Collapse2Rectangle.IsEmpty);
-
-            int x = (splitter.Width - 41) / 2;
-            int y = splitter.SplitterRectangle.Top;
-
-            Assert.That(splitter.SplitterRectangle.Top, Is.GreaterThanOrEqualTo(0));
-            Assert.That(splitter.SplitterRectangle.Bottom, Is.LessThanOrEqualTo(splitter.Height));
-
-            Assert.That(splitter.Collapse1Rectangle,
-                Is.EqualTo(new Rectangle(x, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
-
-            Assert.That(splitter.DirectionRectangle,
-                Is.EqualTo(new Rectangle(splitter.Collapse1Rectangle.Right + 2, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
-
-            Assert.That(splitter.Collapse2Rectangle,
-                Is.EqualTo(new Rectangle(splitter.DirectionRectangle.Right + 2, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
-
-            return;
-        }
-
-        [Test]
-        public void CanChangeDefaultControl1()
-        {
-            Control control1 = _vertical.Control1;
-            Panel panel = new Panel();
-
-            _vertical.Control1 = panel;
-            Assert.False(_vertical.Controls.Contains(control1));
-            Assert.True(_vertical.Controls.Contains(panel));
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            _vertical.Control1 = null;
-            Assert.True(_vertical.Controls.Contains(control1));
-            Assert.False(_vertical.Controls.Contains(panel));
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            _vertical.Control1 = null;
-            Assert.True(_vertical.Controls.Contains(control1));
-            Assert.False(_vertical.Controls.Contains(panel));
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            return;
-        }
-
-        [Test]
-        public void CanChangeDefaultControl2()
-        {
-            Control control2 = _vertical.Control2;
-            Panel panel = new Panel();
-
-            _vertical.Control2 = panel;
-            Assert.False(_vertical.Controls.Contains(control2));
-            Assert.True(_vertical.Controls.Contains(panel));
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            _vertical.Control2 = null;
-            Assert.True(_vertical.Controls.Contains(control2));
-            Assert.False(_vertical.Controls.Contains(panel));
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            _vertical.Control2 = null;
-            Assert.True(_vertical.Controls.Contains(control2));
-            Assert.False(_vertical.Controls.Contains(panel));
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            return;
-        }
-
-        [Test]
-        public void ChangingSizeInvokeDoLayout()
-        {
-            _vertical.Width = 100;
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            _vertical.Height = 200;
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            return;
-        }
-
-        [Test]
-        public void OrientationAffectsLayout()
-        {
-            _vertical.Orientation = Orientation.Horizontal;
-            CheckHorizontalLayout(_vertical, 0.5f);
-
-            _vertical.Orientation = Orientation.Vertical;
-            CheckVerticalLayout(_vertical, 0.5f);
-
-            return;
-        }
-
-        [Test]
-        public void SplitterDistance()
-        {
-            // vertical layout
-
-            _vertical.SplitterDistance = 0.4f;
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.4f));
-            CheckVerticalLayout(_vertical, 0.4f);
-
-            _vertical.SplitterDistance = -1f;
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0f));
-            CheckVerticalLayout(_vertical, 0f);
-
-            _vertical.SplitterDistance = 2f;
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(1f));
-            CheckVerticalLayout(_vertical, 1f);
-
-            // horizontal layout
-
-            _horizontal.SplitterDistance = 0.4f;
-            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0.4f));
-            CheckHorizontalLayout(_horizontal, 0.4f);
-
-            _horizontal.SplitterDistance = -1;
-            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0f));
-            CheckHorizontalLayout(_horizontal, 0);
-
-            _horizontal.SplitterDistance = 2f;
-            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(1f));
-            CheckHorizontalLayout(_horizontal, 1);
-
-            return;
-        }
-
-        [Test]
-        public void PointToSplit()
-        {
-            // vertical layout
-
-            _vertical.PointToSplit((int)(_vertical.Width * 0.4f), 0);
-            CheckVerticalLayout(_vertical, 0.4f);            
-
-            _vertical.PointToSplit(-1, 0);
-            CheckVerticalLayout(_vertical, 0f);
-
-            _vertical.PointToSplit(_vertical.Width * 2, 0);
-            CheckVerticalLayout(_vertical, 1f);
-
-            // horizontal layout
-
-            _horizontal.PointToSplit(0, (int)(_horizontal.Height * 0.4f));
-            CheckHorizontalLayout(_horizontal, 0.4f);
-
-            _horizontal.PointToSplit(0, -1);
-            CheckHorizontalLayout(_horizontal, 0);
-
-            _horizontal.PointToSplit(0, _horizontal.Height * 2);
-            CheckHorizontalLayout(_horizontal, 1);
-
-            return;
-        }
-
-        [Test]
-        public void CollapseControl()
-        {
-            // test with vertical layout
-
-            _vertical.CollapseControl1();
-            CheckVerticalRectangles(_vertical);
-            CheckVerticalLayout(_vertical, 0);
-            
-            _vertical.CollapseControl2();
-            CheckVerticalRectangles(_vertical);
-            CheckVerticalLayout(_vertical, 1);
-
-            // test with horizontal layout
-
-            _horizontal.CollapseControl1();
-            CheckHorizontalRectangles(_horizontal);
-            CheckHorizontalLayout(_horizontal, 0);
-
-            _horizontal.CollapseControl2();
-            CheckHorizontalRectangles(_horizontal);
-            CheckHorizontalLayout(_horizontal, 1);
-
-            return;
-        }
-
-        [Test]
-        public void MouseActions()
-        {
-            // test 1: check ability to move splitter
-
-            _vertical = new TestingSplitterBox();
-            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
-            _vertical.FireMouseMove(0, 1);
-            _vertical.FireMouseUp(0, 1);
-
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
-
-            // test 2: splitter doesn't move when mouse down occurs while
-            //         the mouse is hovering Collapse1Rectangle
-
-            _vertical = new TestingSplitterBox();
-            _vertical.FireMouseDown(
-                _vertical.Collapse1Rectangle.Left + 1,
-                _vertical.Collapse1Rectangle.Top + 1);
-            _vertical.FireMouseMove(0, 1);
-            _vertical.FireMouseUp(0, 1);
-
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.5f));            
-
-            // test 3: mouse down occurs on SplitterRectangle area (except the buttons)
-            //         mouse up occurs on Collapse1Rectangle
-            //         CollapseControl1() should not be triggered and splitter
-            //         should be at the last notified mouse position
-
-            _vertical = new TestingSplitterBox();
-            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
-            _vertical.FireMouseMove(150, 0);
-            _vertical.FireMouseUp(_vertical.Collapse1Rectangle.Left + 1,
-                _vertical.Collapse1Rectangle.Top + 1);
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(1));
-         
-            // test 4: mouse down occurs on SplitterRectangle
-            //         mouse up occurs on Collapse2Rectangle
-            //         CollapseControl2 shouldn't be triggered and splitter
-            //         should be at the last notified mouse position
-
-            _vertical = new TestingSplitterBox();
-            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
-            _vertical.FireMouseMove(0, 0);
-            _vertical.FireMouseUp(_vertical.Collapse2Rectangle.Left + 1,
-                _vertical.Collapse2Rectangle.Top + 1);
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
-
-            // test 5: mouse down occurs on SplitterRectangle
-            //         mouse up occurs on DirectionRectangle
-            //         Orientation shouldn't be triggered and splitter
-            //         should be at the last notified mouse position
-
-            _vertical = new TestingSplitterBox();
-            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
-            _vertical.FireMouseMove(0, 0);
-            _vertical.FireMouseUp(_vertical.DirectionRectangle.Left + 1,
-                _vertical.DirectionRectangle.Top + 1);
-            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
-            Assert.That(_vertical.Orientation, Is.EqualTo(Orientation.Vertical));
-
-            return;
-        }
-
-        class TestingSplitterBox : SplitterBox
-        {
-            public new Rectangle Collapse1Rectangle
-            {
-                get { return (base.Collapse1Rectangle); }
-            }
-
-            public new Rectangle Collapse2Rectangle
-            {
-                get { return (base.Collapse2Rectangle); }
-            }
-
-            public new Rectangle DirectionRectangle
-            {
-                get { return (base.DirectionRectangle); }
-            }
-
-            public void FireMouseDown(int x, int y)
-            {
-                OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
-            }
-
-            public void FireMouseMove(int x, int y)
-            {
-                OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, x, y, 0));
-            }
-
-            public void FireMouseUp(int x, int y)
-            {
-                OnMouseUp(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+using System.Drawing;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestSplitterBox
+    {
+        private TestingSplitterBox _vertical;
+        private TestingSplitterBox _horizontal;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _vertical = new TestingSplitterBox();
+
+            _horizontal = new TestingSplitterBox();
+            _horizontal.Orientation = Orientation.Horizontal;
+
+            return;
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.That(_vertical.Orientation, Is.EqualTo(Orientation.Vertical));
+            Assert.That(_vertical.Width, Is.EqualTo(150));
+            Assert.That(_vertical.Height, Is.EqualTo(150));
+
+            Assert.NotNull(_vertical.Control1);
+            Assert.NotNull(_vertical.Control2);
+
+            Assert.That(_vertical.Controls.Count, Is.EqualTo(2));
+            Assert.That(_vertical.Controls[0], Is.SameAs(_vertical.Control1));
+            Assert.That(_vertical.Controls[1], Is.SameAs(_vertical.Control2));
+
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.5f));
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0.5f));
+
+            CheckVerticalLayout(_vertical, 0.5f);
+            CheckVerticalRectangles(_vertical);
+
+            CheckHorizontalLayout(_horizontal, 0.5f);
+            CheckHorizontalRectangles(_horizontal);
+
+            return;
+        }
+
+        void CheckVerticalLayout(TestingSplitterBox splitter, float x)
+        {
+            int left = (int)Math.Max(0, x * splitter.Width - SplitterBox.SPLITTER_HALFSIZE);
+            left = Math.Min(left, splitter.Width - SplitterBox.SPLITTER_SIZE);
+
+            Assert.That(splitter.Orientation, Is.EqualTo(Orientation.Vertical));
+            Assert.False(splitter.SplitterRectangle.IsEmpty);
+
+            Assert.That(splitter.SplitterRectangle.Left, Is.EqualTo(left));
+            Assert.That(splitter.SplitterRectangle.Top, Is.EqualTo(0));
+            Assert.That(splitter.SplitterRectangle.Width, Is.EqualTo(SplitterBox.SPLITTER_SIZE));
+            Assert.That(splitter.SplitterRectangle.Height, Is.EqualTo(splitter.Height));
+
+            Assert.That(splitter.Control1.Left, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Top, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Right, Is.EqualTo(splitter.SplitterRectangle.Left));
+            Assert.That(splitter.Control1.Height, Is.EqualTo(splitter.Height));
+
+            Assert.That(splitter.Control2.Left, Is.EqualTo(splitter.SplitterRectangle.Right));
+            Assert.That(splitter.Control2.Top, Is.EqualTo(0));
+            Assert.That(splitter.Control2.Right, Is.EqualTo(splitter.Width));
+            Assert.That(splitter.Control2.Height, Is.EqualTo(splitter.Height));
+
+            return;
+        }
+
+        void CheckHorizontalLayout(TestingSplitterBox splitter, float y)
+        {
+            int top = (int)Math.Max(0, y * splitter.Height - SplitterBox.SPLITTER_HALFSIZE);
+            top = Math.Min(top, splitter.Height - SplitterBox.SPLITTER_SIZE);
+
+            Assert.That(splitter.Orientation, Is.EqualTo(Orientation.Horizontal));
+            Assert.False(splitter.SplitterRectangle.IsEmpty);
+            Assert.That(splitter.SplitterRectangle,
+                Is.EqualTo(new Rectangle(0, top, splitter.Width, SplitterBox.SPLITTER_SIZE)));
+
+            Assert.That(splitter.Control1.Left, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Top, Is.EqualTo(0));
+            Assert.That(splitter.Control1.Right, Is.EqualTo(splitter.Width));
+            Assert.That(splitter.Control1.Height, Is.EqualTo(splitter.SplitterRectangle.Top));
+
+            Assert.That(splitter.Control2.Left, Is.EqualTo(0));
+            Assert.That(splitter.Control2.Top, Is.EqualTo(splitter.SplitterRectangle.Bottom));
+            Assert.That(splitter.Control2.Right, Is.EqualTo(splitter.Width));
+            Assert.That(splitter.Control2.Bottom, Is.EqualTo(splitter.Height));
+
+            return;
+        }
+
+        void CheckVerticalRectangles(TestingSplitterBox splitter)
+        {
+            Assert.False(splitter.Collapse1Rectangle.IsEmpty);
+            Assert.False(splitter.DirectionRectangle.IsEmpty);
+            Assert.False(splitter.Collapse2Rectangle.IsEmpty);
+
+            int y = (splitter.Height - 41) / 2;
+
+            Assert.That(splitter.SplitterRectangle.Left, Is.GreaterThanOrEqualTo(0));
+            Assert.That(splitter.SplitterRectangle.Right, Is.LessThanOrEqualTo(150));
+
+            Assert.That(splitter.Collapse1Rectangle,
+                Is.EqualTo(new Rectangle(splitter.SplitterRectangle.Left, y, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
+
+            Assert.That(splitter.DirectionRectangle,
+                Is.EqualTo(new Rectangle(
+                    splitter.SplitterRectangle.Left,
+                    splitter.Collapse1Rectangle.Bottom + 2, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
+
+            Assert.That(splitter.Collapse2Rectangle,
+                Is.EqualTo(new Rectangle(
+                    splitter.SplitterRectangle.Left,
+                    splitter.DirectionRectangle.Bottom + 2, SplitterBox.SPLITTER_SIZE, SplitterBox.BUTTON_SIZE)));
+            
+            return;
+        }
+
+        void CheckHorizontalRectangles(TestingSplitterBox splitter)
+        {
+            Assert.False(splitter.Collapse1Rectangle.IsEmpty);
+            Assert.False(splitter.DirectionRectangle.IsEmpty);
+            Assert.False(splitter.Collapse2Rectangle.IsEmpty);
+
+            int x = (splitter.Width - 41) / 2;
+            int y = splitter.SplitterRectangle.Top;
+
+            Assert.That(splitter.SplitterRectangle.Top, Is.GreaterThanOrEqualTo(0));
+            Assert.That(splitter.SplitterRectangle.Bottom, Is.LessThanOrEqualTo(splitter.Height));
+
+            Assert.That(splitter.Collapse1Rectangle,
+                Is.EqualTo(new Rectangle(x, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
+
+            Assert.That(splitter.DirectionRectangle,
+                Is.EqualTo(new Rectangle(splitter.Collapse1Rectangle.Right + 2, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
+
+            Assert.That(splitter.Collapse2Rectangle,
+                Is.EqualTo(new Rectangle(splitter.DirectionRectangle.Right + 2, y, SplitterBox.BUTTON_SIZE, SplitterBox.SPLITTER_SIZE)));
+
+            return;
+        }
+
+        [Test]
+        public void CanChangeDefaultControl1()
+        {
+            Control control1 = _vertical.Control1;
+            Panel panel = new Panel();
+
+            _vertical.Control1 = panel;
+            Assert.False(_vertical.Controls.Contains(control1));
+            Assert.True(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control1 = null;
+            Assert.True(_vertical.Controls.Contains(control1));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control1 = null;
+            Assert.True(_vertical.Controls.Contains(control1));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void CanChangeDefaultControl2()
+        {
+            Control control2 = _vertical.Control2;
+            Panel panel = new Panel();
+
+            _vertical.Control2 = panel;
+            Assert.False(_vertical.Controls.Contains(control2));
+            Assert.True(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control2 = null;
+            Assert.True(_vertical.Controls.Contains(control2));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Control2 = null;
+            Assert.True(_vertical.Controls.Contains(control2));
+            Assert.False(_vertical.Controls.Contains(panel));
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void ChangingSizeInvokeDoLayout()
+        {
+            _vertical.Width = 100;
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            _vertical.Height = 200;
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void OrientationAffectsLayout()
+        {
+            _vertical.Orientation = Orientation.Horizontal;
+            CheckHorizontalLayout(_vertical, 0.5f);
+
+            _vertical.Orientation = Orientation.Vertical;
+            CheckVerticalLayout(_vertical, 0.5f);
+
+            return;
+        }
+
+        [Test]
+        public void SplitterDistance()
+        {
+            // vertical layout
+
+            _vertical.SplitterDistance = 0.4f;
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.4f));
+            CheckVerticalLayout(_vertical, 0.4f);
+
+            _vertical.SplitterDistance = -1f;
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0f));
+            CheckVerticalLayout(_vertical, 0f);
+
+            _vertical.SplitterDistance = 2f;
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(1f));
+            CheckVerticalLayout(_vertical, 1f);
+
+            // horizontal layout
+
+            _horizontal.SplitterDistance = 0.4f;
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0.4f));
+            CheckHorizontalLayout(_horizontal, 0.4f);
+
+            _horizontal.SplitterDistance = -1;
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(0f));
+            CheckHorizontalLayout(_horizontal, 0);
+
+            _horizontal.SplitterDistance = 2f;
+            Assert.That(_horizontal.SplitterDistance, Is.EqualTo(1f));
+            CheckHorizontalLayout(_horizontal, 1);
+
+            return;
+        }
+
+        [Test]
+        public void PointToSplit()
+        {
+            // vertical layout
+
+            _vertical.PointToSplit((int)(_vertical.Width * 0.4f), 0);
+            CheckVerticalLayout(_vertical, 0.4f);            
+
+            _vertical.PointToSplit(-1, 0);
+            CheckVerticalLayout(_vertical, 0f);
+
+            _vertical.PointToSplit(_vertical.Width * 2, 0);
+            CheckVerticalLayout(_vertical, 1f);
+
+            // horizontal layout
+
+            _horizontal.PointToSplit(0, (int)(_horizontal.Height * 0.4f));
+            CheckHorizontalLayout(_horizontal, 0.4f);
+
+            _horizontal.PointToSplit(0, -1);
+            CheckHorizontalLayout(_horizontal, 0);
+
+            _horizontal.PointToSplit(0, _horizontal.Height * 2);
+            CheckHorizontalLayout(_horizontal, 1);
+
+            return;
+        }
+
+        [Test]
+        public void CollapseControl()
+        {
+            // test with vertical layout
+
+            _vertical.CollapseControl1();
+            CheckVerticalRectangles(_vertical);
+            CheckVerticalLayout(_vertical, 0);
+            
+            _vertical.CollapseControl2();
+            CheckVerticalRectangles(_vertical);
+            CheckVerticalLayout(_vertical, 1);
+
+            // test with horizontal layout
+
+            _horizontal.CollapseControl1();
+            CheckHorizontalRectangles(_horizontal);
+            CheckHorizontalLayout(_horizontal, 0);
+
+            _horizontal.CollapseControl2();
+            CheckHorizontalRectangles(_horizontal);
+            CheckHorizontalLayout(_horizontal, 1);
+
+            return;
+        }
+
+        [Test]
+        public void MouseActions()
+        {
+            // test 1: check ability to move splitter
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(0, 1);
+            _vertical.FireMouseUp(0, 1);
+
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
+
+            // test 2: splitter doesn't move when mouse down occurs while
+            //         the mouse is hovering Collapse1Rectangle
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(
+                _vertical.Collapse1Rectangle.Left + 1,
+                _vertical.Collapse1Rectangle.Top + 1);
+            _vertical.FireMouseMove(0, 1);
+            _vertical.FireMouseUp(0, 1);
+
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0.5f));            
+
+            // test 3: mouse down occurs on SplitterRectangle area (except the buttons)
+            //         mouse up occurs on Collapse1Rectangle
+            //         CollapseControl1() should not be triggered and splitter
+            //         should be at the last notified mouse position
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(150, 0);
+            _vertical.FireMouseUp(_vertical.Collapse1Rectangle.Left + 1,
+                _vertical.Collapse1Rectangle.Top + 1);
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(1));
+         
+            // test 4: mouse down occurs on SplitterRectangle
+            //         mouse up occurs on Collapse2Rectangle
+            //         CollapseControl2 shouldn't be triggered and splitter
+            //         should be at the last notified mouse position
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(0, 0);
+            _vertical.FireMouseUp(_vertical.Collapse2Rectangle.Left + 1,
+                _vertical.Collapse2Rectangle.Top + 1);
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
+
+            // test 5: mouse down occurs on SplitterRectangle
+            //         mouse up occurs on DirectionRectangle
+            //         Orientation shouldn't be triggered and splitter
+            //         should be at the last notified mouse position
+
+            _vertical = new TestingSplitterBox();
+            _vertical.FireMouseDown(_vertical.SplitterRectangle.Left + 1, 1);
+            _vertical.FireMouseMove(0, 0);
+            _vertical.FireMouseUp(_vertical.DirectionRectangle.Left + 1,
+                _vertical.DirectionRectangle.Top + 1);
+            Assert.That(_vertical.SplitterDistance, Is.EqualTo(0));
+            Assert.That(_vertical.Orientation, Is.EqualTo(Orientation.Vertical));
+
+            return;
+        }
+
+        class TestingSplitterBox : SplitterBox
+        {
+            public new Rectangle Collapse1Rectangle
+            {
+                get { return (base.Collapse1Rectangle); }
+            }
+
+            public new Rectangle Collapse2Rectangle
+            {
+                get { return (base.Collapse2Rectangle); }
+            }
+
+            public new Rectangle DirectionRectangle
+            {
+                get { return (base.DirectionRectangle); }
+            }
+
+            public void FireMouseDown(int x, int y)
+            {
+                OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
+            }
+
+            public void FireMouseMove(int x, int y)
+            {
+                OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, x, y, 0));
+            }
+
+            public void FireMouseUp(int x, int y)
+            {
+                OnMouseUp(new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
+            }
+        }
+    }
+}
diff --git a/src/GuiException/tests/Controls/TestStackTraceDisplay.cs b/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
index 82e1d19..1212b3a 100644
--- a/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
+++ b/src/GuiException/tests/Controls/TestStackTraceDisplay.cs
@@ -1,115 +1,115 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.Controls;
-using System.Windows.Forms;
-
-namespace NUnit.UiException.Tests.Controls
-{
-    [TestFixture]
-    public class TestStackTraceDisplay
-    {
-        private StackTraceDisplay _traceDisplay;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _traceDisplay = new StackTraceDisplay();
-        }
-
-        [Test]
-        public void DefaultState()
-        {
-            Assert.NotNull(_traceDisplay.PluginItem);
-            Assert.That(_traceDisplay.PluginItem.Text, Is.EqualTo("Display actual stack trace"));
-            Assert.NotNull(_traceDisplay.OptionItems);
-            Assert.That(_traceDisplay.OptionItems.Length, Is.EqualTo(1));
-            Assert.That(_traceDisplay.OptionItems[0].Text, Is.EqualTo("Copy stack trace to clipboard"));
-
-            Assert.That(_traceDisplay.Content, Is.Not.Null);
-            Assert.That(_traceDisplay.Content, Is.TypeOf(typeof(TextBox)));
-            TextBox text = _traceDisplay.Content as TextBox;            
-            Assert.That(text.Text, Is.EqualTo(""));
-            Assert.That(text.ReadOnly, Is.True);
-            Assert.That(text.Multiline, Is.True);
-
-            return;
-        }
-
-        [Test]
-        public void OnStackTraceChanged()
-        {
-            string trace_1 = 
-                    "à System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)\r\n" +
-                    "à System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)\r\n" +
-                    "à System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)\r\n" +
-                    "à NUnit.UiException.Tests.MockHelper.Two_Mocks_In_Dictionary() dans C:\\folder\\file1.cs:ligne 87\r\n";
-
-            string trace_2 = "";
-            TextBox content = _traceDisplay.Content as TextBox;
-
-            _traceDisplay.OnStackTraceChanged(trace_1);
-            Assert.That(content.Text, Is.EqualTo(trace_1));
-
-            _traceDisplay.OnStackTraceChanged(trace_2);
-            Assert.That(content.Text, Is.EqualTo(trace_2));
-
-            // passing null should not cause error
-
-            _traceDisplay.OnStackTraceChanged(null);
-            Assert.That(content.Text, Is.EqualTo(""));
-
-            return;
-        }
-
-        [Test]
-        [STAThread]
-        public void CopyToClipBoard()
-        {
-            Clipboard.Clear();
-
-            _traceDisplay.OnStackTraceChanged("hi, there!");
-            _traceDisplay.CopyToClipBoard();
-
-            Assert.That(Clipboard.ContainsText(), Is.True);
-            Assert.That(Clipboard.GetText(), Is.EqualTo("hi, there!"));
-
-            // calling twice doesn't add twice same content
-
-            _traceDisplay.CopyToClipBoard();
-            _traceDisplay.CopyToClipBoard();
-            Assert.That(Clipboard.GetText(), Is.EqualTo("hi, there!"));
-
-            // test to fail: calling copy to clipboard
-            // with an empty stack trace is valid
-
-            _traceDisplay.OnStackTraceChanged("");
-            _traceDisplay.CopyToClipBoard();
-            Assert.That(Clipboard.GetText(), Is.EqualTo(""));
-
-            return;
-        }
-
-        [Test]
-        public void FeedingDisplayWithGarbageDoesNotMakeItCrash()
-        {
-            _traceDisplay.OnStackTraceChanged(
-                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
-                "Nam at nisi ut neque sollicitudin ultrices. Sed rhoncus\r\n" +
-                "rhoncus arcu. Morbi eu elit ut augue congue luctus. Nullam\r\n" +
-                "eu eros. Nunc blandit varius orci. Mauris condimentum diam\r\n" +
-                "ac ligula. Nullam ut metus. Maecenas sagittis nibh in nisl.\r\n" +
-                "Phasellus rhoncus diam a nulla. Integer vestibulum.\r\n");
-
-            TextBox text = _traceDisplay.Content as TextBox;
-            Assert.That(text.Text, Is.Not.Null);
-
-            return;
-        }
-
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.Controls;
+using System.Windows.Forms;
+
+namespace NUnit.UiException.Tests.Controls
+{
+    [TestFixture]
+    public class TestStackTraceDisplay
+    {
+        private StackTraceDisplay _traceDisplay;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _traceDisplay = new StackTraceDisplay();
+        }
+
+        [Test]
+        public void DefaultState()
+        {
+            Assert.NotNull(_traceDisplay.PluginItem);
+            Assert.That(_traceDisplay.PluginItem.Text, Is.EqualTo("Display actual stack trace"));
+            Assert.NotNull(_traceDisplay.OptionItems);
+            Assert.That(_traceDisplay.OptionItems.Length, Is.EqualTo(1));
+            Assert.That(_traceDisplay.OptionItems[0].Text, Is.EqualTo("Copy stack trace to clipboard"));
+
+            Assert.That(_traceDisplay.Content, Is.Not.Null);
+            Assert.That(_traceDisplay.Content, Is.TypeOf(typeof(TextBox)));
+            TextBox text = _traceDisplay.Content as TextBox;            
+            Assert.That(text.Text, Is.EqualTo(""));
+            Assert.That(text.ReadOnly, Is.True);
+            Assert.That(text.Multiline, Is.True);
+
+            return;
+        }
+
+        [Test]
+        public void OnStackTraceChanged()
+        {
+            string trace_1 = 
+                    "à System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)\r\n" +
+                    "à System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)\r\n" +
+                    "à System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)\r\n" +
+                    "à NUnit.UiException.Tests.MockHelper.Two_Mocks_In_Dictionary() dans C:\\folder\\file1.cs:ligne 87\r\n";
+
+            string trace_2 = "";
+            TextBox content = _traceDisplay.Content as TextBox;
+
+            _traceDisplay.OnStackTraceChanged(trace_1);
+            Assert.That(content.Text, Is.EqualTo(trace_1));
+
+            _traceDisplay.OnStackTraceChanged(trace_2);
+            Assert.That(content.Text, Is.EqualTo(trace_2));
+
+            // passing null should not cause error
+
+            _traceDisplay.OnStackTraceChanged(null);
+            Assert.That(content.Text, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        [STAThread]
+        public void CopyToClipBoard()
+        {
+            Clipboard.Clear();
+
+            _traceDisplay.OnStackTraceChanged("hi, there!");
+            _traceDisplay.CopyToClipBoard();
+
+            Assert.That(Clipboard.ContainsText(), Is.True);
+            Assert.That(Clipboard.GetText(), Is.EqualTo("hi, there!"));
+
+            // calling twice doesn't add twice same content
+
+            _traceDisplay.CopyToClipBoard();
+            _traceDisplay.CopyToClipBoard();
+            Assert.That(Clipboard.GetText(), Is.EqualTo("hi, there!"));
+
+            // test to fail: calling copy to clipboard
+            // with an empty stack trace is valid
+
+            _traceDisplay.OnStackTraceChanged("");
+            _traceDisplay.CopyToClipBoard();
+            Assert.That(Clipboard.GetText(), Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        public void FeedingDisplayWithGarbageDoesNotMakeItCrash()
+        {
+            _traceDisplay.OnStackTraceChanged(
+                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n" +
+                "Nam at nisi ut neque sollicitudin ultrices. Sed rhoncus\r\n" +
+                "rhoncus arcu. Morbi eu elit ut augue congue luctus. Nullam\r\n" +
+                "eu eros. Nunc blandit varius orci. Mauris condimentum diam\r\n" +
+                "ac ligula. Nullam ut metus. Maecenas sagittis nibh in nisl.\r\n" +
+                "Phasellus rhoncus diam a nulla. Integer vestibulum.\r\n");
+
+            TextBox text = _traceDisplay.Content as TextBox;
+            Assert.That(text.Text, Is.Not.Null);
+
+            return;
+        }
+
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
index 051be6a..f036ef6 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestFunctionParser.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.StackTraceAnalyzers;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException.Tests.StackTraceAnalyzers
-{
-    [TestFixture]
-    public class TestFunctionParser :
-        TestIErrorParser
-    {
-        private IErrorParser _parser;
-
-        [SetUp]
-        public new void SetUp()
-        {
-            _parser = new FunctionParser();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Parse_Regular_Function_Values()
-        {
-            RawError res;
-
-            // check parse of basic method
-            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
-            Assert.That(res.Function, Is.EqualTo("NUnit.UiException.TraceItem.get_Text()"));
-
-            // check parse a method with parameters
-            res = AcceptValue(_parser, "à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)");
-            Assert.That(res.Function, Is.EqualTo("System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)"));
-
-            // check it supports C/C++ function as well
-            res = AcceptValue(_parser, "à main(int argc, const char **argv) dans C:\\file1:line1");
-            Assert.That(res.Function, Is.EqualTo("main(int argc, const char **argv)"));
-
-            // check it doesn't rely upon filePath or line information
-            //res = AcceptValue(_parser, "get_Text()");
-            //Assert.That(res.Function, Is.EqualTo("get_Text()"));
-
-            // a simple function name is not accepted - that is, the leading "at" is required
-            // TODO: try to restore older behavior while still allowing a space before the
-            // opening parenthesis.
-            RejectValue(_parser, "get_Text()");
-
-            return;            
-        }
-
-        [Test]
-        public void Test_Ability_To_Parse_Mono_Stack_Trace()
-        {
-            RawError res;
-
-            // mono adds a space after the name
-            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text () dans C:\\TraceItem.cs:ligne 43");
-            Assert.That(res.Function, Is.EqualTo("NUnit.UiException.TraceItem.get_Text ()"));
-        }
-
-        [Test]
-        public void Test_Fail_To_Parse_Odd_Function_Values()
-        {
-            // check parse relies on '(' and ')'
-            RejectValue(_parser, "à get_Text dans C:\\file1:line1");
-            RejectValue(_parser, "à get_Text( dans C:\\file1:line1");
-            RejectValue(_parser, "à get_Text) dans C:\\file1:line1");
-            RejectValue(_parser, "à get_Text)( dans C:\\file1:line1");
-
-            // check function name cannot be empty
-            RejectValue(_parser, "à (int index) dans C:\\file1:line1");
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestFunctionParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new FunctionParser();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Function_Values()
+        {
+            RawError res;
+
+            // check parse of basic method
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
+            Assert.That(res.Function, Is.EqualTo("NUnit.UiException.TraceItem.get_Text()"));
+
+            // check parse a method with parameters
+            res = AcceptValue(_parser, "à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)");
+            Assert.That(res.Function, Is.EqualTo("System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)"));
+
+            // check it supports C/C++ function as well
+            res = AcceptValue(_parser, "à main(int argc, const char **argv) dans C:\\file1:line1");
+            Assert.That(res.Function, Is.EqualTo("main(int argc, const char **argv)"));
+
+            // check it doesn't rely upon filePath or line information
+            //res = AcceptValue(_parser, "get_Text()");
+            //Assert.That(res.Function, Is.EqualTo("get_Text()"));
+
+            // a simple function name is not accepted - that is, the leading "at" is required
+            // TODO: try to restore older behavior while still allowing a space before the
+            // opening parenthesis.
+            RejectValue(_parser, "get_Text()");
+
+            return;            
+        }
+
+        [Test]
+        public void Test_Ability_To_Parse_Mono_Stack_Trace()
+        {
+            RawError res;
+
+            // mono adds a space after the name
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text () dans C:\\TraceItem.cs:ligne 43");
+            Assert.That(res.Function, Is.EqualTo("NUnit.UiException.TraceItem.get_Text ()"));
+        }
+
+        [Test]
+        public void Test_Fail_To_Parse_Odd_Function_Values()
+        {
+            // check parse relies on '(' and ')'
+            RejectValue(_parser, "à get_Text dans C:\\file1:line1");
+            RejectValue(_parser, "à get_Text( dans C:\\file1:line1");
+            RejectValue(_parser, "à get_Text) dans C:\\file1:line1");
+            RejectValue(_parser, "à get_Text)( dans C:\\file1:line1");
+
+            // check function name cannot be empty
+            RejectValue(_parser, "à (int index) dans C:\\file1:line1");
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
index 8a60802..b194808 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestIErrorParser.cs
@@ -1,110 +1,110 @@
-// ****************************************************************
-// 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.UiException.StackTraceAnalyzers;
-using NUnit.Framework;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException.Tests.StackTraceAnalyzers
-{
-    [TestFixture]
-    public class TestIErrorParser
-    {
-        protected StackTraceParser _stack;
-        protected IErrorParser[] _array;
-
-        public TestIErrorParser()
-        {
-            _stack = new StackTraceParser();
-
-            return;
-        }
-
-        [SetUp]
-        public void SetUp()
-        {
-            PathCompositeParser pathParser;
-
-            pathParser = new PathCompositeParser();
-
-            _array = new IErrorParser[]  {
-                pathParser.UnixPathParser,
-                pathParser.WindowsPathParser,
-                new FunctionParser(),
-                new PathCompositeParser(),
-                new LineNumberParser()
-            };
-
-            return;
-        }
-
-        [Test]
-        public void Test_IErrorParser_Can_Throw_ParserNullException()
-        {
-            bool hasRaisedException;
-
-            foreach (IErrorParser item in _array)
-            {
-                hasRaisedException = false;
-
-                try {
-                    item.TryParse(null, new RawError("test")); // throws exception
-                }
-                catch (Exception e)
-                {
-                    Assert.That(e.Message.Contains("parser"), Is.True);
-                    hasRaisedException = true;
-                }
-
-                Assert.That(hasRaisedException, Is.True,
-                    item.ToString() + " failed to raise exception");
-            }
-
-            return;
-        }
-
-        [Test]
-        public void Test_IErrorParser_Can_Throw_ArgsNullException()
-        {
-            bool hasRaisedException;
-
-            foreach (IErrorParser item in _array)
-            {
-                hasRaisedException = false;
-
-                try
-                {
-                    item.TryParse(_stack, null); // throws exception
-                }
-                catch (Exception e)
-                {
-                    Assert.That(e.Message.Contains("args"), Is.True);
-                    hasRaisedException = true;
-                }
-
-                Assert.That(hasRaisedException, Is.True,
-                    item.ToString() + " failed to raise exception");
-            }
-
-            return;
-        }
-
-        public RawError AcceptValue(IErrorParser parser, string error)
-        {
-            RawError res;
-
-            res = new RawError(error);
-            Assert.That(parser.TryParse(_stack, res), Is.True, "Failed to parse \"{0}\"", error);
-
-            return (res);
-        }
-
-        public void RejectValue(IErrorParser parser, string error)
-        {
-            Assert.That(parser.TryParse(_stack, new RawError(error)), Is.False);
-        }
-    }
-}
+// ****************************************************************
+// 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.UiException.StackTraceAnalyzers;
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestIErrorParser
+    {
+        protected StackTraceParser _stack;
+        protected IErrorParser[] _array;
+
+        public TestIErrorParser()
+        {
+            _stack = new StackTraceParser();
+
+            return;
+        }
+
+        [SetUp]
+        public void SetUp()
+        {
+            PathCompositeParser pathParser;
+
+            pathParser = new PathCompositeParser();
+
+            _array = new IErrorParser[]  {
+                pathParser.UnixPathParser,
+                pathParser.WindowsPathParser,
+                new FunctionParser(),
+                new PathCompositeParser(),
+                new LineNumberParser()
+            };
+
+            return;
+        }
+
+        [Test]
+        public void Test_IErrorParser_Can_Throw_ParserNullException()
+        {
+            bool hasRaisedException;
+
+            foreach (IErrorParser item in _array)
+            {
+                hasRaisedException = false;
+
+                try {
+                    item.TryParse(null, new RawError("test")); // throws exception
+                }
+                catch (Exception e)
+                {
+                    Assert.That(e.Message.Contains("parser"), Is.True);
+                    hasRaisedException = true;
+                }
+
+                Assert.That(hasRaisedException, Is.True,
+                    item.ToString() + " failed to raise exception");
+            }
+
+            return;
+        }
+
+        [Test]
+        public void Test_IErrorParser_Can_Throw_ArgsNullException()
+        {
+            bool hasRaisedException;
+
+            foreach (IErrorParser item in _array)
+            {
+                hasRaisedException = false;
+
+                try
+                {
+                    item.TryParse(_stack, null); // throws exception
+                }
+                catch (Exception e)
+                {
+                    Assert.That(e.Message.Contains("args"), Is.True);
+                    hasRaisedException = true;
+                }
+
+                Assert.That(hasRaisedException, Is.True,
+                    item.ToString() + " failed to raise exception");
+            }
+
+            return;
+        }
+
+        public RawError AcceptValue(IErrorParser parser, string error)
+        {
+            RawError res;
+
+            res = new RawError(error);
+            Assert.That(parser.TryParse(_stack, res), Is.True, "Failed to parse \"{0}\"", error);
+
+            return (res);
+        }
+
+        public void RejectValue(IErrorParser parser, string error)
+        {
+            Assert.That(parser.TryParse(_stack, new RawError(error)), Is.False);
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
index 96323b1..f8b14fc 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestLineNumberParser.cs
@@ -1,77 +1,77 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.StackTraceAnalyzers;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException.Tests.StackTraceAnalyzers
-{
-    [TestFixture]
-    public class TestLineNumberParser :
-        TestIErrorParser
-    {
-        private IErrorParser _parser;
-
-        [SetUp]
-        public new void SetUp()
-        {
-            _parser = new LineNumberParser();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Parse_Regular_Line_Number_Values()
-        {
-            RawError res;
-
-            // a basic test
-            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:line 1");
-            Assert.That(res.Line, Is.EqualTo(1));
-
-            // parser doesn't rely upon the presence of words between
-            // the colon and the number
-            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:42");
-            Assert.That(res.Line, Is.EqualTo(42));
-
-            // parser doesn't rely on the existence of
-            // a method name or filePath value
-            res = AcceptValue(_parser, ":43");
-            Assert.That(res.Line, Is.EqualTo(43));
-
-            // Works for German
-            // NOTE: German provides a period at the end of the line
-            res = AcceptValue(_parser, @"bei CT.Business.BusinessObjectXmlSerializer.Deserialize(String serializedObject) in D:\Source\CT5\BASE\CT.Business\BusinessObjectXmlSerializer.cs:Zeile 86.");
-            Assert.That(res.Line, Is.EqualTo(86));
-
-            // Russian works too
-            // в Samples.ExceptionBrowserTest.Worker.DoSomething() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 16
-            // в Samples.ExceptionBrowserTest.Test() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 24
-            res = AcceptValue(_parser, @"в Samples.ExceptionBrowserTest.Worker.DoSomething() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 16");
-            Assert.That(res.Line, Is.EqualTo(16));
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Reject_Odd_Line_Number_Values()
-        {
-            // after the terminal ':' parser expects to have only one integer value            
-            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1 line 42");
-            RejectValue(_parser, "à get_Text() dans C:\\folder\\file42");
-
-            // check it fails to parse int values that are part of a word
-            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line43");
-
-            // a line number should not be zero
-            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line 0");
-
-            // a line number should not be negative
-            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line -42");
-
-            return;
-        }        
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestLineNumberParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new LineNumberParser();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Line_Number_Values()
+        {
+            RawError res;
+
+            // a basic test
+            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:line 1");
+            Assert.That(res.Line, Is.EqualTo(1));
+
+            // parser doesn't rely upon the presence of words between
+            // the colon and the number
+            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:42");
+            Assert.That(res.Line, Is.EqualTo(42));
+
+            // parser doesn't rely on the existence of
+            // a method name or filePath value
+            res = AcceptValue(_parser, ":43");
+            Assert.That(res.Line, Is.EqualTo(43));
+
+            // Works for German
+            // NOTE: German provides a period at the end of the line
+            res = AcceptValue(_parser, @"bei CT.Business.BusinessObjectXmlSerializer.Deserialize(String serializedObject) in D:\Source\CT5\BASE\CT.Business\BusinessObjectXmlSerializer.cs:Zeile 86.");
+            Assert.That(res.Line, Is.EqualTo(86));
+
+            // Russian works too
+            // в Samples.ExceptionBrowserTest.Worker.DoSomething() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 16
+            // в Samples.ExceptionBrowserTest.Test() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 24
+            res = AcceptValue(_parser, @"в Samples.ExceptionBrowserTest.Worker.DoSomething() в C:\psgdev\Projects\NUnit\Tests\Samples\ExceptionBrowserTest.cs:строка 16");
+            Assert.That(res.Line, Is.EqualTo(16));
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Reject_Odd_Line_Number_Values()
+        {
+            // after the terminal ':' parser expects to have only one integer value            
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1 line 42");
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file42");
+
+            // check it fails to parse int values that are part of a word
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line43");
+
+            // a line number should not be zero
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line 0");
+
+            // a line number should not be negative
+            RejectValue(_parser, "à get_Text() dans C:\\folder\\file1:line -42");
+
+            return;
+        }        
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
index 894dfca..6c00fb9 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestPathParser.cs
@@ -1,51 +1,51 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.StackTraceAnalyzers;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException.Tests.StackTraceAnalyzers
-{
-    [TestFixture]
-    public class TestPathParser :
-        TestIErrorParser
-    {
-        private PathCompositeParser _parser;
-
-        [SetUp]
-        public new void SetUp()
-        {
-            _parser = new PathCompositeParser();
-
-            Assert.That(_parser.UnixPathParser, Is.Not.Null);
-            Assert.That(_parser.WindowsPathParser, Is.Not.Null);                
-
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Handle_Windows_Path_Like_Values()
-        {
-            RawError res;
-
-            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:line 1");
-            Assert.That(res.Path, Is.EqualTo("C:\\folder\\file1"));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Handle_Unix_Path_Like_Values()
-        {
-            RawError res;
-
-            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/folder/file1:line 1");
-            Assert.That(res.Path, Is.EqualTo("/home/ihottier/folder/file1"));
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestPathParser :
+        TestIErrorParser
+    {
+        private PathCompositeParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new PathCompositeParser();
+
+            Assert.That(_parser.UnixPathParser, Is.Not.Null);
+            Assert.That(_parser.WindowsPathParser, Is.Not.Null);                
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Windows_Path_Like_Values()
+        {
+            RawError res;
+
+            res = AcceptValue(_parser, "à get_Text() dans C:\\folder\\file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("C:\\folder\\file1"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Unix_Path_Like_Values()
+        {
+            RawError res;
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/folder/file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/folder/file1"));
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
index 898ffae..50773c0 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestUnixPathParser.cs
@@ -1,94 +1,94 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.StackTraceAnalyzers;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException.Tests.StackTraceAnalyzers
-{
-    [TestFixture]
-    public class TestUnixPathParser :
-        TestIErrorParser
-    {
-        private IErrorParser _parser;
-
-        [SetUp]
-        public new void SetUp()
-        {
-            _parser = new PathCompositeParser().UnixPathParser;
-
-            Assert.That(_parser, Is.Not.Null);
-
-            return;
-        }        
-
-        [Test]
-        public void Test_Ability_To_Parse_Regular_Unix_Like_Path_Values()
-        {
-            RawError res;
-
-            // one basic sample
-            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans /home/ihottier/TraceItem.cs:ligne 43");
-            Assert.That(res.Path, Is.EqualTo("/home/ihottier/TraceItem.cs"));
-
-            // check parser is not confused by file with odd extensions
-            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/TraceItem.cs.cs.cs.cs:ligne 43");
-            Assert.That(res.Path, Is.EqualTo("/home/ihottier/TraceItem.cs.cs.cs.cs"));
-
-            // check it supports white space in 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"));
-
-            // check it supports odd folder names ending like C# file
-            res = AcceptValue(_parser, "à get_Text() dans /home/my doc/my doc2.cs/file.cs:line 1");
-            Assert.That(res.Path, Is.EqualTo("/home/my doc/my doc2.cs/file.cs"));
-
-            // check it doesn't rely on a constant such as "/home"
-            res = AcceptValue(_parser, "à get_Text() dans /root/work/folder 1/file1.cs:line 1");
-            Assert.That(res.Path, Is.EqualTo("/root/work/folder 1/file1.cs"));
-
-            // same with upper case
-            res = AcceptValue(_parser, "à get_Text() dans /ROOT/work/folder 1/file1.cs:line 1");
-            Assert.That(res.Path, Is.EqualTo("/ROOT/work/folder 1/file1.cs"));
-
-            // check it doesn't rely upon a specific file language
-
-            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/work/folder 1/file1.vb:line 1");
-            Assert.That(res.Path, Is.EqualTo("/home/ihottier/work/folder 1/file1.vb"));
-
-            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/work/folder 1/file1.cpp: line 1");
-            Assert.That(res.Path, Is.EqualTo("/home/ihottier/work/folder 1/file1.cpp"));
-
-            // check it doesn't rely upon language at all
-
-            res = AcceptValue(_parser, "à get_Text() dans /home/work/folder 1/file1:line 1");
-            Assert.That(res.Path, Is.EqualTo("/home/work/folder 1/file1"));
-
-            // check it doesn't rely upon method or line information
-            res = AcceptValue(_parser, "/home/work/folder/file:");
-            Assert.That(res.Path, Is.EqualTo("/home/work/folder/file"));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Inability_To_Parse_Non_Unix_Like_Path_Values()
-        {
-            // check it fails to parse Windows like filePath values
-            RejectValue(_parser, "à get_Text() dans C:\\Users\\ihottier\\Work\\file1:line1");
-
-            // 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 filePath value
-            RejectValue(_parser, "à get_Text()");
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestUnixPathParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new PathCompositeParser().UnixPathParser;
+
+            Assert.That(_parser, Is.Not.Null);
+
+            return;
+        }        
+
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Unix_Like_Path_Values()
+        {
+            RawError res;
+
+            // one basic sample
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans /home/ihottier/TraceItem.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/TraceItem.cs"));
+
+            // check parser is not confused by file with odd extensions
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/TraceItem.cs.cs.cs.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/TraceItem.cs.cs.cs.cs"));
+
+            // check it supports white space in 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"));
+
+            // check it supports odd folder names ending like C# file
+            res = AcceptValue(_parser, "à get_Text() dans /home/my doc/my doc2.cs/file.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/my doc/my doc2.cs/file.cs"));
+
+            // check it doesn't rely on a constant such as "/home"
+            res = AcceptValue(_parser, "à get_Text() dans /root/work/folder 1/file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/root/work/folder 1/file1.cs"));
+
+            // same with upper case
+            res = AcceptValue(_parser, "à get_Text() dans /ROOT/work/folder 1/file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("/ROOT/work/folder 1/file1.cs"));
+
+            // check it doesn't rely upon a specific file language
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/work/folder 1/file1.vb:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/work/folder 1/file1.vb"));
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/ihottier/work/folder 1/file1.cpp: line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/ihottier/work/folder 1/file1.cpp"));
+
+            // check it doesn't rely upon language at all
+
+            res = AcceptValue(_parser, "à get_Text() dans /home/work/folder 1/file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("/home/work/folder 1/file1"));
+
+            // check it doesn't rely upon method or line information
+            res = AcceptValue(_parser, "/home/work/folder/file:");
+            Assert.That(res.Path, Is.EqualTo("/home/work/folder/file"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Inability_To_Parse_Non_Unix_Like_Path_Values()
+        {
+            // check it fails to parse Windows like filePath values
+            RejectValue(_parser, "à get_Text() dans C:\\Users\\ihottier\\Work\\file1:line1");
+
+            // 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 filePath value
+            RejectValue(_parser, "à get_Text()");
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs b/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
index 9d22643..e4df42f 100644
--- a/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
+++ b/src/GuiException/tests/StackTraceAnalysers/TestWindowsPathParser.cs
@@ -1,95 +1,95 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.UiException.StackTraceAnalyzers;
-using NUnit.UiException.StackTraceAnalysers;
-
-namespace NUnit.UiException.Tests.StackTraceAnalyzers
-{
-    [TestFixture]
-    public class TestWindowsPathParser :
-        TestIErrorParser
-    {
-        private IErrorParser _parser;
-
-        [SetUp]
-        public new void SetUp()
-        {
-            _parser = new PathCompositeParser().WindowsPathParser;
-
-            Assert.That(_parser, Is.Not.Null);
-
-            return;                
-        }
-        
-        [Test]
-        public void Test_Ability_To_Parse_Regular_Windows_Path()
-        {
-            RawError res;
-
-            // one basic sample
-            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
-            Assert.That(res.Path, Is.EqualTo("C:\\TraceItem.cs"));
-
-            // check parser is not confused by file with odd extensions
-            res = AcceptValue(_parser, "à get_Text() dans C:\\TraceItem.cs.cs.cs.cs:ligne 43");
-            Assert.That(res.Path, Is.EqualTo("C:\\TraceItem.cs.cs.cs.cs"));
-
-            // check it supports white space in 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"));
-
-            // check it supports odd folder names ending like C# file
-            res = AcceptValue(_parser, "à get_Text() dans C:\\my doc\\my doc2.cs\\file.cs:line 1");
-            Assert.That(res.Path, Is.EqualTo("C:\\my doc\\my doc2.cs\\file.cs"));
-
-            // check it supports odd drive letters
-            res = AcceptValue(_parser, "à get_Text() dans Z:\\work\\folder 1\\file1.cs:line 1");
-            Assert.That(res.Path, Is.EqualTo("Z:\\work\\folder 1\\file1.cs"));
-
-            // same with lower case
-            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.cs:line 1");
-            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.cs"));
-
-            // check it doesn't rely upon a specific file language
-
-            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.vb:line 1");
-            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.vb"));
-
-            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.cpp: line 1");
-            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.cpp"));
-
-            // check it doesn't rely upon language at all
-
-            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1:line 1");
-            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1"));
-
-            // check it doesn't rely upon method or line number information
-
-            res = AcceptValue(_parser, "z:\\work\\folder\\file:");
-            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder\\file"));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Inability_To_Parse_Non_Windows_Like_Path_Values()
-        {
-            // check it fails to parse Unix like filePath values
-            RejectValue(_parser, "à get_Text() dans /home/ihottier/work/file1:line1");
-
-            // 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 filePath value
-            RejectValue(_parser, "à get_Text()");
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.UiException.StackTraceAnalyzers;
+using NUnit.UiException.StackTraceAnalysers;
+
+namespace NUnit.UiException.Tests.StackTraceAnalyzers
+{
+    [TestFixture]
+    public class TestWindowsPathParser :
+        TestIErrorParser
+    {
+        private IErrorParser _parser;
+
+        [SetUp]
+        public new void SetUp()
+        {
+            _parser = new PathCompositeParser().WindowsPathParser;
+
+            Assert.That(_parser, Is.Not.Null);
+
+            return;                
+        }
+        
+        [Test]
+        public void Test_Ability_To_Parse_Regular_Windows_Path()
+        {
+            RawError res;
+
+            // one basic sample
+            res = AcceptValue(_parser, "à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("C:\\TraceItem.cs"));
+
+            // check parser is not confused by file with odd extensions
+            res = AcceptValue(_parser, "à get_Text() dans C:\\TraceItem.cs.cs.cs.cs:ligne 43");
+            Assert.That(res.Path, Is.EqualTo("C:\\TraceItem.cs.cs.cs.cs"));
+
+            // check it supports white space in 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"));
+
+            // check it supports odd folder names ending like C# file
+            res = AcceptValue(_parser, "à get_Text() dans C:\\my doc\\my doc2.cs\\file.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("C:\\my doc\\my doc2.cs\\file.cs"));
+
+            // check it supports odd drive letters
+            res = AcceptValue(_parser, "à get_Text() dans Z:\\work\\folder 1\\file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("Z:\\work\\folder 1\\file1.cs"));
+
+            // same with lower case
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.cs:line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.cs"));
+
+            // check it doesn't rely upon a specific file language
+
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.vb:line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.vb"));
+
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1.cpp: line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1.cpp"));
+
+            // check it doesn't rely upon language at all
+
+            res = AcceptValue(_parser, "à get_Text() dans z:\\work\\folder 1\\file1:line 1");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder 1\\file1"));
+
+            // check it doesn't rely upon method or line number information
+
+            res = AcceptValue(_parser, "z:\\work\\folder\\file:");
+            Assert.That(res.Path, Is.EqualTo("z:\\work\\folder\\file"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Inability_To_Parse_Non_Windows_Like_Path_Values()
+        {
+            // check it fails to parse Unix like filePath values
+            RejectValue(_parser, "à get_Text() dans /home/ihottier/work/file1:line1");
+
+            // 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 filePath value
+            RejectValue(_parser, "à get_Text()");
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestDefaultTextManager.cs b/src/GuiException/tests/TestDefaultTextManager.cs
index 1e11be0..415a546 100644
--- a/src/GuiException/tests/TestDefaultTextManager.cs
+++ b/src/GuiException/tests/TestDefaultTextManager.cs
@@ -1,84 +1,84 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System.Collections.Generic;
-using NUnit.Framework;
-
-namespace NUnit.UiException.Tests
-{
-    [TestFixture]
-    public class TestDefaultTextManager
-    {
-        private DefaultTextManager _textBlocks;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _textBlocks = new DefaultTextManager();            
-        }       
-
-        [Test]
-        public void Test_Default()
-        {
-            Assert.That(_textBlocks.Text, Is.EqualTo(""));
-            Assert.That(_textBlocks.LineCount, Is.EqualTo(0));
-            Assert.That(_textBlocks.MaxLength, Is.EqualTo(0));
-
-            return;
-        }
-
-        [Test]
-        public void Test_CodeBlockCollection()
-        {
-            List<string> lst;
-
-            Assert.That(_textBlocks.LineCount, Is.EqualTo(0));
-
-            _textBlocks.Text = "01\r\n02\r\n03\r\n";
-
-            Assert.That(_textBlocks.Text, Is.EqualTo("01\r\n02\r\n03\r\n"));
-            Assert.That(_textBlocks.LineCount, Is.EqualTo(3));
-            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
-            Assert.That(_textBlocks.GetTextAt(1), Is.EqualTo("02"));
-            Assert.That(_textBlocks.GetTextAt(2), Is.EqualTo("03"));
-
-            _textBlocks.Text = "01";
-            Assert.That(_textBlocks.LineCount, Is.EqualTo(1));
-            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
-
-            _textBlocks.Text = "01\r\n02";
-            Assert.That(_textBlocks.LineCount, Is.EqualTo(2));
-            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
-            Assert.That(_textBlocks.GetTextAt(1), Is.EqualTo("02"));
-
-            lst = new List<string>();
-            foreach (string line in _textBlocks)
-                lst.Add(line);
-            Assert.That(lst.Count, Is.EqualTo(2));
-            Assert.That(lst[0], Is.EqualTo(_textBlocks.GetTextAt(0)));
-            Assert.That(lst[1], Is.EqualTo(_textBlocks.GetTextAt(1)));
-
-            _textBlocks.Text = null;
-            Assert.That(_textBlocks.Text, Is.EqualTo(""));            
-
-            return;
-        }
-
-        [Test]
-        public void Test_MaxLength()
-        {
-            _textBlocks.Text = null;
-            Assert.That(_textBlocks.MaxLength, Is.EqualTo(0));
-
-            _textBlocks.Text = "a\r\nabc\r\nab";
-            Assert.That(_textBlocks.MaxLength, Is.EqualTo(3));
-
-            _textBlocks.Text = "a\r\nab\r\nabc";
-            Assert.That(_textBlocks.MaxLength, Is.EqualTo(3));
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.Collections.Generic;
+using NUnit.Framework;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestDefaultTextManager
+    {
+        private DefaultTextManager _textBlocks;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _textBlocks = new DefaultTextManager();            
+        }       
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_textBlocks.Text, Is.EqualTo(""));
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(0));
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_CodeBlockCollection()
+        {
+            List<string> lst;
+
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(0));
+
+            _textBlocks.Text = "01\r\n02\r\n03\r\n";
+
+            Assert.That(_textBlocks.Text, Is.EqualTo("01\r\n02\r\n03\r\n"));
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(3));
+            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
+            Assert.That(_textBlocks.GetTextAt(1), Is.EqualTo("02"));
+            Assert.That(_textBlocks.GetTextAt(2), Is.EqualTo("03"));
+
+            _textBlocks.Text = "01";
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(1));
+            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
+
+            _textBlocks.Text = "01\r\n02";
+            Assert.That(_textBlocks.LineCount, Is.EqualTo(2));
+            Assert.That(_textBlocks.GetTextAt(0), Is.EqualTo("01"));
+            Assert.That(_textBlocks.GetTextAt(1), Is.EqualTo("02"));
+
+            lst = new List<string>();
+            foreach (string line in _textBlocks)
+                lst.Add(line);
+            Assert.That(lst.Count, Is.EqualTo(2));
+            Assert.That(lst[0], Is.EqualTo(_textBlocks.GetTextAt(0)));
+            Assert.That(lst[1], Is.EqualTo(_textBlocks.GetTextAt(1)));
+
+            _textBlocks.Text = null;
+            Assert.That(_textBlocks.Text, Is.EqualTo(""));            
+
+            return;
+        }
+
+        [Test]
+        public void Test_MaxLength()
+        {
+            _textBlocks.Text = null;
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(0));
+
+            _textBlocks.Text = "a\r\nabc\r\nab";
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(3));
+
+            _textBlocks.Text = "a\r\nab\r\nabc";
+            Assert.That(_textBlocks.MaxLength, Is.EqualTo(3));
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestExceptionItem.cs b/src/GuiException/tests/TestExceptionItem.cs
index 615f85b..1ef046c 100644
--- a/src/GuiException/tests/TestExceptionItem.cs
+++ b/src/GuiException/tests/TestExceptionItem.cs
@@ -1,186 +1,186 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.UiException.Tests.data;
-using System.IO;
-
-namespace NUnit.UiException.Tests
-{
-    [TestFixture]
-    public class TestErrorItem
-    {
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "path",
-            MatchType = MessageMatch.Contains)]
-        public void Ctor_Throws_NullPathException()
-        {
-           new ErrorItem(null, 1); // throws exception
-        }
-
-        [Test]        
-        public void Ctor_With_Line_0()
-        {
-            new ErrorItem("file.txt", 0);
-        }
-
-        [Test]
-        public void Ctor_2()
-        {
-            ErrorItem item;
-            
-            item = new ErrorItem("Test.cs", "myFunction()", 1);
-
-            Assert.That(item.Path, Is.EqualTo("Test.cs"));
-            Assert.That(item.FullyQualifiedMethodName, Is.EqualTo("myFunction()"));            
-            Assert.That(item.LineNumber, Is.EqualTo(1));
-            Assert.That(item.HasSourceAttachment, Is.True);
-            Assert.That(item.FileExtension, Is.EqualTo("cs"));
-
-            item = new ErrorItem(null, "myFunction()", 1);
-            Assert.That(item.Path, Is.Null);
-            Assert.That(item.FileExtension, Is.Null);
-            Assert.That(item.FullyQualifiedMethodName, Is.EqualTo("myFunction()"));
-            Assert.That(item.LineNumber, Is.EqualTo(1));
-            Assert.That(item.HasSourceAttachment, Is.False);
-
-            return;
-        }
-
-        [Test]
-        public void Test_MethodName()
-        {
-            ErrorItem item;
-
-            // test to pass
-
-            item = new ErrorItem("path", "namespace1.class.fullMethodName(string arg)", 1);
-            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
-            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
-            Assert.That(item.ClassName, Is.EqualTo("class"));
-
-            item = new ErrorItem("path", ".class.fullMethodName(string arg)", 1);
-            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
-            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
-            Assert.That(item.ClassName, Is.EqualTo("class"));
-
-            item = new ErrorItem("path", "0123456789012.a()", 1);
-            Assert.That(item.MethodName, Is.EqualTo("a()"));
-            Assert.That(item.BaseMethodName, Is.EqualTo("a"));
-            Assert.That(item.ClassName, Is.EqualTo("0123456789012"));                
-
-            // test to fail
-
-            item = new ErrorItem("path", "fullMethodName(string arg)", 1);
-            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
-            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
-            Assert.That(item.ClassName, Is.EqualTo(""));
-
-            item = new ErrorItem("path", "", 1);
-            Assert.That(item.MethodName, Is.EqualTo(""));
-            Assert.That(item.BaseMethodName, Is.EqualTo(""));
-            Assert.That(item.ClassName, Is.EqualTo(""));
-
-            return;
-        }
-
-        [Test]
-        public void Can_Set_Properties()
-        {
-            ErrorItem item;
-
-            item = new ErrorItem("/dir/file.txt", 13);
-
-            Assert.That(item.FileName, Is.EqualTo("file.txt"));
-            Assert.That(item.FileExtension, Is.EqualTo("txt"));
-            Assert.That(item.Path, Is.EqualTo("/dir/file.txt"));
-            Assert.That(item.LineNumber, Is.EqualTo(13));
-            Assert.That(item.HasSourceAttachment, Is.True);
-
-            item = new ErrorItem();
-            Assert.That(item.FileName, Is.Null);
-            Assert.That(item.FileExtension, Is.Null);
-            Assert.That(item.Path, Is.Null);
-            Assert.That(item.LineNumber, Is.EqualTo(0));
-            Assert.That(item.HasSourceAttachment, Is.False);
-
-            return;
-        }
-
-        [Test]
-        public void Test_FileExtension()
-        {
-            ErrorItem item;
-
-            item = new ErrorItem("C:\\dir\\file.cs", 1);
-            Assert.That(item.FileExtension, Is.EqualTo("cs"));
-
-            item = new ErrorItem("C:\\dir\\file.cpp", 1);
-            Assert.That(item.FileExtension, Is.EqualTo("cpp"));
-
-            item = new ErrorItem("C:\\dir\\file.cs.cpp.plop", 1);
-            Assert.That(item.FileExtension, Is.EqualTo("plop"));
-
-            item = new ErrorItem("C:\\dir\\file.", 1);
-            Assert.That(item.FileExtension, Is.Null);
-
-            item = new ErrorItem("C:\\dir\\file", 1);
-            Assert.That(item.FileExtension, Is.Null);
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(FileNotFoundException),
-            ExpectedMessage = "unknown.txt",
-            MatchType = MessageMatch.Contains)]
-        public void ReadFile_Throws_FileNotExistException()
-        {
-            ErrorItem item = new ErrorItem("C:\\unknown\\unknown.txt", 1);
-            item.ReadFile(); // throws exception
-        }
-
-        [Test]
-        public void ReadFile()
-        {
-            ErrorItem item;
-
-            using (TestResource resource = new TestResource("HelloWorld.txt"))
-            {
-                item = new ErrorItem(resource.Path, 1);
-
-                Assert.That(item.ReadFile(), Is.Not.Null);
-                Assert.That(item.ReadFile(), Is.EqualTo("Hello world!"));
-            }
-
-            return;
-        }        
-
-        [Test]
-        public void Test_Equals()
-        {
-            ErrorItem itemA;
-            ErrorItem itemB;
-            ErrorItem itemC;
-
-            itemA = new ErrorItem("file1.txt", 43);
-            itemB = new ErrorItem("file2.txt", 44);
-            itemC = new ErrorItem("file1.txt", "myFunction()", 43);
-
-            Assert.That(itemA.Equals(null), Is.False);
-            Assert.That(itemA.Equals("hello"), Is.False);
-            Assert.That(itemA.Equals(itemB), Is.False);
-            Assert.That(itemA.Equals(itemC), Is.False);
-            Assert.That(itemA.Equals(itemA), Is.True);
-            Assert.That(itemA.Equals(new ErrorItem("file", 43)), Is.False);
-            Assert.That(itemA.Equals(new ErrorItem("file1.txt", 42)), Is.False);
-            Assert.That(itemA.Equals(new ErrorItem("file1.txt", 43)), Is.True);
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.UiException.Tests.data;
+using System.IO;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestErrorItem
+    {
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "path",
+            MatchType = MessageMatch.Contains)]
+        public void Ctor_Throws_NullPathException()
+        {
+           new ErrorItem(null, 1); // throws exception
+        }
+
+        [Test]        
+        public void Ctor_With_Line_0()
+        {
+            new ErrorItem("file.txt", 0);
+        }
+
+        [Test]
+        public void Ctor_2()
+        {
+            ErrorItem item;
+            
+            item = new ErrorItem("Test.cs", "myFunction()", 1);
+
+            Assert.That(item.Path, Is.EqualTo("Test.cs"));
+            Assert.That(item.FullyQualifiedMethodName, Is.EqualTo("myFunction()"));            
+            Assert.That(item.LineNumber, Is.EqualTo(1));
+            Assert.That(item.HasSourceAttachment, Is.True);
+            Assert.That(item.FileExtension, Is.EqualTo("cs"));
+
+            item = new ErrorItem(null, "myFunction()", 1);
+            Assert.That(item.Path, Is.Null);
+            Assert.That(item.FileExtension, Is.Null);
+            Assert.That(item.FullyQualifiedMethodName, Is.EqualTo("myFunction()"));
+            Assert.That(item.LineNumber, Is.EqualTo(1));
+            Assert.That(item.HasSourceAttachment, Is.False);
+
+            return;
+        }
+
+        [Test]
+        public void Test_MethodName()
+        {
+            ErrorItem item;
+
+            // test to pass
+
+            item = new ErrorItem("path", "namespace1.class.fullMethodName(string arg)", 1);
+            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
+            Assert.That(item.ClassName, Is.EqualTo("class"));
+
+            item = new ErrorItem("path", ".class.fullMethodName(string arg)", 1);
+            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
+            Assert.That(item.ClassName, Is.EqualTo("class"));
+
+            item = new ErrorItem("path", "0123456789012.a()", 1);
+            Assert.That(item.MethodName, Is.EqualTo("a()"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("a"));
+            Assert.That(item.ClassName, Is.EqualTo("0123456789012"));                
+
+            // test to fail
+
+            item = new ErrorItem("path", "fullMethodName(string arg)", 1);
+            Assert.That(item.MethodName, Is.EqualTo("fullMethodName(string arg)"));
+            Assert.That(item.BaseMethodName, Is.EqualTo("fullMethodName"));
+            Assert.That(item.ClassName, Is.EqualTo(""));
+
+            item = new ErrorItem("path", "", 1);
+            Assert.That(item.MethodName, Is.EqualTo(""));
+            Assert.That(item.BaseMethodName, Is.EqualTo(""));
+            Assert.That(item.ClassName, Is.EqualTo(""));
+
+            return;
+        }
+
+        [Test]
+        public void Can_Set_Properties()
+        {
+            ErrorItem item;
+
+            item = new ErrorItem("/dir/file.txt", 13);
+
+            Assert.That(item.FileName, Is.EqualTo("file.txt"));
+            Assert.That(item.FileExtension, Is.EqualTo("txt"));
+            Assert.That(item.Path, Is.EqualTo("/dir/file.txt"));
+            Assert.That(item.LineNumber, Is.EqualTo(13));
+            Assert.That(item.HasSourceAttachment, Is.True);
+
+            item = new ErrorItem();
+            Assert.That(item.FileName, Is.Null);
+            Assert.That(item.FileExtension, Is.Null);
+            Assert.That(item.Path, Is.Null);
+            Assert.That(item.LineNumber, Is.EqualTo(0));
+            Assert.That(item.HasSourceAttachment, Is.False);
+
+            return;
+        }
+
+        [Test]
+        public void Test_FileExtension()
+        {
+            ErrorItem item;
+
+            item = new ErrorItem("C:\\dir\\file.cs", 1);
+            Assert.That(item.FileExtension, Is.EqualTo("cs"));
+
+            item = new ErrorItem("C:\\dir\\file.cpp", 1);
+            Assert.That(item.FileExtension, Is.EqualTo("cpp"));
+
+            item = new ErrorItem("C:\\dir\\file.cs.cpp.plop", 1);
+            Assert.That(item.FileExtension, Is.EqualTo("plop"));
+
+            item = new ErrorItem("C:\\dir\\file.", 1);
+            Assert.That(item.FileExtension, Is.Null);
+
+            item = new ErrorItem("C:\\dir\\file", 1);
+            Assert.That(item.FileExtension, Is.Null);
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(FileNotFoundException),
+            ExpectedMessage = "unknown.txt",
+            MatchType = MessageMatch.Contains)]
+        public void ReadFile_Throws_FileNotExistException()
+        {
+            ErrorItem item = new ErrorItem("C:\\unknown\\unknown.txt", 1);
+            item.ReadFile(); // throws exception
+        }
+
+        [Test]
+        public void ReadFile()
+        {
+            ErrorItem item;
+
+            using (TestResource resource = new TestResource("HelloWorld.txt"))
+            {
+                item = new ErrorItem(resource.Path, 1);
+
+                Assert.That(item.ReadFile(), Is.Not.Null);
+                Assert.That(item.ReadFile(), Is.EqualTo("Hello world!"));
+            }
+
+            return;
+        }        
+
+        [Test]
+        public void Test_Equals()
+        {
+            ErrorItem itemA;
+            ErrorItem itemB;
+            ErrorItem itemC;
+
+            itemA = new ErrorItem("file1.txt", 43);
+            itemB = new ErrorItem("file2.txt", 44);
+            itemC = new ErrorItem("file1.txt", "myFunction()", 43);
+
+            Assert.That(itemA.Equals(null), Is.False);
+            Assert.That(itemA.Equals("hello"), Is.False);
+            Assert.That(itemA.Equals(itemB), Is.False);
+            Assert.That(itemA.Equals(itemC), Is.False);
+            Assert.That(itemA.Equals(itemA), Is.True);
+            Assert.That(itemA.Equals(new ErrorItem("file", 43)), Is.False);
+            Assert.That(itemA.Equals(new ErrorItem("file1.txt", 42)), Is.False);
+            Assert.That(itemA.Equals(new ErrorItem("file1.txt", 43)), Is.True);
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestExceptionItemCollection.cs b/src/GuiException/tests/TestExceptionItemCollection.cs
index c6557a2..c56ed5b 100644
--- a/src/GuiException/tests/TestExceptionItemCollection.cs
+++ b/src/GuiException/tests/TestExceptionItemCollection.cs
@@ -1,125 +1,125 @@
-// ****************************************************************
-// This 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.Framework;
-using NUnit.UiException.Tests.data;
-
-namespace NUnit.UiException.Tests
-{
-    [TestFixture]
-    public class TestErrorItemCollection
-    {
-        TestResource _resourceA;
-        TestResource _resourceB;
-
-        private ErrorItemCollection _items;
-        private ErrorItem _itemA;
-        private ErrorItem _itemB;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _items = new InternalTraceItemCollection();
-
-            _resourceA = new TestResource("HelloWorld.txt");
-            _resourceB = new TestResource("TextCode.txt");
-
-            _itemA = new ErrorItem(_resourceA.Path, 1);
-            _itemB = new ErrorItem(_resourceB.Path, 2);
-
-            return;
-        }
-
-        [TearDown]
-        public void TearDown()
-        {
-            if (_resourceA != null)
-            {
-                _resourceA.Dispose();
-                _resourceA = null;
-            }
-
-            if (_resourceB != null)
-            {
-                _resourceB.Dispose();
-                _resourceB = null;
-            }
-        }
-
-        [Test]
-        public void Test_TraceItems()
-        {
-            List<ErrorItem> lst;
-
-            Assert.That(_items.Count, Is.EqualTo(0));
-
-            _items.Add(_itemA);
-            _items.Add(_itemB);
-
-            Assert.That(_items.Count, Is.EqualTo(2));
-
-            Assert.That(_items[0], Is.EqualTo(_itemA));
-            Assert.That(_items[1], Is.EqualTo(_itemB));
-
-            lst = new List<ErrorItem>();
-            foreach (ErrorItem item in _items)
-                lst.Add(item);
-            Assert.That(lst.Count, Is.EqualTo(2));
-            Assert.That(lst[0], Is.EqualTo(_items[0]));
-            Assert.That(lst[1], Is.EqualTo(_items[1]));
-
-            return;
-        }
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "item",
-            MatchType = MessageMatch.Contains)]
-        public void Test_Add_Throws_NullItemException()
-        {
-            _items.Add(null); // throws exception
-        }
-
-        [Test]
-        public void Test_Clear()
-        {
-            _items.Add(_itemA);
-
-            Assert.That(_items.Count, Is.EqualTo(1));
-            _items.Clear();
-            Assert.That(_items.Count, Is.EqualTo(0));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Contains()
-        {
-            Assert.That(_items.Contains(null), Is.False);
-            Assert.That(_items.Contains(_itemA), Is.False);
-
-            _items.Add(_itemA);
-
-            Assert.That(_items.Contains(_itemA), Is.True);
-
-            return;
-        }
-
-        #region InternalTraceItemCollection
-
-        class InternalTraceItemCollection :
-            ErrorItemCollection
-        {
-            public InternalTraceItemCollection()
-            {
-                // nothing to do
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This 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.Framework;
+using NUnit.UiException.Tests.data;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestErrorItemCollection
+    {
+        TestResource _resourceA;
+        TestResource _resourceB;
+
+        private ErrorItemCollection _items;
+        private ErrorItem _itemA;
+        private ErrorItem _itemB;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _items = new InternalTraceItemCollection();
+
+            _resourceA = new TestResource("HelloWorld.txt");
+            _resourceB = new TestResource("TextCode.txt");
+
+            _itemA = new ErrorItem(_resourceA.Path, 1);
+            _itemB = new ErrorItem(_resourceB.Path, 2);
+
+            return;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            if (_resourceA != null)
+            {
+                _resourceA.Dispose();
+                _resourceA = null;
+            }
+
+            if (_resourceB != null)
+            {
+                _resourceB.Dispose();
+                _resourceB = null;
+            }
+        }
+
+        [Test]
+        public void Test_TraceItems()
+        {
+            List<ErrorItem> lst;
+
+            Assert.That(_items.Count, Is.EqualTo(0));
+
+            _items.Add(_itemA);
+            _items.Add(_itemB);
+
+            Assert.That(_items.Count, Is.EqualTo(2));
+
+            Assert.That(_items[0], Is.EqualTo(_itemA));
+            Assert.That(_items[1], Is.EqualTo(_itemB));
+
+            lst = new List<ErrorItem>();
+            foreach (ErrorItem item in _items)
+                lst.Add(item);
+            Assert.That(lst.Count, Is.EqualTo(2));
+            Assert.That(lst[0], Is.EqualTo(_items[0]));
+            Assert.That(lst[1], Is.EqualTo(_items[1]));
+
+            return;
+        }
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "item",
+            MatchType = MessageMatch.Contains)]
+        public void Test_Add_Throws_NullItemException()
+        {
+            _items.Add(null); // throws exception
+        }
+
+        [Test]
+        public void Test_Clear()
+        {
+            _items.Add(_itemA);
+
+            Assert.That(_items.Count, Is.EqualTo(1));
+            _items.Clear();
+            Assert.That(_items.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Contains()
+        {
+            Assert.That(_items.Contains(null), Is.False);
+            Assert.That(_items.Contains(_itemA), Is.False);
+
+            _items.Add(_itemA);
+
+            Assert.That(_items.Contains(_itemA), Is.True);
+
+            return;
+        }
+
+        #region InternalTraceItemCollection
+
+        class InternalTraceItemCollection :
+            ErrorItemCollection
+        {
+            public InternalTraceItemCollection()
+            {
+                // nothing to do
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/GuiException/tests/TestPaintLineLocation.cs b/src/GuiException/tests/TestPaintLineLocation.cs
index 8daa6d0..aeb40e1 100644
--- a/src/GuiException/tests/TestPaintLineLocation.cs
+++ b/src/GuiException/tests/TestPaintLineLocation.cs
@@ -1,68 +1,68 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using System.Drawing;
-using NUnit.UiException.Controls;
-
-namespace NUnit.UiException.Tests
-{
-    [TestFixture]
-    public class TestPaintLineLocation
-    {
-        private PaintLineLocation _line;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _line = new PaintLineLocation(42, "hello world!", new PointF(13, 42));
-        }
-
-        [Test]
-        public void Test_PaintLineLocation()
-        {
-            Assert.That(_line.LineIndex, Is.EqualTo(42));
-            Assert.That(_line.Text, Is.EqualTo("hello world!"));
-            Assert.That(_line.Location, Is.EqualTo(new PointF(13, 42)));
-
-            return;
-        }       
-
-        [Test]
-        [ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "text",
-            MatchType = MessageMatch.Contains)]
-        public void Test_SetText_Throws_NullTextException()
-        {
-            new PaintLineLocation(0, null, new PointF(0, 0)); // throws exception
-        }
-
-        [Test]
-        public void Test_Equals()
-        {
-            Assert.That(_line.Equals(null), Is.False);
-            Assert.That(_line.Equals("hello"), Is.False);
-            Assert.That(_line.Equals(new PaintLineLocation(0, "", new PointF(0, 0))), Is.False);
-
-            Assert.That(
-                _line.Equals(new PaintLineLocation(_line.LineIndex, _line.Text, new PointF(0, 0))),
-                Is.False);
-            Assert.That(
-                _line.Equals(new PaintLineLocation(_line.LineIndex, "", _line.Location)),
-                Is.False);
-            Assert.That(
-                _line.Equals(new PaintLineLocation(0, _line.Text, _line.Location)),
-                Is.False);
-
-            Assert.That(_line.Equals(_line), Is.True);
-            Assert.That(_line.Equals(
-                new PaintLineLocation(_line.LineIndex, _line.Text, _line.Location)),
-                Is.True);
-
-            return;
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using System.Drawing;
+using NUnit.UiException.Controls;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestPaintLineLocation
+    {
+        private PaintLineLocation _line;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _line = new PaintLineLocation(42, "hello world!", new PointF(13, 42));
+        }
+
+        [Test]
+        public void Test_PaintLineLocation()
+        {
+            Assert.That(_line.LineIndex, Is.EqualTo(42));
+            Assert.That(_line.Text, Is.EqualTo("hello world!"));
+            Assert.That(_line.Location, Is.EqualTo(new PointF(13, 42)));
+
+            return;
+        }       
+
+        [Test]
+        [ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "text",
+            MatchType = MessageMatch.Contains)]
+        public void Test_SetText_Throws_NullTextException()
+        {
+            new PaintLineLocation(0, null, new PointF(0, 0)); // throws exception
+        }
+
+        [Test]
+        public void Test_Equals()
+        {
+            Assert.That(_line.Equals(null), Is.False);
+            Assert.That(_line.Equals("hello"), Is.False);
+            Assert.That(_line.Equals(new PaintLineLocation(0, "", new PointF(0, 0))), Is.False);
+
+            Assert.That(
+                _line.Equals(new PaintLineLocation(_line.LineIndex, _line.Text, new PointF(0, 0))),
+                Is.False);
+            Assert.That(
+                _line.Equals(new PaintLineLocation(_line.LineIndex, "", _line.Location)),
+                Is.False);
+            Assert.That(
+                _line.Equals(new PaintLineLocation(0, _line.Text, _line.Location)),
+                Is.False);
+
+            Assert.That(_line.Equals(_line), Is.True);
+            Assert.That(_line.Equals(
+                new PaintLineLocation(_line.LineIndex, _line.Text, _line.Location)),
+                Is.True);
+
+            return;
+        }
+    }
+}
diff --git a/src/GuiException/tests/TestStackTraceParser.cs b/src/GuiException/tests/TestStackTraceParser.cs
index 9784e3d..a1f1b6b 100644
--- a/src/GuiException/tests/TestStackTraceParser.cs
+++ b/src/GuiException/tests/TestStackTraceParser.cs
@@ -1,261 +1,261 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-
-namespace NUnit.UiException.Tests
-{
-    [TestFixture]
-    public class TestStackTraceParser
-    {
-        private StackTraceParser _parser;
-
-        [SetUp]
-        public void SetUp()
-        {
-            _parser = new StackTraceParser();
-
-            return;
-        }
-
-        [Test]
-        public void Test_Default()
-        {
-            Assert.That(_parser.Items, Is.Not.Null);
-            Assert.That(_parser.Items.Count, Is.EqualTo(0));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Parse()
-        {
-            _parser.Parse("à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0], 
-                Is.EqualTo(new ErrorItem("C:\\TraceItem.cs", "NUnit.UiException.TraceItem.get_Text()", 43)));
-
-            // TryParse should clear previous textFormatter
-
-            _parser.Parse("");
-            Assert.That(_parser.Items.Count, Is.EqualTo(0));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Parse_MultipleExtension()
-        {
-            _parser.Parse("à get_Text() dans C:\\TraceItem.cs.cs.cs.cs:ligne 43");
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0].Path, Is.EqualTo("C:\\TraceItem.cs.cs.cs.cs"));
-
-            _parser.Parse("à get_Text() dans C:\\my Document1\\my document2 containing space\\file.cs:line 1");
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0].Path,
-                Is.EqualTo("C:\\my Document1\\my document2 containing space\\file.cs"));
-
-            _parser.Parse("à get_Text() dans C:\\my doc\\my doc2.cs\\file.cs:line 1");
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0].Path,
-                Is.EqualTo("C:\\my doc\\my doc2.cs\\file.cs"));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Parse_With_Real_Life_Samples()
-        {
-            // test ability to extract one trace
-
-            _parser.Parse(
-                "à Test.TestTraceItem.Can_Set_Properties() dans " +
-                "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
-                "NUnit_Stacktrace\\Test\\TestTraceItem.cs:ligne 42\r\n");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0],
-                Is.EqualTo(new ErrorItem(
-                    "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
-                    "NUnit_Stacktrace\\Test\\TestTraceItem.cs",
-                    "Test.TestTraceItem.Can_Set_Properties()",
-                    42)));
-
-            // test ability to extract two traces
-
-            _parser.Parse(
-                "à NUnit.UiException.TraceItem.get_Text() " +
-                "dans C:\\Documents and Settings\\ihottier\\Mes documents\\" +
-                "NUnit.UiException\\TraceItem.cs:ligne 43\r\n" +
-                "à Test.TestTaggedText.SetUp() dans C:\\Documents and Settings\\" +
-                "ihottier\\Mes documents\\NUnit_Stacktrace\\Test\\TestTaggedText.cs:ligne 30\r\n");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(2));
-
-            Assert.That(_parser.Items[0],
-                Is.EqualTo(
-                new ErrorItem(
-                    "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
-                    "NUnit.UiException\\TraceItem.cs",
-                    "NUnit.UiException.TraceItem.get_Text()",
-                    43)));
-
-            Assert.That(_parser.Items[1],
-                Is.EqualTo(
-                new ErrorItem(
-                    "C:\\Documents and Settings\\" +
-                    "ihottier\\Mes documents\\NUnit_Stacktrace\\Test\\TestTaggedText.cs",
-                    "Test.TestTaggedText.SetUp()",
-                    30)));
-
-            return;
-        }        
-
-        [Test]
-        public void Test_Trace_When_Missing_File()
-        {
-            //
-            // NUnit.UiException.Tests ability to not be confused
-            // if source code attachment is missing
-            //
-
-            _parser.Parse(
-                "à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)\r\n" +
-                "à NUnit.UiException.StackTraceParser.Parse(String stackTrace) dans C:\\StackTraceParser.cs:ligne 55\r\n" +
-                "à Test.TestStackTraceParser.Test_Parse() dans C:\\TestStackTraceParser.cs:ligne 36\r\n"
-                );
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(3));
-
-            Assert.That(_parser.Items[0].HasSourceAttachment, Is.False);
-            Assert.That(_parser.Items[0].FullyQualifiedMethodName,
-                Is.EqualTo("System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)"));
-
-            Assert.That(_parser.Items[1], 
-                Is.EqualTo(
-                    new ErrorItem(
-                        "C:\\StackTraceParser.cs",
-                        "NUnit.UiException.StackTraceParser.Parse(String stackTrace)",
-                        55)));
-            Assert.That(_parser.Items[2],
-                Is.EqualTo(
-                    new ErrorItem(
-                        "C:\\TestStackTraceParser.cs",
-                        "Test.TestStackTraceParser.Test_Parse()",
-                        36)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Missing_Line_Number()
-        {
-            //
-            // NUnit.UiException.Tests ability to not be confused
-            // if line number is missing
-            //
-
-            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() dans C:\\TestStackTraceParser.cs:\r\n");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0], 
-                Is.EqualTo(new ErrorItem(
-                    "C:\\TestStackTraceParser.cs", 
-                    "Test.TestStackTraceParser.Test_Parse()",
-                    0)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_English_Stack()
-        {
-            //
-            // NUnit.UiException.Tests ability of the parser to not depend
-            // of the language
-            //
-
-            _parser.Parse("at Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.cs:line 36\r\n");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0], Is.EqualTo(
-                new ErrorItem("C:\\TestStackTraceParser.cs", 
-                    "Test.TestStackTraceParser.Test_Parse()", 36)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Handle_Different_Path_System_Syntaxes()
-        {
-            //
-            // NUnit.UiException.Tests ability to not depend of one file system
-            //
-
-            // here, an hypothetic stack containing UNIX and Windows like filePath values...
-           
-            _parser.Parse(
-                "at Test.TestStackTraceParser.Test_Parse() in /home/ihottier/work/stacktrace/test/TestStackTraceParser.cs:line 36\r\n" +
-                "at Test.TestStackTraceParser2.Text_Parse2() in C:\\folder\\file1:line 42"
-                );
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(2));
-            Assert.That(_parser.Items[0], Is.EqualTo(
-                new ErrorItem(
-                    "/home/ihottier/work/stacktrace/test/TestStackTraceParser.cs",
-                    "Test.TestStackTraceParser.Test_Parse()",
-                    36)));
-            Assert.That(_parser.Items[1], Is.EqualTo(
-                new ErrorItem(
-                    "C:\\folder\\file1",
-                    "Test.TestStackTraceParser2.Text_Parse2()",
-                    42)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Ability_To_Handle_Files_With_Unknown_Extension()
-        {
-            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.vb:line 36");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0], Is.EqualTo(
-                new ErrorItem(
-                    "C:\\TestStackTraceParser.vb",
-                    "Test.TestStackTraceParser.Test_Parse()",
-                    36)));
-
-            return;
-        }
-
-        [Test]
-        public void Test_Analysis_Does_Not_Depend_Upon_File_Extension()
-        {
-            //
-            // NUnit.UiException.Tests that Stack Analyzer should not
-            // be not aware of file language.
-            //
-
-            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.vb:line 36");
-
-            Assert.That(_parser.Items.Count, Is.EqualTo(1));
-            Assert.That(_parser.Items[0], Is.EqualTo(
-                new ErrorItem(
-                    "C:\\TestStackTraceParser.vb",
-                    "Test.TestStackTraceParser.Test_Parse()",
-                    36)));
-
-            return;
-        }
-               
-        [Test]
-        public void Test_Parse_Null()
-        {
-            _parser.Parse(null);
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+
+namespace NUnit.UiException.Tests
+{
+    [TestFixture]
+    public class TestStackTraceParser
+    {
+        private StackTraceParser _parser;
+
+        [SetUp]
+        public void SetUp()
+        {
+            _parser = new StackTraceParser();
+
+            return;
+        }
+
+        [Test]
+        public void Test_Default()
+        {
+            Assert.That(_parser.Items, Is.Not.Null);
+            Assert.That(_parser.Items.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Parse()
+        {
+            _parser.Parse("à NUnit.UiException.TraceItem.get_Text() dans C:\\TraceItem.cs:ligne 43");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], 
+                Is.EqualTo(new ErrorItem("C:\\TraceItem.cs", "NUnit.UiException.TraceItem.get_Text()", 43)));
+
+            // TryParse should clear previous textFormatter
+
+            _parser.Parse("");
+            Assert.That(_parser.Items.Count, Is.EqualTo(0));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Parse_MultipleExtension()
+        {
+            _parser.Parse("à get_Text() dans C:\\TraceItem.cs.cs.cs.cs:ligne 43");
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0].Path, Is.EqualTo("C:\\TraceItem.cs.cs.cs.cs"));
+
+            _parser.Parse("à get_Text() dans C:\\my Document1\\my document2 containing space\\file.cs:line 1");
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0].Path,
+                Is.EqualTo("C:\\my Document1\\my document2 containing space\\file.cs"));
+
+            _parser.Parse("à get_Text() dans C:\\my doc\\my doc2.cs\\file.cs:line 1");
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0].Path,
+                Is.EqualTo("C:\\my doc\\my doc2.cs\\file.cs"));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Parse_With_Real_Life_Samples()
+        {
+            // test ability to extract one trace
+
+            _parser.Parse(
+                "à Test.TestTraceItem.Can_Set_Properties() dans " +
+                "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                "NUnit_Stacktrace\\Test\\TestTraceItem.cs:ligne 42\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0],
+                Is.EqualTo(new ErrorItem(
+                    "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                    "NUnit_Stacktrace\\Test\\TestTraceItem.cs",
+                    "Test.TestTraceItem.Can_Set_Properties()",
+                    42)));
+
+            // test ability to extract two traces
+
+            _parser.Parse(
+                "à NUnit.UiException.TraceItem.get_Text() " +
+                "dans C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                "NUnit.UiException\\TraceItem.cs:ligne 43\r\n" +
+                "à Test.TestTaggedText.SetUp() dans C:\\Documents and Settings\\" +
+                "ihottier\\Mes documents\\NUnit_Stacktrace\\Test\\TestTaggedText.cs:ligne 30\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(2));
+
+            Assert.That(_parser.Items[0],
+                Is.EqualTo(
+                new ErrorItem(
+                    "C:\\Documents and Settings\\ihottier\\Mes documents\\" +
+                    "NUnit.UiException\\TraceItem.cs",
+                    "NUnit.UiException.TraceItem.get_Text()",
+                    43)));
+
+            Assert.That(_parser.Items[1],
+                Is.EqualTo(
+                new ErrorItem(
+                    "C:\\Documents and Settings\\" +
+                    "ihottier\\Mes documents\\NUnit_Stacktrace\\Test\\TestTaggedText.cs",
+                    "Test.TestTaggedText.SetUp()",
+                    30)));
+
+            return;
+        }        
+
+        [Test]
+        public void Test_Trace_When_Missing_File()
+        {
+            //
+            // NUnit.UiException.Tests ability to not be confused
+            // if source code attachment is missing
+            //
+
+            _parser.Parse(
+                "à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)\r\n" +
+                "à NUnit.UiException.StackTraceParser.Parse(String stackTrace) dans C:\\StackTraceParser.cs:ligne 55\r\n" +
+                "à Test.TestStackTraceParser.Test_Parse() dans C:\\TestStackTraceParser.cs:ligne 36\r\n"
+                );
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(3));
+
+            Assert.That(_parser.Items[0].HasSourceAttachment, Is.False);
+            Assert.That(_parser.Items[0].FullyQualifiedMethodName,
+                Is.EqualTo("System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)"));
+
+            Assert.That(_parser.Items[1], 
+                Is.EqualTo(
+                    new ErrorItem(
+                        "C:\\StackTraceParser.cs",
+                        "NUnit.UiException.StackTraceParser.Parse(String stackTrace)",
+                        55)));
+            Assert.That(_parser.Items[2],
+                Is.EqualTo(
+                    new ErrorItem(
+                        "C:\\TestStackTraceParser.cs",
+                        "Test.TestStackTraceParser.Test_Parse()",
+                        36)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Missing_Line_Number()
+        {
+            //
+            // NUnit.UiException.Tests ability to not be confused
+            // if line number is missing
+            //
+
+            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() dans C:\\TestStackTraceParser.cs:\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], 
+                Is.EqualTo(new ErrorItem(
+                    "C:\\TestStackTraceParser.cs", 
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    0)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_English_Stack()
+        {
+            //
+            // NUnit.UiException.Tests ability of the parser to not depend
+            // of the language
+            //
+
+            _parser.Parse("at Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.cs:line 36\r\n");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem("C:\\TestStackTraceParser.cs", 
+                    "Test.TestStackTraceParser.Test_Parse()", 36)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Different_Path_System_Syntaxes()
+        {
+            //
+            // NUnit.UiException.Tests ability to not depend of one file system
+            //
+
+            // here, an hypothetic stack containing UNIX and Windows like filePath values...
+           
+            _parser.Parse(
+                "at Test.TestStackTraceParser.Test_Parse() in /home/ihottier/work/stacktrace/test/TestStackTraceParser.cs:line 36\r\n" +
+                "at Test.TestStackTraceParser2.Text_Parse2() in C:\\folder\\file1:line 42"
+                );
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(2));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem(
+                    "/home/ihottier/work/stacktrace/test/TestStackTraceParser.cs",
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    36)));
+            Assert.That(_parser.Items[1], Is.EqualTo(
+                new ErrorItem(
+                    "C:\\folder\\file1",
+                    "Test.TestStackTraceParser2.Text_Parse2()",
+                    42)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Ability_To_Handle_Files_With_Unknown_Extension()
+        {
+            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.vb:line 36");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem(
+                    "C:\\TestStackTraceParser.vb",
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    36)));
+
+            return;
+        }
+
+        [Test]
+        public void Test_Analysis_Does_Not_Depend_Upon_File_Extension()
+        {
+            //
+            // NUnit.UiException.Tests that Stack Analyzer should not
+            // be not aware of file language.
+            //
+
+            _parser.Parse("à Test.TestStackTraceParser.Test_Parse() in C:\\TestStackTraceParser.vb:line 36");
+
+            Assert.That(_parser.Items.Count, Is.EqualTo(1));
+            Assert.That(_parser.Items[0], Is.EqualTo(
+                new ErrorItem(
+                    "C:\\TestStackTraceParser.vb",
+                    "Test.TestStackTraceParser.Test_Parse()",
+                    36)));
+
+            return;
+        }
+               
+        [Test]
+        public void Test_Parse_Null()
+        {
+            _parser.Parse(null);
+        }
+    }
+}
diff --git a/src/GuiException/tests/data/Basic.cs b/src/GuiException/tests/data/Basic.cs
index 21ede19..6b70ecc 100644
--- a/src/GuiException/tests/data/Basic.cs
+++ b/src/GuiException/tests/data/Basic.cs
@@ -1,4 +1,4 @@
-namespace Demo.data
-{
-    class Basic { }
-}
+namespace Demo.data
+{
+    class Basic { }
+}
diff --git a/src/GuiException/tests/data/TestResource.cs b/src/GuiException/tests/data/TestResource.cs
index 817352d..2c1c8ee 100644
--- a/src/GuiException/tests/data/TestResource.cs
+++ b/src/GuiException/tests/data/TestResource.cs
@@ -1,14 +1,14 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace NUnit.UiException.Tests.data
-{
-    public class TestResource : NUnit.TestUtilities.TempResourceFile
-    {
-        public TestResource(string name) 
-            : base(typeof( TestResource ), name) 
-        {
-        }
-    }
-}
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace NUnit.UiException.Tests.data
+{
+    public class TestResource : NUnit.TestUtilities.TempResourceFile
+    {
+        public TestResource(string name) 
+            : base(typeof( TestResource ), name) 
+        {
+        }
+    }
+}
diff --git a/src/GuiException/tests/data/TextCode.txt b/src/GuiException/tests/data/TextCode.txt
index 2a47a45..aaf3a69 100644
--- a/src/GuiException/tests/data/TextCode.txt
+++ b/src/GuiException/tests/data/TextCode.txt
@@ -1,59 +1,59 @@
-01	#include <stdio.h>
-02	#include <stdlib.h>
-03	#include <string.h>
-04	#include <ctype.h>
-05	#include <time.h>
-06	#include <sys/types.h>
-07	#include <sys/stat.h>
-08
-09	/* logic */
-10	#ifndef TRUE
-11	# define TRUE 1
-12	#endif /* TRUE */
-13	#ifndef FALSE
-14	# define FALSE 0
-15	#endif /* FALSE */
-16	#define EOF_OK TRUE
-17	#define EOF_NOT_OK FALSE
-18
-19	/* global limits */
-20	#define RULE_YEAR 2004		/* NOTE: should match the current year */
-21	#define START_DATE "07Jan2004 00:00 UTC" /* first confirmation received */
-22	#define MAX_COL 79		/* max column a line should hit */
-23	#define MAX_BUILD_SIZE 521	/* max how to build size */
-24	#define MAX_PROGRAM_SIZE 4096	/* max program source size */
-25	#define MAX_PROGRAM_SIZE2 2048	/* max program source size not counting
-26					   whitespace and {}; not followed by
-27					   whitespace or EOF */
-28	#define MAX_TITLE_LEN 31	/* max chars in the title */
-29	#define MAX_ENTRY_LEN 1		/* max length in the entry input line */
-30	#define MAX_ENTRY 8		/* max number of entries per person per year */
-31	#define MAX_FILE_LEN 1024	/* max filename length for a info file */
-32
-33	/* where to send entries */
-34	#define ENTRY_USER "e.2004"
-35	#define ENTRY_HOST "ioccc.org"
-36
-37	/* uuencode process - assumes ASCII */
-38	#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`')
-39	#define UUENCODE_LEN 45		/* max uuencode chunk size */
-40	#define UUINFO_MODE 0444	/* mode of an info file's uuencode file */
-41	#define UUBUILD_MODE 0444	/* mode of the build file's uuencode file */
-42	#define UUBUILD_NAME "build"	/* name for the build file's uuencode file */
-43	#define UUPROG_MODE 0444	/* mode of the program's uuencode file */
-44	#define UUPROG_NAME "prog.c"	/* name for the program's uuencode file */
-45
-46	/* encode_str[(char)val] is the uuencoded character of val */
-47	char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
-48
-49	/* global declarations */
-50	char *program;			/* our name */
-51	long start_time;		/* the startup time */
-52
-53	/* forward declarations */
-54	void parse_args(int argc, char **argv, char **rname,
-55				char **bname, char **pname, char **oname);
-56	void usage(int exitval);
-57	FILE *open_remark(char *filename);
-58	FILE *open_build(char *filename);
+01	#include <stdio.h>
+02	#include <stdlib.h>
+03	#include <string.h>
+04	#include <ctype.h>
+05	#include <time.h>
+06	#include <sys/types.h>
+07	#include <sys/stat.h>
+08
+09	/* logic */
+10	#ifndef TRUE
+11	# define TRUE 1
+12	#endif /* TRUE */
+13	#ifndef FALSE
+14	# define FALSE 0
+15	#endif /* FALSE */
+16	#define EOF_OK TRUE
+17	#define EOF_NOT_OK FALSE
+18
+19	/* global limits */
+20	#define RULE_YEAR 2004		/* NOTE: should match the current year */
+21	#define START_DATE "07Jan2004 00:00 UTC" /* first confirmation received */
+22	#define MAX_COL 79		/* max column a line should hit */
+23	#define MAX_BUILD_SIZE 521	/* max how to build size */
+24	#define MAX_PROGRAM_SIZE 4096	/* max program source size */
+25	#define MAX_PROGRAM_SIZE2 2048	/* max program source size not counting
+26					   whitespace and {}; not followed by
+27					   whitespace or EOF */
+28	#define MAX_TITLE_LEN 31	/* max chars in the title */
+29	#define MAX_ENTRY_LEN 1		/* max length in the entry input line */
+30	#define MAX_ENTRY 8		/* max number of entries per person per year */
+31	#define MAX_FILE_LEN 1024	/* max filename length for a info file */
+32
+33	/* where to send entries */
+34	#define ENTRY_USER "e.2004"
+35	#define ENTRY_HOST "ioccc.org"
+36
+37	/* uuencode process - assumes ASCII */
+38	#define UUENCODE(c) ((c) ? encode_str[(int)(c)&0x3f] : '`')
+39	#define UUENCODE_LEN 45		/* max uuencode chunk size */
+40	#define UUINFO_MODE 0444	/* mode of an info file's uuencode file */
+41	#define UUBUILD_MODE 0444	/* mode of the build file's uuencode file */
+42	#define UUBUILD_NAME "build"	/* name for the build file's uuencode file */
+43	#define UUPROG_MODE 0444	/* mode of the program's uuencode file */
+44	#define UUPROG_NAME "prog.c"	/* name for the program's uuencode file */
+45
+46	/* encode_str[(char)val] is the uuencoded character of val */
+47	char encode_str[] = "`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
+48
+49	/* global declarations */
+50	char *program;			/* our name */
+51	long start_time;		/* the startup time */
+52
+53	/* forward declarations */
+54	void parse_args(int argc, char **argv, char **rname,
+55				char **bname, char **pname, char **oname);
+56	void usage(int exitval);
+57	FILE *open_remark(char *filename);
+58	FILE *open_build(char *filename);
 59	FILE *open_program(char *filename);
\ No newline at end of file
diff --git a/src/GuiException/tests/nunit.uiexception.tests.build b/src/GuiException/tests/nunit.uiexception.tests.build
index d0791cd..8c0b150 100644
--- a/src/GuiException/tests/nunit.uiexception.tests.build
+++ b/src/GuiException/tests/nunit.uiexception.tests.build
@@ -1,82 +1,82 @@
-<?xml version="1.0"?>
-<project name="NUnit.UiException.Tests" default="build" basedir=".">
-
-  <patternset id="source-files">
-    <include name="CodeFormatters/TestGeneralCodeFormatter.cs"/>
-    <include name="CodeFormatters/TestCodeFormatterCollection.cs"/>
-    <include name="CodeFormatters/TestPlainTextCodeFormatter.cs"/>
-    <include name="Controls/TestCodeBox.cs"/>
-    <include name="Controls/TestCodeRenderingContext.cs"/>
-    <include name="Controls/TestDefaultCodeRenderer.cs"/>
-    <include name="Controls/TestDefaultErrorListRenderer.cs"/>
-    <include name="Controls/TestErrorBrowser.cs"/>
-    <include name="Controls/TestErrorList.cs"/>
-    <include name="Controls/TestErrorPanelLayout.cs"/>
-    <include name="Controls/TestErrorToolbar.cs"/>
-    <include name="Controls/TestSourceCodeDisplay.cs"/>
-    <include name="Controls/TestSplitterBox.cs"/>
-    <include name="Controls/TestStackTraceDisplay.cs"/>
-    <include name="CSharpParser/TestCSCode.cs"/>
-    <include name="CSharpParser/TestCSParser.cs"/>
-    <include name="CSharpParser/TestLexer.cs"/>
-    <include name="CSharpParser/TestToken.cs"/>
-    <include name="CSharpParser/TestTokenClassifier.cs"/>
-    <include name="CSharpParser/TestTokenDictionary.cs"/>
-    <include name="data/TestResource.cs"/>
-    <include name="StackTraceAnalysers/TestFunctionParser.cs"/>
-    <include name="StackTraceAnalysers/TestIErrorParser.cs"/>
-    <include name="StackTraceAnalysers/TestLineNumberParser.cs"/>
-    <include name="StackTraceAnalysers/TestPathParser.cs"/>
-    <include name="StackTraceAnalysers/TestUnixPathParser.cs"/>
-    <include name="StackTraceAnalysers/TestWindowsPathParser.cs"/>
-    <include name="MockHelper.cs"/>
-    <include name="TestDefaultTextManager.cs"/>
-    <include name="TestExceptionItem.cs"/>
-    <include name="TestExceptionItemCollection.cs"/>
-    <include name="TestPaintLineLocation.cs"/>
-    <include name="TestStackTraceParser.cs"/>
-  </patternset>
-
-  <patternset id="resource-files">
-    <include name="data/HelloWorld.txt"/>
-    <include name="data/TextCode.txt"/>
-    <include name="data/Basic.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/nunit.uiexception.tests.dll" 
-        debug="${build.debug}" define="${build.defines}"
-        if="${runtime.version >= '2.0'}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <resources prefix="NUnit.UiException.Tests.data">
-        <patternset refid="resource-files"/>
-      </resources>
-      <references>
-        <include name="System.dll"/>
-        <include name="System.Drawing.dll"/>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.framework.dir}/nunit.mocks.dll"/>
-        <include name="${current.lib.dir}/nunit.uiexception.dll"/>
-        <include name="${current.lib.dir}/NSubstitute.dll" if="${runtime.version >= '3.5'}"/>
-        <include name="${current.test.dir}/test-utilities.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiException/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <include name="nunit.uiexception.tests.csproj"/>
-        <include name="nunit.uiexception.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnit.UiException.Tests" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="CodeFormatters/TestGeneralCodeFormatter.cs"/>
+    <include name="CodeFormatters/TestCodeFormatterCollection.cs"/>
+    <include name="CodeFormatters/TestPlainTextCodeFormatter.cs"/>
+    <include name="Controls/TestCodeBox.cs"/>
+    <include name="Controls/TestCodeRenderingContext.cs"/>
+    <include name="Controls/TestDefaultCodeRenderer.cs"/>
+    <include name="Controls/TestDefaultErrorListRenderer.cs"/>
+    <include name="Controls/TestErrorBrowser.cs"/>
+    <include name="Controls/TestErrorList.cs"/>
+    <include name="Controls/TestErrorPanelLayout.cs"/>
+    <include name="Controls/TestErrorToolbar.cs"/>
+    <include name="Controls/TestSourceCodeDisplay.cs"/>
+    <include name="Controls/TestSplitterBox.cs"/>
+    <include name="Controls/TestStackTraceDisplay.cs"/>
+    <include name="CSharpParser/TestCSCode.cs"/>
+    <include name="CSharpParser/TestCSParser.cs"/>
+    <include name="CSharpParser/TestLexer.cs"/>
+    <include name="CSharpParser/TestToken.cs"/>
+    <include name="CSharpParser/TestTokenClassifier.cs"/>
+    <include name="CSharpParser/TestTokenDictionary.cs"/>
+    <include name="data/TestResource.cs"/>
+    <include name="StackTraceAnalysers/TestFunctionParser.cs"/>
+    <include name="StackTraceAnalysers/TestIErrorParser.cs"/>
+    <include name="StackTraceAnalysers/TestLineNumberParser.cs"/>
+    <include name="StackTraceAnalysers/TestPathParser.cs"/>
+    <include name="StackTraceAnalysers/TestUnixPathParser.cs"/>
+    <include name="StackTraceAnalysers/TestWindowsPathParser.cs"/>
+    <include name="MockHelper.cs"/>
+    <include name="TestDefaultTextManager.cs"/>
+    <include name="TestExceptionItem.cs"/>
+    <include name="TestExceptionItemCollection.cs"/>
+    <include name="TestPaintLineLocation.cs"/>
+    <include name="TestStackTraceParser.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="data/HelloWorld.txt"/>
+    <include name="data/TextCode.txt"/>
+    <include name="data/Basic.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit.uiexception.tests.dll" 
+        debug="${build.debug}" define="${build.defines}"
+        if="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <resources prefix="NUnit.UiException.Tests.data">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.mocks.dll"/>
+        <include name="${current.lib.dir}/nunit.uiexception.dll"/>
+        <include name="${current.lib.dir}/NSubstitute.dll" if="${runtime.version >= '3.5'}"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiException/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.uiexception.tests.csproj"/>
+        <include name="nunit.uiexception.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/GuiException/tests/nunit.uiexception.tests.csproj b/src/GuiException/tests/nunit.uiexception.tests.csproj
index 2704a5f..a81a95c 100644
--- a/src/GuiException/tests/nunit.uiexception.tests.csproj
+++ b/src/GuiException/tests/nunit.uiexception.tests.csproj
@@ -1,117 +1,151 @@
-<?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>{092486D0-6AB9-4134-932F-0FDA10704455}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.UiException.Tests</RootNamespace>
-    <AssemblyName>nunit.uiexception.tests</AssemblyName>
-    <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>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.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="..\..\tests\test-utilities\test-utilities.csproj">
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-      <Name>test-utilities</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\UiException\nunit.uiexception.dll.csproj">
-      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
-      <Name>nunit.uiexception.dll</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="CodeFormatters\TestCodeFormatterCollection.cs" />
-    <Compile Include="CodeFormatters\TestGeneralCodeFormatter.cs" />
-    <Compile Include="CodeFormatters\TestPlainTextCodeFormatter.cs" />
-    <Compile Include="Controls\TestCodeBox.cs" />
-    <Compile Include="Controls\TestCodeRenderingContext.cs" />
-    <Compile Include="Controls\TestDefaultCodeRenderer.cs" />
-    <Compile Include="Controls\TestDefaultErrorListRenderer.cs" />
-    <Compile Include="Controls\TestErrorBrowser.cs" />
-    <Compile Include="Controls\TestErrorList.cs" />
-    <Compile Include="Controls\TestErrorPanelLayout.cs" />
-    <Compile Include="Controls\TestErrorToolbar.cs" />
-    <Compile Include="Controls\TestSourceCodeDisplay.cs" />
-    <Compile Include="Controls\TestSplitterBox.cs" />
-    <Compile Include="Controls\TestStackTraceDisplay.cs" />
-    <Compile Include="CSharpParser\TestCSCode.cs" />
-    <Compile Include="CSharpParser\TestCSParser.cs" />
-    <Compile Include="CSharpParser\TestLexer.cs" />
-    <Compile Include="CSharpParser\TestToken.cs" />
-    <Compile Include="CSharpParser\TestTokenClassifier.cs" />
-    <Compile Include="CSharpParser\TestTokenDictionary.cs" />
-    <EmbeddedResource Include="data\Basic.cs" />
-    <Compile Include="data\TestResource.cs" />
-    <Compile Include="StackTraceAnalysers\TestFunctionParser.cs" />
-    <Compile Include="StackTraceAnalysers\TestIErrorParser.cs" />
-    <Compile Include="StackTraceAnalysers\TestLineNumberParser.cs" />
-    <Compile Include="StackTraceAnalysers\TestPathParser.cs" />
-    <Compile Include="StackTraceAnalysers\TestUnixPathParser.cs" />
-    <Compile Include="StackTraceAnalysers\TestWindowsPathParser.cs" />
-    <Compile Include="TestDefaultTextManager.cs" />
-    <Compile Include="TestExceptionItem.cs" />
-    <Compile Include="TestExceptionItemCollection.cs" />
-    <Compile Include="TestPaintLineLocation.cs" />
-    <Compile Include="TestStackTraceParser.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="data\HelloWorld.txt" />
-    <EmbeddedResource Include="data\TextCode.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.uiexception.tests.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" 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>{092486D0-6AB9-4134-932F-0FDA10704455}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.UiException.Tests</RootNamespace>
+    <AssemblyName>nunit.uiexception.tests</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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="..\..\tests\test-utilities\test-utilities.csproj">
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+      <Name>test-utilities</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CodeFormatters\TestCodeFormatterCollection.cs" />
+    <Compile Include="CodeFormatters\TestGeneralCodeFormatter.cs" />
+    <Compile Include="CodeFormatters\TestPlainTextCodeFormatter.cs" />
+    <Compile Include="Controls\TestCodeBox.cs" />
+    <Compile Include="Controls\TestCodeRenderingContext.cs" />
+    <Compile Include="Controls\TestDefaultCodeRenderer.cs" />
+    <Compile Include="Controls\TestDefaultErrorListRenderer.cs" />
+    <Compile Include="Controls\TestErrorBrowser.cs" />
+    <Compile Include="Controls\TestErrorList.cs" />
+    <Compile Include="Controls\TestErrorPanelLayout.cs" />
+    <Compile Include="Controls\TestErrorToolbar.cs" />
+    <Compile Include="Controls\TestSourceCodeDisplay.cs" />
+    <Compile Include="Controls\TestSplitterBox.cs" />
+    <Compile Include="Controls\TestStackTraceDisplay.cs" />
+    <Compile Include="CSharpParser\TestCSCode.cs" />
+    <Compile Include="CSharpParser\TestCSParser.cs" />
+    <Compile Include="CSharpParser\TestLexer.cs" />
+    <Compile Include="CSharpParser\TestToken.cs" />
+    <Compile Include="CSharpParser\TestTokenClassifier.cs" />
+    <Compile Include="CSharpParser\TestTokenDictionary.cs" />
+    <EmbeddedResource Include="data\Basic.cs" />
+    <Compile Include="data\TestResource.cs" />
+    <Compile Include="StackTraceAnalysers\TestFunctionParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestIErrorParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestLineNumberParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestPathParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestUnixPathParser.cs" />
+    <Compile Include="StackTraceAnalysers\TestWindowsPathParser.cs" />
+    <Compile Include="TestDefaultTextManager.cs" />
+    <Compile Include="TestExceptionItem.cs" />
+    <Compile Include="TestExceptionItemCollection.cs" />
+    <Compile Include="TestPaintLineLocation.cs" />
+    <Compile Include="TestStackTraceParser.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="data\HelloWorld.txt" />
+    <EmbeddedResource Include="data\TextCode.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.uiexception.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
 </Project>
\ No newline at end of file
diff --git a/src/GuiException/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/GuiException/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..7fe38b5
Binary files /dev/null and b/src/GuiException/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.csproj.FileListAbsolute.txt b/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..135fa45
--- /dev/null
+++ b/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.uiexception.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.uiexception.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\tests\obj\Debug\nunit.uiexception.tests.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\tests\obj\Debug\nunit.uiexception.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\GuiException\tests\obj\Debug\nunit.uiexception.tests.pdb
diff --git a/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.csprojResolveAssemblyReference.cache b/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..7c25f9e
Binary files /dev/null and b/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.pdb b/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.pdb
new file mode 100644
index 0000000..efdc99c
Binary files /dev/null and b/src/GuiException/tests/obj/Debug/nunit.uiexception.tests.pdb differ
diff --git a/src/GuiRunner/nunit-gui-exe/App.config b/src/GuiRunner/nunit-gui-exe/App.config
index 7bd69c5..9301f94 100644
--- a/src/GuiRunner/nunit-gui-exe/App.config
+++ b/src/GuiRunner/nunit-gui-exe/App.config
@@ -1,30 +1,23 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <!--
-   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>
-    <!-- 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>
-
-  </runtime>
-
-</configuration>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+	<!--
+   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 -->
+	</startup>
+	<runtime>
+		<!-- 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>
+	</runtime>
+</configuration>
diff --git a/src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs b/src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs
index 859afe5..f522c80 100644
--- a/src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs
+++ b/src/GuiRunner/nunit-gui-exe/AssemblyInfo.cs
@@ -1,5 +1,5 @@
-using System;
-using System.Reflection;
-
-[assembly: AssemblyTitle("NUnit")]
+using System;
+using System.Reflection;
+
+[assembly: AssemblyTitle("NUnit")]
 [assembly: AssemblyDescription("")]
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/Class1.cs b/src/GuiRunner/nunit-gui-exe/Class1.cs
index 88576c5..18c767f 100644
--- a/src/GuiRunner/nunit-gui-exe/Class1.cs
+++ b/src/GuiRunner/nunit-gui-exe/Class1.cs
@@ -1,24 +1,24 @@
-// ****************************************************************
-// Copyright 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.Gui
-{
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	public class Class1
-	{
-		/// <summary>
-		/// The main entry point for the application.
-		/// </summary>
-		[STAThread]
-		public static int Main(string[] args)
-		{
-			return NUnit.Gui.AppEntry.Main( args );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Gui
+{
+	/// <summary>
+	/// Summary description for Class1.
+	/// </summary>
+	public class Class1
+	{
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		public static int Main(string[] args)
+		{
+			return NUnit.Gui.AppEntry.Main( args );
+		}
+	}
+}
diff --git a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
index f56a298..4640141 100644
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
+++ b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.build
@@ -1,58 +1,58 @@
-<?xml version="1.0"?>
-<project name="NUnitGuiExe" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="Class1.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="winexe" 
-        output="${current.build.dir}/nunit.exe" 
-        win32icon="App.ico" debug="${build.debug}"
-        define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.lib.dir}">
-        <include name="nunit-gui-runner.dll"/>
-        <include name="nunit.core.dll"/>
-      </references>
-    </csc>
-
-    <copy file="App.config"
-      tofile="${current.build.dir}/nunit.exe.config"/>
-
-    <csc target="winexe" 
-        output="${current.build.dir}/nunit-x86.exe" 
-        win32icon="App.ico" debug="${build.debug}"
-        define="${build.defines}" platform="x86" 
-        if="${runtime.version >= '2.0'}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.lib.dir}">
-        <include name="nunit-gui-runner.dll"/>
-        <include name="nunit.core.dll"/>
-      </references>
-    </csc>
-
-    <copy file="App.config" if="${runtime.version >='2.0'}"
-      tofile="${current.build.dir}/nunit-x86.exe.config"/>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiRunner/nunit-gui-exe">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit-gui.exe.csproj"/>
-        <include name="nunit-gui.exe.build"/>
-        <include name="App.ico"/>
-        <include name="App.config"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitGuiExe" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Class1.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit.exe" 
+        win32icon="App.ico" debug="${build.debug}"
+        define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="nunit-gui-runner.dll"/>
+        <include name="nunit.core.dll"/>
+      </references>
+    </csc>
+
+    <copy file="App.config"
+      tofile="${current.build.dir}/nunit.exe.config"/>
+
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit-x86.exe" 
+        win32icon="App.ico" debug="${build.debug}"
+        define="${build.defines}" platform="x86" 
+        if="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="nunit-gui-runner.dll"/>
+        <include name="nunit.core.dll"/>
+      </references>
+    </csc>
+
+    <copy file="App.config" if="${runtime.version >='2.0'}"
+      tofile="${current.build.dir}/nunit-x86.exe.config"/>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiRunner/nunit-gui-exe">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit-gui.exe.csproj"/>
+        <include name="nunit-gui.exe.build"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
index d715a27..c830839 100644
--- a/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
+++ b/src/GuiRunner/nunit-gui-exe/nunit-gui.exe.csproj
@@ -1,143 +1,155 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{AAB186A4-FA3D-404D-AD78-7EB5BB861655}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>WinExe</OutputType>
-    <RootNamespace>NUnit.Gui</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <PublishUrl>http://localhost/nunit/</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Web</InstallFrom>
-    <UpdateEnabled>true</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <IsWebBootstrapper>true</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-    <TargetZone>LocalIntranet</TargetZone>
-    <GenerateManifests>false</GenerateManifests>
-    <NoWin32Manifest>true</NoWin32Manifest>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Configuration" />
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-gui\nunit-gui.csproj">
-      <Name>nunit-gui</Name>
-      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="Class1.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </None>
-    <None Include="nunit-gui.exe.build" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="App.ico" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{AAB186A4-FA3D-404D-AD78-7EB5BB861655}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>NUnit.Gui</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <TargetZone>LocalIntranet</TargetZone>
+    <GenerateManifests>false</GenerateManifests>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>http://localhost/nunit/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-gui\nunit-gui.csproj">
+      <Name>nunit-gui</Name>
+      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <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>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Class1.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="nunit-gui.exe.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="App.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui-exe/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/GuiRunner/nunit-gui-exe/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..8b2126e
Binary files /dev/null and b/src/GuiRunner/nunit-gui-exe/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit-gui.exe.csproj.FileListAbsolute.txt b/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit-gui.exe.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..cc93c68
--- /dev/null
+++ b/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit-gui.exe.csproj.FileListAbsolute.txt
@@ -0,0 +1,7 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\App.config
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\nunit.exe.config
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\nunit.exe
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\nunit.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui-exe\obj\Debug\nunit-gui.exe.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui-exe\obj\Debug\nunit.exe
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui-exe\obj\Debug\nunit.pdb
diff --git a/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit-gui.exe.csprojResolveAssemblyReference.cache b/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit-gui.exe.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..e7bba4b
Binary files /dev/null and b/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit-gui.exe.csprojResolveAssemblyReference.cache differ
diff --git a/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit.pdb b/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit.pdb
new file mode 100644
index 0000000..27fcdc9
Binary files /dev/null and b/src/GuiRunner/nunit-gui-exe/obj/Debug/nunit.pdb differ
diff --git a/src/GuiRunner/nunit-gui/AboutBox.cs b/src/GuiRunner/nunit-gui/AboutBox.cs
index b8c42bd..0f6eaf1 100644
--- a/src/GuiRunner/nunit-gui/AboutBox.cs
+++ b/src/GuiRunner/nunit-gui/AboutBox.cs
@@ -1,261 +1,261 @@
-// ****************************************************************
-// 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.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-using System.Reflection;
-
-namespace NUnit.Gui
-{
-	public class AboutBox : System.Windows.Forms.Form
-	{
-		private System.Windows.Forms.Button OkButton;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Label versionLabel;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.Label label3;
-		private System.Windows.Forms.LinkLabel linkLabel1;
-		private System.Windows.Forms.Label label4;
-		private System.Windows.Forms.Label label5;
-		private System.Windows.Forms.Label label6;
-		private System.Windows.Forms.Label label7;
-		private System.Windows.Forms.Label copyright;
-		private System.Windows.Forms.Label dotNetVersionLabel;
-		private System.Windows.Forms.Label clrTypeLabel;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public AboutBox()
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			Assembly executingAssembly = Assembly.GetExecutingAssembly();
-			string versionText = executingAssembly.GetName().Version.ToString();
-
-            object [] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
-            if ( objectAttrs.Length > 0 )
-				versionText = ((AssemblyInformationalVersionAttribute)objectAttrs[0]).InformationalVersion;
-
-			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
-			if ( objectAttrs.Length > 0 )
-			{
-				string configText = ((AssemblyConfigurationAttribute)objectAttrs[0]).Configuration;
-                if ( configText != "" )
-				    versionText += string.Format(" ({0})",configText);
-			}
-			
-			string copyrightText = "Copyright (C) 2002-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 = NUnit.Core.RuntimeFramework.CurrentFramework.DisplayName;
-		}
-
-		/// <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.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
-
-		private void button1_Click(object sender, System.EventArgs e)
-		{
-			this.Close();
-		}
-
-		private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
-		{
-			System.Diagnostics.Process.Start("http://nunit.org");
-			linkLabel1.LinkVisited = true;
-        }
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace NUnit.Gui
+{
+	public class AboutBox : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Button OkButton;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label versionLabel;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.LinkLabel linkLabel1;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.Label label5;
+		private System.Windows.Forms.Label label6;
+		private System.Windows.Forms.Label label7;
+		private System.Windows.Forms.Label copyright;
+		private System.Windows.Forms.Label dotNetVersionLabel;
+		private System.Windows.Forms.Label clrTypeLabel;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public AboutBox()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			Assembly executingAssembly = Assembly.GetExecutingAssembly();
+			string versionText = executingAssembly.GetName().Version.ToString();
+
+            object [] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
+            if ( objectAttrs.Length > 0 )
+				versionText = ((AssemblyInformationalVersionAttribute)objectAttrs[0]).InformationalVersion;
+
+			objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
+			if ( objectAttrs.Length > 0 )
+			{
+				string configText = ((AssemblyConfigurationAttribute)objectAttrs[0]).Configuration;
+                if ( configText != "" )
+				    versionText += string.Format(" ({0})",configText);
+			}
+			
+			string copyrightText = "Copyright (C) 2002-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 = NUnit.Core.RuntimeFramework.CurrentFramework.DisplayName;
+		}
+
+		/// <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.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
+
+		private void button1_Click(object sender, System.EventArgs e)
+		{
+			this.Close();
+		}
+
+		private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
+		{
+			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 45ab8da..6a8ab4f 100644
--- a/src/GuiRunner/nunit-gui/AboutBox.resx
+++ b/src/GuiRunner/nunit-gui/AboutBox.resx
@@ -1,143 +1,143 @@
-<?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="$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>
+<?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="$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/AddinDialog.cs b/src/GuiRunner/nunit-gui/AddinDialog.cs
index ca86c7f..6844a4b 100644
--- a/src/GuiRunner/nunit-gui/AddinDialog.cs
+++ b/src/GuiRunner/nunit-gui/AddinDialog.cs
@@ -1,226 +1,226 @@
-// ****************************************************************
-// Copyright 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.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Gui
-{
-	/// <summary>
-	/// Summary description for AddinDialog.
-	/// </summary>
-	public class AddinDialog : System.Windows.Forms.Form
-	{
-		private IList addins;
-
-		private System.Windows.Forms.TextBox descriptionTextBox;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Button button1;
-		private System.Windows.Forms.ListView addinListView;
-		private System.Windows.Forms.ColumnHeader addinNameColumn;
-		private System.Windows.Forms.ColumnHeader addinStatusColumn;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.TextBox messageTextBox;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-
-		public AddinDialog()
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Windows Form Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AddinDialog));
-			this.addinListView = new System.Windows.Forms.ListView();
-			this.addinNameColumn = new System.Windows.Forms.ColumnHeader();
-			this.addinStatusColumn = new System.Windows.Forms.ColumnHeader();
-			this.descriptionTextBox = new System.Windows.Forms.TextBox();
-			this.label1 = new System.Windows.Forms.Label();
-			this.button1 = new System.Windows.Forms.Button();
-			this.label2 = new System.Windows.Forms.Label();
-			this.messageTextBox = new System.Windows.Forms.TextBox();
-			this.SuspendLayout();
-			// 
-			// addinListView
-			// 
-			this.addinListView.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.addinListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-																							this.addinNameColumn,
-																							this.addinStatusColumn});
-			this.addinListView.FullRowSelect = true;
-			this.addinListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
-			this.addinListView.Location = new System.Drawing.Point(8, 8);
-			this.addinListView.MultiSelect = false;
-			this.addinListView.Name = "addinListView";
-			this.addinListView.Size = new System.Drawing.Size(448, 136);
-			this.addinListView.TabIndex = 0;
-			this.addinListView.View = System.Windows.Forms.View.Details;
-			this.addinListView.Resize += new System.EventHandler(this.addinListView_Resize);
-			this.addinListView.SelectedIndexChanged += new System.EventHandler(this.addinListView_SelectedIndexChanged);
-			// 
-			// addinNameColumn
-			// 
-			this.addinNameColumn.Text = "Addin";
-			this.addinNameColumn.Width = 352;
-			// 
-			// addinStatusColumn
-			// 
-			this.addinStatusColumn.Text = "Status";
-			this.addinStatusColumn.Width = 89;
-			// 
-			// descriptionTextBox
-			// 
-			this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.descriptionTextBox.Location = new System.Drawing.Point(8, 184);
-			this.descriptionTextBox.Multiline = true;
-			this.descriptionTextBox.Name = "descriptionTextBox";
-			this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-			this.descriptionTextBox.Size = new System.Drawing.Size(448, 56);
-			this.descriptionTextBox.TabIndex = 1;
-			this.descriptionTextBox.Text = "";
-			// 
-			// label1
-			// 
-			this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-			this.label1.Location = new System.Drawing.Point(8, 160);
-			this.label1.Name = "label1";
-			this.label1.Size = new System.Drawing.Size(304, 16);
-			this.label1.TabIndex = 2;
-			this.label1.Text = "Description:";
-			// 
-			// button1
-			// 
-			this.button1.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
-			this.button1.Location = new System.Drawing.Point(192, 344);
-			this.button1.Name = "button1";
-			this.button1.TabIndex = 3;
-			this.button1.Text = "OK";
-			this.button1.Click += new System.EventHandler(this.button1_Click);
-			// 
-			// label2
-			// 
-			this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-			this.label2.Location = new System.Drawing.Point(8, 256);
-			this.label2.Name = "label2";
-			this.label2.Size = new System.Drawing.Size(304, 16);
-			this.label2.TabIndex = 5;
-			this.label2.Text = " Message:";
-			// 
-			// messageTextBox
-			// 
-			this.messageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.messageTextBox.Location = new System.Drawing.Point(8, 280);
-			this.messageTextBox.Multiline = true;
-			this.messageTextBox.Name = "messageTextBox";
-			this.messageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-			this.messageTextBox.Size = new System.Drawing.Size(448, 56);
-			this.messageTextBox.TabIndex = 4;
-			this.messageTextBox.Text = "";
-			// 
-			// AddinDialog
-			// 
-			this.ClientSize = new System.Drawing.Size(464, 376);
-			this.Controls.Add(this.label2);
-			this.Controls.Add(this.messageTextBox);
-			this.Controls.Add(this.button1);
-			this.Controls.Add(this.label1);
-			this.Controls.Add(this.descriptionTextBox);
-			this.Controls.Add(this.addinListView);
-			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-			this.Name = "AddinDialog";
-			this.ShowInTaskbar = false;
-			this.Text = "Registered Addins";
-			this.Load += new System.EventHandler(this.AddinDialog_Load);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void AddinDialog_Load(object sender, System.EventArgs e)
-		{
-			this.addins = NUnit.Util.Services.AddinRegistry.Addins;
-
-			foreach( Addin addin in addins )
-			{
-				ListViewItem item = new ListViewItem( 
-					new string[] { addin.Name, addin.Status.ToString() } );
-				addinListView.Items.Add( item );
-			}
-
-			if ( addinListView.Items.Count > 0 )
-				addinListView.Items[0].Selected = true;
-
-			AutoSizeFirstColumnOfListView();
-		}
-
-		private void button1_Click(object sender, System.EventArgs e)
-		{
-			this.Close();
-		}
-
-		private void addinListView_SelectedIndexChanged(object sender, System.EventArgs e)
-		{
-			if ( addinListView.SelectedIndices.Count > 0 )
-			{
-				int index = addinListView.SelectedIndices[0];
-				Addin addin = (Addin)addins[index];
-				this.descriptionTextBox.Text = addin.Description;
-				this.messageTextBox.Text = addin.Message;
-			}
-		}
-
-		private void addinListView_Resize(object sender, System.EventArgs e)
-		{
-			AutoSizeFirstColumnOfListView();
-		}
-
-		private void AutoSizeFirstColumnOfListView()
-		{
-			int width = addinListView.ClientSize.Width;
-			for( int i = 1; i < addinListView.Columns.Count; i++ )
-				width -= addinListView.Columns[i].Width;
-			addinListView.Columns[0].Width = width;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using NUnit.Core;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Gui
+{
+	/// <summary>
+	/// Summary description for AddinDialog.
+	/// </summary>
+	public class AddinDialog : System.Windows.Forms.Form
+	{
+		private IList addins;
+
+		private System.Windows.Forms.TextBox descriptionTextBox;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Button button1;
+		private System.Windows.Forms.ListView addinListView;
+		private System.Windows.Forms.ColumnHeader addinNameColumn;
+		private System.Windows.Forms.ColumnHeader addinStatusColumn;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.TextBox messageTextBox;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public AddinDialog()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AddinDialog));
+			this.addinListView = new System.Windows.Forms.ListView();
+			this.addinNameColumn = new System.Windows.Forms.ColumnHeader();
+			this.addinStatusColumn = new System.Windows.Forms.ColumnHeader();
+			this.descriptionTextBox = new System.Windows.Forms.TextBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.button1 = new System.Windows.Forms.Button();
+			this.label2 = new System.Windows.Forms.Label();
+			this.messageTextBox = new System.Windows.Forms.TextBox();
+			this.SuspendLayout();
+			// 
+			// addinListView
+			// 
+			this.addinListView.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.addinListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+																							this.addinNameColumn,
+																							this.addinStatusColumn});
+			this.addinListView.FullRowSelect = true;
+			this.addinListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+			this.addinListView.Location = new System.Drawing.Point(8, 8);
+			this.addinListView.MultiSelect = false;
+			this.addinListView.Name = "addinListView";
+			this.addinListView.Size = new System.Drawing.Size(448, 136);
+			this.addinListView.TabIndex = 0;
+			this.addinListView.View = System.Windows.Forms.View.Details;
+			this.addinListView.Resize += new System.EventHandler(this.addinListView_Resize);
+			this.addinListView.SelectedIndexChanged += new System.EventHandler(this.addinListView_SelectedIndexChanged);
+			// 
+			// addinNameColumn
+			// 
+			this.addinNameColumn.Text = "Addin";
+			this.addinNameColumn.Width = 352;
+			// 
+			// addinStatusColumn
+			// 
+			this.addinStatusColumn.Text = "Status";
+			this.addinStatusColumn.Width = 89;
+			// 
+			// descriptionTextBox
+			// 
+			this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.descriptionTextBox.Location = new System.Drawing.Point(8, 184);
+			this.descriptionTextBox.Multiline = true;
+			this.descriptionTextBox.Name = "descriptionTextBox";
+			this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+			this.descriptionTextBox.Size = new System.Drawing.Size(448, 56);
+			this.descriptionTextBox.TabIndex = 1;
+			this.descriptionTextBox.Text = "";
+			// 
+			// label1
+			// 
+			this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+			this.label1.Location = new System.Drawing.Point(8, 160);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(304, 16);
+			this.label1.TabIndex = 2;
+			this.label1.Text = "Description:";
+			// 
+			// button1
+			// 
+			this.button1.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+			this.button1.Location = new System.Drawing.Point(192, 344);
+			this.button1.Name = "button1";
+			this.button1.TabIndex = 3;
+			this.button1.Text = "OK";
+			this.button1.Click += new System.EventHandler(this.button1_Click);
+			// 
+			// label2
+			// 
+			this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+			this.label2.Location = new System.Drawing.Point(8, 256);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(304, 16);
+			this.label2.TabIndex = 5;
+			this.label2.Text = " Message:";
+			// 
+			// messageTextBox
+			// 
+			this.messageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.messageTextBox.Location = new System.Drawing.Point(8, 280);
+			this.messageTextBox.Multiline = true;
+			this.messageTextBox.Name = "messageTextBox";
+			this.messageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+			this.messageTextBox.Size = new System.Drawing.Size(448, 56);
+			this.messageTextBox.TabIndex = 4;
+			this.messageTextBox.Text = "";
+			// 
+			// AddinDialog
+			// 
+			this.ClientSize = new System.Drawing.Size(464, 376);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.messageTextBox);
+			this.Controls.Add(this.button1);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.descriptionTextBox);
+			this.Controls.Add(this.addinListView);
+			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+			this.Name = "AddinDialog";
+			this.ShowInTaskbar = false;
+			this.Text = "Registered Addins";
+			this.Load += new System.EventHandler(this.AddinDialog_Load);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void AddinDialog_Load(object sender, System.EventArgs e)
+		{
+			this.addins = NUnit.Util.Services.AddinRegistry.Addins;
+
+			foreach( Addin addin in addins )
+			{
+				ListViewItem item = new ListViewItem( 
+					new string[] { addin.Name, addin.Status.ToString() } );
+				addinListView.Items.Add( item );
+			}
+
+			if ( addinListView.Items.Count > 0 )
+				addinListView.Items[0].Selected = true;
+
+			AutoSizeFirstColumnOfListView();
+		}
+
+		private void button1_Click(object sender, System.EventArgs e)
+		{
+			this.Close();
+		}
+
+		private void addinListView_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			if ( addinListView.SelectedIndices.Count > 0 )
+			{
+				int index = addinListView.SelectedIndices[0];
+				Addin addin = (Addin)addins[index];
+				this.descriptionTextBox.Text = addin.Description;
+				this.messageTextBox.Text = addin.Message;
+			}
+		}
+
+		private void addinListView_Resize(object sender, System.EventArgs e)
+		{
+			AutoSizeFirstColumnOfListView();
+		}
+
+		private void AutoSizeFirstColumnOfListView()
+		{
+			int width = addinListView.ClientSize.Width;
+			for( int i = 1; i < addinListView.Columns.Count; i++ )
+				width -= addinListView.Columns[i].Width;
+			addinListView.Columns[0].Width = width;
+		}
+	}
+}
diff --git a/src/GuiRunner/nunit-gui/AddinDialog.resx b/src/GuiRunner/nunit-gui/AddinDialog.resx
index 967d4c0..59effd8 100644
--- a/src/GuiRunner/nunit-gui/AddinDialog.resx
+++ b/src/GuiRunner/nunit-gui/AddinDialog.resx
@@ -1,218 +1,218 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="addinListView.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="addinListView.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinListView.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinNameColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinNameColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinStatusColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="addinStatusColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="descriptionTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="descriptionTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="descriptionTextBox.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="button1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="button1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="button1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</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.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</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="messageTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="messageTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="messageTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Name">
-    <value>AddinDialog</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
-        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="addinListView.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="addinListView.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addinListView.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addinNameColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addinNameColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addinStatusColumn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="addinStatusColumn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="descriptionTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="descriptionTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="descriptionTextBox.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="button1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="button1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="button1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</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.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</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="messageTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="messageTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="messageTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Name">
+    <value>AddinDialog</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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/AppEntry.cs b/src/GuiRunner/nunit-gui/AppEntry.cs
index ad997b6..a917db6 100644
--- a/src/GuiRunner/nunit-gui/AppEntry.cs
+++ b/src/GuiRunner/nunit-gui/AppEntry.cs
@@ -1,150 +1,150 @@
-// ****************************************************************
-// 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.Globalization;
-using System.IO;
-using System.Text;
-using System.Threading;
-using System.Windows.Forms;
-using NUnit.UiKit;
-using NUnit.Util;
-using NUnit.Core;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Gui
-{
-    /// <summary>
-    /// Class to manage application startup.
-    /// </summary>
-    public class AppEntry
-    {
-        static Logger log = InternalTrace.GetLogger(typeof(AppEntry));
-
-        /// <summary>
-        /// The main entry point for the application.
-        /// </summary>
-        [STAThread]
-        public static int Main(string[] args)
-        {
-            // Create SettingsService early so we know the trace level right at the start
-            SettingsService settingsService = new SettingsService();
-            InternalTrace.Initialize("nunit-gui_%p.log", (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default));
-
-            log.Info("Starting NUnit GUI");
-
-            GuiOptions guiOptions = new GuiOptions(args);
-
-            GuiAttachedConsole attachedConsole = null;
-            if (guiOptions.console)
-            {
-                log.Info("Creating attached console");
-                attachedConsole = new GuiAttachedConsole();
-            }
-
-            if (guiOptions.help)
-            {
-                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;
-            }
-
-            if (guiOptions.cleanup)
-            {
-                log.Info("Performing cleanup of shadow copy cache");
-                DomainManager.DeleteShadowCopyPath();
-                return 0;
-            }
-
-            if (!guiOptions.NoArgs)
-            {
-                if (guiOptions.lang != null)
-                {
-                    log.Info("Setting culture to " + guiOptions.lang);
-                    Thread.CurrentThread.CurrentUICulture =
-                        new CultureInfo(guiOptions.lang);
-                }
-            }
-
-            try
-            {
-                // Add Standard Services to ServiceManager
-                log.Info("Adding Services");
-                ServiceManager.Services.AddService(settingsService);
-                ServiceManager.Services.AddService(new DomainManager());
-                ServiceManager.Services.AddService(new RecentFilesService());
-                ServiceManager.Services.AddService(new ProjectService());
-                ServiceManager.Services.AddService(new TestLoader(new GuiTestEventDispatcher()));
-                ServiceManager.Services.AddService(new AddinRegistry());
-                ServiceManager.Services.AddService(new AddinManager());
-                ServiceManager.Services.AddService(new TestAgency());
-
-                // Initialize Services
-                log.Info("Initializing Services");
-                ServiceManager.Services.InitializeServices();
-            }
-            catch (Exception ex)
-            {
-                MessageDisplay.FatalError("Service initialization failed.", ex);
-                log.Error("Service initialization failed", ex);
-                return 2;
-            }
-
-            // Create container in order to allow ambient properties
-            // to be shared across all top-level forms.
-            log.Info("Initializing AmbientProperties");
-            AppContainer c = new AppContainer();
-            AmbientProperties ambient = new AmbientProperties();
-            c.Services.AddService(typeof(AmbientProperties), ambient);
-
-            log.Info("Constructing Form");
-            NUnitForm form = new NUnitForm(guiOptions);
-            c.Add(form);
-
-            try
-            {
-                log.Info("Starting Gui Application");
-                Application.Run(form);
-                log.Info("Application Exit");
-            }
-            catch( Exception ex )
-            {
-                log.Error("Gui Application threw an excepion", ex );
-                throw;
-            }
-            finally
-            {
-                log.Info("Stopping Services");
-                ServiceManager.Services.StopAllServices();
-            }
-
-            if (attachedConsole != null)
-            {
-                Console.WriteLine("Press Enter to exit");
-                Console.ReadLine();
-                attachedConsole.Close();
-            }
-
-            log.Info("Exiting NUnit GUI");
-            InternalTrace.Close();
-
-            return 0;
-        }
-
-        private static IMessageDisplay MessageDisplay
-        {
-            get { return new MessageDisplay("NUnit"); }
-        }
-    }
-}
+// ****************************************************************
+// 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.Globalization;
+using System.IO;
+using System.Text;
+using System.Threading;
+using System.Windows.Forms;
+using NUnit.UiKit;
+using NUnit.Util;
+using NUnit.Core;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Gui
+{
+    /// <summary>
+    /// Class to manage application startup.
+    /// </summary>
+    public class AppEntry
+    {
+        static Logger log = InternalTrace.GetLogger(typeof(AppEntry));
+
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        public static int Main(string[] args)
+        {
+            // Create SettingsService early so we know the trace level right at the start
+            SettingsService settingsService = new SettingsService();
+            InternalTrace.Initialize("nunit-gui_%p.log", (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default));
+
+            log.Info("Starting NUnit GUI");
+
+            GuiOptions guiOptions = new GuiOptions(args);
+
+            GuiAttachedConsole attachedConsole = null;
+            if (guiOptions.console)
+            {
+                log.Info("Creating attached console");
+                attachedConsole = new GuiAttachedConsole();
+            }
+
+            if (guiOptions.help)
+            {
+                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;
+            }
+
+            if (guiOptions.cleanup)
+            {
+                log.Info("Performing cleanup of shadow copy cache");
+                DomainManager.DeleteShadowCopyPath();
+                return 0;
+            }
+
+            if (!guiOptions.NoArgs)
+            {
+                if (guiOptions.lang != null)
+                {
+                    log.Info("Setting culture to " + guiOptions.lang);
+                    Thread.CurrentThread.CurrentUICulture =
+                        new CultureInfo(guiOptions.lang);
+                }
+            }
+
+            try
+            {
+                // Add Standard Services to ServiceManager
+                log.Info("Adding Services");
+                ServiceManager.Services.AddService(settingsService);
+                ServiceManager.Services.AddService(new DomainManager());
+                ServiceManager.Services.AddService(new RecentFilesService());
+                ServiceManager.Services.AddService(new ProjectService());
+                ServiceManager.Services.AddService(new TestLoader(new GuiTestEventDispatcher()));
+                ServiceManager.Services.AddService(new AddinRegistry());
+                ServiceManager.Services.AddService(new AddinManager());
+                ServiceManager.Services.AddService(new TestAgency());
+
+                // Initialize Services
+                log.Info("Initializing Services");
+                ServiceManager.Services.InitializeServices();
+            }
+            catch (Exception ex)
+            {
+                MessageDisplay.FatalError("Service initialization failed.", ex);
+                log.Error("Service initialization failed", ex);
+                return 2;
+            }
+
+            // Create container in order to allow ambient properties
+            // to be shared across all top-level forms.
+            log.Info("Initializing AmbientProperties");
+            AppContainer c = new AppContainer();
+            AmbientProperties ambient = new AmbientProperties();
+            c.Services.AddService(typeof(AmbientProperties), ambient);
+
+            log.Info("Constructing Form");
+            NUnitForm form = new NUnitForm(guiOptions);
+            c.Add(form);
+
+            try
+            {
+                log.Info("Starting Gui Application");
+                Application.Run(form);
+                log.Info("Application Exit");
+            }
+            catch( Exception ex )
+            {
+                log.Error("Gui Application threw an excepion", ex );
+                throw;
+            }
+            finally
+            {
+                log.Info("Stopping Services");
+                ServiceManager.Services.StopAllServices();
+            }
+
+            if (attachedConsole != null)
+            {
+                Console.WriteLine("Press Enter to exit");
+                Console.ReadLine();
+                attachedConsole.Close();
+            }
+
+            log.Info("Exiting NUnit GUI");
+            InternalTrace.Close();
+
+            return 0;
+        }
+
+        private static IMessageDisplay MessageDisplay
+        {
+            get { return new MessageDisplay("NUnit"); }
+        }
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/AssemblyInfo.cs b/src/GuiRunner/nunit-gui/AssemblyInfo.cs
index 4835bf6..a676cbf 100644
--- a/src/GuiRunner/nunit-gui/AssemblyInfo.cs
+++ b/src/GuiRunner/nunit-gui/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/GuiRunner/nunit-gui/DetailResults.cs b/src/GuiRunner/nunit-gui/DetailResults.cs
index 8f1f237..491bd07 100644
--- a/src/GuiRunner/nunit-gui/DetailResults.cs
+++ b/src/GuiRunner/nunit-gui/DetailResults.cs
@@ -1,76 +1,76 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Gui
-{
-	using System;
-	using System.Windows.Forms;
-	using NUnit.Core;
-	using NUnit.Util;
-
-	/// <summary>
-	/// Summary description for DetailResults
-	/// </summary>
-	public class DetailResults
-	{
-		private readonly ListBox testDetails;
-		private readonly TreeView notRunTree;
-
-		public DetailResults(ListBox listBox, TreeView notRun)
-		{
-			testDetails = listBox;
-			notRunTree = notRun;
-		}
-
-		public void DisplayResults( TestResult results )
-		{
-			notRunTree.BeginUpdate();
-			ProcessResults( results );
-			notRunTree.EndUpdate();
-
-			if( testDetails.Items.Count > 0 )
-				testDetails.SelectedIndex = 0;
-		}
-
-		private void ProcessResults(TestResult result)
-		{
-			switch( result.ResultState )
-			{
-                case ResultState.Failure:
-                case ResultState.Error:
-                case ResultState.Cancelled:
-					TestResultItem item = new TestResultItem(result);
-					//string resultString = String.Format("{0}:{1}", result.Name, result.Message);
-					testDetails.BeginUpdate();
-					testDetails.Items.Insert(testDetails.Items.Count, item);
-					testDetails.EndUpdate();
-			        break;
-                case ResultState.Skipped:
-                case ResultState.NotRunnable:
-                case ResultState.Ignored:
-    				notRunTree.Nodes.Add(MakeNotRunNode(result));
-			        break;
-			}
-
-			if ( result.HasResults )
-				foreach (TestResult childResult in result.Results)
-	                ProcessResults( childResult );
-        }
-
-		private static TreeNode MakeNotRunNode(TestResult result)
-		{
-			TreeNode node = new TreeNode(result.Name);
-
-			TreeNode reasonNode = new TreeNode("Reason: " + result.Message);
-			
-			node.Nodes.Add(reasonNode);
-
-			return node;
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Gui
+{
+	using System;
+	using System.Windows.Forms;
+	using NUnit.Core;
+	using NUnit.Util;
+
+	/// <summary>
+	/// Summary description for DetailResults
+	/// </summary>
+	public class DetailResults
+	{
+		private readonly ListBox testDetails;
+		private readonly TreeView notRunTree;
+
+		public DetailResults(ListBox listBox, TreeView notRun)
+		{
+			testDetails = listBox;
+			notRunTree = notRun;
+		}
+
+		public void DisplayResults( TestResult results )
+		{
+			notRunTree.BeginUpdate();
+			ProcessResults( results );
+			notRunTree.EndUpdate();
+
+			if( testDetails.Items.Count > 0 )
+				testDetails.SelectedIndex = 0;
+		}
+
+		private void ProcessResults(TestResult result)
+		{
+			switch( result.ResultState )
+			{
+                case ResultState.Failure:
+                case ResultState.Error:
+                case ResultState.Cancelled:
+					TestResultItem item = new TestResultItem(result);
+					//string resultString = String.Format("{0}:{1}", result.Name, result.Message);
+					testDetails.BeginUpdate();
+					testDetails.Items.Insert(testDetails.Items.Count, item);
+					testDetails.EndUpdate();
+			        break;
+                case ResultState.Skipped:
+                case ResultState.NotRunnable:
+                case ResultState.Ignored:
+    				notRunTree.Nodes.Add(MakeNotRunNode(result));
+			        break;
+			}
+
+			if ( result.HasResults )
+				foreach (TestResult childResult in result.Results)
+	                ProcessResults( childResult );
+        }
+
+		private static TreeNode MakeNotRunNode(TestResult result)
+		{
+			TreeNode node = new TreeNode(result.Name);
+
+			TreeNode reasonNode = new TreeNode("Reason: " + result.Message);
+			
+			node.Nodes.Add(reasonNode);
+
+			return node;
+		}
+	}
+}
diff --git a/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs b/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs
index aea67e6..13fc2d8 100644
--- a/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs
+++ b/src/GuiRunner/nunit-gui/ExceptionDetailsForm.cs
@@ -1,175 +1,175 @@
-// ****************************************************************
-// Copyright 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.Drawing;
-using System.Collections;
-using System.ComponentModel;
-using System.Windows.Forms;
-
-namespace NUnit.Gui
-{
-	/// <summary>
-	/// Summary description for ExceptionDetailsForm.
-	/// </summary>
-	public class ExceptionDetailsForm : System.Windows.Forms.Form
-	{
-		private System.Windows.Forms.Button okButton;
-		/// <summary>
-		/// Required designer variable.
-		/// </summary>
-		private System.ComponentModel.Container components = null;
-		private System.Windows.Forms.RichTextBox stackTrace;
-		private System.Windows.Forms.Label message;
-		private Exception exception;
-
-		public ExceptionDetailsForm( Exception exception )
-		{
-			//
-			// Required for Windows Form Designer support
-			//
-			InitializeComponent();
-
-			//
-			// TODO: Add any constructor code after InitializeComponent call
-			//
-			this.exception = exception;
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if(components != null)
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Windows Form Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-			this.okButton = new System.Windows.Forms.Button();
-			this.stackTrace = new System.Windows.Forms.RichTextBox();
-			this.message = new System.Windows.Forms.Label();
-			this.SuspendLayout();
-			// 
-			// okButton
-			// 
-			this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
-			this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-			this.okButton.Location = new System.Drawing.Point(434, 512);
-			this.okButton.Name = "okButton";
-			this.okButton.Size = new System.Drawing.Size(90, 27);
-			this.okButton.TabIndex = 1;
-			this.okButton.Text = "OK";
-			// 
-			// 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.Location = new System.Drawing.Point(10, 65);
-			this.stackTrace.Name = "stackTrace";
-			this.stackTrace.ReadOnly = true;
-			this.stackTrace.Size = new System.Drawing.Size(940, 433);
-			this.stackTrace.TabIndex = 3;
-			this.stackTrace.Text = "";
-			// 
-			// message
-			// 
-			this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-				| System.Windows.Forms.AnchorStyles.Right)));
-			this.message.Location = new System.Drawing.Point(19, 9);
-			this.message.Name = "message";
-			this.message.Size = new System.Drawing.Size(931, 46);
-			this.message.TabIndex = 2;
-			// 
-			// ExceptionDetailsForm
-			// 
-			this.ClientSize = new System.Drawing.Size(969, 551);
-			this.Controls.Add(this.stackTrace);
-			this.Controls.Add(this.message);
-			this.Controls.Add(this.okButton);
-			this.Name = "ExceptionDetailsForm";
-			this.Text = "Exception Details";
-			this.Resize += new System.EventHandler(this.ExceptionDetailsForm_Resize);
-			this.Load += new System.EventHandler(this.ExceptionDetailsForm_Load);
-			this.ResumeLayout(false);
-
-		}
-		#endregion
-
-		private void ExceptionDetailsForm_Load(object sender, System.EventArgs e)
-		{
-			//TODO: Put some of this in the constructor for easier testing?
-			this.message.Text = FormatMessage( exception );
-			SetMessageLabelSize();
-
-			this.stackTrace.Text = FormatStackTrace( exception );
-		}
-
-		private string FormatMessage( Exception exception )
-		{
-			StringBuilder sb = new StringBuilder();
-
-			for( Exception ex = exception; ex != null; ex = ex.InnerException )
-			{
-				if ( ex != exception ) sb.Append( "\r\n----> " );
-				sb.Append( ex.GetType().ToString() );
-				sb.Append( ": " );
-				sb.Append( ex.Message );
-			}
-
-			return sb.ToString();
-		}
-
-		private string FormatStackTrace( Exception exception )
-		{
-			StringBuilder sb = new StringBuilder();
-			AppendStackTrace( sb, exception );
-
-			return sb.ToString();
-		}
-
-		private void AppendStackTrace( StringBuilder sb, Exception ex )
-		{
-			if ( ex.InnerException != null )
-				AppendStackTrace( sb, ex.InnerException );
-
-			sb.Append( ex.GetType().ToString() );
-			sb.Append( "...\r\n" );
-			sb.Append( ex.StackTrace );
-			sb.Append( "\r\n\r\n" );
-		}
-
-		private void ExceptionDetailsForm_Resize(object sender, System.EventArgs e)
-		{
-			SetMessageLabelSize();
-		}
-
-		private void SetMessageLabelSize()
-		{
-			Rectangle rect = message.ClientRectangle;
-			Graphics g = Graphics.FromHwnd( Handle );
-			SizeF sizeNeeded = g.MeasureString( message.Text, message.Font, rect.Width );
-			int delta = sizeNeeded.ToSize().Height - rect.Height;
-			
-			message.Height += delta;
-			stackTrace.Top += delta;
-			stackTrace.Height -= delta;
-		}
-	}
+// ****************************************************************
+// Copyright 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.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace NUnit.Gui
+{
+	/// <summary>
+	/// Summary description for ExceptionDetailsForm.
+	/// </summary>
+	public class ExceptionDetailsForm : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Button okButton;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+		private System.Windows.Forms.RichTextBox stackTrace;
+		private System.Windows.Forms.Label message;
+		private Exception exception;
+
+		public ExceptionDetailsForm( Exception exception )
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			this.exception = exception;
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.okButton = new System.Windows.Forms.Button();
+			this.stackTrace = new System.Windows.Forms.RichTextBox();
+			this.message = new System.Windows.Forms.Label();
+			this.SuspendLayout();
+			// 
+			// okButton
+			// 
+			this.okButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+			this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.okButton.Location = new System.Drawing.Point(434, 512);
+			this.okButton.Name = "okButton";
+			this.okButton.Size = new System.Drawing.Size(90, 27);
+			this.okButton.TabIndex = 1;
+			this.okButton.Text = "OK";
+			// 
+			// 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.Location = new System.Drawing.Point(10, 65);
+			this.stackTrace.Name = "stackTrace";
+			this.stackTrace.ReadOnly = true;
+			this.stackTrace.Size = new System.Drawing.Size(940, 433);
+			this.stackTrace.TabIndex = 3;
+			this.stackTrace.Text = "";
+			// 
+			// message
+			// 
+			this.message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+				| System.Windows.Forms.AnchorStyles.Right)));
+			this.message.Location = new System.Drawing.Point(19, 9);
+			this.message.Name = "message";
+			this.message.Size = new System.Drawing.Size(931, 46);
+			this.message.TabIndex = 2;
+			// 
+			// ExceptionDetailsForm
+			// 
+			this.ClientSize = new System.Drawing.Size(969, 551);
+			this.Controls.Add(this.stackTrace);
+			this.Controls.Add(this.message);
+			this.Controls.Add(this.okButton);
+			this.Name = "ExceptionDetailsForm";
+			this.Text = "Exception Details";
+			this.Resize += new System.EventHandler(this.ExceptionDetailsForm_Resize);
+			this.Load += new System.EventHandler(this.ExceptionDetailsForm_Load);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void ExceptionDetailsForm_Load(object sender, System.EventArgs e)
+		{
+			//TODO: Put some of this in the constructor for easier testing?
+			this.message.Text = FormatMessage( exception );
+			SetMessageLabelSize();
+
+			this.stackTrace.Text = FormatStackTrace( exception );
+		}
+
+		private string FormatMessage( Exception exception )
+		{
+			StringBuilder sb = new StringBuilder();
+
+			for( Exception ex = exception; ex != null; ex = ex.InnerException )
+			{
+				if ( ex != exception ) sb.Append( "\r\n----> " );
+				sb.Append( ex.GetType().ToString() );
+				sb.Append( ": " );
+				sb.Append( ex.Message );
+			}
+
+			return sb.ToString();
+		}
+
+		private string FormatStackTrace( Exception exception )
+		{
+			StringBuilder sb = new StringBuilder();
+			AppendStackTrace( sb, exception );
+
+			return sb.ToString();
+		}
+
+		private void AppendStackTrace( StringBuilder sb, Exception ex )
+		{
+			if ( ex.InnerException != null )
+				AppendStackTrace( sb, ex.InnerException );
+
+			sb.Append( ex.GetType().ToString() );
+			sb.Append( "...\r\n" );
+			sb.Append( ex.StackTrace );
+			sb.Append( "\r\n\r\n" );
+		}
+
+		private void ExceptionDetailsForm_Resize(object sender, System.EventArgs e)
+		{
+			SetMessageLabelSize();
+		}
+
+		private void SetMessageLabelSize()
+		{
+			Rectangle rect = message.ClientRectangle;
+			Graphics g = Graphics.FromHwnd( Handle );
+			SizeF sizeNeeded = g.MeasureString( message.Text, message.Font, rect.Width );
+			int delta = sizeNeeded.ToSize().Height - rect.Height;
+			
+			message.Height += delta;
+			stackTrace.Top += delta;
+			stackTrace.Height -= delta;
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/ExceptionDetailsForm.resx b/src/GuiRunner/nunit-gui/ExceptionDetailsForm.resx
index 1a647e5..f78cb79 100644
--- a/src/GuiRunner/nunit-gui/ExceptionDetailsForm.resx
+++ b/src/GuiRunner/nunit-gui/ExceptionDetailsForm.resx
@@ -1,179 +1,179 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stackTrace.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="stackTrace.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="stackTrace.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="message.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="message.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="message.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.Name">
-    <value>ExceptionDetailsForm</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="stackTrace.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="stackTrace.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="stackTrace.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="message.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="message.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="message.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.Name">
+    <value>ExceptionDetailsForm</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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/GuiOptions.cs b/src/GuiRunner/nunit-gui/GuiOptions.cs
index 0289c32..a59bd5e 100644
--- a/src/GuiRunner/nunit-gui/GuiOptions.cs
+++ b/src/GuiRunner/nunit-gui/GuiOptions.cs
@@ -1,88 +1,88 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Gui
-{
-	using System;
-	using System.Text;
-	using Codeblast;
-
-	public class GuiOptions : CommandLineOptions
-	{
-		[Option(Description = "Fixture to test")]
-		public string fixture;
-
-		[Option(Description = "List of categories to include")]
-		public string include;
-
-		[Option(Description = "List of categories to exclude")]
-		public string exclude;
-
-		[Option(Description = "Project configuration to load")]
-		public string config;
-
-		[Option(Description = "Suppress loading of last project")]
-		public bool noload;
-
-		[Option(Description = "Automatically run the loaded project")]
-		public bool run;
-
-		[Option(Description = "Automatically run selected tests or all tests if none are selected")]
-		public bool runselected;
-
-		[Option(Description = "Create console display for viewing any unmanaged output")]
-		public bool console;
-
-		[Option(Description = "Language to use for the NUnit GUI")]
-		public string lang;
-
-		[Option(Description = "Erase any leftover cache files and exit")]
-		public bool cleanup;
-
-		[Option(Short="?", Description = "Display help")]
-		public bool help = false;
-
-		public GuiOptions(String[] args) : base(args) { }
-
-		private bool HasInclude 
-		{
-			get 
-			{
-				return include != null && include.Length != 0;
-			}
-		}
-
-		private bool HasExclude 
-		{
-			get 
-			{
-				return exclude != null && exclude.Length != 0;
-			}
-		}
-
-		public bool Validate()
-		{
-			if ( isInvalid ) return false;
-
-			if ( HasInclude && HasExclude ) return false;
-
-			return NoArgs || ParameterCount <= 1;
-		}
-
-		public override string GetHelpText()
-		{
-			return
-				"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" +
-				base.GetHelpText() +
-				"\rOptions that take values may use an equal sign, a colon\r" +
-				"or a space to separate the option from its value.";
-		}
-
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Gui
+{
+	using System;
+	using System.Text;
+	using Codeblast;
+
+	public class GuiOptions : CommandLineOptions
+	{
+		[Option(Description = "Fixture to test")]
+		public string fixture;
+
+		[Option(Description = "List of categories to include")]
+		public string include;
+
+		[Option(Description = "List of categories to exclude")]
+		public string exclude;
+
+		[Option(Description = "Project configuration to load")]
+		public string config;
+
+		[Option(Description = "Suppress loading of last project")]
+		public bool noload;
+
+		[Option(Description = "Automatically run the loaded project")]
+		public bool run;
+
+		[Option(Description = "Automatically run selected tests or all tests if none are selected")]
+		public bool runselected;
+
+		[Option(Description = "Create console display for viewing any unmanaged output")]
+		public bool console;
+
+		[Option(Description = "Language to use for the NUnit GUI")]
+		public string lang;
+
+		[Option(Description = "Erase any leftover cache files and exit")]
+		public bool cleanup;
+
+		[Option(Short="?", Description = "Display help")]
+		public bool help = false;
+
+		public GuiOptions(String[] args) : base(args) { }
+
+		private bool HasInclude 
+		{
+			get 
+			{
+				return include != null && include.Length != 0;
+			}
+		}
+
+		private bool HasExclude 
+		{
+			get 
+			{
+				return exclude != null && exclude.Length != 0;
+			}
+		}
+
+		public bool Validate()
+		{
+			if ( isInvalid ) return false;
+
+			if ( HasInclude && HasExclude ) return false;
+
+			return NoArgs || ParameterCount <= 1;
+		}
+
+		public override string GetHelpText()
+		{
+			return
+				"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" +
+				base.GetHelpText() +
+				"\rOptions that take values may use an equal sign, a colon\r" +
+				"or a space to separate the option from its value.";
+		}
+
+	}
 }
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/NUnitForm.cs b/src/GuiRunner/nunit-gui/NUnitForm.cs
index eef5339..8d311fd 100644
--- a/src/GuiRunner/nunit-gui/NUnitForm.cs
+++ b/src/GuiRunner/nunit-gui/NUnitForm.cs
@@ -1,1884 +1,1888 @@
-// ****************************************************************
-// 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.Collections;
-using System.Configuration;
-using System.ComponentModel;
-using System.ComponentModel.Design;
-using System.Globalization;
-using System.Windows.Forms;
-using System.IO;
-using System.Reflection;
-using System.Text;
-
-namespace NUnit.Gui
-{
-	using NUnit.Core;
-	using NUnit.Util;
-	using NUnit.UiKit;
-	using CP.Windows.Forms;
-
-	public class NUnitForm : NUnitFormBase
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(NUnitForm));
-        
-        #region Instance variables
-
-		// Handlers for our recentFiles and recentProjects
-		private RecentFileMenuHandler recentProjectsMenuHandler;
-
-		private RecentFiles recentFilesService;
-		private ISettings userSettings;
-
-		private string displayFormat = "Full";
-
-		private LongRunningOperationDisplay longOpDisplay;
-
-		private System.Drawing.Font fixedFont;
-
-		// 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;
-		public System.Windows.Forms.Splitter treeSplitter;
-		public System.Windows.Forms.Panel rightPanel;
-
-		private TestTree testTree;
-
-		public System.Windows.Forms.GroupBox groupBox1;
-		public System.Windows.Forms.Button runButton;
-        private System.Windows.Forms.Button stopButton;
-		public NUnit.UiKit.TestProgressBar progressBar;
-		private CP.Windows.Forms.ExpandingLabel runCount;
-
-		public NUnit.UiKit.ResultTabs resultTabs;
-
-		public NUnit.UiKit.StatusBar statusBar;
-
-		public System.Windows.Forms.ToolTip toolTip;
-
-		public System.Windows.Forms.MainMenu mainMenu;
-		
-		public System.Windows.Forms.MenuItem fileMenu;
-		private System.Windows.Forms.MenuItem saveMenuItem;
-		private System.Windows.Forms.MenuItem saveAsMenuItem;
-		private System.Windows.Forms.MenuItem newMenuItem;
-		private System.Windows.Forms.MenuItem openMenuItem;
-		private System.Windows.Forms.MenuItem recentProjectsMenu;
-		private System.Windows.Forms.MenuItem fileMenuSeparator1;
-		private System.Windows.Forms.MenuItem fileMenuSeparator2;
-		public System.Windows.Forms.MenuItem fileMenuSeparator4;
-		private System.Windows.Forms.MenuItem closeMenuItem;
-		public System.Windows.Forms.MenuItem exitMenuItem;
-
-		private System.Windows.Forms.MenuItem projectMenu;
-		private System.Windows.Forms.MenuItem editProjectMenuItem;
-		private System.Windows.Forms.MenuItem configMenuItem;
-		private System.Windows.Forms.MenuItem projectMenuSeparator1;
-		private System.Windows.Forms.MenuItem projectMenuSeparator2;
-
-		private System.Windows.Forms.MenuItem toolsMenu;
-		private System.Windows.Forms.MenuItem settingsMenuItem;
-		private System.Windows.Forms.MenuItem saveXmlResultsMenuItem;
-
-		public System.Windows.Forms.MenuItem helpMenuItem;
-		public System.Windows.Forms.MenuItem helpItem;
-		public System.Windows.Forms.MenuItem helpMenuSeparator1;
-		public System.Windows.Forms.MenuItem aboutMenuItem;
-
-		private System.Windows.Forms.MenuItem addVSProjectMenuItem;
-		private System.Windows.Forms.MenuItem exceptionDetailsMenuItem;
-		private System.Windows.Forms.MenuItem viewMenu;
-		private System.Windows.Forms.MenuItem statusBarMenuItem;
-		private System.Windows.Forms.MenuItem toolsMenuSeparator2;
-		private System.Windows.Forms.MenuItem miniGuiMenuItem;
-		private System.Windows.Forms.MenuItem fullGuiMenuItem;
-		private System.Windows.Forms.MenuItem fontChangeMenuItem;
-		private System.Windows.Forms.MenuItem defaultFontMenuItem;
-		private System.Windows.Forms.MenuItem decreaseFontMenuItem;
-		private System.Windows.Forms.MenuItem increaseFontMenuItem;
-		private System.Windows.Forms.MenuItem testMenu;
-		private System.Windows.Forms.MenuItem runAllMenuItem;
-		private System.Windows.Forms.MenuItem runSelectedMenuItem;
-		private System.Windows.Forms.MenuItem runFailedMenuItem;
-		private System.Windows.Forms.MenuItem stopRunMenuItem;
-		private System.Windows.Forms.MenuItem addinInfoMenuItem;
-		private System.Windows.Forms.MenuItem viewMenuSeparator1;
-		private System.Windows.Forms.MenuItem viewMenuSeparator2;
-		private System.Windows.Forms.MenuItem viewMenuSeparator3;
-		private System.Windows.Forms.MenuItem fontMenuSeparator;
-		private System.Windows.Forms.MenuItem testMenuSeparator;
-		private System.Windows.Forms.MenuItem guiFontMenuItem;
-		private System.Windows.Forms.MenuItem fixedFontMenuItem;
-		private System.Windows.Forms.MenuItem increaseFixedFontMenuItem;
-		private System.Windows.Forms.MenuItem decreaseFixedFontMenuItem;
-		private System.Windows.Forms.MenuItem menuItem1;
-		private System.Windows.Forms.MenuItem restoreFixedFontMenuItem;
-		private System.Windows.Forms.MenuItem reloadTestsMenuItem;
-		private System.Windows.Forms.MenuItem reloadProjectMenuItem;
-		private System.Windows.Forms.MenuItem menuItem2;
-		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 ) : 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 )
-		{
-			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.components = new System.ComponentModel.Container();
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NUnitForm));
-            this.statusBar = new NUnit.UiKit.StatusBar();
-            this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
-            this.fileMenu = new System.Windows.Forms.MenuItem();
-            this.newMenuItem = new System.Windows.Forms.MenuItem();
-            this.openMenuItem = new System.Windows.Forms.MenuItem();
-            this.closeMenuItem = new System.Windows.Forms.MenuItem();
-            this.fileMenuSeparator1 = new System.Windows.Forms.MenuItem();
-            this.saveMenuItem = new System.Windows.Forms.MenuItem();
-            this.saveAsMenuItem = new System.Windows.Forms.MenuItem();
-            this.fileMenuSeparator2 = new System.Windows.Forms.MenuItem();
-            this.reloadProjectMenuItem = new System.Windows.Forms.MenuItem();
-            this.reloadTestsMenuItem = new System.Windows.Forms.MenuItem();
-            this.runtimeMenuItem = new System.Windows.Forms.MenuItem();
-            this.menuItem2 = new System.Windows.Forms.MenuItem();
-            this.recentProjectsMenu = new System.Windows.Forms.MenuItem();
-            this.fileMenuSeparator4 = new System.Windows.Forms.MenuItem();
-            this.exitMenuItem = new System.Windows.Forms.MenuItem();
-            this.viewMenu = new System.Windows.Forms.MenuItem();
-            this.fullGuiMenuItem = new System.Windows.Forms.MenuItem();
-            this.miniGuiMenuItem = new System.Windows.Forms.MenuItem();
-            this.viewMenuSeparator1 = new System.Windows.Forms.MenuItem();
-            this.viewMenuSeparator2 = new System.Windows.Forms.MenuItem();
-            this.guiFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.increaseFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.decreaseFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.fontMenuSeparator = new System.Windows.Forms.MenuItem();
-            this.fontChangeMenuItem = new System.Windows.Forms.MenuItem();
-            this.defaultFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.fixedFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.increaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.decreaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.menuItem1 = new System.Windows.Forms.MenuItem();
-            this.restoreFixedFontMenuItem = new System.Windows.Forms.MenuItem();
-            this.viewMenuSeparator3 = new System.Windows.Forms.MenuItem();
-            this.statusBarMenuItem = new System.Windows.Forms.MenuItem();
-            this.projectMenu = new System.Windows.Forms.MenuItem();
-            this.configMenuItem = new System.Windows.Forms.MenuItem();
-            this.projectMenuSeparator1 = new System.Windows.Forms.MenuItem();
-            this.addAssemblyMenuItem = new System.Windows.Forms.MenuItem();
-            this.addVSProjectMenuItem = new System.Windows.Forms.MenuItem();
-            this.projectMenuSeparator2 = new System.Windows.Forms.MenuItem();
-            this.editProjectMenuItem = new System.Windows.Forms.MenuItem();
-            this.testMenu = new System.Windows.Forms.MenuItem();
-            this.runAllMenuItem = new System.Windows.Forms.MenuItem();
-            this.runSelectedMenuItem = new System.Windows.Forms.MenuItem();
-            this.runFailedMenuItem = new System.Windows.Forms.MenuItem();
-            this.testMenuSeparator = new System.Windows.Forms.MenuItem();
-            this.stopRunMenuItem = new System.Windows.Forms.MenuItem();
-            this.toolsMenu = new System.Windows.Forms.MenuItem();
-            this.assemblyDetailsMenuItem = new System.Windows.Forms.MenuItem();
-            this.saveXmlResultsMenuItem = new System.Windows.Forms.MenuItem();
-            this.exceptionDetailsMenuItem = new System.Windows.Forms.MenuItem();
-            this.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();
-            this.addinInfoMenuItem = new System.Windows.Forms.MenuItem();
-            this.helpItem = new System.Windows.Forms.MenuItem();
-            this.helpMenuItem = new System.Windows.Forms.MenuItem();
-            this.helpMenuSeparator1 = new System.Windows.Forms.MenuItem();
-            this.aboutMenuItem = new System.Windows.Forms.MenuItem();
-            this.treeSplitter = new System.Windows.Forms.Splitter();
-            this.rightPanel = new System.Windows.Forms.Panel();
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.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.progressBar = new NUnit.UiKit.TestProgressBar();
-            this.resultTabs = new NUnit.UiKit.ResultTabs();
-            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
-            this.testTree = new NUnit.UiKit.TestTree();
-            this.leftPanel = new System.Windows.Forms.Panel();
-            this.rightPanel.SuspendLayout();
-            this.groupBox1.SuspendLayout();
-            this.leftPanel.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // statusBar
-            // 
-            this.statusBar.DisplayTestProgress = true;
-            this.statusBar.Location = new System.Drawing.Point(0, 407);
-            this.statusBar.Name = "statusBar";
-            this.statusBar.ShowPanels = true;
-            this.statusBar.Size = new System.Drawing.Size(744, 24);
-            this.statusBar.TabIndex = 0;
-            this.statusBar.Text = "Status";
-            // 
-            // mainMenu
-            // 
-            this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.fileMenu,
-            this.viewMenu,
-            this.projectMenu,
-            this.testMenu,
-            this.toolsMenu,
-            this.helpItem});
-            // 
-            // fileMenu
-            // 
-            this.fileMenu.Index = 0;
-            this.fileMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.newMenuItem,
-            this.openMenuItem,
-            this.closeMenuItem,
-            this.fileMenuSeparator1,
-            this.saveMenuItem,
-            this.saveAsMenuItem,
-            this.fileMenuSeparator2,
-            this.reloadProjectMenuItem,
-            this.reloadTestsMenuItem,
-            this.runtimeMenuItem,
-            this.menuItem2,
-            this.recentProjectsMenu,
-            this.fileMenuSeparator4,
-            this.exitMenuItem});
-            this.fileMenu.Text = "&File";
-            this.fileMenu.Popup += new System.EventHandler(this.fileMenu_Popup);
-            // 
-            // newMenuItem
-            // 
-            this.newMenuItem.Index = 0;
-            this.newMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
-            this.newMenuItem.Text = "&New Project...";
-            this.newMenuItem.Click += new System.EventHandler(this.newMenuItem_Click);
-            // 
-            // openMenuItem
-            // 
-            this.openMenuItem.Index = 1;
-            this.openMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
-            this.openMenuItem.Text = "&Open Project...";
-            this.openMenuItem.Click += new System.EventHandler(this.openMenuItem_Click);
-            // 
-            // closeMenuItem
-            // 
-            this.closeMenuItem.Index = 2;
-            this.closeMenuItem.Text = "&Close";
-            this.closeMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click);
-            // 
-            // fileMenuSeparator1
-            // 
-            this.fileMenuSeparator1.Index = 3;
-            this.fileMenuSeparator1.Text = "-";
-            // 
-            // saveMenuItem
-            // 
-            this.saveMenuItem.Index = 4;
-            this.saveMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
-            this.saveMenuItem.Text = "&Save";
-            this.saveMenuItem.Click += new System.EventHandler(this.saveMenuItem_Click);
-            // 
-            // saveAsMenuItem
-            // 
-            this.saveAsMenuItem.Index = 5;
-            this.saveAsMenuItem.Text = "Save &As...";
-            this.saveAsMenuItem.Click += new System.EventHandler(this.saveAsMenuItem_Click);
-            // 
-            // fileMenuSeparator2
-            // 
-            this.fileMenuSeparator2.Index = 6;
-            this.fileMenuSeparator2.Text = "-";
-            // 
-            // reloadProjectMenuItem
-            // 
-            this.reloadProjectMenuItem.Index = 7;
-            this.reloadProjectMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
-            this.reloadProjectMenuItem.Text = "Re&load Project";
-            this.reloadProjectMenuItem.Click += new System.EventHandler(this.reloadProjectMenuItem_Click);
-            // 
-            // reloadTestsMenuItem
-            // 
-            this.reloadTestsMenuItem.Index = 8;
-            this.reloadTestsMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
-            this.reloadTestsMenuItem.Text = "&Reload Tests";
-            this.reloadTestsMenuItem.Click += new System.EventHandler(this.reloadTestsMenuItem_Click);
-            // 
-            // runtimeMenuItem
-            // 
-            this.runtimeMenuItem.Index = 9;
-            this.runtimeMenuItem.Text = "  Select R&untime";
-            // 
-            // menuItem2
-            // 
-            this.menuItem2.Index = 10;
-            this.menuItem2.Text = "-";
-            // 
-            // recentProjectsMenu
-            // 
-            this.recentProjectsMenu.Index = 11;
-            this.recentProjectsMenu.Text = "Recent &Projects";
-            // 
-            // fileMenuSeparator4
-            // 
-            this.fileMenuSeparator4.Index = 12;
-            this.fileMenuSeparator4.Text = "-";
-            // 
-            // exitMenuItem
-            // 
-            this.exitMenuItem.Index = 13;
-            this.exitMenuItem.Text = "E&xit";
-            this.exitMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click);
-            // 
-            // viewMenu
-            // 
-            this.viewMenu.Index = 1;
-            this.viewMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.fullGuiMenuItem,
-            this.miniGuiMenuItem,
-            this.viewMenuSeparator1,
-            this.viewMenuSeparator2,
-            this.guiFontMenuItem,
-            this.fixedFontMenuItem,
-            this.viewMenuSeparator3,
-            this.statusBarMenuItem});
-            this.viewMenu.Text = "&View";
-            this.viewMenu.Popup += new System.EventHandler(this.viewMenu_Popup);
-            // 
-            // fullGuiMenuItem
-            // 
-            this.fullGuiMenuItem.Checked = true;
-            this.fullGuiMenuItem.Index = 0;
-            this.fullGuiMenuItem.RadioCheck = true;
-            this.fullGuiMenuItem.Text = "&Full GUI";
-            this.fullGuiMenuItem.Click += new System.EventHandler(this.fullGuiMenuItem_Click);
-            // 
-            // miniGuiMenuItem
-            // 
-            this.miniGuiMenuItem.Index = 1;
-            this.miniGuiMenuItem.RadioCheck = true;
-            this.miniGuiMenuItem.Text = "&Mini GUI";
-            this.miniGuiMenuItem.Click += new System.EventHandler(this.miniGuiMenuItem_Click);
-            // 
-            // viewMenuSeparator1
-            // 
-            this.viewMenuSeparator1.Index = 2;
-            this.viewMenuSeparator1.Text = "-";
-            // 
-            // viewMenuSeparator2
-            // 
-            this.viewMenuSeparator2.Index = 3;
-            this.viewMenuSeparator2.Text = "-";
-            // 
-            // guiFontMenuItem
-            // 
-            this.guiFontMenuItem.Index = 4;
-            this.guiFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.increaseFontMenuItem,
-            this.decreaseFontMenuItem,
-            this.fontMenuSeparator,
-            this.fontChangeMenuItem,
-            this.defaultFontMenuItem});
-            this.guiFontMenuItem.Text = "GUI Fo&nt";
-            // 
-            // increaseFontMenuItem
-            // 
-            this.increaseFontMenuItem.Index = 0;
-            this.increaseFontMenuItem.Text = "&Increase";
-            this.increaseFontMenuItem.Click += new System.EventHandler(this.increaseFontMenuItem_Click);
-            // 
-            // decreaseFontMenuItem
-            // 
-            this.decreaseFontMenuItem.Index = 1;
-            this.decreaseFontMenuItem.Text = "&Decrease";
-            this.decreaseFontMenuItem.Click += new System.EventHandler(this.decreaseFontMenuItem_Click);
-            // 
-            // fontMenuSeparator
-            // 
-            this.fontMenuSeparator.Index = 2;
-            this.fontMenuSeparator.Text = "-";
-            // 
-            // fontChangeMenuItem
-            // 
-            this.fontChangeMenuItem.Index = 3;
-            this.fontChangeMenuItem.Text = "&Change...";
-            this.fontChangeMenuItem.Click += new System.EventHandler(this.fontChangeMenuItem_Click);
-            // 
-            // defaultFontMenuItem
-            // 
-            this.defaultFontMenuItem.Index = 4;
-            this.defaultFontMenuItem.Text = "&Restore";
-            this.defaultFontMenuItem.Click += new System.EventHandler(this.defaultFontMenuItem_Click);
-            // 
-            // fixedFontMenuItem
-            // 
-            this.fixedFontMenuItem.Index = 5;
-            this.fixedFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.increaseFixedFontMenuItem,
-            this.decreaseFixedFontMenuItem,
-            this.menuItem1,
-            this.restoreFixedFontMenuItem});
-            this.fixedFontMenuItem.Text = "Fi&xed Font";
-            // 
-            // increaseFixedFontMenuItem
-            // 
-            this.increaseFixedFontMenuItem.Index = 0;
-            this.increaseFixedFontMenuItem.Text = "&Increase";
-            this.increaseFixedFontMenuItem.Click += new System.EventHandler(this.increaseFixedFontMenuItem_Click);
-            // 
-            // decreaseFixedFontMenuItem
-            // 
-            this.decreaseFixedFontMenuItem.Index = 1;
-            this.decreaseFixedFontMenuItem.Text = "&Decrease";
-            this.decreaseFixedFontMenuItem.Click += new System.EventHandler(this.decreaseFixedFontMenuItem_Click);
-            // 
-            // menuItem1
-            // 
-            this.menuItem1.Index = 2;
-            this.menuItem1.Text = "-";
-            // 
-            // restoreFixedFontMenuItem
-            // 
-            this.restoreFixedFontMenuItem.Index = 3;
-            this.restoreFixedFontMenuItem.Text = "&Restore";
-            this.restoreFixedFontMenuItem.Click += new System.EventHandler(this.restoreFixedFontMenuItem_Click);
-            // 
-            // viewMenuSeparator3
-            // 
-            this.viewMenuSeparator3.Index = 6;
-            this.viewMenuSeparator3.Text = "-";
-            // 
-            // statusBarMenuItem
-            // 
-            this.statusBarMenuItem.Checked = true;
-            this.statusBarMenuItem.Index = 7;
-            this.statusBarMenuItem.Text = "&Status Bar";
-            this.statusBarMenuItem.Click += new System.EventHandler(this.statusBarMenuItem_Click);
-            // 
-            // projectMenu
-            // 
-            this.projectMenu.Index = 2;
-            this.projectMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.configMenuItem,
-            this.projectMenuSeparator1,
-            this.addAssemblyMenuItem,
-            this.addVSProjectMenuItem,
-            this.projectMenuSeparator2,
-            this.editProjectMenuItem});
-            this.projectMenu.Text = "&Project";
-            this.projectMenu.Visible = false;
-            this.projectMenu.Popup += new System.EventHandler(this.projectMenu_Popup);
-            // 
-            // configMenuItem
-            // 
-            this.configMenuItem.Index = 0;
-            this.configMenuItem.Text = "&Configurations";
-            // 
-            // projectMenuSeparator1
-            // 
-            this.projectMenuSeparator1.Index = 1;
-            this.projectMenuSeparator1.Text = "-";
-            // 
-            // addAssemblyMenuItem
-            // 
-            this.addAssemblyMenuItem.Index = 2;
-            this.addAssemblyMenuItem.Text = "Add Assembly...";
-            this.addAssemblyMenuItem.Click += new System.EventHandler(this.addAssemblyMenuItem_Click);
-            // 
-            // addVSProjectMenuItem
-            // 
-            this.addVSProjectMenuItem.Index = 3;
-            this.addVSProjectMenuItem.Text = "Add VS Project...";
-            this.addVSProjectMenuItem.Click += new System.EventHandler(this.addVSProjectMenuItem_Click);
-            // 
-            // projectMenuSeparator2
-            // 
-            this.projectMenuSeparator2.Index = 4;
-            this.projectMenuSeparator2.Text = "-";
-            // 
-            // editProjectMenuItem
-            // 
-            this.editProjectMenuItem.Index = 5;
-            this.editProjectMenuItem.Text = "Edit...";
-            this.editProjectMenuItem.Click += new System.EventHandler(this.editProjectMenuItem_Click);
-            // 
-            // testMenu
-            // 
-            this.testMenu.Index = 3;
-            this.testMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.runAllMenuItem,
-            this.runSelectedMenuItem,
-            this.runFailedMenuItem,
-            this.testMenuSeparator,
-            this.stopRunMenuItem});
-            this.testMenu.Text = "&Tests";
-            // 
-            // runAllMenuItem
-            // 
-            this.runAllMenuItem.Index = 0;
-            this.runAllMenuItem.Shortcut = System.Windows.Forms.Shortcut.F5;
-            this.runAllMenuItem.Text = "&Run All";
-            this.runAllMenuItem.Click += new System.EventHandler(this.runAllMenuItem_Click);
-            // 
-            // runSelectedMenuItem
-            // 
-            this.runSelectedMenuItem.Index = 1;
-            this.runSelectedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F6;
-            this.runSelectedMenuItem.Text = "Run &Selected";
-            this.runSelectedMenuItem.Click += new System.EventHandler(this.runSelectedMenuItem_Click);
-            // 
-            // runFailedMenuItem
-            // 
-            this.runFailedMenuItem.Enabled = false;
-            this.runFailedMenuItem.Index = 2;
-            this.runFailedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F7;
-            this.runFailedMenuItem.Text = "Run &Failed";
-            this.runFailedMenuItem.Click += new System.EventHandler(this.runFailedMenuItem_Click);
-            // 
-            // testMenuSeparator
-            // 
-            this.testMenuSeparator.Index = 3;
-            this.testMenuSeparator.Text = "-";
-            // 
-            // stopRunMenuItem
-            // 
-            this.stopRunMenuItem.Index = 4;
-            this.stopRunMenuItem.Text = "S&top Run";
-            this.stopRunMenuItem.Click += new System.EventHandler(this.stopRunMenuItem_Click);
-            // 
-            // toolsMenu
-            // 
-            this.toolsMenu.Index = 4;
-            this.toolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.assemblyDetailsMenuItem,
-            this.saveXmlResultsMenuItem,
-            this.exceptionDetailsMenuItem,
-            this.openLogDirectoryMenuItem,
-            this.toolsMenuSeparator1,
-            this.settingsMenuItem,
-            this.toolsMenuSeparator2,
-            this.addinInfoMenuItem});
-            this.toolsMenu.Text = "T&ools";
-            this.toolsMenu.Popup += new System.EventHandler(this.toolsMenu_Popup);
-            // 
-            // assemblyDetailsMenuItem
-            // 
-            this.assemblyDetailsMenuItem.Index = 0;
-            this.assemblyDetailsMenuItem.Text = "&Test Assemblies...";
-            this.assemblyDetailsMenuItem.Click += new System.EventHandler(this.assemblyDetailsMenuItem_Click);
-            // 
-            // saveXmlResultsMenuItem
-            // 
-            this.saveXmlResultsMenuItem.Index = 1;
-            this.saveXmlResultsMenuItem.Text = "&Save Results as XML...";
-            this.saveXmlResultsMenuItem.Click += new System.EventHandler(this.saveXmlResultsMenuItem_Click);
-            // 
-            // exceptionDetailsMenuItem
-            // 
-            this.exceptionDetailsMenuItem.Index = 2;
-            this.exceptionDetailsMenuItem.Text = "&Exception Details...";
-            this.exceptionDetailsMenuItem.Click += new System.EventHandler(this.exceptionDetailsMenuItem_Click);
-            // 
-            // openLogDirectoryMenuItem
-            // 
-            this.openLogDirectoryMenuItem.Index = 3;
-            this.openLogDirectoryMenuItem.Text = "Open &Log Directory...";
-            this.openLogDirectoryMenuItem.Click += new System.EventHandler(this.openLogDirectoryMenuItem_Click);
-            // 
-            // toolsMenuSeparator1
-            // 
-            this.toolsMenuSeparator1.Index = 4;
-            this.toolsMenuSeparator1.Text = "-";
-            // 
-            // settingsMenuItem
-            // 
-            this.settingsMenuItem.Index = 5;
-            this.settingsMenuItem.Text = "&Settings...";
-            this.settingsMenuItem.Click += new System.EventHandler(this.settingsMenuItem_Click);
-            // 
-            // toolsMenuSeparator2
-            // 
-            this.toolsMenuSeparator2.Index = 6;
-            this.toolsMenuSeparator2.Text = "-";
-            // 
-            // addinInfoMenuItem
-            // 
-            this.addinInfoMenuItem.Index = 7;
-            this.addinInfoMenuItem.Text = "Addins...";
-            this.addinInfoMenuItem.Click += new System.EventHandler(this.addinInfoMenuItem_Click);
-            // 
-            // helpItem
-            // 
-            this.helpItem.Index = 5;
-            this.helpItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.helpMenuItem,
-            this.helpMenuSeparator1,
-            this.aboutMenuItem});
-            this.helpItem.Text = "&Help";
-            // 
-            // helpMenuItem
-            // 
-            this.helpMenuItem.Index = 0;
-            this.helpMenuItem.Shortcut = System.Windows.Forms.Shortcut.F1;
-            this.helpMenuItem.Text = "NUnit &Help...";
-            this.helpMenuItem.Click += new System.EventHandler(this.helpMenuItem_Click);
-            // 
-            // helpMenuSeparator1
-            // 
-            this.helpMenuSeparator1.Index = 1;
-            this.helpMenuSeparator1.Text = "-";
-            // 
-            // aboutMenuItem
-            // 
-            this.aboutMenuItem.Index = 2;
-            this.aboutMenuItem.Text = "&About NUnit...";
-            this.aboutMenuItem.Click += new System.EventHandler(this.aboutMenuItem_Click);
-            // 
-            // treeSplitter
-            // 
-            this.treeSplitter.Location = new System.Drawing.Point(240, 0);
-            this.treeSplitter.MinSize = 240;
-            this.treeSplitter.Name = "treeSplitter";
-            this.treeSplitter.Size = new System.Drawing.Size(6, 407);
-            this.treeSplitter.TabIndex = 2;
-            this.treeSplitter.TabStop = false;
-            // 
-            // rightPanel
-            // 
-            this.rightPanel.BackColor = System.Drawing.SystemColors.Control;
-            this.rightPanel.Controls.Add(this.groupBox1);
-            this.rightPanel.Controls.Add(this.resultTabs);
-            this.rightPanel.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.rightPanel.Location = new System.Drawing.Point(246, 0);
-            this.rightPanel.Name = "rightPanel";
-            this.rightPanel.Size = new System.Drawing.Size(498, 407);
-            this.rightPanel.TabIndex = 3;
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.Controls.Add(this.suiteName);
-            this.groupBox1.Controls.Add(this.runCount);
-            this.groupBox1.Controls.Add(this.stopButton);
-            this.groupBox1.Controls.Add(this.runButton);
-            this.groupBox1.Controls.Add(this.progressBar);
-            this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.groupBox1.Location = new System.Drawing.Point(0, 0);
-            this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(498, 120);
-            this.groupBox1.TabIndex = 0;
-            this.groupBox1.TabStop = false;
-            // 
-            // 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.AutoEllipsis = true;
-            this.runCount.Location = new System.Drawing.Point(8, 89);
-            this.runCount.Name = "runCount";
-            this.runCount.Size = new System.Drawing.Size(480, 21);
-            this.runCount.TabIndex = 5;
-            // 
-            // stopButton
-            // 
-            this.stopButton.AutoSize = true;
-            this.stopButton.Location = new System.Drawing.Point(75, 16);
-            this.stopButton.Name = "stopButton";
-            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, 16);
-            this.runButton.Name = "runButton";
-            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);
-            // 
-            // progressBar
-            // 
-            this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.progressBar.BackColor = System.Drawing.SystemColors.Control;
-            this.progressBar.CausesValidation = false;
-            this.progressBar.Enabled = false;
-            this.progressBar.ForeColor = System.Drawing.SystemColors.Highlight;
-            this.progressBar.Location = new System.Drawing.Point(8, 54);
-            this.progressBar.Maximum = 100;
-            this.progressBar.Minimum = 0;
-            this.progressBar.Name = "progressBar";
-            this.progressBar.Segmented = true;
-            this.progressBar.Size = new System.Drawing.Size(480, 28);
-            this.progressBar.Step = 1;
-            this.progressBar.TabIndex = 0;
-            this.progressBar.Value = 0;
-            // 
-            // resultTabs
-            // 
-            this.resultTabs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                        | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.resultTabs.Location = new System.Drawing.Point(0, 120);
-            this.resultTabs.Name = "resultTabs";
-            this.resultTabs.Size = new System.Drawing.Size(498, 284);
-            this.resultTabs.TabIndex = 2;
-            // 
-            // testTree
-            // 
-            this.testTree.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.testTree.Location = new System.Drawing.Point(0, 0);
-            this.testTree.Name = "testTree";
-            this.testTree.ShowCheckBoxes = false;
-            this.testTree.Size = new System.Drawing.Size(240, 407);
-            this.testTree.TabIndex = 0;
-            this.testTree.SelectedTestsChanged += new NUnit.UiKit.SelectedTestsChangedEventHandler(this.testTree_SelectedTestsChanged);
-            // 
-            // leftPanel
-            // 
-            this.leftPanel.Controls.Add(this.testTree);
-            this.leftPanel.Dock = System.Windows.Forms.DockStyle.Left;
-            this.leftPanel.Location = new System.Drawing.Point(0, 0);
-            this.leftPanel.Name = "leftPanel";
-            this.leftPanel.Size = new System.Drawing.Size(240, 407);
-            this.leftPanel.TabIndex = 4;
-            // 
-            // NUnitForm
-            // 
-            this.ClientSize = new System.Drawing.Size(744, 431);
-            this.Controls.Add(this.rightPanel);
-            this.Controls.Add(this.treeSplitter);
-            this.Controls.Add(this.leftPanel);
-            this.Controls.Add(this.statusBar);
-            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-            this.Menu = this.mainMenu;
-            this.MinimumSize = new System.Drawing.Size(160, 32);
-            this.Name = "NUnitForm";
-            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
-            this.Text = "NUnit";
-            this.Load += new System.EventHandler(this.NUnitForm_Load);
-            this.Closing += new System.ComponentModel.CancelEventHandler(this.NUnitForm_Closing);
-            this.rightPanel.ResumeLayout(false);
-            this.groupBox1.ResumeLayout(false);
-            this.groupBox1.PerformLayout();
-            this.leftPanel.ResumeLayout(false);
-            this.ResumeLayout(false);
-
-		}
-
-		#endregion
-
-        #region Public Properties
-
-        public NUnitPresenter Presenter
-        {
-            get { return presenter; }
-        }
-
-        #endregion
-
-        #region Properties used internally
-
-        private TestLoader _testLoader;
-		private TestLoader TestLoader
-		{
-			get
-			{ 
-				if ( _testLoader == null )
-					_testLoader = Services.TestLoader;
-				return _testLoader;
-			}
-		}
-
-		private bool IsProjectLoaded
-		{
-			get { return TestLoader.IsProjectLoaded; }
-		}
-
-		private NUnitProject TestProject
-		{
-			get { return TestLoader.TestProject; }
-		}
-
-		private bool IsTestLoaded
-		{
-			get { return TestLoader.IsTestLoaded; }
-		}
-
-		private bool IsTestRunning
-		{
-			get { return TestLoader.Running; }
-		}
-		#endregion
-
-		#region Menu Handlers
-
-		#region File Menu
-
-		private void fileMenu_Popup(object sender, System.EventArgs e)
-		{
-			newMenuItem.Enabled = !IsTestRunning;
-			openMenuItem.Enabled = !IsTestRunning;
-			closeMenuItem.Enabled = IsProjectLoaded && !IsTestRunning;
-
-			saveMenuItem.Enabled = IsProjectLoaded;
-			saveAsMenuItem.Enabled = IsProjectLoaded;
-
-			reloadTestsMenuItem.Enabled = IsTestLoaded && !IsTestRunning;
-            reloadProjectMenuItem.Enabled = runtimeMenuItem.Enabled = 
-                IsProjectLoaded && 
-                File.Exists(TestProject.ProjectPath) &&
-                !IsTestRunning;
-
-            RuntimeFramework current = TestLoader.CurrentFramework;
-            RuntimeFramework[] frameworks = RuntimeFramework.AvailableFrameworks;
-
-            runtimeMenuItem.Visible = frameworks.Length > 1;
-
-            if (runtimeMenuItem.Visible && runtimeMenuItem.Enabled)
-            {
-                runtimeMenuItem.MenuItems.Clear();
-
-                foreach (RuntimeFramework framework in frameworks)
-                {
-                    MenuItem item = new MenuItem(framework.DisplayName);
-                    item.Checked = current.Supports(framework);
-                    item.Tag = framework;
-                    item.Click += new EventHandler(runtimeFrameworkMenuItem_Click);
-                    try
-                    {
-                        item.Enabled = TestLoader.CanReloadUnderRuntimeVersion(framework.ClrVersion);
-                    }
-                    catch
-                    {
-                        item.Enabled = false;
-                    }
-                    runtimeMenuItem.MenuItems.Add(item);
-                }
-            }
-
-			recentProjectsMenu.Enabled = !IsTestRunning;
-
-			if ( !IsTestRunning )
-			{
-				recentProjectsMenuHandler.Load();
-			}
-		}
-
-		private void newMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.NewProject();
-		}
-
-		private void openMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.OpenProject();
-		}
-
-		private void closeMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.CloseProject();
-		}
-
-		private void saveMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.SaveProject();
-		}
-
-		private void saveAsMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.SaveProjectAs();
-            SetTitleBar(TestProject.Name);
-		}
-
-        private void runtimeFrameworkMenuItem_Click(object sender, System.EventArgs e)
-        {
-            TestLoader.ReloadTest(((MenuItem)sender).Tag as RuntimeFramework);
-        }
-
-		private void reloadProjectMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.ReloadProject();
-		}
-
-		private void reloadTestsMenuItem_Click(object sender, System.EventArgs e)
-		{
-			TestLoader.ReloadTest();
-		}
-
-		private void exitMenuItem_Click(object sender, System.EventArgs e)
-		{
-			this.Close();
-		}
-
-		#endregion
-
-		#region View Menu
-		private void viewMenu_Popup(object sender, System.EventArgs e)
-		{
-			assemblyDetailsMenuItem.Enabled = this.TestLoader.IsTestLoaded;
-		}
-
-		private void statusBarMenuItem_Click(object sender, System.EventArgs e)
-		{
-			statusBarMenuItem.Checked = !statusBarMenuItem.Checked;
-			statusBar.Visible = statusBarMenuItem.Checked;
-		}
-
-		private void fontChangeMenuItem_Click(object sender, System.EventArgs e)
-		{
-			FontDialog fontDialog = new FontDialog();
-			fontDialog.FontMustExist = true;
-			fontDialog.Font = this.Font;
-			fontDialog.MinSize = 6;
-			fontDialog.MaxSize = 12;
-			fontDialog.AllowVectorFonts = false;
-			fontDialog.ScriptsOnly = true;
-			fontDialog.ShowEffects = false;
-			fontDialog.ShowApply = true;
-			fontDialog.Apply += new EventHandler(fontDialog_Apply);
-			if( fontDialog.ShowDialog() == DialogResult.OK )
-				applyFont( fontDialog.Font );
-		}
-
-		private void fontDialog_Apply(object sender, EventArgs e)
-		{
-			applyFont( ((FontDialog)sender).Font );
-		}
-
-
-		private void defaultFontMenuItem_Click(object sender, System.EventArgs e)
-		{
-			applyFont( System.Windows.Forms.Form.DefaultFont );
-		}
-
-		private void fullGuiMenuItem_Click(object sender, System.EventArgs e)
-		{
-			if ( !fullGuiMenuItem.Checked )
-				displayFullGui();
-		}
-
-		private void miniGuiMenuItem_Click(object sender, System.EventArgs e)
-		{
-			if ( !miniGuiMenuItem.Checked )
-				displayMiniGui();
-		}
-
-		private void displayFullGui()
-		{
-			fullGuiMenuItem.Checked = true;
-			miniGuiMenuItem.Checked = false;
-
-			this.displayFormat = "Full";
-			userSettings.SaveSetting( "Gui.DisplayFormat", "Full" );
-
-            this.leftPanel.Visible = true;
-            this.leftPanel.Dock = DockStyle.Left;
-            this.treeSplitter.Visible = true;
-            this.rightPanel.Visible = true;
-            this.statusBar.Visible = true;
-
-            resultTabs.TabsMenu.Visible = true;
-
-            int x = userSettings.GetSetting("Gui.MainForm.Left", 10);
-			int y = userSettings.GetSetting( "Gui.MainForm.Top", 10 );
-			Point location = new Point( x, y );
-
-			if ( !IsValidLocation( location ) )
-				location = new Point( 10, 10 );
-			this.Location = location;
-
-			int width = userSettings.GetSetting( "Gui.MainForm.Width", this.Size.Width );
-			int height = userSettings.GetSetting( "Gui.MainForm.Height", this.Size.Height );
-			if ( width < 160 ) width = 160;
-			if ( height < 32 ) height = 32;
-			this.Size = new Size( width, height );
-
-			// Set to maximized if required
-			if ( userSettings.GetSetting( "Gui.MainForm.Maximized", false ) )
-				this.WindowState = FormWindowState.Maximized;
-
-			// Set the font to use
-            applyFont(userSettings.GetSetting("Gui.MainForm.Font", Form.DefaultFont));
-        }
-
-		private void displayMiniGui()
-		{
-			miniGuiMenuItem.Checked = true;
-			fullGuiMenuItem.Checked = false;
-			
-			this.displayFormat = "Mini";
-			userSettings.SaveSetting( "Gui.DisplayFormat", "Mini" );
-
-            this.leftPanel.Visible = true;
-            this.leftPanel.Dock = DockStyle.Fill;
-            this.treeSplitter.Visible = false;
-            this.rightPanel.Visible = false;
-            this.statusBar.Visible = false;
-
-            resultTabs.TabsMenu.Visible = false;
-
-            int x = userSettings.GetSetting("Gui.MiniForm.Left", 10);
-			int y = userSettings.GetSetting( "Gui.MiniForm.Top", 10 );
-			Point location = new Point( x, y );
-
-			if ( !IsValidLocation( location ) )
-				location = new Point( 10, 10 );
-			this.Location = location;
-
-			int width = userSettings.GetSetting( "Gui.MiniForm.Width", 300 );
-			int height = userSettings.GetSetting( "Gui.MiniForm.Height", this.Size.Height );
-			if ( width < 160 ) width = 160;
-			if ( height < 32 ) height = 32;
-			this.Size = new Size( width, height );
-
-			// Set the font to use
-            applyFont(userSettings.GetSetting("Gui.MiniForm.Font", Form.DefaultFont));
-		}
-
-		private void increaseFontMenuItem_Click(object sender, System.EventArgs e)
-		{
-			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints * 1.2f, this.Font.Style ) );
-		}
-
-		private void decreaseFontMenuItem_Click(object sender, System.EventArgs e)
-		{
-			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints / 1.2f, this.Font.Style ) );
-		}
-
-		private void applyFont( Font font )
-		{
-			this.Font = font;
-			this.runCount.Font = font.FontFamily.IsStyleAvailable( FontStyle.Bold )
-				? new Font( font, FontStyle.Bold )
-				: font;
-			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-			userSettings.SaveSetting( 
-				displayFormat == "Mini" ? "Gui.MiniForm.Font" : "Gui.MainForm.Font", 
-				converter.ConvertToString( null, CultureInfo.InvariantCulture, font ) );
-		}
-
-		private void increaseFixedFontMenuItem_Click(object sender, System.EventArgs e)
-		{
-			applyFixedFont( new Font( fixedFont.FontFamily, fixedFont.SizeInPoints * 1.2f, fixedFont.Style ) );		
-		}
-
-		private void decreaseFixedFontMenuItem_Click(object sender, System.EventArgs e)
-		{
-			applyFixedFont( new Font( fixedFont.FontFamily, fixedFont.SizeInPoints / 1.2f, fixedFont.Style ) );		
-		}
-
-		private void restoreFixedFontMenuItem_Click(object sender, System.EventArgs e)
-		{
-			applyFixedFont( new Font( FontFamily.GenericMonospace, 8.0f ) );
-		}
-
-		private void applyFixedFont( Font font )
-		{
-			this.fixedFont = font;
-			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
-			userSettings.SaveSetting( "Gui.FixedFont", converter.ConvertToString( null, CultureInfo.InvariantCulture, font ) );
-		}
-		#endregion
-
-		#region Project Menu
-
-		/// <summary>
-		/// When the project menu pops up, we populate the
-		/// submenu for configurations dynamically.
-		/// </summary>
-		private void projectMenu_Popup(object sender, System.EventArgs e)
-		{
-			int index = 0;
-			configMenuItem.MenuItems.Clear();
-
-			foreach ( ProjectConfig config in TestProject.Configs )
-			{
-				string text = string.Format( "&{0} {1}", index+1, config.Name );
-				MenuItem item = new MenuItem( 
-					text, new EventHandler( configMenuItem_Click ) );
-				if ( config.Name == TestProject.ActiveConfigName ) 
-					item.Checked = true;
-				configMenuItem.MenuItems.Add( index++, item );
-			}
-
-			configMenuItem.MenuItems.Add( "-" );
-
-			configMenuItem.MenuItems.Add( "&Add...",
-				new System.EventHandler( addConfigurationMenuItem_Click ) );
-
-			configMenuItem.MenuItems.Add( "&Edit...", 
-				new System.EventHandler( editConfigurationsMenuItem_Click ) );
-
-			addVSProjectMenuItem.Visible = userSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false );
-			addAssemblyMenuItem.Enabled = TestProject.Configs.Count > 0;
-		}
-
-		private void configMenuItem_Click( object sender, EventArgs e )
-		{
-			MenuItem item = (MenuItem)sender;
-            if (!item.Checked)
-            {
-                TestProject.SetActiveConfig(TestProject.Configs[item.Index].Name);
-                LoadOrReloadTestAsNeeded();
-            }
-		}
-
-		private void addConfigurationMenuItem_Click( object sender, System.EventArgs e )
-		{
-			using( AddConfigurationDialog dlg = new AddConfigurationDialog( TestProject ) )
-			{
-				this.Site.Container.Add( dlg );
-				dlg.ShowDialog();
-			}
-
-            LoadOrReloadTestAsNeeded();
-		}
-
-		private void editConfigurationsMenuItem_Click( object sender, System.EventArgs e )
-		{
-			using( ConfigurationEditor editor = new ConfigurationEditor( TestProject ) )
-			{
-				this.Site.Container.Add( editor );
-				editor.ShowDialog();
-			}
-
-            LoadOrReloadTestAsNeeded();
-		}
-
-		private void addAssemblyMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.AddAssembly();
-            LoadOrReloadTestAsNeeded();
-		}
-
-		private void addVSProjectMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.AddVSProject();
-            LoadOrReloadTestAsNeeded();
-		}
-
-		private void editProjectMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.EditProject();
-        }
-
-        private void LoadOrReloadTestAsNeeded()
-        {
-            if (TestProject.HasChangesRequiringReload)
-            {
-                if (TestProject.IsLoadable)
-                {
-                    if (IsTestLoaded)
-                        TestLoader.ReloadTest();
-                    else
-                        TestLoader.LoadTest();
-                }
-                else
-                    TestLoader.UnloadTest();
-            }
-        }
-
-		#endregion
-
-		#region Test Menu
-
-		private void runAllMenuItem_Click(object sender, System.EventArgs e)
-		{
-			this.testTree.RunAllTests();
-		}
-
-		private void runSelectedMenuItem_Click(object sender, System.EventArgs e)
-		{
-			this.testTree.RunSelectedTests();
-		
-		}
-
-		private void runFailedMenuItem_Click(object sender, System.EventArgs e)
-		{
-			this.testTree.RunFailedTests();
-		}
-
-		private void stopRunMenuItem_Click(object sender, System.EventArgs e)
-		{
-			CancelRun();
-		}
-
-		#endregion
-
-		#region Tools Menu
-
-		private void toolsMenu_Popup(object sender, System.EventArgs e)
-		{
-            assemblyDetailsMenuItem.Enabled = IsTestLoaded;
-			saveXmlResultsMenuItem.Enabled = IsTestLoaded && TestLoader.TestResult != null;
-			exceptionDetailsMenuItem.Enabled = TestLoader.LastException != null;
-		}
-
-		private void saveXmlResultsMenuItem_Click(object sender, System.EventArgs e)
-		{
-            presenter.SaveLastResult();
-		}
-
-		private void exceptionDetailsMenuItem_Click(object sender, System.EventArgs e)
-		{
-			using( ExceptionDetailsForm details = new ExceptionDetailsForm( TestLoader.LastException ) )
-			{
-				this.Site.Container.Add( details );
-				details.ShowDialog();
-			}
-		}
-
-		private void settingsMenuItem_Click(object sender, System.EventArgs e)
-		{
-			OptionsDialog.Display( this );
-		}
-
-		private void assemblyDetailsMenuItem_Click(object sender, System.EventArgs e)
-		{
-            new TestAssemblyInfoForm().ShowDialog();
-        }
-
-		private void addinInfoMenuItem_Click(object sender, System.EventArgs e)
-		{
-			AddinDialog dlg = new AddinDialog();
-			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
-
-		private void helpMenuItem_Click(object sender, System.EventArgs e)
-		{
-			System.Diagnostics.Process.Start( NUnitConfiguration.HelpUrl );
-		}
-
-		/// <summary>
-		/// Display the about box when menu item is selected
-		/// </summary>
-		private void aboutMenuItem_Click(object sender, System.EventArgs e)
-		{
-			using( AboutBox aboutBox = new AboutBox() )
-			{
-				this.Site.Container.Add( aboutBox );
-				aboutBox.ShowDialog();
-			}
-		}
-
-		#endregion
-
-		#endregion
-
-		#region Form Level Events
-		/// <summary>
-		/// Get saved options when form loads
-		/// </summary>
-		private void NUnitForm_Load(object sender, System.EventArgs e)
-		{
-			if ( !this.DesignMode )
-			{
-				// TODO: Can these controls add their menus themselves?
-				this.viewMenu.MenuItems.Add(3, resultTabs.TabsMenu);
-				this.viewMenu.MenuItems.Add(4, testTree.TreeMenu);
-
-				EnableRunCommand( false );
-				EnableStopCommand( false );
-
-				recentProjectsMenuHandler = new RecentFileMenuHandler( recentProjectsMenu, recentFilesService );
-                recentProjectsMenuHandler.CheckFilesExist = userSettings.GetSetting("Gui.RecentProjects.CheckFilesExist", true);
-
-				LoadFormSettings();
-				SubscribeToTestEvents();
-				InitializeControls();
-
-				// Force display  so that any "Loading..." or error 
-				// message overlays the main form.
-				this.Show();
-				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 )
-                    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 )
-						{
-                            presenter.OpenProject(entry.Path, guiOptions.config, guiOptions.fixture);
-							break;
-						}
-					}
-				}
-
-				if ( guiOptions.include != null )
-				{
-					string[] categories = guiOptions.include.Split( ',' );
-					if ( categories.Length > 0 )
-						this.testTree.SelectCategories( categories, false );
-				}
-				else if ( guiOptions.exclude != null )
-				{
-					string[] categories = guiOptions.exclude.Split( ',' );
-					if ( categories.Length > 0 )
-						this.testTree.SelectCategories( categories, true );
-				}
-
-				// Run loaded test automatically if called for
-				if ( TestLoader.IsTestLoaded )
-					if ( guiOptions.run || guiOptions.runselected )
-					{
-						// TODO: Temporary fix to avoid problem when /run is used 
-						// with ReloadOnRun turned on. Refactor TestLoader so
-						// we can just do a run without reload.
-						bool reload = Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false);
-					
-						try
-						{
-							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", false);
-                            if (guiOptions.runselected)
-                                testTree.RunSelectedTests();
-                            else
-                                testTree.RunAllTests(false);
-						}
-						finally
-						{
-							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", reload);
-						}
-					}
-			}
-		}
-
-		private void LoadFormSettings()
-		{
-			this.displayFormat = userSettings.GetSetting( "Gui.DisplayFormat", "Full" );
-
-            switch (displayFormat)
-            {
-                case "Full":
-                    displayFullGui();
-                    break;
-                case "Mini":
-                    displayMiniGui();
-                    break;
-                default:
-                    throw new ApplicationException("Invalid Setting");
-            }
-
-			// Handle changes to form position
-			this.Move += new System.EventHandler(this.NUnitForm_Move);
-			this.Resize += new System.EventHandler(this.NUnitForm_Resize);
-
-			// Set the splitter position
-			int splitPosition = userSettings.GetSetting( "Gui.MainForm.SplitPosition", treeSplitter.SplitPosition );
-			if ( splitPosition >= treeSplitter.MinSize && splitPosition < this.ClientSize.Width )
-				this.treeSplitter.SplitPosition = splitPosition;
-
-			// Handle changes in splitter positions
-			this.treeSplitter.SplitterMoved += new SplitterEventHandler( treeSplitter_SplitterMoved );
-
-			// Get the fixed font used by result tabs
-            this.fixedFont = userSettings.GetSetting("Gui.FixedFont", new Font(FontFamily.GenericMonospace, 8.0f));
-
-			// Handle changes in form settings
-			userSettings.Changed += new SettingsEventHandler(userSettings_Changed);
-		}
-
-		private bool IsValidLocation( Point location )
-		{
-			Rectangle myArea = new Rectangle( location, this.Size );
-			bool intersect = false;
-			foreach (System.Windows.Forms.Screen screen in System.Windows.Forms.Screen.AllScreens)
-			{
-				intersect |= myArea.IntersectsWith(screen.WorkingArea);
-			}
-			return intersect;
-		}
-
-		private void SubscribeToTestEvents()
-		{
-			ITestEvents events = TestLoader.Events;
-
-			events.RunStarting += new TestEventHandler( OnRunStarting );
-			events.RunFinished += new TestEventHandler( OnRunFinished );
-
-			events.ProjectLoaded	+= new TestEventHandler( OnTestProjectLoaded );
-			events.ProjectLoadFailed+= new TestEventHandler( OnProjectLoadFailure );
-			events.ProjectUnloading += new TestEventHandler( OnTestProjectUnloading );
-			events.ProjectUnloaded	+= new TestEventHandler( OnTestProjectUnloaded );
-
-			events.TestLoading		+= new TestEventHandler( OnTestLoadStarting );
-			events.TestLoaded		+= new TestEventHandler( OnTestLoaded );
-			events.TestLoadFailed	+= new TestEventHandler( OnTestLoadFailure );
-			events.TestUnloading	+= new TestEventHandler( OnTestUnloadStarting );
-			events.TestUnloaded		+= new TestEventHandler( OnTestUnloaded );
-			events.TestReloading	+= new TestEventHandler( OnReloadStarting );
-			events.TestReloaded		+= new TestEventHandler( OnTestChanged );
-			events.TestReloadFailed	+= new TestEventHandler( OnTestLoadFailure );
-		}
-
-		private void InitializeControls()
-		{
-			// ToDo: Migrate more ui elements to handle events on their own.
-			this.progressBar.Subscribe( TestLoader.Events );
-			this.statusBar.Subscribe( TestLoader.Events );
-		}
-
-		// Save settings changed by moving the form
-		private void NUnitForm_Move(object sender, System.EventArgs e)
-		{
-			switch( this.displayFormat )
-			{
-				case "Full":
-				default:
-					if ( this.WindowState == FormWindowState.Normal )
-					{
-						userSettings.SaveSetting( "Gui.MainForm.Left", this.Location.X );
-						userSettings.SaveSetting( "Gui.MainForm.Top", this.Location.Y );
-						userSettings.SaveSetting( "Gui.MainForm.Maximized", false );
-
-						this.statusBar.SizingGrip = true;
-					}
-					else if ( this.WindowState == FormWindowState.Maximized )
-					{
-						userSettings.SaveSetting( "Gui.MainForm.Maximized", true );
-
-						this.statusBar.SizingGrip = false;
-					}
-					break;
-				case "Mini":
-					if ( this.WindowState == FormWindowState.Normal )
-					{
-						userSettings.SaveSetting( "Gui.MiniForm.Left", this.Location.X );
-						userSettings.SaveSetting( "Gui.MiniForm.Top", this.Location.Y );
-						userSettings.SaveSetting( "Gui.MiniForm.Maximized", false );
-
-						this.statusBar.SizingGrip = true;
-					}
-					else if ( this.WindowState == FormWindowState.Maximized )
-					{
-						userSettings.SaveSetting( "Gui.MiniForm.Maximized", true );
-
-						this.statusBar.SizingGrip = false;
-					}
-					break;
-			}
-		}
-
-		// Save settings that change when window is resized
-		private void NUnitForm_Resize(object sender,System.EventArgs e)
-		{
-			if ( this.WindowState == FormWindowState.Normal )
-			{
-				if ( this.displayFormat == "Full" )
-				{
-					userSettings.SaveSetting( "Gui.MainForm.Width", this.Size.Width );
-					userSettings.SaveSetting( "Gui.MainForm.Height", this.Size.Height );
-				}
-				else
-				{
-					userSettings.SaveSetting( "Gui.MiniForm.Width", this.Size.Width );
-					userSettings.SaveSetting( "Gui.MiniForm.Height", this.Size.Height );
-				}
-			}
-		}
-
-		// Splitter moved so save it's position
-		private void treeSplitter_SplitterMoved( object sender, SplitterEventArgs e )
-		{
-			userSettings.SaveSetting( "Gui.MainForm.SplitPosition", treeSplitter.SplitPosition );
-		}
-
-		/// <summary>
-		///	Form is about to close, first see if we 
-		///	have a test run going on and if so whether
-		///	we should cancel it. Then unload the 
-		///	test and save the latest form position.
-		/// </summary>
-		private void NUnitForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
-		{
-			if ( IsTestRunning )
-			{
-                DialogResult dialogResult = MessageDisplay.Ask( 
-					"A test is running, do you want to stop the test and exit?" );
-
-				if ( dialogResult == DialogResult.No )
-					e.Cancel = true;
-				else
-					TestLoader.CancelTestRun();
-			}
-
-			if ( !e.Cancel && IsProjectLoaded &&
-                presenter.CloseProject() == DialogResult.Cancel)
-				e.Cancel = true;
-		}
-
-		private void userSettings_Changed(object sender, SettingsEventArgs args)
-		{
-			if ( args.SettingName == "Gui.DisplayFormat" )
-			{
-				string newFormat = userSettings.GetSetting( "Gui.DisplayFormat", this.displayFormat );
-				if ( newFormat != displayFormat )
-					if ( newFormat == "Full" )
-						displayFullGui();
-					else
-						displayMiniGui();
-			}
-            else if (args.SettingName.StartsWith("Gui.TextOutput.") && args.SettingName.EndsWith(".Content"))
-            {
-                TestLoader.IsTracingEnabled = resultTabs.IsTracingEnabled;
-                TestLoader.LoggingThreshold = resultTabs.MaximumLogLevel;
-            }
-		}
-		#endregion
-
-		#region Other UI Event Handlers
-
-		/// <summary>
-		/// When the Run Button is clicked, run the selected test.
-		/// </summary>
-		private void runButton_Click(object sender, System.EventArgs e)
-		{
-			testTree.RunSelectedTests();
-		}
-
-		/// <summary>
-		/// When the Stop Button is clicked, cancel running test
-		/// </summary>
-		private void stopButton_Click(object sender, System.EventArgs e)
-		{
-			CancelRun();
-		}
-
-		private void CancelRun()
-		{
-			EnableStopCommand( false );
-
-			if ( IsTestRunning )
-			{
-                DialogResult dialogResult = MessageDisplay.Ask( 
-					"Do you want to cancel the running test?" );
-
-				if ( dialogResult == DialogResult.No )
-					EnableStopCommand( true );
-				else
-					TestLoader.CancelTestRun();
-			}
-		}
-
-		private void testTree_SelectedTestsChanged(object sender, SelectedTestsChangedEventArgs e)
-		{
-			if (!IsTestRunning) 
-			{
-				suiteName.Text = e.TestName;
-				statusBar.Initialize(e.TestCount, e.TestName );
-			}
-		}
-
-		#endregion
-
-		#region Event Handlers for Project Load and Unload
-
-		private void OnTestProjectLoaded( object sender, TestEventArgs e )
-		{
-            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)
-		{
-            // 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 )
-						version = info.ImageRuntimeVersion;
-			
-				recentFilesService.SetMostRecent( new RecentFileEntry( e.Name, version ) );
-			}
-		}
-
-		private void OnTestProjectUnloaded( object sender, TestEventArgs e )
-		{
-			SetTitleBar( null );
-			projectMenu.Visible = false;
-			runCount.Text = "";
-		}
-
-        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..." );
-		}
-
-		private void OnTestUnloadStarting( object sender, TestEventArgs e )
-		{
-			EnableRunCommand( false );
-		}
-
-		private void OnReloadStarting( object sender, TestEventArgs e )
-		{
-			EnableRunCommand( false );
-			longOpDisplay = new LongRunningOperationDisplay( this, "Reloading..." );
-		}
-
-		/// <summary>
-		/// A test suite has been loaded, so update 
-		/// recent assemblies and display the tests in the UI
-		/// </summary>
-		private void OnTestLoaded( object sender, TestEventArgs e )
-		{
-			if ( longOpDisplay != null )
-			{
-				longOpDisplay.Dispose();
-				longOpDisplay = null;
-			}
-			EnableRunCommand( true );
-			
-			if ( TestLoader.TestCount == 0 )
-			{
-				foreach( TestAssemblyInfo info in TestLoader.AssemblyInfo )
-					if ( info.TestFrameworks.Count > 0 ) return;
-
-                MessageDisplay.Error("This assembly was not built with any known testing framework.");
-			}
-		}
-
-		/// <summary>
-		/// A test suite has been unloaded, so clear the UI
-		/// and remove any references to the suite.
-		/// </summary>
-		private void OnTestUnloaded( object sender, TestEventArgs e )
-		{
-			suiteName.Text = null;
-            runCount.Text = null;
-			EnableRunCommand( false );
-            Refresh();
-		}
-
-		/// <summary>
-		/// The current test suite has changed in some way,
-		/// so update the info in the UI and clear the
-		/// test results, since they are no longer valid.
-		/// </summary>
-		private void OnTestChanged( object sender, TestEventArgs e )
-		{
-            SetTitleBar(TestProject.Name);
-
-			if ( longOpDisplay != null )
-			{
-				longOpDisplay.Dispose();
-				longOpDisplay = null;
-			}
-
-            if (userSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
-                runCount.Text = null;
-
-			EnableRunCommand( true );
-		}
-
-		/// <summary>
-		/// 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 )
-		{
-			if ( longOpDisplay != null )
-			{
-				longOpDisplay.Dispose();
-				longOpDisplay = null;
-			}
-			
-			string message = e.Action == NUnit.Util.TestAction.TestReloadFailed
-                ? "Test reload failed!"
-                : "Test load failed!";
-			if ( e.Exception is BadImageFormatException )
-				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) );
-
-            MessageDisplay.Error(message, e.Exception);
-
-			if ( !IsTestLoaded )
-				OnTestUnloaded( sender, e );
-			else
-				EnableRunCommand( true );
-		}
-
-		#endregion
-
-		#region Handlers for Test Running Events
-
-		private void OnRunStarting( object sender, TestEventArgs e )
-		{
-			suiteName.Text = e.Name;
-			EnableRunCommand( false );
-			EnableStopCommand( true );
-			runCount.Text = "";
-		}
-
-		private void OnRunFinished( object sender, TestEventArgs e )
-		{
-			EnableStopCommand( false );
-			EnableRunCommand( false );
-
-			if ( e.Exception != null )
-			{
-				if ( ! ( e.Exception is System.Threading.ThreadAbortException ) )
-                    MessageDisplay.Error("NUnit Test Run Failed", e.Exception);
-			}
-
-			ResultSummarizer summary = new ResultSummarizer( e.Result );
-			this.runCount.Text = string.Format(
-                "Passed: {0}   Failed: {1}   Errors: {2}   Inconclusive: {3}   Invalid: {4}   Ignored: {5}   Skipped: {6}   Time: {7}",
-                summary.Passed, summary.Failures, summary.Errors, summary.Inconclusive, summary.NotRunnable, summary.Ignored, summary.Skipped, summary.Time);
-
-            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 ||
-                e.Result.ResultState == ResultState.Cancelled)
-            {
-                this.Activate();
-            }
-		}
-
-		#endregion
-
-		#region Helper methods for modifying the UI display
-
-		/// <summary>
-		/// Set the title bar based on the loaded file or project
-		/// </summary>
-		/// <param name="fileName"></param>
-		private void SetTitleBar( string fileName )
-		{
-			this.Text = fileName == null 
-				? "NUnit"
-				: string.Format( "{0} - NUnit", Path.GetFileName( fileName ) );
-		}
-
-		private void EnableRunCommand( bool enable )
-		{
-			runButton.Enabled = enable;
-			runAllMenuItem.Enabled = enable;
-			runSelectedMenuItem.Enabled = enable;
-		    runFailedMenuItem.Enabled = enable && this.TestLoader.TestResult != null &&
-		        (this.TestLoader.TestResult.ResultState == ResultState.Failure ||
-		         this.TestLoader.TestResult.ResultState == ResultState.Error);
-		}
-
-		private void EnableStopCommand( bool enable )
-		{
-			stopButton.Enabled = enable;
-			stopRunMenuItem.Enabled = enable;
-		}
-
-		#endregion	
-	}
-}
-
+// ****************************************************************
+// 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.Collections;
+using System.Configuration;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.Globalization;
+using System.Windows.Forms;
+using System.IO;
+using System.Reflection;
+using System.Text;
+
+namespace NUnit.Gui
+{
+	using NUnit.Core;
+	using NUnit.Util;
+	using NUnit.UiKit;
+	using CP.Windows.Forms;
+
+	public class NUnitForm : NUnitFormBase
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(NUnitForm));
+        
+        #region Instance variables
+
+		// Handlers for our recentFiles and recentProjects
+		private RecentFileMenuHandler recentProjectsMenuHandler;
+
+		private RecentFiles recentFilesService;
+		private ISettings userSettings;
+
+		private string displayFormat = "Full";
+
+		private LongRunningOperationDisplay longOpDisplay;
+
+		private System.Drawing.Font fixedFont;
+
+		// 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;
+		public System.Windows.Forms.Splitter treeSplitter;
+		public System.Windows.Forms.Panel rightPanel;
+
+		private TestTree testTree;
+
+		public System.Windows.Forms.GroupBox groupBox1;
+		public System.Windows.Forms.Button runButton;
+        private System.Windows.Forms.Button stopButton;
+		public NUnit.UiKit.TestProgressBar progressBar;
+		private CP.Windows.Forms.ExpandingLabel runCount;
+
+		public NUnit.UiKit.ResultTabs resultTabs;
+
+		public NUnit.UiKit.StatusBar statusBar;
+
+		public System.Windows.Forms.ToolTip toolTip;
+
+		public System.Windows.Forms.MainMenu mainMenu;
+		
+		public System.Windows.Forms.MenuItem fileMenu;
+		private System.Windows.Forms.MenuItem saveMenuItem;
+		private System.Windows.Forms.MenuItem saveAsMenuItem;
+		private System.Windows.Forms.MenuItem newMenuItem;
+		private System.Windows.Forms.MenuItem openMenuItem;
+		private System.Windows.Forms.MenuItem recentProjectsMenu;
+		private System.Windows.Forms.MenuItem fileMenuSeparator1;
+		private System.Windows.Forms.MenuItem fileMenuSeparator2;
+		public System.Windows.Forms.MenuItem fileMenuSeparator4;
+		private System.Windows.Forms.MenuItem closeMenuItem;
+		public System.Windows.Forms.MenuItem exitMenuItem;
+
+		private System.Windows.Forms.MenuItem projectMenu;
+		private System.Windows.Forms.MenuItem editProjectMenuItem;
+		private System.Windows.Forms.MenuItem configMenuItem;
+		private System.Windows.Forms.MenuItem projectMenuSeparator1;
+		private System.Windows.Forms.MenuItem projectMenuSeparator2;
+
+		private System.Windows.Forms.MenuItem toolsMenu;
+		private System.Windows.Forms.MenuItem settingsMenuItem;
+		private System.Windows.Forms.MenuItem saveXmlResultsMenuItem;
+
+		public System.Windows.Forms.MenuItem helpMenuItem;
+		public System.Windows.Forms.MenuItem helpItem;
+		public System.Windows.Forms.MenuItem helpMenuSeparator1;
+		public System.Windows.Forms.MenuItem aboutMenuItem;
+
+		private System.Windows.Forms.MenuItem addVSProjectMenuItem;
+		private System.Windows.Forms.MenuItem exceptionDetailsMenuItem;
+		private System.Windows.Forms.MenuItem viewMenu;
+		private System.Windows.Forms.MenuItem statusBarMenuItem;
+		private System.Windows.Forms.MenuItem toolsMenuSeparator2;
+		private System.Windows.Forms.MenuItem miniGuiMenuItem;
+		private System.Windows.Forms.MenuItem fullGuiMenuItem;
+		private System.Windows.Forms.MenuItem fontChangeMenuItem;
+		private System.Windows.Forms.MenuItem defaultFontMenuItem;
+		private System.Windows.Forms.MenuItem decreaseFontMenuItem;
+		private System.Windows.Forms.MenuItem increaseFontMenuItem;
+		private System.Windows.Forms.MenuItem testMenu;
+		private System.Windows.Forms.MenuItem runAllMenuItem;
+		private System.Windows.Forms.MenuItem runSelectedMenuItem;
+		private System.Windows.Forms.MenuItem runFailedMenuItem;
+		private System.Windows.Forms.MenuItem stopRunMenuItem;
+		private System.Windows.Forms.MenuItem addinInfoMenuItem;
+		private System.Windows.Forms.MenuItem viewMenuSeparator1;
+		private System.Windows.Forms.MenuItem viewMenuSeparator2;
+		private System.Windows.Forms.MenuItem viewMenuSeparator3;
+		private System.Windows.Forms.MenuItem fontMenuSeparator;
+		private System.Windows.Forms.MenuItem testMenuSeparator;
+		private System.Windows.Forms.MenuItem guiFontMenuItem;
+		private System.Windows.Forms.MenuItem fixedFontMenuItem;
+		private System.Windows.Forms.MenuItem increaseFixedFontMenuItem;
+		private System.Windows.Forms.MenuItem decreaseFixedFontMenuItem;
+		private System.Windows.Forms.MenuItem menuItem1;
+		private System.Windows.Forms.MenuItem restoreFixedFontMenuItem;
+		private System.Windows.Forms.MenuItem reloadTestsMenuItem;
+		private System.Windows.Forms.MenuItem reloadProjectMenuItem;
+		private System.Windows.Forms.MenuItem menuItem2;
+		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 ) : 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 )
+		{
+			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.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NUnitForm));
+            this.statusBar = new NUnit.UiKit.StatusBar();
+            this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
+            this.fileMenu = new System.Windows.Forms.MenuItem();
+            this.newMenuItem = new System.Windows.Forms.MenuItem();
+            this.openMenuItem = new System.Windows.Forms.MenuItem();
+            this.closeMenuItem = new System.Windows.Forms.MenuItem();
+            this.fileMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.saveMenuItem = new System.Windows.Forms.MenuItem();
+            this.saveAsMenuItem = new System.Windows.Forms.MenuItem();
+            this.fileMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.reloadProjectMenuItem = new System.Windows.Forms.MenuItem();
+            this.reloadTestsMenuItem = new System.Windows.Forms.MenuItem();
+            this.runtimeMenuItem = new System.Windows.Forms.MenuItem();
+            this.menuItem2 = new System.Windows.Forms.MenuItem();
+            this.recentProjectsMenu = new System.Windows.Forms.MenuItem();
+            this.fileMenuSeparator4 = new System.Windows.Forms.MenuItem();
+            this.exitMenuItem = new System.Windows.Forms.MenuItem();
+            this.viewMenu = new System.Windows.Forms.MenuItem();
+            this.fullGuiMenuItem = new System.Windows.Forms.MenuItem();
+            this.miniGuiMenuItem = new System.Windows.Forms.MenuItem();
+            this.viewMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.viewMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.guiFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.increaseFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.decreaseFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.fontMenuSeparator = new System.Windows.Forms.MenuItem();
+            this.fontChangeMenuItem = new System.Windows.Forms.MenuItem();
+            this.defaultFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.fixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.increaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.decreaseFixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.menuItem1 = new System.Windows.Forms.MenuItem();
+            this.restoreFixedFontMenuItem = new System.Windows.Forms.MenuItem();
+            this.viewMenuSeparator3 = new System.Windows.Forms.MenuItem();
+            this.statusBarMenuItem = new System.Windows.Forms.MenuItem();
+            this.projectMenu = new System.Windows.Forms.MenuItem();
+            this.configMenuItem = new System.Windows.Forms.MenuItem();
+            this.projectMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.addAssemblyMenuItem = new System.Windows.Forms.MenuItem();
+            this.addVSProjectMenuItem = new System.Windows.Forms.MenuItem();
+            this.projectMenuSeparator2 = new System.Windows.Forms.MenuItem();
+            this.editProjectMenuItem = new System.Windows.Forms.MenuItem();
+            this.testMenu = new System.Windows.Forms.MenuItem();
+            this.runAllMenuItem = new System.Windows.Forms.MenuItem();
+            this.runSelectedMenuItem = new System.Windows.Forms.MenuItem();
+            this.runFailedMenuItem = new System.Windows.Forms.MenuItem();
+            this.testMenuSeparator = new System.Windows.Forms.MenuItem();
+            this.stopRunMenuItem = new System.Windows.Forms.MenuItem();
+            this.toolsMenu = new System.Windows.Forms.MenuItem();
+            this.assemblyDetailsMenuItem = new System.Windows.Forms.MenuItem();
+            this.saveXmlResultsMenuItem = new System.Windows.Forms.MenuItem();
+            this.exceptionDetailsMenuItem = new System.Windows.Forms.MenuItem();
+            this.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();
+            this.addinInfoMenuItem = new System.Windows.Forms.MenuItem();
+            this.helpItem = new System.Windows.Forms.MenuItem();
+            this.helpMenuItem = new System.Windows.Forms.MenuItem();
+            this.helpMenuSeparator1 = new System.Windows.Forms.MenuItem();
+            this.aboutMenuItem = new System.Windows.Forms.MenuItem();
+            this.treeSplitter = new System.Windows.Forms.Splitter();
+            this.rightPanel = new System.Windows.Forms.Panel();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.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.progressBar = new NUnit.UiKit.TestProgressBar();
+            this.resultTabs = new NUnit.UiKit.ResultTabs();
+            this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.testTree = new NUnit.UiKit.TestTree();
+            this.leftPanel = new System.Windows.Forms.Panel();
+            this.rightPanel.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.leftPanel.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // statusBar
+            // 
+            this.statusBar.DisplayTestProgress = true;
+            this.statusBar.Location = new System.Drawing.Point(0, 407);
+            this.statusBar.Name = "statusBar";
+            this.statusBar.ShowPanels = true;
+            this.statusBar.Size = new System.Drawing.Size(744, 24);
+            this.statusBar.TabIndex = 0;
+            this.statusBar.Text = "Status";
+            // 
+            // mainMenu
+            // 
+            this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.fileMenu,
+            this.viewMenu,
+            this.projectMenu,
+            this.testMenu,
+            this.toolsMenu,
+            this.helpItem});
+            // 
+            // fileMenu
+            // 
+            this.fileMenu.Index = 0;
+            this.fileMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.newMenuItem,
+            this.openMenuItem,
+            this.closeMenuItem,
+            this.fileMenuSeparator1,
+            this.saveMenuItem,
+            this.saveAsMenuItem,
+            this.fileMenuSeparator2,
+            this.reloadProjectMenuItem,
+            this.reloadTestsMenuItem,
+            this.runtimeMenuItem,
+            this.menuItem2,
+            this.recentProjectsMenu,
+            this.fileMenuSeparator4,
+            this.exitMenuItem});
+            this.fileMenu.Text = "&File";
+            this.fileMenu.Popup += new System.EventHandler(this.fileMenu_Popup);
+            // 
+            // newMenuItem
+            // 
+            this.newMenuItem.Index = 0;
+            this.newMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
+            this.newMenuItem.Text = "&New Project...";
+            this.newMenuItem.Click += new System.EventHandler(this.newMenuItem_Click);
+            // 
+            // openMenuItem
+            // 
+            this.openMenuItem.Index = 1;
+            this.openMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
+            this.openMenuItem.Text = "&Open Project...";
+            this.openMenuItem.Click += new System.EventHandler(this.openMenuItem_Click);
+            // 
+            // closeMenuItem
+            // 
+            this.closeMenuItem.Index = 2;
+            this.closeMenuItem.Text = "&Close";
+            this.closeMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click);
+            // 
+            // fileMenuSeparator1
+            // 
+            this.fileMenuSeparator1.Index = 3;
+            this.fileMenuSeparator1.Text = "-";
+            // 
+            // saveMenuItem
+            // 
+            this.saveMenuItem.Index = 4;
+            this.saveMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
+            this.saveMenuItem.Text = "&Save";
+            this.saveMenuItem.Click += new System.EventHandler(this.saveMenuItem_Click);
+            // 
+            // saveAsMenuItem
+            // 
+            this.saveAsMenuItem.Index = 5;
+            this.saveAsMenuItem.Text = "Save &As...";
+            this.saveAsMenuItem.Click += new System.EventHandler(this.saveAsMenuItem_Click);
+            // 
+            // fileMenuSeparator2
+            // 
+            this.fileMenuSeparator2.Index = 6;
+            this.fileMenuSeparator2.Text = "-";
+            // 
+            // reloadProjectMenuItem
+            // 
+            this.reloadProjectMenuItem.Index = 7;
+            this.reloadProjectMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
+            this.reloadProjectMenuItem.Text = "Re&load Project";
+            this.reloadProjectMenuItem.Click += new System.EventHandler(this.reloadProjectMenuItem_Click);
+            // 
+            // reloadTestsMenuItem
+            // 
+            this.reloadTestsMenuItem.Index = 8;
+            this.reloadTestsMenuItem.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
+            this.reloadTestsMenuItem.Text = "&Reload Tests";
+            this.reloadTestsMenuItem.Click += new System.EventHandler(this.reloadTestsMenuItem_Click);
+            // 
+            // runtimeMenuItem
+            // 
+            this.runtimeMenuItem.Index = 9;
+            this.runtimeMenuItem.Text = "  Select R&untime";
+            // 
+            // menuItem2
+            // 
+            this.menuItem2.Index = 10;
+            this.menuItem2.Text = "-";
+            // 
+            // recentProjectsMenu
+            // 
+            this.recentProjectsMenu.Index = 11;
+            this.recentProjectsMenu.Text = "Recent &Projects";
+            // 
+            // fileMenuSeparator4
+            // 
+            this.fileMenuSeparator4.Index = 12;
+            this.fileMenuSeparator4.Text = "-";
+            // 
+            // exitMenuItem
+            // 
+            this.exitMenuItem.Index = 13;
+            this.exitMenuItem.Text = "E&xit";
+            this.exitMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click);
+            // 
+            // viewMenu
+            // 
+            this.viewMenu.Index = 1;
+            this.viewMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.fullGuiMenuItem,
+            this.miniGuiMenuItem,
+            this.viewMenuSeparator1,
+            this.viewMenuSeparator2,
+            this.guiFontMenuItem,
+            this.fixedFontMenuItem,
+            this.viewMenuSeparator3,
+            this.statusBarMenuItem});
+            this.viewMenu.Text = "&View";
+            this.viewMenu.Popup += new System.EventHandler(this.viewMenu_Popup);
+            // 
+            // fullGuiMenuItem
+            // 
+            this.fullGuiMenuItem.Checked = true;
+            this.fullGuiMenuItem.Index = 0;
+            this.fullGuiMenuItem.RadioCheck = true;
+            this.fullGuiMenuItem.Text = "&Full GUI";
+            this.fullGuiMenuItem.Click += new System.EventHandler(this.fullGuiMenuItem_Click);
+            // 
+            // miniGuiMenuItem
+            // 
+            this.miniGuiMenuItem.Index = 1;
+            this.miniGuiMenuItem.RadioCheck = true;
+            this.miniGuiMenuItem.Text = "&Mini GUI";
+            this.miniGuiMenuItem.Click += new System.EventHandler(this.miniGuiMenuItem_Click);
+            // 
+            // viewMenuSeparator1
+            // 
+            this.viewMenuSeparator1.Index = 2;
+            this.viewMenuSeparator1.Text = "-";
+            // 
+            // viewMenuSeparator2
+            // 
+            this.viewMenuSeparator2.Index = 3;
+            this.viewMenuSeparator2.Text = "-";
+            // 
+            // guiFontMenuItem
+            // 
+            this.guiFontMenuItem.Index = 4;
+            this.guiFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.increaseFontMenuItem,
+            this.decreaseFontMenuItem,
+            this.fontMenuSeparator,
+            this.fontChangeMenuItem,
+            this.defaultFontMenuItem});
+            this.guiFontMenuItem.Text = "GUI Fo&nt";
+            // 
+            // increaseFontMenuItem
+            // 
+            this.increaseFontMenuItem.Index = 0;
+            this.increaseFontMenuItem.Text = "&Increase";
+            this.increaseFontMenuItem.Click += new System.EventHandler(this.increaseFontMenuItem_Click);
+            // 
+            // decreaseFontMenuItem
+            // 
+            this.decreaseFontMenuItem.Index = 1;
+            this.decreaseFontMenuItem.Text = "&Decrease";
+            this.decreaseFontMenuItem.Click += new System.EventHandler(this.decreaseFontMenuItem_Click);
+            // 
+            // fontMenuSeparator
+            // 
+            this.fontMenuSeparator.Index = 2;
+            this.fontMenuSeparator.Text = "-";
+            // 
+            // fontChangeMenuItem
+            // 
+            this.fontChangeMenuItem.Index = 3;
+            this.fontChangeMenuItem.Text = "&Change...";
+            this.fontChangeMenuItem.Click += new System.EventHandler(this.fontChangeMenuItem_Click);
+            // 
+            // defaultFontMenuItem
+            // 
+            this.defaultFontMenuItem.Index = 4;
+            this.defaultFontMenuItem.Text = "&Restore";
+            this.defaultFontMenuItem.Click += new System.EventHandler(this.defaultFontMenuItem_Click);
+            // 
+            // fixedFontMenuItem
+            // 
+            this.fixedFontMenuItem.Index = 5;
+            this.fixedFontMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.increaseFixedFontMenuItem,
+            this.decreaseFixedFontMenuItem,
+            this.menuItem1,
+            this.restoreFixedFontMenuItem});
+            this.fixedFontMenuItem.Text = "Fi&xed Font";
+            // 
+            // increaseFixedFontMenuItem
+            // 
+            this.increaseFixedFontMenuItem.Index = 0;
+            this.increaseFixedFontMenuItem.Text = "&Increase";
+            this.increaseFixedFontMenuItem.Click += new System.EventHandler(this.increaseFixedFontMenuItem_Click);
+            // 
+            // decreaseFixedFontMenuItem
+            // 
+            this.decreaseFixedFontMenuItem.Index = 1;
+            this.decreaseFixedFontMenuItem.Text = "&Decrease";
+            this.decreaseFixedFontMenuItem.Click += new System.EventHandler(this.decreaseFixedFontMenuItem_Click);
+            // 
+            // menuItem1
+            // 
+            this.menuItem1.Index = 2;
+            this.menuItem1.Text = "-";
+            // 
+            // restoreFixedFontMenuItem
+            // 
+            this.restoreFixedFontMenuItem.Index = 3;
+            this.restoreFixedFontMenuItem.Text = "&Restore";
+            this.restoreFixedFontMenuItem.Click += new System.EventHandler(this.restoreFixedFontMenuItem_Click);
+            // 
+            // viewMenuSeparator3
+            // 
+            this.viewMenuSeparator3.Index = 6;
+            this.viewMenuSeparator3.Text = "-";
+            // 
+            // statusBarMenuItem
+            // 
+            this.statusBarMenuItem.Checked = true;
+            this.statusBarMenuItem.Index = 7;
+            this.statusBarMenuItem.Text = "&Status Bar";
+            this.statusBarMenuItem.Click += new System.EventHandler(this.statusBarMenuItem_Click);
+            // 
+            // projectMenu
+            // 
+            this.projectMenu.Index = 2;
+            this.projectMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.configMenuItem,
+            this.projectMenuSeparator1,
+            this.addAssemblyMenuItem,
+            this.addVSProjectMenuItem,
+            this.projectMenuSeparator2,
+            this.editProjectMenuItem});
+            this.projectMenu.Text = "&Project";
+            this.projectMenu.Visible = false;
+            this.projectMenu.Popup += new System.EventHandler(this.projectMenu_Popup);
+            // 
+            // configMenuItem
+            // 
+            this.configMenuItem.Index = 0;
+            this.configMenuItem.Text = "&Configurations";
+            // 
+            // projectMenuSeparator1
+            // 
+            this.projectMenuSeparator1.Index = 1;
+            this.projectMenuSeparator1.Text = "-";
+            // 
+            // addAssemblyMenuItem
+            // 
+            this.addAssemblyMenuItem.Index = 2;
+            this.addAssemblyMenuItem.Text = "Add Assembly...";
+            this.addAssemblyMenuItem.Click += new System.EventHandler(this.addAssemblyMenuItem_Click);
+            // 
+            // addVSProjectMenuItem
+            // 
+            this.addVSProjectMenuItem.Index = 3;
+            this.addVSProjectMenuItem.Text = "Add VS Project...";
+            this.addVSProjectMenuItem.Click += new System.EventHandler(this.addVSProjectMenuItem_Click);
+            // 
+            // projectMenuSeparator2
+            // 
+            this.projectMenuSeparator2.Index = 4;
+            this.projectMenuSeparator2.Text = "-";
+            // 
+            // editProjectMenuItem
+            // 
+            this.editProjectMenuItem.Index = 5;
+            this.editProjectMenuItem.Text = "Edit...";
+            this.editProjectMenuItem.Click += new System.EventHandler(this.editProjectMenuItem_Click);
+            // 
+            // testMenu
+            // 
+            this.testMenu.Index = 3;
+            this.testMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.runAllMenuItem,
+            this.runSelectedMenuItem,
+            this.runFailedMenuItem,
+            this.testMenuSeparator,
+            this.stopRunMenuItem});
+            this.testMenu.Text = "&Tests";
+            // 
+            // runAllMenuItem
+            // 
+            this.runAllMenuItem.Index = 0;
+            this.runAllMenuItem.Shortcut = System.Windows.Forms.Shortcut.F5;
+            this.runAllMenuItem.Text = "&Run All";
+            this.runAllMenuItem.Click += new System.EventHandler(this.runAllMenuItem_Click);
+            // 
+            // runSelectedMenuItem
+            // 
+            this.runSelectedMenuItem.Index = 1;
+            this.runSelectedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F6;
+            this.runSelectedMenuItem.Text = "Run &Selected";
+            this.runSelectedMenuItem.Click += new System.EventHandler(this.runSelectedMenuItem_Click);
+            // 
+            // runFailedMenuItem
+            // 
+            this.runFailedMenuItem.Enabled = false;
+            this.runFailedMenuItem.Index = 2;
+            this.runFailedMenuItem.Shortcut = System.Windows.Forms.Shortcut.F7;
+            this.runFailedMenuItem.Text = "Run &Failed";
+            this.runFailedMenuItem.Click += new System.EventHandler(this.runFailedMenuItem_Click);
+            // 
+            // testMenuSeparator
+            // 
+            this.testMenuSeparator.Index = 3;
+            this.testMenuSeparator.Text = "-";
+            // 
+            // stopRunMenuItem
+            // 
+            this.stopRunMenuItem.Index = 4;
+            this.stopRunMenuItem.Text = "S&top Run";
+            this.stopRunMenuItem.Click += new System.EventHandler(this.stopRunMenuItem_Click);
+            // 
+            // toolsMenu
+            // 
+            this.toolsMenu.Index = 4;
+            this.toolsMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.assemblyDetailsMenuItem,
+            this.saveXmlResultsMenuItem,
+            this.exceptionDetailsMenuItem,
+            this.openLogDirectoryMenuItem,
+            this.toolsMenuSeparator1,
+            this.settingsMenuItem,
+            this.toolsMenuSeparator2,
+            this.addinInfoMenuItem});
+            this.toolsMenu.Text = "T&ools";
+            this.toolsMenu.Popup += new System.EventHandler(this.toolsMenu_Popup);
+            // 
+            // assemblyDetailsMenuItem
+            // 
+            this.assemblyDetailsMenuItem.Index = 0;
+            this.assemblyDetailsMenuItem.Text = "&Test Assemblies...";
+            this.assemblyDetailsMenuItem.Click += new System.EventHandler(this.assemblyDetailsMenuItem_Click);
+            // 
+            // saveXmlResultsMenuItem
+            // 
+            this.saveXmlResultsMenuItem.Index = 1;
+            this.saveXmlResultsMenuItem.Text = "&Save Results as XML...";
+            this.saveXmlResultsMenuItem.Click += new System.EventHandler(this.saveXmlResultsMenuItem_Click);
+            // 
+            // exceptionDetailsMenuItem
+            // 
+            this.exceptionDetailsMenuItem.Index = 2;
+            this.exceptionDetailsMenuItem.Text = "&Exception Details...";
+            this.exceptionDetailsMenuItem.Click += new System.EventHandler(this.exceptionDetailsMenuItem_Click);
+            // 
+            // openLogDirectoryMenuItem
+            // 
+            this.openLogDirectoryMenuItem.Index = 3;
+            this.openLogDirectoryMenuItem.Text = "Open &Log Directory...";
+            this.openLogDirectoryMenuItem.Click += new System.EventHandler(this.openLogDirectoryMenuItem_Click);
+            // 
+            // toolsMenuSeparator1
+            // 
+            this.toolsMenuSeparator1.Index = 4;
+            this.toolsMenuSeparator1.Text = "-";
+            // 
+            // settingsMenuItem
+            // 
+            this.settingsMenuItem.Index = 5;
+            this.settingsMenuItem.Text = "&Settings...";
+            this.settingsMenuItem.Click += new System.EventHandler(this.settingsMenuItem_Click);
+            // 
+            // toolsMenuSeparator2
+            // 
+            this.toolsMenuSeparator2.Index = 6;
+            this.toolsMenuSeparator2.Text = "-";
+            // 
+            // addinInfoMenuItem
+            // 
+            this.addinInfoMenuItem.Index = 7;
+            this.addinInfoMenuItem.Text = "Addins...";
+            this.addinInfoMenuItem.Click += new System.EventHandler(this.addinInfoMenuItem_Click);
+            // 
+            // helpItem
+            // 
+            this.helpItem.Index = 5;
+            this.helpItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.helpMenuItem,
+            this.helpMenuSeparator1,
+            this.aboutMenuItem});
+            this.helpItem.Text = "&Help";
+            // 
+            // helpMenuItem
+            // 
+            this.helpMenuItem.Index = 0;
+            this.helpMenuItem.Shortcut = System.Windows.Forms.Shortcut.F1;
+            this.helpMenuItem.Text = "NUnit &Help...";
+            this.helpMenuItem.Click += new System.EventHandler(this.helpMenuItem_Click);
+            // 
+            // helpMenuSeparator1
+            // 
+            this.helpMenuSeparator1.Index = 1;
+            this.helpMenuSeparator1.Text = "-";
+            // 
+            // aboutMenuItem
+            // 
+            this.aboutMenuItem.Index = 2;
+            this.aboutMenuItem.Text = "&About NUnit...";
+            this.aboutMenuItem.Click += new System.EventHandler(this.aboutMenuItem_Click);
+            // 
+            // treeSplitter
+            // 
+            this.treeSplitter.Location = new System.Drawing.Point(240, 0);
+            this.treeSplitter.MinSize = 240;
+            this.treeSplitter.Name = "treeSplitter";
+            this.treeSplitter.Size = new System.Drawing.Size(6, 407);
+            this.treeSplitter.TabIndex = 2;
+            this.treeSplitter.TabStop = false;
+            // 
+            // rightPanel
+            // 
+            this.rightPanel.BackColor = System.Drawing.SystemColors.Control;
+            this.rightPanel.Controls.Add(this.groupBox1);
+            this.rightPanel.Controls.Add(this.resultTabs);
+            this.rightPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.rightPanel.Location = new System.Drawing.Point(246, 0);
+            this.rightPanel.Name = "rightPanel";
+            this.rightPanel.Size = new System.Drawing.Size(498, 407);
+            this.rightPanel.TabIndex = 3;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.suiteName);
+            this.groupBox1.Controls.Add(this.runCount);
+            this.groupBox1.Controls.Add(this.stopButton);
+            this.groupBox1.Controls.Add(this.runButton);
+            this.groupBox1.Controls.Add(this.progressBar);
+            this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.groupBox1.Location = new System.Drawing.Point(0, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(498, 120);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            // 
+            // 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.AutoEllipsis = true;
+            this.runCount.Location = new System.Drawing.Point(8, 89);
+            this.runCount.Name = "runCount";
+            this.runCount.Size = new System.Drawing.Size(480, 21);
+            this.runCount.TabIndex = 5;
+            // 
+            // stopButton
+            // 
+            this.stopButton.AutoSize = true;
+            this.stopButton.Location = new System.Drawing.Point(75, 16);
+            this.stopButton.Name = "stopButton";
+            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, 16);
+            this.runButton.Name = "runButton";
+            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);
+            // 
+            // progressBar
+            // 
+            this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.progressBar.BackColor = System.Drawing.SystemColors.Control;
+            this.progressBar.CausesValidation = false;
+            this.progressBar.Enabled = false;
+            this.progressBar.ForeColor = System.Drawing.SystemColors.Highlight;
+            this.progressBar.Location = new System.Drawing.Point(8, 54);
+            this.progressBar.Maximum = 100;
+            this.progressBar.Minimum = 0;
+            this.progressBar.Name = "progressBar";
+            this.progressBar.Segmented = true;
+            this.progressBar.Size = new System.Drawing.Size(480, 28);
+            this.progressBar.Step = 1;
+            this.progressBar.TabIndex = 0;
+            this.progressBar.Value = 0;
+            // 
+            // resultTabs
+            // 
+            this.resultTabs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.resultTabs.Location = new System.Drawing.Point(0, 120);
+            this.resultTabs.Name = "resultTabs";
+            this.resultTabs.Size = new System.Drawing.Size(498, 284);
+            this.resultTabs.TabIndex = 2;
+            // 
+            // testTree
+            // 
+            this.testTree.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.testTree.Location = new System.Drawing.Point(0, 0);
+            this.testTree.Name = "testTree";
+            this.testTree.ShowCheckBoxes = false;
+            this.testTree.Size = new System.Drawing.Size(240, 407);
+            this.testTree.TabIndex = 0;
+            this.testTree.SelectedTestsChanged += new NUnit.UiKit.SelectedTestsChangedEventHandler(this.testTree_SelectedTestsChanged);
+            // 
+            // leftPanel
+            // 
+            this.leftPanel.Controls.Add(this.testTree);
+            this.leftPanel.Dock = System.Windows.Forms.DockStyle.Left;
+            this.leftPanel.Location = new System.Drawing.Point(0, 0);
+            this.leftPanel.Name = "leftPanel";
+            this.leftPanel.Size = new System.Drawing.Size(240, 407);
+            this.leftPanel.TabIndex = 4;
+            // 
+            // NUnitForm
+            // 
+            this.ClientSize = new System.Drawing.Size(744, 431);
+            this.Controls.Add(this.rightPanel);
+            this.Controls.Add(this.treeSplitter);
+            this.Controls.Add(this.leftPanel);
+            this.Controls.Add(this.statusBar);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Menu = this.mainMenu;
+            this.MinimumSize = new System.Drawing.Size(160, 32);
+            this.Name = "NUnitForm";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+            this.Text = "NUnit";
+            this.Load += new System.EventHandler(this.NUnitForm_Load);
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.NUnitForm_Closing);
+            this.rightPanel.ResumeLayout(false);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.leftPanel.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+        #region Public Properties
+
+        public NUnitPresenter Presenter
+        {
+            get { return presenter; }
+        }
+
+        #endregion
+
+        #region Properties used internally
+
+        private TestLoader _testLoader;
+		private TestLoader TestLoader
+		{
+			get
+			{ 
+				if ( _testLoader == null )
+					_testLoader = Services.TestLoader;
+				return _testLoader;
+			}
+		}
+
+		private bool IsProjectLoaded
+		{
+			get { return TestLoader.IsProjectLoaded; }
+		}
+
+		private NUnitProject TestProject
+		{
+			get { return TestLoader.TestProject; }
+		}
+
+		private bool IsTestLoaded
+		{
+			get { return TestLoader.IsTestLoaded; }
+		}
+
+		private bool IsTestRunning
+		{
+			get { return TestLoader.Running; }
+		}
+		#endregion
+
+		#region Menu Handlers
+
+		#region File Menu
+
+		private void fileMenu_Popup(object sender, System.EventArgs e)
+		{
+			newMenuItem.Enabled = !IsTestRunning;
+			openMenuItem.Enabled = !IsTestRunning;
+			closeMenuItem.Enabled = IsProjectLoaded && !IsTestRunning;
+
+			saveMenuItem.Enabled = IsProjectLoaded;
+			saveAsMenuItem.Enabled = IsProjectLoaded;
+
+			reloadTestsMenuItem.Enabled = IsTestLoaded && !IsTestRunning;
+            reloadProjectMenuItem.Enabled = runtimeMenuItem.Enabled = 
+                IsProjectLoaded && 
+                File.Exists(TestProject.ProjectPath) &&
+                !IsTestRunning;
+
+            RuntimeFramework current = TestLoader.CurrentFramework;
+            RuntimeFramework[] frameworks = RuntimeFramework.AvailableFrameworks;
+
+            runtimeMenuItem.Visible = frameworks.Length > 1;
+
+            if (runtimeMenuItem.Visible && runtimeMenuItem.Enabled)
+            {
+                runtimeMenuItem.MenuItems.Clear();
+
+                foreach (RuntimeFramework framework in frameworks)
+                {
+                    MenuItem item = new MenuItem(framework.DisplayName);
+                    item.Checked = current.Supports(framework);
+                    item.Tag = framework;
+                    item.Click += new EventHandler(runtimeFrameworkMenuItem_Click);
+                    try
+                    {
+                        item.Enabled = TestLoader.CanReloadUnderRuntimeVersion(framework.ClrVersion);
+                    }
+                    catch
+                    {
+                        item.Enabled = false;
+                    }
+                    runtimeMenuItem.MenuItems.Add(item);
+                }
+            }
+
+			recentProjectsMenu.Enabled = !IsTestRunning;
+
+			if ( !IsTestRunning )
+			{
+				recentProjectsMenuHandler.Load();
+			}
+		}
+
+		private void newMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.NewProject();
+		}
+
+		private void openMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.OpenProject();
+		}
+
+		private void closeMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.CloseProject();
+		}
+
+		private void saveMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.SaveProject();
+		}
+
+		private void saveAsMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.SaveProjectAs();
+            SetTitleBar(TestProject.Name);
+		}
+
+        private void runtimeFrameworkMenuItem_Click(object sender, System.EventArgs e)
+        {
+            TestLoader.ReloadTest(((MenuItem)sender).Tag as RuntimeFramework);
+        }
+
+		private void reloadProjectMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.ReloadProject();
+		}
+
+		private void reloadTestsMenuItem_Click(object sender, System.EventArgs e)
+		{
+			TestLoader.ReloadTest();
+		}
+
+		private void exitMenuItem_Click(object sender, System.EventArgs e)
+		{
+			this.Close();
+		}
+
+		#endregion
+
+		#region View Menu
+		private void viewMenu_Popup(object sender, System.EventArgs e)
+		{
+			assemblyDetailsMenuItem.Enabled = this.TestLoader.IsTestLoaded;
+		}
+
+		private void statusBarMenuItem_Click(object sender, System.EventArgs e)
+		{
+			statusBarMenuItem.Checked = !statusBarMenuItem.Checked;
+			statusBar.Visible = statusBarMenuItem.Checked;
+		}
+
+		private void fontChangeMenuItem_Click(object sender, System.EventArgs e)
+		{
+			FontDialog fontDialog = new FontDialog();
+			fontDialog.FontMustExist = true;
+			fontDialog.Font = this.Font;
+			fontDialog.MinSize = 6;
+			fontDialog.MaxSize = 12;
+			fontDialog.AllowVectorFonts = false;
+			fontDialog.ScriptsOnly = true;
+			fontDialog.ShowEffects = false;
+			fontDialog.ShowApply = true;
+			fontDialog.Apply += new EventHandler(fontDialog_Apply);
+			if( fontDialog.ShowDialog() == DialogResult.OK )
+				applyFont( fontDialog.Font );
+		}
+
+		private void fontDialog_Apply(object sender, EventArgs e)
+		{
+			applyFont( ((FontDialog)sender).Font );
+		}
+
+
+		private void defaultFontMenuItem_Click(object sender, System.EventArgs e)
+		{
+			applyFont( System.Windows.Forms.Form.DefaultFont );
+		}
+
+		private void fullGuiMenuItem_Click(object sender, System.EventArgs e)
+		{
+			if ( !fullGuiMenuItem.Checked )
+				displayFullGui();
+		}
+
+		private void miniGuiMenuItem_Click(object sender, System.EventArgs e)
+		{
+			if ( !miniGuiMenuItem.Checked )
+				displayMiniGui();
+		}
+
+		private void displayFullGui()
+		{
+			fullGuiMenuItem.Checked = true;
+			miniGuiMenuItem.Checked = false;
+
+			this.displayFormat = "Full";
+			userSettings.SaveSetting( "Gui.DisplayFormat", "Full" );
+
+            this.leftPanel.Visible = true;
+            this.leftPanel.Dock = DockStyle.Left;
+            this.treeSplitter.Visible = true;
+            this.rightPanel.Visible = true;
+            this.statusBar.Visible = true;
+
+            resultTabs.TabsMenu.Visible = true;
+
+            int x = userSettings.GetSetting("Gui.MainForm.Left", 10);
+			int y = userSettings.GetSetting( "Gui.MainForm.Top", 10 );
+			Point location = new Point( x, y );
+
+			if ( !IsValidLocation( location ) )
+				location = new Point( 10, 10 );
+			this.Location = location;
+
+			int width = userSettings.GetSetting( "Gui.MainForm.Width", this.Size.Width );
+			int height = userSettings.GetSetting( "Gui.MainForm.Height", this.Size.Height );
+			if ( width < 160 ) width = 160;
+			if ( height < 32 ) height = 32;
+			this.Size = new Size( width, height );
+
+			// Set to maximized if required
+			if ( userSettings.GetSetting( "Gui.MainForm.Maximized", false ) )
+				this.WindowState = FormWindowState.Maximized;
+
+			// Set the font to use
+            applyFont(userSettings.GetSetting("Gui.MainForm.Font", Form.DefaultFont));
+        }
+
+		private void displayMiniGui()
+		{
+			miniGuiMenuItem.Checked = true;
+			fullGuiMenuItem.Checked = false;
+			
+			this.displayFormat = "Mini";
+			userSettings.SaveSetting( "Gui.DisplayFormat", "Mini" );
+
+            this.leftPanel.Visible = true;
+            this.leftPanel.Dock = DockStyle.Fill;
+            this.treeSplitter.Visible = false;
+            this.rightPanel.Visible = false;
+            this.statusBar.Visible = false;
+
+            resultTabs.TabsMenu.Visible = false;
+
+            int x = userSettings.GetSetting("Gui.MiniForm.Left", 10);
+			int y = userSettings.GetSetting( "Gui.MiniForm.Top", 10 );
+			Point location = new Point( x, y );
+
+			if ( !IsValidLocation( location ) )
+				location = new Point( 10, 10 );
+			this.Location = location;
+
+			int width = userSettings.GetSetting( "Gui.MiniForm.Width", 300 );
+			int height = userSettings.GetSetting( "Gui.MiniForm.Height", this.Size.Height );
+			if ( width < 160 ) width = 160;
+			if ( height < 32 ) height = 32;
+			this.Size = new Size( width, height );
+
+			// Set the font to use
+            applyFont(userSettings.GetSetting("Gui.MiniForm.Font", Form.DefaultFont));
+		}
+
+		private void increaseFontMenuItem_Click(object sender, System.EventArgs e)
+		{
+			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints * 1.2f, this.Font.Style ) );
+		}
+
+		private void decreaseFontMenuItem_Click(object sender, System.EventArgs e)
+		{
+			applyFont( new Font( this.Font.FontFamily, this.Font.SizeInPoints / 1.2f, this.Font.Style ) );
+		}
+
+		private void applyFont( Font font )
+		{
+			this.Font = font;
+			this.runCount.Font = font.FontFamily.IsStyleAvailable( FontStyle.Bold )
+				? new Font( font, FontStyle.Bold )
+				: font;
+			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
+			userSettings.SaveSetting( 
+				displayFormat == "Mini" ? "Gui.MiniForm.Font" : "Gui.MainForm.Font", 
+				converter.ConvertToString( null, CultureInfo.InvariantCulture, font ) );
+		}
+
+		private void increaseFixedFontMenuItem_Click(object sender, System.EventArgs e)
+		{
+			applyFixedFont( new Font( fixedFont.FontFamily, fixedFont.SizeInPoints * 1.2f, fixedFont.Style ) );		
+		}
+
+		private void decreaseFixedFontMenuItem_Click(object sender, System.EventArgs e)
+		{
+			applyFixedFont( new Font( fixedFont.FontFamily, fixedFont.SizeInPoints / 1.2f, fixedFont.Style ) );		
+		}
+
+		private void restoreFixedFontMenuItem_Click(object sender, System.EventArgs e)
+		{
+			applyFixedFont( new Font( FontFamily.GenericMonospace, 8.0f ) );
+		}
+
+		private void applyFixedFont( Font font )
+		{
+			this.fixedFont = font;
+			TypeConverter converter = TypeDescriptor.GetConverter(typeof(Font));
+			userSettings.SaveSetting( "Gui.FixedFont", converter.ConvertToString( null, CultureInfo.InvariantCulture, font ) );
+		}
+		#endregion
+
+		#region Project Menu
+
+		/// <summary>
+		/// When the project menu pops up, we populate the
+		/// submenu for configurations dynamically.
+		/// </summary>
+		private void projectMenu_Popup(object sender, System.EventArgs e)
+		{
+			int index = 0;
+			configMenuItem.MenuItems.Clear();
+
+			foreach ( ProjectConfig config in TestProject.Configs )
+			{
+				string text = string.Format( "&{0} {1}", index+1, config.Name );
+				MenuItem item = new MenuItem( 
+					text, new EventHandler( configMenuItem_Click ) );
+				if ( config.Name == TestProject.ActiveConfigName ) 
+					item.Checked = true;
+				configMenuItem.MenuItems.Add( index++, item );
+			}
+
+			configMenuItem.MenuItems.Add( "-" );
+
+			configMenuItem.MenuItems.Add( "&Add...",
+				new System.EventHandler( addConfigurationMenuItem_Click ) );
+
+			configMenuItem.MenuItems.Add( "&Edit...", 
+				new System.EventHandler( editConfigurationsMenuItem_Click ) );
+
+			addVSProjectMenuItem.Visible = userSettings.GetSetting( "Options.TestLoader.VisualStudioSupport", false );
+			addAssemblyMenuItem.Enabled = TestProject.Configs.Count > 0;
+		}
+
+		private void configMenuItem_Click( object sender, EventArgs e )
+		{
+			MenuItem item = (MenuItem)sender;
+            if (!item.Checked)
+            {
+                TestProject.SetActiveConfig(TestProject.Configs[item.Index].Name);
+                LoadOrReloadTestAsNeeded();
+            }
+		}
+
+		private void addConfigurationMenuItem_Click( object sender, System.EventArgs e )
+		{
+			using( AddConfigurationDialog dlg = new AddConfigurationDialog( TestProject ) )
+			{
+				this.Site.Container.Add( dlg );
+				dlg.ShowDialog();
+			}
+
+            LoadOrReloadTestAsNeeded();
+		}
+
+		private void editConfigurationsMenuItem_Click( object sender, System.EventArgs e )
+		{
+			using( ConfigurationEditor editor = new ConfigurationEditor( TestProject ) )
+			{
+				this.Site.Container.Add( editor );
+				editor.ShowDialog();
+			}
+
+            LoadOrReloadTestAsNeeded();
+		}
+
+		private void addAssemblyMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.AddAssembly();
+            LoadOrReloadTestAsNeeded();
+		}
+
+		private void addVSProjectMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.AddVSProject();
+            LoadOrReloadTestAsNeeded();
+		}
+
+		private void editProjectMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.EditProject();
+        }
+
+        private void LoadOrReloadTestAsNeeded()
+        {
+            if (TestProject.HasChangesRequiringReload)
+            {
+                if (TestProject.IsLoadable)
+                {
+                    if (IsTestLoaded)
+                        TestLoader.ReloadTest();
+                    else
+                        TestLoader.LoadTest();
+                }
+                else
+                    TestLoader.UnloadTest();
+            }
+        }
+
+		#endregion
+
+		#region Test Menu
+
+		private void runAllMenuItem_Click(object sender, System.EventArgs e)
+		{
+			this.testTree.RunAllTests();
+		}
+
+		private void runSelectedMenuItem_Click(object sender, System.EventArgs e)
+		{
+			this.testTree.RunSelectedTests();
+		
+		}
+
+		private void runFailedMenuItem_Click(object sender, System.EventArgs e)
+		{
+			this.testTree.RunFailedTests();
+		}
+
+		private void stopRunMenuItem_Click(object sender, System.EventArgs e)
+		{
+			CancelRun();
+		}
+
+		#endregion
+
+		#region Tools Menu
+
+		private void toolsMenu_Popup(object sender, System.EventArgs e)
+		{
+            assemblyDetailsMenuItem.Enabled = IsTestLoaded;
+			saveXmlResultsMenuItem.Enabled = IsTestLoaded && TestLoader.TestResult != null;
+			exceptionDetailsMenuItem.Enabled = TestLoader.LastException != null;
+		}
+
+		private void saveXmlResultsMenuItem_Click(object sender, System.EventArgs e)
+		{
+            presenter.SaveLastResult();
+		}
+
+		private void exceptionDetailsMenuItem_Click(object sender, System.EventArgs e)
+		{
+			using( ExceptionDetailsForm details = new ExceptionDetailsForm( TestLoader.LastException ) )
+			{
+				this.Site.Container.Add( details );
+				details.ShowDialog();
+			}
+		}
+
+		private void settingsMenuItem_Click(object sender, System.EventArgs e)
+		{
+			OptionsDialog.Display( this );
+		}
+
+		private void assemblyDetailsMenuItem_Click(object sender, System.EventArgs e)
+		{
+            new TestAssemblyInfoForm().ShowDialog();
+        }
+
+		private void addinInfoMenuItem_Click(object sender, System.EventArgs e)
+		{
+			AddinDialog dlg = new AddinDialog();
+			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
+
+		private void helpMenuItem_Click(object sender, System.EventArgs e)
+		{
+			System.Diagnostics.Process.Start( NUnitConfiguration.HelpUrl );
+		}
+
+		/// <summary>
+		/// Display the about box when menu item is selected
+		/// </summary>
+		private void aboutMenuItem_Click(object sender, System.EventArgs e)
+		{
+			using( AboutBox aboutBox = new AboutBox() )
+			{
+				this.Site.Container.Add( aboutBox );
+				aboutBox.ShowDialog();
+			}
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Form Level Events
+		/// <summary>
+		/// Get saved options when form loads
+		/// </summary>
+		private void NUnitForm_Load(object sender, System.EventArgs e)
+		{
+			if ( !this.DesignMode )
+			{
+				// TODO: Can these controls add their menus themselves?
+				this.viewMenu.MenuItems.Add(3, resultTabs.TabsMenu);
+				this.viewMenu.MenuItems.Add(4, testTree.TreeMenu);
+
+				EnableRunCommand( false );
+				EnableStopCommand( false );
+
+				recentProjectsMenuHandler = new RecentFileMenuHandler( recentProjectsMenu, recentFilesService );
+                recentProjectsMenuHandler.CheckFilesExist = userSettings.GetSetting("Gui.RecentProjects.CheckFilesExist", true);
+
+				LoadFormSettings();
+				SubscribeToTestEvents();
+				InitializeControls();
+
+				// Force display  so that any "Loading..." or error 
+				// message overlays the main form.
+				this.Show();
+				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 )
+                    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 )
+						{
+                            presenter.OpenProject(entry.Path, guiOptions.config, guiOptions.fixture);
+							break;
+						}
+					}
+				}
+
+				if ( guiOptions.include != null )
+				{
+					string[] categories = guiOptions.include.Split( ',' );
+					if ( categories.Length > 0 )
+						this.testTree.SelectCategories( categories, false );
+				}
+				else if ( guiOptions.exclude != null )
+				{
+					string[] categories = guiOptions.exclude.Split( ',' );
+					if ( categories.Length > 0 )
+						this.testTree.SelectCategories( categories, true );
+				}
+
+				// Run loaded test automatically if called for
+				if ( TestLoader.IsTestLoaded )
+					if ( guiOptions.run || guiOptions.runselected )
+					{
+						// TODO: Temporary fix to avoid problem when /run is used 
+						// with ReloadOnRun turned on. Refactor TestLoader so
+						// we can just do a run without reload.
+						bool reload = Services.UserSettings.GetSetting("Options.TestLoader.ReloadOnRun", false);
+					
+						try
+						{
+							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", false);
+                            if (guiOptions.runselected)
+                                testTree.RunSelectedTests();
+                            else
+                                testTree.RunAllTests(false);
+						}
+						finally
+						{
+							Services.UserSettings.SaveSetting("Options.TestLoader.ReloadOnRun", reload);
+						}
+					}
+			}
+		}
+
+		private void LoadFormSettings()
+		{
+			this.displayFormat = userSettings.GetSetting( "Gui.DisplayFormat", "Full" );
+
+            switch (displayFormat)
+            {
+                case "Full":
+                    displayFullGui();
+                    break;
+                case "Mini":
+                    displayMiniGui();
+                    break;
+                default:
+                    throw new ApplicationException("Invalid Setting");
+            }
+
+			// Handle changes to form position
+			this.Move += new System.EventHandler(this.NUnitForm_Move);
+			this.Resize += new System.EventHandler(this.NUnitForm_Resize);
+
+			// Set the splitter position
+			int splitPosition = userSettings.GetSetting( "Gui.MainForm.SplitPosition", treeSplitter.SplitPosition );
+			if ( splitPosition >= treeSplitter.MinSize && splitPosition < this.ClientSize.Width )
+				this.treeSplitter.SplitPosition = splitPosition;
+
+			// Handle changes in splitter positions
+			this.treeSplitter.SplitterMoved += new SplitterEventHandler( treeSplitter_SplitterMoved );
+
+			// Get the fixed font used by result tabs
+            this.fixedFont = userSettings.GetSetting("Gui.FixedFont", new Font(FontFamily.GenericMonospace, 8.0f));
+
+			// Handle changes in form settings
+			userSettings.Changed += new SettingsEventHandler(userSettings_Changed);
+		}
+
+		private bool IsValidLocation( Point location )
+		{
+			Rectangle myArea = new Rectangle( location, this.Size );
+			bool intersect = false;
+			foreach (System.Windows.Forms.Screen screen in System.Windows.Forms.Screen.AllScreens)
+			{
+				intersect |= myArea.IntersectsWith(screen.WorkingArea);
+			}
+			return intersect;
+		}
+
+		private void SubscribeToTestEvents()
+		{
+			ITestEvents events = TestLoader.Events;
+
+			events.RunStarting += new TestEventHandler( OnRunStarting );
+			events.RunFinished += new TestEventHandler( OnRunFinished );
+
+			events.ProjectLoaded	+= new TestEventHandler( OnTestProjectLoaded );
+			events.ProjectLoadFailed+= new TestEventHandler( OnProjectLoadFailure );
+			events.ProjectUnloading += new TestEventHandler( OnTestProjectUnloading );
+			events.ProjectUnloaded	+= new TestEventHandler( OnTestProjectUnloaded );
+
+			events.TestLoading		+= new TestEventHandler( OnTestLoadStarting );
+			events.TestLoaded		+= new TestEventHandler( OnTestLoaded );
+			events.TestLoadFailed	+= new TestEventHandler( OnTestLoadFailure );
+			events.TestUnloading	+= new TestEventHandler( OnTestUnloadStarting );
+			events.TestUnloaded		+= new TestEventHandler( OnTestUnloaded );
+			events.TestReloading	+= new TestEventHandler( OnReloadStarting );
+			events.TestReloaded		+= new TestEventHandler( OnTestChanged );
+			events.TestReloadFailed	+= new TestEventHandler( OnTestLoadFailure );
+		}
+
+		private void InitializeControls()
+		{
+			// ToDo: Migrate more ui elements to handle events on their own.
+			this.progressBar.Subscribe( TestLoader.Events );
+			this.statusBar.Subscribe( TestLoader.Events );
+		}
+
+		// Save settings changed by moving the form
+		private void NUnitForm_Move(object sender, System.EventArgs e)
+		{
+			switch( this.displayFormat )
+			{
+				case "Full":
+				default:
+					if ( this.WindowState == FormWindowState.Normal )
+					{
+						userSettings.SaveSetting( "Gui.MainForm.Left", this.Location.X );
+						userSettings.SaveSetting( "Gui.MainForm.Top", this.Location.Y );
+						userSettings.SaveSetting( "Gui.MainForm.Maximized", false );
+
+						this.statusBar.SizingGrip = true;
+					}
+					else if ( this.WindowState == FormWindowState.Maximized )
+					{
+						userSettings.SaveSetting( "Gui.MainForm.Maximized", true );
+
+						this.statusBar.SizingGrip = false;
+					}
+					break;
+				case "Mini":
+					if ( this.WindowState == FormWindowState.Normal )
+					{
+						userSettings.SaveSetting( "Gui.MiniForm.Left", this.Location.X );
+						userSettings.SaveSetting( "Gui.MiniForm.Top", this.Location.Y );
+						userSettings.SaveSetting( "Gui.MiniForm.Maximized", false );
+
+						this.statusBar.SizingGrip = true;
+					}
+					else if ( this.WindowState == FormWindowState.Maximized )
+					{
+						userSettings.SaveSetting( "Gui.MiniForm.Maximized", true );
+
+						this.statusBar.SizingGrip = false;
+					}
+					break;
+			}
+		}
+
+		// Save settings that change when window is resized
+		private void NUnitForm_Resize(object sender,System.EventArgs e)
+		{
+			if ( this.WindowState == FormWindowState.Normal )
+			{
+				if ( this.displayFormat == "Full" )
+				{
+					userSettings.SaveSetting( "Gui.MainForm.Width", this.Size.Width );
+					userSettings.SaveSetting( "Gui.MainForm.Height", this.Size.Height );
+				}
+				else
+				{
+					userSettings.SaveSetting( "Gui.MiniForm.Width", this.Size.Width );
+					userSettings.SaveSetting( "Gui.MiniForm.Height", this.Size.Height );
+				}
+			}
+		}
+
+		// Splitter moved so save it's position
+		private void treeSplitter_SplitterMoved( object sender, SplitterEventArgs e )
+		{
+			userSettings.SaveSetting( "Gui.MainForm.SplitPosition", treeSplitter.SplitPosition );
+		}
+
+		/// <summary>
+		///	Form is about to close, first see if we 
+		///	have a test run going on and if so whether
+		///	we should cancel it. Then unload the 
+		///	test and save the latest form position.
+		/// </summary>
+		private void NUnitForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+			if ( IsTestRunning )
+			{
+                DialogResult dialogResult = MessageDisplay.Ask( 
+					"A test is running, do you want to stop the test and exit?" );
+
+				if ( dialogResult == DialogResult.No )
+					e.Cancel = true;
+				else
+					TestLoader.CancelTestRun();
+			}
+
+			if ( !e.Cancel && IsProjectLoaded &&
+                presenter.CloseProject() == DialogResult.Cancel)
+				e.Cancel = true;
+		}
+
+		private void userSettings_Changed(object sender, SettingsEventArgs args)
+		{
+			if ( args.SettingName == "Gui.DisplayFormat" )
+			{
+				string newFormat = userSettings.GetSetting( "Gui.DisplayFormat", this.displayFormat );
+				if ( newFormat != displayFormat )
+					if ( newFormat == "Full" )
+						displayFullGui();
+					else
+						displayMiniGui();
+			}
+            else if (args.SettingName.StartsWith("Gui.TextOutput.") && args.SettingName.EndsWith(".Content"))
+            {
+                TestLoader.IsTracingEnabled = resultTabs.IsTracingEnabled;
+                TestLoader.LoggingThreshold = resultTabs.MaximumLogLevel;
+            }
+		}
+		#endregion
+
+		#region Other UI Event Handlers
+
+		/// <summary>
+		/// When the Run Button is clicked, run the selected test.
+		/// </summary>
+		private void runButton_Click(object sender, System.EventArgs e)
+		{
+			testTree.RunSelectedTests();
+		}
+
+		/// <summary>
+		/// When the Stop Button is clicked, cancel running test
+		/// </summary>
+		private void stopButton_Click(object sender, System.EventArgs e)
+		{
+			CancelRun();
+		}
+
+		private void CancelRun()
+		{
+			EnableStopCommand( false );
+
+			if ( IsTestRunning )
+			{
+                DialogResult dialogResult = MessageDisplay.Ask( 
+					"Do you want to cancel the running test?" );
+
+				if ( dialogResult == DialogResult.No )
+					EnableStopCommand( true );
+				else
+					TestLoader.CancelTestRun();
+			}
+		}
+
+		private void testTree_SelectedTestsChanged(object sender, SelectedTestsChangedEventArgs e)
+		{
+			if (!IsTestRunning) 
+			{
+				suiteName.Text = e.TestName;
+				statusBar.Initialize(e.TestCount, e.TestName );
+			}
+		}
+
+		#endregion
+
+		#region Event Handlers for Project Load and Unload
+
+		private void OnTestProjectLoaded( object sender, TestEventArgs e )
+		{
+            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)
+		{
+            // 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 )
+						version = info.ImageRuntimeVersion;
+			
+				recentFilesService.SetMostRecent( new RecentFileEntry( e.Name, version ) );
+			}
+		}
+
+		private void OnTestProjectUnloaded( object sender, TestEventArgs e )
+		{
+			SetTitleBar( null );
+			projectMenu.Visible = false;
+			runCount.Text = "";
+		}
+
+        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..." );
+		}
+
+		private void OnTestUnloadStarting( object sender, TestEventArgs e )
+		{
+			EnableRunCommand( false );
+		}
+
+		private void OnReloadStarting( object sender, TestEventArgs e )
+		{
+			EnableRunCommand( false );
+			longOpDisplay = new LongRunningOperationDisplay( this, "Reloading..." );
+		}
+
+		/// <summary>
+		/// A test suite has been loaded, so update 
+		/// recent assemblies and display the tests in the UI
+		/// </summary>
+		private void OnTestLoaded( object sender, TestEventArgs e )
+		{
+			if ( longOpDisplay != null )
+			{
+				longOpDisplay.Dispose();
+				longOpDisplay = null;
+			}
+			EnableRunCommand( true );
+			
+			if ( TestLoader.TestCount == 0 )
+			{
+				foreach( TestAssemblyInfo info in TestLoader.AssemblyInfo )
+					if ( info.TestFrameworks.Count > 0 ) return;
+
+                MessageDisplay.Error("This assembly was not built with any known testing framework.");
+			}
+		}
+
+		/// <summary>
+		/// A test suite has been unloaded, so clear the UI
+		/// and remove any references to the suite.
+		/// </summary>
+		private void OnTestUnloaded( object sender, TestEventArgs e )
+		{
+			suiteName.Text = null;
+            runCount.Text = null;
+			EnableRunCommand( false );
+            Refresh();
+		}
+
+		/// <summary>
+		/// The current test suite has changed in some way,
+		/// so update the info in the UI and clear the
+		/// test results, since they are no longer valid.
+		/// </summary>
+		private void OnTestChanged( object sender, TestEventArgs e )
+		{
+            SetTitleBar(TestProject.Name);
+
+			if ( longOpDisplay != null )
+			{
+				longOpDisplay.Dispose();
+				longOpDisplay = null;
+			}
+
+            if (userSettings.GetSetting("Options.TestLoader.ClearResultsOnReload", false))
+                runCount.Text = null;
+
+			EnableRunCommand( true );
+		}
+
+		/// <summary>
+		/// 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 )
+		{
+			if ( longOpDisplay != null )
+			{
+				longOpDisplay.Dispose();
+				longOpDisplay = null;
+			}
+			
+			string message = e.Action == NUnit.Util.TestAction.TestReloadFailed
+                ? "Test reload failed!"
+                : "Test load failed!";
+            string NL = Environment.NewLine;
+			if ( e.Exception is BadImageFormatException )
+				message += string.Format(NL + NL +
+                    "The assembly could not be loaded by NUnit. PossibleProblems include:" + NL + NL +
+                    "1. The assembly may not be a valid .NET assembly." + NL + NL +
+                    "2. 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})." + NL + NL +
+                    "3. You may be attempting to load a 64-bit assembly into a 32-bit process.",
+					Environment.Version.ToString(3) );
+
+            MessageDisplay.Error(message, e.Exception);
+
+			if ( !IsTestLoaded )
+				OnTestUnloaded( sender, e );
+			else
+				EnableRunCommand( true );
+		}
+
+		#endregion
+
+		#region Handlers for Test Running Events
+
+		private void OnRunStarting( object sender, TestEventArgs e )
+		{
+			suiteName.Text = e.Name;
+			EnableRunCommand( false );
+			EnableStopCommand( true );
+			runCount.Text = "";
+		}
+
+		private void OnRunFinished( object sender, TestEventArgs e )
+		{
+			EnableStopCommand( false );
+			EnableRunCommand( false );
+
+			if ( e.Exception != null )
+			{
+				if ( ! ( e.Exception is System.Threading.ThreadAbortException ) )
+                    MessageDisplay.Error("NUnit Test Run Failed", e.Exception);
+			}
+
+			ResultSummarizer summary = new ResultSummarizer( e.Result );
+			this.runCount.Text = string.Format(
+                "Passed: {0}   Failed: {1}   Errors: {2}   Inconclusive: {3}   Invalid: {4}   Ignored: {5}   Skipped: {6}   Time: {7}",
+                summary.Passed, summary.Failures, summary.Errors, summary.Inconclusive, summary.NotRunnable, summary.Ignored, summary.Skipped, summary.Time);
+
+            string resultPath = Path.Combine(this.TestProject.BasePath, "TestResult.xml");
+            try
+            {
+                TestLoader.SaveLastResult(resultPath);
+                log.Debug("Saved result to {0}", resultPath);
+            }
+            catch (Exception ex)
+            {
+                log.Warning("Unable to save result to {0}\n{1}", resultPath, ex.ToString());
+            }
+
+            EnableRunCommand(true);
+
+            if (e.Result.ResultState == ResultState.Failure ||
+                e.Result.ResultState == ResultState.Error ||
+                e.Result.ResultState == ResultState.Cancelled)
+            {
+                this.Activate();
+            }
+		}
+
+		#endregion
+
+		#region Helper methods for modifying the UI display
+
+		/// <summary>
+		/// Set the title bar based on the loaded file or project
+		/// </summary>
+		/// <param name="fileName"></param>
+		private void SetTitleBar( string fileName )
+		{
+			this.Text = fileName == null 
+				? "NUnit"
+				: string.Format( "{0} - NUnit", Path.GetFileName( fileName ) );
+		}
+
+		private void EnableRunCommand( bool enable )
+		{
+			runButton.Enabled = enable;
+			runAllMenuItem.Enabled = enable;
+			runSelectedMenuItem.Enabled = enable;
+		    runFailedMenuItem.Enabled = enable && this.TestLoader.TestResult != null &&
+		        (this.TestLoader.TestResult.ResultState == ResultState.Failure ||
+		         this.TestLoader.TestResult.ResultState == ResultState.Error);
+		}
+
+		private void EnableStopCommand( bool enable )
+		{
+			stopButton.Enabled = enable;
+			stopRunMenuItem.Enabled = enable;
+		}
+
+		#endregion	
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/NUnitForm.resx b/src/GuiRunner/nunit-gui/NUnitForm.resx
index 0d7193c..77fbb8e 100644
--- a/src/GuiRunner/nunit-gui/NUnitForm.resx
+++ b/src/GuiRunner/nunit-gui/NUnitForm.resx
@@ -1,152 +1,152 @@
-<?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="mainMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>130, 17</value>
-  </metadata>
-  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>65</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>
+<?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="mainMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>130, 17</value>
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>65</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/GuiRunner/nunit-gui/NUnitPresenter.cs b/src/GuiRunner/nunit-gui/NUnitPresenter.cs
index b7abd6b..dec9455 100644
--- a/src/GuiRunner/nunit-gui/NUnitPresenter.cs
+++ b/src/GuiRunner/nunit-gui/NUnitPresenter.cs
@@ -1,550 +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
-    }
-}
+// ****************************************************************
+// 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 2d6f85c..3f3610a 100644
--- a/src/GuiRunner/nunit-gui/OptionsDialog.cs
+++ b/src/GuiRunner/nunit-gui/OptionsDialog.cs
@@ -1,51 +1,51 @@
-// ****************************************************************
-// 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.
-// ****************************************************************
-#define TREE_BASED
-using System;
-using System.Windows.Forms;
-using NUnit.UiKit;
-using NUnit.Gui.SettingsPages;
-
-namespace NUnit.Gui
-{
-	/// <summary>
-	/// Summary description for OptionsDialog.
-	/// </summary>
-	public class OptionsDialog
-	{
-#if TREE_BASED
-		public static void Display( Form owner )
-		{
-			TreeBasedSettingsDialog.Display( owner,
-				new GuiSettingsPage("Gui.General"),
-				new TreeSettingsPage("Gui.Tree Display"),
-				new TestResultSettingsPage("Gui.Test Results"),
-				new TextOutputSettingsPage("Gui.Text Output"),
-                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"));
-		}
-#else
-		public static void Display( Form owner )
-		{
-			TabbedSettingsDialog.Display( owner,
-				new GuiSettingsPage("General"),
-				new TreeSettingsPage("Tree"),
-				new TestResultSettingsPage("Results"),
-				new TextOutputSettingsPage("Text Output"),
-				new TestLoaderSettingsPage("Test Load"),
-				new AssemblyReloadSettingsPage("Reload"),
-				new VisualStudioSettingsPage("Visual Studio"));
-		}
-#endif
-
-		private OptionsDialog() { }
-	}
-}
+// ****************************************************************
+// 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.
+// ****************************************************************
+#define TREE_BASED
+using System;
+using System.Windows.Forms;
+using NUnit.UiKit;
+using NUnit.Gui.SettingsPages;
+
+namespace NUnit.Gui
+{
+	/// <summary>
+	/// Summary description for OptionsDialog.
+	/// </summary>
+	public class OptionsDialog
+	{
+#if TREE_BASED
+		public static void Display( Form owner )
+		{
+			TreeBasedSettingsDialog.Display( owner,
+				new GuiSettingsPage("Gui.General"),
+				new TreeSettingsPage("Gui.Tree Display"),
+				new TestResultSettingsPage("Gui.Test Results"),
+				new TextOutputSettingsPage("Gui.Text Output"),
+                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"));
+		}
+#else
+		public static void Display( Form owner )
+		{
+			TabbedSettingsDialog.Display( owner,
+				new GuiSettingsPage("General"),
+				new TreeSettingsPage("Tree"),
+				new TestResultSettingsPage("Results"),
+				new TextOutputSettingsPage("Text Output"),
+				new TestLoaderSettingsPage("Test Load"),
+				new AssemblyReloadSettingsPage("Reload"),
+				new VisualStudioSettingsPage("Visual Studio"));
+		}
+#endif
+
+		private OptionsDialog() { }
+	}
+}
diff --git a/src/GuiRunner/nunit-gui/OptionsDialog.resx b/src/GuiRunner/nunit-gui/OptionsDialog.resx
index 1408611..b2f98ad 100644
--- a/src/GuiRunner/nunit-gui/OptionsDialog.resx
+++ b/src/GuiRunner/nunit-gui/OptionsDialog.resx
@@ -1,269 +1,269 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="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="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </data>
-  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabControl1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabControl1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="tabControl1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabControl1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabPage1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabPage1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabPage1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="generalOptions.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="generalOptions.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="generalOptions.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabPage2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabPage2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabPage2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="testLoaderOptions.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="testLoaderOptions.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="testLoaderOptions.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="tabPage3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabPage3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="tabPage3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="tabPage3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>OptionsDialog</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
-        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
-        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        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>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="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="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="helpProvider1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="helpProvider1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </data>
+  <data name="helpProvider1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabControl1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabControl1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabControl1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabControl1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="tabControl1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabControl1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabPage1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabPage1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabPage1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="generalOptions.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="generalOptions.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="generalOptions.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabPage2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabPage2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabPage2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="testLoaderOptions.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="testLoaderOptions.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="testLoaderOptions.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="tabPage3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabPage3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="tabPage3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tabPage3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>OptionsDialog</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
index fdfc1bb..2e43779 100644
--- a/src/GuiRunner/nunit-gui/RecentFileMenuHandler.cs
+++ b/src/GuiRunner/nunit-gui/RecentFileMenuHandler.cs
@@ -1,92 +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 ); 
-		}
-	}
-}
+// ****************************************************************
+// 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 3a5b9e5..1754740 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.cs
@@ -1,275 +1,275 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Security.Principal;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class AdvancedLoaderSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.Label label3;
-		private System.Windows.Forms.GroupBox groupBox3;
-        private System.Windows.Forms.CheckBox 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 )
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedLoaderSettingsPage));
-            this.label3 = new System.Windows.Forms.Label();
-            this.groupBox3 = new System.Windows.Forms.GroupBox();
-            this.enableShadowCopyCheckBox = new System.Windows.Forms.CheckBox();
-            this.label2 = new System.Windows.Forms.Label();
-            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-            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(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(139, 8);
-            this.groupBox3.Name = "groupBox3";
-            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(128, 17);
-            this.enableShadowCopyCheckBox.TabIndex = 2;
-            this.enableShadowCopyCheckBox.Text = "Enable Shadow Copy";
-            this.enableShadowCopyCheckBox.CheckedChanged += new System.EventHandler(this.enableShadowCopyCheckBox_CheckedChanged);
-            // 
-            // label2
-            // 
-            this.label2.Location = new System.Drawing.Point(139, 101);
-            this.label2.Name = "label2";
-            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(66, 13);
-            this.label4.TabIndex = 3;
-            this.label4.Text = "Cache Path:";
-            // 
-            // principalPolicyCheckBox
-            // 
-            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.label3);
-            this.Controls.Add(this.groupBox3);
-            this.Controls.Add(this.enableShadowCopyCheckBox);
-            this.Name = "AdvancedLoaderSettingsPage";
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-		}
-		#endregion
-
-		public override void LoadSettings()
-		{
-			this.settings = Services.UserSettings;
-
-			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 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 != oldShadowCopyFiles
-                    || shadowCopyPathTextBox.Text != oldShadowCopyPath
-                    || principalPolicyCheckBox.Checked != oldSetPrincipalPolicy
-                    || principalPolicyListBox.SelectedIndex != (int)oldPrincipalPolicy;
-
-			}
-		}
-
-        private void enableShadowCopyCheckBox_CheckedChanged(object sender, EventArgs e)
-        {
-            shadowCopyPathTextBox.Enabled = enableShadowCopyCheckBox.Checked;
-        }
-
-        private void principalPolicyCheckBox_CheckedChanged(object sender, EventArgs e)
-        {
-            principalPolicyListBox.Enabled = principalPolicyCheckBox.Checked;
-        }
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Security.Principal;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class AdvancedLoaderSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.CheckBox 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 )
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedLoaderSettingsPage));
+            this.label3 = new System.Windows.Forms.Label();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.enableShadowCopyCheckBox = new System.Windows.Forms.CheckBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            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(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(139, 8);
+            this.groupBox3.Name = "groupBox3";
+            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(128, 17);
+            this.enableShadowCopyCheckBox.TabIndex = 2;
+            this.enableShadowCopyCheckBox.Text = "Enable Shadow Copy";
+            this.enableShadowCopyCheckBox.CheckedChanged += new System.EventHandler(this.enableShadowCopyCheckBox_CheckedChanged);
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(139, 101);
+            this.label2.Name = "label2";
+            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(66, 13);
+            this.label4.TabIndex = 3;
+            this.label4.Text = "Cache Path:";
+            // 
+            // principalPolicyCheckBox
+            // 
+            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.label3);
+            this.Controls.Add(this.groupBox3);
+            this.Controls.Add(this.enableShadowCopyCheckBox);
+            this.Name = "AdvancedLoaderSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
+
+		public override void LoadSettings()
+		{
+			this.settings = Services.UserSettings;
+
+			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 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 != oldShadowCopyFiles
+                    || shadowCopyPathTextBox.Text != oldShadowCopyPath
+                    || principalPolicyCheckBox.Checked != oldSetPrincipalPolicy
+                    || principalPolicyListBox.SelectedIndex != (int)oldPrincipalPolicy;
+
+			}
+		}
+
+        private void enableShadowCopyCheckBox_CheckedChanged(object sender, EventArgs e)
+        {
+            shadowCopyPathTextBox.Enabled = enableShadowCopyCheckBox.Checked;
+        }
+
+        private void principalPolicyCheckBox_CheckedChanged(object sender, EventArgs e)
+        {
+            principalPolicyListBox.Enabled = principalPolicyCheckBox.Checked;
+        }
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx
index be6a7a0..c113833 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AdvancedLoaderSettingsPage.resx
@@ -1,126 +1,126 @@
-<?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>
-  <data name="enableShadowCopyCheckBox.HelpString" xml:space="preserve">
-    <value>If checked, NUnit will enable copying of the assemblies to the shadow copy cache by the CLR. This is the default. Note that with shadow copying disabled, it is not possible to make changes to the assemblies while NUnit is running.</value>
-  </data>
+<?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>
+  <data name="enableShadowCopyCheckBox.HelpString" xml:space="preserve">
+    <value>If checked, NUnit will enable copying of the assemblies to the shadow copy cache by the CLR. This is the default. Note that with shadow copying disabled, it is not possible to make changes to the assemblies while NUnit is running.</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
index 3261136..9cf62d1 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.cs
@@ -1,161 +1,161 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class AssemblyReloadSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.CheckBox rerunOnChangeCheckBox;
-		private System.Windows.Forms.CheckBox reloadOnRunCheckBox;
-		private System.Windows.Forms.CheckBox reloadOnChangeCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public AssemblyReloadSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            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
-
-		public override void LoadSettings()
-		{
-			reloadOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnChange", true );
-			rerunOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.RerunOnChange", false );
-			reloadOnRunCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnRun", false );
-		}
-
-		public override void ApplySettings()
-		{
-			settings.SaveSetting( "Options.TestLoader.ReloadOnChange", reloadOnChangeCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.RerunOnChange", rerunOnChangeCheckBox.Checked );
-			settings.SaveSetting( "Options.TestLoader.ReloadOnRun", reloadOnRunCheckBox.Checked );
-		}
-
-
-
-		private void reloadOnChangeCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			rerunOnChangeCheckBox.Enabled = reloadOnChangeCheckBox.Checked;
-		}
-
-		protected override void OnHelpRequested(HelpEventArgs hevent)
-		{
-			System.Diagnostics.Process.Start( "http://nunit.com/?p=optionsDialog&r=2.4.5" );
-		}
-
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class AssemblyReloadSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.CheckBox rerunOnChangeCheckBox;
+		private System.Windows.Forms.CheckBox reloadOnRunCheckBox;
+		private System.Windows.Forms.CheckBox reloadOnChangeCheckBox;
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.ComponentModel.IContainer components = null;
+
+		public AssemblyReloadSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            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
+
+		public override void LoadSettings()
+		{
+			reloadOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnChange", true );
+			rerunOnChangeCheckBox.Checked = settings.GetSetting( "Options.TestLoader.RerunOnChange", false );
+			reloadOnRunCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ReloadOnRun", false );
+		}
+
+		public override void ApplySettings()
+		{
+			settings.SaveSetting( "Options.TestLoader.ReloadOnChange", reloadOnChangeCheckBox.Checked );
+			settings.SaveSetting( "Options.TestLoader.RerunOnChange", rerunOnChangeCheckBox.Checked );
+			settings.SaveSetting( "Options.TestLoader.ReloadOnRun", reloadOnRunCheckBox.Checked );
+		}
+
+
+
+		private void reloadOnChangeCheckBox_CheckedChanged(object sender, System.EventArgs e)
+		{
+			rerunOnChangeCheckBox.Enabled = reloadOnChangeCheckBox.Checked;
+		}
+
+		protected override void OnHelpRequested(HelpEventArgs hevent)
+		{
+			System.Diagnostics.Process.Start( "http://nunit.com/?p=optionsDialog&r=2.4.5" );
+		}
+
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx
index 61bb827..c16405c 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/AssemblyReloadSettingsPage.resx
@@ -1,126 +1,126 @@
-<?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>
-  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
+<?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>
+  <metadata name="helpProvider1.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/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
index bd9d354..432e2be 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.cs
@@ -1,280 +1,280 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.UiKit;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class GuiSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.Label label3;
-		private System.Windows.Forms.TextBox recentFilesCountTextBox;
-		private System.Windows.Forms.Label label4;
-		private System.Windows.Forms.CheckBox loadLastProjectCheckBox;
-		private System.Windows.Forms.RadioButton fullGuiRadioButton;
-		private System.Windows.Forms.RadioButton miniGuiRadioButton;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-        private CheckBox checkFilesExistCheckBox;
-		private System.ComponentModel.IContainer components = null;
-
-		public GuiSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            this.label1 = new System.Windows.Forms.Label();
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.label2 = new System.Windows.Forms.Label();
-            this.groupBox2 = new System.Windows.Forms.GroupBox();
-            this.label3 = new System.Windows.Forms.Label();
-            this.recentFilesCountTextBox = new System.Windows.Forms.TextBox();
-            this.label4 = new System.Windows.Forms.Label();
-            this.loadLastProjectCheckBox = new System.Windows.Forms.CheckBox();
-            this.fullGuiRadioButton = new System.Windows.Forms.RadioButton();
-            this.miniGuiRadioButton = new System.Windows.Forms.RadioButton();
-            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-            this.checkFilesExistCheckBox = new System.Windows.Forms.CheckBox();
-            this.SuspendLayout();
-            // 
-            // label1
-            // 
-            this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(8, 0);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(60, 13);
-            this.label1.TabIndex = 7;
-            this.label1.Text = "Gui Display";
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.groupBox1.Location = new System.Drawing.Point(135, 0);
-            this.groupBox1.Name = "groupBox1";
-            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(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.Right)));
-            this.groupBox2.Location = new System.Drawing.Point(135, 96);
-            this.groupBox2.Name = "groupBox2";
-            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(65, 13);
-            this.label3.TabIndex = 30;
-            this.label3.Text = "files in menu";
-            // 
-            // recentFilesCountTextBox
-            // 
-            this.helpProvider1.SetHelpString(this.recentFilesCountTextBox, "The maximum number of files to display in the Recent Files list.");
-            this.recentFilesCountTextBox.Location = new System.Drawing.Point(96, 120);
-            this.recentFilesCountTextBox.Name = "recentFilesCountTextBox";
-            this.helpProvider1.SetShowHelp(this.recentFilesCountTextBox, true);
-            this.recentFilesCountTextBox.Size = new System.Drawing.Size(40, 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(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(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(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(148, 17);
-            this.miniGuiRadioButton.TabIndex = 33;
-            this.miniGuiRadioButton.Text = "Mini Gui showing tree only";
-            // 
-            // checkFilesExistCheckBox
-            // 
-            this.checkFilesExistCheckBox.AutoSize = true;
-            this.checkFilesExistCheckBox.Location = new System.Drawing.Point(32, 159);
-            this.checkFilesExistCheckBox.Name = "checkFilesExistCheckBox";
-            this.checkFilesExistCheckBox.Size = new System.Drawing.Size(185, 17);
-            this.checkFilesExistCheckBox.TabIndex = 34;
-            this.checkFilesExistCheckBox.Text = "Check that files exist before listing";
-            this.checkFilesExistCheckBox.UseVisualStyleBackColor = true;
-            // 
-            // GuiSettingsPage
-            // 
-            this.Controls.Add(this.checkFilesExistCheckBox);
-            this.Controls.Add(this.miniGuiRadioButton);
-            this.Controls.Add(this.fullGuiRadioButton);
-            this.Controls.Add(this.label3);
-            this.Controls.Add(this.recentFilesCountTextBox);
-            this.Controls.Add(this.label4);
-            this.Controls.Add(this.loadLastProjectCheckBox);
-            this.Controls.Add(this.groupBox2);
-            this.Controls.Add(this.label2);
-            this.Controls.Add(this.groupBox1);
-            this.Controls.Add(this.label1);
-            this.Name = "GuiSettingsPage";
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-		}
-		#endregion
-
-		public override void LoadSettings()
-		{
-			string displayFormat = settings.GetSetting( "Gui.DisplayFormat", "Full" );
-			switch( displayFormat )
-			{
-				case "Full":
-					fullGuiRadioButton.Checked = true;
-					break;
-				case "Mini":
-					miniGuiRadioButton.Checked = true;
-					break;
-			}
-
-			recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
-            checkFilesExistCheckBox.Checked = settings.GetSetting("Gui.RecentProjects.CheckFilesExist", true);
-			loadLastProjectCheckBox.Checked = settings.GetSetting( "Options.LoadLastProject", true );
-		}
-
-		public override void ApplySettings()
-		{
-			string fmt = fullGuiRadioButton.Checked ? "Full" : "Mini";
-			settings.SaveSetting( "Gui.DisplayFormat", fmt );
-            settings.SaveSetting("Gui.RecentProjects.CheckFilesExist", checkFilesExistCheckBox.Checked);
-			settings.SaveSetting( "Options.LoadLastProject", loadLastProjectCheckBox.Checked );
-		}
-
-		private void recentFilesCountTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
-		{
-			if ( recentFilesCountTextBox.Text.Length == 0 )
-			{
-				recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
-				recentFilesCountTextBox.SelectAll();
-				e.Cancel = true;
-			}
-			else
-			{
-				string errmsg = null;
-
-				try
-				{
-					int count = int.Parse( recentFilesCountTextBox.Text );
-
-					if ( count < RecentFilesService.MinSize ||
-						count > RecentFilesService.MaxSize )
-					{
-						errmsg = string.Format( "Number of files must be from {0} to {1}", 
-							RecentFilesService.MinSize, RecentFilesService.MaxSize );
-					}
-				}
-				catch
-				{
-					errmsg = "Number of files must be numeric";
-				}
-
-				if ( errmsg != null )
-				{
-					recentFilesCountTextBox.SelectAll();
-                    MessageDisplay.Error(errmsg);
-					e.Cancel = true;
-				}
-			}
-		}
-
-		private void recentFilesCountTextBox_Validated(object sender, System.EventArgs e)
-		{
-			int count = int.Parse( recentFilesCountTextBox.Text );
-			Services.RecentFiles.MaxFiles = count;
-            if (count == 0)
-                loadLastProjectCheckBox.Checked = false;
-		}
-
-
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+using NUnit.UiKit;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class GuiSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.TextBox recentFilesCountTextBox;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.CheckBox loadLastProjectCheckBox;
+		private System.Windows.Forms.RadioButton fullGuiRadioButton;
+		private System.Windows.Forms.RadioButton miniGuiRadioButton;
+		private System.Windows.Forms.HelpProvider helpProvider1;
+        private CheckBox checkFilesExistCheckBox;
+		private System.ComponentModel.IContainer components = null;
+
+		public GuiSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.recentFilesCountTextBox = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.loadLastProjectCheckBox = new System.Windows.Forms.CheckBox();
+            this.fullGuiRadioButton = new System.Windows.Forms.RadioButton();
+            this.miniGuiRadioButton = new System.Windows.Forms.RadioButton();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.checkFilesExistCheckBox = new System.Windows.Forms.CheckBox();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(8, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(60, 13);
+            this.label1.TabIndex = 7;
+            this.label1.Text = "Gui Display";
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Location = new System.Drawing.Point(135, 0);
+            this.groupBox1.Name = "groupBox1";
+            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(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.Right)));
+            this.groupBox2.Location = new System.Drawing.Point(135, 96);
+            this.groupBox2.Name = "groupBox2";
+            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(65, 13);
+            this.label3.TabIndex = 30;
+            this.label3.Text = "files in menu";
+            // 
+            // recentFilesCountTextBox
+            // 
+            this.helpProvider1.SetHelpString(this.recentFilesCountTextBox, "The maximum number of files to display in the Recent Files list.");
+            this.recentFilesCountTextBox.Location = new System.Drawing.Point(96, 120);
+            this.recentFilesCountTextBox.Name = "recentFilesCountTextBox";
+            this.helpProvider1.SetShowHelp(this.recentFilesCountTextBox, true);
+            this.recentFilesCountTextBox.Size = new System.Drawing.Size(40, 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(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(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(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(148, 17);
+            this.miniGuiRadioButton.TabIndex = 33;
+            this.miniGuiRadioButton.Text = "Mini Gui showing tree only";
+            // 
+            // checkFilesExistCheckBox
+            // 
+            this.checkFilesExistCheckBox.AutoSize = true;
+            this.checkFilesExistCheckBox.Location = new System.Drawing.Point(32, 159);
+            this.checkFilesExistCheckBox.Name = "checkFilesExistCheckBox";
+            this.checkFilesExistCheckBox.Size = new System.Drawing.Size(185, 17);
+            this.checkFilesExistCheckBox.TabIndex = 34;
+            this.checkFilesExistCheckBox.Text = "Check that files exist before listing";
+            this.checkFilesExistCheckBox.UseVisualStyleBackColor = true;
+            // 
+            // GuiSettingsPage
+            // 
+            this.Controls.Add(this.checkFilesExistCheckBox);
+            this.Controls.Add(this.miniGuiRadioButton);
+            this.Controls.Add(this.fullGuiRadioButton);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.recentFilesCountTextBox);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.loadLastProjectCheckBox);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.label1);
+            this.Name = "GuiSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
+
+		public override void LoadSettings()
+		{
+			string displayFormat = settings.GetSetting( "Gui.DisplayFormat", "Full" );
+			switch( displayFormat )
+			{
+				case "Full":
+					fullGuiRadioButton.Checked = true;
+					break;
+				case "Mini":
+					miniGuiRadioButton.Checked = true;
+					break;
+			}
+
+			recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
+            checkFilesExistCheckBox.Checked = settings.GetSetting("Gui.RecentProjects.CheckFilesExist", true);
+			loadLastProjectCheckBox.Checked = settings.GetSetting( "Options.LoadLastProject", true );
+		}
+
+		public override void ApplySettings()
+		{
+			string fmt = fullGuiRadioButton.Checked ? "Full" : "Mini";
+			settings.SaveSetting( "Gui.DisplayFormat", fmt );
+            settings.SaveSetting("Gui.RecentProjects.CheckFilesExist", checkFilesExistCheckBox.Checked);
+			settings.SaveSetting( "Options.LoadLastProject", loadLastProjectCheckBox.Checked );
+		}
+
+		private void recentFilesCountTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+			if ( recentFilesCountTextBox.Text.Length == 0 )
+			{
+				recentFilesCountTextBox.Text = Services.RecentFiles.MaxFiles.ToString();
+				recentFilesCountTextBox.SelectAll();
+				e.Cancel = true;
+			}
+			else
+			{
+				string errmsg = null;
+
+				try
+				{
+					int count = int.Parse( recentFilesCountTextBox.Text );
+
+					if ( count < RecentFilesService.MinSize ||
+						count > RecentFilesService.MaxSize )
+					{
+						errmsg = string.Format( "Number of files must be from {0} to {1}", 
+							RecentFilesService.MinSize, RecentFilesService.MaxSize );
+					}
+				}
+				catch
+				{
+					errmsg = "Number of files must be numeric";
+				}
+
+				if ( errmsg != null )
+				{
+					recentFilesCountTextBox.SelectAll();
+                    MessageDisplay.Error(errmsg);
+					e.Cancel = true;
+				}
+			}
+		}
+
+		private void recentFilesCountTextBox_Validated(object sender, System.EventArgs e)
+		{
+			int count = int.Parse( recentFilesCountTextBox.Text );
+			Services.RecentFiles.MaxFiles = count;
+            if (count == 0)
+                loadLastProjectCheckBox.Checked = false;
+		}
+
+
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx
index 61bb827..c16405c 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/GuiSettingsPage.resx
@@ -1,126 +1,126 @@
-<?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>
-  <metadata name="helpProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
+<?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>
+  <metadata name="helpProvider1.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/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
index 31898ad..f1b82e9 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.Designer.cs
@@ -1,121 +1,121 @@
-namespace NUnit.Gui.SettingsPages
-{
-    partial class InternalTraceSettingsPage
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.label3 = new System.Windows.Forms.Label();
-            this.groupBox3 = new System.Windows.Forms.GroupBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.traceLevelComboBox = new System.Windows.Forms.ComboBox();
-            this.label4 = new System.Windows.Forms.Label();
-            this.logDirectoryLabel = new 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(73, 13);
-            this.label3.TabIndex = 14;
-            this.label3.Text = "Internal Trace";
-            // 
-            // groupBox3
-            // 
-            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.groupBox3.Location = new System.Drawing.Point(158, 5);
-            this.groupBox3.Name = "groupBox3";
-            this.groupBox3.Size = new System.Drawing.Size(283, 8);
-            this.groupBox3.TabIndex = 13;
-            this.groupBox3.TabStop = false;
-            // 
-            // label1
-            // 
-            this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(19, 46);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(67, 13);
-            this.label1.TabIndex = 15;
-            this.label1.Text = "Trace Level:";
-            // 
-            // traceLevelComboBox
-            // 
-            this.traceLevelComboBox.FormattingEnabled = true;
-            this.traceLevelComboBox.Items.AddRange(new object[] {
-            "Default",
-            "Off",
-            "Error",
-            "Warning",
-            "Info",
-            "Verbose"});
-            this.traceLevelComboBox.Location = new System.Drawing.Point(134, 43);
-            this.traceLevelComboBox.Name = "traceLevelComboBox";
-            this.traceLevelComboBox.Size = new System.Drawing.Size(89, 21);
-            this.traceLevelComboBox.TabIndex = 16;
-            // 
-            // label4
-            // 
-            this.label4.AutoSize = true;
-            this.label4.Location = new System.Drawing.Point(19, 87);
-            this.label4.Name = "label4";
-            this.label4.Size = new System.Drawing.Size(73, 13);
-            this.label4.TabIndex = 18;
-            this.label4.Text = "Log Directory:";
-            // 
-            // logDirectoryLabel
-            // 
-            this.logDirectoryLabel.Location = new System.Drawing.Point(131, 87);
-            this.logDirectoryLabel.Name = "logDirectoryLabel";
-            this.logDirectoryLabel.Size = new System.Drawing.Size(310, 22);
-            this.logDirectoryLabel.TabIndex = 19;
-            // 
-            // InternalTraceSettingsPage
-            // 
-            this.Controls.Add(this.logDirectoryLabel);
-            this.Controls.Add(this.label4);
-            this.Controls.Add(this.traceLevelComboBox);
-            this.Controls.Add(this.label1);
-            this.Controls.Add(this.label3);
-            this.Controls.Add(this.groupBox3);
-            this.Name = "InternalTraceSettingsPage";
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.GroupBox groupBox3;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.ComboBox traceLevelComboBox;
-        private System.Windows.Forms.Label label4;
-        private CP.Windows.Forms.ExpandingLabel logDirectoryLabel;
-    }
-}
+namespace NUnit.Gui.SettingsPages
+{
+    partial class InternalTraceSettingsPage
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label3 = new System.Windows.Forms.Label();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.traceLevelComboBox = new System.Windows.Forms.ComboBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.logDirectoryLabel = new 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(73, 13);
+            this.label3.TabIndex = 14;
+            this.label3.Text = "Internal Trace";
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox3.Location = new System.Drawing.Point(158, 5);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(283, 8);
+            this.groupBox3.TabIndex = 13;
+            this.groupBox3.TabStop = false;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(19, 46);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(67, 13);
+            this.label1.TabIndex = 15;
+            this.label1.Text = "Trace Level:";
+            // 
+            // traceLevelComboBox
+            // 
+            this.traceLevelComboBox.FormattingEnabled = true;
+            this.traceLevelComboBox.Items.AddRange(new object[] {
+            "Default",
+            "Off",
+            "Error",
+            "Warning",
+            "Info",
+            "Verbose"});
+            this.traceLevelComboBox.Location = new System.Drawing.Point(134, 43);
+            this.traceLevelComboBox.Name = "traceLevelComboBox";
+            this.traceLevelComboBox.Size = new System.Drawing.Size(89, 21);
+            this.traceLevelComboBox.TabIndex = 16;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(19, 87);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(73, 13);
+            this.label4.TabIndex = 18;
+            this.label4.Text = "Log Directory:";
+            // 
+            // logDirectoryLabel
+            // 
+            this.logDirectoryLabel.Location = new System.Drawing.Point(131, 87);
+            this.logDirectoryLabel.Name = "logDirectoryLabel";
+            this.logDirectoryLabel.Size = new System.Drawing.Size(310, 22);
+            this.logDirectoryLabel.TabIndex = 19;
+            // 
+            // InternalTraceSettingsPage
+            // 
+            this.Controls.Add(this.logDirectoryLabel);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.traceLevelComboBox);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.groupBox3);
+            this.Name = "InternalTraceSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.GroupBox groupBox3;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ComboBox traceLevelComboBox;
+        private System.Windows.Forms.Label label4;
+        private CP.Windows.Forms.ExpandingLabel logDirectoryLabel;
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
index 1c40099..1603555 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Core;
-
-namespace NUnit.Gui.SettingsPages
-{
-    public partial class InternalTraceSettingsPage : NUnit.UiKit.SettingsPage
-    {
-        public InternalTraceSettingsPage(string key) : base(key)
-        {
-            InitializeComponent();
-        }
-
-        public override void LoadSettings()
-        {
-            traceLevelComboBox.SelectedIndex = (int)(InternalTraceLevel)settings.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default);
-            logDirectoryLabel.Text = NUnitConfiguration.LogDirectory;
-        }
-
-        public override void ApplySettings()
-        {
-            InternalTraceLevel level = (InternalTraceLevel)traceLevelComboBox.SelectedIndex;
-            settings.SaveSetting("Options.InternalTraceLevel", level);
-            InternalTrace.Level = level;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Core;
+
+namespace NUnit.Gui.SettingsPages
+{
+    public partial class InternalTraceSettingsPage : NUnit.UiKit.SettingsPage
+    {
+        public InternalTraceSettingsPage(string key) : base(key)
+        {
+            InitializeComponent();
+        }
+
+        public override void LoadSettings()
+        {
+            traceLevelComboBox.SelectedIndex = (int)(InternalTraceLevel)settings.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default);
+            logDirectoryLabel.Text = NUnitConfiguration.LogDirectory;
+        }
+
+        public override void ApplySettings()
+        {
+            InternalTraceLevel level = (InternalTraceLevel)traceLevelComboBox.SelectedIndex;
+            settings.SaveSetting("Options.InternalTraceLevel", level);
+            InternalTrace.Level = level;
+        }
+    }
+}
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx
index ff31a6d..19dc0dd 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/InternalTraceSettingsPage.resx
@@ -1,120 +1,120 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs
index 0888312..01f6e8c 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.Designer.cs
@@ -1,126 +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;
-    }
-}
+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
index 5c0bb6c..5ca4ac8 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.cs
@@ -1,72 +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;
-        }
-    }
-}
+// ****************************************************************
+// 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
index c33f6d4..217a949 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/ProjectEditorSettingsPage.resx
@@ -1,128 +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>
+<?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
index d137426..c27345c 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.Designer.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.Designer.cs
@@ -1,88 +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;
-    }
-}
+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
index 196a668..452e4bb 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.cs
@@ -1,32 +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);
-        }
-    }
-}
+// ****************************************************************
+// 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/RuntimeSelectionSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.resx
index 7e44abc..3ac30cb 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/RuntimeSelectionSettingsPage.resx
@@ -1,123 +1,123 @@
-<?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>
+<?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>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
index 448b10a..3577e34 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.cs
@@ -1,303 +1,303 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-using NUnit.Util;
-using NUnit.Core;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TestLoaderSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.CheckBox mergeAssembliesCheckBox;
-		private System.Windows.Forms.RadioButton singleDomainRadioButton;
-		private System.Windows.Forms.RadioButton multiDomainRadioButton;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-        private Label label3;
-        private GroupBox groupBox3;
-        private RadioButton multiProcessRadioButton;
-        private RadioButton separateProcessRadioButton;
-        private RadioButton sameProcessRadioButton;
-        private Label label2;
-        private GroupBox groupBox2;
-		private System.ComponentModel.IContainer components = null;
-
-		public TestLoaderSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            this.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
-		
-		public override void LoadSettings()
-		{
-            switch( GetSavedProcessModel() )
-            {
-                case ProcessModel.Separate:
-                    separateProcessRadioButton.Checked = true;
-                    sameProcessRadioButton.Checked = false;
-                    multiProcessRadioButton.Checked = false;
-                    break;
-                case ProcessModel.Multiple:
-                    multiProcessRadioButton.Checked = true;
-                    sameProcessRadioButton.Checked = false;
-                    separateProcessRadioButton.Checked = false;
-                    break;
-                default:
-                    sameProcessRadioButton.Checked = true;
-                    multiProcessRadioButton.Checked = false;
-                    separateProcessRadioButton.Checked = false;
-                    break;
-            }
-
-			bool multiDomain = GetSavedDomainUsage() == DomainUsage.Multiple;
-			multiDomainRadioButton.Checked = multiDomain;
-			singleDomainRadioButton.Checked = !multiDomain;
-            mergeAssembliesCheckBox.Enabled = !multiDomain;
-
-			mergeAssembliesCheckBox.Checked = settings.GetSetting( "Options.TestLoader.MergeAssemblies", false );
-		}
-
-		public override void ApplySettings()
-		{
-            if (multiProcessRadioButton.Checked)
-                settings.SaveSetting("Options.TestLoader.ProcessModel", ProcessModel.Multiple);
-            else if (separateProcessRadioButton.Checked)
-                settings.SaveSetting("Options.TestLoader.ProcessModel", ProcessModel.Separate);
-            else
-                settings.RemoveSetting("Options.TestLoader.ProcessModel");
-
-            if (multiDomainRadioButton.Checked)
-                settings.SaveSetting("Options.TestLoader.DomainUsage", DomainUsage.Multiple);
-            else
-                settings.RemoveSetting("Options.TestLoader.DomainUsage");
-			
-            settings.SaveSetting( "Options.TestLoader.MergeAssemblies", mergeAssembliesCheckBox.Checked );
-		}
-
-        // TODO: Combine toggleProcessUsage and toggleMultiDomain
-        private void toggleProcessUsage(object sender, EventArgs e)
-        {
-            bool enable = sameProcessRadioButton.Checked || separateProcessRadioButton.Checked;
-            singleDomainRadioButton.Enabled = enable;
-            multiDomainRadioButton.Enabled = enable;
-            mergeAssembliesCheckBox.Enabled = enable && singleDomainRadioButton.Checked;
-        }
-        
-        private void toggleMultiDomain(object sender, System.EventArgs e)
-		{
-			bool multiDomain = multiDomainRadioButton.Checked = ! multiDomainRadioButton.Checked;
-			singleDomainRadioButton.Checked = !multiDomain;
-			mergeAssembliesCheckBox.Enabled = !multiDomain && !multiProcessRadioButton.Checked;
-		}
-
-		public override bool HasChangesRequiringReload
-		{
-			get 
-			{
-				return
-                    GetSavedProcessModel() != GetSelectedProcessModel() ||
-                    GetSavedDomainUsage() != GetSelectedDomainUsage() ||
-					settings.GetSetting("Options.TestLoader.MergeAssemblies", false ) != mergeAssembliesCheckBox.Checked;
-			}
-		}
-
-        private ProcessModel GetSavedProcessModel()
-        {
-            return (ProcessModel)settings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
-        }
-
-        private DomainUsage GetSavedDomainUsage()
-        {
-            return (DomainUsage)settings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
-        }
-
-        private ProcessModel GetSelectedProcessModel()
-        {
-            return separateProcessRadioButton.Checked
-                ? ProcessModel.Separate
-                : multiProcessRadioButton.Checked
-                    ? ProcessModel.Multiple
-                    : ProcessModel.Single;
-        }
-
-        private DomainUsage GetSelectedDomainUsage()
-        {
-            return multiDomainRadioButton.Checked
-                ? DomainUsage.Multiple
-                : DomainUsage.Single;
-        }
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using NUnit.Util;
+using NUnit.Core;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class TestLoaderSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.CheckBox mergeAssembliesCheckBox;
+		private System.Windows.Forms.RadioButton singleDomainRadioButton;
+		private System.Windows.Forms.RadioButton multiDomainRadioButton;
+		private System.Windows.Forms.HelpProvider helpProvider1;
+        private Label label3;
+        private GroupBox groupBox3;
+        private RadioButton multiProcessRadioButton;
+        private RadioButton separateProcessRadioButton;
+        private RadioButton sameProcessRadioButton;
+        private Label label2;
+        private GroupBox groupBox2;
+		private System.ComponentModel.IContainer components = null;
+
+		public TestLoaderSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.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
+		
+		public override void LoadSettings()
+		{
+            switch( GetSavedProcessModel() )
+            {
+                case ProcessModel.Separate:
+                    separateProcessRadioButton.Checked = true;
+                    sameProcessRadioButton.Checked = false;
+                    multiProcessRadioButton.Checked = false;
+                    break;
+                case ProcessModel.Multiple:
+                    multiProcessRadioButton.Checked = true;
+                    sameProcessRadioButton.Checked = false;
+                    separateProcessRadioButton.Checked = false;
+                    break;
+                default:
+                    sameProcessRadioButton.Checked = true;
+                    multiProcessRadioButton.Checked = false;
+                    separateProcessRadioButton.Checked = false;
+                    break;
+            }
+
+			bool multiDomain = GetSavedDomainUsage() == DomainUsage.Multiple;
+			multiDomainRadioButton.Checked = multiDomain;
+			singleDomainRadioButton.Checked = !multiDomain;
+            mergeAssembliesCheckBox.Enabled = !multiDomain;
+
+			mergeAssembliesCheckBox.Checked = settings.GetSetting( "Options.TestLoader.MergeAssemblies", false );
+		}
+
+		public override void ApplySettings()
+		{
+            if (multiProcessRadioButton.Checked)
+                settings.SaveSetting("Options.TestLoader.ProcessModel", ProcessModel.Multiple);
+            else if (separateProcessRadioButton.Checked)
+                settings.SaveSetting("Options.TestLoader.ProcessModel", ProcessModel.Separate);
+            else
+                settings.RemoveSetting("Options.TestLoader.ProcessModel");
+
+            if (multiDomainRadioButton.Checked)
+                settings.SaveSetting("Options.TestLoader.DomainUsage", DomainUsage.Multiple);
+            else
+                settings.RemoveSetting("Options.TestLoader.DomainUsage");
+			
+            settings.SaveSetting( "Options.TestLoader.MergeAssemblies", mergeAssembliesCheckBox.Checked );
+		}
+
+        // TODO: Combine toggleProcessUsage and toggleMultiDomain
+        private void toggleProcessUsage(object sender, EventArgs e)
+        {
+            bool enable = sameProcessRadioButton.Checked || separateProcessRadioButton.Checked;
+            singleDomainRadioButton.Enabled = enable;
+            multiDomainRadioButton.Enabled = enable;
+            mergeAssembliesCheckBox.Enabled = enable && singleDomainRadioButton.Checked;
+        }
+        
+        private void toggleMultiDomain(object sender, System.EventArgs e)
+		{
+			bool multiDomain = multiDomainRadioButton.Checked = ! multiDomainRadioButton.Checked;
+			singleDomainRadioButton.Checked = !multiDomain;
+			mergeAssembliesCheckBox.Enabled = !multiDomain && !multiProcessRadioButton.Checked;
+		}
+
+		public override bool HasChangesRequiringReload
+		{
+			get 
+			{
+				return
+                    GetSavedProcessModel() != GetSelectedProcessModel() ||
+                    GetSavedDomainUsage() != GetSelectedDomainUsage() ||
+					settings.GetSetting("Options.TestLoader.MergeAssemblies", false ) != mergeAssembliesCheckBox.Checked;
+			}
+		}
+
+        private ProcessModel GetSavedProcessModel()
+        {
+            return (ProcessModel)settings.GetSetting("Options.TestLoader.ProcessModel", ProcessModel.Default);
+        }
+
+        private DomainUsage GetSavedDomainUsage()
+        {
+            return (DomainUsage)settings.GetSetting("Options.TestLoader.DomainUsage", DomainUsage.Default);
+        }
+
+        private ProcessModel GetSelectedProcessModel()
+        {
+            return separateProcessRadioButton.Checked
+                ? ProcessModel.Separate
+                : multiProcessRadioButton.Checked
+                    ? ProcessModel.Multiple
+                    : ProcessModel.Single;
+        }
+
+        private DomainUsage GetSelectedDomainUsage()
+        {
+            return multiDomainRadioButton.Checked
+                ? DomainUsage.Multiple
+                : DomainUsage.Single;
+        }
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
index 7e44abc..3ac30cb 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestLoaderSettingsPage.resx
@@ -1,123 +1,123 @@
-<?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>
+<?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>
 </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 6cc5f8f..20cc19c 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.cs
@@ -1,196 +1,196 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TestResultSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.CheckBox errorsTabCheckBox;
-		private System.Windows.Forms.CheckBox failureToolTips;
-		private System.Windows.Forms.CheckBox enableWordWrap;
-		private System.Windows.Forms.CheckBox notRunTabCheckBox;
-		private System.Windows.Forms.GroupBox groupBox2;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.ComponentModel.IContainer components = null;
-
-		public TestResultSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            this.groupBox1 = new System.Windows.Forms.GroupBox();
-            this.label1 = new System.Windows.Forms.Label();
-            this.errorsTabCheckBox = new System.Windows.Forms.CheckBox();
-            this.failureToolTips = new System.Windows.Forms.CheckBox();
-            this.enableWordWrap = new System.Windows.Forms.CheckBox();
-            this.notRunTabCheckBox = new System.Windows.Forms.CheckBox();
-            this.groupBox2 = new System.Windows.Forms.GroupBox();
-            this.label2 = new System.Windows.Forms.Label();
-            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
-            this.SuspendLayout();
-            // 
-            // groupBox1
-            // 
-            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.groupBox1.Location = new System.Drawing.Point(149, 0);
-            this.groupBox1.Name = "groupBox1";
-            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(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(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(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(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(154, 17);
-            this.notRunTabCheckBox.TabIndex = 13;
-            this.notRunTabCheckBox.Text = "Display Tests Not Run Tab";
-            // 
-            // groupBox2
-            // 
-            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.groupBox2.Location = new System.Drawing.Point(149, 128);
-            this.groupBox2.Name = "groupBox2";
-            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(69, 13);
-            this.label2.TabIndex = 15;
-            this.label2.Text = "Not Run Tab";
-            // 
-            // TestResultSettingsPage
-            // 
-            this.Controls.Add(this.groupBox2);
-            this.Controls.Add(this.label2);
-            this.Controls.Add(this.groupBox1);
-            this.Controls.Add(this.errorsTabCheckBox);
-            this.Controls.Add(this.failureToolTips);
-            this.Controls.Add(this.enableWordWrap);
-            this.Controls.Add(this.notRunTabCheckBox);
-            this.Controls.Add(this.label1);
-            this.Name = "TestResultSettingsPage";
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-		}
-		#endregion
-
-		public override void LoadSettings()
-		{
-			errorsTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
-			failureToolTips.Checked = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", true );
-			enableWordWrap.Checked = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
-
-			notRunTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
-		}
-
-		public override void ApplySettings()
-		{
-			settings.SaveSetting( "Gui.ResultTabs.DisplayErrorsTab", errorsTabCheckBox.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", failureToolTips.Checked );
-			settings.SaveSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", enableWordWrap.Checked );
-
-			settings.SaveSetting( "Gui.ResultTabs.DisplayNotRunTab", notRunTabCheckBox.Checked );
-		}
-
-		private void errorsTabCheckBox_CheckedChanged(object sender, System.EventArgs e)
-		{
-			this.failureToolTips.Enabled = this.enableWordWrap.Enabled = this.errorsTabCheckBox.Checked;
-		}
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class TestResultSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.CheckBox errorsTabCheckBox;
+		private System.Windows.Forms.CheckBox failureToolTips;
+		private System.Windows.Forms.CheckBox enableWordWrap;
+		private System.Windows.Forms.CheckBox notRunTabCheckBox;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.ComponentModel.IContainer components = null;
+
+		public TestResultSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.errorsTabCheckBox = new System.Windows.Forms.CheckBox();
+            this.failureToolTips = new System.Windows.Forms.CheckBox();
+            this.enableWordWrap = new System.Windows.Forms.CheckBox();
+            this.notRunTabCheckBox = new System.Windows.Forms.CheckBox();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.helpProvider1 = new System.Windows.Forms.HelpProvider();
+            this.SuspendLayout();
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox1.Location = new System.Drawing.Point(149, 0);
+            this.groupBox1.Name = "groupBox1";
+            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(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(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(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(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(154, 17);
+            this.notRunTabCheckBox.TabIndex = 13;
+            this.notRunTabCheckBox.Text = "Display Tests Not Run Tab";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox2.Location = new System.Drawing.Point(149, 128);
+            this.groupBox2.Name = "groupBox2";
+            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(69, 13);
+            this.label2.TabIndex = 15;
+            this.label2.Text = "Not Run Tab";
+            // 
+            // TestResultSettingsPage
+            // 
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.errorsTabCheckBox);
+            this.Controls.Add(this.failureToolTips);
+            this.Controls.Add(this.enableWordWrap);
+            this.Controls.Add(this.notRunTabCheckBox);
+            this.Controls.Add(this.label1);
+            this.Name = "TestResultSettingsPage";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
+
+		public override void LoadSettings()
+		{
+			errorsTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayErrorsTab", true );
+			failureToolTips.Checked = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", true );
+			enableWordWrap.Checked = settings.GetSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", true );
+
+			notRunTabCheckBox.Checked = settings.GetSetting( "Gui.ResultTabs.DisplayNotRunTab", true );
+		}
+
+		public override void ApplySettings()
+		{
+			settings.SaveSetting( "Gui.ResultTabs.DisplayErrorsTab", errorsTabCheckBox.Checked );
+			settings.SaveSetting( "Gui.ResultTabs.ErrorsTab.ToolTipsEnabled", failureToolTips.Checked );
+			settings.SaveSetting( "Gui.ResultTabs.ErrorsTab.WordWrapEnabled", enableWordWrap.Checked );
+
+			settings.SaveSetting( "Gui.ResultTabs.DisplayNotRunTab", notRunTabCheckBox.Checked );
+		}
+
+		private void errorsTabCheckBox_CheckedChanged(object sender, System.EventArgs e)
+		{
+			this.failureToolTips.Enabled = this.enableWordWrap.Enabled = this.errorsTabCheckBox.Checked;
+		}
+	}
+}
+
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
index 7e44abc..3ac30cb 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TestResultSettingsPage.resx
@@ -1,123 +1,123 @@
-<?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>
+<?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>
 </root>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
index 2e8e00d..5b027ff 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.cs
@@ -1,422 +1,422 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.IO;
-using System.Reflection;
-using System.Windows.Forms;
-using NUnit.UiKit;
-using NUnit.Util;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class TreeSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.Label label2;
-		private System.Windows.Forms.ComboBox initialDisplayComboBox;
-		private System.Windows.Forms.CheckBox clearResultsCheckBox;
-		private System.Windows.Forms.CheckBox saveVisualStateCheckBox;
-		private System.Windows.Forms.CheckBox showCheckBoxesCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-		private System.Windows.Forms.RadioButton flatTestList;
-		private System.Windows.Forms.RadioButton autoNamespaceSuites;
-		private System.Windows.Forms.Label label3;
-        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)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(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
-
-		public override void LoadSettings()
-		{
-			initialDisplayComboBox.SelectedIndex = (int)(TestSuiteTreeView.DisplayStyle)settings.GetSetting( "Gui.TestTree.InitialTreeDisplay", TestSuiteTreeView.DisplayStyle.Auto );
-			clearResultsCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", true );
-			saveVisualStateCheckBox.Checked = settings.GetSetting( "Gui.TestTree.SaveVisualState", true );
-			showCheckBoxesCheckBox.Checked = settings.GetSetting( "Options.ShowCheckBoxes", false );
-
-            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;
-		}
-
-		public override void ApplySettings()
-		{
-			settings.SaveSetting( "Gui.TestTree.InitialTreeDisplay", (TestSuiteTreeView.DisplayStyle)initialDisplayComboBox.SelectedIndex );
-			settings.SaveSetting( "Options.TestLoader.ClearResultsOnReload", clearResultsCheckBox.Checked );
-			settings.SaveSetting( "Gui.TestTree.SaveVisualState", saveVisualStateCheckBox.Checked );
-			settings.SaveSetting( "Options.ShowCheckBoxes", showCheckBoxesCheckBox.Checked );
-
-            if (imageSetListBox.SelectedIndex >= 0)
-                settings.SaveSetting("Gui.TestTree.AlternateImageSet", imageSetListBox.SelectedItem);
-
-			settings.SaveSetting( "Options.TestLoader.AutoNamespaceSuites", autoNamespaceSuites.Checked );
-		}
-
-		private void toggleTestStructure(object sender, System.EventArgs e)
-		{
-			bool auto = autoNamespaceSuites.Checked = !autoNamespaceSuites.Checked;
-			flatTestList.Checked = !auto;
-		}
-	
-		public override bool HasChangesRequiringReload
-		{
-			get
-			{
-                return settings.GetSetting("Options.TestLoader.AutoNamespaceSuites", true) != autoNamespaceSuites.Checked;
-			}
-		}
-
-        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;
-                }
-            }
-        }
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Reflection;
+using System.Windows.Forms;
+using NUnit.UiKit;
+using NUnit.Util;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class TreeSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.ComboBox initialDisplayComboBox;
+		private System.Windows.Forms.CheckBox clearResultsCheckBox;
+		private System.Windows.Forms.CheckBox saveVisualStateCheckBox;
+		private System.Windows.Forms.CheckBox showCheckBoxesCheckBox;
+		private System.Windows.Forms.HelpProvider helpProvider1;
+		private System.Windows.Forms.RadioButton flatTestList;
+		private System.Windows.Forms.RadioButton autoNamespaceSuites;
+		private System.Windows.Forms.Label label3;
+        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)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(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
+
+		public override void LoadSettings()
+		{
+			initialDisplayComboBox.SelectedIndex = (int)(TestSuiteTreeView.DisplayStyle)settings.GetSetting( "Gui.TestTree.InitialTreeDisplay", TestSuiteTreeView.DisplayStyle.Auto );
+			clearResultsCheckBox.Checked = settings.GetSetting( "Options.TestLoader.ClearResultsOnReload", true );
+			saveVisualStateCheckBox.Checked = settings.GetSetting( "Gui.TestTree.SaveVisualState", true );
+			showCheckBoxesCheckBox.Checked = settings.GetSetting( "Options.ShowCheckBoxes", false );
+
+            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;
+		}
+
+		public override void ApplySettings()
+		{
+			settings.SaveSetting( "Gui.TestTree.InitialTreeDisplay", (TestSuiteTreeView.DisplayStyle)initialDisplayComboBox.SelectedIndex );
+			settings.SaveSetting( "Options.TestLoader.ClearResultsOnReload", clearResultsCheckBox.Checked );
+			settings.SaveSetting( "Gui.TestTree.SaveVisualState", saveVisualStateCheckBox.Checked );
+			settings.SaveSetting( "Options.ShowCheckBoxes", showCheckBoxesCheckBox.Checked );
+
+            if (imageSetListBox.SelectedIndex >= 0)
+                settings.SaveSetting("Gui.TestTree.AlternateImageSet", imageSetListBox.SelectedItem);
+
+			settings.SaveSetting( "Options.TestLoader.AutoNamespaceSuites", autoNamespaceSuites.Checked );
+		}
+
+		private void toggleTestStructure(object sender, System.EventArgs e)
+		{
+			bool auto = autoNamespaceSuites.Checked = !autoNamespaceSuites.Checked;
+			flatTestList.Checked = !auto;
+		}
+	
+		public override bool HasChangesRequiringReload
+		{
+			get
+			{
+                return settings.GetSetting("Options.TestLoader.AutoNamespaceSuites", true) != autoNamespaceSuites.Checked;
+			}
+		}
+
+        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 ee1d62f..3aefe8c 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/TreeSettingsPage.resx
@@ -1,214 +1,214 @@
-<?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>
-  <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>
+<?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>
+  <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 34cbfc3..90c5f34 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
+++ b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.cs
@@ -1,159 +1,159 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.ComponentModel;
-using System.Drawing;
-using System.Windows.Forms;
-
-namespace NUnit.Gui.SettingsPages
-{
-	public class VisualStudioSettingsPage : NUnit.UiKit.SettingsPage
-	{
-		private System.Windows.Forms.Label label1;
-		private System.Windows.Forms.GroupBox groupBox1;
-		private System.Windows.Forms.CheckBox visualStudioSupportCheckBox;
-		private System.Windows.Forms.HelpProvider helpProvider1;
-        private CheckBox useSolutionConfigsCheckBox;
-        private Label label2;
-        private Label label3;
-		private System.ComponentModel.IContainer components = null;
-
-		public VisualStudioSettingsPage(string key) : base(key)
-		{
-			// This call is required by the Windows Form Designer.
-			InitializeComponent();
-
-			// TODO: Add any initialization after the InitializeComponent call
-		}
-
-		/// <summary>
-		/// Clean up any resources being used.
-		/// </summary>
-		protected override void Dispose( bool disposing )
-		{
-			if( disposing )
-			{
-				if (components != null) 
-				{
-					components.Dispose();
-				}
-			}
-			base.Dispose( disposing );
-		}
-
-		#region Designer generated code
-		/// <summary>
-		/// Required method for Designer support - do not modify
-		/// the contents of this method with the code editor.
-		/// </summary>
-		private void InitializeComponent()
-		{
-            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
-
-		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;
-        }
-
-	}
-}
-
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace NUnit.Gui.SettingsPages
+{
+	public class VisualStudioSettingsPage : NUnit.UiKit.SettingsPage
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.CheckBox visualStudioSupportCheckBox;
+		private System.Windows.Forms.HelpProvider helpProvider1;
+        private CheckBox useSolutionConfigsCheckBox;
+        private Label label2;
+        private Label label3;
+		private System.ComponentModel.IContainer components = null;
+
+		public VisualStudioSettingsPage(string key) : base(key)
+		{
+			// This call is required by the Windows Form Designer.
+			InitializeComponent();
+
+			// TODO: Add any initialization after the InitializeComponent call
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if (components != null) 
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            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
+
+		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 2ea6faa..a1d28df 100644
--- a/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.resx
+++ b/src/GuiRunner/nunit-gui/SettingsPages/VisualStudioSettingsPage.resx
@@ -1,126 +1,126 @@
-<?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>
-  <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>
+<?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>
+  <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 ad382d7..a40a843 100644
--- a/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
+++ b/src/GuiRunner/nunit-gui/TestAssemblyInfoForm.cs
@@ -1,144 +1,144 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Text;
-using System.IO;
-using System.Collections;
-using System.Reflection;
-using System.Windows.Forms;
-using System.Drawing;
-using System.Diagnostics;
-using NUnit.UiKit;
-using NUnit.Util;
-using NUnit.Core;
-
-namespace NUnit.Gui
-{
-    public class TestAssemblyInfoForm : ScrollingTextDisplayForm
-    {
-        protected override void OnLoad(EventArgs e)
-        {
-            this.Text = "Test Assemblies";
-            this.TextBox.WordWrap = false;
-            //this.TextBox.ContentsResized += new ContentsResizedEventHandler(TextBox_ContentsResized);
-            this.TextBox.Font = new System.Drawing.Font(FontFamily.GenericMonospace, 8.25F);
-
-            base.OnLoad(e);
-
-            Process p = Process.GetCurrentProcess();
-            int currentProcessId = p.Id;
-            string currentDomainName = "";
-
-            AppendProcessInfo(
-			      currentProcessId, 
-			      Path.GetFileName(Assembly.GetEntryAssembly().Location), 
-			      RuntimeFramework.CurrentFramework );
-
-            foreach (TestAssemblyInfo info in Services.TestLoader.AssemblyInfo)
-            {
-                if (info.ProcessId != currentProcessId)
-                {
-                    this.TextBox.AppendText("\r\n");
-                    AppendProcessInfo(info);
-                    currentProcessId = info.ProcessId;
-                }
-
-                if (info.DomainName != currentDomainName)
-                {
-                    AppendDomainInfo(info);
-                    currentDomainName = info.DomainName;
-                }
-
-                AppendAssemblyInfo(info);
-            }
-			
-			TextBox.Select(0,0);
-			TextBox.ScrollToCaret();
-        }
-
-        private void AppendProcessInfo(TestAssemblyInfo info)
-        {
-            AppendProcessInfo(info.ProcessId, info.ModuleName, info.RunnerRuntimeFramework);
-        }
-
-        private void AppendProcessInfo( int pid, string moduleName, RuntimeFramework framework )
-        {
-            AppendBoldText(string.Format("{0} ( {1} )\r\n", moduleName, pid));
-
-            TextBox.AppendText(string.Format(
-                "  Framework Version: {0}\r\n",
-                framework.DisplayName));
-
-            TextBox.AppendText(string.Format(
-                "  CLR Version: {0}\r\n",
-                framework.ClrVersion.ToString()));
-        }
-
-        private void AppendDomainInfo(TestAssemblyInfo info)
-        {
-            AppendBoldText(string.Format("\r\n  {0}\r\n", info.DomainName));
-
-            StringBuilder sb = new StringBuilder();
-
-            sb.AppendFormat( "    ApplicationBase: {0}\r\n", info.ApplicationBase );
-
-            if (info.PrivateBinPath != null)
-            {
-                string prefix = "    PrivateBinPath: ";
-                foreach (string s in info.PrivateBinPath.Split(new char[] { ';' }))
-                {
-                    sb.AppendFormat("{0}{1}\r\n", prefix, s);
-                    prefix = "                    ";
-                }
-            }
-
-            sb.AppendFormat("    Configuration File: {0}\r\n", info.ConfigurationFile); 
-
-            TextBox.AppendText(sb.ToString());
-        }
-
-        private void AppendAssemblyInfo(TestAssemblyInfo info)
-        {
-            AppendBoldText(
-                string.Format("    {0}\r\n", Path.GetFileNameWithoutExtension(info.Name)));
-
-            StringBuilder sb = new StringBuilder();
-
-            sb.AppendFormat("      Path: {0}\r\n", info.Name);
-            sb.AppendFormat("      Image Runtime Version: {0}\r\n", info.ImageRuntimeVersion.ToString());
-
-            if (info.TestFrameworks != null)
-            {
-                string prefix = "      Uses: ";
-                foreach (AssemblyName framework in info.TestFrameworks)
-                {
-                    sb.AppendFormat("{0}{1}\r\n", prefix, framework.FullName);
-                    prefix = "            ";
-                }
-            }
-
-            TextBox.AppendText(sb.ToString());
-        }
-
-        private void AppendBoldText(string text)
-        {
-            TextBox.Select(TextBox.Text.Length, 0);
-            TextBox.SelectionFont = new Font(TextBox.Font, FontStyle.Bold);
-
-            TextBox.SelectedText += text;
-        }
-
-		void TextBox_ContentsResized(object sender, ContentsResizedEventArgs e)
-		{
-            int increase = e.NewRectangle.Width - TextBox.ClientSize.Width;
-            if (increase > 0)
-            {
-                TextBox.Width += increase;
-                this.Width += increase;
-            }
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Text;
+using System.IO;
+using System.Collections;
+using System.Reflection;
+using System.Windows.Forms;
+using System.Drawing;
+using System.Diagnostics;
+using NUnit.UiKit;
+using NUnit.Util;
+using NUnit.Core;
+
+namespace NUnit.Gui
+{
+    public class TestAssemblyInfoForm : ScrollingTextDisplayForm
+    {
+        protected override void OnLoad(EventArgs e)
+        {
+            this.Text = "Test Assemblies";
+            this.TextBox.WordWrap = false;
+            //this.TextBox.ContentsResized += new ContentsResizedEventHandler(TextBox_ContentsResized);
+            this.TextBox.Font = new System.Drawing.Font(FontFamily.GenericMonospace, 8.25F);
+
+            base.OnLoad(e);
+
+            Process p = Process.GetCurrentProcess();
+            int currentProcessId = p.Id;
+            string currentDomainName = "";
+
+            AppendProcessInfo(
+			      currentProcessId, 
+			      Path.GetFileName(Assembly.GetEntryAssembly().Location), 
+			      RuntimeFramework.CurrentFramework );
+
+            foreach (TestAssemblyInfo info in Services.TestLoader.AssemblyInfo)
+            {
+                if (info.ProcessId != currentProcessId)
+                {
+                    this.TextBox.AppendText("\r\n");
+                    AppendProcessInfo(info);
+                    currentProcessId = info.ProcessId;
+                }
+
+                if (info.DomainName != currentDomainName)
+                {
+                    AppendDomainInfo(info);
+                    currentDomainName = info.DomainName;
+                }
+
+                AppendAssemblyInfo(info);
+            }
+			
+			TextBox.Select(0,0);
+			TextBox.ScrollToCaret();
+        }
+
+        private void AppendProcessInfo(TestAssemblyInfo info)
+        {
+            AppendProcessInfo(info.ProcessId, info.ModuleName, info.RunnerRuntimeFramework);
+        }
+
+        private void AppendProcessInfo( int pid, string moduleName, RuntimeFramework framework )
+        {
+            AppendBoldText(string.Format("{0} ( {1} )\r\n", moduleName, pid));
+
+            TextBox.AppendText(string.Format(
+                "  Framework Version: {0}\r\n",
+                framework.DisplayName));
+
+            TextBox.AppendText(string.Format(
+                "  CLR Version: {0}\r\n",
+                framework.ClrVersion.ToString()));
+        }
+
+        private void AppendDomainInfo(TestAssemblyInfo info)
+        {
+            AppendBoldText(string.Format("\r\n  {0}\r\n", info.DomainName));
+
+            StringBuilder sb = new StringBuilder();
+
+            sb.AppendFormat( "    ApplicationBase: {0}\r\n", info.ApplicationBase );
+
+            if (info.PrivateBinPath != null)
+            {
+                string prefix = "    PrivateBinPath: ";
+                foreach (string s in info.PrivateBinPath.Split(new char[] { ';' }))
+                {
+                    sb.AppendFormat("{0}{1}\r\n", prefix, s);
+                    prefix = "                    ";
+                }
+            }
+
+            sb.AppendFormat("    Configuration File: {0}\r\n", info.ConfigurationFile); 
+
+            TextBox.AppendText(sb.ToString());
+        }
+
+        private void AppendAssemblyInfo(TestAssemblyInfo info)
+        {
+            AppendBoldText(
+                string.Format("    {0}\r\n", Path.GetFileNameWithoutExtension(info.Name)));
+
+            StringBuilder sb = new StringBuilder();
+
+            sb.AppendFormat("      Path: {0}\r\n", info.Name);
+            sb.AppendFormat("      Image Runtime Version: {0}\r\n", info.ImageRuntimeVersion.ToString());
+
+            if (info.TestFrameworks != null)
+            {
+                string prefix = "      Uses: ";
+                foreach (AssemblyName framework in info.TestFrameworks)
+                {
+                    sb.AppendFormat("{0}{1}\r\n", prefix, framework.FullName);
+                    prefix = "            ";
+                }
+            }
+
+            TextBox.AppendText(sb.ToString());
+        }
+
+        private void AppendBoldText(string text)
+        {
+            TextBox.Select(TextBox.Text.Length, 0);
+            TextBox.SelectionFont = new Font(TextBox.Font, FontStyle.Bold);
+
+            TextBox.SelectedText += text;
+        }
+
+		void TextBox_ContentsResized(object sender, ContentsResizedEventArgs e)
+		{
+            int increase = e.NewRectangle.Width - TextBox.ClientSize.Width;
+            if (increase > 0)
+            {
+                TextBox.Width += increase;
+                this.Width += increase;
+            }
+		}
+	}
+}
diff --git a/src/GuiRunner/nunit-gui/nunit-gui.build b/src/GuiRunner/nunit-gui/nunit-gui.build
index e61e0e8..60ae0b2 100644
--- a/src/GuiRunner/nunit-gui/nunit-gui.build
+++ b/src/GuiRunner/nunit-gui/nunit-gui.build
@@ -1,93 +1,93 @@
-<?xml version="1.0"?>
-<project name="NUnitGuiRunner" default="build" basedir=".">
-
-  <patternset id="source-files">
-    <include name="AboutBox.cs"/>
-    <include name="AddinDialog.cs"/>
-    <include name="AppEntry.cs"/>
-    <include name="AssemblyInfo.cs"/>
-    <include name="DetailResults.cs"/>
-    <include name="ExceptionDetailsForm.cs"/>
-    <include name="GuiOptions.cs"/>
-    <include name="NUnitForm.cs"/>
-    <include name="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"/>
-    <include name="SettingsPages/VisualStudioSettingsPage.cs"/>
-  </patternset>
-
-  <patternset id="resource-files">
-    <include name="AboutBox.resx"/>
-    <include name="AddinDialog.resx"/>
-    <include name="ExceptionDetailsForm.resx"/>
-    <include name="NUnitForm.resx"/>
-    <include name="OptionsDialog.resx"/>
-    <include name="ProjectEditor.resx"/>
-    <include name="App.ico"/>
-    <include name="Logo.ico"/>
-    <include name="SettingsPages/AdvancedLoaderSettingsPage.resx"/>
-    <include name="SettingsPages/AssemblyReloadSettingsPage.resx"/>
-    <include name="SettingsPages/GuiSettingsPage.resx"/>
-    <include name="SettingsPages/InternalTraceSettingsPage.resx"/>
-    <include name="SettingsPages/ProjectEditorSettingsPage.resx"/>
-    <include name="SettingsPages/RuntimeSelectionSettingsPage.resx"/>
-    <include name="SettingsPages/TestLoaderSettingsPage.resx"/>
-    <include name="SettingsPages/TestResultSettingsPage.resx"/>
-    <include name="SettingsPages/TreeSettingsPage.resx"/>
-    <include name="SettingsPages/VisualStudioSettingsPage.resx"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-       output="${current.lib.dir}/nunit-gui-runner.dll" 
-       win32icon="Logo.ico" debug="${build.debug}"
-       define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618,1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <resources>
-        <patternset refid="resource-files"/>
-      </resources>
-      <references>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="System.Drawing.dll"/>
-        <include name="System.Configuration.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.lib.dir}/nunit.uikit.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiRunner/nunit-gui">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <include name="nunit-gui.csproj"/>
-        <include name="nunit-gui.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnitGuiRunner" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="AboutBox.cs"/>
+    <include name="AddinDialog.cs"/>
+    <include name="AppEntry.cs"/>
+    <include name="AssemblyInfo.cs"/>
+    <include name="DetailResults.cs"/>
+    <include name="ExceptionDetailsForm.cs"/>
+    <include name="GuiOptions.cs"/>
+    <include name="NUnitForm.cs"/>
+    <include name="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"/>
+    <include name="SettingsPages/VisualStudioSettingsPage.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+    <include name="AboutBox.resx"/>
+    <include name="AddinDialog.resx"/>
+    <include name="ExceptionDetailsForm.resx"/>
+    <include name="NUnitForm.resx"/>
+    <include name="OptionsDialog.resx"/>
+    <include name="ProjectEditor.resx"/>
+    <include name="App.ico"/>
+    <include name="Logo.ico"/>
+    <include name="SettingsPages/AdvancedLoaderSettingsPage.resx"/>
+    <include name="SettingsPages/AssemblyReloadSettingsPage.resx"/>
+    <include name="SettingsPages/GuiSettingsPage.resx"/>
+    <include name="SettingsPages/InternalTraceSettingsPage.resx"/>
+    <include name="SettingsPages/ProjectEditorSettingsPage.resx"/>
+    <include name="SettingsPages/RuntimeSelectionSettingsPage.resx"/>
+    <include name="SettingsPages/TestLoaderSettingsPage.resx"/>
+    <include name="SettingsPages/TestResultSettingsPage.resx"/>
+    <include name="SettingsPages/TreeSettingsPage.resx"/>
+    <include name="SettingsPages/VisualStudioSettingsPage.resx"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+       output="${current.lib.dir}/nunit-gui-runner.dll" 
+       win32icon="Logo.ico" debug="${build.debug}"
+       define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="618,1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <resources>
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="System.Drawing.dll"/>
+        <include name="System.Configuration.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/nunit.uikit.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiRunner/nunit-gui">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit-gui.csproj"/>
+        <include name="nunit-gui.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/GuiRunner/nunit-gui/nunit-gui.csproj b/src/GuiRunner/nunit-gui/nunit-gui.csproj
index 993adb8..8e222b8 100644
--- a/src/GuiRunner/nunit-gui/nunit-gui.csproj
+++ b/src/GuiRunner/nunit-gui/nunit-gui.csproj
@@ -1,243 +1,277 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-gui-runner</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Gui</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\GuiComponents\UiKit\nunit.uikit.dll.csproj">
-      <Name>nunit.uikit.dll</Name>
-      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
-      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
-      <Name>nunit.uiexception.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <Reference Include="System.Configuration" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AboutBox.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AddinDialog.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="AppEntry.cs" />
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="DetailResults.cs" />
-    <Compile Include="ExceptionDetailsForm.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="GuiOptions.cs" />
-    <Compile Include="NUnitForm.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="OptionsDialog.cs" />
-    <Compile Include="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>
-    <Compile Include="SettingsPages\InternalTraceSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <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>
-    <Compile Include="SettingsPages\TestResultSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\TreeSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="SettingsPages\VisualStudioSettingsPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="TestAssemblyInfoForm.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="NUnitPresenter.cs" />
-    <EmbeddedResource Include="AboutBox.resx">
-      <DependentUpon>AboutBox.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="AddinDialog.resx">
-      <DependentUpon>AddinDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExceptionDetailsForm.resx">
-      <DependentUpon>ExceptionDetailsForm.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="NUnitForm.resx">
-      <DependentUpon>NUnitForm.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="OptionsDialog.resx">
-      <DependentUpon>OptionsDialog.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\AdvancedLoaderSettingsPage.resx">
-      <DependentUpon>AdvancedLoaderSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\AssemblyReloadSettingsPage.resx">
-      <DependentUpon>AssemblyReloadSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\RuntimeSelectionSettingsPage.resx">
-      <DependentUpon>RuntimeSelectionSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\GuiSettingsPage.resx">
-      <DependentUpon>GuiSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\InternalTraceSettingsPage.resx">
-      <DependentUpon>InternalTraceSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\ProjectEditorSettingsPage.resx">
-      <DependentUpon>ProjectEditorSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\TestLoaderSettingsPage.resx">
-      <DependentUpon>TestLoaderSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\TestResultSettingsPage.resx">
-      <DependentUpon>TestResultSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\TreeSettingsPage.resx">
-      <DependentUpon>TreeSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="SettingsPages\VisualStudioSettingsPage.resx">
-      <DependentUpon>VisualStudioSettingsPage.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit-gui.build" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Properties\" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-gui-runner</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Gui</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiComponents\UiKit\nunit.uikit.dll.csproj">
+      <Name>nunit.uikit.dll</Name>
+      <Project>{27531BBF-183D-4C3A-935B-D840B9F1A3A4}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\GuiException\UiException\nunit.uiexception.dll.csproj">
+      <Project>{3E87A106-EB20-4147-84C8-95B0BB43A1D4}</Project>
+      <Name>nunit.uiexception.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <Reference Include="System.Configuration" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AboutBox.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AddinDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AppEntry.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="DetailResults.cs" />
+    <Compile Include="ExceptionDetailsForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="GuiOptions.cs" />
+    <Compile Include="NUnitForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="OptionsDialog.cs" />
+    <Compile Include="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>
+    <Compile Include="SettingsPages\InternalTraceSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <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>
+    <Compile Include="SettingsPages\TestResultSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\TreeSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SettingsPages\VisualStudioSettingsPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TestAssemblyInfoForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="NUnitPresenter.cs" />
+    <EmbeddedResource Include="AboutBox.resx">
+      <DependentUpon>AboutBox.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="AddinDialog.resx">
+      <DependentUpon>AddinDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ExceptionDetailsForm.resx">
+      <DependentUpon>ExceptionDetailsForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="NUnitForm.resx">
+      <DependentUpon>NUnitForm.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OptionsDialog.resx">
+      <DependentUpon>OptionsDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\AdvancedLoaderSettingsPage.resx">
+      <DependentUpon>AdvancedLoaderSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\AssemblyReloadSettingsPage.resx">
+      <DependentUpon>AssemblyReloadSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\RuntimeSelectionSettingsPage.resx">
+      <DependentUpon>RuntimeSelectionSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\GuiSettingsPage.resx">
+      <DependentUpon>GuiSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\InternalTraceSettingsPage.resx">
+      <DependentUpon>InternalTraceSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\ProjectEditorSettingsPage.resx">
+      <DependentUpon>ProjectEditorSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\TestLoaderSettingsPage.resx">
+      <DependentUpon>TestLoaderSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\TestResultSettingsPage.resx">
+      <DependentUpon>TestResultSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\TreeSettingsPage.resx">
+      <DependentUpon>TreeSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="SettingsPages\VisualStudioSettingsPage.resx">
+      <DependentUpon>VisualStudioSettingsPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-gui.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/GuiRunner/nunit-gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..a194fcf
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.AboutBox.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.AboutBox.resources
new file mode 100644
index 0000000..deca29e
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.AboutBox.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.AddinDialog.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.AddinDialog.resources
new file mode 100644
index 0000000..dfae264
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.AddinDialog.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.ExceptionDetailsForm.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.ExceptionDetailsForm.resources
new file mode 100644
index 0000000..bbaa404
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.ExceptionDetailsForm.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.NUnitForm.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.NUnitForm.resources
new file mode 100644
index 0000000..deca29e
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.NUnitForm.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.OptionsDialog.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.OptionsDialog.resources
new file mode 100644
index 0000000..620ebd0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.OptionsDialog.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.AdvancedLoaderSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.AdvancedLoaderSettingsPage.resources
new file mode 100644
index 0000000..3b2777a
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.AdvancedLoaderSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.AssemblyReloadSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.AssemblyReloadSettingsPage.resources
new file mode 100644
index 0000000..06c24d0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.AssemblyReloadSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.GuiSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.GuiSettingsPage.resources
new file mode 100644
index 0000000..06c24d0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.GuiSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.InternalTraceSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.InternalTraceSettingsPage.resources
new file mode 100644
index 0000000..06c24d0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.InternalTraceSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.ProjectEditorSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.ProjectEditorSettingsPage.resources
new file mode 100644
index 0000000..6f982b3
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.ProjectEditorSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.RuntimeSelectionSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.RuntimeSelectionSettingsPage.resources
new file mode 100644
index 0000000..06c24d0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.RuntimeSelectionSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TestLoaderSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TestLoaderSettingsPage.resources
new file mode 100644
index 0000000..06c24d0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TestLoaderSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TestResultSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TestResultSettingsPage.resources
new file mode 100644
index 0000000..06c24d0
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TestResultSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TreeSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TreeSettingsPage.resources
new file mode 100644
index 0000000..2bc5437
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.TreeSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.VisualStudioSettingsPage.resources b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.VisualStudioSettingsPage.resources
new file mode 100644
index 0000000..1690719
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/NUnit.Gui.SettingsPages.VisualStudioSettingsPage.resources differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui-runner.pdb b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui-runner.pdb
new file mode 100644
index 0000000..dd08a94
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui-runner.pdb differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csproj.FileListAbsolute.txt b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..1abdef0
--- /dev/null
+++ b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csproj.FileListAbsolute.txt
@@ -0,0 +1,21 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit-gui-runner.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit-gui-runner.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\nunit-gui.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.AboutBox.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.AddinDialog.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.ExceptionDetailsForm.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.NUnitForm.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.OptionsDialog.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.AdvancedLoaderSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.AssemblyReloadSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.RuntimeSelectionSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.GuiSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.InternalTraceSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.ProjectEditorSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.TestLoaderSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.TestResultSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.TreeSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\NUnit.Gui.SettingsPages.VisualStudioSettingsPage.resources
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\nunit-gui.csproj.GenerateResource.Cache
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\nunit-gui-runner.dll
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\nunit-gui\obj\Debug\nunit-gui-runner.pdb
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csproj.GenerateResource.Cache b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csproj.GenerateResource.Cache
new file mode 100644
index 0000000..f0ecd63
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csproj.GenerateResource.Cache differ
diff --git a/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csprojResolveAssemblyReference.cache b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..dd8a6d4
Binary files /dev/null and b/src/GuiRunner/nunit-gui/obj/Debug/nunit-gui.csprojResolveAssemblyReference.cache differ
diff --git a/src/GuiRunner/tests/CommandLineTests.cs b/src/GuiRunner/tests/CommandLineTests.cs
index 05e66a7..8ba4cde 100644
--- a/src/GuiRunner/tests/CommandLineTests.cs
+++ b/src/GuiRunner/tests/CommandLineTests.cs
@@ -1,84 +1,84 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Gui.Tests
-{
-	using System;
-	using NUnit.Framework;
-
-	[TestFixture]
-	public class CommandLineTests
-	{
-		[Test]
-		public void NoParametersCount()
-		{
-			GuiOptions options = new GuiOptions(new string[] {});
-			Assert.IsTrue(options.NoArgs);
-		}
-
-		[Test]
-		public void Help()
-		{
-			GuiOptions options = new GuiOptions(new string[] {"-help"});
-			Assert.IsTrue(options.help);
-		}
-
-		[Test]
-		public void ShortHelp()
-		{
-			GuiOptions options = new GuiOptions(new string[] {"-?"});
-			Assert.IsTrue(options.help);
-		}
-
-		[Test]
-		public void AssemblyName()
-		{
-			string assemblyName = "nunit.tests.dll";
-			GuiOptions options = new GuiOptions(new string[]{ assemblyName });
-			Assert.AreEqual(assemblyName, options.Parameters[0]);
-		}
-
-		[Test]
-		public void ValidateSuccessful()
-		{
-			GuiOptions options = new GuiOptions(new string[] { "nunit.tests.dll" });
-			Assert.IsTrue(options.Validate(), "command line should be valid");
-		}
-
-		[Test]
-		public void InvalidArgs()
-		{
-			GuiOptions options = new GuiOptions(new string[] { "-asembly:nunit.tests.dll" });
-			Assert.IsFalse(options.Validate());
-		}
-
-
-		[Test] 
-		public void InvalidCommandLineParms()
-		{
-			GuiOptions parser = new GuiOptions(new String[]{"-garbage:TestFixture", "-assembly:Tests.dll"});
-			Assert.IsFalse(parser.Validate());
-		}
-
-		[Test] 
-		public void NoNameValuePairs()
-		{
-			GuiOptions parser = new GuiOptions(new String[]{"TestFixture", "Tests.dll"});
-			Assert.IsFalse(parser.Validate());
-		}
-
-		[Test]
-		public void HelpTextUsesCorrectDelimiterForPlatform()
-		{
-			string helpText = new GuiOptions(new String[] {"Tests.dll"} ).GetHelpText();
-			char delim = System.IO.Path.DirectorySeparatorChar == '/' ? '-' : '/';
-
-			string expected = string.Format( "{0}config=", delim );
-			StringAssert.Contains( expected, helpText );
-		}
-	}
-}
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Gui.Tests
+{
+	using System;
+	using NUnit.Framework;
+
+	[TestFixture]
+	public class CommandLineTests
+	{
+		[Test]
+		public void NoParametersCount()
+		{
+			GuiOptions options = new GuiOptions(new string[] {});
+			Assert.IsTrue(options.NoArgs);
+		}
+
+		[Test]
+		public void Help()
+		{
+			GuiOptions options = new GuiOptions(new string[] {"-help"});
+			Assert.IsTrue(options.help);
+		}
+
+		[Test]
+		public void ShortHelp()
+		{
+			GuiOptions options = new GuiOptions(new string[] {"-?"});
+			Assert.IsTrue(options.help);
+		}
+
+		[Test]
+		public void AssemblyName()
+		{
+			string assemblyName = "nunit.tests.dll";
+			GuiOptions options = new GuiOptions(new string[]{ assemblyName });
+			Assert.AreEqual(assemblyName, options.Parameters[0]);
+		}
+
+		[Test]
+		public void ValidateSuccessful()
+		{
+			GuiOptions options = new GuiOptions(new string[] { "nunit.tests.dll" });
+			Assert.IsTrue(options.Validate(), "command line should be valid");
+		}
+
+		[Test]
+		public void InvalidArgs()
+		{
+			GuiOptions options = new GuiOptions(new string[] { "-asembly:nunit.tests.dll" });
+			Assert.IsFalse(options.Validate());
+		}
+
+
+		[Test] 
+		public void InvalidCommandLineParms()
+		{
+			GuiOptions parser = new GuiOptions(new String[]{"-garbage:TestFixture", "-assembly:Tests.dll"});
+			Assert.IsFalse(parser.Validate());
+		}
+
+		[Test] 
+		public void NoNameValuePairs()
+		{
+			GuiOptions parser = new GuiOptions(new String[]{"TestFixture", "Tests.dll"});
+			Assert.IsFalse(parser.Validate());
+		}
+
+		[Test]
+		public void HelpTextUsesCorrectDelimiterForPlatform()
+		{
+			string helpText = new GuiOptions(new String[] {"Tests.dll"} ).GetHelpText();
+			char delim = System.IO.Path.DirectorySeparatorChar == '/' ? '-' : '/';
+
+			string expected = string.Format( "{0}config=", delim );
+			StringAssert.Contains( expected, helpText );
+		}
+	}
+}
+
diff --git a/src/GuiRunner/tests/ExceptionDetailsFormTests.cs b/src/GuiRunner/tests/ExceptionDetailsFormTests.cs
index f5e6874..73e9d3b 100644
--- a/src/GuiRunner/tests/ExceptionDetailsFormTests.cs
+++ b/src/GuiRunner/tests/ExceptionDetailsFormTests.cs
@@ -1,49 +1,49 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Windows.Forms;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-
-namespace NUnit.Gui.Tests
-{
-	[TestFixture]	
-	public class ExceptionDetailsFormTests : FormTester
-	{
-		[TestFixtureSetUp]
-		public void CreateForm()
-		{
-			this.Form = new ExceptionDetailsForm( new Exception( "My message" ) );
-		}
-
-		[TestFixtureTearDown]
-		public void CloseForm()
-		{
-			this.Form.Close();
-		}
-
-		[Test]
-		public void ControlsExist()
-		{
-			AssertControlExists( "message", typeof( Label ) );
-			AssertControlExists( "stackTrace", typeof( RichTextBox ) );
-			AssertControlExists( "okButton", typeof( Button ) );
-		}
-
-		[Test]
-		public void ControlsArePositionedCorrectly()
-		{
-			AssertControlsAreStackedVertically( "message", "stackTrace", "okButton" );
-		}
-
-		[Test]
-		public void MessageDisplaysCorrectly()
-		{
-			this.Form.Show();
-			Assert.AreEqual( "System.Exception: My message", GetText( "message" ) );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Windows.Forms;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.Gui.Tests
+{
+	[TestFixture]	
+	public class ExceptionDetailsFormTests : FormTester
+	{
+		[TestFixtureSetUp]
+		public void CreateForm()
+		{
+			this.Form = new ExceptionDetailsForm( new Exception( "My message" ) );
+		}
+
+		[TestFixtureTearDown]
+		public void CloseForm()
+		{
+			this.Form.Close();
+		}
+
+		[Test]
+		public void ControlsExist()
+		{
+			AssertControlExists( "message", typeof( Label ) );
+			AssertControlExists( "stackTrace", typeof( RichTextBox ) );
+			AssertControlExists( "okButton", typeof( Button ) );
+		}
+
+		[Test]
+		public void ControlsArePositionedCorrectly()
+		{
+			AssertControlsAreStackedVertically( "message", "stackTrace", "okButton" );
+		}
+
+		[Test]
+		public void MessageDisplaysCorrectly()
+		{
+			this.Form.Show();
+			Assert.AreEqual( "System.Exception: My message", GetText( "message" ) );
+		}
+	}
+}
diff --git a/src/GuiRunner/tests/RecentFileMenuHandlerTests.cs b/src/GuiRunner/tests/RecentFileMenuHandlerTests.cs
index cc2d0f3..f2e1eea 100644
--- a/src/GuiRunner/tests/RecentFileMenuHandlerTests.cs
+++ b/src/GuiRunner/tests/RecentFileMenuHandlerTests.cs
@@ -1,100 +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
-	}
-}
+// ****************************************************************
+// 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 a5af3f7..21c6260 100644
--- a/src/GuiRunner/tests/nunit-gui.tests.build
+++ b/src/GuiRunner/tests/nunit-gui.tests.build
@@ -1,39 +1,39 @@
-<?xml version="1.0"?>
-<project name="NUnitGuiTests" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="CommandLineTests.cs"/>
-        <include name="ExceptionDetailsFormTests.cs"/>
-    <include name="RecentFileMenuHandlerTests.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/nunit-gui.tests.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references>
-        <include name="System.Windows.Forms.dll"/>
-	  <include name="System.Drawing.dll"/>
-        <include name="${current.lib.dir}/nunit-gui-runner.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.test.dir}/test-utilities.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/GuiRunner/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit-gui.tests.csproj"/>
-        <include name="nunit-gui.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitGuiTests" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="CommandLineTests.cs"/>
+        <include name="ExceptionDetailsFormTests.cs"/>
+    <include name="RecentFileMenuHandlerTests.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit-gui.tests.dll" 
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references>
+        <include name="System.Windows.Forms.dll"/>
+	  <include name="System.Drawing.dll"/>
+        <include name="${current.lib.dir}/nunit-gui-runner.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.test.dir}/test-utilities.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/GuiRunner/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit-gui.tests.csproj"/>
+        <include name="nunit-gui.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/GuiRunner/tests/nunit-gui.tests.csproj b/src/GuiRunner/tests/nunit-gui.tests.csproj
index 541ae10..9eab3b3 100644
--- a/src/GuiRunner/tests/nunit-gui.tests.csproj
+++ b/src/GuiRunner/tests/nunit-gui.tests.csproj
@@ -1,113 +1,147 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-gui.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Gui.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
-      <Name>test-utilities</Name>
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\nunit-gui\nunit-gui.csproj">
-      <Name>nunit-gui</Name>
-      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="CommandLineTests.cs" />
-    <Compile Include="ExceptionDetailsFormTests.cs" />
-    <Compile Include="RecentFileMenuHandlerTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit-gui.tests.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{AAD27267-DE1F-4F61-A1FB-D1680A5B8001}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-gui.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Gui.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\nunit-gui\nunit-gui.csproj">
+      <Name>nunit-gui</Name>
+      <Project>{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="CommandLineTests.cs" />
+    <Compile Include="ExceptionDetailsFormTests.cs" />
+    <Compile Include="RecentFileMenuHandlerTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit-gui.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/GuiRunner/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/GuiRunner/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..6b18a08
Binary files /dev/null and b/src/GuiRunner/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.csproj.FileListAbsolute.txt b/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..f431e88
--- /dev/null
+++ b/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit-gui.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit-gui.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\tests\obj\Debug\nunit-gui.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\tests\obj\Debug\nunit-gui.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\GuiRunner\tests\obj\Debug\nunit-gui.tests.csprojResolveAssemblyReference.cache
diff --git a/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.csprojResolveAssemblyReference.cache b/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..9cfee81
Binary files /dev/null and b/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.pdb b/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.pdb
new file mode 100644
index 0000000..9ce7378
Binary files /dev/null and b/src/GuiRunner/tests/obj/Debug/nunit-gui.tests.pdb differ
diff --git a/src/NUnitCore/core/AbstractTestCaseDecoration.cs b/src/NUnitCore/core/AbstractTestCaseDecoration.cs
index 19ebc63..891bd70 100644
--- a/src/NUnitCore/core/AbstractTestCaseDecoration.cs
+++ b/src/NUnitCore/core/AbstractTestCaseDecoration.cs
@@ -1,42 +1,42 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestDecorator is used to add functionality to
-	/// another Test, which it aggregates.
-	/// </summary>
-	public abstract class TestDecorator : TestMethod
-	{
-		protected TestMethod test;
-
-		public TestDecorator( TestMethod test )
-			//: base( (TestName)test.TestName.Clone() )
-            : base( test.Method )
-		{
-			this.test = test;
-			this.RunState = test.RunState;
-			this.IgnoreReason = test.IgnoreReason;
-            this.Description = test.Description;
-            this.Categories = new System.Collections.ArrayList( test.Categories );
-            if ( test.Properties != null )
-            {
-                this.Properties = new ListDictionary();
-                foreach (DictionaryEntry entry in test.Properties)
-                    this.Properties.Add(entry.Key, entry.Value);
-            }
-        }
-
-		public override int TestCount
-		{
-			get { return test.TestCount; }
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestDecorator is used to add functionality to
+	/// another Test, which it aggregates.
+	/// </summary>
+	public abstract class TestDecorator : TestMethod
+	{
+		protected TestMethod test;
+
+		public TestDecorator( TestMethod test )
+			//: base( (TestName)test.TestName.Clone() )
+            : base( test.Method )
+		{
+			this.test = test;
+			this.RunState = test.RunState;
+			this.IgnoreReason = test.IgnoreReason;
+            this.Description = test.Description;
+            this.Categories = new System.Collections.ArrayList( test.Categories );
+            if ( test.Properties != null )
+            {
+                this.Properties = new ListDictionary();
+                foreach (DictionaryEntry entry in test.Properties)
+                    this.Properties.Add(entry.Key, entry.Value);
+            }
+        }
+
+		public override int TestCount
+		{
+			get { return test.TestCount; }
+		}
+	}
+}
diff --git a/src/NUnitCore/core/ActionsHelper.cs b/src/NUnitCore/core/ActionsHelper.cs
index 3dfc275..43606d9 100644
--- a/src/NUnitCore/core/ActionsHelper.cs
+++ b/src/NUnitCore/core/ActionsHelper.cs
@@ -1,125 +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
+// ****************************************************************
+// 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 38626ed..b946d24 100644
--- a/src/NUnitCore/core/AssemblyHelper.cs
+++ b/src/NUnitCore/core/AssemblyHelper.cs
@@ -1,75 +1,93 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-    public class AssemblyHelper
-    {
-        #region GetAssemblyPath
-
-        public static string GetAssemblyPath(Type type)
-        {
-            return GetAssemblyPath(type.Assembly);
-        }
-
-        public static string GetAssemblyPath(Assembly assembly)
-        {
-            string 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 (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.Substring(start);
-        }
-
-        #endregion
-
-        #region GetDirectoryName
-        public static string GetDirectoryName( Assembly assembly )
-        {
-            return System.IO.Path.GetDirectoryName(GetAssemblyPath(assembly));
-        }
-        #endregion
-
-        #region Helper Methods
-
-        private static bool IsFileUri(string uri)
-        {
-            return uri.ToLower().StartsWith(Uri.UriSchemeFile);
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+    public class AssemblyHelper
+    {
+        #region GetAssemblyPath
+
+        public static string GetAssemblyPath(Type type)
+        {
+            return GetAssemblyPath(type.Assembly);
+        }
+
+        // There are two implementations of GetAssemblyPath,
+        // one for .NET 1.1 and one for later frameworks.
+        public static string GetAssemblyPath(Assembly assembly)
+        {
+#if CLR_2_0 || CLR_4_0
+            string codeBase = assembly.EscapedCodeBase;
+            
+            if (IsFileUri(codeBase))
+                return GetAssemblyPathFromEscapedCodeBase(codeBase);
+#else
+            string codeBase = assembly.CodeBase;
+
+            if (IsFileUri(codeBase))
+                return GetAssemblyPathFromCodeBase(codeBase);
+#endif
+            
+            return assembly.Location;
+        }
+
+        #endregion
+
+        #region
+
+#if CLR_2_0 || CLR_4_0
+        // Public for testing purposes
+        public static string GetAssemblyPathFromEscapedCodeBase(string escapedCodeBase)
+        {
+            return new Uri(escapedCodeBase).LocalPath;
+        }
+#else
+        public static string GetAssemblyPathFromCodeBase(string codeBase)
+        {
+            // Skip over the file:// part
+            int start = Uri.UriSchemeFile.Length + Uri.SchemeDelimiter.Length;
+
+            bool isWindows = System.IO.Path.DirectorySeparatorChar == '\\';
+
+            if (codeBase[start] == '/') // third slash means a local path
+            {
+                // Handle Windows Drive specifications
+                if (isWindows && codeBase[start + 2] == ':')
+                    ++start;  
+                // else leave the last slash so path is absolute  
+            }
+            else // It's either a Windows Drive spec or a share
+            {
+                if (!isWindows || codeBase[start + 1] != ':')
+                    start -= 2; // Back up to include two slashes
+            }
+
+            return codeBase.Substring(start);
+        }
+#endif
+
+        #endregion
+
+        #region GetDirectoryName
+        public static string GetDirectoryName( Assembly assembly )
+        {
+            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/AssemblyInfo.cs b/src/NUnitCore/core/AssemblyInfo.cs
index ebc2192..eb752be 100644
--- a/src/NUnitCore/core/AssemblyInfo.cs
+++ b/src/NUnitCore/core/AssemblyInfo.cs
@@ -1,13 +1,13 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Reflection;
-
-[assembly: CLSCompliant(true)]
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Reflection;
+
+[assembly: CLSCompliant(true)]
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitCore/core/AssemblyReader.cs b/src/NUnitCore/core/AssemblyReader.cs
index d44d898..aaf7c6c 100644
--- a/src/NUnitCore/core/AssemblyReader.cs
+++ b/src/NUnitCore/core/AssemblyReader.cs
@@ -1,186 +1,186 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Reflection;
-using System.Text;
-using System.IO;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// AssemblyReader knows how to find various things in an assembly header
-	/// </summary>
-	public class AssemblyReader : IDisposable
-	{
-		private string assemblyPath;
-		private BinaryReader rdr;
-		private FileStream fs;
-
-		UInt16 dos_magic = 0xffff;
-		UInt32 pe_signature = 0xffffffff;
-		UInt16 numberOfSections;
-		UInt16 optionalHeaderSize;
-        UInt16 peType;
-        UInt32 numDataDirectoryEntries;
-
-		private uint peHeader = 0;
-		private uint fileHeader = 0;
-		private uint optionalHeader = 0;
-		private uint dataDirectory = 0;
-		private uint dataSections = 0;
-
-		private struct DataSection
-		{
-			public uint virtualAddress;
-			public uint virtualSize;
-			public uint fileOffset;
-		};
-
-		private DataSection[] sections;
-
-		public AssemblyReader( string assemblyPath )
-		{
-			this.assemblyPath = assemblyPath;
-			CalcHeaderOffsets();
-		}
-
-		public AssemblyReader( Assembly assembly )
-		{
-			this.assemblyPath = AssemblyHelper.GetAssemblyPath( assembly );
-			CalcHeaderOffsets();
-		}
-
-		private void CalcHeaderOffsets()
-		{
-			this.fs = new FileStream( assemblyPath, FileMode.Open, FileAccess.Read );
-			this.rdr = new BinaryReader( fs );
-			dos_magic = rdr.ReadUInt16();
-			if ( dos_magic == 0x5a4d )
-			{
-				fs.Position = 0x3c;
-				peHeader = rdr.ReadUInt32();
-				fileHeader = peHeader + 4;
-				optionalHeader = fileHeader + 20;
-
-                fs.Position = optionalHeader;
-                peType = rdr.ReadUInt16();
-
-                dataDirectory = peType == 0x20b
-                    ? optionalHeader + 112
-                    : optionalHeader + 96;
-
-                fs.Position = dataDirectory - 4;
-                numDataDirectoryEntries = rdr.ReadUInt32();
-
-				fs.Position = peHeader;
-				pe_signature = rdr.ReadUInt32();
-				rdr.ReadUInt16(); // machine
-				numberOfSections = rdr.ReadUInt16();
-				fs.Position += 12;
-				optionalHeaderSize = rdr.ReadUInt16();
-				dataSections = optionalHeader + optionalHeaderSize;
-
-				sections = new DataSection[numberOfSections];
-				fs.Position = dataSections;
-				for( int i = 0; i < numberOfSections; i++ )
-				{
-					fs.Position += 8;
-					sections[i].virtualSize = rdr.ReadUInt32();
-					sections[i].virtualAddress = rdr.ReadUInt32();
-					uint rawDataSize = rdr.ReadUInt32();
-					sections[i].fileOffset = rdr.ReadUInt32();
-					if ( sections[i].virtualSize == 0 )
-						sections[i].virtualSize = rawDataSize;
-
-					fs.Position += 16;
-				}
-			}
-		}
-
-		private uint DataDirectoryRva( int n )
-		{
-			fs.Position = dataDirectory + n * 8;
-			return rdr.ReadUInt32();
-		}
-
-		private uint RvaToLfa( uint rva )
-		{
-			for( int i = 0; i < numberOfSections; i++ )
-				if ( rva >= sections[i].virtualAddress && rva < sections[i].virtualAddress + sections[i].virtualSize )
-					return rva - sections[i].virtualAddress + sections[i].fileOffset;
-
-			return 0;
-		}
-
-		public string AssemblyPath
-		{
-			get { return assemblyPath; }
-		}
-
-		public bool IsValidPeFile
-		{
-			get { return dos_magic == 0x5a4d && pe_signature == 0x00004550; }
-		}
-
-		public bool IsDotNetFile
-		{
-			get { return IsValidPeFile && numDataDirectoryEntries > 14 && DataDirectoryRva(14) != 0; }
-		}
-
-        public bool Is64BitImage
-        {
-            get { return peType == 0x20b; }
-        }
-
-		public string ImageRuntimeVersion
-		{
-			get 
-			{
-				string runtimeVersion = string.Empty;
-
-                if (this.IsDotNetFile)
-                {
-                    uint rva = DataDirectoryRva(14);
-                    if (rva != 0)
-                    {
-                        fs.Position = RvaToLfa(rva) + 8;
-                        uint metadata = rdr.ReadUInt32();
-                        fs.Position = RvaToLfa(metadata);
-                        if (rdr.ReadUInt32() == 0x424a5342)
-                        {
-                            // Copy string representing runtime version
-                            fs.Position += 12;
-                            StringBuilder sb = new StringBuilder();
-                            char c;
-                            while ((c = rdr.ReadChar()) != '\0')
-                                sb.Append(c);
-
-                            if (sb[0] == 'v') // Last sanity check
-                                runtimeVersion = sb.ToString();
-
-                            // Could do fixups here for bad values in older files
-                            // like 1.x86, 1.build, etc. But we are only using
-                            // the major version anyway
-                        }
-                    }
-                }
-
-				return runtimeVersion; 
-			}
-		}
-
-		public void Dispose()
-		{
-			if ( fs != null )
-				fs.Close();
-			if ( rdr != null )
-				rdr.Close();
-
-			fs = null;
-			rdr = null;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Reflection;
+using System.Text;
+using System.IO;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// AssemblyReader knows how to find various things in an assembly header
+	/// </summary>
+	public class AssemblyReader : IDisposable
+	{
+		private string assemblyPath;
+		private BinaryReader rdr;
+		private FileStream fs;
+
+		UInt16 dos_magic = 0xffff;
+		UInt32 pe_signature = 0xffffffff;
+		UInt16 numberOfSections;
+		UInt16 optionalHeaderSize;
+        UInt16 peType;
+        UInt32 numDataDirectoryEntries;
+
+		private uint peHeader = 0;
+		private uint fileHeader = 0;
+		private uint optionalHeader = 0;
+		private uint dataDirectory = 0;
+		private uint dataSections = 0;
+
+		private struct DataSection
+		{
+			public uint virtualAddress;
+			public uint virtualSize;
+			public uint fileOffset;
+		};
+
+		private DataSection[] sections;
+
+		public AssemblyReader( string assemblyPath )
+		{
+			this.assemblyPath = assemblyPath;
+			CalcHeaderOffsets();
+		}
+
+		public AssemblyReader( Assembly assembly )
+		{
+			this.assemblyPath = AssemblyHelper.GetAssemblyPath( assembly );
+			CalcHeaderOffsets();
+		}
+
+		private void CalcHeaderOffsets()
+		{
+			this.fs = new FileStream( assemblyPath, FileMode.Open, FileAccess.Read );
+			this.rdr = new BinaryReader( fs );
+			dos_magic = rdr.ReadUInt16();
+			if ( dos_magic == 0x5a4d )
+			{
+				fs.Position = 0x3c;
+				peHeader = rdr.ReadUInt32();
+				fileHeader = peHeader + 4;
+				optionalHeader = fileHeader + 20;
+
+                fs.Position = optionalHeader;
+                peType = rdr.ReadUInt16();
+
+                dataDirectory = peType == 0x20b
+                    ? optionalHeader + 112
+                    : optionalHeader + 96;
+
+                fs.Position = dataDirectory - 4;
+                numDataDirectoryEntries = rdr.ReadUInt32();
+
+				fs.Position = peHeader;
+				pe_signature = rdr.ReadUInt32();
+				rdr.ReadUInt16(); // machine
+				numberOfSections = rdr.ReadUInt16();
+				fs.Position += 12;
+				optionalHeaderSize = rdr.ReadUInt16();
+				dataSections = optionalHeader + optionalHeaderSize;
+
+				sections = new DataSection[numberOfSections];
+				fs.Position = dataSections;
+				for( int i = 0; i < numberOfSections; i++ )
+				{
+					fs.Position += 8;
+					sections[i].virtualSize = rdr.ReadUInt32();
+					sections[i].virtualAddress = rdr.ReadUInt32();
+					uint rawDataSize = rdr.ReadUInt32();
+					sections[i].fileOffset = rdr.ReadUInt32();
+					if ( sections[i].virtualSize == 0 )
+						sections[i].virtualSize = rawDataSize;
+
+					fs.Position += 16;
+				}
+			}
+		}
+
+		private uint DataDirectoryRva( int n )
+		{
+			fs.Position = dataDirectory + n * 8;
+			return rdr.ReadUInt32();
+		}
+
+		private uint RvaToLfa( uint rva )
+		{
+			for( int i = 0; i < numberOfSections; i++ )
+				if ( rva >= sections[i].virtualAddress && rva < sections[i].virtualAddress + sections[i].virtualSize )
+					return rva - sections[i].virtualAddress + sections[i].fileOffset;
+
+			return 0;
+		}
+
+		public string AssemblyPath
+		{
+			get { return assemblyPath; }
+		}
+
+		public bool IsValidPeFile
+		{
+			get { return dos_magic == 0x5a4d && pe_signature == 0x00004550; }
+		}
+
+		public bool IsDotNetFile
+		{
+			get { return IsValidPeFile && numDataDirectoryEntries > 14 && DataDirectoryRva(14) != 0; }
+		}
+
+        public bool Is64BitImage
+        {
+            get { return peType == 0x20b; }
+        }
+
+		public string ImageRuntimeVersion
+		{
+			get 
+			{
+				string runtimeVersion = string.Empty;
+
+                if (this.IsDotNetFile)
+                {
+                    uint rva = DataDirectoryRva(14);
+                    if (rva != 0)
+                    {
+                        fs.Position = RvaToLfa(rva) + 8;
+                        uint metadata = rdr.ReadUInt32();
+                        fs.Position = RvaToLfa(metadata);
+                        if (rdr.ReadUInt32() == 0x424a5342)
+                        {
+                            // Copy string representing runtime version
+                            fs.Position += 12;
+                            StringBuilder sb = new StringBuilder();
+                            char c;
+                            while ((c = rdr.ReadChar()) != '\0')
+                                sb.Append(c);
+
+                            if (sb[0] == 'v') // Last sanity check
+                                runtimeVersion = sb.ToString();
+
+                            // Could do fixups here for bad values in older files
+                            // like 1.x86, 1.build, etc. But we are only using
+                            // the major version anyway
+                        }
+                    }
+                }
+
+				return runtimeVersion; 
+			}
+		}
+
+		public void Dispose()
+		{
+			if ( fs != null )
+				fs.Close();
+			if ( rdr != null )
+				rdr.Close();
+
+			fs = null;
+			rdr = null;
+		}
+	}
+}
diff --git a/src/NUnitCore/core/AssemblyResolver.cs b/src/NUnitCore/core/AssemblyResolver.cs
index dec7ac2..c745c02 100644
--- a/src/NUnitCore/core/AssemblyResolver.cs
+++ b/src/NUnitCore/core/AssemblyResolver.cs
@@ -1,124 +1,126 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.IO;
-	using System.Reflection;
-	using System.Collections;
-
-	/// <summary>
-	/// Class adapted from NUnitAddin for use in handling assemblies that are not
-    /// found in the test AppDomain.
-	/// </summary>
-    public class AssemblyResolver : MarshalByRefObject, IDisposable
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(AssemblyResolver));
-
-		private class AssemblyCache
-		{
-			private Hashtable _resolved = new Hashtable();
-
-			public bool Contains( string name )
-			{
-				return _resolved.ContainsKey( name );
-			}
-
-			public Assembly Resolve( string name )
-			{
-				if ( _resolved.ContainsKey( name ) )
-					return (Assembly)_resolved[name];
-				
-				return null;
-			}
-
-			public void Add( string name, Assembly assembly )
-			{
-				_resolved[name] = assembly;
-			}
-		}
-
-		private AssemblyCache _cache = new AssemblyCache();
-
-		private ArrayList _dirs = new ArrayList();
-
-		public AssemblyResolver()
-		{
-			AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
-		}
-
-		public void Dispose()
-		{
-			AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
-		}
-
-		public void AddFile( string file )
-		{
-			Assembly assembly = Assembly.LoadFrom( file );
-			_cache.Add(assembly.GetName().FullName, assembly);
-		}
-
-		public void AddFiles( string directory, string pattern )
-		{
-			if ( Directory.Exists( directory ) )
-				foreach( string file in Directory.GetFiles( directory, pattern ) )
-					AddFile( file );
-		}
-
-		public void AddDirectory( string directory )
-		{
-			if ( Directory.Exists( directory ) )
-				_dirs.Add( directory );
-		}
-
-		private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
-		{
-			string fullName = args.Name;
-			int index = fullName.IndexOf(',');
-			if(index == -1)							// Only resolve using full name.
-			{
-				log.Debug( string.Format("Not a strong name: {0}", fullName ) );
-				return null;
-			}
-
-			if ( _cache.Contains( fullName ) )
-			{
-				log.Info( string.Format( "Resolved from Cache: {0}", fullName ) );
-				return _cache.Resolve(fullName);
-			}
-
-			foreach( string dir in _dirs )
-			{
-				foreach( string file in Directory.GetFiles( dir, "*.dll" ) )
-				{
-					string fullFile = Path.Combine( dir, file );
-                    AssemblyReader rdr = new AssemblyReader(fullFile);
-					try
-					{
-                        if (rdr.IsDotNetFile)
-                        {
-                            if (AssemblyName.GetAssemblyName(fullFile).FullName == fullName)
-                            {
-                                log.Info(string.Format("Added to Cache: {0}", fullFile));
-                                AddFile(fullFile);
-                                return _cache.Resolve(fullName);
-                            }
-                        }
-					}
-					catch(Exception ex)
-					{
-                        log.Error( "Unable to load addin assembly", ex );
-                        throw;
-					}
-				}
-			}
-
-			log.Debug( string.Format( "Not in Cache: {0}", fullName) ); 
-			return null;
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.IO;
+	using System.Reflection;
+	using System.Collections;
+
+	/// <summary>
+	/// Class adapted from NUnitAddin for use in handling assemblies that are not
+    /// found in the test AppDomain.
+	/// </summary>
+    public class AssemblyResolver : MarshalByRefObject, IDisposable
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(AssemblyResolver));
+
+		private class AssemblyCache
+		{
+			private Hashtable _resolved = new Hashtable();
+
+			public bool Contains( string name )
+			{
+				return _resolved.ContainsKey( name );
+			}
+
+			public Assembly Resolve( string name )
+			{
+				if ( _resolved.ContainsKey( name ) )
+					return (Assembly)_resolved[name];
+				
+				return null;
+			}
+
+			public void Add( string name, Assembly assembly )
+			{
+				_resolved[name] = assembly;
+			}
+		}
+
+		private AssemblyCache _cache = new AssemblyCache();
+
+		private ArrayList _dirs = new ArrayList();
+
+		public AssemblyResolver()
+		{
+			AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
+		}
+
+		public void Dispose()
+		{
+			AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve);
+		}
+
+		public void AddFile( string file )
+		{
+			Assembly assembly = Assembly.LoadFrom( file );
+			_cache.Add(assembly.GetName().FullName, assembly);
+		}
+
+		public void AddFiles( string directory, string pattern )
+		{
+			if ( Directory.Exists( directory ) )
+				foreach( string file in Directory.GetFiles( directory, pattern ) )
+					AddFile( file );
+		}
+
+		public void AddDirectory( string directory )
+		{
+			if ( Directory.Exists( directory ) )
+				_dirs.Add( directory );
+		}
+
+		private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
+		{
+			string fullName = args.Name;
+			int index = fullName.IndexOf(',');
+			if(index == -1)							// Only resolve using full name.
+			{
+				log.Debug( string.Format("Not a strong name: {0}", fullName ) );
+				return null;
+			}
+
+			if ( _cache.Contains( fullName ) )
+			{
+				log.Info( string.Format( "Resolved from Cache: {0}", fullName ) );
+				return _cache.Resolve(fullName);
+			}
+
+			foreach( string dir in _dirs )
+			{
+				foreach( string file in Directory.GetFiles( dir, "*.dll" ) )
+				{
+					string fullFile = Path.Combine( dir, file );
+                    using (AssemblyReader rdr = new AssemblyReader(fullFile))
+                    {
+                        try
+                        {
+                            if (rdr.IsDotNetFile)
+                            {
+                                if (AssemblyName.GetAssemblyName(fullFile).FullName == fullName)
+                                {
+                                    log.Info(string.Format("Added to Cache: {0}", fullFile));
+                                    AddFile(fullFile);
+                                    return _cache.Resolve(fullName);
+                                }
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            log.Error("Unable to load addin assembly", ex);
+                            throw;
+                        }
+                    }
+				}
+			}
+
+			log.Debug( string.Format( "Not in Cache: {0}", fullName) ); 
+			return null;
+		}
+	}
+}
diff --git a/src/NUnitCore/core/AsyncInvocationRegion.cs b/src/NUnitCore/core/AsyncInvocationRegion.cs
new file mode 100644
index 0000000..ad995a4
--- /dev/null
+++ b/src/NUnitCore/core/AsyncInvocationRegion.cs
@@ -0,0 +1,137 @@
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Threading;
+
+namespace NUnit.Framework
+{
+	internal abstract class AsyncInvocationRegion : IDisposable
+	{
+		private static readonly Type AsyncStateMachineAttribute = Type.GetType("System.Runtime.CompilerServices.AsyncStateMachineAttribute");
+		private static readonly MethodInfo PreserveStackTraceMethod = typeof(Exception).GetMethod("InternalPreserveStackTrace", BindingFlags.Instance | BindingFlags.NonPublic);
+
+        private static Action<Exception> preserveStackTraceDelegate;
+        private static void PreserveStackTrace(Exception ex)
+        {
+            if (PreserveStackTraceMethod != null)
+            {
+                if (preserveStackTraceDelegate == null)
+                    preserveStackTraceDelegate = (Action<Exception>)Delegate.CreateDelegate(typeof(Action<Exception>), PreserveStackTraceMethod);
+
+                preserveStackTraceDelegate(ex);
+            }
+        }
+
+		private AsyncInvocationRegion()
+		{
+		}
+
+		public static AsyncInvocationRegion Create(Delegate @delegate)
+		{
+			return Create(@delegate.Method);
+		}
+
+		public static AsyncInvocationRegion Create(MethodInfo method)
+		{
+			if (!IsAsyncOperation(method))
+				throw new InvalidOperationException(@"Either asynchronous support is not available or an attempt 
+at wrapping a non-async method invocation in an async region was done");
+
+			if (method.ReturnType == typeof(void))
+				return new AsyncVoidInvocationRegion();
+
+			return new AsyncTaskInvocationRegion();
+		}
+
+		public static bool IsAsyncOperation(MethodInfo method)
+		{
+			return AsyncStateMachineAttribute != null && method.IsDefined(AsyncStateMachineAttribute, false);
+		}
+
+		public static bool IsAsyncOperation(Delegate @delegate)
+		{
+			return IsAsyncOperation(@delegate.Method);
+		}
+
+		/// <summary>
+		/// Waits for pending asynchronous operations to complete, if appropriate,
+		/// and returns a proper result of the invocation by unwrapping task results
+		/// </summary>
+		/// <param name="invocationResult">The raw result of the method invocation</param>
+		/// <returns>The unwrapped result, if necessary</returns>
+		public abstract object WaitForPendingOperationsToComplete(object invocationResult);
+
+		public virtual void Dispose()
+		{ }
+
+		private class AsyncVoidInvocationRegion : AsyncInvocationRegion
+		{
+			private readonly SynchronizationContext _previousContext;
+			private readonly AsyncSynchronizationContext _currentContext;
+
+			public AsyncVoidInvocationRegion()
+			{
+				_previousContext = SynchronizationContext.Current;
+				_currentContext = new AsyncSynchronizationContext();
+				SynchronizationContext.SetSynchronizationContext(_currentContext);
+			}
+
+			public override void Dispose()
+			{
+				SynchronizationContext.SetSynchronizationContext(_previousContext);
+			}
+
+			public override object WaitForPendingOperationsToComplete(object invocationResult)
+			{
+				try
+				{
+					_currentContext.WaitForPendingOperationsToComplete();
+					return invocationResult;
+				}
+				catch (Exception e)
+				{
+					PreserveStackTrace(e);
+					throw;
+				}
+			}
+		}
+
+		private class AsyncTaskInvocationRegion : AsyncInvocationRegion
+		{
+			private const string TaskWaitMethod = "Wait";
+			private const string TaskResultProperty = "Result";
+			private const string SystemAggregateException = "System.AggregateException";
+			private const string InnerExceptionsProperty = "InnerExceptions";
+			private const BindingFlags TaskResultPropertyBindingFlags = BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public;
+
+			public override object WaitForPendingOperationsToComplete(object invocationResult)
+			{
+				try
+				{
+					invocationResult.GetType().GetMethod(TaskWaitMethod, new Type[0]).Invoke(invocationResult, null);
+				}
+				catch (TargetInvocationException e)
+				{
+					IList<Exception> innerExceptions = GetAllExceptions(e.InnerException);
+
+					PreserveStackTrace(innerExceptions[0]);
+					throw innerExceptions[0];
+				}
+
+				PropertyInfo taskResultProperty = invocationResult.GetType().GetProperty(TaskResultProperty, TaskResultPropertyBindingFlags);
+
+				return taskResultProperty != null ? taskResultProperty.GetValue(invocationResult, null) : invocationResult;
+			}
+
+			private static IList<Exception> GetAllExceptions(Exception exception)
+			{
+				if (SystemAggregateException.Equals(exception.GetType().FullName))
+					return (IList<Exception>)exception.GetType().GetProperty(InnerExceptionsProperty).GetValue(exception, null);
+
+				return new Exception[] { exception };
+			}
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/core/AsyncSynchronizationContext.cs b/src/NUnitCore/core/AsyncSynchronizationContext.cs
new file mode 100644
index 0000000..bb407f2
--- /dev/null
+++ b/src/NUnitCore/core/AsyncSynchronizationContext.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections;
+using System.Threading;
+
+namespace NUnit.Framework
+{
+	internal class AsyncSynchronizationContext : SynchronizationContext
+    {
+        private int _operationCount;
+		private readonly AsyncOperationQueue _operations = new AsyncOperationQueue();
+
+		public override void Send(SendOrPostCallback d, object state)
+		{
+			throw new InvalidOperationException("Sending to this synchronization context is not supported");
+		}
+
+		public override void Post(SendOrPostCallback d, object state)
+		{
+			_operations.Enqueue(new AsyncOperation(d, state));
+		}
+
+		public override void OperationStarted()
+		{
+			Interlocked.Increment(ref _operationCount);
+			base.OperationStarted();
+		}
+
+		public override void OperationCompleted()
+		{
+			if (Interlocked.Decrement(ref _operationCount) == 0)
+				_operations.MarkAsComplete();
+
+			base.OperationCompleted();
+        }
+
+		public void WaitForPendingOperationsToComplete()
+		{
+			_operations.InvokeAll();
+		}
+
+		private class AsyncOperationQueue
+		{
+			private bool _run = true;
+			private readonly Queue _operations = Queue.Synchronized(new Queue());
+			private readonly AutoResetEvent _operationsAvailable = new AutoResetEvent(false);
+
+			public void Enqueue(AsyncOperation asyncOperation)
+			{
+				_operations.Enqueue(asyncOperation);
+				_operationsAvailable.Set();
+			}
+
+			public void MarkAsComplete()
+			{
+				_run = false;
+				_operationsAvailable.Set();
+			}
+
+			public void InvokeAll()
+			{
+				while (_run)
+				{
+					InvokePendingOperations();
+					_operationsAvailable.WaitOne();
+				}
+
+				InvokePendingOperations();
+			}
+
+			private void InvokePendingOperations()
+			{
+				while (_operations.Count > 0)
+				{
+					AsyncOperation operation = (AsyncOperation)_operations.Dequeue();
+					operation.Invoke();
+				}
+			}
+		}
+
+		private class AsyncOperation
+		{
+			private readonly SendOrPostCallback _action;
+			private readonly object _state;
+
+			public AsyncOperation(SendOrPostCallback action, object state)
+			{
+				_action = action;
+				_state = state;
+			}
+
+			public void Invoke()
+			{
+				_action(_state);
+			}
+		}
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitCore/core/Builders/CombinatorialStrategy.cs b/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
index 7d2a273..7a1fe3b 100644
--- a/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
+++ b/src/NUnitCore/core/Builders/CombinatorialStrategy.cs
@@ -1,60 +1,60 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Core.Builders
-{
-    public class CombinatorialStrategy : CombiningStrategy
-    {
-        public CombinatorialStrategy(IEnumerable[] sources) : base(sources) { }
-
-        public override IEnumerable GetTestCases()
-        {
-            IEnumerator[] enumerators = new IEnumerator[Sources.Length];
-            int index = -1;
-
-#if CLR_2_0 || CLR_4_0
-            List<ParameterSet> testCases = new List<ParameterSet>();
-#else
-			ArrayList testCases = new ArrayList();
-#endif
-
-            for (; ; )
-            {
-                while (++index < Sources.Length)
-                {
-                    enumerators[index] = Sources[index].GetEnumerator();
-                    if (!enumerators[index].MoveNext())
-						return testCases;
-                }
-
-                object[] testdata = new object[Sources.Length];
-
-                for (int i = 0; i < Sources.Length; i++)
-                    testdata[i] = enumerators[i].Current;
-
-                ParameterSet testCase = new ParameterSet();
-                testCase.Arguments = testdata;
-				testCases.Add(testCase);
-
-                index = Sources.Length;
-
-                while (--index >= 0 && !enumerators[index].MoveNext()) ;
-
-                if (index < 0) break;
-            }
-
-			return testCases;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Core.Builders
+{
+    public class CombinatorialStrategy : CombiningStrategy
+    {
+        public CombinatorialStrategy(IEnumerable[] sources) : base(sources) { }
+
+        public override IEnumerable GetTestCases()
+        {
+            IEnumerator[] enumerators = new IEnumerator[Sources.Length];
+            int index = -1;
+
+#if CLR_2_0 || CLR_4_0
+            List<ParameterSet> testCases = new List<ParameterSet>();
+#else
+			ArrayList testCases = new ArrayList();
+#endif
+
+            for (; ; )
+            {
+                while (++index < Sources.Length)
+                {
+                    enumerators[index] = Sources[index].GetEnumerator();
+                    if (!enumerators[index].MoveNext())
+						return testCases;
+                }
+
+                object[] testdata = new object[Sources.Length];
+
+                for (int i = 0; i < Sources.Length; i++)
+                    testdata[i] = enumerators[i].Current;
+
+                ParameterSet testCase = new ParameterSet();
+                testCase.Arguments = testdata;
+				testCases.Add(testCase);
+
+                index = Sources.Length;
+
+                while (--index >= 0 && !enumerators[index].MoveNext()) ;
+
+                if (index < 0) break;
+            }
+
+			return testCases;
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs b/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs
index 5069d8e..5a764da 100644
--- a/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs
+++ b/src/NUnitCore/core/Builders/CombinatorialTestCaseProvider.cs
@@ -1,75 +1,75 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    public class CombinatorialTestCaseProvider : ITestCaseProvider2
-    {
-        #region Static Members
-        static IDataPointProvider2 dataPointProvider =
-            (IDataPointProvider2)CoreExtensions.Host.GetExtensionPoint("DataPointProviders");
-
-        //static readonly string CombinatorialAttribute = "NUnit.Framework.CombinatorialAttribute";
-        static readonly string PairwiseAttribute = "NUnit.Framework.PairwiseAttribute";
-        static readonly string SequentialAttribute = "NUnit.Framework.SequentialAttribute";
-        #endregion
-
-        #region ITestCaseProvider Members
-        public bool HasTestCasesFor(System.Reflection.MethodInfo method)
-        {
-            if (method.GetParameters().Length == 0)
-                return false;
-
-            foreach (ParameterInfo parameter in method.GetParameters())
-                if (!dataPointProvider.HasDataFor(parameter))
-                    return false;
-
-            return true;
-        }
-
-        public IEnumerable GetTestCasesFor(MethodInfo method)
-        {
-            return GetStrategy(method, null).GetTestCases();
-        }
-        #endregion
-
-        #region ITestCaseProvider2 Members
-        public bool HasTestCasesFor(System.Reflection.MethodInfo method, Test suite)
-        {
-            return HasTestCasesFor(method);
-        }
-
-        public IEnumerable GetTestCasesFor(MethodInfo method, Test suite)
-        {
-            return GetStrategy(method, suite).GetTestCases();
-        }
-        #endregion
-
-        #region GetStrategy
-        private CombiningStrategy GetStrategy(MethodInfo method, Test suite)
-        {
-            ParameterInfo[] parameters = method.GetParameters();
-            IEnumerable[] sources = new IEnumerable[parameters.Length];
-            for (int i = 0; i < parameters.Length; i++)
-                sources[i] = dataPointProvider.GetDataFor(parameters[i], suite);
-
-            if (Reflect.HasAttribute(method, SequentialAttribute, false))
-                return new SequentialStrategy(sources);
-
-            if (Reflect.HasAttribute(method, PairwiseAttribute, false) &&
-                method.GetParameters().Length > 2)
-                    return new PairwiseStrategy(sources);
-
-            return new CombinatorialStrategy(sources);
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class CombinatorialTestCaseProvider : ITestCaseProvider2
+    {
+        #region Static Members
+        static IDataPointProvider2 dataPointProvider =
+            (IDataPointProvider2)CoreExtensions.Host.GetExtensionPoint("DataPointProviders");
+
+        //static readonly string CombinatorialAttribute = "NUnit.Framework.CombinatorialAttribute";
+        static readonly string PairwiseAttribute = "NUnit.Framework.PairwiseAttribute";
+        static readonly string SequentialAttribute = "NUnit.Framework.SequentialAttribute";
+        #endregion
+
+        #region ITestCaseProvider Members
+        public bool HasTestCasesFor(System.Reflection.MethodInfo method)
+        {
+            if (method.GetParameters().Length == 0)
+                return false;
+
+            foreach (ParameterInfo parameter in method.GetParameters())
+                if (!dataPointProvider.HasDataFor(parameter))
+                    return false;
+
+            return true;
+        }
+
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+            return GetStrategy(method, null).GetTestCases();
+        }
+        #endregion
+
+        #region ITestCaseProvider2 Members
+        public bool HasTestCasesFor(System.Reflection.MethodInfo method, Test suite)
+        {
+            return HasTestCasesFor(method);
+        }
+
+        public IEnumerable GetTestCasesFor(MethodInfo method, Test suite)
+        {
+            return GetStrategy(method, suite).GetTestCases();
+        }
+        #endregion
+
+        #region GetStrategy
+        private CombiningStrategy GetStrategy(MethodInfo method, Test suite)
+        {
+            ParameterInfo[] parameters = method.GetParameters();
+            IEnumerable[] sources = new IEnumerable[parameters.Length];
+            for (int i = 0; i < parameters.Length; i++)
+                sources[i] = dataPointProvider.GetDataFor(parameters[i], suite);
+
+            if (Reflect.HasAttribute(method, SequentialAttribute, false))
+                return new SequentialStrategy(sources);
+
+            if (Reflect.HasAttribute(method, PairwiseAttribute, false) &&
+                method.GetParameters().Length > 2)
+                    return new PairwiseStrategy(sources);
+
+            return new CombinatorialStrategy(sources);
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/CombiningStrategy.cs b/src/NUnitCore/core/Builders/CombiningStrategy.cs
index 40214eb..f6543d0 100644
--- a/src/NUnitCore/core/Builders/CombiningStrategy.cs
+++ b/src/NUnitCore/core/Builders/CombiningStrategy.cs
@@ -1,49 +1,49 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    public abstract class CombiningStrategy
-    {
-        protected IDataPointProvider dataPointProvider =
-            (IDataPointProvider)CoreExtensions.Host.GetExtensionPoint("DataPointProviders");
-
-        private IEnumerable[] sources;
-        private IEnumerator[] enumerators;
-
-        public CombiningStrategy(IEnumerable[] sources)
-        {
-            this.sources = sources;
-        }
-
-        public IEnumerable[] Sources
-        {
-            get { return sources; }
-        }
-
-        public IEnumerator[] Enumerators
-        {
-            get
-            {
-                if (enumerators == null)
-                {
-                    enumerators = new IEnumerator[Sources.Length];
-                    for (int i = 0; i < Sources.Length; i++)
-                        enumerators[i] = Sources[i].GetEnumerator();
-                }
-
-                return enumerators;
-            }
-        }
-
-        public abstract IEnumerable GetTestCases();
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public abstract class CombiningStrategy
+    {
+        protected IDataPointProvider dataPointProvider =
+            (IDataPointProvider)CoreExtensions.Host.GetExtensionPoint("DataPointProviders");
+
+        private IEnumerable[] sources;
+        private IEnumerator[] enumerators;
+
+        public CombiningStrategy(IEnumerable[] sources)
+        {
+            this.sources = sources;
+        }
+
+        public IEnumerable[] Sources
+        {
+            get { return sources; }
+        }
+
+        public IEnumerator[] Enumerators
+        {
+            get
+            {
+                if (enumerators == null)
+                {
+                    enumerators = new IEnumerator[Sources.Length];
+                    for (int i = 0; i < Sources.Length; i++)
+                        enumerators[i] = Sources[i].GetEnumerator();
+                }
+
+                return enumerators;
+            }
+        }
+
+        public abstract IEnumerable GetTestCases();
+    }
+}
diff --git a/src/NUnitCore/core/Builders/DatapointProvider.cs b/src/NUnitCore/core/Builders/DatapointProvider.cs
index 9f2af01..cdb905e 100644
--- a/src/NUnitCore/core/Builders/DatapointProvider.cs
+++ b/src/NUnitCore/core/Builders/DatapointProvider.cs
@@ -1,154 +1,154 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    /// <summary>
-    /// Provides data from fields marked with the DatapointAttribute or the
-    /// DatapointsAttribute.
-    /// </summary>
-    public class DatapointProvider : IDataPointProvider
-    {
-        private static readonly string DatapointAttribute = "NUnit.Framework.DatapointAttribute";
-        private static readonly string DatapointsAttribute = "NUnit.Framework.DatapointsAttribute";
-
-        #region IDataPointProvider Members
-
-        public bool HasDataFor(System.Reflection.ParameterInfo parameter)
-        {
-            Type parameterType = parameter.ParameterType;
-            MemberInfo method = parameter.Member;
-            Type fixtureType = method.ReflectedType;
-
-            if (!Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true))
-                return false;
-
-            if (parameterType == typeof(bool) || parameterType.IsEnum)
-                return true;
-
-            foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
-            {
-                if (Reflect.HasAttribute(member, DatapointAttribute, true) &&
-                    GetTypeFromMemberInfo(member) == parameterType)
-                        return true;
-                else if (Reflect.HasAttribute(member, DatapointsAttribute, true) &&
-                    GetElementTypeFromMemberInfo(member) == parameterType)
-                        return true;
-            }
-
-            return false;
-        }
-
-        public System.Collections.IEnumerable GetDataFor(System.Reflection.ParameterInfo parameter)
-        {
-            ArrayList datapoints = new ArrayList();
-
-            Type parameterType = parameter.ParameterType;
-            Type fixtureType = parameter.Member.ReflectedType;
-
-            foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
-            {
-                if (Reflect.HasAttribute(member, DatapointAttribute, true))
-                {
-                    if (GetTypeFromMemberInfo(member) == parameterType &&
-                        member.MemberType == MemberTypes.Field)
-                    {
-                        FieldInfo field = member as FieldInfo;
-                        if (field.IsStatic)
-                            datapoints.Add(field.GetValue(null));
-                        else
-                            datapoints.Add(field.GetValue(ProviderCache.GetInstanceOf(fixtureType)));
-                    }
-                }
-                else if (Reflect.HasAttribute(member, DatapointsAttribute, true))
-                {
-                    if (GetElementTypeFromMemberInfo(member) == parameterType)
-                    {
-                        object instance;
-
-                        switch(member.MemberType)
-                        {
-                            case MemberTypes.Field:
-                                FieldInfo field = member as FieldInfo;
-                                instance = field.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
-                                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);
-                                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);
-                                foreach (object data in (IEnumerable)method.Invoke(instance, Type.EmptyTypes))
-                                    datapoints.Add(data);
-                                break;
-                        }
-                    }
-                }
-            }
-
-            if (datapoints.Count == 0)
-            {
-                if (parameterType == typeof(bool))
-                {
-                    datapoints.Add(true);
-                    datapoints.Add(false);
-                }
-                else if (parameterType.IsEnum)
-                {
-                    datapoints.AddRange(System.Enum.GetValues(parameterType));
-                }
-            }
-
-            return datapoints;
-        }
-
-        private Type GetTypeFromMemberInfo(MemberInfo member)
-        {
-            switch (member.MemberType)
-            {
-                case MemberTypes.Field:
-                    return ((FieldInfo)member).FieldType;
-                case MemberTypes.Property:
-                    return ((PropertyInfo)member).PropertyType;
-                case MemberTypes.Method:
-                    return ((MethodInfo)member).ReturnType;
-                default:
-                    return null;
-            }
-        }
-
-        private Type GetElementTypeFromMemberInfo(MemberInfo member)
-        {
-            Type type = GetTypeFromMemberInfo(member);
-
-            if (type == null)
-                return null;
-
-            if (type.IsArray)
-                return type.GetElementType();
-
-#if CLR_2_0 || CLR_4_0
-            if (type.IsGenericType && type.Name == "IEnumerable`1")
-                return type.GetGenericArguments()[0];
-#endif
-
-            return null;
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// Provides data from fields marked with the DatapointAttribute or the
+    /// DatapointsAttribute.
+    /// </summary>
+    public class DatapointProvider : IDataPointProvider
+    {
+        private static readonly string DatapointAttribute = "NUnit.Framework.DatapointAttribute";
+        private static readonly string DatapointsAttribute = "NUnit.Framework.DatapointsAttribute";
+
+        #region IDataPointProvider Members
+
+        public bool HasDataFor(System.Reflection.ParameterInfo parameter)
+        {
+            Type parameterType = parameter.ParameterType;
+            MemberInfo method = parameter.Member;
+            Type fixtureType = method.ReflectedType;
+
+            if (!Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true))
+                return false;
+
+            if (parameterType == typeof(bool) || parameterType.IsEnum)
+                return true;
+
+            foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
+            {
+                if (Reflect.HasAttribute(member, DatapointAttribute, true) &&
+                    GetTypeFromMemberInfo(member) == parameterType)
+                        return true;
+                else if (Reflect.HasAttribute(member, DatapointsAttribute, true) &&
+                    GetElementTypeFromMemberInfo(member) == parameterType)
+                        return true;
+            }
+
+            return false;
+        }
+
+        public System.Collections.IEnumerable GetDataFor(System.Reflection.ParameterInfo parameter)
+        {
+            ArrayList datapoints = new ArrayList();
+
+            Type parameterType = parameter.ParameterType;
+            Type fixtureType = parameter.Member.ReflectedType;
+
+            foreach (MemberInfo member in fixtureType.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance))
+            {
+                if (Reflect.HasAttribute(member, DatapointAttribute, true))
+                {
+                    if (GetTypeFromMemberInfo(member) == parameterType &&
+                        member.MemberType == MemberTypes.Field)
+                    {
+                        FieldInfo field = member as FieldInfo;
+                        if (field.IsStatic)
+                            datapoints.Add(field.GetValue(null));
+                        else
+                            datapoints.Add(field.GetValue(ProviderCache.GetInstanceOf(fixtureType)));
+                    }
+                }
+                else if (Reflect.HasAttribute(member, DatapointsAttribute, true))
+                {
+                    if (GetElementTypeFromMemberInfo(member) == parameterType)
+                    {
+                        object instance;
+
+                        switch(member.MemberType)
+                        {
+                            case MemberTypes.Field:
+                                FieldInfo field = member as FieldInfo;
+                                instance = field.IsStatic ? null : ProviderCache.GetInstanceOf(fixtureType);
+                                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);
+                                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);
+                                foreach (object data in (IEnumerable)method.Invoke(instance, Type.EmptyTypes))
+                                    datapoints.Add(data);
+                                break;
+                        }
+                    }
+                }
+            }
+
+            if (datapoints.Count == 0)
+            {
+                if (parameterType == typeof(bool))
+                {
+                    datapoints.Add(true);
+                    datapoints.Add(false);
+                }
+                else if (parameterType.IsEnum)
+                {
+                    datapoints.AddRange(System.Enum.GetValues(parameterType));
+                }
+            }
+
+            return datapoints;
+        }
+
+        private Type GetTypeFromMemberInfo(MemberInfo member)
+        {
+            switch (member.MemberType)
+            {
+                case MemberTypes.Field:
+                    return ((FieldInfo)member).FieldType;
+                case MemberTypes.Property:
+                    return ((PropertyInfo)member).PropertyType;
+                case MemberTypes.Method:
+                    return ((MethodInfo)member).ReturnType;
+                default:
+                    return null;
+            }
+        }
+
+        private Type GetElementTypeFromMemberInfo(MemberInfo member)
+        {
+            Type type = GetTypeFromMemberInfo(member);
+
+            if (type == null)
+                return null;
+
+            if (type.IsArray)
+                return type.GetElementType();
+
+#if CLR_2_0 || CLR_4_0
+            if (type.IsGenericType && type.Name == "IEnumerable`1")
+                return type.GetGenericArguments()[0];
+#endif
+
+            return null;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/InlineDataPointProvider.cs b/src/NUnitCore/core/Builders/InlineDataPointProvider.cs
index 9a8498f..6cfab6e 100644
--- a/src/NUnitCore/core/Builders/InlineDataPointProvider.cs
+++ b/src/NUnitCore/core/Builders/InlineDataPointProvider.cs
@@ -1,40 +1,44 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    public class InlineDataPointProvider : IDataPointProvider
-    {
-        private static readonly string ParameterDataAttribute = "NUnit.Framework.ParameterDataAttribute";
-
-        private static readonly string GetDataMethod = "GetData";
-
-        #region IDataPointProvider Members
-
-        public bool HasDataFor(ParameterInfo parameter)
-        {
-            return Reflect.HasAttribute(parameter, ParameterDataAttribute, false);
-        }
-                public IEnumerable GetDataFor(ParameterInfo parameter)
-        {
-            Attribute attr = Reflect.GetAttribute(parameter, ParameterDataAttribute, false);
-            if (attr == null) return null;
-
-            MethodInfo getData = attr.GetType().GetMethod(
-                GetDataMethod,
-                new Type[] { typeof(ParameterInfo) });
-            if ( getData == null) return null;
-            
-            return getData.Invoke(attr, new object[] { parameter }) as IEnumerable;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class InlineDataPointProvider : IDataPointProvider
+    {
+        private static readonly string ParameterDataAttribute = "NUnit.Framework.ParameterDataAttribute";
+        private static readonly string NUnitLiteDataAttribute = "NUnit.Framework.DataAttribute";
+
+        private static readonly string GetDataMethod = "GetData";
+
+        #region IDataPointProvider Members
+
+        public bool HasDataFor(ParameterInfo parameter)
+        {
+            return Reflect.HasAttribute(parameter, ParameterDataAttribute, false)
+                || Reflect.HasAttribute(parameter, NUnitLiteDataAttribute, false);
+        }
+
+        public IEnumerable GetDataFor(ParameterInfo parameter)
+        {
+            Attribute attr = Reflect.GetAttribute(parameter, ParameterDataAttribute, false);
+            if (attr == null) attr = Reflect.GetAttribute(parameter, NUnitLiteDataAttribute, false);
+            if (attr == null) return null;
+
+            MethodInfo getData = attr.GetType().GetMethod(
+                GetDataMethod,
+                new Type[] { typeof(ParameterInfo) });
+            if ( getData == null) return null;
+            
+            return getData.Invoke(attr, new object[] { parameter }) as IEnumerable;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs b/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs
index 9bf711a..0cbda6b 100644
--- a/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs
+++ b/src/NUnitCore/core/Builders/LegacySuiteBuilder.cs
@@ -1,121 +1,121 @@
-// ****************************************************************
-// 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.Reflection;
-
-namespace NUnit.Core.Builders
-{
-	/// <summary>
-	/// Built-in SuiteBuilder for LegacySuite
-	/// </summary>
-	public class LegacySuiteBuilder : Extensibility.ISuiteBuilder
-    {
-        #region ISuiteBuilderMembers
-        /// <summary>
-        /// Checks to see if the fixture type has the a property
-        /// with the SuiteAttribute.
-        /// </summary>
-        /// <param name="type">The fixture type to check</param>
-        /// <returns>True if the fixture can be built, false if not</returns>
-        public bool CanBuildFrom(Type type)
-		{
-			return GetSuiteProperty( type ) != null;
-		}
-
-		public Test BuildFrom( Type type )
-		{
-            TestSuite suite = new LegacySuite( type );
-
-            string reason = null;
-            if (!IsValidFixtureType(type, ref reason))
-            {
-                suite.RunState = RunState.NotRunnable;
-                suite.IgnoreReason = reason;
-            }
-
-            PropertyInfo suiteProperty = GetSuiteProperty(type);
-            MethodInfo method = suiteProperty.GetGetMethod(true);
-
-            if (method.GetParameters().Length > 0)
-            {
-                suite.RunState = RunState.NotRunnable;
-                suite.IgnoreReason = "Suite property may not be indexed";
-            }
-            else if (method.ReturnType.FullName == "NUnit.Core.TestSuite")
-            {
-                TestSuite s = (TestSuite)suiteProperty.GetValue(null, new Object[0]);
-                foreach (Test test in s.Tests)
-                    suite.Add(test);
-            }
-            else if (typeof(IEnumerable).IsAssignableFrom(method.ReturnType))
-            {
-                foreach (object obj in (IEnumerable)suiteProperty.GetValue(null, new object[0]))
-                {
-                    Type objType = obj as Type;
-                    if (objType != null && TestFixtureBuilder.CanBuildFrom(objType))
-                        suite.Add(TestFixtureBuilder.BuildFrom(objType));
-                    else
-                        suite.Add(obj);
-                }
-            }
-            else
-            {
-                suite.RunState = RunState.NotRunnable;
-                suite.IgnoreReason = "Suite property must return either TestSuite or IEnumerable";
-            }
-
-            return suite;
-        }
-        #endregion
-
-        #region Helper Methods
-        private bool IsValidFixtureType(Type type, ref string reason)
-        {
-            if (type.IsAbstract)
-            {
-                reason = string.Format("{0} is an abstract class", type.FullName);
-                return false;
-            }
-
-            if (Reflect.GetConstructor(type) == null)
-            {
-                reason = string.Format("{0} does not have a valid constructor", type.FullName);
-                return false;
-            }
-
-            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.FixtureSetUpAttribute, ref reason) )
-                return false;
-            
-            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.FixtureTearDownAttribute, ref reason))
-                return false;
-
-            if (Reflect.HasMethodWithAttribute(type, NUnitFramework.SetUpAttribute, true))
-            {
-                reason = "SetUp method not allowed on a legacy suite";
-                return false;
-            }
-
-            if (Reflect.HasMethodWithAttribute(type, NUnitFramework.TearDownAttribute, true))
-            {
-                reason = "TearDown method not allowed on a legacy suite";
-                return false;
-            }
-
-            return true;
-        }
-
-        public static PropertyInfo GetSuiteProperty(Type testClass)
-        {
-            //if (testClass == null)
-            //    return null;
-
-            return Reflect.GetPropertyWithAttribute(testClass, NUnitFramework.SuiteAttribute);
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// 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.Reflection;
+
+namespace NUnit.Core.Builders
+{
+	/// <summary>
+	/// Built-in SuiteBuilder for LegacySuite
+	/// </summary>
+	public class LegacySuiteBuilder : Extensibility.ISuiteBuilder
+    {
+        #region ISuiteBuilderMembers
+        /// <summary>
+        /// Checks to see if the fixture type has the a property
+        /// with the SuiteAttribute.
+        /// </summary>
+        /// <param name="type">The fixture type to check</param>
+        /// <returns>True if the fixture can be built, false if not</returns>
+        public bool CanBuildFrom(Type type)
+		{
+			return GetSuiteProperty( type ) != null;
+		}
+
+		public Test BuildFrom( Type type )
+		{
+            TestSuite suite = new LegacySuite( type );
+
+            string reason = null;
+            if (!IsValidFixtureType(type, ref reason))
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = reason;
+            }
+
+            PropertyInfo suiteProperty = GetSuiteProperty(type);
+            MethodInfo method = suiteProperty.GetGetMethod(true);
+
+            if (method.GetParameters().Length > 0)
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = "Suite property may not be indexed";
+            }
+            else if (method.ReturnType.FullName == "NUnit.Core.TestSuite")
+            {
+                TestSuite s = (TestSuite)suiteProperty.GetValue(null, new Object[0]);
+                foreach (Test test in s.Tests)
+                    suite.Add(test);
+            }
+            else if (typeof(IEnumerable).IsAssignableFrom(method.ReturnType))
+            {
+                foreach (object obj in (IEnumerable)suiteProperty.GetValue(null, new object[0]))
+                {
+                    Type objType = obj as Type;
+                    if (objType != null && TestFixtureBuilder.CanBuildFrom(objType))
+                        suite.Add(TestFixtureBuilder.BuildFrom(objType));
+                    else
+                        suite.Add(obj);
+                }
+            }
+            else
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = "Suite property must return either TestSuite or IEnumerable";
+            }
+
+            return suite;
+        }
+        #endregion
+
+        #region Helper Methods
+        private bool IsValidFixtureType(Type type, ref string reason)
+        {
+            if (type.IsAbstract)
+            {
+                reason = string.Format("{0} is an abstract class", type.FullName);
+                return false;
+            }
+
+            if (Reflect.GetConstructor(type) == null)
+            {
+                reason = string.Format("{0} does not have a valid constructor", type.FullName);
+                return false;
+            }
+
+            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.FixtureSetUpAttribute, ref reason) )
+                return false;
+            
+            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.FixtureTearDownAttribute, ref reason))
+                return false;
+
+            if (Reflect.HasMethodWithAttribute(type, NUnitFramework.SetUpAttribute, true))
+            {
+                reason = "SetUp method not allowed on a legacy suite";
+                return false;
+            }
+
+            if (Reflect.HasMethodWithAttribute(type, NUnitFramework.TearDownAttribute, true))
+            {
+                reason = "TearDown method not allowed on a legacy suite";
+                return false;
+            }
+
+            return true;
+        }
+
+        public static PropertyInfo GetSuiteProperty(Type testClass)
+        {
+            //if (testClass == null)
+            //    return null;
+
+            return Reflect.GetPropertyWithAttribute(testClass, NUnitFramework.SuiteAttribute);
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs b/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
index 2058c8a..958c663 100644
--- a/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
+++ b/src/NUnitCore/core/Builders/NUnitTestCaseBuilder.cs
@@ -1,421 +1,430 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    /// <summary>
-    /// Class to build ether a parameterized or a normal NUnitTestMethod.
-    /// There are four cases that the builder must deal with:
-    ///   1. The method needs no params and none are provided
-    ///   2. The method needs params and they are provided
-    ///   3. The method needs no params but they are provided in error
-    ///   4. The method needs params but they are not provided
-    /// This could have been done using two different builders, but it
-    /// turned out to be simpler to have just one. The BuildFrom method
-    /// takes a different branch depending on whether any parameters are
-    /// provided, but all four cases are dealt with in lower-level methods
-    /// </summary>
-    public class NUnitTestCaseBuilder : ITestCaseBuilder2
-	{
-        #region ITestCaseBuilder Methods
-        /// <summary>
-        /// Determines if the method can be used to build an NUnit test
-        /// test method of some kind. The method must normally be marked
-        /// with an identifying attriute for this to be true. If the test
-        /// config file sets AllowOldStyleTests to true, then any method beginning 
-        /// "test..." (case-insensitive) is treated as a test unless 
-        /// it is also marked as a setup or teardown method.
-        /// 
-        /// Note that this method does not check that the signature
-        /// of the method for validity. If we did that here, any
-        /// test methods with invalid signatures would be passed
-        /// over in silence in the test run. Since we want such
-        /// methods to be reported, the check for validity is made
-        /// in BuildFrom rather than here.
-        /// </summary>
-        /// <param name="method">A MethodInfo for the method being used as a test method</param>
-        /// <param name="suite">The test suite being built, to which the new test would be added</param>
-        /// <returns>True if the builder can create a test case from this method</returns>
-        public bool CanBuildFrom(MethodInfo method)
-        {
-            return Reflect.HasAttribute(method, NUnitFramework.TestAttribute, false)
-                || Reflect.HasAttribute(method, NUnitFramework.TestCaseAttribute, false)
-                || Reflect.HasAttribute(method, NUnitFramework.TestCaseSourceAttribute, false)
-                || Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, false);
-        }
-
-		/// <summary>
-        /// Build a Test from the provided MethodInfo. Depending on
-        /// whether the method takes arguments and on the availability
-        /// of test case data, this method may return a single test
-        /// or a group of tests contained in a ParameterizedMethodSuite.
-        /// </summary>
-        /// <param name="method">The MethodInfo for which a test is to be built</param>
-        /// <param name="suite">The test fixture being populated, or null</param>
-        /// <returns>A Test representing one or more method invocations</returns>
-        public Test BuildFrom(MethodInfo method)
-		{
-            return BuildFrom(method, null);
-        }
-
-        #region ITestCaseBuilder2 Members
-
-        public bool CanBuildFrom(MethodInfo method, Test parentSuite)
-        {
-            return CanBuildFrom(method);
-        }
-
-        public Test BuildFrom(MethodInfo method, Test parentSuite)
-        {
-            return CoreExtensions.Host.TestCaseProviders.HasTestCasesFor(method)
-                ? BuildParameterizedMethodSuite(method, parentSuite)
-                : BuildSingleTestMethod(method, parentSuite, null);
-        }
-
-        #endregion
-
-        /// <summary>
-        /// Builds a ParameterizedMetodSuite containing individual
-        /// test cases for each set of parameters provided for
-        /// this method.
-        /// </summary>
-        /// <param name="method">The MethodInfo for which a test is to be built</param>
-        /// <returns>A ParameterizedMethodSuite populated with test cases</returns>
-        public static Test BuildParameterizedMethodSuite(MethodInfo method, Test parentSuite)
-        {
-            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;
-
-                if (source == null)
-                {
-                    parms = new ParameterSet();
-                    parms.Arguments = new object[] { null };
-                }
-                else
-                    parms = source as ParameterSet;
-
-                if (parms == null)
-                {
-                    if (source.GetType().GetInterface("NUnit.Framework.ITestCaseData") != null)
-                        parms = ParameterSet.FromDataSource(source);
-                    else
-                    {
-                        parms = new ParameterSet();
-
-                        ParameterInfo[] parameters = method.GetParameters();
-                        Type sourceType = source.GetType();
-
-                        if (parameters.Length == 1 && parameters[0].ParameterType.IsAssignableFrom(sourceType))
-                            parms.Arguments = new object[] { source };
-                        else if (source is object[])
-                            parms.Arguments = (object[])source;
-                        else if (source is Array)
-                        {
-                            Array array = (Array)source;
-                            if (array.Rank == 1)
-                            {
-                                parms.Arguments = new object[array.Length];
-                                for (int i = 0; i < array.Length; i++)
-                                    parms.Arguments[i] = (object)array.GetValue(i);
-                            }
-                        }
-                        else
-                            parms.Arguments = new object[] { source };
-                    }
-                }
-
-                TestMethod test = BuildSingleTestMethod(method, parentSuite, parms);
-
-                methodSuite.Add(test);
-            }
-
-            return methodSuite;
-        }
-
-        /// <summary>
-        /// Builds a single NUnitTestMethod, either as a child of the fixture 
-        /// or as one of a set of test cases under a ParameterizedTestMethodSuite.
-        /// </summary>
-        /// <param name="method">The MethodInfo from which to construct the TestMethod</param>
-        /// <param name="parms">The ParameterSet to be used, or null</param>
-        /// <returns></returns>
-        public static NUnitTestMethod BuildSingleTestMethod(MethodInfo method, Test parentSuite, ParameterSet parms)
-        {
-            NUnitTestMethod testMethod = new NUnitTestMethod(method);
-
-            string prefix = method.ReflectedType.FullName;
-
-            if (parentSuite != null)
-            {
-                prefix = parentSuite.TestName.FullName;
-                testMethod.TestName.FullName = prefix + "." + testMethod.TestName.Name;
-            }
-
-            if (CheckTestMethodSignature(testMethod, parms))
-            {
-                if (parms == null)
-                    NUnitFramework.ApplyCommonAttributes(method, testMethod);
-                NUnitFramework.ApplyExpectedExceptionAttribute(method, testMethod);
-            }
-
-            if (parms != null)
-            {
-                // NOTE: After the call to CheckTestMethodSignature, the Method
-                // property of testMethod may no longer be the same as the
-                // original MethodInfo, so we reassign it here.
-                method = testMethod.Method;
-
-                if (parms.TestName != null)
-                {
-                    testMethod.TestName.Name = parms.TestName;
-                    testMethod.TestName.FullName = prefix + "." + parms.TestName;
-                }
-                else if (parms.OriginalArguments != null)
-                {
-                    string name = MethodHelper.GetDisplayName(method, parms.OriginalArguments);
-                    testMethod.TestName.Name = name;
-                    testMethod.TestName.FullName = prefix + "." + name;
-                }
-
-                if (parms.Ignored)
-                {
-                    testMethod.RunState = RunState.Ignored;
-                    testMethod.IgnoreReason = parms.IgnoreReason;
-                }
-                else if (parms.Explicit)
-                {
-                    testMethod.RunState = RunState.Explicit;
-                }
-
-                if (parms.ExpectedExceptionName != null)
-                    testMethod.exceptionProcessor = new ExpectedExceptionProcessor(testMethod, parms);
-
-                foreach (string key in parms.Properties.Keys)
-                    testMethod.Properties[key] = parms.Properties[key];
-
-                // Description is stored in parms.Properties
-                if (parms.Description != null)
-                    testMethod.Description = parms.Description;
-            }
-
-            //if (testMethod.BuilderException != null && testMethod.RunState != RunState.NotRunnable)
-            //{
-            //    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;
-        }
-		#endregion
-
-        #region Helper Methods
-        /// <summary>
-        /// Helper method that checks the signature of a TestMethod and
-        /// any supplied parameters to determine if the test is valid.
-        /// 
-        /// Currently, NUnitTestMethods are required to be public, 
-        /// non-abstract methods, either static or instance,
-        /// returning void. They may take arguments but the values must
-        /// be provided or the TestMethod is not considered runnable.
-        /// 
-        /// Methods not meeting these criteria will be marked as
-        /// non-runnable and the method will return false in that case.
-        /// </summary>
-        /// <param name="testMethod">The TestMethod to be checked. If it
-        /// is found to be non-runnable, it will be modified.</param>
-        /// <param name="parms">Parameters to be used for this test, or null</param>
-        /// <returns>True if the method signature is valid, false if not</returns>
-        private static bool CheckTestMethodSignature(TestMethod testMethod, ParameterSet parms)
-		{
-            if (testMethod.Method.IsAbstract)
-            {
-                testMethod.RunState = RunState.NotRunnable;
-                testMethod.IgnoreReason = "Method is abstract";
-                return false;
-            }
-
-            if (!testMethod.Method.IsPublic)
-            {
-                testMethod.RunState = RunState.NotRunnable;
-                testMethod.IgnoreReason = "Method is not public";
-                return false;
-            }
-
-            ParameterInfo[] parameters = testMethod.Method.GetParameters();
-            int argsNeeded = parameters.Length;
-
-            object[] arglist = null;
-            int argsProvided = 0;
-
-            if (parms != null)
-            {
-                testMethod.arguments = parms.Arguments;
-                testMethod.hasExpectedResult = parms.HasExpectedResult;
-                if (testMethod.hasExpectedResult)
-                    testMethod.expectedResult = parms.Result;
-                testMethod.RunState = parms.RunState;
-                testMethod.IgnoreReason = parms.IgnoreReason;
-                testMethod.BuilderException = parms.ProviderException;
-
-                arglist = parms.Arguments;
-
-                if (arglist != null)
-                    argsProvided = arglist.Length;
-
-                if (testMethod.RunState != RunState.Runnable)
-                    return false;
-            }
-
-            if (!testMethod.Method.ReturnType.Equals(typeof(void)) &&
-                (parms == null || !parms.HasExpectedResult && parms.ExpectedExceptionName == null))
-            {
-                testMethod.RunState = RunState.NotRunnable;
-                testMethod.IgnoreReason = "Method has non-void return value";
-                return false;
-            }
-
-            if (argsProvided > 0 && argsNeeded == 0)
-            {
-                testMethod.RunState = RunState.NotRunnable;
-                testMethod.IgnoreReason = "Arguments provided for method not taking any";
-                return false;
-            }
-
-            if (argsProvided == 0 && argsNeeded > 0)
-            {
-                testMethod.RunState = RunState.NotRunnable;
-                testMethod.IgnoreReason = "No arguments were provided";
-                return false;
-            }
-
-            //if (argsProvided > argsNeeded)
-            //{
-            //    ParameterInfo lastParameter = parameters[argsNeeded - 1];
-            //    Type lastParameterType = lastParameter.ParameterType;
-
-            //    if (lastParameterType.IsArray && lastParameter.IsDefined(typeof(ParamArrayAttribute), false))
-            //    {
-            //        object[] newArglist = new object[argsNeeded];
-            //        for (int i = 0; i < argsNeeded; i++)
-            //            newArglist[i] = arglist[i];
-
-            //        int length = argsProvided - argsNeeded + 1;
-            //        Array array = Array.CreateInstance(lastParameterType.GetElementType(), length);
-            //        for (int i = 0; i < length; i++)
-            //            array.SetValue(arglist[argsNeeded + i - 1], i);
-
-            //        newArglist[argsNeeded - 1] = array;
-            //        testMethod.arguments = arglist = newArglist;
-            //        argsProvided = argsNeeded;
-            //    }
-            //}
-
-            if (argsProvided != argsNeeded )
-            {
-                testMethod.RunState = RunState.NotRunnable;
-                testMethod.IgnoreReason = "Wrong number of arguments provided";
-                return false;
-            }
-
-#if CLR_2_0 || CLR_4_0
-            if (testMethod.Method.IsGenericMethodDefinition)
-            {
-                Type[] typeArguments = GetTypeArgumentsForMethod(testMethod.Method, arglist);
-                foreach (object o in typeArguments)
-                    if (o == null)
-                    {
-                        testMethod.RunState = RunState.NotRunnable;
-                        testMethod.IgnoreReason = "Unable to determine type arguments for fixture";
-                        return false;
-                    }
-
-                testMethod.method = testMethod.Method.MakeGenericMethod(typeArguments);
-                parameters = testMethod.Method.GetParameters();
-
-                for (int i = 0; i < parameters.Length; i++)
-                {
-                    if (arglist[i].GetType() != parameters[i].ParameterType && arglist[i] is IConvertible)
-                    {
-                        try
-                        {
-                            arglist[i] = Convert.ChangeType(arglist[i], parameters[i].ParameterType);
-                        }
-                        catch (Exception)
-                        {
-                            // Do nothing - the incompatible argument will be reported below
-                        }
-                    }
-                }
-            }
-#endif
-
-            return true;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        private static Type[] GetTypeArgumentsForMethod(MethodInfo method, object[] arglist)
-        {
-            Type[] typeParameters = method.GetGenericArguments();
-            Type[] typeArguments = new Type[typeParameters.Length];
-            ParameterInfo[] parameters = method.GetParameters();
-
-            for (int typeIndex = 0; typeIndex < typeArguments.Length; typeIndex++)
-            {
-                Type typeParameter = typeParameters[typeIndex];
-
-                for (int argIndex = 0; argIndex < parameters.Length; argIndex++)
-                {
-                    if (parameters[argIndex].ParameterType.Equals(typeParameter))
-                        typeArguments[typeIndex] = TypeHelper.BestCommonType(
-                            typeArguments[typeIndex],
-                            arglist[argIndex].GetType());
-                }
-            }
-
-            return typeArguments;
-        }
-#endif
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// Class to build ether a parameterized or a normal NUnitTestMethod.
+    /// There are four cases that the builder must deal with:
+    ///   1. The method needs no params and none are provided
+    ///   2. The method needs params and they are provided
+    ///   3. The method needs no params but they are provided in error
+    ///   4. The method needs params but they are not provided
+    /// This could have been done using two different builders, but it
+    /// turned out to be simpler to have just one. The BuildFrom method
+    /// takes a different branch depending on whether any parameters are
+    /// provided, but all four cases are dealt with in lower-level methods
+    /// </summary>
+    public class NUnitTestCaseBuilder : ITestCaseBuilder2
+	{
+        #region ITestCaseBuilder Methods
+        /// <summary>
+        /// Determines if the method can be used to build an NUnit test
+        /// test method of some kind. The method must normally be marked
+        /// with an identifying attriute for this to be true. If the test
+        /// config file sets AllowOldStyleTests to true, then any method beginning 
+        /// "test..." (case-insensitive) is treated as a test unless 
+        /// it is also marked as a setup or teardown method.
+        /// 
+        /// Note that this method does not check that the signature
+        /// of the method for validity. If we did that here, any
+        /// test methods with invalid signatures would be passed
+        /// over in silence in the test run. Since we want such
+        /// methods to be reported, the check for validity is made
+        /// in BuildFrom rather than here.
+        /// </summary>
+        /// <param name="method">A MethodInfo for the method being used as a test method</param>
+        /// <param name="suite">The test suite being built, to which the new test would be added</param>
+        /// <returns>True if the builder can create a test case from this method</returns>
+        public bool CanBuildFrom(MethodInfo method)
+        {
+            return Reflect.HasAttribute(method, NUnitFramework.TestAttribute, false)
+                || Reflect.HasAttribute(method, NUnitFramework.TestCaseAttribute, false)
+                || Reflect.HasAttribute(method, NUnitFramework.TestCaseSourceAttribute, false)
+                || Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, false);
+        }
+
+		/// <summary>
+        /// Build a Test from the provided MethodInfo. Depending on
+        /// whether the method takes arguments and on the availability
+        /// of test case data, this method may return a single test
+        /// or a group of tests contained in a ParameterizedMethodSuite.
+        /// </summary>
+        /// <param name="method">The MethodInfo for which a test is to be built</param>
+        /// <param name="suite">The test fixture being populated, or null</param>
+        /// <returns>A Test representing one or more method invocations</returns>
+        public Test BuildFrom(MethodInfo method)
+		{
+            return BuildFrom(method, null);
+        }
+
+        #region ITestCaseBuilder2 Members
+
+        public bool CanBuildFrom(MethodInfo method, Test parentSuite)
+        {
+            return CanBuildFrom(method);
+        }
+
+        public Test BuildFrom(MethodInfo method, Test parentSuite)
+        {
+            return CoreExtensions.Host.TestCaseProviders.HasTestCasesFor(method)
+                ? BuildParameterizedMethodSuite(method, parentSuite)
+                : BuildSingleTestMethod(method, parentSuite, null);
+        }
+
+        #endregion
+
+        /// <summary>
+        /// Builds a ParameterizedMetodSuite containing individual
+        /// test cases for each set of parameters provided for
+        /// this method.
+        /// </summary>
+        /// <param name="method">The MethodInfo for which a test is to be built</param>
+        /// <returns>A ParameterizedMethodSuite populated with test cases</returns>
+        public static Test BuildParameterizedMethodSuite(MethodInfo method, Test parentSuite)
+        {
+            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;
+
+                if (source == null)
+                {
+                    parms = new ParameterSet();
+                    parms.Arguments = new object[] { null };
+                }
+                else
+                    parms = source as ParameterSet;
+
+                if (parms == null)
+                {
+                    if (source.GetType().GetInterface("NUnit.Framework.ITestCaseData") != null)
+                        parms = ParameterSet.FromDataSource(source);
+                    else
+                    {
+                        parms = new ParameterSet();
+
+                        ParameterInfo[] parameters = method.GetParameters();
+                        Type sourceType = source.GetType();
+
+                        if (parameters.Length == 1 && parameters[0].ParameterType.IsAssignableFrom(sourceType))
+                            parms.Arguments = new object[] { source };
+                        else if (source is object[])
+                            parms.Arguments = (object[])source;
+                        else if (source is Array)
+                        {
+                            Array array = (Array)source;
+                            if (array.Rank == 1)
+                            {
+                                parms.Arguments = new object[array.Length];
+                                for (int i = 0; i < array.Length; i++)
+                                    parms.Arguments[i] = (object)array.GetValue(i);
+                            }
+                        }
+                        else
+                            parms.Arguments = new object[] { source };
+                    }
+                }
+
+                TestMethod test = BuildSingleTestMethod(method, parentSuite, parms);
+
+                methodSuite.Add(test);
+            }
+
+            return methodSuite;
+        }
+
+        /// <summary>
+        /// Builds a single NUnitTestMethod, either as a child of the fixture 
+        /// or as one of a set of test cases under a ParameterizedTestMethodSuite.
+        /// </summary>
+        /// <param name="method">The MethodInfo from which to construct the TestMethod</param>
+        /// <param name="parms">The ParameterSet to be used, or null</param>
+        /// <returns></returns>
+        public static NUnitTestMethod BuildSingleTestMethod(MethodInfo method, Test parentSuite, ParameterSet parms)
+        {
+#if CLR_2_0 || CLR_4_0
+            NUnitTestMethod testMethod = Reflect.IsAsyncMethod(method) ? 
+                new NUnitAsyncTestMethod(method) : new NUnitTestMethod(method);
+#else
+            NUnitTestMethod testMethod = new NUnitTestMethod(method);
+#endif
+
+            string prefix = method.ReflectedType.FullName;
+
+            if (parentSuite != null)
+            {
+                prefix = parentSuite.TestName.FullName;
+                testMethod.TestName.FullName = prefix + "." + testMethod.TestName.Name;
+            }
+
+            if (CheckTestMethodSignature(testMethod, parms))
+            {
+                if (parms == null)
+                    NUnitFramework.ApplyCommonAttributes(method, testMethod);
+                NUnitFramework.ApplyExpectedExceptionAttribute(method, testMethod);
+            }
+
+            if (parms != null)
+            {
+                // NOTE: After the call to CheckTestMethodSignature, the Method
+                // property of testMethod may no longer be the same as the
+                // original MethodInfo, so we reassign it here.
+                method = testMethod.Method;
+
+                if (parms.TestName != null)
+                {
+                    testMethod.TestName.Name = parms.TestName;
+                    testMethod.TestName.FullName = prefix + "." + parms.TestName;
+                }
+                else if (parms.OriginalArguments != null)
+                {
+                    string name = MethodHelper.GetDisplayName(method, parms.OriginalArguments);
+                    testMethod.TestName.Name = name;
+                    testMethod.TestName.FullName = prefix + "." + name;
+                }
+
+                if (parms.Ignored)
+                {
+                    testMethod.RunState = RunState.Ignored;
+                    testMethod.IgnoreReason = parms.IgnoreReason;
+                }
+                else if (parms.Explicit)
+                {
+                    testMethod.RunState = RunState.Explicit;
+                }
+
+                if (parms.ExpectedExceptionName != null)
+                    testMethod.exceptionProcessor = new ExpectedExceptionProcessor(testMethod, parms);
+
+                foreach (string key in parms.Properties.Keys)
+                    testMethod.Properties[key] = parms.Properties[key];
+
+                // Description is stored in parms.Properties
+                if (parms.Description != null)
+                    testMethod.Description = parms.Description;
+            }
+
+            //if (testMethod.BuilderException != null && testMethod.RunState != RunState.NotRunnable)
+            //{
+            //    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;
+        }
+		#endregion
+
+        #region Helper Methods
+        /// <summary>
+        /// Helper method that checks the signature of a TestMethod and
+        /// any supplied parameters to determine if the test is valid.
+        /// 
+        /// Currently, NUnitTestMethods are required to be public, 
+        /// non-abstract methods, either static or instance,
+        /// returning void. They may take arguments but the values must
+        /// be provided or the TestMethod is not considered runnable.
+        /// 
+        /// Methods not meeting these criteria will be marked as
+        /// non-runnable and the method will return false in that case.
+        /// </summary>
+        /// <param name="testMethod">The TestMethod to be checked. If it
+        /// is found to be non-runnable, it will be modified.</param>
+        /// <param name="parms">Parameters to be used for this test, or null</param>
+        /// <returns>True if the method signature is valid, false if not</returns>
+        private static bool CheckTestMethodSignature(TestMethod testMethod, ParameterSet parms)
+		{
+            if (testMethod.Method.IsAbstract)
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Method is abstract";
+                return false;
+            }
+
+            if (!testMethod.Method.IsPublic)
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Method is not public";
+                return false;
+            }
+
+            ParameterInfo[] parameters = testMethod.Method.GetParameters();
+            int argsNeeded = parameters.Length;
+
+            object[] arglist = null;
+            int argsProvided = 0;
+
+            if (parms != null)
+            {
+                testMethod.arguments = parms.Arguments;
+                testMethod.hasExpectedResult = parms.HasExpectedResult;
+                if (testMethod.hasExpectedResult)
+                    testMethod.expectedResult = parms.Result;
+                testMethod.RunState = parms.RunState;
+                testMethod.IgnoreReason = parms.IgnoreReason;
+                testMethod.BuilderException = parms.ProviderException;
+
+                arglist = parms.Arguments;
+
+                if (arglist != null)
+                    argsProvided = arglist.Length;
+
+                if (testMethod.RunState != RunState.Runnable)
+                    return false;
+            }
+
+			
+#if CLR_2_0 || CLR_4_0
+	        bool isAsyncMethod = Reflect.IsAsyncMethod(testMethod.Method);
+			bool hasMeaningfulReturnType = isAsyncMethod ? testMethod.Method.ReturnType.IsGenericType : testMethod.Method.ReturnType != typeof(void);
+#else
+			bool hasMeaningfulReturnType = testMethod.Method.ReturnType != typeof(void);
+#endif
+
+			if (hasMeaningfulReturnType && (parms == null || !parms.HasExpectedResult && parms.ExpectedExceptionName == null))
+		        return MarkAsNotRunnable(testMethod, "Test method has non-void return type, but no result is expected");
+			if (!hasMeaningfulReturnType && parms != null && parms.HasExpectedResult)
+				return MarkAsNotRunnable(testMethod, "Test method has void return type, but a result is expected");
+
+	        if (argsProvided > 0 && argsNeeded == 0)
+		        return MarkAsNotRunnable(testMethod, "Arguments provided for method not taking any");
+
+	        if (argsProvided == 0 && argsNeeded > 0)
+		        return MarkAsNotRunnable(testMethod, "No arguments were provided");
+
+	        //if (argsProvided > argsNeeded)
+            //{
+            //    ParameterInfo lastParameter = parameters[argsNeeded - 1];
+            //    Type lastParameterType = lastParameter.ParameterType;
+
+            //    if (lastParameterType.IsArray && lastParameter.IsDefined(typeof(ParamArrayAttribute), false))
+            //    {
+            //        object[] newArglist = new object[argsNeeded];
+            //        for (int i = 0; i < argsNeeded; i++)
+            //            newArglist[i] = arglist[i];
+
+            //        int length = argsProvided - argsNeeded + 1;
+            //        Array array = Array.CreateInstance(lastParameterType.GetElementType(), length);
+            //        for (int i = 0; i < length; i++)
+            //            array.SetValue(arglist[argsNeeded + i - 1], i);
+
+            //        newArglist[argsNeeded - 1] = array;
+            //        testMethod.arguments = arglist = newArglist;
+            //        argsProvided = argsNeeded;
+            //    }
+            //}
+
+            if (argsProvided != argsNeeded )
+            {
+                testMethod.RunState = RunState.NotRunnable;
+                testMethod.IgnoreReason = "Wrong number of arguments provided";
+                return false;
+            }
+
+#if CLR_2_0 || CLR_4_0
+            if (testMethod.Method.IsGenericMethodDefinition)
+            {
+                Type[] typeArguments = GetTypeArgumentsForMethod(testMethod.Method, arglist);
+                foreach (object o in typeArguments)
+                    if (o == null)
+                    {
+                        testMethod.RunState = RunState.NotRunnable;
+                        testMethod.IgnoreReason = "Unable to determine type arguments for fixture";
+                        return false;
+                    }
+
+                testMethod.method = testMethod.Method.MakeGenericMethod(typeArguments);
+                parameters = testMethod.Method.GetParameters();
+
+                for (int i = 0; i < parameters.Length; i++)
+                {
+                    if (arglist[i].GetType() != parameters[i].ParameterType && arglist[i] is IConvertible)
+                    {
+                        try
+                        {
+                            arglist[i] = Convert.ChangeType(arglist[i], parameters[i].ParameterType);
+                        }
+                        catch (Exception)
+                        {
+                            // Do nothing - the incompatible argument will be reported below
+                        }
+                    }
+                }
+            }
+#endif
+
+            return true;
+        }
+
+	    private static bool MarkAsNotRunnable(TestMethod testMethod, string reason)
+	    {
+		    testMethod.RunState = RunState.NotRunnable;
+		    testMethod.IgnoreReason = reason;
+		    return false;
+	    }
+
+#if CLR_2_0 || CLR_4_0
+        private static Type[] GetTypeArgumentsForMethod(MethodInfo method, object[] arglist)
+        {
+            Type[] typeParameters = method.GetGenericArguments();
+            Type[] typeArguments = new Type[typeParameters.Length];
+            ParameterInfo[] parameters = method.GetParameters();
+
+            for (int typeIndex = 0; typeIndex < typeArguments.Length; typeIndex++)
+            {
+                Type typeParameter = typeParameters[typeIndex];
+
+                for (int argIndex = 0; argIndex < parameters.Length; argIndex++)
+                {
+                    if (parameters[argIndex].ParameterType.Equals(typeParameter))
+                        typeArguments[typeIndex] = TypeHelper.BestCommonType(
+                            typeArguments[typeIndex],
+                            arglist[argIndex].GetType());
+                }
+            }
+
+            return typeArguments;
+        }
+#endif
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs b/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
index 923dac3..42c6db1 100644
--- a/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
+++ b/src/NUnitCore/core/Builders/NUnitTestFixtureBuilder.cs
@@ -1,307 +1,338 @@
-// ****************************************************************
-// 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.Reflection;
-using System.Text.RegularExpressions;
-using System.Text;
-
-namespace NUnit.Core.Builders
-{
-	/// <summary>
-	/// Built-in SuiteBuilder for NUnit TestFixture
-	/// </summary>
-	public class NUnitTestFixtureBuilder : Extensibility.ISuiteBuilder
-	{
-		#region Instance Fields
-		/// <summary>
-		/// The NUnitTestFixture being constructed;
-		/// </summary>
-		private NUnitTestFixture fixture;
-
-	    private Extensibility.ITestCaseBuilder2 testBuilders = CoreExtensions.Host.TestBuilders;
-
-	    private Extensibility.ITestDecorator testDecorators = CoreExtensions.Host.TestDecorators;
-
-		#endregion
-
-        #region ISuiteBuilder Methods
-        /// <summary>
-		/// Checks to see if the fixture type has the TestFixtureAttribute
-		/// </summary>
-		/// <param name="type">The fixture type to check</param>
-		/// <returns>True if the fixture can be built, false if not</returns>
-		public bool CanBuildFrom(Type type)
-		{
-            if (type.IsAbstract && !type.IsSealed)
-                return false;
-
-			return Reflect.HasAttribute( type, NUnitFramework.TestFixtureAttribute, true ) ||
-                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestAttribute, true) ||
-                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseAttribute, true) ||
-                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseSourceAttribute, true) ||
-                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TheoryAttribute, true);
-		}
-
-		/// <summary>
-		/// Build a TestSuite from type provided.
-		/// </summary>
-		/// <param name="type"></param>
-		/// <returns></returns>
-		public Test BuildFrom(Type type)
-		{
-            Attribute[] attrs = GetTestFixtureAttributes(type);
-
-#if CLR_2_0 || CLR_4_0
-            if (type.IsGenericType)
-                return BuildMultipleFixtures(type, attrs);
-#endif
-
-            switch (attrs.Length)
-            {
-                case 0:
-                    return BuildSingleFixture(type, null);
-                case 1:
-                    object[] args = (object[])Reflect.GetPropertyValue(attrs[0], "Arguments");
-                    return args == null || args.Length == 0
-                        ? BuildSingleFixture(type, attrs[0])
-                        : BuildMultipleFixtures(type, attrs);
-                default:
-                    return BuildMultipleFixtures(type, attrs);
-            }
-        }
-
-		#endregion
-
-		#region Helper Methods
-
-        private Test BuildMultipleFixtures(Type type, Attribute[] attrs)
-        {
-            TestSuite suite = new ParameterizedFixtureSuite(type);
-
-            if (attrs.Length > 0)
-            {
-                foreach (Attribute attr in attrs)
-                    suite.Add(BuildSingleFixture(type, attr));
-            }
-            else
-            {
-                suite.RunState = RunState.NotRunnable;
-                suite.IgnoreReason = "Generic fixture has no type arguments provided";
-            }
-
-            return suite;
-        }
-
-        private Test BuildSingleFixture(Type type, Attribute attr)
-        {
-            object[] arguments = null;
-            IList categories = null;
-
-            if (attr != null)
-            {
-                arguments = (object[])Reflect.GetPropertyValue(attr, "Arguments");
-
-                categories = Reflect.GetPropertyValue(attr, "Categories") as IList;
-#if CLR_2_0 || CLR_4_0
-                if (type.ContainsGenericParameters)
-                {
-                    Type[] typeArgs = (Type[])Reflect.GetPropertyValue(attr, "TypeArgs");
-                    if( typeArgs.Length > 0 || 
-                        TypeHelper.CanDeduceTypeArgsFromArgs(type, arguments, ref typeArgs))
-                    {
-                        type = TypeHelper.MakeGenericType(type, typeArgs);
-                    }
-                }
-#endif
-            }
-
-            this.fixture = new NUnitTestFixture(type, arguments);
-            CheckTestFixtureIsValid(fixture);
-
-            NUnitFramework.ApplyCommonAttributes(type, fixture);
-
-            if (categories != null)
-                foreach (string category in categories)
-                    fixture.Categories.Add(category);
-
-            if (fixture.RunState == RunState.Runnable && attr != null)
-            {
-                object objIgnore = Reflect.GetPropertyValue(attr, "Ignore");
-                if (objIgnore != null && (bool)objIgnore == true)
-                {
-                    fixture.RunState = RunState.Ignored;
-                    fixture.IgnoreReason = (string)Reflect.GetPropertyValue(attr, "IgnoreReason");
-                }
-            }
-
-            AddTestCases(type);
-
-            return this.fixture;
-        }
-
-        /// <summary>
-		/// Method to add test cases to the newly constructed fixture.
-		/// The default implementation looks at each candidate method
-		/// and tries to build a test case from it. It will only need
-		/// to be overridden if some other approach, such as reading a 
-		/// datafile is used to generate test cases.
-		/// </summary>
-		/// <param name="fixtureType"></param>
-		protected virtual void AddTestCases( Type fixtureType )
-		{
-			IList methods = fixtureType.GetMethods( 
-				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
-
-			foreach(MethodInfo method in methods)
-			{
-				Test test = BuildTestCase(method, this.fixture);
-
-				if(test != null)
-				{
-					this.fixture.Add( test );
-				}
-			}
-		}
-
-		/// <summary>
-		/// Method to create a test case from a MethodInfo and add
-		/// it to the fixture being built. It first checks to see if
-		/// any global TestCaseBuilder addin wants to build the
-		/// test case. If not, it uses the internal builder
-		/// collection maintained by this fixture builder. After
-		/// building the test case, it applies any decorators
-		/// that have been installed.
-		/// 
-		/// The default implementation has no test case builders.
-		/// Derived classes should add builders to the collection
-		/// in their constructor.
-		/// </summary>
-		/// <param name="method"></param>
-		/// <returns></returns>
-		private Test BuildTestCase( MethodInfo method, TestSuite suite )
-		{
-            Test test = testBuilders.BuildFrom( method, suite );
-
-			if ( test != null )
-				test = testDecorators.Decorate( test, method );
-
-			return test;
-		}
-
-        private void CheckTestFixtureIsValid(TestFixture fixture)
-        {
-            Type fixtureType = fixture.FixtureType;
-
-            string reason = null;
-            if (!IsValidFixtureType(fixtureType, ref reason))
-            {
-                fixture.RunState = RunState.NotRunnable;
-                fixture.IgnoreReason = reason;
-            }
-            else if( !IsStaticClass( fixtureType ) )
-            {
-                // Postpone checking for constructor with arguments till we invoke it
-                // since Type.GetConstructor doesn't handle null arguments well.
-                if ( fixture.arguments == null || fixture.arguments.Length == 0 )
-                    if (Reflect.GetConstructor(fixtureType) == null)
-                    {
-                        fixture.RunState = RunState.NotRunnable;
-                        fixture.IgnoreReason = "No suitable constructor was found";
-                    }
-            }
-        }
-
-        private static bool IsStaticClass(Type type)
-        {
-            return type.IsAbstract && type.IsSealed;
-        }
-
-		/// <summary>
-        /// Check that the fixture type is valid. This method ensures that 
-        /// the type is not abstract and that there is no more than one of 
-        /// each setup or teardown method and that their signatures are correct.
-        /// </summary>
-        /// <param name="fixtureType">The type of the fixture to check</param>
-        /// <param name="reason">A message indicating why the fixture is invalid</param>
-        /// <returns>True if the fixture is valid, false if not</returns>
-        private bool IsValidFixtureType(Type fixtureType, ref string reason)
-        {
-            //if (fixtureType.IsAbstract && !fixtureType.IsSealed)
-            //{
-            //    reason = string.Format("{0} is an abstract class", fixtureType.FullName);
-            //    return false;
-            //}
-
-#if CLR_2_0 || CLR_4_0
-            if ( fixtureType.ContainsGenericParameters )
-            {
-                reason = "Fixture type contains generic parameters. You must either provide "
-                        + "Type arguments or specify constructor arguments that allow NUnit "
-                        + "to deduce the Type arguments.";
-                return false;
-            }
-#endif
-
-            return NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.SetUpAttribute, ref reason)
-                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.TearDownAttribute, ref reason)
-                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.FixtureSetUpAttribute, ref reason)
-                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.FixtureTearDownAttribute, ref reason);
-        }
-
-        /// <summary>
-        /// Get TestFixtureAttributes following a somewhat obscure
-        /// set of rules to eliminate spurious duplication of fixtures.
-        /// 1. If there are any attributes with args, they are the only
-        ///    ones returned and those without args are ignored.
-        /// 2. No more than one attribute without args is ever returned.
-        /// </summary>
-        private static Attribute[] GetTestFixtureAttributes(Type type)
-        {
-            Attribute[] attrs = Reflect.GetAttributes(type, NUnitFramework.TestFixtureAttribute, true);
-            
-            // Just return - no possibility of duplication
-            if (attrs.Length <= 1) 
-                return attrs;
-
-            int withArgs = 0;
-            bool[] hasArgs = new bool[attrs.Length];
-
-            // Count and record those attrs with arguments            
-            for (int i = 0; i < attrs.Length; i++)
-            {
-                object[] args = (object[])Reflect.GetPropertyValue(attrs[i], "Arguments");
-                object[] typeArgs = (object[])Reflect.GetPropertyValue(attrs[i], "TypeArgs");
-
-                if (args.Length > 0 || typeArgs != null && typeArgs.Length > 0)
-                {
-                    withArgs++;
-                    hasArgs[i] = true;
-                }
-            }
-
-            // If all attributes have args, just return them
-            if (withArgs == attrs.Length)
-                return attrs;
-
-            // If all attributes are without args, just return the first found
-            if (withArgs == 0)
-                return new Attribute[] { attrs[0] };
-
-            // Some of each type, so extract those with args
-            int count = 0;
-            Attribute[] result = new Attribute[withArgs];
-            for (int i = 0; i < attrs.Length; i++)
-                if (hasArgs[i])
-                    result[count++] = attrs[i];
-
-            return result;
-        }
-        
-        #endregion
-	}
+// ****************************************************************
+// 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.Reflection;
+using System.Text.RegularExpressions;
+using System.Text;
+
+namespace NUnit.Core.Builders
+{
+	/// <summary>
+	/// Built-in SuiteBuilder for NUnit TestFixture
+	/// </summary>
+	public class NUnitTestFixtureBuilder : Extensibility.ISuiteBuilder
+	{
+		#region Instance Fields
+		/// <summary>
+		/// The NUnitTestFixture being constructed;
+		/// </summary>
+		private NUnitTestFixture fixture;
+
+	    private Extensibility.ITestCaseBuilder2 testBuilders = CoreExtensions.Host.TestBuilders;
+
+	    private Extensibility.ITestDecorator testDecorators = CoreExtensions.Host.TestDecorators;
+
+		#endregion
+
+        #region ISuiteBuilder Methods
+        /// <summary>
+		/// Checks to see if the fixture type has the TestFixtureAttribute
+		/// </summary>
+		/// <param name="type">The fixture type to check</param>
+		/// <returns>True if the fixture can be built, false if not</returns>
+		public bool CanBuildFrom(Type type)
+		{
+            if (type.IsAbstract && !type.IsSealed)
+                return false;
+
+			return Reflect.HasAttribute( type, NUnitFramework.TestFixtureAttribute, true ) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestAttribute, true) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseAttribute, true) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TestCaseSourceAttribute, true) ||
+                   Reflect.HasMethodWithAttribute(type, NUnitFramework.TheoryAttribute, true);
+		}
+
+		/// <summary>
+		/// Build a TestSuite from type provided.
+		/// </summary>
+		/// <param name="type"></param>
+		/// <returns></returns>
+		public Test BuildFrom(Type type)
+		{
+            Attribute[] attrs = GetTestFixtureAttributes(type);
+
+#if CLR_2_0 || CLR_4_0
+            if (type.IsGenericType)
+                return BuildMultipleFixtures(type, attrs);
+#endif
+
+            switch (attrs.Length)
+            {
+                case 0:
+                    return BuildSingleFixture(type, null);
+                case 1:
+                    object[] args = GetArgsFromAttribute(attrs[0]);
+                    return args == null || args.Length == 0
+                        ? BuildSingleFixture(type, attrs[0])
+                        : BuildMultipleFixtures(type, attrs);
+                default:
+                    return BuildMultipleFixtures(type, attrs);
+            }
+        }
+
+		#endregion
+
+		#region Helper Methods
+
+        private Test BuildMultipleFixtures(Type type, Attribute[] attrs)
+        {
+            TestSuite suite = new ParameterizedFixtureSuite(type);
+
+            if (attrs.Length > 0)
+            {
+                foreach (Attribute attr in attrs)
+                    suite.Add(BuildSingleFixture(type, attr));
+            }
+            else
+            {
+                suite.RunState = RunState.NotRunnable;
+                suite.IgnoreReason = "Generic fixture has no type arguments provided";
+            }
+
+            return suite;
+        }
+
+        private Test BuildSingleFixture(Type type, Attribute attr)
+        {
+            object[] arguments = null;
+            IList categories = null;
+
+            if (attr != null)
+            {
+                arguments = GetArgsFromAttribute(attr);
+
+                categories = Reflect.GetPropertyValue(attr, "Categories") as IList;
+#if CLR_2_0 || CLR_4_0
+                if (type.ContainsGenericParameters)
+                {
+                    Type[] typeArgs = GetTypeArgsFromAttribute(attr);
+                    if (typeArgs == null)
+                    {
+                        int cnt = 0;
+                        foreach (object o in arguments)
+                            if (o is Type) cnt++;
+                            else break;
+
+                        typeArgs = new Type[cnt];
+                        for (int i = 0; i < cnt; i++)
+                            typeArgs[i] = (Type)arguments[i];
+
+                        if (cnt > 0)
+                        {
+                            object[] args = new object[arguments.Length - cnt];
+                            for (int i = 0; i < args.Length; i++)
+                                args[i] = arguments[cnt + i];
+
+                            arguments = args;
+                        }
+                    }
+
+                    if (typeArgs.Length > 0 || 
+                        TypeHelper.CanDeduceTypeArgsFromArgs(type, arguments, ref typeArgs))
+                    {
+                        type = TypeHelper.MakeGenericType(type, typeArgs);
+                    }
+                }
+#endif
+            }
+
+            this.fixture = new NUnitTestFixture(type, arguments);
+            CheckTestFixtureIsValid(fixture);
+
+            NUnitFramework.ApplyCommonAttributes(type, fixture);
+
+            if (categories != null)
+                foreach (string category in categories)
+                    fixture.Categories.Add(category);
+
+            if (fixture.RunState == RunState.Runnable && attr != null)
+            {
+                object objIgnore = Reflect.GetPropertyValue(attr, "Ignore");
+                if (objIgnore != null && (bool)objIgnore == true)
+                {
+                    fixture.RunState = RunState.Ignored;
+                    fixture.IgnoreReason = (string)Reflect.GetPropertyValue(attr, "IgnoreReason");
+                }
+            }
+
+            AddTestCases(type);
+
+            return this.fixture;
+        }
+
+        /// <summary>
+		/// Method to add test cases to the newly constructed fixture.
+		/// The default implementation looks at each candidate method
+		/// and tries to build a test case from it. It will only need
+		/// to be overridden if some other approach, such as reading a 
+		/// datafile is used to generate test cases.
+		/// </summary>
+		/// <param name="fixtureType"></param>
+		protected virtual void AddTestCases( Type fixtureType )
+		{
+			IList methods = fixtureType.GetMethods( 
+				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
+
+			foreach(MethodInfo method in methods)
+			{
+				Test test = BuildTestCase(method, this.fixture);
+
+				if(test != null)
+				{
+					this.fixture.Add( test );
+				}
+			}
+		}
+
+		/// <summary>
+		/// Method to create a test case from a MethodInfo and add
+		/// it to the fixture being built. It first checks to see if
+		/// any global TestCaseBuilder addin wants to build the
+		/// test case. If not, it uses the internal builder
+		/// collection maintained by this fixture builder. After
+		/// building the test case, it applies any decorators
+		/// that have been installed.
+		/// 
+		/// The default implementation has no test case builders.
+		/// Derived classes should add builders to the collection
+		/// in their constructor.
+		/// </summary>
+		/// <param name="method"></param>
+		/// <returns></returns>
+		private Test BuildTestCase( MethodInfo method, TestSuite suite )
+		{
+            Test test = testBuilders.BuildFrom( method, suite );
+
+			if ( test != null )
+				test = testDecorators.Decorate( test, method );
+
+			return test;
+		}
+
+        private void CheckTestFixtureIsValid(TestFixture fixture)
+        {
+            Type fixtureType = fixture.FixtureType;
+
+            string reason = null;
+            if (!IsValidFixtureType(fixtureType, ref reason))
+            {
+                fixture.RunState = RunState.NotRunnable;
+                fixture.IgnoreReason = reason;
+            }
+            else if( !IsStaticClass( fixtureType ) )
+            {
+                // Postpone checking for constructor with arguments till we invoke it
+                // since Type.GetConstructor doesn't handle null arguments well.
+                if ( fixture.arguments == null || fixture.arguments.Length == 0 )
+                    if (Reflect.GetConstructor(fixtureType) == null)
+                    {
+                        fixture.RunState = RunState.NotRunnable;
+                        fixture.IgnoreReason = "No suitable constructor was found";
+                    }
+            }
+        }
+
+        private static bool IsStaticClass(Type type)
+        {
+            return type.IsAbstract && type.IsSealed;
+        }
+
+		/// <summary>
+        /// Check that the fixture type is valid. This method ensures that 
+        /// the type is not abstract and that there is no more than one of 
+        /// each setup or teardown method and that their signatures are correct.
+        /// </summary>
+        /// <param name="fixtureType">The type of the fixture to check</param>
+        /// <param name="reason">A message indicating why the fixture is invalid</param>
+        /// <returns>True if the fixture is valid, false if not</returns>
+        private bool IsValidFixtureType(Type fixtureType, ref string reason)
+        {
+            //if (fixtureType.IsAbstract && !fixtureType.IsSealed)
+            //{
+            //    reason = string.Format("{0} is an abstract class", fixtureType.FullName);
+            //    return false;
+            //}
+
+#if CLR_2_0 || CLR_4_0
+            if ( fixtureType.ContainsGenericParameters )
+            {
+                reason = "Fixture type contains generic parameters. You must either provide "
+                        + "Type arguments or specify constructor arguments that allow NUnit "
+                        + "to deduce the Type arguments.";
+                return false;
+            }
+#endif
+
+            return NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.SetUpAttribute, ref reason)
+                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.TearDownAttribute, ref reason)
+                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.FixtureSetUpAttribute, ref reason)
+                && NUnitFramework.CheckSetUpTearDownMethods(fixtureType, NUnitFramework.FixtureTearDownAttribute, ref reason);
+        }
+
+        /// <summary>
+        /// Get TestFixtureAttributes following a somewhat obscure
+        /// set of rules to eliminate spurious duplication of fixtures.
+        /// 1. If there are any attributes with args, they are the only
+        ///    ones returned and those without args are ignored.
+        /// 2. No more than one attribute without args is ever returned.
+        /// </summary>
+        private static Attribute[] GetTestFixtureAttributes(Type type)
+        {
+            Attribute[] attrs = Reflect.GetAttributes(type, NUnitFramework.TestFixtureAttribute, true);
+            
+            // Just return - no possibility of duplication
+            if (attrs.Length <= 1) 
+                return attrs;
+
+            int withArgs = 0;
+            bool[] hasArgs = new bool[attrs.Length];
+
+            // Count and record those attrs with arguments            
+            for (int i = 0; i < attrs.Length; i++)
+            {
+                object[] args = GetArgsFromAttribute(attrs[i]);
+                object[] typeArgs = GetTypeArgsFromAttribute(attrs[i]);
+
+                if (args.Length > 0 || typeArgs != null && typeArgs.Length > 0)
+                {
+                    withArgs++;
+                    hasArgs[i] = true;
+                }
+            }
+
+            // If all attributes have args, just return them
+            if (withArgs == attrs.Length)
+                return attrs;
+
+            // If all attributes are without args, just return the first found
+            if (withArgs == 0)
+                return new Attribute[] { attrs[0] };
+
+            // Some of each type, so extract those with args
+            int count = 0;
+            Attribute[] result = new Attribute[withArgs];
+            for (int i = 0; i < attrs.Length; i++)
+                if (hasArgs[i])
+                    result[count++] = attrs[i];
+
+            return result;
+        }
+
+        private static object[] GetArgsFromAttribute(Attribute attr)
+        {
+            return (object[])Reflect.GetPropertyValue(attr, "Arguments");
+        }
+
+        private static Type[] GetTypeArgsFromAttribute(Attribute attr)
+        {
+            return (Type[])Reflect.GetPropertyValue(attr, "TypeArgs");
+        }
+
+        #endregion
+	}
 }
\ No newline at end of file
diff --git a/src/NUnitCore/core/Builders/PairwiseStrategy.cs b/src/NUnitCore/core/Builders/PairwiseStrategy.cs
index ef01e71..68cd598 100644
--- a/src/NUnitCore/core/Builders/PairwiseStrategy.cs
+++ b/src/NUnitCore/core/Builders/PairwiseStrategy.cs
@@ -1,695 +1,695 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-using System.Reflection;
-using System.Text;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-	public class PairwiseStrategy : CombiningStrategy
-	{
-		internal class FleaRand
-		{
-			private const int FleaRandSize = 256;
-
-			private uint b;
-			private uint c;
-			private uint d;
-			private uint z;
-
-			private uint[] m = new uint[FleaRandSize];
-			private uint[] r = new uint[FleaRandSize];
-
-			private uint q;
-
-			public FleaRand(uint seed)
-			{
-				this.b = seed;
-				this.c = seed;
-				this.d = seed;
-				this.z = seed;
-
-				for (int i = 0; i < this.m.Length; i++)
-				{
-					this.m[i] = seed;
-				}
-
-				for (int i = 0; i < 10; i++)
-				{
-					this.Batch();
-				}
-
-				this.q = 0;
-			}
-
-			public uint Next()
-			{
-				if (this.q == 0)
-				{
-					this.Batch();
-					this.q = (uint)this.r.Length - 1;
-				}
-				else
-				{
-					this.q--;
-				}
-
-				return this.r[this.q];
-			}
-
-			private void Batch()
-			{
-				uint a;
-				uint b = this.b;
-				uint c = this.c + (++this.z);
-				uint d = this.d;
-
-				for (int i = 0; i < this.r.Length; i++)
-				{
-					a = this.m[b % this.m.Length];
-					this.m[b % this.m.Length] = d;
-					d = (c << 19) + (c >> 13) + b;
-					c = b ^ this.m[i];
-					b = a + d;
-					this.r[i] = c;
-				}
-
-				this.b = b;
-				this.c = c;
-				this.d = d;
-			}
-		}
-
-		internal class FeatureInfo
-		{
-			public const string Names = "abcdefghijklmnopqrstuvwxyz";
-
-			public readonly int Dimension;
-			public readonly int Feature;
-
-			public FeatureInfo(int dimension, int feature)
-			{
-				this.Dimension = dimension;
-				this.Feature = feature;
-			}
-
-#if DEBUG
-			public override string ToString()
-			{
-				return (this.Dimension + 1).ToString() + FeatureInfo.Names[this.Feature];
-			}
-#endif
-		}
-
-		internal class Tuple
-		{
-			private readonly ArrayList features = new ArrayList();
-
-			public int Count
-			{
-				get
-				{
-					return this.features.Count;
-				}
-			}
-
-			public FeatureInfo this[int index]
-			{
-				get
-				{
-					return (FeatureInfo)this.features[index];
-				}
-			}
-
-			public void Add(FeatureInfo feature)
-			{
-				this.features.Add(feature);
-			}
-
-#if DEBUG
-			public override string ToString()
-			{
-				StringBuilder sb = new StringBuilder();
-
-				sb.Append('(');
-
-				for (int i = 0; i < this.features.Count; i++)
-				{
-					if (i > 0)
-					{
-						sb.Append(' ');
-					}
-
-					sb.Append(this.features[i].ToString());
-				}
-
-				sb.Append(')');
-
-				return sb.ToString();
-			}
-#endif
-		}
-
-		internal class TupleCollection
-		{
-			private readonly ArrayList tuples = new ArrayList();
-
-			public int Count
-			{
-				get
-				{
-					return this.tuples.Count;
-				}
-			}
-
-			public Tuple this[int index]
-			{
-				get
-				{
-					return (Tuple)this.tuples[index];
-				}
-			}
-
-			public void Add(Tuple tuple)
-			{
-				this.tuples.Add(tuple);
-			}
-
-			public void RemoveAt(int index)
-			{
-				this.tuples.RemoveAt(index);
-			}
-		}
-
-		internal class TestCase
-		{
-			public readonly int[] Features;
-
-			public TestCase(int numberOfDimensions)
-			{
-				this.Features = new int[numberOfDimensions];
-			}
-
-			public bool IsTupleCovered(Tuple tuple)
-			{
-				for (int i = 0; i < tuple.Count; i++)
-				{
-					if (this.Features[tuple[i].Dimension] != tuple[i].Feature)
-					{
-						return false;
-					}
-				}
-
-				return true;
-			}
-
-#if DEBUG
-			public override string ToString()
-			{
-				StringBuilder sb = new StringBuilder();
-
-				for (int i = 0; i < this.Features.Length; i++)
-				{
-					if (i > 0)
-					{
-						sb.Append(' ');
-					}
-
-					sb.Append(i + 1);
-					sb.Append(FeatureInfo.Names[this.Features[i]]);
-				}
-
-				return sb.ToString();
-			}
-#endif
-		}
-
-		internal class TestCaseCollection : IEnumerable
-		{
-			private readonly ArrayList testCases = new ArrayList();
-
-			public void Add(TestCase testCase)
-			{
-				this.testCases.Add(testCase);
-			}
-
-			public IEnumerator GetEnumerator()
-			{
-				return this.testCases.GetEnumerator();
-			}
-
-			public bool IsTupleCovered(Tuple tuple)
-			{
-				foreach (TestCase testCase in this.testCases)
-				{
-					if (testCase.IsTupleCovered(tuple))
-					{
-						return true;
-					}
-				}
-
-				return false;
-			}
-		}
-
-		internal class PairwiseTestCaseGenerator
-		{
-			private const int MaxTupleLength = 2;
-
-			private readonly FleaRand random = new FleaRand(0);
-
-			private readonly int[] dimensions;
-
-			private readonly TupleCollection[][] uncoveredTuples;
-
-			private readonly int[][] currentTupleLength;
-
-			private readonly TestCaseCollection testCases = new TestCaseCollection();
-
-			public PairwiseTestCaseGenerator(int[] dimensions)
-			{
-				this.dimensions = dimensions;
-
-				this.uncoveredTuples = new TupleCollection[this.dimensions.Length][];
-
-				for (int d = 0; d < this.uncoveredTuples.Length; d++)
-				{
-					this.uncoveredTuples[d] = new TupleCollection[this.dimensions[d]];
-
-					for (int f = 0; f < this.dimensions[d]; f++)
-					{
-						this.uncoveredTuples[d][f] = new TupleCollection();
-					}
-				}
-
-				this.currentTupleLength = new int[this.dimensions.Length][];
-
-				for (int d = 0; d < this.dimensions.Length; d++)
-				{
-					this.currentTupleLength[d] = new int[this.dimensions[d]];
-				}
-			}
-
-			public IEnumerable GetTestCases()
-			{
-				this.CreateTestCases();
-
-				this.SelfTest();
-
-				return this.testCases;
-			}
-
-			private void CreateTestCases()
-			{
-				while (true)
-				{
-					this.ExtendTupleSet();
-
-					Tuple tuple = this.FindTupleToCover();
-
-					if (tuple == null)
-					{
-						return;
-					}
-
-					TestCase testCase = this.FindGoodTestCase(tuple);
-
-					this.RemoveTuplesCoveredBy(testCase);
-
-					this.testCases.Add(testCase);
-				}
-			}
-
-			private void ExtendTupleSet()
-			{
-				for (int d = 0; d < this.dimensions.Length; d++)
-				{
-					for (int f = 0; f < this.dimensions[d]; f++)
-					{
-						this.ExtendTupleSet(d, f);
-					}
-				}
-			}
-
-			private void ExtendTupleSet(int dimension, int feature)
-			{
-				// If tuples for [dimension][feature] already exists, it's no needs to add more tuples.
-				if (this.uncoveredTuples[dimension][feature].Count > 0)
-				{
-					return;
-				}
-
-				// If maximum tuple length for [dimension][feature] is reached, it's no needs to add more tuples.
-				if (this.currentTupleLength[dimension][feature] == MaxTupleLength)
-				{
-					return;
-				}
-
-				this.currentTupleLength[dimension][feature]++;
-
-				int tupleLength = this.currentTupleLength[dimension][feature];
-
-				if (tupleLength == 1)
-				{
-					Tuple tuple = new Tuple();
-
-					tuple.Add(new FeatureInfo(dimension, feature));
-
-					if (this.testCases.IsTupleCovered(tuple))
-					{
-						return;
-					}
-
-					this.uncoveredTuples[dimension][feature].Add(tuple);
-				}
-				else
-				{
-					for (int d = 0; d < this.dimensions.Length; d++)
-					{
-						for (int f = 0; f < this.dimensions[d]; f++)
-						{
-							Tuple tuple = new Tuple();
-							tuple.Add(new FeatureInfo(d, f));
-
-							if (tuple[0].Dimension == dimension)
-							{
-								continue;
-							}
-
-							tuple.Add(new FeatureInfo(dimension, feature));
-
-							if (this.testCases.IsTupleCovered(tuple))
-							{
-								continue;
-							}
-
-							this.uncoveredTuples[dimension][feature].Add(tuple);
-						}
-					}
-				}
-			}
-
-			private Tuple FindTupleToCover()
-			{
-				int tupleLength = MaxTupleLength;
-				int tupleCount = 0;
-				Tuple tuple = null;
-
-				for (int d = 0; d < this.dimensions.Length; d++)
-				{
-					for (int f = 0; f < this.dimensions[d]; f++)
-					{
-						if (this.currentTupleLength[d][f] < tupleLength)
-						{
-							tupleLength = this.currentTupleLength[d][f];
-							tupleCount = this.uncoveredTuples[d][f].Count;
-							tuple = this.uncoveredTuples[d][f][0];
-						}
-						else
-						{
-							if (this.currentTupleLength[d][f] == tupleLength && this.uncoveredTuples[d][f].Count > tupleCount)
-							{
-								tupleCount = this.uncoveredTuples[d][f].Count;
-								tuple = this.uncoveredTuples[d][f][0];
-							}
-						}
-					}
-				}
-
-				return tuple;
-			}
-
-			private TestCase FindGoodTestCase(Tuple tuple)
-			{
-				TestCase bestTest = null;
-				int bestCoverage = -1;
-
-				for (int i = 0; i < 5; i++)
-				{
-					TestCase test = new TestCase(this.dimensions.Length);
-
-					int coverage = this.CreateTestCase(tuple, test);
-
-					if (coverage > bestCoverage)
-					{
-						bestTest = test;
-						bestCoverage = coverage;
-					}
-				}
-
-				return bestTest;
-			}
-
-			private int CreateTestCase(Tuple tuple, TestCase test)
-			{
-				// Create a random test case...
-				for (int i = 0; i < test.Features.Length; i++)
-				{
-					test.Features[i] = (int)(this.random.Next() % this.dimensions[i]);
-				}
-
-				// ...and inject the tuple into it!
-				for (int i = 0; i < tuple.Count; i++)
-				{
-					test.Features[tuple[i].Dimension] = tuple[i].Feature;
-				}
-
-				return this.MaximizeCoverage(test, tuple);
-			}
-
-			private int MaximizeCoverage(TestCase test, Tuple tuple)
-			{
-				int[] dimensionOrder = this.GetMutableDimensions(tuple);
-
-				while (true)
-				{
-					bool progress = false;
-					int totalCoverage = 1;
-
-					// Scramble dimensions.
-					for (int i = dimensionOrder.Length; i > 1; i--)
-					{
-						int j = (int)(this.random.Next() % i);
-						int t = dimensionOrder[i - 1];
-						dimensionOrder[i - 1] = dimensionOrder[j];
-						dimensionOrder[j] = t;
-					}
-
-					// For each dimension that can be modified...
-					for (int i = 0; i < dimensionOrder.Length; i++)
-					{
-						int d = dimensionOrder[i];
-
-						ArrayList bestFeatures = new ArrayList();
-
-						int bestCoverage = this.CountTuplesCovered(test, d, test.Features[d]);
-
-						int bestTupleLength = this.currentTupleLength[d][test.Features[d]];
-
-						// For each feature that can be modified, check if it can extend coverage.
-						for (int f = 0; f < this.dimensions[d]; f++)
-						{
-							test.Features[d] = f;
-
-							int coverage = this.CountTuplesCovered(test, d, f);
-
-							if (this.currentTupleLength[d][f] < bestTupleLength)
-							{
-								progress = true;
-								bestTupleLength = this.currentTupleLength[d][f];
-								bestCoverage = coverage;
-								bestFeatures.Clear();
-								bestFeatures.Add(f);
-							}
-							else
-							{
-								if (this.currentTupleLength[d][f] == bestTupleLength && coverage >= bestCoverage)
-								{
-									if (coverage > bestCoverage)
-									{
-										progress = true;
-										bestCoverage = coverage;
-										bestFeatures.Clear();
-									}
-
-									bestFeatures.Add(f);
-								}
-							}
-						}
-
-						if (bestFeatures.Count == 1)
-						{
-							test.Features[d] = (int)bestFeatures[0];
-						}
-						else
-						{
-							test.Features[d] = (int)bestFeatures[(int)(this.random.Next() % bestFeatures.Count)];
-						}
-
-						totalCoverage += bestCoverage;
-					}
-
-					if (!progress)
-					{
-						return totalCoverage;
-					}
-				}
-			}
-
-			private int[] GetMutableDimensions(Tuple tuple)
-			{
-				bool[] immutableDimensions = new bool[this.dimensions.Length];
-
-				for (int i = 0; i < tuple.Count; i++)
-				{
-					immutableDimensions[tuple[i].Dimension] = true;
-				}
-
-				ArrayList mutableDimensions = new ArrayList();
-
-				for (int i = 0; i < this.dimensions.Length; i++)
-				{
-					if (!immutableDimensions[i])
-					{
-						mutableDimensions.Add(i);
-					}
-				}
-
-				return (int[])mutableDimensions.ToArray(typeof(int));
-			}
-
-			private int CountTuplesCovered(TestCase test, int dimension, int feature)
-			{
-				int tuplesCovered = 0;
-
-				TupleCollection tuples = this.uncoveredTuples[dimension][feature];
-
-				for (int i = 0; i < tuples.Count; i++)
-				{
-					if (test.IsTupleCovered(tuples[i]))
-					{
-						tuplesCovered++;
-					}
-				}
-
-				return tuplesCovered;
-			}
-
-			private void RemoveTuplesCoveredBy(TestCase testCase)
-			{
-				for (int d = 0; d < this.uncoveredTuples.Length; d++)
-				{
-					for (int f = 0; f < this.uncoveredTuples[d].Length; f++)
-					{
-						TupleCollection tuples = this.uncoveredTuples[d][f];
-
-						for (int i = tuples.Count - 1; i >= 0; i--)
-						{
-							if (testCase.IsTupleCovered(tuples[i]))
-							{
-								tuples.RemoveAt(i);
-							}
-						}
-					}
-				}
-			}
-
-			private void SelfTest()
-			{
-				for (int d1 = 0; d1 < this.dimensions.Length - 1; d1++)
-				{
-					for (int d2 = d1 + 1; d2 < this.dimensions.Length; d2++)
-					{
-						for (int f1 = 0; f1 < this.dimensions[d1]; f1++)
-						{
-							for (int f2 = 0; f2 < this.dimensions[d2]; f2++)
-							{
-								Tuple tuple = new Tuple();
-								tuple.Add(new FeatureInfo(d1, f1));
-								tuple.Add(new FeatureInfo(d2, f2));
-
-								if (!this.testCases.IsTupleCovered(tuple))
-								{
-									throw new ApplicationException("PairwiseStrategy self-test failed : Not all pairs are covered!");
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		public PairwiseStrategy(IEnumerable[] sources) : base(sources) { }
-
-		public override IEnumerable GetTestCases()
-		{
-			ArrayList[] valueSet = CreateValueSet();
-			int[] dimensions = CreateDimensions(valueSet);
-
-			IEnumerable pairwiseTestCases = new PairwiseTestCaseGenerator(dimensions).GetTestCases();
-
-#if CLR_2_0 || CLR_4_0
-            List<ParameterSet> testCases = new List<ParameterSet>();
-#else
-            ArrayList testCases = new ArrayList();
-#endif
-
-			foreach (TestCase pairwiseTestCase in pairwiseTestCases)
-			{
-				object[] testData = new object[pairwiseTestCase.Features.Length];
-
-				for (int i = 0; i < pairwiseTestCase.Features.Length; i++)
-				{
-					testData[i] = valueSet[i][pairwiseTestCase.Features[i]];
-				}
-
-                ParameterSet testCase = new ParameterSet();
-                testCase.Arguments = testData;
-
-				testCases.Add(testCase);
-			}
-
-			return testCases;
-		}
-
-		private ArrayList[] CreateValueSet()
-		{
-			ArrayList[] valueSet = new ArrayList[Sources.Length];
-
-			for (int i = 0; i < valueSet.Length; i++)
-			{
-				ArrayList values = new ArrayList();
-
-				foreach (object value in Sources[i])
-				{
-					values.Add(value);
-				}
-
-				valueSet[i] = values;
-			}
-
-			return valueSet;
-		}
-
-		private int[] CreateDimensions(ArrayList[] valueSet)
-		{
-			int[] dimensions = new int[valueSet.Length];
-
-			for (int i = 0; i < valueSet.Length; i++)
-			{
-				dimensions[i] = valueSet[i].Count;
-			}
-
-			return dimensions;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+using System.Reflection;
+using System.Text;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+	public class PairwiseStrategy : CombiningStrategy
+	{
+		internal class FleaRand
+		{
+			private const int FleaRandSize = 256;
+
+			private uint b;
+			private uint c;
+			private uint d;
+			private uint z;
+
+			private uint[] m = new uint[FleaRandSize];
+			private uint[] r = new uint[FleaRandSize];
+
+			private uint q;
+
+			public FleaRand(uint seed)
+			{
+				this.b = seed;
+				this.c = seed;
+				this.d = seed;
+				this.z = seed;
+
+				for (int i = 0; i < this.m.Length; i++)
+				{
+					this.m[i] = seed;
+				}
+
+				for (int i = 0; i < 10; i++)
+				{
+					this.Batch();
+				}
+
+				this.q = 0;
+			}
+
+			public uint Next()
+			{
+				if (this.q == 0)
+				{
+					this.Batch();
+					this.q = (uint)this.r.Length - 1;
+				}
+				else
+				{
+					this.q--;
+				}
+
+				return this.r[this.q];
+			}
+
+			private void Batch()
+			{
+				uint a;
+				uint b = this.b;
+				uint c = this.c + (++this.z);
+				uint d = this.d;
+
+				for (int i = 0; i < this.r.Length; i++)
+				{
+					a = this.m[b % this.m.Length];
+					this.m[b % this.m.Length] = d;
+					d = (c << 19) + (c >> 13) + b;
+					c = b ^ this.m[i];
+					b = a + d;
+					this.r[i] = c;
+				}
+
+				this.b = b;
+				this.c = c;
+				this.d = d;
+			}
+		}
+
+		internal class FeatureInfo
+		{
+			public const string Names = "abcdefghijklmnopqrstuvwxyz";
+
+			public readonly int Dimension;
+			public readonly int Feature;
+
+			public FeatureInfo(int dimension, int feature)
+			{
+				this.Dimension = dimension;
+				this.Feature = feature;
+			}
+
+#if DEBUG
+			public override string ToString()
+			{
+				return (this.Dimension + 1).ToString() + FeatureInfo.Names[this.Feature];
+			}
+#endif
+		}
+
+		internal class Tuple
+		{
+			private readonly ArrayList features = new ArrayList();
+
+			public int Count
+			{
+				get
+				{
+					return this.features.Count;
+				}
+			}
+
+			public FeatureInfo this[int index]
+			{
+				get
+				{
+					return (FeatureInfo)this.features[index];
+				}
+			}
+
+			public void Add(FeatureInfo feature)
+			{
+				this.features.Add(feature);
+			}
+
+#if DEBUG
+			public override string ToString()
+			{
+				StringBuilder sb = new StringBuilder();
+
+				sb.Append('(');
+
+				for (int i = 0; i < this.features.Count; i++)
+				{
+					if (i > 0)
+					{
+						sb.Append(' ');
+					}
+
+					sb.Append(this.features[i].ToString());
+				}
+
+				sb.Append(')');
+
+				return sb.ToString();
+			}
+#endif
+		}
+
+		internal class TupleCollection
+		{
+			private readonly ArrayList tuples = new ArrayList();
+
+			public int Count
+			{
+				get
+				{
+					return this.tuples.Count;
+				}
+			}
+
+			public Tuple this[int index]
+			{
+				get
+				{
+					return (Tuple)this.tuples[index];
+				}
+			}
+
+			public void Add(Tuple tuple)
+			{
+				this.tuples.Add(tuple);
+			}
+
+			public void RemoveAt(int index)
+			{
+				this.tuples.RemoveAt(index);
+			}
+		}
+
+		internal class TestCase
+		{
+			public readonly int[] Features;
+
+			public TestCase(int numberOfDimensions)
+			{
+				this.Features = new int[numberOfDimensions];
+			}
+
+			public bool IsTupleCovered(Tuple tuple)
+			{
+				for (int i = 0; i < tuple.Count; i++)
+				{
+					if (this.Features[tuple[i].Dimension] != tuple[i].Feature)
+					{
+						return false;
+					}
+				}
+
+				return true;
+			}
+
+#if DEBUG
+			public override string ToString()
+			{
+				StringBuilder sb = new StringBuilder();
+
+				for (int i = 0; i < this.Features.Length; i++)
+				{
+					if (i > 0)
+					{
+						sb.Append(' ');
+					}
+
+					sb.Append(i + 1);
+					sb.Append(FeatureInfo.Names[this.Features[i]]);
+				}
+
+				return sb.ToString();
+			}
+#endif
+		}
+
+		internal class TestCaseCollection : IEnumerable
+		{
+			private readonly ArrayList testCases = new ArrayList();
+
+			public void Add(TestCase testCase)
+			{
+				this.testCases.Add(testCase);
+			}
+
+			public IEnumerator GetEnumerator()
+			{
+				return this.testCases.GetEnumerator();
+			}
+
+			public bool IsTupleCovered(Tuple tuple)
+			{
+				foreach (TestCase testCase in this.testCases)
+				{
+					if (testCase.IsTupleCovered(tuple))
+					{
+						return true;
+					}
+				}
+
+				return false;
+			}
+		}
+
+		internal class PairwiseTestCaseGenerator
+		{
+			private const int MaxTupleLength = 2;
+
+			private readonly FleaRand random = new FleaRand(0);
+
+			private readonly int[] dimensions;
+
+			private readonly TupleCollection[][] uncoveredTuples;
+
+			private readonly int[][] currentTupleLength;
+
+			private readonly TestCaseCollection testCases = new TestCaseCollection();
+
+			public PairwiseTestCaseGenerator(int[] dimensions)
+			{
+				this.dimensions = dimensions;
+
+				this.uncoveredTuples = new TupleCollection[this.dimensions.Length][];
+
+				for (int d = 0; d < this.uncoveredTuples.Length; d++)
+				{
+					this.uncoveredTuples[d] = new TupleCollection[this.dimensions[d]];
+
+					for (int f = 0; f < this.dimensions[d]; f++)
+					{
+						this.uncoveredTuples[d][f] = new TupleCollection();
+					}
+				}
+
+				this.currentTupleLength = new int[this.dimensions.Length][];
+
+				for (int d = 0; d < this.dimensions.Length; d++)
+				{
+					this.currentTupleLength[d] = new int[this.dimensions[d]];
+				}
+			}
+
+			public IEnumerable GetTestCases()
+			{
+				this.CreateTestCases();
+
+				this.SelfTest();
+
+				return this.testCases;
+			}
+
+			private void CreateTestCases()
+			{
+				while (true)
+				{
+					this.ExtendTupleSet();
+
+					Tuple tuple = this.FindTupleToCover();
+
+					if (tuple == null)
+					{
+						return;
+					}
+
+					TestCase testCase = this.FindGoodTestCase(tuple);
+
+					this.RemoveTuplesCoveredBy(testCase);
+
+					this.testCases.Add(testCase);
+				}
+			}
+
+			private void ExtendTupleSet()
+			{
+				for (int d = 0; d < this.dimensions.Length; d++)
+				{
+					for (int f = 0; f < this.dimensions[d]; f++)
+					{
+						this.ExtendTupleSet(d, f);
+					}
+				}
+			}
+
+			private void ExtendTupleSet(int dimension, int feature)
+			{
+				// If tuples for [dimension][feature] already exists, it's no needs to add more tuples.
+				if (this.uncoveredTuples[dimension][feature].Count > 0)
+				{
+					return;
+				}
+
+				// If maximum tuple length for [dimension][feature] is reached, it's no needs to add more tuples.
+				if (this.currentTupleLength[dimension][feature] == MaxTupleLength)
+				{
+					return;
+				}
+
+				this.currentTupleLength[dimension][feature]++;
+
+				int tupleLength = this.currentTupleLength[dimension][feature];
+
+				if (tupleLength == 1)
+				{
+					Tuple tuple = new Tuple();
+
+					tuple.Add(new FeatureInfo(dimension, feature));
+
+					if (this.testCases.IsTupleCovered(tuple))
+					{
+						return;
+					}
+
+					this.uncoveredTuples[dimension][feature].Add(tuple);
+				}
+				else
+				{
+					for (int d = 0; d < this.dimensions.Length; d++)
+					{
+						for (int f = 0; f < this.dimensions[d]; f++)
+						{
+							Tuple tuple = new Tuple();
+							tuple.Add(new FeatureInfo(d, f));
+
+							if (tuple[0].Dimension == dimension)
+							{
+								continue;
+							}
+
+							tuple.Add(new FeatureInfo(dimension, feature));
+
+							if (this.testCases.IsTupleCovered(tuple))
+							{
+								continue;
+							}
+
+							this.uncoveredTuples[dimension][feature].Add(tuple);
+						}
+					}
+				}
+			}
+
+			private Tuple FindTupleToCover()
+			{
+				int tupleLength = MaxTupleLength;
+				int tupleCount = 0;
+				Tuple tuple = null;
+
+				for (int d = 0; d < this.dimensions.Length; d++)
+				{
+					for (int f = 0; f < this.dimensions[d]; f++)
+					{
+						if (this.currentTupleLength[d][f] < tupleLength)
+						{
+							tupleLength = this.currentTupleLength[d][f];
+							tupleCount = this.uncoveredTuples[d][f].Count;
+							tuple = this.uncoveredTuples[d][f][0];
+						}
+						else
+						{
+							if (this.currentTupleLength[d][f] == tupleLength && this.uncoveredTuples[d][f].Count > tupleCount)
+							{
+								tupleCount = this.uncoveredTuples[d][f].Count;
+								tuple = this.uncoveredTuples[d][f][0];
+							}
+						}
+					}
+				}
+
+				return tuple;
+			}
+
+			private TestCase FindGoodTestCase(Tuple tuple)
+			{
+				TestCase bestTest = null;
+				int bestCoverage = -1;
+
+				for (int i = 0; i < 5; i++)
+				{
+					TestCase test = new TestCase(this.dimensions.Length);
+
+					int coverage = this.CreateTestCase(tuple, test);
+
+					if (coverage > bestCoverage)
+					{
+						bestTest = test;
+						bestCoverage = coverage;
+					}
+				}
+
+				return bestTest;
+			}
+
+			private int CreateTestCase(Tuple tuple, TestCase test)
+			{
+				// Create a random test case...
+				for (int i = 0; i < test.Features.Length; i++)
+				{
+					test.Features[i] = (int)(this.random.Next() % this.dimensions[i]);
+				}
+
+				// ...and inject the tuple into it!
+				for (int i = 0; i < tuple.Count; i++)
+				{
+					test.Features[tuple[i].Dimension] = tuple[i].Feature;
+				}
+
+				return this.MaximizeCoverage(test, tuple);
+			}
+
+			private int MaximizeCoverage(TestCase test, Tuple tuple)
+			{
+				int[] dimensionOrder = this.GetMutableDimensions(tuple);
+
+				while (true)
+				{
+					bool progress = false;
+					int totalCoverage = 1;
+
+					// Scramble dimensions.
+					for (int i = dimensionOrder.Length; i > 1; i--)
+					{
+						int j = (int)(this.random.Next() % i);
+						int t = dimensionOrder[i - 1];
+						dimensionOrder[i - 1] = dimensionOrder[j];
+						dimensionOrder[j] = t;
+					}
+
+					// For each dimension that can be modified...
+					for (int i = 0; i < dimensionOrder.Length; i++)
+					{
+						int d = dimensionOrder[i];
+
+						ArrayList bestFeatures = new ArrayList();
+
+						int bestCoverage = this.CountTuplesCovered(test, d, test.Features[d]);
+
+						int bestTupleLength = this.currentTupleLength[d][test.Features[d]];
+
+						// For each feature that can be modified, check if it can extend coverage.
+						for (int f = 0; f < this.dimensions[d]; f++)
+						{
+							test.Features[d] = f;
+
+							int coverage = this.CountTuplesCovered(test, d, f);
+
+							if (this.currentTupleLength[d][f] < bestTupleLength)
+							{
+								progress = true;
+								bestTupleLength = this.currentTupleLength[d][f];
+								bestCoverage = coverage;
+								bestFeatures.Clear();
+								bestFeatures.Add(f);
+							}
+							else
+							{
+								if (this.currentTupleLength[d][f] == bestTupleLength && coverage >= bestCoverage)
+								{
+									if (coverage > bestCoverage)
+									{
+										progress = true;
+										bestCoverage = coverage;
+										bestFeatures.Clear();
+									}
+
+									bestFeatures.Add(f);
+								}
+							}
+						}
+
+						if (bestFeatures.Count == 1)
+						{
+							test.Features[d] = (int)bestFeatures[0];
+						}
+						else
+						{
+							test.Features[d] = (int)bestFeatures[(int)(this.random.Next() % bestFeatures.Count)];
+						}
+
+						totalCoverage += bestCoverage;
+					}
+
+					if (!progress)
+					{
+						return totalCoverage;
+					}
+				}
+			}
+
+			private int[] GetMutableDimensions(Tuple tuple)
+			{
+				bool[] immutableDimensions = new bool[this.dimensions.Length];
+
+				for (int i = 0; i < tuple.Count; i++)
+				{
+					immutableDimensions[tuple[i].Dimension] = true;
+				}
+
+				ArrayList mutableDimensions = new ArrayList();
+
+				for (int i = 0; i < this.dimensions.Length; i++)
+				{
+					if (!immutableDimensions[i])
+					{
+						mutableDimensions.Add(i);
+					}
+				}
+
+				return (int[])mutableDimensions.ToArray(typeof(int));
+			}
+
+			private int CountTuplesCovered(TestCase test, int dimension, int feature)
+			{
+				int tuplesCovered = 0;
+
+				TupleCollection tuples = this.uncoveredTuples[dimension][feature];
+
+				for (int i = 0; i < tuples.Count; i++)
+				{
+					if (test.IsTupleCovered(tuples[i]))
+					{
+						tuplesCovered++;
+					}
+				}
+
+				return tuplesCovered;
+			}
+
+			private void RemoveTuplesCoveredBy(TestCase testCase)
+			{
+				for (int d = 0; d < this.uncoveredTuples.Length; d++)
+				{
+					for (int f = 0; f < this.uncoveredTuples[d].Length; f++)
+					{
+						TupleCollection tuples = this.uncoveredTuples[d][f];
+
+						for (int i = tuples.Count - 1; i >= 0; i--)
+						{
+							if (testCase.IsTupleCovered(tuples[i]))
+							{
+								tuples.RemoveAt(i);
+							}
+						}
+					}
+				}
+			}
+
+			private void SelfTest()
+			{
+				for (int d1 = 0; d1 < this.dimensions.Length - 1; d1++)
+				{
+					for (int d2 = d1 + 1; d2 < this.dimensions.Length; d2++)
+					{
+						for (int f1 = 0; f1 < this.dimensions[d1]; f1++)
+						{
+							for (int f2 = 0; f2 < this.dimensions[d2]; f2++)
+							{
+								Tuple tuple = new Tuple();
+								tuple.Add(new FeatureInfo(d1, f1));
+								tuple.Add(new FeatureInfo(d2, f2));
+
+								if (!this.testCases.IsTupleCovered(tuple))
+								{
+									throw new ApplicationException("PairwiseStrategy self-test failed : Not all pairs are covered!");
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		public PairwiseStrategy(IEnumerable[] sources) : base(sources) { }
+
+		public override IEnumerable GetTestCases()
+		{
+			ArrayList[] valueSet = CreateValueSet();
+			int[] dimensions = CreateDimensions(valueSet);
+
+			IEnumerable pairwiseTestCases = new PairwiseTestCaseGenerator(dimensions).GetTestCases();
+
+#if CLR_2_0 || CLR_4_0
+            List<ParameterSet> testCases = new List<ParameterSet>();
+#else
+            ArrayList testCases = new ArrayList();
+#endif
+
+			foreach (TestCase pairwiseTestCase in pairwiseTestCases)
+			{
+				object[] testData = new object[pairwiseTestCase.Features.Length];
+
+				for (int i = 0; i < pairwiseTestCase.Features.Length; i++)
+				{
+					testData[i] = valueSet[i][pairwiseTestCase.Features[i]];
+				}
+
+                ParameterSet testCase = new ParameterSet();
+                testCase.Arguments = testData;
+
+				testCases.Add(testCase);
+			}
+
+			return testCases;
+		}
+
+		private ArrayList[] CreateValueSet()
+		{
+			ArrayList[] valueSet = new ArrayList[Sources.Length];
+
+			for (int i = 0; i < valueSet.Length; i++)
+			{
+				ArrayList values = new ArrayList();
+
+				foreach (object value in Sources[i])
+				{
+					values.Add(value);
+				}
+
+				valueSet[i] = values;
+			}
+
+			return valueSet;
+		}
+
+		private int[] CreateDimensions(ArrayList[] valueSet)
+		{
+			int[] dimensions = new int[valueSet.Length];
+
+			for (int i = 0; i < valueSet.Length; i++)
+			{
+				dimensions[i] = valueSet[i].Count;
+			}
+
+			return dimensions;
+		}
+	}
+}
diff --git a/src/NUnitCore/core/Builders/ProviderCache.cs b/src/NUnitCore/core/Builders/ProviderCache.cs
index c8f3ded..41a2c7d 100644
--- a/src/NUnitCore/core/Builders/ProviderCache.cs
+++ b/src/NUnitCore/core/Builders/ProviderCache.cs
@@ -1,62 +1,62 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Text;
-
-namespace NUnit.Core.Builders
-{
-    class ProviderCache
-    {
-        private static IDictionary instances = new Hashtable();
-
-        public static object GetInstanceOf(Type providerType)
-        {
-            CacheEntry entry = new CacheEntry(providerType);
-
-            object instance = instances[entry];
-            return instance == null
-                ? instances[entry] = Reflect.Construct(providerType)
-                : instance;
-        }
-
-        public static void Clear()
-        {
-            foreach (object key in instances.Keys)
-            {
-                IDisposable provider = instances[key] as IDisposable;
-                if (provider != null)
-                    provider.Dispose();
-            }
-
-            instances.Clear();
-        }
-
-        class CacheEntry
-        {
-            private Type providerType;
-
-            public CacheEntry(Type providerType)
-            {
-                this.providerType = providerType;
-            }
-
-            public override bool Equals(object obj)
-            {
-                CacheEntry other = obj as CacheEntry;
-                if (other == null) return false;
-
-                return this.providerType == other.providerType;
-            }
-
-            public override int GetHashCode()
-            {
-                return providerType.GetHashCode();
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Text;
+
+namespace NUnit.Core.Builders
+{
+    class ProviderCache
+    {
+        private static IDictionary instances = new Hashtable();
+
+        public static object GetInstanceOf(Type providerType)
+        {
+            CacheEntry entry = new CacheEntry(providerType);
+
+            object instance = instances[entry];
+            return instance == null
+                ? instances[entry] = Reflect.Construct(providerType)
+                : instance;
+        }
+
+        public static void Clear()
+        {
+            foreach (object key in instances.Keys)
+            {
+                IDisposable provider = instances[key] as IDisposable;
+                if (provider != null)
+                    provider.Dispose();
+            }
+
+            instances.Clear();
+        }
+
+        class CacheEntry
+        {
+            private Type providerType;
+
+            public CacheEntry(Type providerType)
+            {
+                this.providerType = providerType;
+            }
+
+            public override bool Equals(object obj)
+            {
+                CacheEntry other = obj as CacheEntry;
+                if (other == null) return false;
+
+                return this.providerType == other.providerType;
+            }
+
+            public override int GetHashCode()
+            {
+                return providerType.GetHashCode();
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/ProviderInfo.cs b/src/NUnitCore/core/Builders/ProviderInfo.cs
index e97e256..a6a0825 100644
--- a/src/NUnitCore/core/Builders/ProviderInfo.cs
+++ b/src/NUnitCore/core/Builders/ProviderInfo.cs
@@ -1,98 +1,103 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Builders
-{
-    class ProviderReference
-    {
-        private Type providerType;
-        private string providerName;
-        private object[] providerArgs;
-        private string category;
-
-        public ProviderReference(Type providerType, string providerName, string category)
-        {
-            if (providerType == null)
-                throw new ArgumentNullException("providerType");
-            if (providerName == null)
-                throw new ArgumentNullException("providerName");
-
-            this.providerType = providerType;
-            this.providerName = providerName;
-            this.category = category;
-        }
-
-        public ProviderReference(Type providerType, object[] args, string providerName, string category)
-            : this(providerType, providerName, category)
-        {
-            this.providerArgs = args;
-        }
-
-        public string Name
-        {
-            get { return this.providerName; }
-        }
-
-        public string Category
-        {
-            get { return this.category; }
-        }
-
-        public IEnumerable GetInstance()
-        {
-                MemberInfo[] members = providerType.GetMember(
-                    providerName,
-                    MemberTypes.Field | MemberTypes.Method | MemberTypes.Property,
-                    BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
-
-                if (members.Length == 0)
-                    throw new Exception(string.Format(
-                        "Unable to locate {0}.{1}", providerType.FullName, providerName));
-
-                return (IEnumerable)GetProviderObjectFromMember(members[0]);
-        }
-
-        private object GetProviderObjectFromMember(MemberInfo member)
-        {
-            object providerObject = null;
-            object instance = null;
-
-            switch (member.MemberType)
-            {
-                case MemberTypes.Property:
-                    PropertyInfo providerProperty = member as PropertyInfo;
-                    MethodInfo getMethod = providerProperty.GetGetMethod(true);
-                    if (!getMethod.IsStatic)
-                        //instance = ProviderCache.GetInstanceOf(providerType);
-                        instance = Reflect.Construct(providerType, providerArgs);
-                    providerObject = providerProperty.GetValue(instance, null);
-                    break;
-
-                case MemberTypes.Method:
-                    MethodInfo providerMethod = member as MethodInfo;
-                    if (!providerMethod.IsStatic)
-                        //instance = ProviderCache.GetInstanceOf(providerType);
-                        instance = Reflect.Construct(providerType, providerArgs);
-                    providerObject = providerMethod.Invoke(instance, null);
-                    break;
-
-                case MemberTypes.Field:
-                    FieldInfo providerField = member as FieldInfo;
-                    if (!providerField.IsStatic)
-                        //instance = ProviderCache.GetInstanceOf(providerType);
-                        instance = Reflect.Construct(providerType, providerArgs);
-                    providerObject = providerField.GetValue(instance);
-                    break;
-            }
-
-            return providerObject;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Builders
+{
+    class ProviderReference
+    {
+        private Type providerType;
+        private string providerName;
+        private object[] providerArgs;
+        private string category;
+
+        public ProviderReference(Type providerType, string providerName, string category)
+        {
+            if (providerType == null)
+                throw new ArgumentNullException("providerType");
+            if (providerName == null && providerType.GetInterface("System.Collections.IEnumerable") == null)
+                throw new ArgumentNullException("providerName");
+
+            this.providerType = providerType;
+            this.providerName = providerName;
+            this.category = category;
+        }
+
+        public ProviderReference(Type providerType, object[] args, string providerName, string category)
+            : this(providerType, providerName, category)
+        {
+            this.providerArgs = args;
+        }
+
+        public string Name
+        {
+            get { return this.providerName; }
+        }
+
+        public string Category
+        {
+            get { return this.category; }
+        }
+
+        public IEnumerable GetInstance()
+        {
+            if (providerName != null)
+            {
+                MemberInfo[] members = providerType.GetMember(
+                    providerName,
+                    MemberTypes.Field | MemberTypes.Method | MemberTypes.Property,
+                    BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+
+                if (members.Length == 0)
+                    throw new Exception(string.Format(
+                        "Unable to locate {0}.{1}", providerType.FullName, providerName));
+
+                return (IEnumerable)GetProviderObjectFromMember(members[0]);
+            }
+            else
+                return Reflect.Construct(providerType) as IEnumerable;
+        }
+
+        private object GetProviderObjectFromMember(MemberInfo member)
+        {
+            object providerObject = null;
+            object instance = null;
+
+            switch (member.MemberType)
+            {
+                case MemberTypes.Property:
+                    PropertyInfo providerProperty = member as PropertyInfo;
+                    MethodInfo getMethod = providerProperty.GetGetMethod(true);
+                    if (!getMethod.IsStatic)
+                        //instance = ProviderCache.GetInstanceOf(providerType);
+                        instance = Reflect.Construct(providerType, providerArgs);
+                    providerObject = providerProperty.GetValue(instance, null);
+                    break;
+
+                case MemberTypes.Method:
+                    MethodInfo providerMethod = member as MethodInfo;
+                    if (!providerMethod.IsStatic)
+                        //instance = ProviderCache.GetInstanceOf(providerType);
+                        instance = Reflect.Construct(providerType, providerArgs);
+                    providerObject = providerMethod.Invoke(instance, null);
+                    break;
+
+                case MemberTypes.Field:
+                    FieldInfo providerField = member as FieldInfo;
+                    if (!providerField.IsStatic)
+                        //instance = ProviderCache.GetInstanceOf(providerType);
+                        instance = Reflect.Construct(providerType, providerArgs);
+                    providerObject = providerField.GetValue(instance);
+                    break;
+            }
+
+            return providerObject;
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/SequentialStrategy.cs b/src/NUnitCore/core/Builders/SequentialStrategy.cs
index bbb1ff6..00247e0 100644
--- a/src/NUnitCore/core/Builders/SequentialStrategy.cs
+++ b/src/NUnitCore/core/Builders/SequentialStrategy.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    public class SequentialStrategy : CombiningStrategy
-    {
-        public SequentialStrategy(IEnumerable[] sources) : base(sources) { }
-
-        public override IEnumerable GetTestCases()
-        {
-#if CLR_2_0 || CLR_4_0
-            List<ParameterSet> testCases = new List<ParameterSet>();
-#else
-            ArrayList testCases = new ArrayList();
-#endif
-
-            for (; ; )
-            {
-                bool gotData = false;
-                object[] testdata = new object[Sources.Length];
-
-                for (int i = 0; i < Sources.Length; i++)
-                    if (Enumerators[i].MoveNext())
-                    {
-                        testdata[i] = Enumerators[i].Current;
-                        gotData = true;
-                    }
-                    else
-                        testdata[i] = null;
-
-                if (!gotData)
-                    break;
-
-                ParameterSet testcase = new ParameterSet();
-                testcase.Arguments = testdata;
-
-                testCases.Add(testcase);
-            }
-
-            return testCases;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class SequentialStrategy : CombiningStrategy
+    {
+        public SequentialStrategy(IEnumerable[] sources) : base(sources) { }
+
+        public override IEnumerable GetTestCases()
+        {
+#if CLR_2_0 || CLR_4_0
+            List<ParameterSet> testCases = new List<ParameterSet>();
+#else
+            ArrayList testCases = new ArrayList();
+#endif
+
+            for (; ; )
+            {
+                bool gotData = false;
+                object[] testdata = new object[Sources.Length];
+
+                for (int i = 0; i < Sources.Length; i++)
+                    if (Enumerators[i].MoveNext())
+                    {
+                        testdata[i] = Enumerators[i].Current;
+                        gotData = true;
+                    }
+                    else
+                        testdata[i] = null;
+
+                if (!gotData)
+                    break;
+
+                ParameterSet testcase = new ParameterSet();
+                testcase.Arguments = testdata;
+
+                testCases.Add(testcase);
+            }
+
+            return testCases;
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs b/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs
index d880e87..a2d7a11 100644
--- a/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs
+++ b/src/NUnitCore/core/Builders/SetUpFixtureBuilder.cs
@@ -1,70 +1,70 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core.Builders
-{
-	/// <summary>
-	/// SetUpFixtureBuilder knows how to build a SetUpFixture.
-	/// </summary>
-	public class SetUpFixtureBuilder : Extensibility.ISuiteBuilder
-	{	
-		#region ISuiteBuilder Members
-		public Test BuildFrom(Type type)
-		{
-			SetUpFixture fixture = new SetUpFixture( type );
-
-            string reason = null;
-            if (!IsValidFixtureType(type, ref reason))
-            {
-                fixture.RunState = RunState.NotRunnable;
-                fixture.IgnoreReason = reason;
-            }
-
-            return fixture;
-		}
-
-		public bool CanBuildFrom(Type type)
-		{
-			return Reflect.HasAttribute( type, NUnitFramework.SetUpFixtureAttribute, false );
-		}
-		#endregion
-
-        private bool IsValidFixtureType(Type type, ref string reason)
-        {
-            if (type.IsAbstract)
-            {
-                reason = string.Format("{0} is an abstract class", type.FullName);
-                return false;
-            }
-
-            if (Reflect.GetConstructor(type) == null)
-            {
-                reason = string.Format("{0} does not have a valid constructor", type.FullName);
-                return false;
-            }
-
-            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.SetUpAttribute, ref reason) ||
-                !NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.TearDownAttribute, ref reason) )
-                    return false;
-
-            if ( Reflect.HasMethodWithAttribute(type, NUnitFramework.FixtureSetUpAttribute, true) )
-            {
-                reason = "TestFixtureSetUp method not allowed on a SetUpFixture";
-                return false;
-            }
-
-            if ( Reflect.HasMethodWithAttribute(type, NUnitFramework.FixtureTearDownAttribute, true) )
-            {
-                reason = "TestFixtureTearDown method not allowed on a SetUpFixture";
-                return false;
-            }
-
-            return true;
-        }
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core.Builders
+{
+	/// <summary>
+	/// SetUpFixtureBuilder knows how to build a SetUpFixture.
+	/// </summary>
+	public class SetUpFixtureBuilder : Extensibility.ISuiteBuilder
+	{	
+		#region ISuiteBuilder Members
+		public Test BuildFrom(Type type)
+		{
+			SetUpFixture fixture = new SetUpFixture( type );
+
+            string reason = null;
+            if (!IsValidFixtureType(type, ref reason))
+            {
+                fixture.RunState = RunState.NotRunnable;
+                fixture.IgnoreReason = reason;
+            }
+
+            return fixture;
+		}
+
+		public bool CanBuildFrom(Type type)
+		{
+			return Reflect.HasAttribute( type, NUnitFramework.SetUpFixtureAttribute, false );
+		}
+		#endregion
+
+        private bool IsValidFixtureType(Type type, ref string reason)
+        {
+            if (type.IsAbstract)
+            {
+                reason = string.Format("{0} is an abstract class", type.FullName);
+                return false;
+            }
+
+            if (Reflect.GetConstructor(type) == null)
+            {
+                reason = string.Format("{0} does not have a valid constructor", type.FullName);
+                return false;
+            }
+
+            if (!NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.SetUpAttribute, ref reason) ||
+                !NUnitFramework.CheckSetUpTearDownMethods(type, NUnitFramework.TearDownAttribute, ref reason) )
+                    return false;
+
+            if ( Reflect.HasMethodWithAttribute(type, NUnitFramework.FixtureSetUpAttribute, true) )
+            {
+                reason = "TestFixtureSetUp method not allowed on a SetUpFixture";
+                return false;
+            }
+
+            if ( Reflect.HasMethodWithAttribute(type, NUnitFramework.FixtureTearDownAttribute, true) )
+            {
+                reason = "TestFixtureTearDown method not allowed on a SetUpFixture";
+                return false;
+            }
+
+            return true;
+        }
+	}
+}
diff --git a/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs b/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
index 63cd4c8..5b19269 100644
--- a/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
+++ b/src/NUnitCore/core/Builders/TestAssemblyBuilder.cs
@@ -1,233 +1,235 @@
-// ****************************************************************
-// 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.Collections;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-	/// <summary>
-	/// Class that builds a TestSuite from an assembly
-	/// </summary>
-	public class TestAssemblyBuilder
-	{
-		static Logger log = InternalTrace.GetLogger("TestAssemblyBuilder");
-
-		#region Instance Fields
-		/// <summary>
-		/// The loaded assembly
-		/// </summary>
-		Assembly assembly;
-
-		/// <summary>
-		/// Our LegacySuite builder, which is only used when a 
-		/// fixture has been passed by name on the command line.
-		/// </summary>
-		ISuiteBuilder legacySuiteBuilder;
-
-		private TestAssemblyInfo assemblyInfo = null;
-
-		#endregion
-
-		#region Properties
-		public Assembly Assembly
-		{
-			get { return assembly; }
-		}
-
-		public TestAssemblyInfo AssemblyInfo
-		{
-			get 
-			{ 
-				if ( assemblyInfo == null && assembly != null )
-				{
-					AssemblyReader rdr = new AssemblyReader( assembly );
-					Version imageRuntimeVersion = new Version( rdr.ImageRuntimeVersion.Substring( 1 ) );
-					IList frameworks = CoreExtensions.Host.TestFrameworks.GetReferencedFrameworks( assembly );
-					assemblyInfo = new TestAssemblyInfo( rdr.AssemblyPath, imageRuntimeVersion, RuntimeFramework.CurrentFramework, frameworks );
-				}
-
-				return assemblyInfo;
-			}
-		}
-		#endregion
-
-		#region Constructor
-
-		public TestAssemblyBuilder()
-		{
-			// TODO: Keeping this separate till we can make
-			//it work in all situations.
-			legacySuiteBuilder = new NUnit.Core.Builders.LegacySuiteBuilder();
-		}
-
-		#endregion
-
-		#region Build Methods
-		public Test Build( string assemblyName, string testName, bool autoSuites )
-		{
-			if ( testName == null || testName == string.Empty )
-				return Build( assemblyName, autoSuites );
-
-            // Change currentDirectory in case assembly references unmanaged dlls
-            // and so that any addins are able to access the directory easily.
-            using (new DirectorySwapper(Path.GetDirectoryName(assemblyName)))
-            {
-                this.assembly = Load(assemblyName);
-                if (assembly == null) return null;
-
-                // If provided test name is actually the name of
-                // a type, we handle it specially
-                Type testType = assembly.GetType(testName);
-                if (testType != null)
-                    return Build(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(this.assembly, assemblyName, fixtures, autoSuites);
-
-                return null;
-            }
-		}
-
-		public TestSuite Build( string assemblyName, bool autoSuites )
-		{
-            // Change currentDirectory in case assembly references unmanaged dlls
-            // and so that any addins are able to access the directory easily.
-            using (new DirectorySwapper(Path.GetDirectoryName(assemblyName)))
-            {
-                this.assembly = Load(assemblyName);
-                if (this.assembly == null) return null;
-
-                IList fixtures = GetFixtures(assembly, null);
-                return BuildTestAssembly(this.assembly, assemblyName, fixtures, 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 
-			// whether to allow them in more places.
-			if ( legacySuiteBuilder.CanBuildFrom( testType ) )
-				return legacySuiteBuilder.BuildFrom( testType );
-			else if ( TestFixtureBuilder.CanBuildFrom( testType ) )
-				return BuildTestAssembly( assembly, assemblyName,
-					new Test[] { TestFixtureBuilder.BuildFrom( testType ) }, autoSuites );
-			return null;
-		}
-
-		private TestSuite BuildTestAssembly( Assembly assembly, string assemblyName, IList fixtures, bool autoSuites )
-		{
-			 TestSuite testAssembly = new TestAssembly( assembly, assemblyName );
-
-			if ( autoSuites )
-			{
-				NamespaceTreeBuilder treeBuilder = 
-					new NamespaceTreeBuilder( testAssembly );
-				treeBuilder.Add( fixtures );
-                testAssembly = treeBuilder.RootSuite;
-			}
-			else 
-			foreach( TestSuite fixture in fixtures )
-			{
-                if (fixture != null)
-                {
-                    if (fixture is SetUpFixture)
-                    {
-                        fixture.RunState = RunState.NotRunnable;
-                        fixture.IgnoreReason = "SetUpFixture cannot be used when loading tests as a flat list of fixtures";
-                    }
-
-                    testAssembly.Add(fixture);
-                }
-			}
-	
-            NUnitFramework.ApplyCommonAttributes( assembly, testAssembly );
-
-            testAssembly.Properties["_PID"] = System.Diagnostics.Process.GetCurrentProcess().Id;
-            testAssembly.Properties["_APPDOMAIN"] = AppDomain.CurrentDomain.FriendlyName;
-
-
-			// TODO: Make this an option? Add Option to sort assemblies as well?
-			testAssembly.Sort();
-
-			return testAssembly;
-		}
-
-		#endregion
-
-		#region Helper Methods
-
-		private Assembly Load(string path)
-		{
-            Assembly assembly = null;
-
-            // Throws if this isn't a managed assembly or if it was built
-			// with a later version of the same assembly. 
-			AssemblyName assemblyName = AssemblyName.GetAssemblyName( Path.GetFileName( path ) );
-			
-            assembly = Assembly.Load(assemblyName);
-			
-            if ( assembly != null )
-                CoreExtensions.Host.InstallAdhocExtensions( assembly );
-
-			log.Info( "Loaded assembly " + assembly.FullName );
-
-			return assembly;
-		}
-
-		private IList GetFixtures( Assembly assembly, string ns )
-		{
-			ArrayList fixtures = new ArrayList();
-            log.Debug("Examining assembly for test fixtures");
-
-			IList testTypes = GetCandidateFixtureTypes( assembly, ns );
-
-            log.Debug("Found {0} classes to examine", testTypes.Count);
-#if CLR_2_0 || CLR_4_0
-            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
-            timer.Start();
-#endif
-
-			foreach(Type testType in testTypes)
-			{
-				if( TestFixtureBuilder.CanBuildFrom( testType ) )
-					fixtures.Add( TestFixtureBuilder.BuildFrom( testType ) );
-            }
-
-#if 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);
-#endif
-
-			return fixtures;
-		}
-	
-		private IList GetCandidateFixtureTypes( Assembly assembly, string ns )
-		{
-			IList types = assembly.GetTypes();
-				
-			if ( ns == null || ns == string.Empty || types.Count == 0 ) 
-				return types;
-
-			string prefix = ns + "." ;
-			
-			ArrayList result = new ArrayList();
-			foreach( Type type in types )
-				if ( type.FullName.StartsWith( prefix ) )
-					result.Add( type );
-
-			return result;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+	/// <summary>
+	/// Class that builds a TestSuite from an assembly
+	/// </summary>
+	public class TestAssemblyBuilder
+	{
+		static Logger log = InternalTrace.GetLogger("TestAssemblyBuilder");
+
+		#region Instance Fields
+		/// <summary>
+		/// The loaded assembly
+		/// </summary>
+		Assembly assembly;
+
+		/// <summary>
+		/// Our LegacySuite builder, which is only used when a 
+		/// fixture has been passed by name on the command line.
+		/// </summary>
+		ISuiteBuilder legacySuiteBuilder;
+
+		private TestAssemblyInfo assemblyInfo = null;
+
+		#endregion
+
+		#region Properties
+		public Assembly Assembly
+		{
+			get { return assembly; }
+		}
+
+		public TestAssemblyInfo AssemblyInfo
+		{
+			get 
+			{ 
+				if ( assemblyInfo == null && assembly != null )
+				{
+                    using (AssemblyReader rdr = new AssemblyReader(assembly))
+                    {
+                        Version imageRuntimeVersion = new Version(rdr.ImageRuntimeVersion.Substring(1));
+                        IList frameworks = CoreExtensions.Host.TestFrameworks.GetReferencedFrameworks(assembly);
+                        assemblyInfo = new TestAssemblyInfo(rdr.AssemblyPath, imageRuntimeVersion, RuntimeFramework.CurrentFramework, frameworks);
+                    }
+				}
+
+				return assemblyInfo;
+			}
+		}
+		#endregion
+
+		#region Constructor
+
+		public TestAssemblyBuilder()
+		{
+			// TODO: Keeping this separate till we can make
+			//it work in all situations.
+			legacySuiteBuilder = new NUnit.Core.Builders.LegacySuiteBuilder();
+		}
+
+		#endregion
+
+		#region Build Methods
+		public Test Build( string assemblyName, string testName, bool autoSuites )
+		{
+			if ( testName == null || testName == string.Empty )
+				return Build( assemblyName, autoSuites );
+
+            // Change currentDirectory in case assembly references unmanaged dlls
+            // and so that any addins are able to access the directory easily.
+            using (new DirectorySwapper(Path.GetDirectoryName(assemblyName)))
+            {
+                this.assembly = Load(assemblyName);
+                if (assembly == null) return null;
+
+                // If provided test name is actually the name of
+                // a type, we handle it specially
+                Type testType = assembly.GetType(testName);
+                if (testType != null)
+                    return Build(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(this.assembly, assemblyName, fixtures, autoSuites);
+
+                return null;
+            }
+		}
+
+		public TestSuite Build( string assemblyName, bool autoSuites )
+		{
+            // Change currentDirectory in case assembly references unmanaged dlls
+            // and so that any addins are able to access the directory easily.
+            using (new DirectorySwapper(Path.GetDirectoryName(assemblyName)))
+            {
+                this.assembly = Load(assemblyName);
+                if (this.assembly == null) return null;
+
+                IList fixtures = GetFixtures(assembly, null);
+                return BuildTestAssembly(this.assembly, assemblyName, fixtures, 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 
+			// whether to allow them in more places.
+			if ( legacySuiteBuilder.CanBuildFrom( testType ) )
+				return legacySuiteBuilder.BuildFrom( testType );
+			else if ( TestFixtureBuilder.CanBuildFrom( testType ) )
+				return BuildTestAssembly( assembly, assemblyName,
+					new Test[] { TestFixtureBuilder.BuildFrom( testType ) }, autoSuites );
+			return null;
+		}
+
+		private TestSuite BuildTestAssembly( Assembly assembly, string assemblyName, IList fixtures, bool autoSuites )
+		{
+			 TestSuite testAssembly = new TestAssembly( assembly, assemblyName );
+
+			if ( autoSuites )
+			{
+				NamespaceTreeBuilder treeBuilder = 
+					new NamespaceTreeBuilder( testAssembly );
+				treeBuilder.Add( fixtures );
+                testAssembly = treeBuilder.RootSuite;
+			}
+			else 
+			foreach( TestSuite fixture in fixtures )
+			{
+                if (fixture != null)
+                {
+                    if (fixture is SetUpFixture)
+                    {
+                        fixture.RunState = RunState.NotRunnable;
+                        fixture.IgnoreReason = "SetUpFixture cannot be used when loading tests as a flat list of fixtures";
+                    }
+
+                    testAssembly.Add(fixture);
+                }
+			}
+	
+            NUnitFramework.ApplyCommonAttributes( assembly, testAssembly );
+
+            testAssembly.Properties["_PID"] = System.Diagnostics.Process.GetCurrentProcess().Id;
+            testAssembly.Properties["_APPDOMAIN"] = AppDomain.CurrentDomain.FriendlyName;
+
+
+			// TODO: Make this an option? Add Option to sort assemblies as well?
+			testAssembly.Sort();
+
+			return testAssembly;
+		}
+
+		#endregion
+
+		#region Helper Methods
+
+		private Assembly Load(string path)
+		{
+            Assembly assembly = null;
+
+            // Throws if this isn't a managed assembly or if it was built
+			// with a later version of the same assembly. 
+			AssemblyName assemblyName = AssemblyName.GetAssemblyName( Path.GetFileName( path ) );
+			
+            assembly = Assembly.Load(assemblyName);
+			
+            if ( assembly != null )
+                CoreExtensions.Host.InstallAdhocExtensions( assembly );
+
+			log.Info( "Loaded assembly " + assembly.FullName );
+
+			return assembly;
+		}
+
+		private IList GetFixtures( Assembly assembly, string ns )
+		{
+			ArrayList fixtures = new ArrayList();
+            log.Debug("Examining assembly for test fixtures");
+
+			IList testTypes = GetCandidateFixtureTypes( assembly, ns );
+
+            log.Debug("Found {0} classes to examine", testTypes.Count);
+#if CLR_2_0 || CLR_4_0
+            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
+            timer.Start();
+#endif
+
+			foreach(Type testType in testTypes)
+			{
+				if( TestFixtureBuilder.CanBuildFrom( testType ) )
+					fixtures.Add( TestFixtureBuilder.BuildFrom( testType ) );
+            }
+
+#if 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);
+#endif
+
+			return fixtures;
+		}
+	
+		private IList GetCandidateFixtureTypes( Assembly assembly, string ns )
+		{
+			IList types = assembly.GetTypes();
+				
+			if ( ns == null || ns == string.Empty || types.Count == 0 ) 
+				return types;
+
+			string prefix = ns + "." ;
+			
+			ArrayList result = new ArrayList();
+			foreach( Type type in types )
+				if ( type.FullName.StartsWith( prefix ) )
+					result.Add( type );
+
+			return result;
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs b/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
index 96b05bc..3f8c0ff 100644
--- a/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
+++ b/src/NUnitCore/core/Builders/TestCaseParameterProvider.cs
@@ -1,165 +1,165 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using System.Text;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    public class TestCaseParameterProvider : ITestCaseProvider 
-    {
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        public bool HasTestCasesFor(MethodInfo method)
-        {
-            return Reflect.HasAttribute(method, NUnitFramework.TestCaseAttribute, false);
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing test cases for use in
-        /// running a parameterized test.
-        /// </summary>
-        /// <param name="method"></param>
-        /// <returns></returns>
-        public IEnumerable GetTestCasesFor(MethodInfo method)
-        {
-			ArrayList list = new ArrayList();
-
-            Attribute[] attrs = Reflect.GetAttributes(method, NUnitFramework.TestCaseAttribute, false);
-
-            ParameterInfo[] parameters = method.GetParameters();
-            int argsNeeded = parameters.Length;
-
-            foreach (Attribute attr in attrs)
-            {
-                ParameterSet parms;
-
-                try
-                {
-                    parms = ParameterSet.FromDataSource(attr);
-                    int argsProvided = parms.Arguments.Length;
-
-                    // Special handling for params arguments
-                    if (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))
-                        {
-                            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;
-                            }
-                        }
-                    }
-
-                    //if (method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
-                    //    parms.Arguments = new object[]{parms.Arguments};
-
-                    // Special handling when sole argument is an object[]
-                    if (argsNeeded == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
-                    {
-                        if (argsProvided > 1 ||
-                            argsProvided == 1 && parms.Arguments[0].GetType() != typeof(object[]))
-                        {
-                            parms.Arguments = new object[] { parms.Arguments };
-                        }
-                    }
-
-
-                    if (argsProvided == argsNeeded)
-                        PerformSpecialConversions(parms.Arguments, parameters);
-                }
-                catch (Exception ex)
-                {
-                    parms = new ParameterSet( ex );
-                }
-
-                list.Add( parms );
-			}
-
-			return list;
-        }
-        
-        /// <summary>
-        /// Performs several special conversions allowed by NUnit in order to
-        /// permit arguments with types that cannot be used in the constructor
-        /// of an Attribute such as TestCaseAttribute or to simplify their use.
-        /// </summary>
-        /// <param name="arglist">The arguments to be converted</param>
-        /// <param name="parameters">The ParameterInfo array for the method</param>
-        private static void PerformSpecialConversions(object[] arglist, ParameterInfo[] parameters)
-        {
-            for (int i = 0; i < arglist.Length; i++)
-            {
-                object arg = arglist[i];
-                Type targetType = parameters[i].ParameterType;
-
-                if (arg == null)
-                    continue;
-
-                if (arg.GetType().FullName == "NUnit.Framework.SpecialValue" &&
-                    arg.ToString() == "Null" )
-                {
-                    arglist[i] = null;
-                    continue;
-                }
-
-                if (targetType.IsAssignableFrom(arg.GetType()))
-                    continue;
-
-                if (arg is DBNull)
-                {
-                    arglist[i] = null;
-                    continue;
-                }
-
-                bool convert = false;
-
-                if (targetType == typeof(short) || targetType == typeof(byte) || targetType == typeof(sbyte))
-                    convert = arg is int;
-                else
-                if (targetType == typeof(decimal))
-                    convert = arg is double || arg is string || arg is int;
-                else 
-                if (targetType == typeof(DateTime) || targetType == typeof(TimeSpan))
-                    convert = arg is string;
-
-                if (convert)
-                    arglist[i] = Convert.ChangeType(arg, targetType, System.Globalization.CultureInfo.InvariantCulture);
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Text;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    public class TestCaseParameterProvider : ITestCaseProvider 
+    {
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method)
+        {
+            return Reflect.HasAttribute(method, NUnitFramework.TestCaseAttribute, false);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a parameterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+			ArrayList list = new ArrayList();
+
+            Attribute[] attrs = Reflect.GetAttributes(method, NUnitFramework.TestCaseAttribute, false);
+
+            ParameterInfo[] parameters = method.GetParameters();
+            int argsNeeded = parameters.Length;
+
+            foreach (Attribute attr in attrs)
+            {
+                ParameterSet parms;
+
+                try
+                {
+                    parms = ParameterSet.FromDataSource(attr);
+                    int argsProvided = parms.Arguments.Length;
+
+                    // Special handling for params arguments
+                    if (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))
+                        {
+                            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;
+                            }
+                        }
+                    }
+
+                    //if (method.GetParameters().Length == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
+                    //    parms.Arguments = new object[]{parms.Arguments};
+
+                    // Special handling when sole argument is an object[]
+                    if (argsNeeded == 1 && method.GetParameters()[0].ParameterType == typeof(object[]))
+                    {
+                        if (argsProvided > 1 ||
+                            argsProvided == 1 && parms.Arguments[0].GetType() != typeof(object[]))
+                        {
+                            parms.Arguments = new object[] { parms.Arguments };
+                        }
+                    }
+
+
+                    if (argsProvided == argsNeeded)
+                        PerformSpecialConversions(parms.Arguments, parameters);
+                }
+                catch (Exception ex)
+                {
+                    parms = new ParameterSet( ex );
+                }
+
+                list.Add( parms );
+			}
+
+			return list;
+        }
+        
+        /// <summary>
+        /// Performs several special conversions allowed by NUnit in order to
+        /// permit arguments with types that cannot be used in the constructor
+        /// of an Attribute such as TestCaseAttribute or to simplify their use.
+        /// </summary>
+        /// <param name="arglist">The arguments to be converted</param>
+        /// <param name="parameters">The ParameterInfo array for the method</param>
+        private static void PerformSpecialConversions(object[] arglist, ParameterInfo[] parameters)
+        {
+            for (int i = 0; i < arglist.Length; i++)
+            {
+                object arg = arglist[i];
+                Type targetType = parameters[i].ParameterType;
+
+                if (arg == null)
+                    continue;
+
+                if (arg.GetType().FullName == "NUnit.Framework.SpecialValue" &&
+                    arg.ToString() == "Null" )
+                {
+                    arglist[i] = null;
+                    continue;
+                }
+
+                if (targetType.IsAssignableFrom(arg.GetType()))
+                    continue;
+
+                if (arg is DBNull)
+                {
+                    arglist[i] = null;
+                    continue;
+                }
+
+                bool convert = false;
+
+                if (targetType == typeof(short) || targetType == typeof(byte) || targetType == typeof(sbyte))
+                    convert = arg is int;
+                else
+                if (targetType == typeof(decimal))
+                    convert = arg is double || arg is string || arg is int;
+                else 
+                if (targetType == typeof(DateTime) || targetType == typeof(TimeSpan))
+                    convert = arg is string;
+
+                if (convert)
+                    arglist[i] = Convert.ChangeType(arg, targetType, System.Globalization.CultureInfo.InvariantCulture);
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs b/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
index c6d2a2c..a6c2d89 100644
--- a/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
+++ b/src/NUnitCore/core/Builders/TestCaseSourceProvider.cs
@@ -1,156 +1,160 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    /// <summary>
-    /// TestCaseSourceProvider provides data for methods
-    /// annotated with the TestCaseSourceAttribute.
-    /// </summary>
-    public class TestCaseSourceProvider : ITestCaseProvider2
-    {
-        #region Constants
-        public const string SourceTypeProperty = "SourceType";
-        public const string SourceNameProperty = "SourceName";
-        #endregion
-
-        #region ITestCaseProvider Members
-
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        public bool HasTestCasesFor(MethodInfo method)
-        {
-            return Reflect.HasAttribute(method, NUnitFramework.TestCaseSourceAttribute, false);
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing test cases for use in
-        /// running a parameterized test.
-        /// </summary>
-        /// <param name="method"></param>
-        /// <returns></returns>
-        public IEnumerable GetTestCasesFor(MethodInfo method)
-        {
-            return GetTestCasesFor(method, null);
-        }
-        #endregion
-
-        #region ITestCaseProvider2 Members
-
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        public bool HasTestCasesFor(MethodInfo method, Test suite)
-        {
-            return HasTestCasesFor(method);
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing test cases for use in
-        /// running a parameterized test.
-        /// </summary>
-        /// <param name="method"></param>
-        /// <returns></returns>
-        public IEnumerable GetTestCasesFor(MethodInfo method, Test parentSuite)
-        {
-            ArrayList parameterList = new ArrayList();
-
-            foreach (ProviderReference info in GetSourcesFor(method, parentSuite))
-            {
-                foreach (object 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;
-        }
-        #endregion
-
-        #region Helper Methods
-        private static IList GetSourcesFor(MethodInfo method, Test parent)
-        {
-            ArrayList sources = new ArrayList();
-            TestFixture parentSuite = parent as TestFixture;
-
-            foreach (Attribute sourceAttr in Reflect.GetAttributes(method, NUnitFramework.TestCaseSourceAttribute, false))
-            {
-                Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
-                string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
-                string category = Reflect.GetPropertyValue(sourceAttr, "Category") as string;
-
-                if (sourceType == null)
-                {
-                    if (parentSuite != null)
-                        sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName, category));
-                    else
-                        sources.Add(new ProviderReference(method.ReflectedType, sourceName, category));
-                }
-                else
-                {
-                    sources.Add(new ProviderReference(sourceType, sourceName, category));
-                }
-
-            }
-            return sources;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// TestCaseSourceProvider provides data for methods
+    /// annotated with the TestCaseSourceAttribute.
+    /// </summary>
+    public class TestCaseSourceProvider : ITestCaseProvider2
+    {
+        #region Constants
+        public const string SourceTypeProperty = "SourceType";
+        public const string SourceNameProperty = "SourceName";
+        #endregion
+
+        #region ITestCaseProvider Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method)
+        {
+            return Reflect.HasAttribute(method, NUnitFramework.TestCaseSourceAttribute, false);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a parameterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+            return GetTestCasesFor(method, null);
+        }
+        #endregion
+
+        #region ITestCaseProvider2 Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method, Test suite)
+        {
+            return HasTestCasesFor(method);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a parameterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method, Test parentSuite)
+        {
+            ArrayList parameterList = new ArrayList();
+
+            foreach (ProviderReference info in GetSourcesFor(method, parentSuite))
+            {
+                foreach (object 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)
+                    {
+                        Type sourceType = source.GetType();
+
+                        if (sourceType.GetInterface("NUnit.Framework.ITestCaseData") != null ||
+                            sourceType.GetInterface("NUnit.Framework.Api.ITestCaseData") != null)
+                        {
+                            parms = ParameterSet.FromDataSource(source);
+                        }
+                        else
+                        {
+                            parms = new ParameterSet();
+
+                            ParameterInfo[] parameters = method.GetParameters();
+
+                            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;
+        }
+        #endregion
+
+        #region Helper Methods
+        private static IList GetSourcesFor(MethodInfo method, Test parent)
+        {
+            ArrayList sources = new ArrayList();
+            TestFixture parentSuite = parent as TestFixture;
+
+            foreach (Attribute sourceAttr in Reflect.GetAttributes(method, NUnitFramework.TestCaseSourceAttribute, false))
+            {
+                Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
+                string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
+                string category = Reflect.GetPropertyValue(sourceAttr, "Category") as string;
+
+                if (sourceType == null)
+                {
+                    if (parentSuite != null)
+                        sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName, category));
+                    else
+                        sources.Add(new ProviderReference(method.ReflectedType, sourceName, category));
+                }
+                else
+                {
+                    sources.Add(new ProviderReference(sourceType, sourceName, category));
+                }
+
+            }
+            return sources;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Builders/ValueSourceProvider.cs b/src/NUnitCore/core/Builders/ValueSourceProvider.cs
index 463c5d0..3ae1a89 100644
--- a/src/NUnitCore/core/Builders/ValueSourceProvider.cs
+++ b/src/NUnitCore/core/Builders/ValueSourceProvider.cs
@@ -1,108 +1,108 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Builders
-{
-    /// <summary>
-    /// ValueSourceProvider supplies data items for individual parameters
-    /// from named data sources in the test class or a separate class.
-    /// </summary>
-    public class ValueSourceProvider : IDataPointProvider2
-    {
-        #region Constants
-        public const string SourcesAttribute = "NUnit.Framework.ValueSourceAttribute";
-        public const string SourceTypeProperty = "SourceType";
-        public const string SourceNameProperty = "SourceName";
-        #endregion
-
-        #region IDataPointProvider Members
-
-        /// <summary>
-        /// Determine whether any data sources are available for a parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo test parameter</param>
-        /// <returns>True if any data is available, otherwise false.</returns>
-        public bool HasDataFor(ParameterInfo parameter)
-        {
-            return Reflect.HasAttribute(parameter, SourcesAttribute, false);
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing test data for use with
-        /// one parameter of a parameterized test.
-        /// </summary>
-        /// <param name="parameter"></param>
-        /// <returns></returns>
-        public IEnumerable GetDataFor(ParameterInfo parameter)
-        {
-            return GetDataFor(parameter, null);
-        }
-        #endregion
-
-        #region IDataPointProvider2 Members
-
-        /// <summary>
-        /// Determine whether any data sources are available for a parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo test parameter</param>
-        /// <param name="parentSuite">The test suite for which the test is being built</param>
-        /// <returns>True if any data is available, otherwise false.</returns>
-        public bool HasDataFor(ParameterInfo parameter, Test parentSuite)
-        {
-            return HasDataFor(parameter);
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing test data for use with
-        /// one parameter of a parameterized test.
-        /// </summary>
-        /// <param name="parameter"></param>
-        /// <param name="parentSuite">The test suite for which the test is being built</param>
-        /// <returns></returns>
-        public IEnumerable GetDataFor(ParameterInfo parameter, Test parentSuite)
-        {
-            ArrayList parameterList = new ArrayList();
-
-            foreach (ProviderReference providerRef in GetSourcesFor(parameter, parentSuite))
-            {
-                IEnumerable instance = providerRef.GetInstance();
-                if (instance != null)
-                    foreach (object o in instance)
-                        parameterList.Add(o);
-            }
-
-            return parameterList;
-        }
-        #endregion
-
-        #region Helper Methods
-        private static IList GetSourcesFor(ParameterInfo parameter, Test parent)
-        {
-            ArrayList sources = new ArrayList();
-            TestFixture parentSuite = parent as TestFixture;
-
-            foreach (Attribute sourceAttr in Reflect.GetAttributes(parameter, SourcesAttribute, false))
-            {
-                Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
-                string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
-
-                if (sourceType != null)
-                    sources.Add(new ProviderReference(sourceType, sourceName, null));
-                else if (parentSuite != null)
-                    sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName, null));
-                else
-                    sources.Add(new ProviderReference(parameter.Member.ReflectedType, sourceName, null));
-            }
-            return sources;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Builders
+{
+    /// <summary>
+    /// ValueSourceProvider supplies data items for individual parameters
+    /// from named data sources in the test class or a separate class.
+    /// </summary>
+    public class ValueSourceProvider : IDataPointProvider2
+    {
+        #region Constants
+        public const string SourcesAttribute = "NUnit.Framework.ValueSourceAttribute";
+        public const string SourceTypeProperty = "SourceType";
+        public const string SourceNameProperty = "SourceName";
+        #endregion
+
+        #region IDataPointProvider Members
+
+        /// <summary>
+        /// Determine whether any data sources are available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo test parameter</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter)
+        {
+            return Reflect.HasAttribute(parameter, SourcesAttribute, false);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test data for use with
+        /// one parameter of a parameterized test.
+        /// </summary>
+        /// <param name="parameter"></param>
+        /// <returns></returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter)
+        {
+            return GetDataFor(parameter, null);
+        }
+        #endregion
+
+        #region IDataPointProvider2 Members
+
+        /// <summary>
+        /// Determine whether any data sources are available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo test parameter</param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter, Test parentSuite)
+        {
+            return HasDataFor(parameter);
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing test data for use with
+        /// one parameter of a parameterized test.
+        /// </summary>
+        /// <param name="parameter"></param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns></returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter, Test parentSuite)
+        {
+            ArrayList parameterList = new ArrayList();
+
+            foreach (ProviderReference providerRef in GetSourcesFor(parameter, parentSuite))
+            {
+                IEnumerable instance = providerRef.GetInstance();
+                if (instance != null)
+                    foreach (object o in instance)
+                        parameterList.Add(o);
+            }
+
+            return parameterList;
+        }
+        #endregion
+
+        #region Helper Methods
+        private static IList GetSourcesFor(ParameterInfo parameter, Test parent)
+        {
+            ArrayList sources = new ArrayList();
+            TestFixture parentSuite = parent as TestFixture;
+
+            foreach (Attribute sourceAttr in Reflect.GetAttributes(parameter, SourcesAttribute, false))
+            {
+                Type sourceType = Reflect.GetPropertyValue(sourceAttr, SourceTypeProperty) as Type;
+                string sourceName = Reflect.GetPropertyValue(sourceAttr, SourceNameProperty) as string;
+
+                if (sourceType != null)
+                    sources.Add(new ProviderReference(sourceType, sourceName, null));
+                else if (parentSuite != null)
+                    sources.Add(new ProviderReference(parentSuite.FixtureType, parentSuite.arguments, sourceName, null));
+                else
+                    sources.Add(new ProviderReference(parameter.Member.ReflectedType, sourceName, null));
+            }
+            return sources;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/ContextDictionary.cs b/src/NUnitCore/core/ContextDictionary.cs
index 84a28ec..40dd107 100644
--- a/src/NUnitCore/core/ContextDictionary.cs
+++ b/src/NUnitCore/core/ContextDictionary.cs
@@ -1,48 +1,131 @@
-// ****************************************************************
-// 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;
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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;
+using System.Runtime.Remoting.Messaging;
+
+namespace NUnit.Core
+{
+    public class ContextDictionary : MarshalByRefObject, IDictionary, ILogicalThreadAffinative
+    {
+        internal TestExecutionContext _context;
+		private readonly Hashtable _storage = new Hashtable();
+
+        public ContextDictionary() { }
+
+        public ContextDictionary(TestExecutionContext context)
+        {
+            _context = context;
+        }
+
+		public object this[object key]
+        {
+            get
+            {
+                // Get Result values dynamically, since
+                // they may change as execution proceeds
+                switch (key as string)
+                {
+                    case "Test.Name":
+                        return _context.CurrentTest.TestName.Name;
+                    case "Test.FullName":
+                        return _context.CurrentTest.TestName.FullName;
+                    case "Test.Properties":
+                        return _context.CurrentTest.Properties;
+                    case "Result.State":
+                        return (int)_context.CurrentResult.ResultState;
+                    case "TestDirectory":
+                        return AssemblyHelper.GetDirectoryName(_context.CurrentTest.FixtureType.Assembly);
+                    case "WorkDirectory":
+                        return _context.TestPackage.Settings.Contains("WorkDirectory")
+                            ? _context.TestPackage.Settings["WorkDirectory"]
+                            : Environment.CurrentDirectory;
+                    default:
+                        return _storage[key];
+                }
+            }
+            set
+            {
+                _storage[key] = value;
+            }
+        }
+
+		#region IDictionary Interface non-implementation
+
+		void IDictionary.Remove(object key)
+		{
+			throw new NotImplementedException();
+		}
+
+		ICollection IDictionary.Keys
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		ICollection IDictionary.Values
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		bool IDictionary.IsReadOnly
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		bool IDictionary.IsFixedSize
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		bool IDictionary.Contains(object key)
+		{
+			throw new NotImplementedException();
+		}
+
+		void IDictionary.Add(object key, object value)
+		{
+			throw new NotImplementedException();
+		}
+
+		void IDictionary.Clear()
+		{
+			throw new NotImplementedException();
+		}
+
+		IDictionaryEnumerator IDictionary.GetEnumerator()
+		{
+			throw new NotImplementedException();
+		}
+
+		IEnumerator IEnumerable.GetEnumerator()
+		{
+			throw new NotImplementedException();
+		}
+
+		void ICollection.CopyTo(Array array, int index)
+		{
+			throw new NotImplementedException();
+		}
+
+		int ICollection.Count
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		object ICollection.SyncRoot
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		bool ICollection.IsSynchronized
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		#endregion
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitCore/core/CoreExtensions.cs b/src/NUnitCore/core/CoreExtensions.cs
index 863df5b..ff09d01 100644
--- a/src/NUnitCore/core/CoreExtensions.cs
+++ b/src/NUnitCore/core/CoreExtensions.cs
@@ -1,262 +1,262 @@
-// ****************************************************************
-// 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.Collections;
-using System.Reflection;
-using NUnit.Core.Builders;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// CoreExtensions is a singleton class that groups together all 
-	/// the extension points that are supported in the test domain.
-	/// It also provides access to the test builders and decorators
-	/// by other parts of the NUnit core.
-	/// </summary>
-	public class CoreExtensions : ExtensionHost, IService
-	{
-		static Logger log = InternalTrace.GetLogger("CoreExtensions");
-
-		#region Instance Fields
-		private IAddinRegistry addinRegistry;
-		private bool initialized;
-
-		private SuiteBuilderCollection suiteBuilders;
-		private TestCaseBuilderCollection testBuilders;
-		private TestDecoratorCollection testDecorators;
-		private EventListenerCollection listeners;
-		private FrameworkRegistry frameworks;
-	    private TestCaseProviders testcaseProviders;
-        private DataPointProviders dataPointProviders;
-
-		#endregion
-
-		#region CoreExtensions Singleton
-		private static CoreExtensions host;
-		public static CoreExtensions Host
-		{
-			get
-			{
-				if (host == null)
-					host = new CoreExtensions();
-
-				return host;
-			}
-		}
-		#endregion
-
-		#region Constructors
-		public CoreExtensions() 
-		{
-			this.suiteBuilders = new SuiteBuilderCollection(this);
-			this.testBuilders = new TestCaseBuilderCollection(this);
-			this.testDecorators = new TestDecoratorCollection(this);
-			this.listeners = new EventListenerCollection(this);
-			this.frameworks = new FrameworkRegistry(this);
-            this.testcaseProviders = new TestCaseProviders(this);
-            this.dataPointProviders = new DataPointProviders(this);
-
-		    this.extensions = new ArrayList();
-		    extensions.Add(suiteBuilders);
-		    extensions.Add(testBuilders);
-		    extensions.Add(testDecorators);
-		    extensions.Add(listeners);
-		    extensions.Add(frameworks);
-		    extensions.Add(testcaseProviders);
-            extensions.Add(dataPointProviders);
-
-			this.supportedTypes = ExtensionType.Core;
-
-			// TODO: This should be somewhere central
-//			string logfile = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
-//			logfile = Path.Combine( logfile, "NUnit" );
-//			logfile = Path.Combine( logfile, "NUnitTest.log" );
-//
-//			appender = new log4net.Appender.ConsoleAppender();
-////			appender.File = logfile;
-////			appender.AppendToFile = true;
-////			appender.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
-//			appender.Layout = new log4net.Layout.PatternLayout(
-//				"%date{ABSOLUTE} %-5level [%4thread] %logger{1}: PID=%property{PID} %message%newline" );
-//			appender.Threshold = log4net.Core.Level.All;
-//			log4net.Config.BasicConfigurator.Configure(appender);
-		}
-		#endregion
-
-		#region Public Properties
-
-		public bool Initialized
-		{
-			get { return initialized; }
-		}
-
-		/// <summary>
-		/// Our AddinRegistry may be set from outside or passed into the domain
-		/// </summary>
-		public IAddinRegistry AddinRegistry
-		{
-			get 
-			{
-				if ( addinRegistry == null )
-					addinRegistry = AppDomain.CurrentDomain.GetData( "AddinRegistry" ) as IAddinRegistry;
-
-				return addinRegistry; 
-			}
-			set { addinRegistry = value; }
-		}
-		#endregion
-
-		#region Internal Properties
-		internal ISuiteBuilder SuiteBuilders
-		{
-			get { return suiteBuilders; }
-		}
-
-		internal ITestCaseBuilder2 TestBuilders
-		{
-			get { return testBuilders; }
-		}
-
-		internal ITestDecorator TestDecorators
-		{
-			get { return testDecorators; }
-		}
-
-		internal EventListener Listeners
-		{
-			get { return listeners; }
-		}
-
-		internal FrameworkRegistry TestFrameworks
-		{
-			get { return frameworks; }
-		}
-
-        internal TestCaseProviders TestCaseProviders
-	    {
-            get { return testcaseProviders; }
-	    }
-
-	    #endregion
-
-		#region Public Methods	
-		public void InstallBuiltins()
-		{
-			log.Info( "Installing Builtins" );
-
-			// Define NUnit Frameworks
-			frameworks.Register( "NUnit", "nunit.framework" );
-            frameworks.Register("NUnitLite", "NUnitLite");
-
-			// Install builtin SuiteBuilders
-			suiteBuilders.Install( new NUnitTestFixtureBuilder() );
-			suiteBuilders.Install( new SetUpFixtureBuilder() );
-
-            // Install builtin TestCaseBuilder
-            testBuilders.Install( new NUnitTestCaseBuilder() );
-            //testBuilders.Install(new TheoryBuilder());
-
-            // Install builtin TestCaseProviders
-            testcaseProviders.Install(new TestCaseParameterProvider());
-            testcaseProviders.Install(new TestCaseSourceProvider());
-            testcaseProviders.Install(new CombinatorialTestCaseProvider());
-
-            // Install builtin DataPointProvider
-            dataPointProviders.Install(new InlineDataPointProvider());
-            dataPointProviders.Install(new ValueSourceProvider());
-            dataPointProviders.Install(new DatapointProvider());
-		}
-
-		public void InstallAddins()
-		{
-			log.Info( "Installing Addins" );
-
-			if( AddinRegistry != null )
-			{
-				foreach (Addin addin in AddinRegistry.Addins)
-				{
-					if ( (this.ExtensionTypes & addin.ExtensionType) != 0 )
-					{
-						AddinStatus status = AddinStatus.Unknown;
-						string message = null;
-
-						try
-						{
-							Type type = Type.GetType(addin.TypeName);
-							if ( type == null )
-							{
-								status = AddinStatus.Error;
-								message = string.Format( "Unable to locate {0} Type", addin.TypeName );
-							}
-							else if ( !InstallAddin( type ) )
-							{
-								status = AddinStatus.Error;
-								message = "Install method returned false";
-							}
-							else
-							{
-								status = AddinStatus.Loaded;
-							}
-						}
-						catch( Exception ex )
-						{
-							status = AddinStatus.Error;
-							message = ex.ToString(); 				
-						}
-
-						AddinRegistry.SetStatus( addin.Name, status, message );
-						if ( status != AddinStatus.Loaded )
-						{
-							log.Error( "Failed to load {0}", addin.Name );
-							log.Error( message );
-						}
-					}
-				}
-			}
-		}
-
-		public void InstallAdhocExtensions( Assembly assembly )
-		{
-			foreach ( Type type in assembly.GetExportedTypes() )
-			{
-				if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )
-					InstallAddin( type );
-			}
-		}
-		#endregion
-
-		#region Helper Methods
-		private bool InstallAddin( Type type )
-		{
-			ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
-			object obj = ctor.Invoke( new object[0] );
-			IAddin theAddin = (IAddin)obj;
-
-			return theAddin.Install(this);
-		}
-		#endregion
-
-		#region IService Members
-
-		public void UnloadService()
-		{
-			// TODO:  Add CoreExtensions.UnloadService implementation
-		}
-
-		public void InitializeService()
-		{
-			InstallBuiltins();
-			InstallAddins();
-
-			initialized = true;
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Collections;
+using System.Reflection;
+using NUnit.Core.Builders;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// CoreExtensions is a singleton class that groups together all 
+	/// the extension points that are supported in the test domain.
+	/// It also provides access to the test builders and decorators
+	/// by other parts of the NUnit core.
+	/// </summary>
+	public class CoreExtensions : ExtensionHost, IService
+	{
+		static Logger log = InternalTrace.GetLogger("CoreExtensions");
+
+		#region Instance Fields
+		private IAddinRegistry addinRegistry;
+		private bool initialized;
+
+		private SuiteBuilderCollection suiteBuilders;
+		private TestCaseBuilderCollection testBuilders;
+		private TestDecoratorCollection testDecorators;
+		private EventListenerCollection listeners;
+		private FrameworkRegistry frameworks;
+	    private TestCaseProviders testcaseProviders;
+        private DataPointProviders dataPointProviders;
+
+		#endregion
+
+		#region CoreExtensions Singleton
+		private static CoreExtensions host;
+		public static CoreExtensions Host
+		{
+			get
+			{
+				if (host == null)
+					host = new CoreExtensions();
+
+				return host;
+			}
+		}
+		#endregion
+
+		#region Constructors
+		public CoreExtensions() 
+		{
+			this.suiteBuilders = new SuiteBuilderCollection(this);
+			this.testBuilders = new TestCaseBuilderCollection(this);
+			this.testDecorators = new TestDecoratorCollection(this);
+			this.listeners = new EventListenerCollection(this);
+			this.frameworks = new FrameworkRegistry(this);
+            this.testcaseProviders = new TestCaseProviders(this);
+            this.dataPointProviders = new DataPointProviders(this);
+
+		    this.extensions = new ArrayList();
+		    extensions.Add(suiteBuilders);
+		    extensions.Add(testBuilders);
+		    extensions.Add(testDecorators);
+		    extensions.Add(listeners);
+		    extensions.Add(frameworks);
+		    extensions.Add(testcaseProviders);
+            extensions.Add(dataPointProviders);
+
+			this.supportedTypes = ExtensionType.Core;
+
+			// TODO: This should be somewhere central
+//			string logfile = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
+//			logfile = Path.Combine( logfile, "NUnit" );
+//			logfile = Path.Combine( logfile, "NUnitTest.log" );
+//
+//			appender = new log4net.Appender.ConsoleAppender();
+////			appender.File = logfile;
+////			appender.AppendToFile = true;
+////			appender.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
+//			appender.Layout = new log4net.Layout.PatternLayout(
+//				"%date{ABSOLUTE} %-5level [%4thread] %logger{1}: PID=%property{PID} %message%newline" );
+//			appender.Threshold = log4net.Core.Level.All;
+//			log4net.Config.BasicConfigurator.Configure(appender);
+		}
+		#endregion
+
+		#region Public Properties
+
+		public bool Initialized
+		{
+			get { return initialized; }
+		}
+
+		/// <summary>
+		/// Our AddinRegistry may be set from outside or passed into the domain
+		/// </summary>
+		public IAddinRegistry AddinRegistry
+		{
+			get 
+			{
+				if ( addinRegistry == null )
+					addinRegistry = AppDomain.CurrentDomain.GetData( "AddinRegistry" ) as IAddinRegistry;
+
+				return addinRegistry; 
+			}
+			set { addinRegistry = value; }
+		}
+		#endregion
+
+		#region Internal Properties
+		internal ISuiteBuilder SuiteBuilders
+		{
+			get { return suiteBuilders; }
+		}
+
+		internal ITestCaseBuilder2 TestBuilders
+		{
+			get { return testBuilders; }
+		}
+
+		internal ITestDecorator TestDecorators
+		{
+			get { return testDecorators; }
+		}
+
+		internal EventListener Listeners
+		{
+			get { return listeners; }
+		}
+
+		internal FrameworkRegistry TestFrameworks
+		{
+			get { return frameworks; }
+		}
+
+        internal TestCaseProviders TestCaseProviders
+	    {
+            get { return testcaseProviders; }
+	    }
+
+	    #endregion
+
+		#region Public Methods	
+		public void InstallBuiltins()
+		{
+			log.Info( "Installing Builtins" );
+
+			// Define NUnit Frameworks
+			frameworks.Register( "NUnit", "nunit.framework" );
+            frameworks.Register("NUnitLite", "NUnitLite");
+
+			// Install builtin SuiteBuilders
+			suiteBuilders.Install( new NUnitTestFixtureBuilder() );
+			suiteBuilders.Install( new SetUpFixtureBuilder() );
+
+            // Install builtin TestCaseBuilder
+            testBuilders.Install( new NUnitTestCaseBuilder() );
+            //testBuilders.Install(new TheoryBuilder());
+
+            // Install builtin TestCaseProviders
+            testcaseProviders.Install(new TestCaseParameterProvider());
+            testcaseProviders.Install(new TestCaseSourceProvider());
+            testcaseProviders.Install(new CombinatorialTestCaseProvider());
+
+            // Install builtin DataPointProvider
+            dataPointProviders.Install(new InlineDataPointProvider());
+            dataPointProviders.Install(new ValueSourceProvider());
+            dataPointProviders.Install(new DatapointProvider());
+		}
+
+		public void InstallAddins()
+		{
+			log.Info( "Installing Addins" );
+
+			if( AddinRegistry != null )
+			{
+				foreach (Addin addin in AddinRegistry.Addins)
+				{
+					if ( (this.ExtensionTypes & addin.ExtensionType) != 0 )
+					{
+						AddinStatus status = AddinStatus.Unknown;
+						string message = null;
+
+						try
+						{
+							Type type = Type.GetType(addin.TypeName);
+							if ( type == null )
+							{
+								status = AddinStatus.Error;
+								message = string.Format( "Unable to locate {0} Type", addin.TypeName );
+							}
+							else if ( !InstallAddin( type ) )
+							{
+								status = AddinStatus.Error;
+								message = "Install method returned false";
+							}
+							else
+							{
+								status = AddinStatus.Loaded;
+							}
+						}
+						catch( Exception ex )
+						{
+							status = AddinStatus.Error;
+							message = ex.ToString(); 				
+						}
+
+						AddinRegistry.SetStatus( addin.Name, status, message );
+						if ( status != AddinStatus.Loaded )
+						{
+							log.Error( "Failed to load {0}", addin.Name );
+							log.Error( message );
+						}
+					}
+				}
+			}
+		}
+
+		public void InstallAdhocExtensions( Assembly assembly )
+		{
+			foreach ( Type type in assembly.GetExportedTypes() )
+			{
+				if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )
+					InstallAddin( type );
+			}
+		}
+		#endregion
+
+		#region Helper Methods
+		private bool InstallAddin( Type type )
+		{
+			ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
+			object obj = ctor.Invoke( new object[0] );
+			IAddin theAddin = (IAddin)obj;
+
+			return theAddin.Install(this);
+		}
+		#endregion
+
+		#region IService Members
+
+		public void UnloadService()
+		{
+			// TODO:  Add CoreExtensions.UnloadService implementation
+		}
+
+		public void InitializeService()
+		{
+			InstallBuiltins();
+			InstallAddins();
+
+			initialized = true;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/CultureDetector.cs b/src/NUnitCore/core/CultureDetector.cs
index 91b60ba..b6e167d 100644
--- a/src/NUnitCore/core/CultureDetector.cs
+++ b/src/NUnitCore/core/CultureDetector.cs
@@ -1,127 +1,127 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Globalization;
-
-namespace NUnit.Core
-{
-	public class CultureDetector
-	{
-		private CultureInfo currentCulture;
-
-		// Set whenever we fail to support a list of platforms
-		private string reason = string.Empty;
-
-		/// <summary>
-		/// Default constructor uses the current culutre.
-		/// </summary>
-		public CultureDetector()
-		{
-			this.currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
-		}
-
-		/// <summary>
-		/// Contruct a CultureHelper for a particular culture for testing.
-		/// </summary>
-		/// <param name="culture">The culture to be used</param>
-		public CultureDetector( string culture )
-		{
-			this.currentCulture = new CultureInfo( culture );
-		}
-
-		/// <summary>
-		/// Test to determine if one of a collection of culturess
-		/// is being used currently.
-		/// </summary>
-		/// <param name="cultures"></param>
-		/// <returns></returns>
-		public bool IsCultureSupported( string[] cultures )
-		{
-			foreach( string culture in cultures )
-				if ( IsCultureSupported( culture ) )
-					return true;
-
-			return false;
-		}
-
-		/// <summary>
-		/// Tests to determine if the current culture is supported
-		/// based on a culture attribute.
-		/// </summary>
-		/// <param name="platformAttribute">The attribute to examine</param>
-		/// <returns></returns>
-		public bool IsCultureSupported( Attribute cultureAttribute )
-		{
-			//Use reflection to avoid dependency on a particular framework version
-			string include = (string)Reflect.GetPropertyValue( 
-				cultureAttribute, "Include", 
-				BindingFlags.Public | BindingFlags.Instance );
-
-			string exclude = (string)Reflect.GetPropertyValue(
-				cultureAttribute, "Exclude", 
-				BindingFlags.Public | BindingFlags.Instance );
-
-			try
-			{
-				if (include != null && !IsCultureSupported(include))
-				{
-					reason = string.Format("Only supported under culture {0}", include);
-					return false;
-				}
-
-				if (exclude != null && IsCultureSupported(exclude))
-				{
-					reason = string.Format("Not supported under culture {0}", exclude);
-					return false;
-				}
-			}
-			catch( ArgumentException ex )
-			{
-				reason = string.Format( "Invalid culture: {0}", ex.ParamName );
-				return false; 
-			}
-
-			return true;
-		}
-
-		/// <summary>
-		/// Test to determine if the a particular culture or comma-
-		/// delimited set of cultures is in use.
-		/// </summary>
-		/// <param name="platform">Name of the culture or comma-separated list of culture names</param>
-		/// <returns>True if the culture is in use on the system</returns>
-		public bool IsCultureSupported( string culture )
-		{
-			culture = culture.Trim();
-
-			if ( culture.IndexOf( ',' ) >= 0 )
-			{
-				if ( IsCultureSupported( culture.Split( new char[] { ',' } ) ) )
-					return true;
-			}
-			else
-			{
-				if( this.currentCulture.Name == culture || this.currentCulture.TwoLetterISOLanguageName == culture)
-					return true;
-			}
-
-			this.reason = "Only supported under culture " + culture;
-			return false;
-		}
-
-		/// <summary>
-		/// Return the last failure reason. Results are not
-		/// defined if called before IsSupported( Attribute )
-		/// is called.
-		/// </summary>
-		public string Reason
-		{
-			get { return reason; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Globalization;
+
+namespace NUnit.Core
+{
+	public class CultureDetector
+	{
+		private CultureInfo currentCulture;
+
+		// Set whenever we fail to support a list of platforms
+		private string reason = string.Empty;
+
+		/// <summary>
+		/// Default constructor uses the current culutre.
+		/// </summary>
+		public CultureDetector()
+		{
+			this.currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+		}
+
+		/// <summary>
+		/// Contruct a CultureHelper for a particular culture for testing.
+		/// </summary>
+		/// <param name="culture">The culture to be used</param>
+		public CultureDetector( string culture )
+		{
+			this.currentCulture = new CultureInfo( culture );
+		}
+
+		/// <summary>
+		/// Test to determine if one of a collection of culturess
+		/// is being used currently.
+		/// </summary>
+		/// <param name="cultures"></param>
+		/// <returns></returns>
+		public bool IsCultureSupported( string[] cultures )
+		{
+			foreach( string culture in cultures )
+				if ( IsCultureSupported( culture ) )
+					return true;
+
+			return false;
+		}
+
+		/// <summary>
+		/// Tests to determine if the current culture is supported
+		/// based on a culture attribute.
+		/// </summary>
+		/// <param name="platformAttribute">The attribute to examine</param>
+		/// <returns></returns>
+		public bool IsCultureSupported( Attribute cultureAttribute )
+		{
+			//Use reflection to avoid dependency on a particular framework version
+			string include = (string)Reflect.GetPropertyValue( 
+				cultureAttribute, "Include", 
+				BindingFlags.Public | BindingFlags.Instance );
+
+			string exclude = (string)Reflect.GetPropertyValue(
+				cultureAttribute, "Exclude", 
+				BindingFlags.Public | BindingFlags.Instance );
+
+			try
+			{
+				if (include != null && !IsCultureSupported(include))
+				{
+					reason = string.Format("Only supported under culture {0}", include);
+					return false;
+				}
+
+				if (exclude != null && IsCultureSupported(exclude))
+				{
+					reason = string.Format("Not supported under culture {0}", exclude);
+					return false;
+				}
+			}
+			catch( ArgumentException ex )
+			{
+				reason = string.Format( "Invalid culture: {0}", ex.ParamName );
+				return false; 
+			}
+
+			return true;
+		}
+
+		/// <summary>
+		/// Test to determine if the a particular culture or comma-
+		/// delimited set of cultures is in use.
+		/// </summary>
+		/// <param name="platform">Name of the culture or comma-separated list of culture names</param>
+		/// <returns>True if the culture is in use on the system</returns>
+		public bool IsCultureSupported( string culture )
+		{
+			culture = culture.Trim();
+
+			if ( culture.IndexOf( ',' ) >= 0 )
+			{
+				if ( IsCultureSupported( culture.Split( new char[] { ',' } ) ) )
+					return true;
+			}
+			else
+			{
+				if( this.currentCulture.Name == culture || this.currentCulture.TwoLetterISOLanguageName == culture)
+					return true;
+			}
+
+			this.reason = "Only supported under culture " + culture;
+			return false;
+		}
+
+		/// <summary>
+		/// Return the last failure reason. Results are not
+		/// defined if called before IsSupported( Attribute )
+		/// is called.
+		/// </summary>
+		public string Reason
+		{
+			get { return reason; }
+		}
+	}
+}
diff --git a/src/NUnitCore/core/DirectorySwapper.cs b/src/NUnitCore/core/DirectorySwapper.cs
index eb80b30..5370f5c 100644
--- a/src/NUnitCore/core/DirectorySwapper.cs
+++ b/src/NUnitCore/core/DirectorySwapper.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Utility class that allows changing the current directory 
-	/// for the duration of some lexical scope and guaranteeing
-	/// that it will be restored upon exit.
-	/// 
-	/// Use it as follows:
-	///    using( new DirectorySwapper( @"X:\New\Path" )
-	///    {
-	///        // Code that operates in the new current directory
-	///    }
-	///    
-	/// Instantiating DirectorySwapper without a path merely
-	/// saves the current directory, but does not change it.
-	/// </summary>
-	public class DirectorySwapper : IDisposable
-	{
-		private string savedDirectoryName;
-
-		public DirectorySwapper() : this( null ) { }
-
-		public DirectorySwapper( string directoryName )
-		{
-			savedDirectoryName = Environment.CurrentDirectory;
-			
-			if ( directoryName != null && directoryName != string.Empty )
-				Environment.CurrentDirectory = directoryName;
-		}
-
-		public void Dispose()
-		{
-			Environment.CurrentDirectory = savedDirectoryName;
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Utility class that allows changing the current directory 
+	/// for the duration of some lexical scope and guaranteeing
+	/// that it will be restored upon exit.
+	/// 
+	/// Use it as follows:
+	///    using( new DirectorySwapper( @"X:\New\Path" )
+	///    {
+	///        // Code that operates in the new current directory
+	///    }
+	///    
+	/// Instantiating DirectorySwapper without a path merely
+	/// saves the current directory, but does not change it.
+	/// </summary>
+	public class DirectorySwapper : IDisposable
+	{
+		private string savedDirectoryName;
+
+		public DirectorySwapper() : this( null ) { }
+
+		public DirectorySwapper( string directoryName )
+		{
+			savedDirectoryName = Environment.CurrentDirectory;
+			
+			if ( directoryName != null && directoryName != string.Empty )
+				Environment.CurrentDirectory = directoryName;
+		}
+
+		public void Dispose()
+		{
+			Environment.CurrentDirectory = savedDirectoryName;
+		}
+	}
+}
diff --git a/src/NUnitCore/core/DomainAgent.cs b/src/NUnitCore/core/DomainAgent.cs
index 6448ad7..805d42f 100644
--- a/src/NUnitCore/core/DomainAgent.cs
+++ b/src/NUnitCore/core/DomainAgent.cs
@@ -1,162 +1,162 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Represesents an agent that controls running of tests in
-    /// an application domain.
-	/// </summary>
-	public class DomainAgent : TestAgent
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(DomainAgent));
-
-        /// <summary>
-        /// Factory method used to create a DomainAgent in an AppDomain.
-        /// </summary>
-        /// <param name="targetDomain">The domain in which to create the agent</param>
-        /// <param name="traceLevel">The level of internal tracing to use</param>
-        /// <returns>A proxy for the DomainAgent in the other domain</returns>
-        static public DomainAgent CreateInstance(AppDomain targetDomain)
-        {
-#if CLR_2_0 || CLR_4_0
-            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
-                targetDomain,
-#else
-			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstance(
-#endif
- Assembly.GetExecutingAssembly().FullName,
-                typeof(DomainAgent).FullName,
-                false, BindingFlags.Default, null, null, null, null, null);
-
-            object obj = oh.Unwrap();
-            return (DomainAgent)obj;
-        }
-
-        private bool isActive;
-
-        /// <summary>
-        /// Constructs a DomainAgent specifying the trace level.
-        /// </summary>
-        /// <param name="traceLevel">The level of internal tracing to use</param>
-		public DomainAgent() : base( Guid.NewGuid() ) { }
-
-		#region Public Methods
-        /// <summary>
-        /// Creates a TestRunner for use in loading and running
-        /// tests in this domain. DomainAgent always creates
-        /// a RemoteTestRunner.
-        /// </summary>
-        /// <param name="runnerID">Runner ID to be used</param>
-        /// <returns>A TestRunner</returns>
-		public override TestRunner CreateRunner(int runnerID)
-		{
-            log.Info("Creating RemoteTestRunner");
-			return new RemoteTestRunner(runnerID);
-		}
-
-        /// <summary>
-        /// Starts the agent if it is no aready started.
-        /// </summary>
-        /// <returns></returns>
-        public override bool Start()
-        {
-            if (!this.isActive)
-            {
-                log.Info("Starting");
-                this.isActive = true;
-            }
-
-            return true;
-        }
-
-        /// <summary>
-        /// Stops the agent if it is running
-        /// </summary>
-        public override void Stop()
-        {
-            if (this.isActive)
-            {
-                log.Info("Stopping");
-                this.isActive = false;
-            }
-        }
-
-        public AppDomain AppDomain
-        {
-            get { return AppDomain.CurrentDomain; }
-        }
-		#endregion
-    }
-
-    public class DomainInitializer : MarshalByRefObject
-    {
-        static Logger log;
-
-        /// <summary>
-        /// Factory method used to create a DomainInitializer in an AppDomain.
-        /// </summary>
-        /// <param name="targetDomain">The domain in which to create the agent</param>
-        /// <param name="traceLevel">The level of internal tracing to use</param>
-        /// <returns>A proxy for the DomainAgent in the other domain</returns>
-        static public DomainInitializer CreateInstance(AppDomain targetDomain)
-        {
-#if CLR_2_0 || CLR_4_0
-            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstanceFrom(
-                targetDomain,
-#else
-			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstanceFrom(
-#endif
-                typeof(DomainInitializer).Assembly.CodeBase,
-                typeof(DomainInitializer).FullName,
-                false, BindingFlags.Default, null, null, null, null, null);
-
-            object obj = oh.Unwrap();
-            return (DomainInitializer)obj;
-        }
-
-        public void InitializeDomain(int level)
-        {
-            InternalTraceLevel traceLevel = (InternalTraceLevel)level;
-
-            InternalTrace.Initialize("%a_%p.log", traceLevel);
-            log = InternalTrace.GetLogger(typeof(DomainInitializer));
-
-            AppDomain domain = AppDomain.CurrentDomain;
-            
-            log.Info("Initializing domain {0}", domain.FriendlyName);
-            log.Debug("  Base Directory: {0}", domain.BaseDirectory);
-            log.Debug("  Probing Path: {0}", domain.SetupInformation.PrivateBinPath);
-
-            domain.DomainUnload += new EventHandler(OnDomainUnload);
-
-            AssemblyResolver resolver = new AssemblyResolver();
-            resolver.AddDirectory(NUnitConfiguration.NUnitLibDirectory);
-            resolver.AddDirectory(NUnitConfiguration.AddinDirectory);
-						
-			// 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)
-        {
-            log.Info("Unloading domain " + AppDomain.CurrentDomain.FriendlyName);
-            InternalTrace.Flush();
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Represesents an agent that controls running of tests in
+    /// an application domain.
+	/// </summary>
+	public class DomainAgent : TestAgent
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(DomainAgent));
+
+        /// <summary>
+        /// Factory method used to create a DomainAgent in an AppDomain.
+        /// </summary>
+        /// <param name="targetDomain">The domain in which to create the agent</param>
+        /// <param name="traceLevel">The level of internal tracing to use</param>
+        /// <returns>A proxy for the DomainAgent in the other domain</returns>
+        static public DomainAgent CreateInstance(AppDomain targetDomain)
+        {
+#if CLR_2_0 || CLR_4_0
+            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
+                targetDomain,
+#else
+			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstance(
+#endif
+ Assembly.GetExecutingAssembly().FullName,
+                typeof(DomainAgent).FullName,
+                false, BindingFlags.Default, null, null, null, null, null);
+
+            object obj = oh.Unwrap();
+            return (DomainAgent)obj;
+        }
+
+        private bool isActive;
+
+        /// <summary>
+        /// Constructs a DomainAgent specifying the trace level.
+        /// </summary>
+        /// <param name="traceLevel">The level of internal tracing to use</param>
+		public DomainAgent() : base( Guid.NewGuid() ) { }
+
+		#region Public Methods
+        /// <summary>
+        /// Creates a TestRunner for use in loading and running
+        /// tests in this domain. DomainAgent always creates
+        /// a RemoteTestRunner.
+        /// </summary>
+        /// <param name="runnerID">Runner ID to be used</param>
+        /// <returns>A TestRunner</returns>
+		public override TestRunner CreateRunner(int runnerID)
+		{
+            log.Info("Creating RemoteTestRunner");
+			return new RemoteTestRunner(runnerID);
+		}
+
+        /// <summary>
+        /// Starts the agent if it is no aready started.
+        /// </summary>
+        /// <returns></returns>
+        public override bool Start()
+        {
+            if (!this.isActive)
+            {
+                log.Info("Starting");
+                this.isActive = true;
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// Stops the agent if it is running
+        /// </summary>
+        public override void Stop()
+        {
+            if (this.isActive)
+            {
+                log.Info("Stopping");
+                this.isActive = false;
+            }
+        }
+
+        public AppDomain AppDomain
+        {
+            get { return AppDomain.CurrentDomain; }
+        }
+		#endregion
+    }
+
+    public class DomainInitializer : MarshalByRefObject
+    {
+        static Logger log;
+
+        /// <summary>
+        /// Factory method used to create a DomainInitializer in an AppDomain.
+        /// </summary>
+        /// <param name="targetDomain">The domain in which to create the agent</param>
+        /// <param name="traceLevel">The level of internal tracing to use</param>
+        /// <returns>A proxy for the DomainAgent in the other domain</returns>
+        static public DomainInitializer CreateInstance(AppDomain targetDomain)
+        {
+#if CLR_2_0 || CLR_4_0
+            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstanceFrom(
+                targetDomain,
+#else
+			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstanceFrom(
+#endif
+                typeof(DomainInitializer).Assembly.CodeBase,
+                typeof(DomainInitializer).FullName,
+                false, BindingFlags.Default, null, null, null, null, null);
+
+            object obj = oh.Unwrap();
+            return (DomainInitializer)obj;
+        }
+
+        public void InitializeDomain(int level)
+        {
+            InternalTraceLevel traceLevel = (InternalTraceLevel)level;
+
+            InternalTrace.Initialize("%a_%p.log", traceLevel);
+            log = InternalTrace.GetLogger(typeof(DomainInitializer));
+
+            AppDomain domain = AppDomain.CurrentDomain;
+            
+            log.Info("Initializing domain {0}", domain.FriendlyName);
+            log.Debug("  Base Directory: {0}", domain.BaseDirectory);
+            log.Debug("  Probing Path: {0}", domain.SetupInformation.PrivateBinPath);
+
+            domain.DomainUnload += new EventHandler(OnDomainUnload);
+
+            AssemblyResolver resolver = new AssemblyResolver();
+            resolver.AddDirectory(NUnitConfiguration.NUnitLibDirectory);
+            resolver.AddDirectory(NUnitConfiguration.AddinDirectory);
+						
+			// 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)
+        {
+            log.Info("Unloading domain " + AppDomain.CurrentDomain.FriendlyName);
+            InternalTrace.Flush();
+        }
+    }
+}
diff --git a/src/NUnitCore/core/EventListenerTextWriter.cs b/src/NUnitCore/core/EventListenerTextWriter.cs
index 86c5ba9..8e408c9 100644
--- a/src/NUnitCore/core/EventListenerTextWriter.cs
+++ b/src/NUnitCore/core/EventListenerTextWriter.cs
@@ -1,114 +1,114 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-namespace NUnit.Core
-{
-	using System;
-	using System.IO;
-	using System.Text;
-
-	public class EventListenerTextWriter : TextWriter
-	{
-		private EventListener eventListener;
-		private TestOutputType type;
-
-		public EventListenerTextWriter( EventListener eventListener, TestOutputType type )
-		{
-			this.eventListener = eventListener;
-			this.type = type;
-		}
-		override public void Write(char aChar)
-		{
-			this.eventListener.TestOutput( new TestOutput( aChar.ToString(), this.type ) );
-		}
-
-		override public void Write(string aString)
-		{
-			this.eventListener.TestOutput( new TestOutput( aString, this.type ) );
-		}
-
-		override public void WriteLine(string aString)
-		{
-			this.eventListener.TestOutput( new TestOutput( aString + this.NewLine, this.type ) );
-		}
-
-		override public System.Text.Encoding Encoding
-		{
-			get { return Encoding.Default; }
-		}
-	}
-
-	/// <summary>
-	/// This wrapper adds buffering to improve cross-domain performance.
-	/// </summary>
-	public class BufferedEventListenerTextWriter : TextWriter
-	{
-		private EventListener eventListener;
-		private TestOutputType type;
-		private const int MAX_BUFFER = 1024;
-		private StringBuilder sb = new StringBuilder( MAX_BUFFER );
-
-		public BufferedEventListenerTextWriter( EventListener eventListener, TestOutputType type )
-		{
-			this.eventListener = eventListener;
-			this.type = type;
-		}
-
-		public override Encoding Encoding
-		{
-			get
-			{
-				return Encoding.Default;
-			}
-		}
-	
-		override public void Write(char ch)
-		{
-			lock( sb )
-			{
-				sb.Append( ch );
-				this.CheckBuffer();
-			}
-		}
-
-		override public void Write(string str)
-		{
-			lock( sb )
-			{
-				sb.Append( str );
-				this.CheckBuffer();
-			}
-		}
-
-		override public void WriteLine(string str)
-		{
-			lock( sb )
-			{
-				sb.Append( str );
-				sb.Append( base.NewLine );
-				this.CheckBuffer();
-			}
-		}
-
-		override public void Flush()
-		{
-			if ( sb.Length > 0 )
-			{
-				lock( sb )
-				{
-					TestOutput output = new TestOutput(sb.ToString(), this.type);
-					this.eventListener.TestOutput( output );
-					sb.Length = 0;
-				}
-			}
-		}
-
-		private void CheckBuffer()
-		{
-			if ( sb.Length >= MAX_BUFFER )
-				this.Flush();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+namespace NUnit.Core
+{
+	using System;
+	using System.IO;
+	using System.Text;
+
+	public class EventListenerTextWriter : TextWriter
+	{
+		private EventListener eventListener;
+		private TestOutputType type;
+
+		public EventListenerTextWriter( EventListener eventListener, TestOutputType type )
+		{
+			this.eventListener = eventListener;
+			this.type = type;
+		}
+		override public void Write(char aChar)
+		{
+			this.eventListener.TestOutput( new TestOutput( aChar.ToString(), this.type ) );
+		}
+
+		override public void Write(string aString)
+		{
+			this.eventListener.TestOutput( new TestOutput( aString, this.type ) );
+		}
+
+		override public void WriteLine(string aString)
+		{
+			this.eventListener.TestOutput( new TestOutput( aString + this.NewLine, this.type ) );
+		}
+
+		override public System.Text.Encoding Encoding
+		{
+			get { return Encoding.Default; }
+		}
+	}
+
+	/// <summary>
+	/// This wrapper adds buffering to improve cross-domain performance.
+	/// </summary>
+	public class BufferedEventListenerTextWriter : TextWriter
+	{
+		private EventListener eventListener;
+		private TestOutputType type;
+		private const int MAX_BUFFER = 1024;
+		private StringBuilder sb = new StringBuilder( MAX_BUFFER );
+
+		public BufferedEventListenerTextWriter( EventListener eventListener, TestOutputType type )
+		{
+			this.eventListener = eventListener;
+			this.type = type;
+		}
+
+		public override Encoding Encoding
+		{
+			get
+			{
+				return Encoding.Default;
+			}
+		}
+	
+		override public void Write(char ch)
+		{
+			lock( sb )
+			{
+				sb.Append( ch );
+				this.CheckBuffer();
+			}
+		}
+
+		override public void Write(string str)
+		{
+			lock( sb )
+			{
+				sb.Append( str );
+				this.CheckBuffer();
+			}
+		}
+
+		override public void WriteLine(string str)
+		{
+			lock( sb )
+			{
+				sb.Append( str );
+				sb.Append( base.NewLine );
+				this.CheckBuffer();
+			}
+		}
+
+		override public void Flush()
+		{
+			if ( sb.Length > 0 )
+			{
+				lock( sb )
+				{
+					TestOutput output = new TestOutput(sb.ToString(), this.type);
+					this.eventListener.TestOutput( output );
+					sb.Length = 0;
+				}
+			}
+		}
+
+		private void CheckBuffer()
+		{
+			if ( sb.Length >= MAX_BUFFER )
+				this.Flush();
+		}
+	}
+}
diff --git a/src/NUnitCore/core/EventPump.cs b/src/NUnitCore/core/EventPump.cs
index 4fefd5a..5084917 100644
--- a/src/NUnitCore/core/EventPump.cs
+++ b/src/NUnitCore/core/EventPump.cs
@@ -1,221 +1,221 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Threading;
-
-    /// <summary>
-    /// The EventPumpState enum represents the state of an
-    /// EventPump.
-    /// </summary>
-    public enum EventPumpState
-    {
-        Stopped,
-        Pumping,
-        Stopping
-    }
-
-	/// <summary>
-	/// EventPump pulls events out of an EventQueue and sends
-	/// them to a listener. It is used to send events back to
-	/// the client without using the CallContext of the test
-	/// runner thread.
-	/// </summary>
-	public class EventPump : IDisposable
-	{
-        private static Logger log = InternalTrace.GetLogger(typeof(EventPump));
-
-		#region Instance Variables
-
-        /// <summary>
-        /// The handle on which a thread enqueuing an event with <see cref="Event.IsSynchronous"/> == <c>true</c>
-        /// waits, until the EventPump has sent the event to its listeners.
-        /// </summary>
-        private readonly AutoResetEvent synchronousEventSent = new AutoResetEvent(false);
-
-		/// <summary>
-		/// The downstream listener to which we send events
-		/// </summary>
-		private EventListener eventListener;
-		
-		/// <summary>
-		/// The queue that holds our events
-		/// </summary>
-		private EventQueue events;
-		
-		/// <summary>
-		/// Thread to do the pumping
-		/// </summary>
-		private Thread pumpThread;
-
-		/// <summary>
-		/// The current state of the eventpump
-		/// </summary>
-		private volatile EventPumpState pumpState = EventPumpState.Stopped;
-
-		/// <summary>
-		/// If true, stop after sending RunFinished
-		/// </summary>
-		private bool autostop;
-
-        private string name;
-
-		#endregion
-
-		#region Constructor
-
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="eventListener">The EventListener to receive events</param>
-		/// <param name="events">The event queue to pull events from</param>
-		/// <param name="autostop">Set to true to stop pump after RunFinished</param>
-		public EventPump( EventListener eventListener, EventQueue events, bool autostop)
-		{
-			this.eventListener = eventListener;
-			this.events = events;
-            this.events.SetWaitHandleForSynchronizedEvents(this.synchronousEventSent);
-            this.autostop = autostop;
-		}
-
-		#endregion
-
-		#region Properties
-
-		/// <summary>
-		/// Gets or sets the current state of the pump
-		/// </summary>
-        /// <remarks>
-        /// On <c>volatile</c> and <see cref="Thread.MemoryBarrier"/>, see
-        /// "http://www.albahari.com/threading/part4.aspx".
-        /// </remarks>
-		public EventPumpState PumpState
-		{
-		    get
-		    {
-                Thread.MemoryBarrier();
-		        return pumpState;
-		    }
-
-		    set
-		    {
-		        this.pumpState = value;
-                Thread.MemoryBarrier();
-		    }
-		}
-
-        /// <summary>
-        /// Gets or sets the name of this EventPump
-        /// (used only internally and for testing).
-        /// </summary>
-	    public string Name
-	    {
-	        get
-	        {
-	            return this.name;
-	        }
-	        set
-	        {
-	            this.name = value;
-	        }
-	    }
-
-		#endregion
-
-		#region Public Methods
-
-		/// <summary>
-		/// Disposes and stops the pump.
-		/// Disposes the used WaitHandle, too.
-		/// </summary>
-		public void Dispose()
-		{
-			Stop();
-            ((IDisposable)this.synchronousEventSent).Dispose();
-        }
-
-		/// <summary>
-		/// Start the pump
-		/// </summary>
-		public void Start()
-		{
-			if ( this.PumpState == EventPumpState.Stopped )  // Ignore if already started
-			{
-				this.pumpThread = new Thread( new ThreadStart( PumpThreadProc ) );
-                this.pumpThread.Name = "EventPumpThread" + this.Name;
-                this.pumpThread.Priority = ThreadPriority.Highest;
-                this.PumpState = EventPumpState.Pumping;
-                this.pumpThread.Start();
-			}
-		}
-
-		/// <summary>
-		/// Tell the pump to stop after emptying the queue.
-		/// </summary>
-		public void Stop()
-		{
-			if ( this.PumpState == EventPumpState.Pumping ) // Ignore extra calls
-			{
-                this.PumpState = EventPumpState.Stopping;
-                this.events.Stop();
-                this.pumpThread.Join();
-			}
-		}
-
-		#endregion
-
-		#region PumpThreadProc
-
-		/// <summary>
-		/// Our thread proc for removing items from the event
-		/// queue and sending them on. Note that this would
-		/// need to do more locking if any other thread were
-		/// removing events from the queue.
-		/// </summary>
-		private void PumpThreadProc()
-		{
-			EventListener hostListeners = CoreExtensions.Host.Listeners;
-            try
-            {
-                while (true)
-                {
-                    Event e = this.events.Dequeue( this.PumpState == EventPumpState.Pumping );
-                    if ( e == null )
-                        break;
-                    try
-                    {
-                        e.Send(this.eventListener);
-						e.Send(hostListeners);
-                    }
-                    catch (Exception ex)
-                    {
-                        log.Error( "Exception in event handler", ex );
-                    }
-                    finally
-                    {
-                        if ( e.IsSynchronous )
-                            this.synchronousEventSent.Set();
-                    }
-
-                    if ( this.autostop && e is RunFinishedEvent )
-                        this.PumpState = EventPumpState.Stopping;
-                }
-            }
-            catch (Exception ex)
-            {
-                log.Error( "Exception in pump thread", ex );
-            }
-			finally
-			{
-                this.PumpState = EventPumpState.Stopped;
-                //pumpThread = null;
-			}
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.Threading;
+
+    /// <summary>
+    /// The EventPumpState enum represents the state of an
+    /// EventPump.
+    /// </summary>
+    public enum EventPumpState
+    {
+        Stopped,
+        Pumping,
+        Stopping
+    }
+
+	/// <summary>
+	/// EventPump pulls events out of an EventQueue and sends
+	/// them to a listener. It is used to send events back to
+	/// the client without using the CallContext of the test
+	/// runner thread.
+	/// </summary>
+	public class EventPump : IDisposable
+	{
+        private static Logger log = InternalTrace.GetLogger(typeof(EventPump));
+
+		#region Instance Variables
+
+        /// <summary>
+        /// The handle on which a thread enqueuing an event with <see cref="Event.IsSynchronous"/> == <c>true</c>
+        /// waits, until the EventPump has sent the event to its listeners.
+        /// </summary>
+        private readonly AutoResetEvent synchronousEventSent = new AutoResetEvent(false);
+
+		/// <summary>
+		/// The downstream listener to which we send events
+		/// </summary>
+		private EventListener eventListener;
+		
+		/// <summary>
+		/// The queue that holds our events
+		/// </summary>
+		private EventQueue events;
+		
+		/// <summary>
+		/// Thread to do the pumping
+		/// </summary>
+		private Thread pumpThread;
+
+		/// <summary>
+		/// The current state of the eventpump
+		/// </summary>
+		private volatile EventPumpState pumpState = EventPumpState.Stopped;
+
+		/// <summary>
+		/// If true, stop after sending RunFinished
+		/// </summary>
+		private bool autostop;
+
+        private string name;
+
+		#endregion
+
+		#region Constructor
+
+		/// <summary>
+		/// Constructor
+		/// </summary>
+		/// <param name="eventListener">The EventListener to receive events</param>
+		/// <param name="events">The event queue to pull events from</param>
+		/// <param name="autostop">Set to true to stop pump after RunFinished</param>
+		public EventPump( EventListener eventListener, EventQueue events, bool autostop)
+		{
+			this.eventListener = eventListener;
+			this.events = events;
+            this.events.SetWaitHandleForSynchronizedEvents(this.synchronousEventSent);
+            this.autostop = autostop;
+		}
+
+		#endregion
+
+		#region Properties
+
+		/// <summary>
+		/// Gets or sets the current state of the pump
+		/// </summary>
+        /// <remarks>
+        /// On <c>volatile</c> and <see cref="Thread.MemoryBarrier"/>, see
+        /// "http://www.albahari.com/threading/part4.aspx".
+        /// </remarks>
+		public EventPumpState PumpState
+		{
+		    get
+		    {
+                Thread.MemoryBarrier();
+		        return pumpState;
+		    }
+
+		    set
+		    {
+		        this.pumpState = value;
+                Thread.MemoryBarrier();
+		    }
+		}
+
+        /// <summary>
+        /// Gets or sets the name of this EventPump
+        /// (used only internally and for testing).
+        /// </summary>
+	    public string Name
+	    {
+	        get
+	        {
+	            return this.name;
+	        }
+	        set
+	        {
+	            this.name = value;
+	        }
+	    }
+
+		#endregion
+
+		#region Public Methods
+
+		/// <summary>
+		/// Disposes and stops the pump.
+		/// Disposes the used WaitHandle, too.
+		/// </summary>
+		public void Dispose()
+		{
+			Stop();
+            ((IDisposable)this.synchronousEventSent).Dispose();
+        }
+
+		/// <summary>
+		/// Start the pump
+		/// </summary>
+		public void Start()
+		{
+			if ( this.PumpState == EventPumpState.Stopped )  // Ignore if already started
+			{
+				this.pumpThread = new Thread( new ThreadStart( PumpThreadProc ) );
+                this.pumpThread.Name = "EventPumpThread" + this.Name;
+                this.pumpThread.Priority = ThreadPriority.Highest;
+                this.PumpState = EventPumpState.Pumping;
+                this.pumpThread.Start();
+			}
+		}
+
+		/// <summary>
+		/// Tell the pump to stop after emptying the queue.
+		/// </summary>
+		public void Stop()
+		{
+			if ( this.PumpState == EventPumpState.Pumping ) // Ignore extra calls
+			{
+                this.PumpState = EventPumpState.Stopping;
+                this.events.Stop();
+                this.pumpThread.Join();
+			}
+		}
+
+		#endregion
+
+		#region PumpThreadProc
+
+		/// <summary>
+		/// Our thread proc for removing items from the event
+		/// queue and sending them on. Note that this would
+		/// need to do more locking if any other thread were
+		/// removing events from the queue.
+		/// </summary>
+		private void PumpThreadProc()
+		{
+			EventListener hostListeners = CoreExtensions.Host.Listeners;
+            try
+            {
+                while (true)
+                {
+                    Event e = this.events.Dequeue( this.PumpState == EventPumpState.Pumping );
+                    if ( e == null )
+                        break;
+                    try
+                    {
+                        e.Send(this.eventListener);
+						e.Send(hostListeners);
+                    }
+                    catch (Exception ex)
+                    {
+                        log.Error( "Exception in event handler", ex );
+                    }
+                    finally
+                    {
+                        if ( e.IsSynchronous )
+                            this.synchronousEventSent.Set();
+                    }
+
+                    if ( this.autostop && e is RunFinishedEvent )
+                        this.PumpState = EventPumpState.Stopping;
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error( "Exception in pump thread", ex );
+            }
+			finally
+			{
+                this.PumpState = EventPumpState.Stopped;
+                //pumpThread = null;
+			}
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/EventQueue.cs b/src/NUnitCore/core/EventQueue.cs
index 1fc7c23..dd3e36d 100644
--- a/src/NUnitCore/core/EventQueue.cs
+++ b/src/NUnitCore/core/EventQueue.cs
@@ -1,350 +1,350 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Globalization;
-using System.Runtime.Serialization;
-using System.Threading;
-
-namespace NUnit.Core
-{
-	#region Individual Event Classes
-
-	/// <summary>
-	/// NUnit.Core.Event is the abstract base for all stored events.
-	/// An Event is the stored representation of a call to the 
-	/// EventListener interface and is used to record such calls
-	/// or to queue them for forwarding on another thread or at
-	/// a later time.
-	/// </summary>
-	public abstract class Event
-	{
-		abstract public void Send( EventListener listener );
-
-        /// <summary>
-        /// Gets a value indicating whether this event is delivered synchronously by the NUnit <see cref="EventPump"/>.
-        /// <para>
-        /// If <c>true</c>, and if <see cref="EventQueue.SetWaitHandleForSynchronizedEvents"/> has been used to 
-        /// set a WaitHandle, <see cref="EventQueue.Enqueue"/> blocks its calling thread until the <see cref="EventPump"/>
-        /// thread has delivered the event and sets the WaitHandle.
-        /// </para>
-        /// </summary>
-	    public virtual bool IsSynchronous
-	    {
-	        get
-	        {
-	            return false;
-	        }
-	    }
-
-        protected static Exception WrapUnserializableException(Exception ex)
-        {
-            string message = string.Format(
-                CultureInfo.InvariantCulture,
-                "(failed to serialize original Exception - original Exception follows){0}{1}",
-                Environment.NewLine,
-                ex);
-            return new Exception(message);
-        }
-	}
-
-	public class RunStartedEvent : Event
-	{
-		string name;
-		int testCount;
-
-		public RunStartedEvent( string name, int testCount )
-		{
-			this.name = name;
-			this.testCount = testCount;
-		}
-
-        public override bool IsSynchronous
-        {
-            get
-            {
-                return true;
-            }
-		}
-
-		public override void Send( EventListener listener )
-		{
-			listener.RunStarted(name, testCount);
-		}
-	}
-
-	public class RunFinishedEvent : Event
-	{
-		TestResult result;
-		Exception exception;
-
-		public RunFinishedEvent( TestResult result )
-		{
-			this.result = result;
-		}
-
-		public RunFinishedEvent( Exception exception )
-		{
-			this.exception = exception;
-		}
-
-		public override void Send( EventListener listener )
-		{
-			if ( this.exception != null )
-            {
-                try
-                {
-					listener.RunFinished( this.exception );
-                }
-                catch (SerializationException)
-                {
-                    Exception wrapped = WrapUnserializableException(this.exception);
-                    listener.RunFinished(wrapped);
-                }
-            }
-			else
-				listener.RunFinished( this.result );
-		}
-	}
-
-	public class TestStartedEvent : Event
-	{
-		TestName testName;
-
-		public TestStartedEvent( TestName testName )
-		{
-			this.testName = testName;
-		}
-
-        public override bool IsSynchronous
-        {
-            get
-            {
-                return true;
-            }
-        }
-        
-		public override void Send( EventListener listener )
-		{
-			listener.TestStarted( this.testName );
-		}
-	}
-			
-	public class TestFinishedEvent : Event
-	{
-		TestResult result;
-
-		public TestFinishedEvent( TestResult result )
-		{
-			this.result = result;
-		}
-
-		public override void Send( EventListener listener )
-		{
-			listener.TestFinished( this.result );
-		}
-	}
-
-	public class SuiteStartedEvent : Event
-	{
-		TestName suiteName;
-
-		public SuiteStartedEvent( TestName suiteName )
-		{
-			this.suiteName = suiteName;
-		}
-
-        public override bool IsSynchronous
-        {
-            get
-            {
-                return true;
-            }
-        }
-        
-		public override void Send( EventListener listener )
-		{
-			listener.SuiteStarted( this.suiteName );
-		}
-	}
-
-	public class SuiteFinishedEvent : Event
-	{
-		TestResult result;
-
-		public SuiteFinishedEvent( TestResult result )
-		{
-			this.result = result;
-		}
-
-		public override void Send( EventListener listener )
-		{
-			listener.SuiteFinished( this.result );
-		}
-	}
-
-	public class UnhandledExceptionEvent : Event
-	{
-		Exception exception;
-
-		public UnhandledExceptionEvent( Exception exception )
-		{
-			this.exception = exception;
-		}
-
-		public override void Send( EventListener listener )
-		{
-            try
-            {
-				listener.UnhandledException( this.exception );
-            }
-            catch (SerializationException)
-            {
-                Exception wrapped = WrapUnserializableException(this.exception);
-                listener.UnhandledException(wrapped);
-            }
-		}
-	}
-
-	public class OutputEvent : Event
-	{
-		TestOutput output;
-
-		public OutputEvent( TestOutput output )
-		{
-			this.output = output;
-		}
-
-		public override void Send( EventListener listener )
-		{
-			listener.TestOutput( this.output );
-		}
-	}
-
-	#endregion
-
-	/// <summary>
-	/// Implements a queue of work items each of which
-	/// is queued as a WaitCallback.
-	/// </summary>
-	public class EventQueue
-	{
-		private readonly Queue queue = new Queue();
-	    private readonly object syncRoot;
-        private bool stopped;
-
-        /// <summary>
-        /// WaitHandle for synchronous event delivery in <see cref="Enqueue"/>.
-        /// <para>
-        /// Having just one handle for the whole <see cref="EventQueue"/> implies that 
-        /// there may be only one producer (the test thread) for synchronous events.
-        /// If there can be multiple producers for synchronous events, one would have
-        /// to introduce one WaitHandle per event.
-        /// </para>
-        /// </summary>
-        private AutoResetEvent synchronousEventSent;
-
-		public int Count
-		{
-			get 
-			{
-				lock( this.syncRoot )
-				{
-					return this.queue.Count; 
-				}
-			}
-		}
-
-        public EventQueue()
-        {
-            this.syncRoot = queue.SyncRoot;
-        }
-
-        /// <summary>
-        /// Sets a handle on which to wait, when <see cref="Enqueue"/> is called
-        /// for an <see cref="Event"/> with <see cref="Event.IsSynchronous"/> == true.
-        /// </summary>
-        /// <param name="synchronousEventWaitHandle">
-        /// The wait handle on which to wait, when <see cref="Enqueue"/> is called
-        /// for an <see cref="Event"/> with <see cref="Event.IsSynchronous"/> == true.
-        /// <para>The caller is responsible for disposing this wait handle.</para>
-        /// </param>
-        public void SetWaitHandleForSynchronizedEvents( AutoResetEvent synchronousEventWaitHandle )
-        {
-            this.synchronousEventSent = synchronousEventWaitHandle;
-        }
-
-		public void Enqueue( Event e )
-		{
-			lock( this.syncRoot )
-			{
-				this.queue.Enqueue( e );
-				Monitor.Pulse( this.syncRoot );
-			}
-
-            if ( this.synchronousEventSent != null && e.IsSynchronous )
-            {
-                this.synchronousEventSent.WaitOne();
-            }
-            else
-            {
-                Thread.Sleep( 0 ); // give EventPump thread a chance to process the event
-            }
-		}
-
-        /// <summary>
-        /// Removes the first element from the queue and returns it (or <c>null</c>).
-        /// </summary>
-        /// <param name="blockWhenEmpty">
-        /// If <c>true</c> and the queue is empty, the calling thread is blocked until
-        /// either an element is enqueued, or <see cref="Stop"/> is called.
-        /// </param>
-        /// <returns>
-        /// <list type="bullet">
-        ///   <item>
-        ///     <term>If the queue not empty</term>
-        ///     <description>the first element.</description>
-        ///   </item>
-        ///   <item>
-        ///     <term>otherwise, if <paramref name="blockWhenEmpty"/>==<c>false</c> 
-        ///       or <see cref="Stop"/> has been called</term>
-        ///     <description><c>null</c>.</description>
-        ///   </item>
-        /// </list>
-        /// </returns>
-		public Event Dequeue( bool blockWhenEmpty )
-		{
-			lock( this.syncRoot )
-			{
-                while ( this.queue.Count == 0 )
-                {
-                    if ( blockWhenEmpty && !this.stopped )
-                    {
-                        Monitor.Wait( this.syncRoot );
-                    }
-                    else
-                    {
-                        return null;
-                    }
-                }
-
-				return (Event)this.queue.Dequeue();
-			}
-		}
-
-        public void Stop()
-        {
-            lock( this.syncRoot )
-            {
-                if ( !this.stopped )
-                {
-                    this.stopped = true;
-                    Monitor.Pulse( this.syncRoot );
-                }
-            }
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Globalization;
+using System.Runtime.Serialization;
+using System.Threading;
+
+namespace NUnit.Core
+{
+	#region Individual Event Classes
+
+	/// <summary>
+	/// NUnit.Core.Event is the abstract base for all stored events.
+	/// An Event is the stored representation of a call to the 
+	/// EventListener interface and is used to record such calls
+	/// or to queue them for forwarding on another thread or at
+	/// a later time.
+	/// </summary>
+	public abstract class Event
+	{
+		abstract public void Send( EventListener listener );
+
+        /// <summary>
+        /// Gets a value indicating whether this event is delivered synchronously by the NUnit <see cref="EventPump"/>.
+        /// <para>
+        /// If <c>true</c>, and if <see cref="EventQueue.SetWaitHandleForSynchronizedEvents"/> has been used to 
+        /// set a WaitHandle, <see cref="EventQueue.Enqueue"/> blocks its calling thread until the <see cref="EventPump"/>
+        /// thread has delivered the event and sets the WaitHandle.
+        /// </para>
+        /// </summary>
+	    public virtual bool IsSynchronous
+	    {
+	        get
+	        {
+	            return false;
+	        }
+	    }
+
+        protected static Exception WrapUnserializableException(Exception ex)
+        {
+            string message = string.Format(
+                CultureInfo.InvariantCulture,
+                "(failed to serialize original Exception - original Exception follows){0}{1}",
+                Environment.NewLine,
+                ex);
+            return new Exception(message);
+        }
+	}
+
+	public class RunStartedEvent : Event
+	{
+		string name;
+		int testCount;
+
+		public RunStartedEvent( string name, int testCount )
+		{
+			this.name = name;
+			this.testCount = testCount;
+		}
+
+        public override bool IsSynchronous
+        {
+            get
+            {
+                return true;
+            }
+		}
+
+		public override void Send( EventListener listener )
+		{
+			listener.RunStarted(name, testCount);
+		}
+	}
+
+	public class RunFinishedEvent : Event
+	{
+		TestResult result;
+		Exception exception;
+
+		public RunFinishedEvent( TestResult result )
+		{
+			this.result = result;
+		}
+
+		public RunFinishedEvent( Exception exception )
+		{
+			this.exception = exception;
+		}
+
+		public override void Send( EventListener listener )
+		{
+			if ( this.exception != null )
+            {
+                try
+                {
+					listener.RunFinished( this.exception );
+                }
+                catch (SerializationException)
+                {
+                    Exception wrapped = WrapUnserializableException(this.exception);
+                    listener.RunFinished(wrapped);
+                }
+            }
+			else
+				listener.RunFinished( this.result );
+		}
+	}
+
+	public class TestStartedEvent : Event
+	{
+		TestName testName;
+
+		public TestStartedEvent( TestName testName )
+		{
+			this.testName = testName;
+		}
+
+        public override bool IsSynchronous
+        {
+            get
+            {
+                return true;
+            }
+        }
+        
+		public override void Send( EventListener listener )
+		{
+			listener.TestStarted( this.testName );
+		}
+	}
+			
+	public class TestFinishedEvent : Event
+	{
+		TestResult result;
+
+		public TestFinishedEvent( TestResult result )
+		{
+			this.result = result;
+		}
+
+		public override void Send( EventListener listener )
+		{
+			listener.TestFinished( this.result );
+		}
+	}
+
+	public class SuiteStartedEvent : Event
+	{
+		TestName suiteName;
+
+		public SuiteStartedEvent( TestName suiteName )
+		{
+			this.suiteName = suiteName;
+		}
+
+        public override bool IsSynchronous
+        {
+            get
+            {
+                return true;
+            }
+        }
+        
+		public override void Send( EventListener listener )
+		{
+			listener.SuiteStarted( this.suiteName );
+		}
+	}
+
+	public class SuiteFinishedEvent : Event
+	{
+		TestResult result;
+
+		public SuiteFinishedEvent( TestResult result )
+		{
+			this.result = result;
+		}
+
+		public override void Send( EventListener listener )
+		{
+			listener.SuiteFinished( this.result );
+		}
+	}
+
+	public class UnhandledExceptionEvent : Event
+	{
+		Exception exception;
+
+		public UnhandledExceptionEvent( Exception exception )
+		{
+			this.exception = exception;
+		}
+
+		public override void Send( EventListener listener )
+		{
+            try
+            {
+				listener.UnhandledException( this.exception );
+            }
+            catch (SerializationException)
+            {
+                Exception wrapped = WrapUnserializableException(this.exception);
+                listener.UnhandledException(wrapped);
+            }
+		}
+	}
+
+	public class OutputEvent : Event
+	{
+		TestOutput output;
+
+		public OutputEvent( TestOutput output )
+		{
+			this.output = output;
+		}
+
+		public override void Send( EventListener listener )
+		{
+			listener.TestOutput( this.output );
+		}
+	}
+
+	#endregion
+
+	/// <summary>
+	/// Implements a queue of work items each of which
+	/// is queued as a WaitCallback.
+	/// </summary>
+	public class EventQueue
+	{
+		private readonly Queue queue = new Queue();
+	    private readonly object syncRoot;
+        private bool stopped;
+
+        /// <summary>
+        /// WaitHandle for synchronous event delivery in <see cref="Enqueue"/>.
+        /// <para>
+        /// Having just one handle for the whole <see cref="EventQueue"/> implies that 
+        /// there may be only one producer (the test thread) for synchronous events.
+        /// If there can be multiple producers for synchronous events, one would have
+        /// to introduce one WaitHandle per event.
+        /// </para>
+        /// </summary>
+        private AutoResetEvent synchronousEventSent;
+
+		public int Count
+		{
+			get 
+			{
+				lock( this.syncRoot )
+				{
+					return this.queue.Count; 
+				}
+			}
+		}
+
+        public EventQueue()
+        {
+            this.syncRoot = queue.SyncRoot;
+        }
+
+        /// <summary>
+        /// Sets a handle on which to wait, when <see cref="Enqueue"/> is called
+        /// for an <see cref="Event"/> with <see cref="Event.IsSynchronous"/> == true.
+        /// </summary>
+        /// <param name="synchronousEventWaitHandle">
+        /// The wait handle on which to wait, when <see cref="Enqueue"/> is called
+        /// for an <see cref="Event"/> with <see cref="Event.IsSynchronous"/> == true.
+        /// <para>The caller is responsible for disposing this wait handle.</para>
+        /// </param>
+        public void SetWaitHandleForSynchronizedEvents( AutoResetEvent synchronousEventWaitHandle )
+        {
+            this.synchronousEventSent = synchronousEventWaitHandle;
+        }
+
+		public void Enqueue( Event e )
+		{
+			lock( this.syncRoot )
+			{
+				this.queue.Enqueue( e );
+				Monitor.Pulse( this.syncRoot );
+			}
+
+            if ( this.synchronousEventSent != null && e.IsSynchronous )
+            {
+                this.synchronousEventSent.WaitOne();
+            }
+            else
+            {
+                Thread.Sleep( 0 ); // give EventPump thread a chance to process the event
+            }
+		}
+
+        /// <summary>
+        /// Removes the first element from the queue and returns it (or <c>null</c>).
+        /// </summary>
+        /// <param name="blockWhenEmpty">
+        /// If <c>true</c> and the queue is empty, the calling thread is blocked until
+        /// either an element is enqueued, or <see cref="Stop"/> is called.
+        /// </param>
+        /// <returns>
+        /// <list type="bullet">
+        ///   <item>
+        ///     <term>If the queue not empty</term>
+        ///     <description>the first element.</description>
+        ///   </item>
+        ///   <item>
+        ///     <term>otherwise, if <paramref name="blockWhenEmpty"/>==<c>false</c> 
+        ///       or <see cref="Stop"/> has been called</term>
+        ///     <description><c>null</c>.</description>
+        ///   </item>
+        /// </list>
+        /// </returns>
+		public Event Dequeue( bool blockWhenEmpty )
+		{
+			lock( this.syncRoot )
+			{
+                while ( this.queue.Count == 0 )
+                {
+                    if ( blockWhenEmpty && !this.stopped )
+                    {
+                        Monitor.Wait( this.syncRoot );
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+
+				return (Event)this.queue.Dequeue();
+			}
+		}
+
+        public void Stop()
+        {
+            lock( this.syncRoot )
+            {
+                if ( !this.stopped )
+                {
+                    this.stopped = true;
+                    Monitor.Pulse( this.syncRoot );
+                }
+            }
+        }
+	}
+}
diff --git a/src/NUnitCore/core/ExpectedExceptionProcessor.cs b/src/NUnitCore/core/ExpectedExceptionProcessor.cs
index 11a193a..d41f24c 100644
--- a/src/NUnitCore/core/ExpectedExceptionProcessor.cs
+++ b/src/NUnitCore/core/ExpectedExceptionProcessor.cs
@@ -1,279 +1,279 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Text.RegularExpressions;
-
-namespace NUnit.Core
-{
-    public class ExpectedExceptionProcessor
-    {
-        #region Fields
-        /// <summary>
-        /// The TestMethod to which this exception processor applies
-        /// </summary>
-        internal TestMethod testMethod;
-
-        /// <summary>
-        /// The exception handler method
-        /// </summary>
-        internal MethodInfo exceptionHandler;
-
-        /// <summary>
-        /// The type of any expected exception
-        /// </summary>
-        internal Type expectedExceptionType;
-
-        /// <summary>
-        /// The full name of any expected exception type
-        /// </summary>
-        internal string expectedExceptionName;
-
-        /// <summary>
-        /// The value of any message associated with an expected exception
-        /// </summary>
-        internal string expectedMessage;
-
-        /// <summary>
-        /// A string indicating how to match the expected message
-        /// </summary>
-        internal string matchType;
-
-        /// <summary>
-        /// A string containing any user message specified for the expected exception
-        /// </summary>
-        internal string userMessage;
-        #endregion
-
-        #region Constructor
-        public ExpectedExceptionProcessor( TestMethod testMethod )
-        {
-            this.testMethod = testMethod;
-        }
-
-        public ExpectedExceptionProcessor(TestMethod testMethod, object source)
-        {
-            this.testMethod = testMethod;
-
-            this.expectedExceptionType = GetExceptionType(source);
-            this.expectedExceptionName = GetExceptionName(source);
-            this.expectedMessage = GetExpectedMessage(source);
-            this.matchType = GetMatchType(source);
-            this.userMessage = GetUserMessage(source);
-
-            string handlerName = GetHandler(source);
-            if (handlerName == null)
-                this.exceptionHandler = GetDefaultExceptionHandler(testMethod.FixtureType);
-            else
-            {
-                MethodInfo handler = GetExceptionHandler(testMethod.FixtureType, handlerName);
-                if (handler != null)
-                    this.exceptionHandler = handler;
-                else
-                {
-                    testMethod.RunState = RunState.NotRunnable;
-                    testMethod.IgnoreReason = string.Format(
-                        "The specified exception handler {0} was not found", handlerName);
-                }
-            }
-        }
-        #endregion
-
-        #region Public Methods
-        public void ProcessNoException(TestResult testResult)
-        {
-            testResult.Failure(NoExceptionMessage(), null);
-        }
-
-        public void ProcessException(Exception exception, TestResult testResult)
-        {
-            if (exception is NUnitException)
-                exception = exception.InnerException;
-
-            if (IsExpectedExceptionType(exception))
-            {
-                if (IsExpectedMessageMatch(exception))
-                {
-                    if (exceptionHandler != null)
-                        Reflect.InvokeMethod(exceptionHandler, testMethod.Fixture, exception);
-
-                    testResult.Success();
-                }
-                else
-                {
-                    testResult.Failure(WrongTextMessage(exception), GetStackTrace(exception));
-                }
-            }
-            else
-            {
-                switch (NUnitFramework.GetResultState(exception))
-                {
-                    case ResultState.Failure:
-                        testResult.Failure(exception.Message, exception.StackTrace);
-                        break;
-                    case ResultState.Ignored:
-                        testResult.Ignore(exception);
-                        break;
-                    case ResultState.Inconclusive:
-                        testResult.SetResult(ResultState.Inconclusive, exception, FailureSite.Test);
-                        break;
-                    case ResultState.Success:
-                        testResult.Success(exception.Message);
-                        break;
-                    default:
-                        testResult.Failure(WrongTypeMessage(exception), GetStackTrace(exception));
-                        break;
-                }
-            }
-		}
-        #endregion
-
-        #region Helper Methods
-        private bool IsExpectedExceptionType(Exception exception)
-        {
-            return expectedExceptionName == null ||
-                expectedExceptionName.Equals(exception.GetType().FullName);
-        }
-
-        private bool IsExpectedMessageMatch(Exception exception)
-        {
-            if (expectedMessage == null)
-                return true;
-
-            switch (matchType)
-            {
-                case "Exact":
-                default:
-                    return expectedMessage.Equals(exception.Message);
-                case "Contains":
-                    return exception.Message.IndexOf(expectedMessage) >= 0;
-                case "Regex":
-                    return Regex.IsMatch(exception.Message, expectedMessage);
-                case "StartsWith":
-                    return exception.Message.StartsWith(expectedMessage);
-            }
-        }
-
-        private string NoExceptionMessage()
-        {
-            string expectedType = expectedExceptionName == null ? "An Exception" : expectedExceptionName;
-            return CombineWithUserMessage(expectedType + " was expected");
-        }
-
-        private string WrongTypeMessage(Exception exception)
-        {
-            return CombineWithUserMessage(
-                "An unexpected exception type was thrown" + Environment.NewLine +
-                "Expected: " + expectedExceptionName + Environment.NewLine +
-                " but was: " + exception.GetType().FullName + " : " + exception.Message);
-        }
-
-        private string WrongTextMessage(Exception exception)
-        {
-            string expectedText;
-            switch (matchType)
-            {
-                default:
-                case "Exact":
-                    expectedText = "Expected: ";
-                    break;
-                case "Contains":
-                    expectedText = "Expected message containing: ";
-                    break;
-                case "Regex":
-                    expectedText = "Expected message matching: ";
-                    break;
-                case "StartsWith":
-                    expectedText = "Expected message starting: ";
-                    break;
-            }
-
-            return CombineWithUserMessage(
-                "The exception message text was incorrect" + Environment.NewLine +
-                expectedText + expectedMessage + Environment.NewLine +
-                " but was: " + exception.Message);
-        }
-
-        private string CombineWithUserMessage(string message)
-        {
-            if (userMessage == null)
-                return message;
-            return userMessage + Environment.NewLine + message;
-        }
-
-        private string GetStackTrace(Exception exception)
-        {
-            try
-            {
-                return exception.StackTrace;
-            }
-            catch (Exception)
-            {
-                return "No stack trace available";
-            }
-        }
-
-        private static MethodInfo GetDefaultExceptionHandler(Type fixtureType)
-        {
-            return Reflect.HasInterface(fixtureType, NUnitFramework.ExpectExceptionInterface)
-                ? GetExceptionHandler(fixtureType, "HandleException")
-                : null;
-        }
-
-        private static MethodInfo GetExceptionHandler(Type fixtureType, string name)
-        {
-            return Reflect.GetNamedMethod(
-                fixtureType,
-                name,
-                new string[] { "System.Exception" });
-        }
-
-        private static string GetHandler(object source)
-        {
-            return Reflect.GetPropertyValue(source, "Handler") as string;
-        }
-
-        private static Type GetExceptionType(object source)
-        {
-            Type type = Reflect.GetPropertyValue(source, PropertyNames.ExpectedException) as Type;
-
-            // Prior to 2.5, NUnit used an 'ExceptionType' property
-            if (type == null)
-                type = Reflect.GetPropertyValue(source, PropertyNames.LegacyExceptionType) as Type;
-
-            return type;
-        }
-
-        private static string GetExceptionName(object source)
-        {
-            string name = Reflect.GetPropertyValue(source, PropertyNames.ExpectedExceptionName) as string;
-
-            // Prior to 2.5, NUnit used an 'ExceptionName' property
-            if (name == null)
-                name = Reflect.GetPropertyValue(source, PropertyNames.LegacyExceptionName) as string;
-
-            return name;
-        }
-
-        private static string GetExpectedMessage(object source)
-        {
-            return Reflect.GetPropertyValue(source, PropertyNames.ExpectedMessage) as string;
-        }
-
-        private static string GetMatchType(object source)
-        {
-            object matchEnum = Reflect.GetPropertyValue(source, "MatchType");
-            return matchEnum != null ? matchEnum.ToString() : null;
-        }
-
-        private static string GetUserMessage(object source)
-        {
-            return Reflect.GetPropertyValue(source, "UserMessage") as string;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Text.RegularExpressions;
+
+namespace NUnit.Core
+{
+    public class ExpectedExceptionProcessor
+    {
+        #region Fields
+        /// <summary>
+        /// The TestMethod to which this exception processor applies
+        /// </summary>
+        internal TestMethod testMethod;
+
+        /// <summary>
+        /// The exception handler method
+        /// </summary>
+        internal MethodInfo exceptionHandler;
+
+        /// <summary>
+        /// The type of any expected exception
+        /// </summary>
+        internal Type expectedExceptionType;
+
+        /// <summary>
+        /// The full name of any expected exception type
+        /// </summary>
+        internal string expectedExceptionName;
+
+        /// <summary>
+        /// The value of any message associated with an expected exception
+        /// </summary>
+        internal string expectedMessage;
+
+        /// <summary>
+        /// A string indicating how to match the expected message
+        /// </summary>
+        internal string matchType;
+
+        /// <summary>
+        /// A string containing any user message specified for the expected exception
+        /// </summary>
+        internal string userMessage;
+        #endregion
+
+        #region Constructor
+        public ExpectedExceptionProcessor( TestMethod testMethod )
+        {
+            this.testMethod = testMethod;
+        }
+
+        public ExpectedExceptionProcessor(TestMethod testMethod, object source)
+        {
+            this.testMethod = testMethod;
+
+            this.expectedExceptionType = GetExceptionType(source);
+            this.expectedExceptionName = GetExceptionName(source);
+            this.expectedMessage = GetExpectedMessage(source);
+            this.matchType = GetMatchType(source);
+            this.userMessage = GetUserMessage(source);
+
+            string handlerName = GetHandler(source);
+            if (handlerName == null)
+                this.exceptionHandler = GetDefaultExceptionHandler(testMethod.FixtureType);
+            else
+            {
+                MethodInfo handler = GetExceptionHandler(testMethod.FixtureType, handlerName);
+                if (handler != null)
+                    this.exceptionHandler = handler;
+                else
+                {
+                    testMethod.RunState = RunState.NotRunnable;
+                    testMethod.IgnoreReason = string.Format(
+                        "The specified exception handler {0} was not found", handlerName);
+                }
+            }
+        }
+        #endregion
+
+        #region Public Methods
+        public void ProcessNoException(TestResult testResult)
+        {
+            testResult.Failure(NoExceptionMessage(), null);
+        }
+
+        public void ProcessException(Exception exception, TestResult testResult)
+        {
+            if (exception is NUnitException)
+                exception = exception.InnerException;
+
+            if (IsExpectedExceptionType(exception))
+            {
+                if (IsExpectedMessageMatch(exception))
+                {
+                    if (exceptionHandler != null)
+                        Reflect.InvokeMethod(exceptionHandler, testMethod.Fixture, exception);
+
+                    testResult.Success();
+                }
+                else
+                {
+                    testResult.Failure(WrongTextMessage(exception), GetStackTrace(exception));
+                }
+            }
+            else
+            {
+                switch (NUnitFramework.GetResultState(exception))
+                {
+                    case ResultState.Failure:
+                        testResult.Failure(exception.Message, exception.StackTrace);
+                        break;
+                    case ResultState.Ignored:
+                        testResult.Ignore(exception);
+                        break;
+                    case ResultState.Inconclusive:
+                        testResult.SetResult(ResultState.Inconclusive, exception, FailureSite.Test);
+                        break;
+                    case ResultState.Success:
+                        testResult.Success(exception.Message);
+                        break;
+                    default:
+                        testResult.Failure(WrongTypeMessage(exception), GetStackTrace(exception));
+                        break;
+                }
+            }
+		}
+        #endregion
+
+        #region Helper Methods
+        private bool IsExpectedExceptionType(Exception exception)
+        {
+            return expectedExceptionName == null ||
+                expectedExceptionName.Equals(exception.GetType().FullName);
+        }
+
+        private bool IsExpectedMessageMatch(Exception exception)
+        {
+            if (expectedMessage == null)
+                return true;
+
+            switch (matchType)
+            {
+                case "Exact":
+                default:
+                    return expectedMessage.Equals(exception.Message);
+                case "Contains":
+                    return exception.Message.IndexOf(expectedMessage) >= 0;
+                case "Regex":
+                    return Regex.IsMatch(exception.Message, expectedMessage);
+                case "StartsWith":
+                    return exception.Message.StartsWith(expectedMessage);
+            }
+        }
+
+        private string NoExceptionMessage()
+        {
+            string expectedType = expectedExceptionName == null ? "An Exception" : expectedExceptionName;
+            return CombineWithUserMessage(expectedType + " was expected");
+        }
+
+        private string WrongTypeMessage(Exception exception)
+        {
+            return CombineWithUserMessage(
+                "An unexpected exception type was thrown" + Environment.NewLine +
+                "Expected: " + expectedExceptionName + Environment.NewLine +
+                " but was: " + exception.GetType().FullName + " : " + exception.Message);
+        }
+
+        private string WrongTextMessage(Exception exception)
+        {
+            string expectedText;
+            switch (matchType)
+            {
+                default:
+                case "Exact":
+                    expectedText = "Expected: ";
+                    break;
+                case "Contains":
+                    expectedText = "Expected message containing: ";
+                    break;
+                case "Regex":
+                    expectedText = "Expected message matching: ";
+                    break;
+                case "StartsWith":
+                    expectedText = "Expected message starting: ";
+                    break;
+            }
+
+            return CombineWithUserMessage(
+                "The exception message text was incorrect" + Environment.NewLine +
+                expectedText + expectedMessage + Environment.NewLine +
+                " but was: " + exception.Message);
+        }
+
+        private string CombineWithUserMessage(string message)
+        {
+            if (userMessage == null)
+                return message;
+            return userMessage + Environment.NewLine + message;
+        }
+
+        private string GetStackTrace(Exception exception)
+        {
+            try
+            {
+                return exception.StackTrace;
+            }
+            catch (Exception)
+            {
+                return "No stack trace available";
+            }
+        }
+
+        private static MethodInfo GetDefaultExceptionHandler(Type fixtureType)
+        {
+            return Reflect.HasInterface(fixtureType, NUnitFramework.ExpectExceptionInterface)
+                ? GetExceptionHandler(fixtureType, "HandleException")
+                : null;
+        }
+
+        private static MethodInfo GetExceptionHandler(Type fixtureType, string name)
+        {
+            return Reflect.GetNamedMethod(
+                fixtureType,
+                name,
+                new string[] { "System.Exception" });
+        }
+
+        private static string GetHandler(object source)
+        {
+            return Reflect.GetPropertyValue(source, "Handler") as string;
+        }
+
+        private static Type GetExceptionType(object source)
+        {
+            Type type = Reflect.GetPropertyValue(source, PropertyNames.ExpectedException) as Type;
+
+            // Prior to 2.5, NUnit used an 'ExceptionType' property
+            if (type == null)
+                type = Reflect.GetPropertyValue(source, PropertyNames.LegacyExceptionType) as Type;
+
+            return type;
+        }
+
+        private static string GetExceptionName(object source)
+        {
+            string name = Reflect.GetPropertyValue(source, PropertyNames.ExpectedExceptionName) as string;
+
+            // Prior to 2.5, NUnit used an 'ExceptionName' property
+            if (name == null)
+                name = Reflect.GetPropertyValue(source, PropertyNames.LegacyExceptionName) as string;
+
+            return name;
+        }
+
+        private static string GetExpectedMessage(object source)
+        {
+            return Reflect.GetPropertyValue(source, PropertyNames.ExpectedMessage) as string;
+        }
+
+        private static string GetMatchType(object source)
+        {
+            object matchEnum = Reflect.GetPropertyValue(source, "MatchType");
+            return matchEnum != null ? matchEnum.ToString() : null;
+        }
+
+        private static string GetUserMessage(object source)
+        {
+            return Reflect.GetPropertyValue(source, "UserMessage") as string;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/DataPointProviders.cs b/src/NUnitCore/core/Extensibility/DataPointProviders.cs
index 079498d..abbdd85 100644
--- a/src/NUnitCore/core/Extensibility/DataPointProviders.cs
+++ b/src/NUnitCore/core/Extensibility/DataPointProviders.cs
@@ -1,116 +1,116 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-
-namespace NUnit.Core.Extensibility
-{
-    class DataPointProviders : ExtensionPoint, IDataPointProvider2
-    {
-        public DataPointProviders(ExtensionHost host)
-            : base("DataPointProviders", host) { }
-
-        #region IDataPointProvider Members
-
-        /// <summary>
-        /// Determine whether any data is available for a parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <returns>True if any data is available, otherwise false.</returns>
-        public bool HasDataFor(ParameterInfo parameter)
-        {
-            foreach (IDataPointProvider provider in Extensions)
-                if (provider.HasDataFor(parameter))
-                    return true;
-
-            return false;
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing data for use with the
-        /// supplied parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <returns>An IEnumerable providing the required data</returns>
-        public IEnumerable GetDataFor(ParameterInfo parameter)
-        {
-            ArrayList list = new ArrayList();
-
-            foreach (IDataPointProvider provider in Extensions)
-                if (provider.HasDataFor(parameter))
-                    foreach (object o in provider.GetDataFor(parameter))
-                        list.Add(o);
-
-            return list;
-        }
-        #endregion
-
-        #region IDataPointProvider2 Members
-
-        /// <summary>
-        /// Determine whether any data is available for a parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <returns>True if any data is available, otherwise false.</returns>
-        public bool HasDataFor(ParameterInfo parameter, Test suite)
-        {
-            foreach (IDataPointProvider provider in Extensions)
-            {
-                if (provider is IDataPointProvider2)
-                {
-                    IDataPointProvider2 provider2 = (IDataPointProvider2)provider;
-                    if (provider2.HasDataFor(parameter, suite))
-                        return true;
-                }
-                else if (provider.HasDataFor(parameter))
-                    return true;
-            }
-
-            return false;
-        }
-
-        /// <summary>
-        /// Return an IEnumerable providing data for use with the
-        /// supplied parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <returns>An IEnumerable providing the required data</returns>
-        public IEnumerable GetDataFor(ParameterInfo parameter, Test suite)
-        {
-            ArrayList list = new ArrayList();
-
-            foreach (IDataPointProvider provider in Extensions)
-            {
-                if (provider is IDataPointProvider2)
-                {
-                    IDataPointProvider2 provider2 = (IDataPointProvider2)provider;
-                    if (provider2.HasDataFor(parameter, suite))
-                        foreach (object o in provider2.GetDataFor(parameter, suite))
-                            list.Add(o);
-                }
-                else if (provider.HasDataFor(parameter))
-                    foreach (object o in provider.GetDataFor(parameter))
-                        list.Add(o);
-            }
-
-            return list;
-        }
-        #endregion
-
-        #region ExtensionPoint Overrides
-        protected override bool IsValidExtension(object extension)
-        {
-            return extension is IDataPointProvider;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+
+namespace NUnit.Core.Extensibility
+{
+    class DataPointProviders : ExtensionPoint, IDataPointProvider2
+    {
+        public DataPointProviders(ExtensionHost host)
+            : base("DataPointProviders", host) { }
+
+        #region IDataPointProvider Members
+
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter)
+        {
+            foreach (IDataPointProvider provider in Extensions)
+                if (provider.HasDataFor(parameter))
+                    return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter)
+        {
+            ArrayList list = new ArrayList();
+
+            foreach (IDataPointProvider provider in Extensions)
+                if (provider.HasDataFor(parameter))
+                    foreach (object o in provider.GetDataFor(parameter))
+                        list.Add(o);
+
+            return list;
+        }
+        #endregion
+
+        #region IDataPointProvider2 Members
+
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        public bool HasDataFor(ParameterInfo parameter, Test suite)
+        {
+            foreach (IDataPointProvider provider in Extensions)
+            {
+                if (provider is IDataPointProvider2)
+                {
+                    IDataPointProvider2 provider2 = (IDataPointProvider2)provider;
+                    if (provider2.HasDataFor(parameter, suite))
+                        return true;
+                }
+                else if (provider.HasDataFor(parameter))
+                    return true;
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        public IEnumerable GetDataFor(ParameterInfo parameter, Test suite)
+        {
+            ArrayList list = new ArrayList();
+
+            foreach (IDataPointProvider provider in Extensions)
+            {
+                if (provider is IDataPointProvider2)
+                {
+                    IDataPointProvider2 provider2 = (IDataPointProvider2)provider;
+                    if (provider2.HasDataFor(parameter, suite))
+                        foreach (object o in provider2.GetDataFor(parameter, suite))
+                            list.Add(o);
+                }
+                else if (provider.HasDataFor(parameter))
+                    foreach (object o in provider.GetDataFor(parameter))
+                        list.Add(o);
+            }
+
+            return list;
+        }
+        #endregion
+
+        #region ExtensionPoint Overrides
+        protected override bool IsValidExtension(object extension)
+        {
+            return extension is IDataPointProvider;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/EventListenerCollection.cs b/src/NUnitCore/core/Extensibility/EventListenerCollection.cs
index 84e50a4..8479fe5 100644
--- a/src/NUnitCore/core/Extensibility/EventListenerCollection.cs
+++ b/src/NUnitCore/core/Extensibility/EventListenerCollection.cs
@@ -1,86 +1,86 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// EventListenerCollection holds multiple event listeners
-	/// and relays all event calls to each of them.
-	/// </summary>
-	public class EventListenerCollection : ExtensionPoint, EventListener
-	{
-		#region Constructor
-		public EventListenerCollection( IExtensionHost host )
-			: base( "EventListeners", host ) { }
-		#endregion
-
-		#region EventListener Members
-		public void RunStarted(string name, int testCount)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.RunStarted( name, testCount );
-		}
-
-		public void RunFinished(TestResult result)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.RunFinished( result );
-		}
-
-		public void RunFinished(Exception exception)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.RunFinished( exception );
-		}
-
-		public void SuiteStarted(TestName testName)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.SuiteStarted( testName );
-		}
-
-		public void SuiteFinished(TestResult result)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.SuiteFinished( result );
-		}
-
-		public void TestStarted(TestName testName)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.TestStarted( testName );
-		}
-
-		public void TestFinished(TestResult result)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.TestFinished( result );
-		}
-
-		public void UnhandledException(Exception exception)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.UnhandledException( exception );
-		}
-
-		public void TestOutput(TestOutput testOutput)
-		{
-			foreach( EventListener listener in Extensions )
-				listener.TestOutput( testOutput );
-		}
-
-		#endregion
-
-		#region ExtensionPoint Overrides
-		protected override bool IsValidExtension(object extension)
-		{
-			return extension is EventListener; 
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// EventListenerCollection holds multiple event listeners
+	/// and relays all event calls to each of them.
+	/// </summary>
+	public class EventListenerCollection : ExtensionPoint, EventListener
+	{
+		#region Constructor
+		public EventListenerCollection( IExtensionHost host )
+			: base( "EventListeners", host ) { }
+		#endregion
+
+		#region EventListener Members
+		public void RunStarted(string name, int testCount)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.RunStarted( name, testCount );
+		}
+
+		public void RunFinished(TestResult result)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.RunFinished( result );
+		}
+
+		public void RunFinished(Exception exception)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.RunFinished( exception );
+		}
+
+		public void SuiteStarted(TestName testName)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.SuiteStarted( testName );
+		}
+
+		public void SuiteFinished(TestResult result)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.SuiteFinished( result );
+		}
+
+		public void TestStarted(TestName testName)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.TestStarted( testName );
+		}
+
+		public void TestFinished(TestResult result)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.TestFinished( result );
+		}
+
+		public void UnhandledException(Exception exception)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.UnhandledException( exception );
+		}
+
+		public void TestOutput(TestOutput testOutput)
+		{
+			foreach( EventListener listener in Extensions )
+				listener.TestOutput( testOutput );
+		}
+
+		#endregion
+
+		#region ExtensionPoint Overrides
+		protected override bool IsValidExtension(object extension)
+		{
+			return extension is EventListener; 
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs b/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs
index dedf092..65370c4 100644
--- a/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs
+++ b/src/NUnitCore/core/Extensibility/FrameworkRegistry.cs
@@ -1,73 +1,73 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Reflection;
-using System.Collections;
-
-namespace NUnit.Core.Extensibility
-{
-    public class FrameworkRegistry : ExtensionPoint, IFrameworkRegistry
-    {
-		#region Constructor
-		public FrameworkRegistry( IExtensionHost host )
-			: base( "FrameworkRegistry", host ) { }
-		#endregion Constructor
-
-        #region Instance Fields
-        /// <summary>
-        /// List of FrameworkInfo structs for supported frameworks
-        /// </summary>
-        private Hashtable testFrameworks = new Hashtable();
-        #endregion
-
-        #region IFrameworkRegistry Members
-        /// <summary>
-        /// Register a framework. NUnit registers itself using this method. Add-ins that
-        /// work with or emulate a different framework may register themselves as well.
-        /// </summary>
-        /// <param name="frameworkName">The name of the framework</param>
-        /// <param name="assemblyName">The name of the assembly that framework users reference</param>
-        public void Register(string frameworkName, string assemblyName)
-        {
-            testFrameworks[frameworkName] = new TestFramework(frameworkName, assemblyName);
-        }
-		#endregion
-
-		#region ExtensionPoint overrides
-        protected override bool IsValidExtension(object extension)
-		{
-			return extension is TestFramework;
-		}
-
-		#endregion
-
-		#region Other Methods
-        /// <summary>
-        /// Get a list of known frameworks referenced by an assembly
-        /// </summary>
-        /// <param name="assembly">The assembly to be examined</param>
-        /// <returns>A list of AssemblyNames</returns>
-        public IList GetReferencedFrameworks(Assembly assembly)
-        {
-            ArrayList referencedAssemblies = new ArrayList();
-
-            foreach (AssemblyName assemblyRef in assembly.GetReferencedAssemblies())
-            {
-                foreach (TestFramework info in testFrameworks.Values)
-                {
-                    if (assemblyRef.Name == info.AssemblyName)
-                    {
-                        referencedAssemblies.Add(assemblyRef);
-                        break;
-                    }
-                }
-            }
-
-            return referencedAssemblies;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Reflection;
+using System.Collections;
+
+namespace NUnit.Core.Extensibility
+{
+    public class FrameworkRegistry : ExtensionPoint, IFrameworkRegistry
+    {
+		#region Constructor
+		public FrameworkRegistry( IExtensionHost host )
+			: base( "FrameworkRegistry", host ) { }
+		#endregion Constructor
+
+        #region Instance Fields
+        /// <summary>
+        /// List of FrameworkInfo structs for supported frameworks
+        /// </summary>
+        private Hashtable testFrameworks = new Hashtable();
+        #endregion
+
+        #region IFrameworkRegistry Members
+        /// <summary>
+        /// Register a framework. NUnit registers itself using this method. Add-ins that
+        /// work with or emulate a different framework may register themselves as well.
+        /// </summary>
+        /// <param name="frameworkName">The name of the framework</param>
+        /// <param name="assemblyName">The name of the assembly that framework users reference</param>
+        public void Register(string frameworkName, string assemblyName)
+        {
+            testFrameworks[frameworkName] = new TestFramework(frameworkName, assemblyName);
+        }
+		#endregion
+
+		#region ExtensionPoint overrides
+        protected override bool IsValidExtension(object extension)
+		{
+			return extension is TestFramework;
+		}
+
+		#endregion
+
+		#region Other Methods
+        /// <summary>
+        /// Get a list of known frameworks referenced by an assembly
+        /// </summary>
+        /// <param name="assembly">The assembly to be examined</param>
+        /// <returns>A list of AssemblyNames</returns>
+        public IList GetReferencedFrameworks(Assembly assembly)
+        {
+            ArrayList referencedAssemblies = new ArrayList();
+
+            foreach (AssemblyName assemblyRef in assembly.GetReferencedAssemblies())
+            {
+                foreach (TestFramework info in testFrameworks.Values)
+                {
+                    if (assemblyRef.Name == info.AssemblyName)
+                    {
+                        referencedAssemblies.Add(assemblyRef);
+                        break;
+                    }
+                }
+            }
+
+            return referencedAssemblies;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs b/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs
index 73d6a5c..c6ae468 100644
--- a/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs
+++ b/src/NUnitCore/core/Extensibility/SuiteBuilderCollection.cs
@@ -1,68 +1,68 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// SuiteBuilderCollection is an ExtensionPoint for SuiteBuilders and
-	/// implements the ISuiteBuilder interface itself, passing calls 
-	/// on to the individual builders.
-	/// 
-	/// The builders are added to the collection by inserting them at
-	/// the start, as to take precedence over those added earlier. 
-	/// </summary>
-	public class SuiteBuilderCollection : ExtensionPoint, ISuiteBuilder
-	{
-		#region Constructor
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public SuiteBuilderCollection(IExtensionHost host)
-			: base("SuiteBuilders", host ) { }
-		#endregion
-
-		#region ISuiteBuilder Members
-
-		/// <summary>
-		/// Examine the type and determine if it is suitable for
-		/// any SuiteBuilder to use in building a TestSuite
-		/// </summary>
-		/// <param name="type">The type of the fixture to be used</param>
-		/// <returns>True if the type can be used to build a TestSuite</returns>
-		public bool CanBuildFrom(Type type)
-		{
-			foreach( ISuiteBuilder builder in Extensions )
-				if ( builder.CanBuildFrom( type ) )
-					return true;
-			return false;
-		}
-
-		/// <summary>
-		/// Build a TestSuite from type provided.
-		/// </summary>
-		/// <param name="type">The type of the fixture to be used</param>
-		/// <returns>A TestSuite or null</returns>
-		public Test BuildFrom(Type type)
-		{
-			foreach( ISuiteBuilder builder in Extensions )
-				if ( builder.CanBuildFrom( type ) )
-					return builder.BuildFrom( type );
-			return null;
-		}
-
-		#endregion
-
-		#region ExtensionPoint Overrides
-		protected override bool IsValidExtension(object extension)
-		{
-			return extension is ISuiteBuilder; 
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// SuiteBuilderCollection is an ExtensionPoint for SuiteBuilders and
+	/// implements the ISuiteBuilder interface itself, passing calls 
+	/// on to the individual builders.
+	/// 
+	/// The builders are added to the collection by inserting them at
+	/// the start, as to take precedence over those added earlier. 
+	/// </summary>
+	public class SuiteBuilderCollection : ExtensionPoint, ISuiteBuilder
+	{
+		#region Constructor
+		/// <summary>
+		/// Default constructor
+		/// </summary>
+		public SuiteBuilderCollection(IExtensionHost host)
+			: base("SuiteBuilders", host ) { }
+		#endregion
+
+		#region ISuiteBuilder Members
+
+		/// <summary>
+		/// Examine the type and determine if it is suitable for
+		/// any SuiteBuilder to use in building a TestSuite
+		/// </summary>
+		/// <param name="type">The type of the fixture to be used</param>
+		/// <returns>True if the type can be used to build a TestSuite</returns>
+		public bool CanBuildFrom(Type type)
+		{
+			foreach( ISuiteBuilder builder in Extensions )
+				if ( builder.CanBuildFrom( type ) )
+					return true;
+			return false;
+		}
+
+		/// <summary>
+		/// Build a TestSuite from type provided.
+		/// </summary>
+		/// <param name="type">The type of the fixture to be used</param>
+		/// <returns>A TestSuite or null</returns>
+		public Test BuildFrom(Type type)
+		{
+			foreach( ISuiteBuilder builder in Extensions )
+				if ( builder.CanBuildFrom( type ) )
+					return builder.BuildFrom( type );
+			return null;
+		}
+
+		#endregion
+
+		#region ExtensionPoint Overrides
+		protected override bool IsValidExtension(object extension)
+		{
+			return extension is ISuiteBuilder; 
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs b/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs
index 229f86b..01c0ba1 100644
--- a/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs
+++ b/src/NUnitCore/core/Extensibility/TestCaseBuilderCollection.cs
@@ -1,114 +1,114 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// TestCaseBuilderCollection is an ExtensionPoint for TestCaseBuilders 
-	/// and implements the ITestCaseBuilder interface itself, passing calls 
-	/// on to the individual builders.
-	/// 
-	/// The builders are added to the collection by inserting them at
-	/// the start, as to take precedence over those added earlier. 
-	/// </summary>
-	public class TestCaseBuilderCollection : ExtensionPoint, ITestCaseBuilder2
-	{
-		#region Constructor
-		public TestCaseBuilderCollection(IExtensionHost host)
-			: base("TestCaseBuilders", host) { }
-		#endregion
-
-        #region ITestCaseBuilder Members
-        /// <summary>
-        /// Examine the method and determine if it is suitable for
-        /// any TestCaseBuilder to use in building a Test
-        /// </summary>
-        /// <param name="method">The method to be used as a test case</param>
-        /// <returns>True if the method can be used to build a Test</returns>
-        public bool CanBuildFrom(MethodInfo method)
-        {
-            foreach (ITestCaseBuilder builder in Extensions)
-                if (builder.CanBuildFrom(method))
-                    return true;
-            return false;
-        }
-
-        /// <summary>
-        /// Build a Test from the method provided.
-        /// </summary>
-        /// <param name="method">The method to be used</param>
-        /// <returns>A Test or null</returns>
-        public Test BuildFrom(MethodInfo method)
-        {
-            foreach (ITestCaseBuilder builder in Extensions)
-            {
-                if (builder.CanBuildFrom(method))
-                    return builder.BuildFrom(method);
-            }
-
-            return null;
-        }
-        #endregion
-
-        #region ITestCaseBuilder2 Members
-
-        /// <summary>
-        /// Examine the method and determine if it is suitable for
-        /// any TestCaseBuilder to use in building a Test
-        /// </summary>
-        /// <param name="method">The method to be used as a test case</param>
-        /// <returns>True if the method can be used to build a Test</returns>
-        public bool CanBuildFrom(MethodInfo method, Test suite)
-        {
-            foreach (ITestCaseBuilder builder in Extensions)
-            {
-                if (builder is ITestCaseBuilder2)
-                {
-                    ITestCaseBuilder2 builder2 = (ITestCaseBuilder2)builder;
-                    if (builder2.CanBuildFrom(method, suite))
-                        return true;
-                }
-                else if (builder.CanBuildFrom(method))
-                    return true;
-            }
-            
-            return false;
-        }
-
-        /// <summary>
-        /// Build a Test from the method provided.
-        /// </summary>
-        /// <param name="method">The method to be used</param>
-        /// <returns>A Test or null</returns>
-        public Test BuildFrom(MethodInfo method, Test suite)
-        {
-            foreach (ITestCaseBuilder builder in Extensions)
-            {
-                if (builder is ITestCaseBuilder2)
-                {
-                    ITestCaseBuilder2 builder2 = (ITestCaseBuilder2)builder;
-                    if (builder2.CanBuildFrom(method, suite))
-                        return builder2.BuildFrom(method, suite);
-                }
-                else if (builder.CanBuildFrom(method))
-                    return builder.BuildFrom(method);
-            }
-
-            return null;
-        }
-        #endregion
-
-        #region ExtensionPoint Overrides
-		protected override bool IsValidExtension(object extension)
-		{
-			return extension is ITestCaseBuilder; 
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// TestCaseBuilderCollection is an ExtensionPoint for TestCaseBuilders 
+	/// and implements the ITestCaseBuilder interface itself, passing calls 
+	/// on to the individual builders.
+	/// 
+	/// The builders are added to the collection by inserting them at
+	/// the start, as to take precedence over those added earlier. 
+	/// </summary>
+	public class TestCaseBuilderCollection : ExtensionPoint, ITestCaseBuilder2
+	{
+		#region Constructor
+		public TestCaseBuilderCollection(IExtensionHost host)
+			: base("TestCaseBuilders", host) { }
+		#endregion
+
+        #region ITestCaseBuilder Members
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// any TestCaseBuilder to use in building a Test
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <returns>True if the method can be used to build a Test</returns>
+        public bool CanBuildFrom(MethodInfo method)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+                if (builder.CanBuildFrom(method))
+                    return true;
+            return false;
+        }
+
+        /// <summary>
+        /// Build a Test from the method provided.
+        /// </summary>
+        /// <param name="method">The method to be used</param>
+        /// <returns>A Test or null</returns>
+        public Test BuildFrom(MethodInfo method)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+            {
+                if (builder.CanBuildFrom(method))
+                    return builder.BuildFrom(method);
+            }
+
+            return null;
+        }
+        #endregion
+
+        #region ITestCaseBuilder2 Members
+
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// any TestCaseBuilder to use in building a Test
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <returns>True if the method can be used to build a Test</returns>
+        public bool CanBuildFrom(MethodInfo method, Test suite)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+            {
+                if (builder is ITestCaseBuilder2)
+                {
+                    ITestCaseBuilder2 builder2 = (ITestCaseBuilder2)builder;
+                    if (builder2.CanBuildFrom(method, suite))
+                        return true;
+                }
+                else if (builder.CanBuildFrom(method))
+                    return true;
+            }
+            
+            return false;
+        }
+
+        /// <summary>
+        /// Build a Test from the method provided.
+        /// </summary>
+        /// <param name="method">The method to be used</param>
+        /// <returns>A Test or null</returns>
+        public Test BuildFrom(MethodInfo method, Test suite)
+        {
+            foreach (ITestCaseBuilder builder in Extensions)
+            {
+                if (builder is ITestCaseBuilder2)
+                {
+                    ITestCaseBuilder2 builder2 = (ITestCaseBuilder2)builder;
+                    if (builder2.CanBuildFrom(method, suite))
+                        return builder2.BuildFrom(method, suite);
+                }
+                else if (builder.CanBuildFrom(method))
+                    return builder.BuildFrom(method);
+            }
+
+            return null;
+        }
+        #endregion
+
+        #region ExtensionPoint Overrides
+		protected override bool IsValidExtension(object extension)
+		{
+			return extension is ITestCaseBuilder; 
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/Extensibility/TestCaseProviders.cs b/src/NUnitCore/core/Extensibility/TestCaseProviders.cs
index 35e420d..2ca32f1 100644
--- a/src/NUnitCore/core/Extensibility/TestCaseProviders.cs
+++ b/src/NUnitCore/core/Extensibility/TestCaseProviders.cs
@@ -1,133 +1,133 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-    class TestCaseProviders : ExtensionPoint, ITestCaseProvider2
-    {
-        public TestCaseProviders(IExtensionHost host) : base( "TestCaseProviders", host ) { }
-
-        #region ITestCaseProvider Members
-
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        public bool HasTestCasesFor(MethodInfo method)
-        {
-            foreach (ITestCaseProvider provider in Extensions)
-                if (provider.HasTestCasesFor(method))
-                    return true;
-
-            return false;
-        }
-
-        /// <summary>
-        /// Return an enumeration providing test cases for use in
-        /// running a paramterized test.
-        /// </summary>
-        /// <param name="method"></param>
-        /// <returns></returns>
-        public IEnumerable GetTestCasesFor(MethodInfo method)
-        {
-            ArrayList testcases = new ArrayList();
-
-            foreach (ITestCaseProvider provider in Extensions)
-                try
-                {
-                    if (provider.HasTestCasesFor(method))
-                        foreach (object o in provider.GetTestCasesFor(method))
-                            testcases.Add(o);
-                }
-                catch (System.Reflection.TargetInvocationException ex)
-                {
-                    testcases.Add(new ParameterSet(ex.InnerException));
-                }
-                catch (System.Exception ex)
-                {
-                    testcases.Add(new ParameterSet(ex));
-                }
-
-            return testcases;
-        }
-
-        #endregion
-
-        #region ITestCaseProvider2 Members
-
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <param name="suite">The suite for which the test case is being built</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        public bool HasTestCasesFor(MethodInfo method, Test suite)
-        {
-            foreach (ITestCaseProvider provider in Extensions)
-            {
-                if (provider is ITestCaseProvider2)
-                {
-                    ITestCaseProvider2 provider2 = (ITestCaseProvider2)provider;
-                    if (provider2.HasTestCasesFor(method, suite))
-                        return true;
-                }
-                else if (provider.HasTestCasesFor(method))
-                    return true;
-            }
-
-            return false;
-        }
-
-        /// <summary>
-        /// Return an enumeration providing test cases for use in
-        /// running a paramterized test.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <param name="suite">The suite for which the test case is being built</param>
-        /// <returns></returns>
-        public IEnumerable GetTestCasesFor(MethodInfo method, Test suite)
-        {
-            ArrayList testcases = new ArrayList();
-
-            foreach (ITestCaseProvider provider in Extensions)
-                try
-                {
-                    if (provider is ITestCaseProvider2)
-                    {
-                        ITestCaseProvider2 provider2 = (ITestCaseProvider2)provider;
-                        if (provider2.HasTestCasesFor(method, suite))
-                            foreach (object o in provider2.GetTestCasesFor(method, suite))
-                                testcases.Add(o);
-                    }
-                    else if (provider.HasTestCasesFor(method))
-                        foreach (object o in provider.GetTestCasesFor(method))
-                            testcases.Add(o);
-                }
-                catch (System.Reflection.TargetInvocationException ex)
-                {
-                    testcases.Add(new ParameterSet(ex.InnerException));
-                }
-                catch (System.Exception ex)
-                {
-                    testcases.Add(new ParameterSet(ex));
-                }
-
-            return testcases;
-        }
-        #endregion
-
-        #region IsValidExtension
-        protected override bool IsValidExtension(object extension)
-        {
-            return extension is ITestCaseProvider;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    class TestCaseProviders : ExtensionPoint, ITestCaseProvider2
+    {
+        public TestCaseProviders(IExtensionHost host) : base( "TestCaseProviders", host ) { }
+
+        #region ITestCaseProvider Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method)
+        {
+            foreach (ITestCaseProvider provider in Extensions)
+                if (provider.HasTestCasesFor(method))
+                    return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an enumeration providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method)
+        {
+            ArrayList testcases = new ArrayList();
+
+            foreach (ITestCaseProvider provider in Extensions)
+                try
+                {
+                    if (provider.HasTestCasesFor(method))
+                        foreach (object o in provider.GetTestCasesFor(method))
+                            testcases.Add(o);
+                }
+                catch (System.Reflection.TargetInvocationException ex)
+                {
+                    testcases.Add(new ParameterSet(ex.InnerException));
+                }
+                catch (System.Exception ex)
+                {
+                    testcases.Add(new ParameterSet(ex));
+                }
+
+            return testcases;
+        }
+
+        #endregion
+
+        #region ITestCaseProvider2 Members
+
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        public bool HasTestCasesFor(MethodInfo method, Test suite)
+        {
+            foreach (ITestCaseProvider provider in Extensions)
+            {
+                if (provider is ITestCaseProvider2)
+                {
+                    ITestCaseProvider2 provider2 = (ITestCaseProvider2)provider;
+                    if (provider2.HasTestCasesFor(method, suite))
+                        return true;
+                }
+                else if (provider.HasTestCasesFor(method))
+                    return true;
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Return an enumeration providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns></returns>
+        public IEnumerable GetTestCasesFor(MethodInfo method, Test suite)
+        {
+            ArrayList testcases = new ArrayList();
+
+            foreach (ITestCaseProvider provider in Extensions)
+                try
+                {
+                    if (provider is ITestCaseProvider2)
+                    {
+                        ITestCaseProvider2 provider2 = (ITestCaseProvider2)provider;
+                        if (provider2.HasTestCasesFor(method, suite))
+                            foreach (object o in provider2.GetTestCasesFor(method, suite))
+                                testcases.Add(o);
+                    }
+                    else if (provider.HasTestCasesFor(method))
+                        foreach (object o in provider.GetTestCasesFor(method))
+                            testcases.Add(o);
+                }
+                catch (System.Reflection.TargetInvocationException ex)
+                {
+                    testcases.Add(new ParameterSet(ex.InnerException));
+                }
+                catch (System.Exception ex)
+                {
+                    testcases.Add(new ParameterSet(ex));
+                }
+
+            return testcases;
+        }
+        #endregion
+
+        #region IsValidExtension
+        protected override bool IsValidExtension(object extension)
+        {
+            return extension is ITestCaseProvider;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs b/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs
index c510e35..b281430 100644
--- a/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs
+++ b/src/NUnitCore/core/Extensibility/TestDecoratorCollection.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// TestDecoratorCollection is an ExtensionPoint for TestDecorators and
-	/// implements the ITestDecorator interface itself, passing calls 
-	/// on to the individual decorators.
-	/// </summary>
-	public class TestDecoratorCollection : ExtensionPoint, IExtensionPoint2, ITestDecorator
-	{
-		#region Constructor
-		public TestDecoratorCollection(IExtensionHost host)
-			: base( "TestDecorators", host, 10 ) { }
-		#endregion
-
-		#region ITestDecorator Members
-
-		public Test Decorate(Test test, MemberInfo member)
-		{
-			Test decoratedTest = test;
-
-			foreach( ITestDecorator decorator in Extensions )
-				decoratedTest = decorator.Decorate( decoratedTest, member );
-
-			return decoratedTest;
-		}
-		#endregion
-
-		#region ExtensionPoint Overrides
-		protected override bool IsValidExtension(object extension)
-		{
-			return extension is ITestDecorator; 
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// TestDecoratorCollection is an ExtensionPoint for TestDecorators and
+	/// implements the ITestDecorator interface itself, passing calls 
+	/// on to the individual decorators.
+	/// </summary>
+	public class TestDecoratorCollection : ExtensionPoint, IExtensionPoint2, ITestDecorator
+	{
+		#region Constructor
+		public TestDecoratorCollection(IExtensionHost host)
+			: base( "TestDecorators", host, 10 ) { }
+		#endregion
+
+		#region ITestDecorator Members
+
+		public Test Decorate(Test test, MemberInfo member)
+		{
+			Test decoratedTest = test;
+
+			foreach( ITestDecorator decorator in Extensions )
+				decoratedTest = decorator.Decorate( decoratedTest, member );
+
+			return decoratedTest;
+		}
+		#endregion
+
+		#region ExtensionPoint Overrides
+		protected override bool IsValidExtension(object extension)
+		{
+			return extension is ITestDecorator; 
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/ExtensionHost.cs b/src/NUnitCore/core/ExtensionHost.cs
index 0d08d98..ca43e1d 100644
--- a/src/NUnitCore/core/ExtensionHost.cs
+++ b/src/NUnitCore/core/ExtensionHost.cs
@@ -1,54 +1,54 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// ExtensionHost is the abstract base class used for
-	/// all extension hosts. It provides an array of 
-	/// extension points and a FrameworkRegistry and
-	/// implements the IExtensionHost interface. Derived
-	/// classes must initialize the extension points.
-	/// </summary>
-	public abstract class ExtensionHost : IExtensionHost
-	{
-		#region Protected Fields
-
-	    protected ArrayList extensions;
-
-		protected ExtensionType supportedTypes;
-		#endregion
-
-		#region IExtensionHost Interface
-		public IExtensionPoint[] ExtensionPoints
-		{
-			get { return (IExtensionPoint[])extensions.ToArray(typeof(IExtensionPoint)); }
-		}
-
-        public IFrameworkRegistry FrameworkRegistry
-        {
-            get { return (IFrameworkRegistry)GetExtensionPoint("FrameworkRegistry"); }
-        }
-
-		public IExtensionPoint GetExtensionPoint( string name )
-		{
-			foreach ( IExtensionPoint extensionPoint in extensions )
-				if ( extensionPoint.Name == name )
-					return extensionPoint;
-
-			return null;
-		}
-
-		public ExtensionType ExtensionTypes
-		{
-			get { return supportedTypes; }
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// ExtensionHost is the abstract base class used for
+	/// all extension hosts. It provides an array of 
+	/// extension points and a FrameworkRegistry and
+	/// implements the IExtensionHost interface. Derived
+	/// classes must initialize the extension points.
+	/// </summary>
+	public abstract class ExtensionHost : IExtensionHost
+	{
+		#region Protected Fields
+
+	    protected ArrayList extensions;
+
+		protected ExtensionType supportedTypes;
+		#endregion
+
+		#region IExtensionHost Interface
+		public IExtensionPoint[] ExtensionPoints
+		{
+			get { return (IExtensionPoint[])extensions.ToArray(typeof(IExtensionPoint)); }
+		}
+
+        public IFrameworkRegistry FrameworkRegistry
+        {
+            get { return (IFrameworkRegistry)GetExtensionPoint("FrameworkRegistry"); }
+        }
+
+		public IExtensionPoint GetExtensionPoint( string name )
+		{
+			foreach ( IExtensionPoint extensionPoint in extensions )
+				if ( extensionPoint.Name == name )
+					return extensionPoint;
+
+			return null;
+		}
+
+		public ExtensionType ExtensionTypes
+		{
+			get { return supportedTypes; }
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/ExtensionPoint.cs b/src/NUnitCore/core/ExtensionPoint.cs
index 747101f..b76eb66 100644
--- a/src/NUnitCore/core/ExtensionPoint.cs
+++ b/src/NUnitCore/core/ExtensionPoint.cs
@@ -1,216 +1,216 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core
-{
-	public class ExtensionsCollection : IEnumerable
-	{
-		private static readonly int DEFAULT_LEVEL = 0;
-		private static readonly int MAX_LEVELS = 10;
-
-		private ArrayList[] lists;
-
-		public ExtensionsCollection() : this(1) {}
-
-		public ExtensionsCollection( int levels )
-		{
-			if ( levels < 1 )
-				levels = 1;
-			else if ( levels > MAX_LEVELS )
-				levels = MAX_LEVELS;
-
-			lists = new ArrayList[levels];
-		}
-
-	    public int Levels
-	    {
-            get { return lists.Length; }   
-	    }
-
-		public void Add( object extension )
-		{
-			Add( extension, DEFAULT_LEVEL );
-		}
-
-		public void Add( object extension, int level )
-		{
-			if ( level < 0 || level >= lists.Length )
-				throw new ArgumentOutOfRangeException("level", level, 
-					"Value must be between 0 and " + lists.Length );
-
-			if ( lists[level] == null )
-				lists[level] = new ArrayList();
-
-			lists[level].Insert( 0, extension );
-		}
-
-		public void Remove( object extension )
-		{
-			foreach( IList list in lists )
-				list.Remove( extension );
-		}
-
-		#region IEnumerable Members
-
-		public IEnumerator GetEnumerator()
-		{
-			return new ExtensionsEnumerator( lists );
-		}
-
-		public class ExtensionsEnumerator : IEnumerator
-		{
-			private ArrayList[] lists;
-			private IEnumerator listEnum;
-			private int currentLevel;
-
-			public ExtensionsEnumerator( ArrayList[] lists )
-			{
-				this.lists = lists;
-				Reset();
-			}
-
-			#region IEnumerator Members
-
-			public void Reset()
-			{
-				this.listEnum = null;
-				this.currentLevel = -1;
-			}
-
-			public object Current
-			{
-				get
-				{
-					return listEnum.Current;
-				}
-			}
-
-			public bool MoveNext()
-			{
-				if ( listEnum != null && listEnum.MoveNext() )
-					return true;
-
-				while ( ++currentLevel < lists.Length )
-				{
-					IList list = lists[currentLevel];
-					if ( list != null )
-					{
-						listEnum = list.GetEnumerator();
-						if ( listEnum.MoveNext() )
-							return true;
-					}
-				}
-
-				return false;
-			}
-
-			#endregion
-		}
-
-		#endregion
-	}
-
-	/// <summary>
-	/// ExtensionPoint is used as a base class for all 
-	/// extension points.
-	/// </summary>
-	public abstract class ExtensionPoint : IExtensionPoint
-	{
-		private readonly string name;
-		private readonly IExtensionHost host;
-		private readonly ExtensionsCollection extensions;
-
-		protected IEnumerable Extensions
-		{
-			get { return extensions; }
-		}
-
-		#region Constructor
-        public ExtensionPoint(string name, IExtensionHost host) : this( name, host, 0) { }
-
-	    public ExtensionPoint(string name, IExtensionHost host, int priorityLevels)
-		{
-			this.name = name;
-			this.host = host;
-            extensions = new ExtensionsCollection(priorityLevels);
-		}
-		#endregion
-
-		#region IExtensionPoint Members
-		/// <summary>
-		/// Get the name of this extension point
-		/// </summary>
-		public string Name
-		{
-			get { return this.name; }
-		}
-
-		/// <summary>
-		/// Get the host that provides this extension point
-		/// </summary>
-		public IExtensionHost Host
-		{
-			get { return this.host; }
-		}
-
-        /// <summary>
-        /// Install an extension at this extension point. If the
-        /// extension object does not meet the requirements for
-        /// this extension point, an exception is thrown.
-        /// </summary>
-        /// <param name="extension">The extension to install</param>
-        public void Install(object extension)
-        {
-            if (!IsValidExtension(extension))
-                throw new ArgumentException(
-                    extension.GetType().FullName + " is not {0} extension point", "extension");
-
-            extensions.Add(extension);
-        }
-
-        /// <summary>
-        /// Install an extension at this extension point specifying
-        /// an integer priority value for the extension.If the
-        /// extension object does not meet the requirements for
-        /// this extension point, or if the extension point does
-        /// not support the requested priority level, an exception 
-        /// is thrown.
-        /// </summary>
-        /// <param name="extension">The extension to install</param>
-        /// <param name="priority">The priority level for this extension</param>
-        public void Install(object extension, int priority )
-        {
-            if (!IsValidExtension(extension))
-                throw new ArgumentException(
-                    extension.GetType().FullName + " is not {0} extension point", "extension");
-
-            if (priority < 0 || priority >= extensions.Levels)
-                throw new ArgumentException("Priority value not supported", "priority");
-
-            extensions.Add(extension, priority);
-        }
-
-        /// <summary>
-		/// Removes an extension from this extension point. If the
-		/// extension object is not present, the method returns
-		/// without error.
-		/// </summary>
-		/// <param name="extension"></param>
-		public void Remove(object extension)
-		{
-			extensions.Remove( extension );
-		}
-		#endregion
-
-		#region Abstract Members
-		protected abstract bool IsValidExtension(object extension);
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core
+{
+	public class ExtensionsCollection : IEnumerable
+	{
+		private static readonly int DEFAULT_LEVEL = 0;
+		private static readonly int MAX_LEVELS = 10;
+
+		private ArrayList[] lists;
+
+		public ExtensionsCollection() : this(1) {}
+
+		public ExtensionsCollection( int levels )
+		{
+			if ( levels < 1 )
+				levels = 1;
+			else if ( levels > MAX_LEVELS )
+				levels = MAX_LEVELS;
+
+			lists = new ArrayList[levels];
+		}
+
+	    public int Levels
+	    {
+            get { return lists.Length; }   
+	    }
+
+		public void Add( object extension )
+		{
+			Add( extension, DEFAULT_LEVEL );
+		}
+
+		public void Add( object extension, int level )
+		{
+			if ( level < 0 || level >= lists.Length )
+				throw new ArgumentOutOfRangeException("level", level, 
+					"Value must be between 0 and " + lists.Length );
+
+			if ( lists[level] == null )
+				lists[level] = new ArrayList();
+
+			lists[level].Insert( 0, extension );
+		}
+
+		public void Remove( object extension )
+		{
+			foreach( IList list in lists )
+				list.Remove( extension );
+		}
+
+		#region IEnumerable Members
+
+		public IEnumerator GetEnumerator()
+		{
+			return new ExtensionsEnumerator( lists );
+		}
+
+		public class ExtensionsEnumerator : IEnumerator
+		{
+			private ArrayList[] lists;
+			private IEnumerator listEnum;
+			private int currentLevel;
+
+			public ExtensionsEnumerator( ArrayList[] lists )
+			{
+				this.lists = lists;
+				Reset();
+			}
+
+			#region IEnumerator Members
+
+			public void Reset()
+			{
+				this.listEnum = null;
+				this.currentLevel = -1;
+			}
+
+			public object Current
+			{
+				get
+				{
+					return listEnum.Current;
+				}
+			}
+
+			public bool MoveNext()
+			{
+				if ( listEnum != null && listEnum.MoveNext() )
+					return true;
+
+				while ( ++currentLevel < lists.Length )
+				{
+					IList list = lists[currentLevel];
+					if ( list != null )
+					{
+						listEnum = list.GetEnumerator();
+						if ( listEnum.MoveNext() )
+							return true;
+					}
+				}
+
+				return false;
+			}
+
+			#endregion
+		}
+
+		#endregion
+	}
+
+	/// <summary>
+	/// ExtensionPoint is used as a base class for all 
+	/// extension points.
+	/// </summary>
+	public abstract class ExtensionPoint : IExtensionPoint
+	{
+		private readonly string name;
+		private readonly IExtensionHost host;
+		private readonly ExtensionsCollection extensions;
+
+		protected IEnumerable Extensions
+		{
+			get { return extensions; }
+		}
+
+		#region Constructor
+        public ExtensionPoint(string name, IExtensionHost host) : this( name, host, 0) { }
+
+	    public ExtensionPoint(string name, IExtensionHost host, int priorityLevels)
+		{
+			this.name = name;
+			this.host = host;
+            extensions = new ExtensionsCollection(priorityLevels);
+		}
+		#endregion
+
+		#region IExtensionPoint Members
+		/// <summary>
+		/// Get the name of this extension point
+		/// </summary>
+		public string Name
+		{
+			get { return this.name; }
+		}
+
+		/// <summary>
+		/// Get the host that provides this extension point
+		/// </summary>
+		public IExtensionHost Host
+		{
+			get { return this.host; }
+		}
+
+        /// <summary>
+        /// Install an extension at this extension point. If the
+        /// extension object does not meet the requirements for
+        /// this extension point, an exception is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        public void Install(object extension)
+        {
+            if (!IsValidExtension(extension))
+                throw new ArgumentException(
+                    extension.GetType().FullName + " is not {0} extension point", "extension");
+
+            extensions.Add(extension);
+        }
+
+        /// <summary>
+        /// Install an extension at this extension point specifying
+        /// an integer priority value for the extension.If the
+        /// extension object does not meet the requirements for
+        /// this extension point, or if the extension point does
+        /// not support the requested priority level, an exception 
+        /// is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        /// <param name="priority">The priority level for this extension</param>
+        public void Install(object extension, int priority )
+        {
+            if (!IsValidExtension(extension))
+                throw new ArgumentException(
+                    extension.GetType().FullName + " is not {0} extension point", "extension");
+
+            if (priority < 0 || priority >= extensions.Levels)
+                throw new ArgumentException("Priority value not supported", "priority");
+
+            extensions.Add(extension, priority);
+        }
+
+        /// <summary>
+		/// Removes an extension from this extension point. If the
+		/// extension object is not present, the method returns
+		/// without error.
+		/// </summary>
+		/// <param name="extension"></param>
+		public void Remove(object extension)
+		{
+			extensions.Remove( extension );
+		}
+		#endregion
+
+		#region Abstract Members
+		protected abstract bool IsValidExtension(object extension);
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/IgnoreDecorator.cs b/src/NUnitCore/core/IgnoreDecorator.cs
index b0e4057..98d7128 100644
--- a/src/NUnitCore/core/IgnoreDecorator.cs
+++ b/src/NUnitCore/core/IgnoreDecorator.cs
@@ -1,39 +1,39 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// Ignore Decorator is an alternative method of marking tests to
-	/// be ignored. It is currently not used, since the test builders
-	/// take care of the ignore attribute.
-	/// </summary>
-	public class IgnoreDecorator : Extensibility.ITestDecorator
-	{
-		public IgnoreDecorator( string ignoreAttributeType )
-		{
-		}
-
-		#region ITestDecorator Members
-
-		public Test Decorate( Test test, MemberInfo member )
-		{
-			Attribute ignoreAttribute = Reflect.GetAttribute( member, NUnitFramework.IgnoreAttribute, false );
-
-			if ( ignoreAttribute != null )
-			{
-				test.RunState = RunState.Ignored;
-				test.IgnoreReason = NUnitFramework.GetIgnoreReason( ignoreAttribute );
-			}
-
-			return test;
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// Ignore Decorator is an alternative method of marking tests to
+	/// be ignored. It is currently not used, since the test builders
+	/// take care of the ignore attribute.
+	/// </summary>
+	public class IgnoreDecorator : Extensibility.ITestDecorator
+	{
+		public IgnoreDecorator( string ignoreAttributeType )
+		{
+		}
+
+		#region ITestDecorator Members
+
+		public Test Decorate( Test test, MemberInfo member )
+		{
+			Attribute ignoreAttribute = Reflect.GetAttribute( member, NUnitFramework.IgnoreAttribute, false );
+
+			if ( ignoreAttribute != null )
+			{
+				test.RunState = RunState.Ignored;
+				test.IgnoreReason = NUnitFramework.GetIgnoreReason( ignoreAttribute );
+			}
+
+			return test;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/InternalTrace.cs b/src/NUnitCore/core/InternalTrace.cs
index 21ec2ea..9ee317b 100644
--- a/src/NUnitCore/core/InternalTrace.cs
+++ b/src/NUnitCore/core/InternalTrace.cs
@@ -1,129 +1,129 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// InternalTraceLevel is an enumeration controlling the
-    /// level of detailed presented in the internal log.
-    /// </summary>
-    public enum InternalTraceLevel
-    {
-        Default,
-        Off,
-        Error,
-        Warning,
-        Info,
-        Verbose
-    }
-    
-    /// <summary>
-	/// Summary description for Logger.
-	/// </summary>
-	public class InternalTrace
-	{
-        private readonly static string TIME_FMT = "HH:mm:ss.fff";
-
-		private static bool initialized;
-		private static InternalTraceLevel level;
-        private static string logName;
-
-        private static InternalTraceWriter writer;
-        public static InternalTraceWriter Writer
-        {
-            get { return writer; }
-        }
-
-        private static string LogName
-        {
-            get { return logName; }
-            set { logName = value; }
-        }
-
-        public static InternalTraceLevel Level
-        {
-            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;
-
-				initialized = true;
-			}
-        }
-
-        public static void Flush()
-        {
-            if (writer != null)
-                writer.Flush();
-        }
-
-        public static void Close()
-        {
-            if (writer != null)
-                writer.Close();
-
-            writer = null;
-        }
-
-        public static Logger GetLogger(string name)
-		{
-			return new Logger( name );
-		}
-
-		public static Logger GetLogger( Type type )
-		{
-			return new Logger( type.FullName );
-		}
-
-        public static void Log(InternalTraceLevel level, string message, string category)
-        {
-            Log(level, message, category, null);
-        }
-
-        public static void Log(InternalTraceLevel level, string message, string category, Exception ex)
-        {
-            Writer.WriteLine("{0} {1,-5} [{2,2}] {3}: {4}",
-                DateTime.Now.ToString(TIME_FMT),
-                level == InternalTraceLevel.Verbose ? "Debug" : level.ToString(),
-#if CLR_2_0 || CLR_4_0
-                System.Threading.Thread.CurrentThread.ManagedThreadId,
-#else
-                AppDomain.GetCurrentThreadId(),
-#endif
-                category,
-                message);
-
-            if (ex != null)
-                Writer.WriteLine(ex.ToString());
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// InternalTraceLevel is an enumeration controlling the
+    /// level of detailed presented in the internal log.
+    /// </summary>
+    public enum InternalTraceLevel
+    {
+        Default,
+        Off,
+        Error,
+        Warning,
+        Info,
+        Verbose
+    }
+    
+    /// <summary>
+	/// Summary description for Logger.
+	/// </summary>
+	public class InternalTrace
+	{
+        private readonly static string TIME_FMT = "HH:mm:ss.fff";
+
+		private static bool initialized;
+		private static InternalTraceLevel level;
+        private static string logName;
+
+        private static InternalTraceWriter writer;
+        public static InternalTraceWriter Writer
+        {
+            get { return writer; }
+        }
+
+        private static string LogName
+        {
+            get { return logName; }
+            set { logName = value; }
+        }
+
+        public static InternalTraceLevel Level
+        {
+            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;
+
+				initialized = true;
+			}
+        }
+
+        public static void Flush()
+        {
+            if (writer != null)
+                writer.Flush();
+        }
+
+        public static void Close()
+        {
+            if (writer != null)
+                writer.Close();
+
+            writer = null;
+        }
+
+        public static Logger GetLogger(string name)
+		{
+			return new Logger( name );
+		}
+
+		public static Logger GetLogger( Type type )
+		{
+			return new Logger( type.FullName );
+		}
+
+        public static void Log(InternalTraceLevel level, string message, string category)
+        {
+            Log(level, message, category, null);
+        }
+
+        public static void Log(InternalTraceLevel level, string message, string category, Exception ex)
+        {
+            Writer.WriteLine("{0} {1,-5} [{2,2}] {3}: {4}",
+                DateTime.Now.ToString(TIME_FMT),
+                level == InternalTraceLevel.Verbose ? "Debug" : level.ToString(),
+#if CLR_2_0 || CLR_4_0
+                System.Threading.Thread.CurrentThread.ManagedThreadId,
+#else
+                AppDomain.GetCurrentThreadId(),
+#endif
+                category,
+                message);
+
+            if (ex != null)
+                Writer.WriteLine(ex.ToString());
+        }
+    }
+}
diff --git a/src/NUnitCore/core/InternalTraceWriter.cs b/src/NUnitCore/core/InternalTraceWriter.cs
index 4c76ccd..884db50 100644
--- a/src/NUnitCore/core/InternalTraceWriter.cs
+++ b/src/NUnitCore/core/InternalTraceWriter.cs
@@ -1,70 +1,74 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Diagnostics;
-using System.IO;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// A trace listener that writes to a separate file per domain
-	/// and process using it.
-	/// </summary>
-	public class InternalTraceWriter : TextWriter
-	{
-        StreamWriter writer;
-
-		public InternalTraceWriter(string logName)
-		{
-			int pId = Process.GetCurrentProcess().Id;
-			string domainName = AppDomain.CurrentDomain.FriendlyName;
-
-			string fileName = logName
-				.Replace("%p", pId.ToString() )
-				.Replace("%a", domainName );
-
-            string logPath = Path.Combine(NUnitConfiguration.LogDirectory, fileName);
-            this.writer = new StreamWriter(logPath, true);
-            this.writer.AutoFlush = true;
-		}
-
-        public override System.Text.Encoding Encoding
-        {
-            get { return writer.Encoding; }
-        }
-
-        public override void Write(char value)
-        {
-            writer.Write(value);
-        }
-
-        public override void Write(string value)
-        {
-            base.Write(value);
-        }
-
-        public override void WriteLine(string value)
-        {
-            writer.WriteLine(value);
-        }
-
-        public override void Close()
-        {
-            if (writer != null)
-            {
-                writer.Flush();
-                writer.Close();
-                writer = null;
-            }
-        }
-
-        public override void Flush()
-        {
-            if ( writer != null )
-                writer.Flush();
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Diagnostics;
+using System.IO;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// A trace listener that writes to a separate file per domain
+	/// and process using it.
+	/// </summary>
+	public class InternalTraceWriter : TextWriter
+	{
+        StreamWriter writer;
+
+		public InternalTraceWriter(string logName)
+		{
+			int pId = Process.GetCurrentProcess().Id;
+			string domainName = AppDomain.CurrentDomain.FriendlyName;
+
+			string fileName = logName
+				.Replace("%p", pId.ToString() )
+				.Replace("%a", domainName );
+
+            string logDirectory = NUnitConfiguration.LogDirectory;
+            if (!Directory.Exists(logDirectory))
+                Directory.CreateDirectory(logDirectory);
+
+            string logPath = Path.Combine(logDirectory, fileName);
+            this.writer = new StreamWriter(logPath, true);
+            this.writer.AutoFlush = true;
+		}
+
+        public override System.Text.Encoding Encoding
+        {
+            get { return writer.Encoding; }
+        }
+
+        public override void Write(char value)
+        {
+            writer.Write(value);
+        }
+
+        public override void Write(string value)
+        {
+            base.Write(value);
+        }
+
+        public override void WriteLine(string value)
+        {
+            writer.WriteLine(value);
+        }
+
+        public override void Close()
+        {
+            if (writer != null)
+            {
+                writer.Flush();
+                writer.Close();
+                writer = null;
+            }
+        }
+
+        public override void Flush()
+        {
+            if ( writer != null )
+                writer.Flush();
+        }
+	}
+}
diff --git a/src/NUnitCore/core/InvalidSuiteException.cs b/src/NUnitCore/core/InvalidSuiteException.cs
index e07e2bc..b617426 100644
--- a/src/NUnitCore/core/InvalidSuiteException.cs
+++ b/src/NUnitCore/core/InvalidSuiteException.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Runtime.Serialization;
-
-	[Serializable]
-	public class InvalidSuiteException : ApplicationException 
-	{
-		public InvalidSuiteException () : base() 
-		{} 
-
-		/// <summary>
-		/// Standard constructor
-		/// </summary>
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		public InvalidSuiteException(string message) : base (message)
-		{}
-
-		/// <summary>
-		/// Standard constructor
-		/// </summary>
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		/// <param name="inner">The exception that caused the 
-		/// current exception</param>
-		public InvalidSuiteException(string message, Exception inner) :
-			base(message, inner) 
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected InvalidSuiteException(SerializationInfo info, 
-			StreamingContext context) : base(info,context){}
-
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.Runtime.Serialization;
+
+	[Serializable]
+	public class InvalidSuiteException : ApplicationException 
+	{
+		public InvalidSuiteException () : base() 
+		{} 
+
+		/// <summary>
+		/// Standard constructor
+		/// </summary>
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		public InvalidSuiteException(string message) : base (message)
+		{}
+
+		/// <summary>
+		/// Standard constructor
+		/// </summary>
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		/// <param name="inner">The exception that caused the 
+		/// current exception</param>
+		public InvalidSuiteException(string message, Exception inner) :
+			base(message, inner) 
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+		protected InvalidSuiteException(SerializationInfo info, 
+			StreamingContext context) : base(info,context){}
+
+	}
 }
\ No newline at end of file
diff --git a/src/NUnitCore/core/InvalidTestFixtureException.cs b/src/NUnitCore/core/InvalidTestFixtureException.cs
index 5b10a18..def0576 100644
--- a/src/NUnitCore/core/InvalidTestFixtureException.cs
+++ b/src/NUnitCore/core/InvalidTestFixtureException.cs
@@ -1,34 +1,34 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Runtime.Serialization;
-
-	/// <summary>
-	/// Summary description for NoTestMethodsException.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class InvalidTestFixtureException : ApplicationException
-	{
-		public InvalidTestFixtureException() : base() {}
-
-		public InvalidTestFixtureException(string message) : base(message)
-		{}
-
-		public InvalidTestFixtureException(string message, Exception inner) : base(message, inner)
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected InvalidTestFixtureException(SerializationInfo info, 
-			StreamingContext context) : base(info,context){}
-
-	}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.Runtime.Serialization;
+
+	/// <summary>
+	/// Summary description for NoTestMethodsException.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class InvalidTestFixtureException : ApplicationException
+	{
+		public InvalidTestFixtureException() : base() {}
+
+		public InvalidTestFixtureException(string message) : base(message)
+		{}
+
+		public InvalidTestFixtureException(string message, Exception inner) : base(message, inner)
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+		protected InvalidTestFixtureException(SerializationInfo info, 
+			StreamingContext context) : base(info,context){}
+
+	}
 }
\ No newline at end of file
diff --git a/src/NUnitCore/core/LegacySuite.cs b/src/NUnitCore/core/LegacySuite.cs
index 872afda..80a115c 100644
--- a/src/NUnitCore/core/LegacySuite.cs
+++ b/src/NUnitCore/core/LegacySuite.cs
@@ -1,26 +1,26 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Represents a test suite constructed from a type that has a static Suite property
-	/// </summary>
-	public class LegacySuite : TestSuite
-	{
-		public LegacySuite( Type fixtureType ) : base( fixtureType )
-		{
-            this.fixtureSetUpMethods =
-                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureSetUpAttribute, true);
-            this.fixtureTearDownMethods =
-                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureTearDownAttribute, true);
-        }
-	}
-}
+// ****************************************************************
+// 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.Reflection;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Represents a test suite constructed from a type that has a static Suite property
+	/// </summary>
+	public class LegacySuite : TestSuite
+	{
+		public LegacySuite( Type fixtureType ) : base( fixtureType )
+		{
+            this.fixtureSetUpMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureSetUpAttribute, true);
+            this.fixtureTearDownMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureTearDownAttribute, true);
+        }
+	}
+}
diff --git a/src/NUnitCore/core/Log4NetCapture.cs b/src/NUnitCore/core/Log4NetCapture.cs
index b5a8b4c..cc1c238 100644
--- a/src/NUnitCore/core/Log4NetCapture.cs
+++ b/src/NUnitCore/core/Log4NetCapture.cs
@@ -1,242 +1,242 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using BF = System.Reflection.BindingFlags;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Proxy class for operations on a real log4net appender,
-	/// allowing NUnit to work with multiple versions of log4net
-	/// and to fail gracefully if no log4net assembly is present.
-	/// </summary>
-	public class Log4NetCapture : TextCapture
-	{
-        /// <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;
-
-		private object appender;
-		private bool isInitialized;
-
-		// Layout codes that work for versions from 
-		// log4net 1.2.0.30714 to 1.2.10:
-		//
-		//	%a = domain friendly name
-		//	%c = logger name (%c{1} = last component )
-		//	%d = date and time
-		//	%d{ABSOLUTE} = time only
-		//	%l = source location of the error
-		//	%m = message
-		//	%n = newline
-		//	%p = level
-		//	%r = elapsed milliseconds since program start
-		//	%t = thread
-		//	%x = nested diagnostic content (NDC)
-		private static readonly string logFormat =
-			"%d{ABSOLUTE} %-5p [%4t] %c{1} [%x]- %m%n";
-
-        /// <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 (IsLog4netAvailable)
-			{
-                string threshold = Threshold.ToString();
-				if ( !SetLoggingThreshold( threshold ) )
-					SetLoggingThreshold( "Error" );
-
-				SetAppenderTextWriter( this.Writer );
-				ConfigureAppender();
-			}
-		}
-
-        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 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,
-		/// failing silently if it is not possible.
-		/// </summary>
-		private object TryCreateAppender()
-		{
-			ConstructorInfo ctor = appenderType.GetConstructor( Type.EmptyTypes );
-			object appender = ctor.Invoke( new object[0] );
-
-			return appender;
-		}
-
-		private void SetAppenderLogFormat( string logFormat )
-		{
-			Type patternLayoutType = log4netAssembly.GetType( 
-				"log4net.Layout.PatternLayout", false, false );
-			if ( patternLayoutType == null ) return;
-
-			ConstructorInfo ctor = patternLayoutType.GetConstructor( new Type[] { typeof(string) } );
-			if ( ctor != null )
-			{
-				object patternLayout = ctor.Invoke( new object[] { logFormat } );
-
-				if ( patternLayout != null )
-				{
-					PropertyInfo prop = appenderType.GetProperty( "Layout", BF.Public | BF.Instance | BF.SetProperty );
-					if ( prop != null )
-						prop.SetValue( appender, patternLayout, null );
-				}
-			} 
-		}
-
-		private bool SetLoggingThreshold( string threshold )
-		{
-			PropertyInfo prop = appenderType.GetProperty( "Threshold", BF.Public | BF.Instance | BF.SetProperty );
-			if ( prop == null ) return false;
-
-			Type levelType = prop.PropertyType;
-			FieldInfo levelField = levelType.GetField( threshold, BF.Public | BF.Static | BF.IgnoreCase );
-			if ( levelField == null ) return false;
-
-			object level = levelField.GetValue( null );
-			prop.SetValue( appender, level, null );
-			return true;
-		}
-
-		private void SetAppenderTextWriter( TextWriter writer )
-		{
-			PropertyInfo prop = appenderType.GetProperty( "Writer", BF.Instance | BF.Public | BF.SetProperty );
-			if ( prop != null )
-				prop.SetValue( appender, writer, null );
-		}
-
-		private void ConfigureAppender()
-		{
-			MethodInfo configureMethod = basicConfiguratorType.GetMethod( "Configure", new Type[] { appenderType } );
-			if ( configureMethod != null )
-				configureMethod.Invoke( null, new object[] { appender } );
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using BF = System.Reflection.BindingFlags;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Proxy class for operations on a real log4net appender,
+	/// allowing NUnit to work with multiple versions of log4net
+	/// and to fail gracefully if no log4net assembly is present.
+	/// </summary>
+	public class Log4NetCapture : TextCapture
+	{
+        /// <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;
+
+		private object appender;
+		private bool isInitialized;
+
+		// Layout codes that work for versions from 
+		// log4net 1.2.0.30714 to 1.2.10:
+		//
+		//	%a = domain friendly name
+		//	%c = logger name (%c{1} = last component )
+		//	%d = date and time
+		//	%d{ABSOLUTE} = time only
+		//	%l = source location of the error
+		//	%m = message
+		//	%n = newline
+		//	%p = level
+		//	%r = elapsed milliseconds since program start
+		//	%t = thread
+		//	%x = nested diagnostic content (NDC)
+		private static readonly string logFormat =
+			"%d{ABSOLUTE} %-5p [%4t] %c{1} [%x]- %m%n";
+
+        /// <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 (IsLog4netAvailable)
+			{
+                string threshold = Threshold.ToString();
+				if ( !SetLoggingThreshold( threshold ) )
+					SetLoggingThreshold( "Error" );
+
+				SetAppenderTextWriter( this.Writer );
+				ConfigureAppender();
+			}
+		}
+
+        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 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,
+		/// failing silently if it is not possible.
+		/// </summary>
+		private object TryCreateAppender()
+		{
+			ConstructorInfo ctor = appenderType.GetConstructor( Type.EmptyTypes );
+			object appender = ctor.Invoke( new object[0] );
+
+			return appender;
+		}
+
+		private void SetAppenderLogFormat( string logFormat )
+		{
+			Type patternLayoutType = log4netAssembly.GetType( 
+				"log4net.Layout.PatternLayout", false, false );
+			if ( patternLayoutType == null ) return;
+
+			ConstructorInfo ctor = patternLayoutType.GetConstructor( new Type[] { typeof(string) } );
+			if ( ctor != null )
+			{
+				object patternLayout = ctor.Invoke( new object[] { logFormat } );
+
+				if ( patternLayout != null )
+				{
+					PropertyInfo prop = appenderType.GetProperty( "Layout", BF.Public | BF.Instance | BF.SetProperty );
+					if ( prop != null )
+						prop.SetValue( appender, patternLayout, null );
+				}
+			} 
+		}
+
+		private bool SetLoggingThreshold( string threshold )
+		{
+			PropertyInfo prop = appenderType.GetProperty( "Threshold", BF.Public | BF.Instance | BF.SetProperty );
+			if ( prop == null ) return false;
+
+			Type levelType = prop.PropertyType;
+			FieldInfo levelField = levelType.GetField( threshold, BF.Public | BF.Static | BF.IgnoreCase );
+			if ( levelField == null ) return false;
+
+			object level = levelField.GetValue( null );
+			prop.SetValue( appender, level, null );
+			return true;
+		}
+
+		private void SetAppenderTextWriter( TextWriter writer )
+		{
+			PropertyInfo prop = appenderType.GetProperty( "Writer", BF.Instance | BF.Public | BF.SetProperty );
+			if ( prop != null )
+				prop.SetValue( appender, writer, null );
+		}
+
+		private void ConfigureAppender()
+		{
+			MethodInfo configureMethod = basicConfiguratorType.GetMethod( "Configure", new Type[] { appenderType } );
+			if ( configureMethod != null )
+				configureMethod.Invoke( null, new object[] { appender } );
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/Logger.cs b/src/NUnitCore/core/Logger.cs
index 49b7629..1eda02c 100644
--- a/src/NUnitCore/core/Logger.cs
+++ b/src/NUnitCore/core/Logger.cs
@@ -1,93 +1,93 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Core
-{
-    public class Logger
-    {
-        private string name;
-        private string fullname;
-
-        public Logger(string name)
-        {
-            this.fullname = this.name = name;
-            int index = fullname.LastIndexOf('.');
-            if (index >= 0)
-                this.name = fullname.Substring(index + 1);
-        }
-
-        #region Error
-        public void Error(string message)
-        {
-            Log(InternalTraceLevel.Error, message);
-        }
-
-        public void Error(string message, params object[] args)
-        {
-            Log(InternalTraceLevel.Error, message, args);
-        }
-
-        public void Error(string message, Exception ex)
-        {
-            if (InternalTrace.Level >= InternalTraceLevel.Error)
-            {
-                InternalTrace.Log(InternalTraceLevel.Error, message, name, ex);
-            }
-        }
-        #endregion
-
-        #region Warning
-        public void Warning(string message)
-        {
-            Log(InternalTraceLevel.Warning, message);
-        }
-
-        public void Warning(string message, params object[] args)
-        {
-            Log(InternalTraceLevel.Warning, message, args);
-        }
-        #endregion
-
-        #region Info
-        public void Info(string message)
-        {
-            Log(InternalTraceLevel.Info, message);
-        }
-
-        public void Info(string message, params object[] args)
-        {
-            Log(InternalTraceLevel.Info, message, args);
-        }
-        #endregion
-
-        #region Debug
-        public void Debug(string message)
-        {
-            Log(InternalTraceLevel.Verbose, message);
-        }
-
-        public void Debug(string message, params object[] args)
-        {
-            Log(InternalTraceLevel.Verbose, message, args);
-        }
-        #endregion
-
-        #region Helper Methods
-        public void Log(InternalTraceLevel level, string message)
-        {
-            if (InternalTrace.Level >= level)
-                InternalTrace.Log(level, message, name);
-        }
-
-        private void Log(InternalTraceLevel level, string format, params object[] args)
-        {
-            if (InternalTrace.Level >= level)
-                Log(level, string.Format( format, args ) );
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Core
+{
+    public class Logger
+    {
+        private string name;
+        private string fullname;
+
+        public Logger(string name)
+        {
+            this.fullname = this.name = name;
+            int index = fullname.LastIndexOf('.');
+            if (index >= 0)
+                this.name = fullname.Substring(index + 1);
+        }
+
+        #region Error
+        public void Error(string message)
+        {
+            Log(InternalTraceLevel.Error, message);
+        }
+
+        public void Error(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Error, message, args);
+        }
+
+        public void Error(string message, Exception ex)
+        {
+            if (InternalTrace.Level >= InternalTraceLevel.Error)
+            {
+                InternalTrace.Log(InternalTraceLevel.Error, message, name, ex);
+            }
+        }
+        #endregion
+
+        #region Warning
+        public void Warning(string message)
+        {
+            Log(InternalTraceLevel.Warning, message);
+        }
+
+        public void Warning(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Warning, message, args);
+        }
+        #endregion
+
+        #region Info
+        public void Info(string message)
+        {
+            Log(InternalTraceLevel.Info, message);
+        }
+
+        public void Info(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Info, message, args);
+        }
+        #endregion
+
+        #region Debug
+        public void Debug(string message)
+        {
+            Log(InternalTraceLevel.Verbose, message);
+        }
+
+        public void Debug(string message, params object[] args)
+        {
+            Log(InternalTraceLevel.Verbose, message, args);
+        }
+        #endregion
+
+        #region Helper Methods
+        public void Log(InternalTraceLevel level, string message)
+        {
+            if (InternalTrace.Level >= level)
+                InternalTrace.Log(level, message, name);
+        }
+
+        private void Log(InternalTraceLevel level, string format, params object[] args)
+        {
+            if (InternalTrace.Level >= level)
+                Log(level, string.Format( format, args ) );
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/MethodHelper.cs b/src/NUnitCore/core/MethodHelper.cs
index bb295eb..423a81f 100644
--- a/src/NUnitCore/core/MethodHelper.cs
+++ b/src/NUnitCore/core/MethodHelper.cs
@@ -1,191 +1,191 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Text;
-
-namespace NUnit.Core
-{
-    public class MethodHelper
-    {
-        public static string GetDisplayName(MethodInfo method, object[] arglist)
-        {
-            StringBuilder sb = new StringBuilder(method.Name);
-
-#if CLR_2_0 || CLR_4_0
-            if (method.IsGenericMethod)
-            {
-                sb.Append("<");
-                int cnt = 0;
-                foreach (Type t in method.GetGenericArguments())
-                {
-                    if (cnt++ > 0) sb.Append(",");
-                    sb.Append(t.Name);
-                }
-                sb.Append(">");
-            }
-#endif
-
-            if (arglist != null)
-            {
-                sb.Append("(");
-
-                for (int i = 0; i < arglist.Length; i++)
-                {
-                    if (i > 0) sb.Append(",");
-                    sb.Append(GetDisplayString(arglist[i]));
-                }
-
-                sb.Append(")");
-            }
-
-            return sb.ToString();
-        }
-
-        private static string GetDisplayString(object arg)
-        {
-            string display = arg == null 
-                ? "null" 
-                : Convert.ToString( arg, System.Globalization.CultureInfo.InvariantCulture);
-
-            if (arg is double)
-            {
-                double d = (double)arg;
-
-                if (double.IsNaN(d))
-                    display = "double.NaN";
-                else if (double.IsPositiveInfinity(d))
-                    display = "double.PositiveInfinity";
-                else if (double.IsNegativeInfinity(d))
-                    display = "double.NegativeInfinity";
-                else if (d == double.MaxValue)
-                    display = "double.MaxValue";
-                else if (d == double.MinValue)
-                    display = "double.MinValue";
-                else
-                {
-                    if (display.IndexOf('.') == -1)
-                        display += ".0";
-                    display += "d";
-                }
-            }
-            else if (arg is float)
-            {
-                float f = (float)arg;
-
-                if (float.IsNaN(f))
-                    display = "float.NaN";
-                else if (float.IsPositiveInfinity(f))
-                    display = "float.PositiveInfinity";
-                else if (float.IsNegativeInfinity(f))
-                    display = "float.NegativeInfinity";
-                else if (f == float.MaxValue)
-                    display = "float.MaxValue";
-                else if (f == float.MinValue)
-                    display = "float.MinValue";
-                else
-                {
-                    if (display.IndexOf('.') == -1)
-                        display += ".0";
-                    display += "f";
-                }
-            }
-            else if (arg is decimal)
-            {
-                decimal d = (decimal)arg;
-                if (d == decimal.MinValue)
-                    display = "decimal.MinValue";
-                else if (d == decimal.MaxValue)
-                    display = "decimal.MaxValue";
-                else
-                    display += "m";
-            }
-            else if (arg is long)
-            {
-                long l = (long)arg;
-                if (l == long.MinValue)
-                    display = "long.MinValue";
-                else if (l == long.MinValue)
-                    display = "long.MaxValue";
-                else
-                    display += "L";
-            }
-            else if (arg is ulong)
-            {
-                ulong ul = (ulong)arg;
-                if (ul == ulong.MinValue)
-                    display = "ulong.MinValue";
-                else if (ul == ulong.MinValue)
-                    display = "ulong.MaxValue";
-                else
-                    display += "UL";
-            }
-            else if (arg is string)
-            {
-                StringBuilder sb = new StringBuilder();
-                sb.Append("\"");
-                foreach (char c in (string)arg)
-                    sb.Append(EscapeControlChar(c));
-                sb.Append("\"");
-                display = sb.ToString();
-            }
-            else if (arg is char)
-            {
-                display = "\'" + EscapeControlChar((char)arg) + "\'";
-            }
-            else if (arg is int)
-            {
-                int ival = (int)arg;
-                if (ival == int.MaxValue)
-                    display = "int.MaxValue";
-                else if (ival == int.MinValue)
-                    display = "int.MinValue";
-            }
-
-            return display;
-        }
-
-        private static string EscapeControlChar(char c)
-        {
-            switch (c)
-            {
-                case '\'':
-                    return "\\\'";
-                case '\"':
-                    return "\\\"";
-                case '\\':
-                    return "\\\\";
-                case '\0':
-                    return "\\0";
-                case '\a':
-                    return "\\a";
-                case '\b':
-                    return "\\b";
-                case '\f':
-                    return "\\f";
-                case '\n':
-                    return "\\n";
-                case '\r':
-                    return "\\r";
-                case '\t':
-                    return "\\t";
-                case '\v':
-                    return "\\v";
-
-                case '\x0085':
-                case '\x2028':
-                case '\x2029':
-                    return string.Format("\\x{0:X4}", (int)c);
-
-                default:
-                    return char.IsControl(c) || (int)c > 128
-                        ? string.Format("\\x{0:X4}", (int)c)
-                        : c.ToString();
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Text;
+
+namespace NUnit.Core
+{
+    public class MethodHelper
+    {
+        public static string GetDisplayName(MethodInfo method, object[] arglist)
+        {
+            StringBuilder sb = new StringBuilder(method.Name);
+
+#if CLR_2_0 || CLR_4_0
+            if (method.IsGenericMethod)
+            {
+                sb.Append("<");
+                int cnt = 0;
+                foreach (Type t in method.GetGenericArguments())
+                {
+                    if (cnt++ > 0) sb.Append(",");
+                    sb.Append(t.Name);
+                }
+                sb.Append(">");
+            }
+#endif
+
+            if (arglist != null)
+            {
+                sb.Append("(");
+
+                for (int i = 0; i < arglist.Length; i++)
+                {
+                    if (i > 0) sb.Append(",");
+                    sb.Append(GetDisplayString(arglist[i]));
+                }
+
+                sb.Append(")");
+            }
+
+            return sb.ToString();
+        }
+
+        private static string GetDisplayString(object arg)
+        {
+            string display = arg == null 
+                ? "null" 
+                : Convert.ToString( arg, System.Globalization.CultureInfo.InvariantCulture);
+
+            if (arg is double)
+            {
+                double d = (double)arg;
+
+                if (double.IsNaN(d))
+                    display = "double.NaN";
+                else if (double.IsPositiveInfinity(d))
+                    display = "double.PositiveInfinity";
+                else if (double.IsNegativeInfinity(d))
+                    display = "double.NegativeInfinity";
+                else if (d == double.MaxValue)
+                    display = "double.MaxValue";
+                else if (d == double.MinValue)
+                    display = "double.MinValue";
+                else
+                {
+                    if (display.IndexOf('.') == -1)
+                        display += ".0";
+                    display += "d";
+                }
+            }
+            else if (arg is float)
+            {
+                float f = (float)arg;
+
+                if (float.IsNaN(f))
+                    display = "float.NaN";
+                else if (float.IsPositiveInfinity(f))
+                    display = "float.PositiveInfinity";
+                else if (float.IsNegativeInfinity(f))
+                    display = "float.NegativeInfinity";
+                else if (f == float.MaxValue)
+                    display = "float.MaxValue";
+                else if (f == float.MinValue)
+                    display = "float.MinValue";
+                else
+                {
+                    if (display.IndexOf('.') == -1)
+                        display += ".0";
+                    display += "f";
+                }
+            }
+            else if (arg is decimal)
+            {
+                decimal d = (decimal)arg;
+                if (d == decimal.MinValue)
+                    display = "decimal.MinValue";
+                else if (d == decimal.MaxValue)
+                    display = "decimal.MaxValue";
+                else
+                    display += "m";
+            }
+            else if (arg is long)
+            {
+                long l = (long)arg;
+                if (l == long.MinValue)
+                    display = "long.MinValue";
+                else if (l == long.MinValue)
+                    display = "long.MaxValue";
+                else
+                    display += "L";
+            }
+            else if (arg is ulong)
+            {
+                ulong ul = (ulong)arg;
+                if (ul == ulong.MinValue)
+                    display = "ulong.MinValue";
+                else if (ul == ulong.MinValue)
+                    display = "ulong.MaxValue";
+                else
+                    display += "UL";
+            }
+            else if (arg is string)
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.Append("\"");
+                foreach (char c in (string)arg)
+                    sb.Append(EscapeControlChar(c));
+                sb.Append("\"");
+                display = sb.ToString();
+            }
+            else if (arg is char)
+            {
+                display = "\'" + EscapeControlChar((char)arg) + "\'";
+            }
+            else if (arg is int)
+            {
+                int ival = (int)arg;
+                if (ival == int.MaxValue)
+                    display = "int.MaxValue";
+                else if (ival == int.MinValue)
+                    display = "int.MinValue";
+            }
+
+            return display;
+        }
+
+        private static string EscapeControlChar(char c)
+        {
+            switch (c)
+            {
+                case '\'':
+                    return "\\\'";
+                case '\"':
+                    return "\\\"";
+                case '\\':
+                    return "\\\\";
+                case '\0':
+                    return "\\0";
+                case '\a':
+                    return "\\a";
+                case '\b':
+                    return "\\b";
+                case '\f':
+                    return "\\f";
+                case '\n':
+                    return "\\n";
+                case '\r':
+                    return "\\r";
+                case '\t':
+                    return "\\t";
+                case '\v':
+                    return "\\v";
+
+                case '\x0085':
+                case '\x2028':
+                case '\x2029':
+                    return string.Format("\\x{0:X4}", (int)c);
+
+                default:
+                    return char.IsControl(c) || (int)c > 128
+                        ? string.Format("\\x{0:X4}", (int)c)
+                        : c.ToString();
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/NUnitAsyncTestMethod.cs b/src/NUnitCore/core/NUnitAsyncTestMethod.cs
new file mode 100644
index 0000000..78df070
--- /dev/null
+++ b/src/NUnitCore/core/NUnitAsyncTestMethod.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Reflection;
+using NUnit.Framework;
+
+namespace NUnit.Core
+{
+    public class NUnitAsyncTestMethod : NUnitTestMethod
+    {
+	    public NUnitAsyncTestMethod(MethodInfo method) : base(method)
+        {
+        }
+
+        protected override object RunTestMethod()
+        {
+			using (AsyncInvocationRegion region = AsyncInvocationRegion.Create(method))
+			{
+				object result = base.RunTestMethod();
+
+				try
+				{
+					return region.WaitForPendingOperationsToComplete(result);
+				}
+				catch (Exception e)
+				{
+					throw new NUnitException("Rethrown", e);
+				}
+			}
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitCore/core/NUnitConfiguration.cs b/src/NUnitCore/core/NUnitConfiguration.cs
index 596a985..09c9d36 100644
--- a/src/NUnitCore/core/NUnitConfiguration.cs
+++ b/src/NUnitCore/core/NUnitConfiguration.cs
@@ -1,262 +1,262 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using System.Configuration;
-using System.Collections.Specialized;
-using System.Threading;
-using Microsoft.Win32;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// Provides static methods for accessing the NUnit config
-    /// file 
-    /// </summary>
-    public class NUnitConfiguration
-    {
-        #region Public Properties
-
-        #region BuildConfiguration
-        public static string BuildConfiguration
-        {
-            get
-            {
-#if DEBUG
-                    return "Debug";
-#else
-					return "Release";
-#endif
-            }
-        }
-        #endregion
-
-        #region NUnitLibDirectory
-        private static string nunitLibDirectory;
-        /// <summary>
-        /// Gets the path to the lib directory for the version and build
-        /// of NUnit currently executing.
-        /// </summary>
-        public static string NUnitLibDirectory
-        {
-            get
-            {
-                if (nunitLibDirectory == null)
-                {
-                    nunitLibDirectory =
-                        AssemblyHelper.GetDirectoryName(Assembly.GetExecutingAssembly());
-                }
-
-                return nunitLibDirectory;
-            }
-        }
-        #endregion
-
-        #region NUnitBinDirectory
-        private static string nunitBinDirectory;
-        public static string NUnitBinDirectory
-        {
-            get
-            {
-                if (nunitBinDirectory == null)
-                {
-                    nunitBinDirectory = NUnitLibDirectory;
-                    if (Path.GetFileName(nunitBinDirectory).ToLower() == "lib")
-                        nunitBinDirectory = Path.GetDirectoryName(nunitBinDirectory);
-                }
-
-                return nunitBinDirectory;
-            }
-        }
-        #endregion
-
-        #region 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
-        {
-            get
-            {
-                if (addinDirectory == null)
-                {
-                    addinDirectory = Path.Combine(NUnitBinDirectory, "addins");
-                }
-
-                return addinDirectory;
-            }
-        }
-        #endregion
-
-        #region TestAgentExePath
-        //private static string testAgentExePath;
-        //private static string TestAgentExePath
-        //{
-        //    get
-        //    {
-        //        if (testAgentExePath == null)
-        //            testAgentExePath = Path.Combine(NUnitBinDirectory, "nunit-agent.exe");
-
-        //        return testAgentExePath;
-        //    }
-        //}
-        #endregion
-
-        #region MonoExePath
-        private static string monoExePath;
-        public static string MonoExePath
-        {
-            get
-            {
-                if (monoExePath == null)
-                {
-                    string[] searchNames = IsWindows()
-                        ? new string[] { "mono.bat", "mono.cmd", "mono.exe" }
-                        : new string[] { "mono", "mono.exe" };
-                    
-                    monoExePath = FindOneOnPath(searchNames);
-
-                    if (monoExePath == null && IsWindows())
-                    {
-                        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
-                        if (key != null)
-                        {
-                            string version = key.GetValue("DefaultCLR") as string;
-                            if (version != null)
-                            {
-                                key = key.OpenSubKey(version);
-                                if (key != null)
-                                {
-                                    string installDir = key.GetValue("SdkInstallRoot") as string;
-                                    if (installDir != null)
-                                        monoExePath = Path.Combine(installDir, @"bin\mono.exe");
-                                }
-                            }
-                        }
-                    }
-
-                    if (monoExePath == null)
-                        return "mono";
-                }
-
-                return monoExePath;
-            }
-        }
-
-        private static string FindOneOnPath(string[] names)
-        {
-            //foreach (string dir in Environment.GetEnvironmentVariable("path").Split(new char[] { Path.PathSeparator }))
-            //    foreach (string name in names)
-            //    {
-            //        string fullPath = Path.Combine(dir, name);
-            //        if (File.Exists(fullPath))
-            //            return name;
-            //    }
-
-            return null;
-        }
-
-        private static bool IsWindows()
-        {
-            return Environment.OSVersion.Platform == PlatformID.Win32NT;
-        }
-        #endregion
-
-        #region ApplicationDataDirectory
-        private static string applicationDirectory;
-        public static string ApplicationDirectory
-        {
-            get
-            {
-                if (applicationDirectory == null)
-                {
-                    applicationDirectory = Path.Combine(
-                        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
-                        "NUnit");
-                }
-
-                return applicationDirectory;
-            }
-        }
-        #endregion
-
-        #region LogDirectory
-        private static string logDirectory;
-        public static string LogDirectory
-        {
-            get
-            {
-                if (logDirectory == null)
-                {
-                    logDirectory = Path.Combine(ApplicationDirectory, "logs");
-                }
-
-                return logDirectory;
-            }
-        }
-        #endregion
-
-        #region HelpUrl
-        public static string HelpUrl
-        {
-            get
-            {
-                string helpUrl = "http://nunit.org";
-
-                string dir = Path.GetDirectoryName(NUnitBinDirectory);
-                string docDir = null;
-
-                while (dir != null)
-                {
-                    docDir = Path.Combine(dir, "doc");
-                    if (Directory.Exists(docDir))
-                        break;
-                    dir = Path.GetDirectoryName(dir);
-                }
-
-                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();
-                    }
-                }
-
-                return helpUrl;
-            }
-        }
-        #endregion
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Configuration;
+using System.Collections.Specialized;
+using System.Threading;
+using Microsoft.Win32;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Provides static methods for accessing the NUnit config
+    /// file 
+    /// </summary>
+    public class NUnitConfiguration
+    {
+        #region Public Properties
+
+        #region BuildConfiguration
+        public static string BuildConfiguration
+        {
+            get
+            {
+#if DEBUG
+                    return "Debug";
+#else
+					return "Release";
+#endif
+            }
+        }
+        #endregion
+
+        #region NUnitLibDirectory
+        private static string nunitLibDirectory;
+        /// <summary>
+        /// Gets the path to the lib directory for the version and build
+        /// of NUnit currently executing.
+        /// </summary>
+        public static string NUnitLibDirectory
+        {
+            get
+            {
+                if (nunitLibDirectory == null)
+                {
+                    nunitLibDirectory =
+                        AssemblyHelper.GetDirectoryName(Assembly.GetExecutingAssembly());
+                }
+
+                return nunitLibDirectory;
+            }
+        }
+        #endregion
+
+        #region NUnitBinDirectory
+        private static string nunitBinDirectory;
+        public static string NUnitBinDirectory
+        {
+            get
+            {
+                if (nunitBinDirectory == null)
+                {
+                    nunitBinDirectory = NUnitLibDirectory;
+                    if (Path.GetFileName(nunitBinDirectory).ToLower() == "lib")
+                        nunitBinDirectory = Path.GetDirectoryName(nunitBinDirectory);
+                }
+
+                return nunitBinDirectory;
+            }
+        }
+        #endregion
+
+        #region 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
+        {
+            get
+            {
+                if (addinDirectory == null)
+                {
+                    addinDirectory = Path.Combine(NUnitBinDirectory, "addins");
+                }
+
+                return addinDirectory;
+            }
+        }
+        #endregion
+
+        #region TestAgentExePath
+        //private static string testAgentExePath;
+        //private static string TestAgentExePath
+        //{
+        //    get
+        //    {
+        //        if (testAgentExePath == null)
+        //            testAgentExePath = Path.Combine(NUnitBinDirectory, "nunit-agent.exe");
+
+        //        return testAgentExePath;
+        //    }
+        //}
+        #endregion
+
+        #region MonoExePath
+        private static string monoExePath;
+        public static string MonoExePath
+        {
+            get
+            {
+                if (monoExePath == null)
+                {
+                    string[] searchNames = IsWindows()
+                        ? new string[] { "mono.bat", "mono.cmd", "mono.exe" }
+                        : new string[] { "mono", "mono.exe" };
+                    
+                    monoExePath = FindOneOnPath(searchNames);
+
+                    if (monoExePath == null && IsWindows())
+                    {
+                        RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                        if (key != null)
+                        {
+                            string version = key.GetValue("DefaultCLR") as string;
+                            if (version != null)
+                            {
+                                key = key.OpenSubKey(version);
+                                if (key != null)
+                                {
+                                    string installDir = key.GetValue("SdkInstallRoot") as string;
+                                    if (installDir != null)
+                                        monoExePath = Path.Combine(installDir, @"bin\mono.exe");
+                                }
+                            }
+                        }
+                    }
+
+                    if (monoExePath == null)
+                        return "mono";
+                }
+
+                return monoExePath;
+            }
+        }
+
+        private static string FindOneOnPath(string[] names)
+        {
+            //foreach (string dir in Environment.GetEnvironmentVariable("path").Split(new char[] { Path.PathSeparator }))
+            //    foreach (string name in names)
+            //    {
+            //        string fullPath = Path.Combine(dir, name);
+            //        if (File.Exists(fullPath))
+            //            return name;
+            //    }
+
+            return null;
+        }
+
+        private static bool IsWindows()
+        {
+            return Environment.OSVersion.Platform == PlatformID.Win32NT;
+        }
+        #endregion
+
+        #region ApplicationDataDirectory
+        private static string applicationDirectory;
+        public static string ApplicationDirectory
+        {
+            get
+            {
+                if (applicationDirectory == null)
+                {
+                    applicationDirectory = Path.Combine(
+                        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
+                        "NUnit");
+                }
+
+                return applicationDirectory;
+            }
+        }
+        #endregion
+
+        #region LogDirectory
+        private static string logDirectory;
+        public static string LogDirectory
+        {
+            get
+            {
+                if (logDirectory == null)
+                {
+                    logDirectory = Path.Combine(ApplicationDirectory, "logs");
+                }
+
+                return logDirectory;
+            }
+        }
+        #endregion
+
+        #region HelpUrl
+        public static string HelpUrl
+        {
+            get
+            {
+                string helpUrl = "http://nunit.org";
+
+                string dir = Path.GetDirectoryName(NUnitBinDirectory);
+                string docDir = null;
+
+                while (dir != null)
+                {
+                    docDir = Path.Combine(dir, "doc");
+                    if (Directory.Exists(docDir))
+                        break;
+                    dir = Path.GetDirectoryName(dir);
+                }
+
+                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();
+                    }
+                }
+
+                return helpUrl;
+            }
+        }
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/NUnitException.cs b/src/NUnitCore/core/NUnitException.cs
index adc631f..aee9c8a 100644
--- a/src/NUnitCore/core/NUnitException.cs
+++ b/src/NUnitCore/core/NUnitException.cs
@@ -1,50 +1,50 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core 
-{
-	using System;
-	using System.Runtime.Serialization;
-  
-	/// <summary>
-	/// Thrown when an assertion failed. Here to preserve the inner
-	/// exception and hence its stack trace.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class NUnitException : ApplicationException 
-	{
-		public NUnitException () : base() 
-		{} 
-
-		/// <summary>
-		/// Standard constructor
-		/// </summary>
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		public NUnitException(string message) : base (message)
-		{}
-
-		/// <summary>
-		/// Standard constructor
-		/// </summary>
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		/// <param name="inner">The exception that caused the 
-		/// current exception</param>
-		public NUnitException(string message, Exception inner) :
-			base(message, inner) 
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected NUnitException(SerializationInfo info, 
-			StreamingContext context) : base(info,context){}
-
-
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core 
+{
+	using System;
+	using System.Runtime.Serialization;
+  
+	/// <summary>
+	/// Thrown when an assertion failed. Here to preserve the inner
+	/// exception and hence its stack trace.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class NUnitException : ApplicationException 
+	{
+		public NUnitException () : base() 
+		{} 
+
+		/// <summary>
+		/// Standard constructor
+		/// </summary>
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		public NUnitException(string message) : base (message)
+		{}
+
+		/// <summary>
+		/// Standard constructor
+		/// </summary>
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		/// <param name="inner">The exception that caused the 
+		/// current exception</param>
+		public NUnitException(string message, Exception inner) :
+			base(message, inner) 
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+		protected NUnitException(SerializationInfo info, 
+			StreamingContext context) : base(info,context){}
+
+
+	}
+}
diff --git a/src/NUnitCore/core/NUnitFramework.cs b/src/NUnitCore/core/NUnitFramework.cs
index 981c7e3..1b5edbb 100644
--- a/src/NUnitCore/core/NUnitFramework.cs
+++ b/src/NUnitCore/core/NUnitFramework.cs
@@ -1,454 +1,467 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Reflection;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Diagnostics;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Static methods that implement aspects of the NUnit framework that cut 
-	/// across individual test types, extensions, etc. Some of these use the 
-	/// methods of the Reflect class to implement operations specific to the 
-	/// NUnit Framework.
-	/// </summary>
-	public class NUnitFramework
-	{
-        #region Constants
-
-		#region Attribute Names
-		// NOTE: Attributes used in switch statements must be const
-
-        // Attributes that apply to Assemblies, Classes and Methods
-        public const string IgnoreAttribute = "NUnit.Framework.IgnoreAttribute";
-		public const string PlatformAttribute = "NUnit.Framework.PlatformAttribute";
-		public const string CultureAttribute = "NUnit.Framework.CultureAttribute";
-		public const string ExplicitAttribute = "NUnit.Framework.ExplicitAttribute";
-        public const string CategoryAttribute = "NUnit.Framework.CategoryAttribute";
-        public const string PropertyAttribute = "NUnit.Framework.PropertyAttribute";
-		public const string DescriptionAttribute = "NUnit.Framework.DescriptionAttribute";
-        public const string RequiredAddinAttribute = "NUnit.Framework.RequiredAddinAttribute";
-
-        // Attributes that apply only to Classes
-        public const string TestFixtureAttribute = "NUnit.Framework.TestFixtureAttribute";
-        public const string SetUpFixtureAttribute = "NUnit.Framework.SetUpFixtureAttribute";
-
-        // Attributes that apply only to Methods
-        public const string TestAttribute = "NUnit.Framework.TestAttribute";
-        public const string TestCaseAttribute = "NUnit.Framework.TestCaseAttribute";
-        public const string TestCaseSourceAttribute = "NUnit.Framework.TestCaseSourceAttribute";
-        public const string TheoryAttribute = "NUnit.Framework.TheoryAttribute";
-        public static readonly string SetUpAttribute = "NUnit.Framework.SetUpAttribute";
-        public static readonly string TearDownAttribute = "NUnit.Framework.TearDownAttribute";
-        public static readonly string FixtureSetUpAttribute = "NUnit.Framework.TestFixtureSetUpAttribute";
-        public static readonly string FixtureTearDownAttribute = "NUnit.Framework.TestFixtureTearDownAttribute";
-        public static readonly string ExpectedExceptionAttribute = "NUnit.Framework.ExpectedExceptionAttribute";
-
-        // Attributes that apply only to Properties
-        public static readonly string SuiteAttribute = "NUnit.Framework.SuiteAttribute";
-        #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";
-        public static readonly string SuccessException = "NUnit.Framework.SuccessException";
-        public static readonly string AssertType = "NUnit.Framework.Assert";
-		public static readonly string ExpectExceptionInterface = "NUnit.Framework.IExpectException";
-        #endregion
-
-        #region Core Types
-        public static readonly string SuiteBuilderAttribute = typeof(SuiteBuilderAttribute).FullName;
-        public static readonly string SuiteBuilderInterface = typeof(ISuiteBuilder).FullName;
-
-        public static readonly string TestCaseBuilderAttributeName = typeof(TestCaseBuilderAttribute).FullName;
-        public static readonly string TestCaseBuilderInterfaceName = typeof(ITestCaseBuilder).FullName;
-
-        public static readonly string TestDecoratorAttributeName = typeof(TestDecoratorAttribute).FullName;
-        public static readonly string TestDecoratorInterfaceName = typeof(ITestDecorator).FullName;
-        #endregion
-
-        #endregion
-
-        #region Properties
-        private static Assembly frameworkAssembly;
-        private static bool frameworkAssemblyInitialized;
-        private static Assembly FrameworkAssembly
-        {
-            get
-            {
-                if (!frameworkAssemblyInitialized)
-                    foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
-                        if (assembly.GetName().Name == "nunit.framework" ||
-                            assembly.GetName().Name == "NUnitLite")
-                        {
-                            frameworkAssembly = assembly;
-                            break;
-                        }
-
-                frameworkAssemblyInitialized = true;
-
-                return frameworkAssembly;
-            }
-        }
-        #endregion
-
-        #region Check SetUp and TearDown methods
-        public static bool CheckSetUpTearDownMethods(Type fixtureType, string attributeName, ref string reason)
-        {
-            foreach( MethodInfo theMethod in Reflect.GetMethodsWithAttribute(fixtureType, attributeName, true ))
-                if ( theMethod.IsAbstract ||
-                     !theMethod.IsPublic && !theMethod.IsFamily ||
-                     theMethod.GetParameters().Length > 0 ||
-                     !theMethod.ReturnType.Equals(typeof(void)))
-                {
-                    reason = string.Format( "Invalid signature for SetUp or TearDown method: {0}", theMethod.Name );
-                    return false;
-                }
-
-            return true;
-        }
-        #endregion
-
-        #region Get Special Properties of Attributes
-
-        #region IgnoreReason
-        public static string GetIgnoreReason( System.Attribute attribute )
-		{
-            return Reflect.GetPropertyValue(attribute, PropertyNames.Reason) as string;
-		}
-		#endregion
-
-		#region Description
-		/// <summary>
-		/// Method to return the description from an source
-		/// </summary>
-		/// <param name="source">The source to check</param>
-		/// <returns>The description, if any, or null</returns>
-		public static string GetDescription(System.Attribute attribute)
-		{
-            return Reflect.GetPropertyValue(attribute, PropertyNames.Description) as string;
-		}
-		#endregion
-
-		#endregion
-
-		#region ApplyCommonAttributes
-        /// <summary>
-        /// Modify a newly constructed test based on a type or method by 
-        /// applying any of NUnit's common attributes.
-        /// </summary>
-        /// <param name="member">The type or method from which the test was constructed</param>
-        /// <param name="test">The test to which the attributes apply</param>
-        public static void ApplyCommonAttributes(MemberInfo member, Test test)
-        {
-            ApplyCommonAttributes( Reflect.GetAttributes( member, true ), test );
-        }
-
-        /// <summary>
-        /// Modify a newly constructed test based on an assembly by applying 
-        /// any of NUnit's common attributes.
-        /// </summary>
-        /// <param name="assembly">The assembly from which the test was constructed</param>
-        /// <param name="test">The test to which the attributes apply</param>
-        public static void ApplyCommonAttributes(Assembly assembly, Test test)
-        {
-            ApplyCommonAttributes( Reflect.GetAttributes( assembly, false ), test );
-        }
-
-        /// <summary>
-        /// Modify a newly constructed test by applying any of NUnit's common
-        /// attributes, based on an input array of attributes. This method checks
-        /// for all attributes, relying on the fact that specific attributes can only
-        /// occur on those constructs on which they are allowed.
-        /// </summary>
-        /// <param name="attributes">An array of attributes possibly including NUnit attributes
-        /// <param name="test">The test to which the attributes apply</param>
-        public static void ApplyCommonAttributes(Attribute[] attributes, Test test)
-        {
-            foreach (Attribute attribute in attributes)
-            {
-				Type attributeType = attribute.GetType();
-				string attributeName = attributeType.FullName;
-                bool isValid = test.RunState != RunState.NotRunnable;
-
-                switch (attributeName)
-                {
-					case TestFixtureAttribute:
-					case TestAttribute:
-						if ( test.Description == null )
-							test.Description = GetDescription( attribute );
-						break;
-					case DescriptionAttribute:
-						test.Description = GetDescription( attribute );
-						break;
-                    case PlatformAttribute:
-                        PlatformHelper pHelper = new PlatformHelper();
-                        if (isValid && !pHelper.IsPlatformSupported(attribute))
-                        {
-                            test.RunState = RunState.Skipped;
-                            test.IgnoreReason = GetIgnoreReason(attribute);
-							if ( test.IgnoreReason == null )
-								test.IgnoreReason = pHelper.Reason;
-                        }
-                        break;
-					case CultureAttribute:
-						CultureDetector cultureDetector = new CultureDetector();
-						if (isValid && !cultureDetector.IsCultureSupported(attribute))
-						{
-							test.RunState = RunState.Skipped;
-							test.IgnoreReason = cultureDetector.Reason;
-						}
-						break;
-                    case RequiredAddinAttribute:
-                        string required = (string)Reflect.GetPropertyValue(attribute, PropertyNames.RequiredAddin);
-                        if (!IsAddinAvailable(required))
-                        {
-                            test.RunState = RunState.NotRunnable;
-                            test.IgnoreReason = string.Format("Required addin {0} not available", required);
-                        }
-                        break;
-                    case "System.STAThreadAttribute":
-                        test.Properties.Add("APARTMENT_STATE", System.Threading.ApartmentState.STA);
-                        break;
-                    case "System.MTAThreadAttribute":
-                        test.Properties.Add("APARTMENT_STATE", System.Threading.ApartmentState.MTA);
-                        break;
-                    default:
-						if ( Reflect.InheritsFrom( attributeType, CategoryAttribute ) )
-						{
-                            string categoryName = (string)Reflect.GetPropertyValue(attribute, PropertyNames.CategoryName);
-                            test.Categories.Add(categoryName);
-
-                            if (!IsValidCategoryName(categoryName))
-                            {
-                                test.RunState = RunState.NotRunnable;
-                                test.IgnoreReason = "Category name must not contain ',', '!', '+' or '-'";
-                            }
-                        }
-						else if ( Reflect.InheritsFrom( attributeType, PropertyAttribute ) )
-						{
-							IDictionary props = (IDictionary)Reflect.GetPropertyValue( attribute, PropertyNames.Properties );
-							if ( props != null )
-                                foreach( DictionaryEntry entry in props )
-                                    test.Properties.Add(entry.Key, entry.Value);
-						}
-                        else if ( Reflect.InheritsFrom( attributeType, ExplicitAttribute ) )
-                         {
-                             if (isValid)
-                             {
-                                 test.RunState = RunState.Explicit;
-                                 test.IgnoreReason = GetIgnoreReason(attribute);
-                             }
-                         }
-                        else if (Reflect.InheritsFrom(attributeType, IgnoreAttribute))
-                         {
-                             if (isValid)
-                             {
-                                 test.RunState = RunState.Ignored;
-                                 test.IgnoreReason = GetIgnoreReason(attribute);
-                             }
-                         }
-						break;
-                }
-            }
-        }
-		#endregion
-
-        #region ApplyExpectedExceptionAttribute
-        /// <summary>
-        /// Modify a newly constructed test by checking for ExpectedExceptionAttribute
-        /// and setting properties on the test accordingly.
-        /// </summary>
-        /// <param name="attributes">An array of attributes possibly including NUnit attributes
-        /// <param name="test">The test to which the attributes apply</param>
-        public static void ApplyExpectedExceptionAttribute(MethodInfo method, TestMethod testMethod)
-        {
-            Attribute attribute = Reflect.GetAttribute(
-                method, NUnitFramework.ExpectedExceptionAttribute, false);
-
-            if (attribute != null)
-                testMethod.ExceptionProcessor = new ExpectedExceptionProcessor(testMethod, attribute);
-        }
-
-        #endregion
-
-        #region IsSuiteBuilder
-        public static bool IsSuiteBuilder( Type type )
-		{
-			return Reflect.HasAttribute( type, SuiteBuilderAttribute, false )
-				&& Reflect.HasInterface( type, SuiteBuilderInterface );
-		}
-		#endregion
-
-		#region IsTestCaseBuilder
-		public static bool IsTestCaseBuilder( Type type )
-		{
-			return Reflect.HasAttribute( type, TestCaseBuilderAttributeName, false )
-				&& Reflect.HasInterface( type, TestCaseBuilderInterfaceName );
-		}
-		#endregion
-
-		#region IsTestDecorator
-		public static bool IsTestDecorator( Type type )
-		{
-			return Reflect.HasAttribute( type, TestDecoratorAttributeName, false )
-				&& Reflect.HasInterface( type, TestDecoratorInterfaceName );
-		}
-		#endregion
-
-        #region IsAddinAvailable
-        public static bool IsAddinAvailable(string name)
-        {
-            foreach (Addin addin in CoreExtensions.Host.AddinRegistry.Addins)
-                if (addin.Name == name && addin.Status == AddinStatus.Loaded)
-                    return true;
-
-            return false;
-        }
-        #endregion
-
-        #region Framework Assert Access
-
-        /// <summary>
-        /// NUnitFramework.Assert is a nested class that implements
-        /// a few of the framework operations by reflection, 
-        /// using whatever framework version is available.
-        /// </summary>
-        public class Assert
-        {
-            #region Properties
-            private static Type assertType;
-            private static Type AssertType
-            {
-                get
-                {
-                    if (assertType == null && FrameworkAssembly != null)
-                        assertType = FrameworkAssembly.GetType(NUnitFramework.AssertType);
-
-                    return assertType;
-                }
-            }
-
-            private static MethodInfo areEqualMethod;
-            private static MethodInfo AreEqualMethod
-            {
-                get
-                {
-                    if (areEqualMethod == null && AssertType != null)
-                        areEqualMethod = AssertType.GetMethod(
-                            "AreEqual", 
-                            BindingFlags.Static | BindingFlags.Public, 
-                            null, 
-                            new Type[] { typeof(object), typeof(object) },
-                            null );
-
-                    return areEqualMethod;
-                }
-            }
-
-            private static PropertyInfo counterProperty;
-            private static PropertyInfo CounterProperty
-            {
-                get
-                {
-                    if (counterProperty == null && AssertType != null)
-                        counterProperty = Reflect.GetNamedProperty(
-                            AssertType,
-                            "Counter",
-                            BindingFlags.Public | BindingFlags.Static);
-
-                    return counterProperty;
-                }
-            }
-            #endregion
-
-            /// <summary>
-            /// Invoke Assert.AreEqual by reflection
-            /// </summary>
-            /// <param name="expected">The expected value</param>
-            /// <param name="actual">The actual value</param>
-            public static void AreEqual(object expected, object actual)
-            {
-                if (AreEqualMethod != null)
-                    try
-                    {
-                        AreEqualMethod.Invoke(null, new object[] { expected, actual });
-                    }
-                    catch (TargetInvocationException e)
-                    {
-                        Exception inner = e.InnerException;
-                        throw new NUnitException("Rethrown", inner);
-                    }
-            }
-
-            /// <summary>
-            /// Get the assertion counter. It clears itself automatically
-            /// on each call.
-            /// </summary>
-            /// <returns>Count of number of asserts since last call</returns>
-            public static int GetAssertCount()
-            {
-                return CounterProperty == null
-                    ? 0
-                    : (int)CounterProperty.GetValue(null, new object[0]);
-            }
-        }
-
-        #endregion
-
-        #region GetResultState
-        /// <summary>
-        /// Returns a result state for a special exception.
-        /// If the exception is not handled specially, returns
-        /// ResultState.Error.
-        /// </summary>
-        /// <param name="ex">The exception to be examined</param>
-        /// <returns>A ResultState</returns>
-        public static ResultState GetResultState(Exception ex)
-        {
-            if (ex is System.Threading.ThreadAbortException)
-                return ResultState.Cancelled;
-
-            string name = ex.GetType().FullName;
-
-            if (name == NUnitFramework.AssertException)
-                return ResultState.Failure;
-            else
-                if (name == NUnitFramework.IgnoreException)
-                    return ResultState.Ignored;
-                else
-                    if (name == NUnitFramework.InconclusiveException)
-                        return ResultState.Inconclusive;
-                    else
-                        if (name == NUnitFramework.SuccessException)
-                            return ResultState.Success;
-                        else
-                            return ResultState.Error;
-        }
-        #endregion
-
-        #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
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Diagnostics;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Static methods that implement aspects of the NUnit framework that cut 
+	/// across individual test types, extensions, etc. Some of these use the 
+	/// methods of the Reflect class to implement operations specific to the 
+	/// NUnit Framework.
+	/// </summary>
+	public class NUnitFramework
+	{
+        #region Constants
+
+		#region Attribute Names
+		// NOTE: Attributes used in switch statements must be const
+
+        // Attributes that apply to Assemblies, Classes and Methods
+        public const string IgnoreAttribute = "NUnit.Framework.IgnoreAttribute";
+		public const string PlatformAttribute = "NUnit.Framework.PlatformAttribute";
+		public const string CultureAttribute = "NUnit.Framework.CultureAttribute";
+		public const string ExplicitAttribute = "NUnit.Framework.ExplicitAttribute";
+        public const string CategoryAttribute = "NUnit.Framework.CategoryAttribute";
+        public const string PropertyAttribute = "NUnit.Framework.PropertyAttribute";
+		public const string DescriptionAttribute = "NUnit.Framework.DescriptionAttribute";
+        public const string RequiredAddinAttribute = "NUnit.Framework.RequiredAddinAttribute";
+
+        // Attributes that apply only to Classes
+        public const string TestFixtureAttribute = "NUnit.Framework.TestFixtureAttribute";
+        public const string SetUpFixtureAttribute = "NUnit.Framework.SetUpFixtureAttribute";
+
+        // Attributes that apply only to Methods
+        public const string TestAttribute = "NUnit.Framework.TestAttribute";
+        public const string TestCaseAttribute = "NUnit.Framework.TestCaseAttribute";
+        public const string TestCaseSourceAttribute = "NUnit.Framework.TestCaseSourceAttribute";
+        public const string TheoryAttribute = "NUnit.Framework.TheoryAttribute";
+        public static readonly string SetUpAttribute = "NUnit.Framework.SetUpAttribute";
+        public static readonly string TearDownAttribute = "NUnit.Framework.TearDownAttribute";
+        public static readonly string FixtureSetUpAttribute = "NUnit.Framework.TestFixtureSetUpAttribute";
+        public static readonly string FixtureTearDownAttribute = "NUnit.Framework.TestFixtureTearDownAttribute";
+        public static readonly string ExpectedExceptionAttribute = "NUnit.Framework.ExpectedExceptionAttribute";
+
+        // Attributes that apply only to Properties
+        public static readonly string SuiteAttribute = "NUnit.Framework.SuiteAttribute";
+        #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";
+        public static readonly string SuccessException = "NUnit.Framework.SuccessException";
+        public static readonly string AssertType = "NUnit.Framework.Assert";
+		public static readonly string ExpectExceptionInterface = "NUnit.Framework.IExpectException";
+        #endregion
+
+        #region Core Types
+        public static readonly string SuiteBuilderAttribute = typeof(SuiteBuilderAttribute).FullName;
+        public static readonly string SuiteBuilderInterface = typeof(ISuiteBuilder).FullName;
+
+        public static readonly string TestCaseBuilderAttributeName = typeof(TestCaseBuilderAttribute).FullName;
+        public static readonly string TestCaseBuilderInterfaceName = typeof(ITestCaseBuilder).FullName;
+
+        public static readonly string TestDecoratorAttributeName = typeof(TestDecoratorAttribute).FullName;
+        public static readonly string TestDecoratorInterfaceName = typeof(ITestDecorator).FullName;
+        #endregion
+
+        #endregion
+
+        #region Properties
+        private static Assembly frameworkAssembly;
+        private static bool frameworkAssemblyInitialized;
+        private static Assembly FrameworkAssembly
+        {
+            get
+            {
+                if (!frameworkAssemblyInitialized)
+                    foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
+                        if (assembly.GetName().Name == "nunit.framework" ||
+                            assembly.GetName().Name == "NUnitLite")
+                        {
+                            frameworkAssembly = assembly;
+                            break;
+                        }
+
+                frameworkAssemblyInitialized = true;
+
+                return frameworkAssembly;
+            }
+        }
+        #endregion
+
+        #region Check SetUp and TearDown methods
+        public static bool CheckSetUpTearDownMethods(Type fixtureType, string attributeName, ref string reason)
+        {
+            foreach( MethodInfo theMethod in Reflect.GetMethodsWithAttribute(fixtureType, attributeName, true ))
+                if ( theMethod.IsAbstract ||
+                     !theMethod.IsPublic && !theMethod.IsFamily ||
+                     theMethod.GetParameters().Length > 0 ||
+                     !theMethod.ReturnType.Equals(typeof(void)))
+                {
+                    reason = string.Format( "Invalid signature for SetUp or TearDown method: {0}", theMethod.Name );
+                    return false;
+                }
+
+            return true;
+        }
+        #endregion
+
+        #region Get Special Properties of Attributes
+
+        #region IgnoreReason
+        public static string GetIgnoreReason( System.Attribute attribute )
+		{
+            return Reflect.GetPropertyValue(attribute, PropertyNames.Reason) as string;
+		}
+		#endregion
+
+		#region Description
+		/// <summary>
+		/// Method to return the description from an source
+		/// </summary>
+		/// <param name="source">The source to check</param>
+		/// <returns>The description, if any, or null</returns>
+		public static string GetDescription(System.Attribute attribute)
+		{
+            return Reflect.GetPropertyValue(attribute, PropertyNames.Description) as string;
+		}
+		#endregion
+
+		#endregion
+
+		#region ApplyCommonAttributes
+        /// <summary>
+        /// Modify a newly constructed test based on a type or method by 
+        /// applying any of NUnit's common attributes.
+        /// </summary>
+        /// <param name="member">The type or method from which the test was constructed</param>
+        /// <param name="test">The test to which the attributes apply</param>
+        public static void ApplyCommonAttributes(MemberInfo member, Test test)
+        {
+            ApplyCommonAttributes( Reflect.GetAttributes( member, true ), test );
+        }
+
+        /// <summary>
+        /// Modify a newly constructed test based on an assembly by applying 
+        /// any of NUnit's common attributes.
+        /// </summary>
+        /// <param name="assembly">The assembly from which the test was constructed</param>
+        /// <param name="test">The test to which the attributes apply</param>
+        public static void ApplyCommonAttributes(Assembly assembly, Test test)
+        {
+            ApplyCommonAttributes( Reflect.GetAttributes( assembly, false ), test );
+        }
+
+        /// <summary>
+        /// Modify a newly constructed test by applying any of NUnit's common
+        /// attributes, based on an input array of attributes. This method checks
+        /// for all attributes, relying on the fact that specific attributes can only
+        /// occur on those constructs on which they are allowed.
+        /// </summary>
+        /// <param name="attributes">An array of attributes possibly including NUnit attributes
+        /// <param name="test">The test to which the attributes apply</param>
+        public static void ApplyCommonAttributes(Attribute[] attributes, Test test)
+        {
+            foreach (Attribute attribute in attributes)
+            {
+				Type attributeType = attribute.GetType();
+				string attributeName = attributeType.FullName;
+                bool isValid = test.RunState != RunState.NotRunnable;
+
+                switch (attributeName)
+                {
+					case TestFixtureAttribute:
+					case TestAttribute:
+						if ( test.Description == null )
+							test.Description = GetDescription( attribute );
+						break;
+					case DescriptionAttribute:
+						test.Description = GetDescription( attribute );
+						break;
+                    case PlatformAttribute:
+                        PlatformHelper pHelper = new PlatformHelper();
+                        if (isValid && !pHelper.IsPlatformSupported(attribute))
+                        {
+                            test.RunState = RunState.Skipped;
+                            test.IgnoreReason = GetIgnoreReason(attribute);
+							if ( test.IgnoreReason == null )
+								test.IgnoreReason = pHelper.Reason;
+                        }
+                        break;
+					case CultureAttribute:
+						CultureDetector cultureDetector = new CultureDetector();
+						if (isValid && !cultureDetector.IsCultureSupported(attribute))
+						{
+							test.RunState = RunState.Skipped;
+							test.IgnoreReason = cultureDetector.Reason;
+						}
+						break;
+                    case RequiredAddinAttribute:
+                        string required = (string)Reflect.GetPropertyValue(attribute, PropertyNames.RequiredAddin);
+                        if (!IsAddinAvailable(required))
+                        {
+                            test.RunState = RunState.NotRunnable;
+                            test.IgnoreReason = string.Format("Required addin {0} not available", required);
+                        }
+                        break;
+                    case "System.STAThreadAttribute":
+                        test.Properties.Add("APARTMENT_STATE", System.Threading.ApartmentState.STA);
+                        break;
+                    case "System.MTAThreadAttribute":
+                        test.Properties.Add("APARTMENT_STATE", System.Threading.ApartmentState.MTA);
+                        break;
+                    default:
+						if ( Reflect.InheritsFrom( attributeType, CategoryAttribute ) )
+						{
+                            string categoryName = (string)Reflect.GetPropertyValue(attribute, PropertyNames.CategoryName);
+                            test.Categories.Add(categoryName);
+
+                            if (!IsValidCategoryName(categoryName))
+                            {
+                                test.RunState = RunState.NotRunnable;
+                                test.IgnoreReason = "Category name must not contain ',', '!', '+' or '-'";
+                            }
+                        }
+						else if ( Reflect.InheritsFrom( attributeType, PropertyAttribute ) )
+						{
+							object propObject = Reflect.GetPropertyValue( attribute, PropertyNames.Properties );
+                            IDictionary props = propObject as IDictionary;
+                            if (props != null)
+                                foreach (DictionaryEntry entry in props)
+                                    test.Properties.Add(entry.Key, entry.Value);
+                            else
+                            {
+                                // In case we are running NUnitLite tests
+                                IEnumerable entries = propObject as IEnumerable;
+                                if (entries != null)
+                                    foreach (object entry in entries)
+                                    {
+                                        object key = Reflect.GetPropertyValue(entry, "Name");
+                                        object value = Reflect.GetPropertyValue(entry, "Value");
+                                        test.Properties.Add(key, value);
+                                    }
+                            }
+						}
+                        else if ( Reflect.InheritsFrom( attributeType, ExplicitAttribute ) )
+                         {
+                             if (isValid)
+                             {
+                                 test.RunState = RunState.Explicit;
+                                 test.IgnoreReason = GetIgnoreReason(attribute);
+                             }
+                         }
+                        else if (Reflect.InheritsFrom(attributeType, IgnoreAttribute))
+                         {
+                             if (isValid)
+                             {
+                                 test.RunState = RunState.Ignored;
+                                 test.IgnoreReason = GetIgnoreReason(attribute);
+                             }
+                         }
+						break;
+                }
+            }
+        }
+		#endregion
+
+        #region ApplyExpectedExceptionAttribute
+        /// <summary>
+        /// Modify a newly constructed test by checking for ExpectedExceptionAttribute
+        /// and setting properties on the test accordingly.
+        /// </summary>
+        /// <param name="attributes">An array of attributes possibly including NUnit attributes
+        /// <param name="test">The test to which the attributes apply</param>
+        public static void ApplyExpectedExceptionAttribute(MethodInfo method, TestMethod testMethod)
+        {
+            Attribute attribute = Reflect.GetAttribute(
+                method, NUnitFramework.ExpectedExceptionAttribute, false);
+
+            if (attribute != null)
+                testMethod.ExceptionProcessor = new ExpectedExceptionProcessor(testMethod, attribute);
+        }
+
+        #endregion
+
+        #region IsSuiteBuilder
+        public static bool IsSuiteBuilder( Type type )
+		{
+			return Reflect.HasAttribute( type, SuiteBuilderAttribute, false )
+				&& Reflect.HasInterface( type, SuiteBuilderInterface );
+		}
+		#endregion
+
+		#region IsTestCaseBuilder
+		public static bool IsTestCaseBuilder( Type type )
+		{
+			return Reflect.HasAttribute( type, TestCaseBuilderAttributeName, false )
+				&& Reflect.HasInterface( type, TestCaseBuilderInterfaceName );
+		}
+		#endregion
+
+		#region IsTestDecorator
+		public static bool IsTestDecorator( Type type )
+		{
+			return Reflect.HasAttribute( type, TestDecoratorAttributeName, false )
+				&& Reflect.HasInterface( type, TestDecoratorInterfaceName );
+		}
+		#endregion
+
+        #region IsAddinAvailable
+        public static bool IsAddinAvailable(string name)
+        {
+            foreach (Addin addin in CoreExtensions.Host.AddinRegistry.Addins)
+                if (addin.Name == name && addin.Status == AddinStatus.Loaded)
+                    return true;
+
+            return false;
+        }
+        #endregion
+
+        #region Framework Assert Access
+
+        /// <summary>
+        /// NUnitFramework.Assert is a nested class that implements
+        /// a few of the framework operations by reflection, 
+        /// using whatever framework version is available.
+        /// </summary>
+        public class Assert
+        {
+            #region Properties
+            private static Type assertType;
+            private static Type AssertType
+            {
+                get
+                {
+                    if (assertType == null && FrameworkAssembly != null)
+                        assertType = FrameworkAssembly.GetType(NUnitFramework.AssertType);
+
+                    return assertType;
+                }
+            }
+
+            private static MethodInfo areEqualMethod;
+            private static MethodInfo AreEqualMethod
+            {
+                get
+                {
+                    if (areEqualMethod == null && AssertType != null)
+                        areEqualMethod = AssertType.GetMethod(
+                            "AreEqual", 
+                            BindingFlags.Static | BindingFlags.Public, 
+                            null, 
+                            new Type[] { typeof(object), typeof(object) },
+                            null );
+
+                    return areEqualMethod;
+                }
+            }
+
+            private static PropertyInfo counterProperty;
+            private static PropertyInfo CounterProperty
+            {
+                get
+                {
+                    if (counterProperty == null && AssertType != null)
+                        counterProperty = Reflect.GetNamedProperty(
+                            AssertType,
+                            "Counter",
+                            BindingFlags.Public | BindingFlags.Static);
+
+                    return counterProperty;
+                }
+            }
+            #endregion
+
+            /// <summary>
+            /// Invoke Assert.AreEqual by reflection
+            /// </summary>
+            /// <param name="expected">The expected value</param>
+            /// <param name="actual">The actual value</param>
+            public static void AreEqual(object expected, object actual)
+            {
+                if (AreEqualMethod != null)
+                    try
+                    {
+                        AreEqualMethod.Invoke(null, new object[] { expected, actual });
+                    }
+                    catch (TargetInvocationException e)
+                    {
+                        Exception inner = e.InnerException;
+                        throw new NUnitException("Rethrown", inner);
+                    }
+            }
+
+            /// <summary>
+            /// Get the assertion counter. It clears itself automatically
+            /// on each call.
+            /// </summary>
+            /// <returns>Count of number of asserts since last call</returns>
+            public static int GetAssertCount()
+            {
+                return CounterProperty == null
+                    ? 0
+                    : (int)CounterProperty.GetValue(null, new object[0]);
+            }
+        }
+
+        #endregion
+
+        #region GetResultState
+        /// <summary>
+        /// Returns a result state for a special exception.
+        /// If the exception is not handled specially, returns
+        /// ResultState.Error.
+        /// </summary>
+        /// <param name="ex">The exception to be examined</param>
+        /// <returns>A ResultState</returns>
+        public static ResultState GetResultState(Exception ex)
+        {
+            if (ex is System.Threading.ThreadAbortException)
+                return ResultState.Cancelled;
+
+            string name = ex.GetType().FullName;
+
+            if (name == NUnitFramework.AssertException)
+                return ResultState.Failure;
+            else
+                if (name == NUnitFramework.IgnoreException)
+                    return ResultState.Ignored;
+                else
+                    if (name == NUnitFramework.InconclusiveException)
+                        return ResultState.Inconclusive;
+                    else
+                        if (name == NUnitFramework.SuccessException)
+                            return ResultState.Success;
+                        else
+                            return ResultState.Error;
+        }
+        #endregion
+
+        #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 a07e0df..61932b5 100644
--- a/src/NUnitCore/core/NUnitTestFixture.cs
+++ b/src/NUnitCore/core/NUnitTestFixture.cs
@@ -1,52 +1,52 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// Class to implement an NUnit test fixture
-    /// </summary>
-    public class NUnitTestFixture : TestFixture
-    {
-        public NUnitTestFixture(Type fixtureType)
-            : this(fixtureType, null) { }
-
-        public NUnitTestFixture(Type fixtureType, object[] arguments)
-            : base(fixtureType, arguments)
-        {
-            this.fixtureSetUpMethods =
-                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureSetUpAttribute, true);
-            this.fixtureTearDownMethods =
-                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureTearDownAttribute, true);
-            this.setUpMethods = 
-                Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.SetUpAttribute, true);
-            this.tearDownMethods = 
-                Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.TearDownAttribute, true);
-
-#if CLR_2_0 || CLR_4_0
-            this.actions = ActionsHelper.GetActionsFromTypesAttributes(fixtureType);
-#endif
-        }
-
-        protected override void DoOneTimeSetUp(TestResult suiteResult)
-        {
-            base.DoOneTimeSetUp(suiteResult);
-
-			suiteResult.AssertCount = NUnitFramework.Assert.GetAssertCount(); ;
-        }
-
-        protected override void DoOneTimeTearDown(TestResult suiteResult)
-        {
-            base.DoOneTimeTearDown(suiteResult);
-
-			suiteResult.AssertCount += NUnitFramework.Assert.GetAssertCount();
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Class to implement an NUnit test fixture
+    /// </summary>
+    public class NUnitTestFixture : TestFixture
+    {
+        public NUnitTestFixture(Type fixtureType)
+            : this(fixtureType, null) { }
+
+        public NUnitTestFixture(Type fixtureType, object[] arguments)
+            : base(fixtureType, arguments)
+        {
+            this.fixtureSetUpMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureSetUpAttribute, true);
+            this.fixtureTearDownMethods =
+                Reflect.GetMethodsWithAttribute(fixtureType, NUnitFramework.FixtureTearDownAttribute, true);
+            this.setUpMethods = 
+                Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.SetUpAttribute, true);
+            this.tearDownMethods = 
+                Reflect.GetMethodsWithAttribute(this.FixtureType, NUnitFramework.TearDownAttribute, true);
+
+#if CLR_2_0 || CLR_4_0
+            this.actions = ActionsHelper.GetActionsFromTypesAttributes(fixtureType);
+#endif
+        }
+
+        protected override void DoOneTimeSetUp(TestResult suiteResult)
+        {
+            base.DoOneTimeSetUp(suiteResult);
+
+			suiteResult.AssertCount = NUnitFramework.Assert.GetAssertCount(); ;
+        }
+
+        protected override void DoOneTimeTearDown(TestResult suiteResult)
+        {
+            base.DoOneTimeTearDown(suiteResult);
+
+			suiteResult.AssertCount += NUnitFramework.Assert.GetAssertCount();
+        }
+    }
+}
diff --git a/src/NUnitCore/core/NUnitTestMethod.cs b/src/NUnitCore/core/NUnitTestMethod.cs
index 2dc8fba..4cdd5de 100644
--- a/src/NUnitCore/core/NUnitTestMethod.cs
+++ b/src/NUnitCore/core/NUnitTestMethod.cs
@@ -1,39 +1,39 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// Class to implement an NUnit test method
-	/// </summary>
-	public class NUnitTestMethod : TestMethod
-	{
-		#region Constructor
-		public NUnitTestMethod(MethodInfo method) : base(method) 
-        {
-        }
-		#endregion
-
-		#region TestMethod Overrides
-
-        /// <summary>
-		/// Run a test returning the result. Overrides TestMethod
-		/// to count assertions.
-		/// </summary>
-		/// <param name="testResult"></param>
-		public override TestResult RunTest()
-		{
-			TestResult testResult = base.RunTest();
-
-			testResult.AssertCount = NUnitFramework.Assert.GetAssertCount();
-			
-			return testResult;
-		}
-        #endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Reflection;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Class to implement an NUnit test method
+	/// </summary>
+	public class NUnitTestMethod : TestMethod
+	{
+		#region Constructor
+		public NUnitTestMethod(MethodInfo method) : base(method) 
+        {
+        }
+		#endregion
+
+		#region TestMethod Overrides
+
+        /// <summary>
+		/// Run a test returning the result. Overrides TestMethod
+		/// to count assertions.
+		/// </summary>
+		/// <param name="testResult"></param>
+		public override TestResult RunTest()
+		{
+			TestResult testResult = base.RunTest();
+
+			testResult.AssertCount = NUnitFramework.Assert.GetAssertCount();
+			
+			return testResult;
+		}
+        #endregion
+	}
+}
diff --git a/src/NUnitCore/core/NamespaceSuite.cs b/src/NUnitCore/core/NamespaceSuite.cs
index be60ac1..7d0decc 100644
--- a/src/NUnitCore/core/NamespaceSuite.cs
+++ b/src/NUnitCore/core/NamespaceSuite.cs
@@ -1,38 +1,38 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// TestAssembly is a TestSuite that represents the execution
-    /// of tests in a managed assembly.
-    /// </summary>
-    public class NamespaceSuite : TestSuite
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="NamespaceSuite"/> class.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        public NamespaceSuite(string path) : base(path) { }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="NamespaceSuite"/> class.
-        /// </summary>
-        /// <param name="parentNamespace">The parent namespace.</param>
-        /// <param name="suiteName">Name of the suite.</param>
-        public NamespaceSuite(string parentNamespace, string suiteName) : base(parentNamespace, suiteName) { }
-
-        /// <summary>
-        /// Gets the type of the test.
-        /// </summary>
-        public override string TestType
-        {
-            get { return "Namespace"; }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// TestAssembly is a TestSuite that represents the execution
+    /// of tests in a managed assembly.
+    /// </summary>
+    public class NamespaceSuite : TestSuite
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NamespaceSuite"/> class.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        public NamespaceSuite(string path) : base(path) { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NamespaceSuite"/> class.
+        /// </summary>
+        /// <param name="parentNamespace">The parent namespace.</param>
+        /// <param name="suiteName">Name of the suite.</param>
+        public NamespaceSuite(string parentNamespace, string suiteName) : base(parentNamespace, suiteName) { }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "Namespace"; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/NamespaceTreeBuilder.cs b/src/NUnitCore/core/NamespaceTreeBuilder.cs
index 617be22..d4d2d52 100644
--- a/src/NUnitCore/core/NamespaceTreeBuilder.cs
+++ b/src/NUnitCore/core/NamespaceTreeBuilder.cs
@@ -1,169 +1,169 @@
-// ****************************************************************
-// 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.Collections;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Class that can build a tree of automatic namespace
-	/// suites from a group of fixtures.
-	/// </summary>
-	public class NamespaceTreeBuilder
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// Hashtable of all test suites we have created to represent namespaces.
-		/// Used to locate namespace parent suites for fixtures.
-		/// </summary>
-		Hashtable namespaceSuites  = new Hashtable();
-
-		/// <summary>
-		/// The root of the test suite being created by this builder.
-		/// </summary>
-		TestSuite rootSuite;
-
-		#endregion
-
-		#region Constructor
-
-		public NamespaceTreeBuilder( TestSuite rootSuite )
-		{
-			this.rootSuite = rootSuite;
-		}
-
-		#endregion
-
-		#region Properties
-
-		public TestSuite RootSuite
-		{
-			get { return rootSuite; }
-		}
-
-		#endregion
-
-		#region Public Methods
-
-		public void Add( IList fixtures )
-		{
-            foreach (TestSuite fixture in fixtures)
-                //if (fixture is SetUpFixture)
-                //    Add(fixture as SetUpFixture);
-                //else
-                    Add( fixture );
-		}
-
-		public void Add( TestSuite fixture )
-		{
-            if (fixture != null)
-            {
-                string ns = fixture.TestName.FullName;
-                int index = ns.IndexOf("[");
-                if (index >= 0) ns = ns.Substring(0, index);
-                index = ns.LastIndexOf('.');
-                ns = index > 0 ? ns.Substring(0, index) : string.Empty;
-                TestSuite containingSuite = BuildFromNameSpace(ns);
-
-                if (fixture is SetUpFixture)
-                {
-                    // The SetUpFixture must replace the namespace suite
-                    // in which it is "contained". 
-                    //
-                    // First, add the old suite's children
-                    foreach (TestSuite child in containingSuite.Tests)
-                        fixture.Add(child);
-
-                    // Make the parent of the containing suite point to this
-                    // fixture instead
-                    // TODO: Get rid of this somehow?
-                    TestSuite parent = (TestSuite)containingSuite.Parent;
-                    if (parent == null)
-                    {
-                        fixture.TestName.Name = rootSuite.TestName.Name;
-                        rootSuite = fixture;
-                    }
-                    else
-                    {
-                        parent.Tests.Remove(containingSuite);
-                        parent.Add(fixture);
-                    }
-
-                    // Update the hashtable
-                    namespaceSuites[ns] = fixture;
-                }
-                else
-                    containingSuite.Add(fixture);
-            }
-		}
-
-        //public void Add( SetUpFixture fixture )
-        //{
-        //    string ns = fixture.FullName;
-        //    int index = ns.LastIndexOf( '.' );
-        //    ns = index > 0 ? ns.Substring( 0, index ) : string.Empty;
-        //    TestSuite suite = BuildFromNameSpace( ns );
-
-        //    // Make the parent point to this instead
-        //    // TODO: Get rid of this somehow?
-        //    TestSuite parent = suite.Parent;
-        //    if ( parent != null )
-        //    {
-        //        parent.Tests.Remove( suite );
-        //        parent.Add( fixture );
-        //    }
-
-        //    // Add the old suite's children
-        //    foreach( TestSuite child in suite.Tests )
-        //        fixture.Add( child );
-
-        //    if (parent == null && fixture is SetUpFixture)
-        //    {
-        //        suite.Tests.Clear();
-        //        suite.Add(fixture);
-        //    }
-        //    // Update the hashtable
-        //    namespaceSuites[ns] = fixture;
-        //}
-
-		#endregion
-
-		#region Helper Method
-
-		private TestSuite BuildFromNameSpace( string nameSpace )
-		{
-			if( nameSpace == null || nameSpace  == "" ) return rootSuite;
-			TestSuite suite = (TestSuite)namespaceSuites[nameSpace];
-			if(suite!=null) return suite;
-            
-			int index = nameSpace.LastIndexOf(".");
-			//string prefix = string.Format( "[{0}]" );
-			if( index == -1 )
-			{
-				suite = new NamespaceSuite( nameSpace );
-				if ( rootSuite == null )
-					rootSuite = suite;
-				else
-					rootSuite.Add(suite);
-				namespaceSuites[nameSpace]=suite;
-			}
-			else
-			{
-				string parentNameSpace = nameSpace.Substring( 0,index );
-				TestSuite parent = BuildFromNameSpace( parentNameSpace );
-				string suiteName = nameSpace.Substring( index+1 );
-				suite = new NamespaceSuite( parentNameSpace, suiteName );
-				parent.Add( suite );
-				namespaceSuites[nameSpace] = suite;
-			}
-
-			return suite;
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Collections;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Class that can build a tree of automatic namespace
+	/// suites from a group of fixtures.
+	/// </summary>
+	public class NamespaceTreeBuilder
+	{
+		#region Instance Variables
+
+		/// <summary>
+		/// Hashtable of all test suites we have created to represent namespaces.
+		/// Used to locate namespace parent suites for fixtures.
+		/// </summary>
+		Hashtable namespaceSuites  = new Hashtable();
+
+		/// <summary>
+		/// The root of the test suite being created by this builder.
+		/// </summary>
+		TestSuite rootSuite;
+
+		#endregion
+
+		#region Constructor
+
+		public NamespaceTreeBuilder( TestSuite rootSuite )
+		{
+			this.rootSuite = rootSuite;
+		}
+
+		#endregion
+
+		#region Properties
+
+		public TestSuite RootSuite
+		{
+			get { return rootSuite; }
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public void Add( IList fixtures )
+		{
+            foreach (TestSuite fixture in fixtures)
+                //if (fixture is SetUpFixture)
+                //    Add(fixture as SetUpFixture);
+                //else
+                    Add( fixture );
+		}
+
+		public void Add( TestSuite fixture )
+		{
+            if (fixture != null)
+            {
+                string ns = fixture.TestName.FullName;
+                int index = ns.IndexOf("[");
+                if (index >= 0) ns = ns.Substring(0, index);
+                index = ns.LastIndexOf('.');
+                ns = index > 0 ? ns.Substring(0, index) : string.Empty;
+                TestSuite containingSuite = BuildFromNameSpace(ns);
+
+                if (fixture is SetUpFixture)
+                {
+                    // The SetUpFixture must replace the namespace suite
+                    // in which it is "contained". 
+                    //
+                    // First, add the old suite's children
+                    foreach (TestSuite child in containingSuite.Tests)
+                        fixture.Add(child);
+
+                    // Make the parent of the containing suite point to this
+                    // fixture instead
+                    // TODO: Get rid of this somehow?
+                    TestSuite parent = (TestSuite)containingSuite.Parent;
+                    if (parent == null)
+                    {
+                        fixture.TestName.Name = rootSuite.TestName.Name;
+                        rootSuite = fixture;
+                    }
+                    else
+                    {
+                        parent.Tests.Remove(containingSuite);
+                        parent.Add(fixture);
+                    }
+
+                    // Update the hashtable
+                    namespaceSuites[ns] = fixture;
+                }
+                else
+                    containingSuite.Add(fixture);
+            }
+		}
+
+        //public void Add( SetUpFixture fixture )
+        //{
+        //    string ns = fixture.FullName;
+        //    int index = ns.LastIndexOf( '.' );
+        //    ns = index > 0 ? ns.Substring( 0, index ) : string.Empty;
+        //    TestSuite suite = BuildFromNameSpace( ns );
+
+        //    // Make the parent point to this instead
+        //    // TODO: Get rid of this somehow?
+        //    TestSuite parent = suite.Parent;
+        //    if ( parent != null )
+        //    {
+        //        parent.Tests.Remove( suite );
+        //        parent.Add( fixture );
+        //    }
+
+        //    // Add the old suite's children
+        //    foreach( TestSuite child in suite.Tests )
+        //        fixture.Add( child );
+
+        //    if (parent == null && fixture is SetUpFixture)
+        //    {
+        //        suite.Tests.Clear();
+        //        suite.Add(fixture);
+        //    }
+        //    // Update the hashtable
+        //    namespaceSuites[ns] = fixture;
+        //}
+
+		#endregion
+
+		#region Helper Method
+
+		private TestSuite BuildFromNameSpace( string nameSpace )
+		{
+			if( nameSpace == null || nameSpace  == "" ) return rootSuite;
+			TestSuite suite = (TestSuite)namespaceSuites[nameSpace];
+			if(suite!=null) return suite;
+            
+			int index = nameSpace.LastIndexOf(".");
+			//string prefix = string.Format( "[{0}]" );
+			if( index == -1 )
+			{
+				suite = new NamespaceSuite( nameSpace );
+				if ( rootSuite == null )
+					rootSuite = suite;
+				else
+					rootSuite.Add(suite);
+				namespaceSuites[nameSpace]=suite;
+			}
+			else
+			{
+				string parentNameSpace = nameSpace.Substring( 0,index );
+				TestSuite parent = BuildFromNameSpace( parentNameSpace );
+				string suiteName = nameSpace.Substring( index+1 );
+				suite = new NamespaceSuite( parentNameSpace, suiteName );
+				parent.Add( suite );
+				namespaceSuites[nameSpace] = suite;
+			}
+
+			return suite;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/NoTestFixturesException.cs b/src/NUnitCore/core/NoTestFixturesException.cs
index 93eb132..32496e9 100644
--- a/src/NUnitCore/core/NoTestFixturesException.cs
+++ b/src/NUnitCore/core/NoTestFixturesException.cs
@@ -1,28 +1,28 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Runtime.Serialization;
-
-	/// <summary>
-	/// Summary description for NoTestFixtureException.
-	/// </summary>
-	[Serializable]
-	public class NoTestFixturesException : ApplicationException
-	{
-		public NoTestFixturesException() : base () {}
-
-		public NoTestFixturesException(string message) : base(message)
-		{}
-
-		public NoTestFixturesException(string message, Exception inner) : base(message, inner) {}
-
-		protected NoTestFixturesException(SerializationInfo info, StreamingContext context) : base(info, context)
-		{}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.Runtime.Serialization;
+
+	/// <summary>
+	/// Summary description for NoTestFixtureException.
+	/// </summary>
+	[Serializable]
+	public class NoTestFixturesException : ApplicationException
+	{
+		public NoTestFixturesException() : base () {}
+
+		public NoTestFixturesException(string message) : base(message)
+		{}
+
+		public NoTestFixturesException(string message, Exception inner) : base(message, inner) {}
+
+		protected NoTestFixturesException(SerializationInfo info, StreamingContext context) : base(info, context)
+		{}
+	}
+}
diff --git a/src/NUnitCore/core/NullListener.cs b/src/NUnitCore/core/NullListener.cs
index b2abd82..af12102 100644
--- a/src/NUnitCore/core/NullListener.cs
+++ b/src/NUnitCore/core/NullListener.cs
@@ -1,41 +1,41 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Summary description for NullListener.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class NullListener : EventListener
-	{
-		public void RunStarted( string name, int testCount ){ }
-
-		public void RunFinished( TestResult result ) { }
-
-		public void RunFinished( Exception exception ) { }
-
-		public void TestStarted(TestName testName){}
-			
-		public void TestFinished(TestResult result){}
-
-		public void SuiteStarted(TestName testName){}
-
-		public void SuiteFinished(TestResult result){}
-
-		public void UnhandledException( Exception exception ) {}
-
-		public void TestOutput(TestOutput testOutput) {}
-
-		public static EventListener NULL
-		{
-			get { return new NullListener();}
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Summary description for NullListener.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class NullListener : EventListener
+	{
+		public void RunStarted( string name, int testCount ){ }
+
+		public void RunFinished( TestResult result ) { }
+
+		public void RunFinished( Exception exception ) { }
+
+		public void TestStarted(TestName testName){}
+			
+		public void TestFinished(TestResult result){}
+
+		public void SuiteStarted(TestName testName){}
+
+		public void SuiteFinished(TestResult result){}
+
+		public void UnhandledException( Exception exception ) {}
+
+		public void TestOutput(TestOutput testOutput) {}
+
+		public static EventListener NULL
+		{
+			get { return new NullListener();}
+		}
+	}
+}
diff --git a/src/NUnitCore/core/ParameterizedFixtureSuite.cs b/src/NUnitCore/core/ParameterizedFixtureSuite.cs
index 435a4fe..47922e5 100644
--- a/src/NUnitCore/core/ParameterizedFixtureSuite.cs
+++ b/src/NUnitCore/core/ParameterizedFixtureSuite.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// ParameterizedFixtureSuite serves as a container for the set of test 
-    /// fixtures created from a given Type using various parameters.
-    /// </summary>
-    public class ParameterizedFixtureSuite : TestSuite
-    {
-        private Type type;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="ParameterizedFixtureSuite"/> class.
-        /// </summary>
-        /// <param name="type">The type.</param>
-        public ParameterizedFixtureSuite(Type type)
-            : base(type.Namespace, TypeHelper.GetDisplayName(type))
-        {
-            this.type = type;
-        }
-
-        /// <summary>
-        /// Gets the type of the test.
-        /// </summary>
-        /// <value>The type of the test.</value>
-        public override string TestType
-        {
-            get
-            {
-#if CLR_2_0 || CLR_4_0
-                if (type.IsGenericType)
-                    return "GenericFixture";
-#endif
-
-                return "ParameterizedFixture";
-            }
-        }
-
-        /// <summary>
-        /// Gets the Type represented by this suite.
-        /// </summary>
-        /// <value>A Sysetm.Type.</value>
-        public Type ParameterizedType
-        {
-            get { return type; }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// ParameterizedFixtureSuite serves as a container for the set of test 
+    /// fixtures created from a given Type using various parameters.
+    /// </summary>
+    public class ParameterizedFixtureSuite : TestSuite
+    {
+        private Type type;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ParameterizedFixtureSuite"/> class.
+        /// </summary>
+        /// <param name="type">The type.</param>
+        public ParameterizedFixtureSuite(Type type)
+            : base(type.Namespace, TypeHelper.GetDisplayName(type))
+        {
+            this.type = type;
+        }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        /// <value>The type of the test.</value>
+        public override string TestType
+        {
+            get
+            {
+#if CLR_2_0 || CLR_4_0
+                if (type.IsGenericType)
+                    return "GenericFixture";
+#endif
+
+                return "ParameterizedFixture";
+            }
+        }
+
+        /// <summary>
+        /// Gets the Type represented by this suite.
+        /// </summary>
+        /// <value>A Sysetm.Type.</value>
+        public Type ParameterizedType
+        {
+            get { return type; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/ParameterizedTestMethodSuite.cs b/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
index c3ce58f..5685019 100644
--- a/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
+++ b/src/NUnitCore/core/ParameterizedTestMethodSuite.cs
@@ -1,134 +1,134 @@
-// ****************************************************************
-// 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.
-// ****************************************************************
-//#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;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// ParameterizedMethodSuite holds a collection of individual
-    /// TestMethods with their arguments applied.
-    /// </summary>
-    public class ParameterizedMethodSuite : TestSuite
-    {
-        private bool isTheory;
-        private MethodInfo method;
-
-        /// <summary>
-        /// Construct from a MethodInfo
-        /// </summary>
-        /// <param name="method"></param>
-        public ParameterizedMethodSuite(MethodInfo method)
-            : base(method.ReflectedType.FullName, method.Name)
-        {
-            this.maintainTestOrder = true;
-            this.isTheory = Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true);
-            this.method = method;
-        }
-
-        /// <summary>
-        /// Gets a string representing the kind of test
-        /// that this object represents, for use in display.
-        /// </summary>
-        public override string TestType
-        {
-            get 
-            { 
-                return this.isTheory
-                    ? "Theory"
-                    : "ParameterizedTest"; 
-            }
-        }
-
-        /// <summary>
-        /// Override Run, setting Fixture to that of the Parent.
-        /// </summary>
-        /// <param name="listener"></param>
-        /// <param name="filter"></param>
-        /// <returns></returns>
-        public override TestResult Run(EventListener listener, ITestFilter filter)
-        {
-            if (this.Parent != null)
-            {
-                this.Fixture = this.Parent.Fixture;
-                TestSuite suite = this.Parent as TestSuite;
-                if (suite != null)
-                {
-                    this.setUpMethods = suite.GetSetUpMethods();
-                    this.tearDownMethods = suite.GetTearDownMethods();
-                }
-            }
-
-#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);
-			
-            if (this.isTheory && result.ResultState == ResultState.Inconclusive)
-                result.SetResult(
-                    ResultState.Failure,
-                    this.TestCount == 0
-                        ? "No test cases were provided"
-                        : "All test cases were inconclusive",
-                    null);
-
-			this.Fixture = null;
-			this.setUpMethods = null;
-			this.tearDownMethods = null;
-#if CLR_2_0 || CLR_4_0
-            this.actions = null;
-#endif
-
-            return result;
-        }
-
-        /// <summary>
-        /// Override DoOneTimeSetUp to avoid executing any
-        /// TestFixtureSetUp method for this suite
-        /// </summary>
-        /// <param name="suiteResult"></param>
-        protected override void DoOneTimeSetUp(TestResult suiteResult)
-        {
-        }
-
-        /// <summary>
-        /// Override DoOneTimeTearDown to avoid executing any
-        /// TestFixtureTearDown method for this suite.
-        /// </summary>
-        /// <param name="suiteResult"></param>
-        protected override void DoOneTimeTearDown(TestResult suiteResult)
-        {
-        }
-
-#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
-    }
-}
+// ****************************************************************
+// 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.
+// ****************************************************************
+//#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;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// ParameterizedMethodSuite holds a collection of individual
+    /// TestMethods with their arguments applied.
+    /// </summary>
+    public class ParameterizedMethodSuite : TestSuite
+    {
+        private bool isTheory;
+        private MethodInfo method;
+
+        /// <summary>
+        /// Construct from a MethodInfo
+        /// </summary>
+        /// <param name="method"></param>
+        public ParameterizedMethodSuite(MethodInfo method)
+            : base(method.ReflectedType.FullName, method.Name)
+        {
+            this.maintainTestOrder = true;
+            this.isTheory = Reflect.HasAttribute(method, NUnitFramework.TheoryAttribute, true);
+            this.method = method;
+        }
+
+        /// <summary>
+        /// Gets a string representing the kind of test
+        /// that this object represents, for use in display.
+        /// </summary>
+        public override string TestType
+        {
+            get 
+            { 
+                return this.isTheory
+                    ? "Theory"
+                    : "ParameterizedTest"; 
+            }
+        }
+
+        /// <summary>
+        /// Override Run, setting Fixture to that of the Parent.
+        /// </summary>
+        /// <param name="listener"></param>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public override TestResult Run(EventListener listener, ITestFilter filter)
+        {
+            if (this.Parent != null)
+            {
+                this.Fixture = this.Parent.Fixture;
+                TestSuite suite = this.Parent as TestSuite;
+                if (suite != null)
+                {
+                    this.setUpMethods = suite.GetSetUpMethods();
+                    this.tearDownMethods = suite.GetTearDownMethods();
+                }
+            }
+
+#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);
+			
+            if (this.isTheory && result.ResultState == ResultState.Inconclusive)
+                result.SetResult(
+                    ResultState.Failure,
+                    this.TestCount == 0
+                        ? "No test cases were provided"
+                        : "All test cases were inconclusive",
+                    null);
+
+			this.Fixture = null;
+			this.setUpMethods = null;
+			this.tearDownMethods = null;
+#if CLR_2_0 || CLR_4_0
+            this.actions = null;
+#endif
+
+            return result;
+        }
+
+        /// <summary>
+        /// Override DoOneTimeSetUp to avoid executing any
+        /// TestFixtureSetUp method for this suite
+        /// </summary>
+        /// <param name="suiteResult"></param>
+        protected override void DoOneTimeSetUp(TestResult suiteResult)
+        {
+        }
+
+        /// <summary>
+        /// Override DoOneTimeTearDown to avoid executing any
+        /// TestFixtureTearDown method for this suite.
+        /// </summary>
+        /// <param name="suiteResult"></param>
+        protected override void DoOneTimeTearDown(TestResult suiteResult)
+        {
+        }
+
+#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 157505b..cd01f99 100644
--- a/src/NUnitCore/core/PlatformHelper.cs
+++ b/src/NUnitCore/core/PlatformHelper.cs
@@ -1,264 +1,276 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	public class PlatformHelper
-	{
-		private OSPlatform os;
-		private RuntimeFramework rt;
-
-		// Set whenever we fail to support a list of platforms
-		private string reason = string.Empty;
-
-        /// <summary>
-		/// Comma-delimited list of all supported OS platform constants
-		/// </summary>
-		public static readonly string OSPlatforms =
-			"Win,Win32,Win32S,Win32NT,Win32Windows,WinCE,Win95,Win98,WinMe,NT3,NT4,NT5,NT6,Win2K,WinXP,Win2003Server,Vista,Win2008Server,Win2008ServerR2,Win2012Server,Windows7,Windows8,Unix,Linux";
-		
-		/// <summary>
-		/// Comma-delimited list of all supported Runtime platform constants
-		/// </summary>
-		public static readonly string RuntimePlatforms =
-			"Net,NetCF,SSCLI,Rotor,Mono";
-
-		/// <summary>
-		/// Default constructor uses the operating system and
-		/// common language runtime of the system.
-		/// </summary>
-		public PlatformHelper()
-		{
-			this.os = OSPlatform.CurrentPlatform;
-			this.rt = RuntimeFramework.CurrentFramework;
-		}
-
-		/// <summary>
-		/// Contruct a PlatformHelper for a particular operating
-		/// system and common language runtime. Used in testing.
-		/// </summary>
-		/// <param name="os">OperatingSystem to be used</param>
-		public PlatformHelper( OSPlatform os, RuntimeFramework rt )
-		{
-			this.os = os;
-			this.rt = rt;
-		}
-
-		/// <summary>
-		/// Test to determine if one of a collection of platforms
-		/// is being used currently.
-		/// </summary>
-		/// <param name="platforms"></param>
-		/// <returns></returns>
-		public bool IsPlatformSupported( string[] platforms )
-		{
-			foreach( string platform in platforms )
-				if ( IsPlatformSupported( platform ) )
-					return true;
-
-			return false;
-		}
-
-		/// <summary>
-		/// Tests to determine if the current platform is supported
-		/// based on a platform attribute.
-		/// </summary>
-		/// <param name="platformAttribute">The attribute to examine</param>
-		/// <returns></returns>
-		public bool IsPlatformSupported( Attribute platformAttribute )
-		{
-			//Use reflection to avoid dependency on a particular framework version
-			string include = (string)Reflect.GetPropertyValue( 
-				platformAttribute, "Include", 
-				BindingFlags.Public | BindingFlags.Instance );
-
-			string exclude = (string)Reflect.GetPropertyValue(
-				platformAttribute, "Exclude", 
-				BindingFlags.Public | BindingFlags.Instance );
-
-			try
-			{
-				if (include != null && !IsPlatformSupported(include))
-				{
-					reason = string.Format("Only supported on {0}", include);
-					return false;
-				}
-
-				if (exclude != null && IsPlatformSupported(exclude))
-				{
-					reason = string.Format("Not supported on {0}", exclude);
-					return false;
-				}
-			}
-			catch( ArgumentException ex )
-			{
-				reason = string.Format( "Invalid platform name: {0}", ex.ParamName );
-				return false; 
-			}
-
-			return true;
-		}
-
-		/// <summary>
-		/// Test to determine if the a particular platform or comma-
-		/// delimited set of platforms is in use.
-		/// </summary>
-		/// <param name="platform">Name of the platform or comma-separated list of platform names</param>
-		/// <returns>True if the platform is in use on the system</returns>
-		public bool IsPlatformSupported( string platform )
-		{
-			if ( platform.IndexOf( ',' ) >= 0 )
-				return IsPlatformSupported( platform.Split( new char[] { ',' } ) );
-
-			string platformName = platform.Trim();
-            bool isSupported = false;
-
-            //string versionSpecification = null;
-
-            //string[] parts = platformName.Split( new char[] { '-' } );
-            //if ( parts.Length == 2 )
-            //{
-            //    platformName = parts[0];
-            //    versionSpecification = parts[1];
-            //}
-
-			switch( platformName.ToUpper() )
-			{
-				case "WIN":
-				case "WIN32":
-                    isSupported = os.IsWindows;
-					break;
-				case "WIN32S":
-                    isSupported = os.IsWin32S;
-					break;
-				case "WIN32WINDOWS":
-                    isSupported = os.IsWin32Windows;
-					break;
-				case "WIN32NT":
-                    isSupported = os.IsWin32NT;
-					break;
-				case "WINCE":
-                    isSupported = os.IsWinCE;
-					break;
-				case "WIN95":
-                    isSupported = os.IsWin95;
-					break;
-				case "WIN98":
-                    isSupported = os.IsWin98;
-					break;
-				case "WINME":
-                    isSupported = os.IsWinME;
-					break;
-				case "NT3":
-                    isSupported = os.IsNT3;
-					break;
-				case "NT4":
-                    isSupported = os.IsNT4;
-					break;
-                case "NT5":
-                    isSupported = os.IsNT5;
-                    break;
-                case "WIN2K":
-                    isSupported = os.IsWin2K;
-					break;
-				case "WINXP":
-                    isSupported = os.IsWinXP;
-					break;
-				case "WIN2003SERVER":
-                    isSupported = os.IsWin2003Server;
-					break;
-                case "NT6":
-                    isSupported = os.IsNT6;
-                    break;
-                case "VISTA":
-                    isSupported = os.IsVista;
-                    break;
-                case "WIN2008SERVER":
-                    isSupported = os.IsWin2008Server;
-                    break;
-                case "WIN2008SERVERR2":
-                    isSupported = os.IsWin2008ServerR2;
-                    break;
-                case "WIN2012SERVER":
-                    isSupported = os.IsWin2012Server;
-                    break;
-                case "WINDOWS7":
-                    isSupported = os.IsWindows7;
-                    break;
-                case "WINDOWS8":
-                    isSupported = os.IsWindows8;
-                    break;
-                case "UNIX":
-				case "LINUX":
-                    isSupported = os.IsUnix;
-					break;
-
-                default:
-                    isSupported = IsRuntimeSupported(platformName);
-                    break;
-			}
-
-            if (!isSupported)
-			    this.reason = "Only supported on " + platform;
-
-			return isSupported;
-		}
-
-		/// <summary>
-		/// Return the last failure reason. Results are not
-		/// defined if called before IsSupported( Attribute )
-		/// is called.
-		/// </summary>
-		public string Reason
-		{
-			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);
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+	public class PlatformHelper
+	{
+		private OSPlatform os;
+		private RuntimeFramework rt;
+
+		// Set whenever we fail to support a list of platforms
+		private string reason = string.Empty;
+
+        /// <summary>
+		/// Comma-delimited list of all supported OS platform constants
+		/// </summary>
+		public static readonly string OSPlatforms =
+#if CLR_2_0 || CLR_4_0
+            "Win,Win32,Win32S,Win32NT,Win32Windows,WinCE,Win95,Win98,WinMe,NT3,NT4,NT5,NT6,Win2K,WinXP,Win2003Server,Vista,Win2008Server,Win2008ServerR2,Win2012Server,Windows7,Windows8,Unix,Linux,Xbox,MacOSX";
+#else
+			"Win,Win32,Win32S,Win32NT,Win32Windows,WinCE,Win95,Win98,WinMe,NT3,NT4,NT5,NT6,Win2K,WinXP,Win2003Server,Vista,Win2008Server,Win2008ServerR2,Win2012Server,Windows7,Windows8,Unix,Linux";
+#endif
+		
+		/// <summary>
+		/// Comma-delimited list of all supported Runtime platform constants
+		/// </summary>
+		public static readonly string RuntimePlatforms =
+			"Net,NetCF,SSCLI,Rotor,Mono";
+
+		/// <summary>
+		/// Default constructor uses the operating system and
+		/// common language runtime of the system.
+		/// </summary>
+		public PlatformHelper()
+		{
+			this.os = OSPlatform.CurrentPlatform;
+			this.rt = RuntimeFramework.CurrentFramework;
+		}
+
+		/// <summary>
+		/// Contruct a PlatformHelper for a particular operating
+		/// system and common language runtime. Used in testing.
+		/// </summary>
+		/// <param name="os">OperatingSystem to be used</param>
+		public PlatformHelper( OSPlatform os, RuntimeFramework rt )
+		{
+			this.os = os;
+			this.rt = rt;
+		}
+
+		/// <summary>
+		/// Test to determine if one of a collection of platforms
+		/// is being used currently.
+		/// </summary>
+		/// <param name="platforms"></param>
+		/// <returns></returns>
+		public bool IsPlatformSupported( string[] platforms )
+		{
+			foreach( string platform in platforms )
+				if ( IsPlatformSupported( platform ) )
+					return true;
+
+			return false;
+		}
+
+		/// <summary>
+		/// Tests to determine if the current platform is supported
+		/// based on a platform attribute.
+		/// </summary>
+		/// <param name="platformAttribute">The attribute to examine</param>
+		/// <returns></returns>
+		public bool IsPlatformSupported( Attribute platformAttribute )
+		{
+			//Use reflection to avoid dependency on a particular framework version
+			string include = (string)Reflect.GetPropertyValue( 
+				platformAttribute, "Include", 
+				BindingFlags.Public | BindingFlags.Instance );
+
+			string exclude = (string)Reflect.GetPropertyValue(
+				platformAttribute, "Exclude", 
+				BindingFlags.Public | BindingFlags.Instance );
+
+			try
+			{
+				if (include != null && !IsPlatformSupported(include))
+				{
+					reason = string.Format("Only supported on {0}", include);
+					return false;
+				}
+
+				if (exclude != null && IsPlatformSupported(exclude))
+				{
+					reason = string.Format("Not supported on {0}", exclude);
+					return false;
+				}
+			}
+			catch( ArgumentException ex )
+			{
+				reason = string.Format( "Invalid platform name: {0}", ex.ParamName );
+				return false; 
+			}
+
+			return true;
+		}
+
+		/// <summary>
+		/// Test to determine if the a particular platform or comma-
+		/// delimited set of platforms is in use.
+		/// </summary>
+		/// <param name="platform">Name of the platform or comma-separated list of platform names</param>
+		/// <returns>True if the platform is in use on the system</returns>
+		public bool IsPlatformSupported( string platform )
+		{
+			if ( platform.IndexOf( ',' ) >= 0 )
+				return IsPlatformSupported( platform.Split( new char[] { ',' } ) );
+
+			string platformName = platform.Trim();
+            bool isSupported = false;
+
+            //string versionSpecification = null;
+
+            //string[] parts = platformName.Split( new char[] { '-' } );
+            //if ( parts.Length == 2 )
+            //{
+            //    platformName = parts[0];
+            //    versionSpecification = parts[1];
+            //}
+
+			switch( platformName.ToUpper() )
+			{
+				case "WIN":
+				case "WIN32":
+                    isSupported = os.IsWindows;
+					break;
+				case "WIN32S":
+                    isSupported = os.IsWin32S;
+					break;
+				case "WIN32WINDOWS":
+                    isSupported = os.IsWin32Windows;
+					break;
+				case "WIN32NT":
+                    isSupported = os.IsWin32NT;
+					break;
+				case "WINCE":
+                    isSupported = os.IsWinCE;
+					break;
+				case "WIN95":
+                    isSupported = os.IsWin95;
+					break;
+				case "WIN98":
+                    isSupported = os.IsWin98;
+					break;
+				case "WINME":
+                    isSupported = os.IsWinME;
+					break;
+				case "NT3":
+                    isSupported = os.IsNT3;
+					break;
+				case "NT4":
+                    isSupported = os.IsNT4;
+					break;
+                case "NT5":
+                    isSupported = os.IsNT5;
+                    break;
+                case "WIN2K":
+                    isSupported = os.IsWin2K;
+					break;
+				case "WINXP":
+                    isSupported = os.IsWinXP;
+					break;
+				case "WIN2003SERVER":
+                    isSupported = os.IsWin2003Server;
+					break;
+                case "NT6":
+                    isSupported = os.IsNT6;
+                    break;
+                case "VISTA":
+                    isSupported = os.IsVista;
+                    break;
+                case "WIN2008SERVER":
+                    isSupported = os.IsWin2008Server;
+                    break;
+                case "WIN2008SERVERR2":
+                    isSupported = os.IsWin2008ServerR2;
+                    break;
+                case "WIN2012SERVER":
+                    isSupported = os.IsWin2012Server;
+                    break;
+                case "WINDOWS7":
+                    isSupported = os.IsWindows7;
+                    break;
+                case "WINDOWS8":
+                    isSupported = os.IsWindows8;
+                    break;
+                case "UNIX":
+				case "LINUX":
+                    isSupported = os.IsUnix;
+					break;
+#if (CLR_2_0 || CLR_4_0) && !NETCF
+                case "XBOX":
+                    isSupported = os.IsXbox;
+                    break;
+                case "MACOSX":
+                    isSupported = os.IsMacOSX;
+                    break;
+#endif
+
+                default:
+                    isSupported = IsRuntimeSupported(platformName);
+                    break;
+			}
+
+            if (!isSupported)
+			    this.reason = "Only supported on " + platform;
+
+			return isSupported;
+		}
+
+		/// <summary>
+		/// Return the last failure reason. Results are not
+		/// defined if called before IsSupported( Attribute )
+		/// is called.
+		/// </summary>
+		public string Reason
+		{
+			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/ProjectRootSuite.cs b/src/NUnitCore/core/ProjectRootSuite.cs
index fe90c45..f2dfc48 100644
--- a/src/NUnitCore/core/ProjectRootSuite.cs
+++ b/src/NUnitCore/core/ProjectRootSuite.cs
@@ -1,31 +1,31 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// TestAssembly is a TestSuite that represents the execution
-    /// of tests in a managed assembly.
-    /// </summary>
-    public class ProjectRootSuite : TestSuite
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="ProjectRootSuite"/> class.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        public ProjectRootSuite(string path) : base(path) { }
-
-        /// <summary>
-        /// Gets the type of the test.
-        /// </summary>
-        public override string TestType
-        {
-            get { return "Project"; }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// TestAssembly is a TestSuite that represents the execution
+    /// of tests in a managed assembly.
+    /// </summary>
+    public class ProjectRootSuite : TestSuite
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ProjectRootSuite"/> class.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        public ProjectRootSuite(string path) : base(path) { }
+
+        /// <summary>
+        /// Gets the type of the test.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "Project"; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/ProxyTestRunner.cs b/src/NUnitCore/core/ProxyTestRunner.cs
index 1d7c3e6..8313898 100644
--- a/src/NUnitCore/core/ProxyTestRunner.cs
+++ b/src/NUnitCore/core/ProxyTestRunner.cs
@@ -1,170 +1,170 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-namespace NUnit.Core
-{
-	using System;
-	using System.Collections;
-	using System.IO;
-
-	/// <summary>
-	/// DelegatingTestRUnner is the abstract base for core TestRunner
-	/// implementations that operate by controlling a downstream
-	/// TestRunner. All calls are simply passed on to the
-	/// TestRunner that is provided to the constructor.
-	/// 
-	/// Although the class is abstract, it has no abstract 
-	/// methods specified because each implementation will
-	/// need to override different methods. All methods are
-	/// specified using interface syntax and the derived class
-	/// must explicitly implement TestRunner in order to 
-	/// redefine the selected methods.
-	/// </summary>
-	public abstract class ProxyTestRunner : MarshalByRefObject, TestRunner
-	{
-		#region Instance Variables
-
-		/// <summary>
-		/// Our runner ID
-		/// </summary>
-		protected int runnerID;
-
-		/// <summary>
-		/// The downstream TestRunner
-		/// </summary>
-		private TestRunner testRunner;
-
-		/// <summary>
-		/// The event listener for the currently running test
-		/// </summary>
-		protected EventListener listener;
-
-		#endregion
-
-		#region Construction
-		public ProxyTestRunner(TestRunner testRunner)
-		{
-			this.testRunner = testRunner;
-			this.runnerID = testRunner.ID;
-		}
-
-		/// <summary>
-		/// Protected constructor for runners that delay creation
-		/// of their downstream runner.
-		/// </summary>
-		protected ProxyTestRunner( int runnerID )
-		{
-			this.runnerID = runnerID;
-		}
-		#endregion
-
-		#region Properties
-		public virtual int ID
-		{
-			get { return runnerID; }
-		}
-
-		public virtual bool Running
-		{
-			get { return testRunner != null && testRunner.Running; }
-		}
-
-		public virtual IList AssemblyInfo
-		{
-			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
-		}
-
-		public virtual ITest Test
-		{
-			get { return testRunner == null ? null : testRunner.Test; }
-		}
-
-		public virtual TestResult TestResult
-		{
-			get { return testRunner == null ? null : testRunner.TestResult; }
-		}
-
-		/// <summary>
-		/// Protected property copies any settings to the downstream test runner
-		/// when it is set. Derived runners overriding this should call the base
-		/// or copy the settings themselves.
-		/// </summary>
-		protected virtual TestRunner TestRunner
-		{
-			get { return testRunner; }
-			set { testRunner = value; }
-		}
-		#endregion
-
-		#region Load and Unload Methods
-		public virtual bool Load( TestPackage package )
-		{
-			return this.testRunner.Load( package );
-		}
-
-		public virtual void Unload()
-		{
-            if ( this.testRunner != null )
-			    this.testRunner.Unload();
-		}
-		#endregion
-
-		#region CountTestCases
-		public virtual int CountTestCases( ITestFilter filter )
-		{
-			return this.testRunner.CountTestCases( filter );
-		}
-		#endregion
-
-		#region Methods for Running Tests
-
-        public virtual TestResult Run(EventListener listener, 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, bool tracing, LoggingThreshold logLevel)
-        {
-            // Save active listener for derived classes
-            this.listener = listener;
-            this.testRunner.BeginRun(listener, filter, tracing, logLevel);
-        }
-
-        public virtual TestResult EndRun()
-		{
-			return this.testRunner.EndRun();
-		}
-
-		public virtual void CancelRun()
-		{
-			this.testRunner.CancelRun();
-		}
-
-		public virtual void Wait()
-		{
-			this.testRunner.Wait();
-		}
-        #endregion
-
-		#region InitializeLifetimeService Override
-		public override object InitializeLifetimeService()
-		{
-			return null;
-		}
-		#endregion
-
-        #region IDisposable Implementation
-
-        public virtual void Dispose()
-        {
-            if (testRunner != null)
-                testRunner.Dispose();
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+namespace NUnit.Core
+{
+	using System;
+	using System.Collections;
+	using System.IO;
+
+	/// <summary>
+	/// DelegatingTestRUnner is the abstract base for core TestRunner
+	/// implementations that operate by controlling a downstream
+	/// TestRunner. All calls are simply passed on to the
+	/// TestRunner that is provided to the constructor.
+	/// 
+	/// Although the class is abstract, it has no abstract 
+	/// methods specified because each implementation will
+	/// need to override different methods. All methods are
+	/// specified using interface syntax and the derived class
+	/// must explicitly implement TestRunner in order to 
+	/// redefine the selected methods.
+	/// </summary>
+	public abstract class ProxyTestRunner : MarshalByRefObject, TestRunner
+	{
+		#region Instance Variables
+
+		/// <summary>
+		/// Our runner ID
+		/// </summary>
+		protected int runnerID;
+
+		/// <summary>
+		/// The downstream TestRunner
+		/// </summary>
+		private TestRunner testRunner;
+
+		/// <summary>
+		/// The event listener for the currently running test
+		/// </summary>
+		protected EventListener listener;
+
+		#endregion
+
+		#region Construction
+		public ProxyTestRunner(TestRunner testRunner)
+		{
+			this.testRunner = testRunner;
+			this.runnerID = testRunner.ID;
+		}
+
+		/// <summary>
+		/// Protected constructor for runners that delay creation
+		/// of their downstream runner.
+		/// </summary>
+		protected ProxyTestRunner( int runnerID )
+		{
+			this.runnerID = runnerID;
+		}
+		#endregion
+
+		#region Properties
+		public virtual int ID
+		{
+			get { return runnerID; }
+		}
+
+		public virtual bool Running
+		{
+			get { return testRunner != null && testRunner.Running; }
+		}
+
+		public virtual IList AssemblyInfo
+		{
+			get { return testRunner == null ? null : testRunner.AssemblyInfo; }
+		}
+
+		public virtual ITest Test
+		{
+			get { return testRunner == null ? null : testRunner.Test; }
+		}
+
+		public virtual TestResult TestResult
+		{
+			get { return testRunner == null ? null : testRunner.TestResult; }
+		}
+
+		/// <summary>
+		/// Protected property copies any settings to the downstream test runner
+		/// when it is set. Derived runners overriding this should call the base
+		/// or copy the settings themselves.
+		/// </summary>
+		protected virtual TestRunner TestRunner
+		{
+			get { return testRunner; }
+			set { testRunner = value; }
+		}
+		#endregion
+
+		#region Load and Unload Methods
+		public virtual bool Load( TestPackage package )
+		{
+			return this.testRunner.Load( package );
+		}
+
+		public virtual void Unload()
+		{
+            if ( this.testRunner != null )
+			    this.testRunner.Unload();
+		}
+		#endregion
+
+		#region CountTestCases
+		public virtual int CountTestCases( ITestFilter filter )
+		{
+			return this.testRunner.CountTestCases( filter );
+		}
+		#endregion
+
+		#region Methods for Running Tests
+
+        public virtual TestResult Run(EventListener listener, 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, bool tracing, LoggingThreshold logLevel)
+        {
+            // Save active listener for derived classes
+            this.listener = listener;
+            this.testRunner.BeginRun(listener, filter, tracing, logLevel);
+        }
+
+        public virtual TestResult EndRun()
+		{
+			return this.testRunner.EndRun();
+		}
+
+		public virtual void CancelRun()
+		{
+			this.testRunner.CancelRun();
+		}
+
+		public virtual void Wait()
+		{
+			this.testRunner.Wait();
+		}
+        #endregion
+
+		#region InitializeLifetimeService Override
+		public override object InitializeLifetimeService()
+		{
+			return null;
+		}
+		#endregion
+
+        #region IDisposable Implementation
+
+        public virtual void Dispose()
+        {
+            if (testRunner != null)
+                testRunner.Dispose();
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/QueuingEventListener.cs b/src/NUnitCore/core/QueuingEventListener.cs
index 005b055..19ad295 100644
--- a/src/NUnitCore/core/QueuingEventListener.cs
+++ b/src/NUnitCore/core/QueuingEventListener.cs
@@ -1,110 +1,110 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// QueuingEventListener uses an EventQueue to store any
-	/// events received on its EventListener interface.
-	/// </summary>
-	public class QueuingEventListener : EventListener
-	{
-		private EventQueue events = new EventQueue();
-
-		/// <summary>
-		/// The EvenQueue created and filled by this listener
-		/// </summary>
-		public EventQueue Events
-		{
-			get { return events; }
-		}
-
-		#region EventListener Methods
-		/// <summary>
-		/// Run is starting
-		/// </summary>
-		/// <param name="tests">Array of tests to be run</param>
-		public void RunStarted( string name, int testCount )
-		{
-			events.Enqueue( new RunStartedEvent( name, testCount ) );
-		}
-
-		/// <summary>
-		/// Run finished successfully
-		/// </summary>
-		/// <param name="results">Array of test results</param>
-		public void RunFinished( TestResult result )
-		{
-			events.Enqueue( new RunFinishedEvent( result ) );
-		}
-
-		/// <summary>
-		/// Run was terminated due to an exception
-		/// </summary>
-		/// <param name="exception">Exception that was thrown</param>
-		public void RunFinished( Exception exception )
-		{
-			events.Enqueue( new RunFinishedEvent( exception ) );
-		}
-
-		/// <summary>
-		/// A single test case is starting
-		/// </summary>
-		/// <param name="testCase">The test case</param>
-		public void TestStarted(TestName testName)
-		{
-			events.Enqueue( new TestStartedEvent( testName ) );
-		}
-
-		/// <summary>
-		/// A test case finished
-		/// </summary>
-		/// <param name="result">Result of the test case</param>
-		public void TestFinished(TestResult result)
-		{
-			events.Enqueue( new TestFinishedEvent( result ) );
-		}
-
-		/// <summary>
-		/// A suite is starting
-		/// </summary>
-		/// <param name="suite">The suite that is starting</param>
-		public void SuiteStarted(TestName testName)
-		{
-			events.Enqueue( new SuiteStartedEvent( testName ) );
-		}
-
-		/// <summary>
-		/// A suite finished
-		/// </summary>
-		/// <param name="result">Result of the suite</param>
-		public void SuiteFinished(TestResult result)
-		{
-			events.Enqueue( new SuiteFinishedEvent( result ) );
-		}
-
-		/// <summary>
-		/// An unhandled exception occured while running a test,
-		/// but the test was not terminated.
-		/// </summary>
-		/// <param name="exception"></param>
-		public void UnhandledException( Exception exception )
-		{
-			events.Enqueue( new UnhandledExceptionEvent( exception ) );
-		}
-
-		/// <summary>
-		/// A message has been output to the console.
-		/// </summary>
-		/// <param name="testOutput">A console message</param>
-		public void TestOutput( TestOutput output )
-		{
-			events.Enqueue( new OutputEvent( output ) );
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// QueuingEventListener uses an EventQueue to store any
+	/// events received on its EventListener interface.
+	/// </summary>
+	public class QueuingEventListener : EventListener
+	{
+		private EventQueue events = new EventQueue();
+
+		/// <summary>
+		/// The EvenQueue created and filled by this listener
+		/// </summary>
+		public EventQueue Events
+		{
+			get { return events; }
+		}
+
+		#region EventListener Methods
+		/// <summary>
+		/// Run is starting
+		/// </summary>
+		/// <param name="tests">Array of tests to be run</param>
+		public void RunStarted( string name, int testCount )
+		{
+			events.Enqueue( new RunStartedEvent( name, testCount ) );
+		}
+
+		/// <summary>
+		/// Run finished successfully
+		/// </summary>
+		/// <param name="results">Array of test results</param>
+		public void RunFinished( TestResult result )
+		{
+			events.Enqueue( new RunFinishedEvent( result ) );
+		}
+
+		/// <summary>
+		/// Run was terminated due to an exception
+		/// </summary>
+		/// <param name="exception">Exception that was thrown</param>
+		public void RunFinished( Exception exception )
+		{
+			events.Enqueue( new RunFinishedEvent( exception ) );
+		}
+
+		/// <summary>
+		/// A single test case is starting
+		/// </summary>
+		/// <param name="testCase">The test case</param>
+		public void TestStarted(TestName testName)
+		{
+			events.Enqueue( new TestStartedEvent( testName ) );
+		}
+
+		/// <summary>
+		/// A test case finished
+		/// </summary>
+		/// <param name="result">Result of the test case</param>
+		public void TestFinished(TestResult result)
+		{
+			events.Enqueue( new TestFinishedEvent( result ) );
+		}
+
+		/// <summary>
+		/// A suite is starting
+		/// </summary>
+		/// <param name="suite">The suite that is starting</param>
+		public void SuiteStarted(TestName testName)
+		{
+			events.Enqueue( new SuiteStartedEvent( testName ) );
+		}
+
+		/// <summary>
+		/// A suite finished
+		/// </summary>
+		/// <param name="result">Result of the suite</param>
+		public void SuiteFinished(TestResult result)
+		{
+			events.Enqueue( new SuiteFinishedEvent( result ) );
+		}
+
+		/// <summary>
+		/// An unhandled exception occured while running a test,
+		/// but the test was not terminated.
+		/// </summary>
+		/// <param name="exception"></param>
+		public void UnhandledException( Exception exception )
+		{
+			events.Enqueue( new UnhandledExceptionEvent( exception ) );
+		}
+
+		/// <summary>
+		/// A message has been output to the console.
+		/// </summary>
+		/// <param name="testOutput">A console message</param>
+		public void TestOutput( TestOutput output )
+		{
+			events.Enqueue( new OutputEvent( output ) );
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/Reflect.cs b/src/NUnitCore/core/Reflect.cs
index 1e6bef4..ca187a1 100644
--- a/src/NUnitCore/core/Reflect.cs
+++ b/src/NUnitCore/core/Reflect.cs
@@ -1,443 +1,451 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Collections;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Helper methods for inspecting a type by reflection. 
-	/// 
-	/// Many of these methods take ICustomAttributeProvider as an 
-	/// argument to avoid duplication, even though certain attributes can 
-	/// only appear on specific types of members, like MethodInfo or Type.
-	/// 
-	/// In the case where a type is being examined for the presence of
-	/// an attribute, interface or named member, the Reflect methods
-	/// operate with the full name of the member being sought. This
-	/// removes the necessity of the caller having a reference to the
-	/// assembly that defines the item being sought and allows the
-	/// NUnit core to inspect assemblies that reference an older
-	/// version of the NUnit framework.
-	/// </summary>
-	public class Reflect
-	{
-        private static readonly BindingFlags AllMembers = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
-
-        #region Attributes 
-
-		/// <summary>
-		/// Check presence of attribute of a given type on a member.
-		/// </summary>
-		/// <param name="member">The member to examine</param>
-		/// <param name="attrName">The FullName of the attribute type to look for</param>
-		/// <param name="inherit">True to include inherited attributes</param>
-		/// <returns>True if the attribute is present</returns>
-		public static bool HasAttribute( ICustomAttributeProvider member, string attrName, bool inherit )
-		{
-			foreach( Attribute attribute in GetAttributes( member, inherit ) )
-				if ( IsInstanceOfType( attrName, attribute ) )
-					return true;
-			return false;
-		}
-
-        /// <summary>
-        /// Get attribute of a given type on a member. If multiple attributes
-        /// of a type are present, the first one found is returned.
-        /// </summary>
-        /// <param name="member">The member to examine</param>
-        /// <param name="attrName">The FullName of the attribute type to look for</param>
-        /// <param name="inherit">True to include inherited attributes</param>
-        /// <returns>The attribute or null</returns>
-        public static System.Attribute GetAttribute(ICustomAttributeProvider member, string attrName, bool inherit)
-        {
-            foreach (Attribute attribute in GetAttributes( member, inherit ) )
-                if ( IsInstanceOfType( attrName, attribute ) )
-                    return attribute;
-            return null;
-        }
-
-        /// <summary>
-		/// Get all attributes of a given type on a member.
-		/// </summary>
-		/// <param name="member">The member to examine</param>
-		/// <param name="attrName">The FullName of the attribute type to look for</param>
-		/// <param name="inherit">True to include inherited attributes</param>
-		/// <returns>The attribute or null</returns>
-        public static System.Attribute[] GetAttributes(
-            ICustomAttributeProvider member, string attrName, bool inherit)
-		{
-			ArrayList result = new ArrayList();
-			foreach( Attribute attribute in GetAttributes( member, inherit ) )
-				if ( IsInstanceOfType( attrName, attribute ) )
-					result.Add( attribute );
-			return (System.Attribute[])result.ToArray( typeof( System.Attribute ) );
-		}
-
-        /// <summary>
-        /// Get all attributes on a member.
-        /// </summary>
-        /// <param name="member">The member to examine</param>
-        /// <param name="inherit">True to include inherited attributes</param>
-        /// <returns>The attribute or null</returns>
-        public static System.Attribute[] GetAttributes(
-            ICustomAttributeProvider member, bool inherit)
-        {
-            object[] attributes = member.GetCustomAttributes(inherit);
-            System.Attribute[] result = new System.Attribute[attributes.Length];
-            int n = 0;
-            foreach (Attribute attribute in attributes)
-                result[n++] = attribute;
-
-            return result;
-        }
-
-        #endregion
-
-		#region Interfaces
-
-		/// <summary>
-		/// Check to see if a type implements a named interface.
-		/// </summary>
-		/// <param name="fixtureType">The type to examine</param>
-		/// <param name="interfaceName">The FullName of the interface to check for</param>
-		/// <returns>True if the interface is implemented by the type</returns>
-		public static bool HasInterface( Type fixtureType, string interfaceName )
-		{
-			foreach( Type type in fixtureType.GetInterfaces() )
-				if ( type.FullName == interfaceName )
-						return true;
-			return false;
-		}
-
-		#endregion
-
-		#region Inheritance
-		//SHMARYA: [ 10/12/2005 ]
-		/// <summary>
-		/// Checks to see if a type inherits from a named type. 
-		/// </summary>
-		/// <param name="type">The type to examine</param>
-		/// <param name="parentType">The FullName of the inherited type to look for</param>
-		/// <returns>True if the type inherits from the named type.</returns>
-		public static bool InheritsFrom( Type type, string typeName )
-		{
-			for( Type current = type; current != typeof( object ); current = current.BaseType )
-				if( current.FullName == typeName )
-					return true;
-
-			return false;
-		}
-
-		public static bool InheritsFrom( object obj, string typeName )
-		{
-			return InheritsFrom( obj.GetType(), typeName );
-		}
-
-		public static bool IsInstanceOfType( string typeName, Attribute attr )
-		{
-			Type type = attr.GetType();
-			return type.FullName == typeName || InheritsFrom( type, typeName );
-		}
-		#endregion
-
-		#region Get Methods of a type
-
-		/// <summary>
-		/// Find the default constructor on a type
-		/// </summary>
-		/// <param name="fixtureType"></param>
-		/// <returns></returns>
-		public static ConstructorInfo GetConstructor( Type fixtureType )
-		{
-			return fixtureType.GetConstructor( Type.EmptyTypes );
-		}
-
-        /// <summary>
-        /// Examine a fixture type and return an array of methods having a 
-        /// particular attribute. The array is order with base methods first.
-        /// </summary>
-        /// <param name="fixtureType">The type to examine</param>
-        /// <param name="attributeName">The FullName of the attribute to look for</param>
-        /// <returns>The array of methods found</returns>
-        public static MethodInfo[] GetMethodsWithAttribute(Type fixtureType, string attributeName, bool inherit)
-        {
-            ArrayList list = new ArrayList();
-
-            foreach (MethodInfo method in GetMethods(fixtureType))
-            {
-                if (HasAttribute(method, attributeName, inherit))
-                    list.Add(method);
-            }
-
-            list.Sort(new BaseTypesFirstComparer());
-
-            return (MethodInfo[])list.ToArray(typeof(MethodInfo));
-        }
-
-        private static MethodInfo[] GetMethods(Type fixtureType)
-        {
-            MethodInfo[] result = fixtureType.GetMethods(AllMembers);
-
-            return result;
-        }
-
-        private class BaseTypesFirstComparer : IComparer
-        {
-            #region IComparer Members
-
-            public int Compare(object x, object y)
-            {
-                MethodInfo m1 = x as MethodInfo;
-                MethodInfo m2 = y as MethodInfo;
-
-                if (m1 == null || m2 == null) return 0;
-
-                Type m1Type = m1.DeclaringType;
-                Type m2Type = m2.DeclaringType;
-
-                if ( m1Type == m2Type ) return 0;
-                if ( m1Type.IsAssignableFrom(m2Type) ) return -1;
-
-                return 1;
-            }
-
-            #endregion
-        }
-
-        /// <summary>
-        /// Examine a fixture type and return true if it has a method with
-        /// a particular attribute. 
-        /// </summary>
-        /// <param name="fixtureType">The type to examine</param>
-        /// <param name="attributeName">The FullName of the attribute to look for</param>
-        /// <returns>True if found, otherwise false</returns>
-        public static bool HasMethodWithAttribute(Type fixtureType, string attributeName, bool inherit)
-        {
-            foreach (MethodInfo method in GetMethods( fixtureType ))
-            {
-                if (HasAttribute(method, attributeName, inherit))
-                    return true;
-            }
-
-            return false;
-        }
-
-        /// <summary>
-        /// Examine a fixture type and get a method with a particular name.
-        /// In the case of overloads, the first one found is returned.
-        /// </summary>
-        /// <param name="fixtureType">The type to examine</param>
-        /// <param name="methodName">The name of the method</param>
-        /// <returns>A MethodInfo or null</returns>
-        public static MethodInfo GetNamedMethod(Type fixtureType, string methodName)
-        {
-            foreach (MethodInfo method in GetMethods( fixtureType ))
-            {
-                if (method.Name == methodName)
-                    return method;
-            }
-
-            return null;
-        }
-
-        /// <summary>
-        /// Examine a fixture type and get a method with a particular name and list
-        /// of arguments. In the case of overloads, the first one found is returned.
-        /// </summary>
-        /// <param name="fixtureType">The type to examine</param>
-        /// <param name="methodName">The name of the method</param>
-        /// <param name="argTypes">The full names of the argument types to search for</param>
-        /// <returns>A MethodInfo or null</returns>
-        public static MethodInfo GetNamedMethod(Type fixtureType, string methodName, 
-            string[] argTypes)
-        {
-            foreach (MethodInfo method in GetMethods(fixtureType) )
-            {
-                if (method.Name == methodName)
-                {
-                    ParameterInfo[] parameters = method.GetParameters();
-                    if (parameters.Length == argTypes.Length)
-                    {
-                        bool match = true;
-                        for (int i = 0; i < argTypes.Length; i++)
-                            if (parameters[i].ParameterType.FullName != argTypes[i])
-                            {
-                                match = false;
-                                break;
-                            }
-
-                        if (match)
-                            return method;
-                    }
-                }
-            }
-
-            return null;
-        }
-
-        #endregion
-
-		#region Get Properties of a type
-		/// <summary>
-		/// Examine a type and return a property having a particular attribute.
-		/// In the case of multiple methods, the first one found is returned.
-		/// </summary>
-		/// <param name="fixtureType">The type to examine</param>
-		/// <param name="attributeName">The FullName of the attribute to look for</param>
-		/// <returns>A PropertyInfo or null</returns>
-		public static PropertyInfo GetPropertyWithAttribute( Type fixtureType, string attributeName )
-		{
-			foreach(PropertyInfo property in fixtureType.GetProperties( AllMembers ) )
-			{
-				if( HasAttribute( property, attributeName, true ) ) 
-					return property;
-			}
-
-			return null;
-		}
-
-		/// <summary>
-		/// Examine a type and get a property with a particular name.
-		/// In the case of overloads, the first one found is returned.
-		/// </summary>
-		/// <param name="type">The type to examine</param>
-		/// <param name="bindingFlags">BindingFlags to use</param>
-		/// <returns>A PropertyInfo or null</returns>
-		public static PropertyInfo GetNamedProperty( Type type, string name, BindingFlags bindingFlags )
-		{
-			return type.GetProperty( name, bindingFlags );
-		}
-
-		/// <summary>
-		/// Get the value of a named property on an object using binding flags of Public and Instance
-		/// </summary>
-		/// <param name="obj">The object for which the property value is needed</param>
-		/// <param name="name">The name of a non-indexed property of the object</param>
-		/// <returns></returns>
-		public static object GetPropertyValue( object obj, string name )
-		{
-			return GetPropertyValue( obj, name, BindingFlags.Public | BindingFlags.Instance );
-		}
-
-		/// <summary>
-		/// Get the value of a named property on an object
-		/// </summary>
-		/// <param name="obj">The object for which the property value is needed</param>
-		/// <param name="name">The name of a non-indexed property of the object</param>
-		/// <param name="bindingFlags">BindingFlags for use in determining which properties are needed</param>param>
-		/// <returns></returns>
-		public static object GetPropertyValue( object obj, string name, BindingFlags bindingFlags )
-		{
-			PropertyInfo property = GetNamedProperty( obj.GetType(), name, bindingFlags );
-			if ( property != null )
-				return property.GetValue( obj, null );
-			return null;
-		}
-		#endregion
-
-		#region Invoke Methods
-
-        /// <summary>
-        /// Invoke the default constructor on a Type
-        /// </summary>
-        /// <param name="type">The Type to be constructed</param>
-        /// <returns>An instance of the Type</returns>
-        public static object Construct(Type type)
-        {
-            ConstructorInfo ctor = GetConstructor(type);
-            if (ctor == null)
-                throw new InvalidTestFixtureException(type.FullName + " does not have a default constructor");
-
-            return ctor.Invoke(null);
-        }
-
-        /// <summary>
-        /// Invoke a constructor on a Type with arguments
-        /// </summary>
-        /// <param name="type">The Type to be constructed</param>
-        /// <param name="arguments">Arguments to the constructor</param>
-        /// <returns>An instance of the Type</returns>
-        public static object Construct(Type type, object[] arguments)
-        {
-            if (arguments == null) return Construct(type);
-
-            //Type[] argTypes = GetTypeArray(arguments);
-            //ConstructorInfo ctor = GetConstructor(type, argTypes);
-            //if (ctor == null)
-            //    throw new InvalidTestFixtureException(type.FullName + " does not have a suitable constructor");
-
-            try
-            {
-                return type.InvokeMember(type.Name, BindingFlags.CreateInstance, null, null, arguments);
-            }
-            catch (Exception ex)
-            {
-                throw new InvalidTestFixtureException(type.FullName + " does not have a suitable constructor", ex);
-            }
-        }
-
-        /// <summary>
-        /// Returns an array of types from an array of objects.
-        /// Used because the compact framework doesn't support
-        /// Type.GetTypeArray()
-        /// </summary>
-        /// <param name="objects">An array of objects</param>
-        /// <returns>An array of Types</returns>
-        public static Type[] GetTypeArray(object[] objects)
-        {
-            Type[] types = new Type[objects.Length];
-            int index = 0;
-            foreach (object o in objects)
-                types[index++] = o == null ? null : o.GetType();
-            return types;
-        }
-
-        /// <summary>
-		/// Invoke a parameterless method returning void on an object.
-		/// </summary>
-		/// <param name="method">A MethodInfo for the method to be invoked</param>
-		/// <param name="fixture">The object on which to invoke the method</param>
-		public static object InvokeMethod( MethodInfo method, object fixture ) 
-		{
-			return InvokeMethod( method, fixture, null );
-		}
-
-		/// <summary>
-		/// Invoke a method returning void, converting any TargetInvocationException
-		/// to an NUnitException
-		/// </summary>
-		/// <param name="method">A MethodInfo for the method to be invoked</param>
-		/// <param name="fixture">The object on which to invoke the method</param>
-		public static object InvokeMethod( MethodInfo method, object fixture, params object[] args )
-		{
-			if(method != null)
-			{
-				try
-				{
-					return method.Invoke( fixture, args );
-				}
-				catch(TargetInvocationException e)
-				{
-					Exception inner = e.InnerException;
-					throw new NUnitException("Rethrown",inner);
-				}
-			}
-
-		    return null;
-		}
-
-		#endregion
-
-		#region Private Constructor for static-only class
-
-		private Reflect() { }
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Framework;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Helper methods for inspecting a type by reflection. 
+	/// 
+	/// Many of these methods take ICustomAttributeProvider as an 
+	/// argument to avoid duplication, even though certain attributes can 
+	/// only appear on specific types of members, like MethodInfo or Type.
+	/// 
+	/// In the case where a type is being examined for the presence of
+	/// an attribute, interface or named member, the Reflect methods
+	/// operate with the full name of the member being sought. This
+	/// removes the necessity of the caller having a reference to the
+	/// assembly that defines the item being sought and allows the
+	/// NUnit core to inspect assemblies that reference an older
+	/// version of the NUnit framework.
+	/// </summary>
+	public class Reflect
+	{
+        private static readonly BindingFlags AllMembers = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
+
+        #region Attributes 
+
+		/// <summary>
+		/// Check presence of attribute of a given type on a member.
+		/// </summary>
+		/// <param name="member">The member to examine</param>
+		/// <param name="attrName">The FullName of the attribute type to look for</param>
+		/// <param name="inherit">True to include inherited attributes</param>
+		/// <returns>True if the attribute is present</returns>
+		public static bool HasAttribute( ICustomAttributeProvider member, string attrName, bool inherit )
+		{
+			foreach( Attribute attribute in GetAttributes( member, inherit ) )
+				if ( IsInstanceOfType( attrName, attribute ) )
+					return true;
+			return false;
+		}
+
+        /// <summary>
+        /// Get attribute of a given type on a member. If multiple attributes
+        /// of a type are present, the first one found is returned.
+        /// </summary>
+        /// <param name="member">The member to examine</param>
+        /// <param name="attrName">The FullName of the attribute type to look for</param>
+        /// <param name="inherit">True to include inherited attributes</param>
+        /// <returns>The attribute or null</returns>
+        public static System.Attribute GetAttribute(ICustomAttributeProvider member, string attrName, bool inherit)
+        {
+            foreach (Attribute attribute in GetAttributes( member, inherit ) )
+                if ( IsInstanceOfType( attrName, attribute ) )
+                    return attribute;
+            return null;
+        }
+
+        /// <summary>
+		/// Get all attributes of a given type on a member.
+		/// </summary>
+		/// <param name="member">The member to examine</param>
+		/// <param name="attrName">The FullName of the attribute type to look for</param>
+		/// <param name="inherit">True to include inherited attributes</param>
+		/// <returns>The attribute or null</returns>
+        public static System.Attribute[] GetAttributes(
+            ICustomAttributeProvider member, string attrName, bool inherit)
+		{
+			ArrayList result = new ArrayList();
+			foreach( Attribute attribute in GetAttributes( member, inherit ) )
+				if ( IsInstanceOfType( attrName, attribute ) )
+					result.Add( attribute );
+			return (System.Attribute[])result.ToArray( typeof( System.Attribute ) );
+		}
+
+        /// <summary>
+        /// Get all attributes on a member.
+        /// </summary>
+        /// <param name="member">The member to examine</param>
+        /// <param name="inherit">True to include inherited attributes</param>
+        /// <returns>The attribute or null</returns>
+        public static System.Attribute[] GetAttributes(
+            ICustomAttributeProvider member, bool inherit)
+        {
+            object[] attributes = member.GetCustomAttributes(inherit);
+            System.Attribute[] result = new System.Attribute[attributes.Length];
+            int n = 0;
+            foreach (Attribute attribute in attributes)
+                result[n++] = attribute;
+
+            return result;
+        }
+
+        #endregion
+
+		#region Interfaces
+
+		/// <summary>
+		/// Check to see if a type implements a named interface.
+		/// </summary>
+		/// <param name="fixtureType">The type to examine</param>
+		/// <param name="interfaceName">The FullName of the interface to check for</param>
+		/// <returns>True if the interface is implemented by the type</returns>
+		public static bool HasInterface( Type fixtureType, string interfaceName )
+		{
+			foreach( Type type in fixtureType.GetInterfaces() )
+				if ( type.FullName == interfaceName )
+						return true;
+			return false;
+		}
+
+		#endregion
+
+		#region Inheritance
+		//SHMARYA: [ 10/12/2005 ]
+		/// <summary>
+		/// Checks to see if a type inherits from a named type. 
+		/// </summary>
+		/// <param name="type">The type to examine</param>
+		/// <param name="parentType">The FullName of the inherited type to look for</param>
+		/// <returns>True if the type inherits from the named type.</returns>
+		public static bool InheritsFrom( Type type, string typeName )
+		{
+			for( Type current = type; current != typeof( object ); current = current.BaseType )
+				if( current.FullName == typeName )
+					return true;
+
+			return false;
+		}
+
+		public static bool InheritsFrom( object obj, string typeName )
+		{
+			return InheritsFrom( obj.GetType(), typeName );
+		}
+
+		public static bool IsInstanceOfType( string typeName, Attribute attr )
+		{
+			Type type = attr.GetType();
+			return type.FullName == typeName || InheritsFrom( type, typeName );
+		}
+		#endregion
+
+		#region Get Methods of a type
+
+		/// <summary>
+		/// Find the default constructor on a type
+		/// </summary>
+		/// <param name="fixtureType"></param>
+		/// <returns></returns>
+		public static ConstructorInfo GetConstructor( Type fixtureType )
+		{
+			return fixtureType.GetConstructor( Type.EmptyTypes );
+		}
+
+        /// <summary>
+        /// Examine a fixture type and return an array of methods having a 
+        /// particular attribute. The array is order with base methods first.
+        /// </summary>
+        /// <param name="fixtureType">The type to examine</param>
+        /// <param name="attributeName">The FullName of the attribute to look for</param>
+        /// <returns>The array of methods found</returns>
+        public static MethodInfo[] GetMethodsWithAttribute(Type fixtureType, string attributeName, bool inherit)
+        {
+            ArrayList list = new ArrayList();
+
+            foreach (MethodInfo method in GetMethods(fixtureType))
+            {
+                if (HasAttribute(method, attributeName, inherit))
+                    list.Add(method);
+            }
+
+            list.Sort(new BaseTypesFirstComparer());
+
+            return (MethodInfo[])list.ToArray(typeof(MethodInfo));
+        }
+
+        private static MethodInfo[] GetMethods(Type fixtureType)
+        {
+            MethodInfo[] result = fixtureType.GetMethods(AllMembers);
+
+            return result;
+        }
+
+        private class BaseTypesFirstComparer : IComparer
+        {
+            #region IComparer Members
+
+            public int Compare(object x, object y)
+            {
+                MethodInfo m1 = x as MethodInfo;
+                MethodInfo m2 = y as MethodInfo;
+
+                if (m1 == null || m2 == null) return 0;
+
+                Type m1Type = m1.DeclaringType;
+                Type m2Type = m2.DeclaringType;
+
+                if ( m1Type == m2Type ) return 0;
+                if ( m1Type.IsAssignableFrom(m2Type) ) return -1;
+
+                return 1;
+            }
+
+            #endregion
+        }
+
+        /// <summary>
+        /// Examine a fixture type and return true if it has a method with
+        /// a particular attribute. 
+        /// </summary>
+        /// <param name="fixtureType">The type to examine</param>
+        /// <param name="attributeName">The FullName of the attribute to look for</param>
+        /// <returns>True if found, otherwise false</returns>
+        public static bool HasMethodWithAttribute(Type fixtureType, string attributeName, bool inherit)
+        {
+            foreach (MethodInfo method in GetMethods( fixtureType ))
+            {
+                if (HasAttribute(method, attributeName, inherit))
+                    return true;
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Examine a fixture type and get a method with a particular name.
+        /// In the case of overloads, the first one found is returned.
+        /// </summary>
+        /// <param name="fixtureType">The type to examine</param>
+        /// <param name="methodName">The name of the method</param>
+        /// <returns>A MethodInfo or null</returns>
+        public static MethodInfo GetNamedMethod(Type fixtureType, string methodName)
+        {
+            foreach (MethodInfo method in GetMethods( fixtureType ))
+            {
+                if (method.Name == methodName)
+                    return method;
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// Examine a fixture type and get a method with a particular name and list
+        /// of arguments. In the case of overloads, the first one found is returned.
+        /// </summary>
+        /// <param name="fixtureType">The type to examine</param>
+        /// <param name="methodName">The name of the method</param>
+        /// <param name="argTypes">The full names of the argument types to search for</param>
+        /// <returns>A MethodInfo or null</returns>
+        public static MethodInfo GetNamedMethod(Type fixtureType, string methodName, 
+            string[] argTypes)
+        {
+            foreach (MethodInfo method in GetMethods(fixtureType) )
+            {
+                if (method.Name == methodName)
+                {
+                    ParameterInfo[] parameters = method.GetParameters();
+                    if (parameters.Length == argTypes.Length)
+                    {
+                        bool match = true;
+                        for (int i = 0; i < argTypes.Length; i++)
+                            if (parameters[i].ParameterType.FullName != argTypes[i])
+                            {
+                                match = false;
+                                break;
+                            }
+
+                        if (match)
+                            return method;
+                    }
+                }
+            }
+
+            return null;
+        }
+
+        #endregion
+
+		#region Get Properties of a type
+		/// <summary>
+		/// Examine a type and return a property having a particular attribute.
+		/// In the case of multiple methods, the first one found is returned.
+		/// </summary>
+		/// <param name="fixtureType">The type to examine</param>
+		/// <param name="attributeName">The FullName of the attribute to look for</param>
+		/// <returns>A PropertyInfo or null</returns>
+		public static PropertyInfo GetPropertyWithAttribute( Type fixtureType, string attributeName )
+		{
+			foreach(PropertyInfo property in fixtureType.GetProperties( AllMembers ) )
+			{
+				if( HasAttribute( property, attributeName, true ) ) 
+					return property;
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		/// Examine a type and get a property with a particular name.
+		/// In the case of overloads, the first one found is returned.
+		/// </summary>
+		/// <param name="type">The type to examine</param>
+		/// <param name="bindingFlags">BindingFlags to use</param>
+		/// <returns>A PropertyInfo or null</returns>
+		public static PropertyInfo GetNamedProperty( Type type, string name, BindingFlags bindingFlags )
+		{
+			return type.GetProperty( name, bindingFlags );
+		}
+
+		/// <summary>
+		/// Get the value of a named property on an object using binding flags of Public and Instance
+		/// </summary>
+		/// <param name="obj">The object for which the property value is needed</param>
+		/// <param name="name">The name of a non-indexed property of the object</param>
+		/// <returns></returns>
+		public static object GetPropertyValue( object obj, string name )
+		{
+			return GetPropertyValue( obj, name, BindingFlags.Public | BindingFlags.Instance );
+		}
+
+		/// <summary>
+		/// Get the value of a named property on an object
+		/// </summary>
+		/// <param name="obj">The object for which the property value is needed</param>
+		/// <param name="name">The name of a non-indexed property of the object</param>
+		/// <param name="bindingFlags">BindingFlags for use in determining which properties are needed</param>param>
+		/// <returns></returns>
+		public static object GetPropertyValue( object obj, string name, BindingFlags bindingFlags )
+		{
+			PropertyInfo property = GetNamedProperty( obj.GetType(), name, bindingFlags );
+			if ( property != null )
+				return property.GetValue( obj, null );
+			return null;
+		}
+		#endregion
+
+		#region Invoke Methods
+
+        /// <summary>
+        /// Invoke the default constructor on a Type
+        /// </summary>
+        /// <param name="type">The Type to be constructed</param>
+        /// <returns>An instance of the Type</returns>
+        public static object Construct(Type type)
+        {
+            ConstructorInfo ctor = GetConstructor(type);
+            if (ctor == null)
+                throw new InvalidTestFixtureException(type.FullName + " does not have a default constructor");
+
+            return ctor.Invoke(null);
+        }
+
+        /// <summary>
+        /// Invoke a constructor on a Type with arguments
+        /// </summary>
+        /// <param name="type">The Type to be constructed</param>
+        /// <param name="arguments">Arguments to the constructor</param>
+        /// <returns>An instance of the Type</returns>
+        public static object Construct(Type type, object[] arguments)
+        {
+            if (arguments == null) return Construct(type);
+
+            //Type[] argTypes = GetTypeArray(arguments);
+            //ConstructorInfo ctor = GetConstructor(type, argTypes);
+            //if (ctor == null)
+            //    throw new InvalidTestFixtureException(type.FullName + " does not have a suitable constructor");
+
+            try
+            {
+                return type.InvokeMember(type.Name, BindingFlags.CreateInstance, null, null, arguments);
+            }
+            catch (Exception ex)
+            {
+                throw new InvalidTestFixtureException(type.FullName + " does not have a suitable constructor", ex);
+            }
+        }
+
+        /// <summary>
+        /// Returns an array of types from an array of objects.
+        /// Used because the compact framework doesn't support
+        /// Type.GetTypeArray()
+        /// </summary>
+        /// <param name="objects">An array of objects</param>
+        /// <returns>An array of Types</returns>
+        public static Type[] GetTypeArray(object[] objects)
+        {
+            Type[] types = new Type[objects.Length];
+            int index = 0;
+            foreach (object o in objects)
+                types[index++] = o == null ? null : o.GetType();
+            return types;
+        }
+
+        /// <summary>
+		/// Invoke a parameterless method returning void on an object.
+		/// </summary>
+		/// <param name="method">A MethodInfo for the method to be invoked</param>
+		/// <param name="fixture">The object on which to invoke the method</param>
+		public static object InvokeMethod( MethodInfo method, object fixture ) 
+		{
+			return InvokeMethod( method, fixture, null );
+		}
+
+		/// <summary>
+		/// Invoke a method returning void, converting any TargetInvocationException
+		/// to an NUnitException
+		/// </summary>
+		/// <param name="method">A MethodInfo for the method to be invoked</param>
+		/// <param name="fixture">The object on which to invoke the method</param>
+		public static object InvokeMethod( MethodInfo method, object fixture, params object[] args )
+		{
+			if(method != null)
+			{
+				try
+				{
+					return method.Invoke( fixture, args );
+				}
+				catch(TargetInvocationException e)
+				{
+					Exception inner = e.InnerException;
+					throw new NUnitException("Rethrown",inner);
+				}
+			}
+
+		    return null;
+		}
+
+		#endregion
+
+		#region Private Constructor for static-only class
+
+		private Reflect() { }
+
+		#endregion
+
+#if CLR_2_0 || CLR_4_0
+	    public static bool IsAsyncMethod(MethodInfo method)
+	    {
+		    return AsyncInvocationRegion.IsAsyncOperation(method);
+	    }
+#endif
+	}
+}
diff --git a/src/NUnitCore/core/RemoteTestRunner.cs b/src/NUnitCore/core/RemoteTestRunner.cs
index 01a92a1..b147d47 100644
--- a/src/NUnitCore/core/RemoteTestRunner.cs
+++ b/src/NUnitCore/core/RemoteTestRunner.cs
@@ -1,156 +1,156 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-    using System.Collections;
-    using System.Diagnostics;
-    using System.Reflection;
-    using System.Threading;
-
-	/// <summary>
-	/// RemoteTestRunner is tailored for use as the initial runner to
-	/// receive control in a remote domain. It provides isolation for the return
-	/// value by using a ThreadedTestRunner and for the events through use of
-	/// an EventPump.
-	/// </summary>
-	public class RemoteTestRunner : ProxyTestRunner
-	{
-		/// <summary>
-		/// Returns a RemoteTestRunner in the target domain. This method
-		/// is used in the domain that wants to get a reference to 
-		/// a RemoteTestRunnner and not in the test domain itself.
-		/// </summary>
-		/// <param name="targetDomain">AppDomain in which to create the runner</param>
-		/// <param name="ID">Id for the new runner to use</param>
-		/// <returns></returns>
-        public static RemoteTestRunner CreateInstance(AppDomain targetDomain, int ID)
-        {
-#if CLR_2_0 || CLR_4_0
-            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
-                targetDomain,
-#else
-			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstance(
-#endif
-                Assembly.GetExecutingAssembly().FullName,
-                typeof(RemoteTestRunner).FullName,
-                false, BindingFlags.Default, null, new object[] { ID }, null, null, null);
-
-            object obj = oh.Unwrap();
-            return (RemoteTestRunner)obj;
-        }
-
-		static Logger log = InternalTrace.GetLogger("RemoteTestRunner");
-
-		#region Constructors
-		public RemoteTestRunner() : this( 0 ) { }
-
-		public RemoteTestRunner( int runnerID ) : base( runnerID ) { }
-		#endregion
-
-		#region Method Overrides
-
-		public override bool Load(TestPackage package)
-		{
-			log.Info("Loading Test Package " + package.Name );
-
-			// Initialize ExtensionHost if not already done
-			if ( !CoreExtensions.Host.Initialized )
-				CoreExtensions.Host.InitializeService();
-
-			// Delayed creation of downstream runner allows us to
-			// use a different runner type based on the package
-			bool useThreadedRunner = package.GetSetting( "UseThreadedRunner", true );
-			
-			TestRunner runner = new SimpleTestRunner( this.runnerID );
-            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;
-
-			if( base.Load (package) )
-			{
-				log.Info("Loaded package successfully" );
-				return true;
-			}
-			else
-			{
-				log.Info("Package load failed" );
-				return false;
-			}
-		}
-
-        public override void Unload()
-        {
-            log.Info("Unloading test package");
-
-            base.Unload();
-        }
-
-		public override TestResult Run( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
-		{
-            log.Debug("Run");
-
-            QueuingEventListener queue = new QueuingEventListener();
-
-			StartTextCapture( queue, tracing, logLevel );
-
-			using( EventPump pump = new EventPump( listener, queue.Events, true ) )
-			{
-				pump.Start();
-				return base.Run( queue, filter, tracing, logLevel );
-			}
-		}
-
-		public override void BeginRun( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
-		{
-            log.Debug("BeginRun");
-
-			QueuingEventListener queue = new QueuingEventListener();
-
-			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, tracing, logLevel );
-		}
-
-		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.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)
-		{
-			log.Debug(AppDomain.CurrentDomain.FriendlyName + " unloaded");
-			InternalTrace.Flush();
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+    using System.Collections;
+    using System.Diagnostics;
+    using System.Reflection;
+    using System.Threading;
+
+	/// <summary>
+	/// RemoteTestRunner is tailored for use as the initial runner to
+	/// receive control in a remote domain. It provides isolation for the return
+	/// value by using a ThreadedTestRunner and for the events through use of
+	/// an EventPump.
+	/// </summary>
+	public class RemoteTestRunner : ProxyTestRunner
+	{
+		/// <summary>
+		/// Returns a RemoteTestRunner in the target domain. This method
+		/// is used in the domain that wants to get a reference to 
+		/// a RemoteTestRunnner and not in the test domain itself.
+		/// </summary>
+		/// <param name="targetDomain">AppDomain in which to create the runner</param>
+		/// <param name="ID">Id for the new runner to use</param>
+		/// <returns></returns>
+        public static RemoteTestRunner CreateInstance(AppDomain targetDomain, int ID)
+        {
+#if CLR_2_0 || CLR_4_0
+            System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(
+                targetDomain,
+#else
+			System.Runtime.Remoting.ObjectHandle oh = targetDomain.CreateInstance(
+#endif
+                Assembly.GetExecutingAssembly().FullName,
+                typeof(RemoteTestRunner).FullName,
+                false, BindingFlags.Default, null, new object[] { ID }, null, null, null);
+
+            object obj = oh.Unwrap();
+            return (RemoteTestRunner)obj;
+        }
+
+		static Logger log = InternalTrace.GetLogger("RemoteTestRunner");
+
+		#region Constructors
+		public RemoteTestRunner() : this( 0 ) { }
+
+		public RemoteTestRunner( int runnerID ) : base( runnerID ) { }
+		#endregion
+
+		#region Method Overrides
+
+		public override bool Load(TestPackage package)
+		{
+			log.Info("Loading Test Package " + package.Name );
+
+			// Initialize ExtensionHost if not already done
+			if ( !CoreExtensions.Host.Initialized )
+				CoreExtensions.Host.InitializeService();
+
+			// Delayed creation of downstream runner allows us to
+			// use a different runner type based on the package
+			bool useThreadedRunner = package.GetSetting( "UseThreadedRunner", true );
+			
+			TestRunner runner = new SimpleTestRunner( this.runnerID );
+            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;
+
+			if( base.Load (package) )
+			{
+				log.Info("Loaded package successfully" );
+				return true;
+			}
+			else
+			{
+				log.Info("Package load failed" );
+				return false;
+			}
+		}
+
+        public override void Unload()
+        {
+            log.Info("Unloading test package");
+
+            base.Unload();
+        }
+
+		public override TestResult Run( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
+		{
+            log.Debug("Run");
+
+            QueuingEventListener queue = new QueuingEventListener();
+
+			StartTextCapture( queue, tracing, logLevel );
+
+			using( EventPump pump = new EventPump( listener, queue.Events, true ) )
+			{
+				pump.Start();
+				return base.Run( queue, filter, tracing, logLevel );
+			}
+		}
+
+		public override void BeginRun( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
+		{
+            log.Debug("BeginRun");
+
+			QueuingEventListener queue = new QueuingEventListener();
+
+			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, tracing, logLevel );
+		}
+
+		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.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)
+		{
+			log.Debug(AppDomain.CurrentDomain.FriendlyName + " unloaded");
+			InternalTrace.Flush();
+		}
+	}
+}
diff --git a/src/NUnitCore/core/SetUpFixture.cs b/src/NUnitCore/core/SetUpFixture.cs
index e1830c6..053973e 100644
--- a/src/NUnitCore/core/SetUpFixture.cs
+++ b/src/NUnitCore/core/SetUpFixture.cs
@@ -1,58 +1,58 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// SetUpFixture extends TestSuite and supports
-	/// Setup and TearDown methods.
-	/// </summary>
-	public class SetUpFixture : TestSuite
-	{
-		#region Constructor
-		public SetUpFixture( Type type ) : base( type )
-		{
-            this.TestName.Name = type.Namespace;
-            if (this.TestName.Name == null)
-                this.TestName.Name = "[default namespace]";
-            int index = TestName.Name.LastIndexOf('.');
-            if (index > 0)
-                this.TestName.Name = this.TestName.Name.Substring(index + 1);
-            
-			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
-
-		#region TestSuite Overrides
-
-        /// <summary>
-        /// Gets a string representing the kind of test
-        /// that this object represents, for use in display.
-        /// </summary>
-        public override string TestType
-        {
-            get { return "SetUpFixture"; }
-        }
-
-		public override TestResult Run(EventListener listener, ITestFilter filter)
-		{
-			using ( new DirectorySwapper( AssemblyHelper.GetDirectoryName( FixtureType.Assembly ) ) )
-			{
-				return base.Run(listener, filter);
-			}
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// SetUpFixture extends TestSuite and supports
+	/// Setup and TearDown methods.
+	/// </summary>
+	public class SetUpFixture : TestSuite
+	{
+		#region Constructor
+		public SetUpFixture( Type type ) : base( type )
+		{
+            this.TestName.Name = type.Namespace;
+            if (this.TestName.Name == null)
+                this.TestName.Name = "[default namespace]";
+            int index = TestName.Name.LastIndexOf('.');
+            if (index > 0)
+                this.TestName.Name = this.TestName.Name.Substring(index + 1);
+            
+			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
+
+		#region TestSuite Overrides
+
+        /// <summary>
+        /// Gets a string representing the kind of test
+        /// that this object represents, for use in display.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "SetUpFixture"; }
+        }
+
+		public override TestResult Run(EventListener listener, ITestFilter filter)
+		{
+			using ( new DirectorySwapper( AssemblyHelper.GetDirectoryName( FixtureType.Assembly ) ) )
+			{
+				return base.Run(listener, filter);
+			}
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/SimpleTestRunner.cs b/src/NUnitCore/core/SimpleTestRunner.cs
index 1cd07f2..55939b6 100644
--- a/src/NUnitCore/core/SimpleTestRunner.cs
+++ b/src/NUnitCore/core/SimpleTestRunner.cs
@@ -1,217 +1,217 @@
-// ****************************************************************
-// Copyright 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.Threading;
-using System.Collections;
-using System.Collections.Specialized;
-using NUnit.Core.Filters;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// SimpleTestRunner is the simplest direct-running TestRunner. It
-	/// passes the event listener interface that is provided on to the tests
-	/// to use directly and does nothing to redirect text output. Both
-	/// Run and BeginRun are actually synchronous, although the client
-	/// can usually ignore this. BeginRun + EndRun operates as expected.
-	/// </summary>
-	public class SimpleTestRunner : MarshalByRefObject, TestRunner
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(SimpleTestRunner));
-
-		#region Instance Variables
-
-		/// <summary>
-		/// Identifier for this runner. Must be unique among all
-		/// active runners in order to locate tests. Default
-		/// value of 0 is adequate in applications with a single
-		/// runner or a non-branching chain of runners.
-		/// </summary>
-		private int runnerID = 0;
-
-		/// <summary>
-		/// The loaded test suite
-		/// </summary>
-		private Test test;
-
-		/// <summary>
-		/// The builder we use to load tests, created for each load
-		/// </summary>
-		private TestSuiteBuilder builder;
-
-		/// <summary>
-		/// Results from the last test run
-		/// </summary>
-		private TestResult testResult;
-
-		/// <summary>
-		/// The thread on which Run was called. Set to the
-		/// current thread while a run is in process.
-		/// </summary>
-		private Thread runThread;
-
-		#endregion
-
-		#region Constructor
-		public SimpleTestRunner() : this( 0 ) { }
-
-		public SimpleTestRunner( int runnerID )
-		{
-			this.runnerID = runnerID;
-		}
-		#endregion
-
-		#region Properties
-		public virtual int ID
-		{
-			get { return runnerID; }
-		}
-
-		public IList AssemblyInfo
-		{
-			get { return builder.AssemblyInfo; }
-		}
-		
-		public ITest Test
-		{
-			get { return test == null ? null : new TestNode( test ); }
-		}
-
-		/// <summary>
-		/// Results from the last test run
-		/// </summary>
-		public TestResult TestResult
-		{
-			get { return testResult; }
-		}
-
-		public virtual bool Running
-		{
-			get { return runThread != null && runThread.IsAlive; }
-		}
-		#endregion
-
-		#region Methods for Loading Tests
-		/// <summary>
-		/// Load a TestPackage
-		/// </summary>
-		/// <param name="package">The package to be loaded</param>
-		/// <returns>True on success, false on failure</returns>
-		public bool Load( TestPackage package )
-		{
-            log.Debug("Loading package " + package.Name);
-
-			this.builder = new TestSuiteBuilder();
-
-			this.test = builder.Build( package );
-			if ( test == null ) return false;
-
-			test.SetRunnerID( this.runnerID, true );
-            TestExecutionContext.CurrentContext.TestPackage = package;
-			return true;
-		}
-
-		/// <summary>
-		/// Unload all tests previously loaded
-		/// </summary>
-		public void Unload()
-		{
-            log.Debug("Unloading");
-			this.test = null; // All for now
-		}
-		#endregion
-
-		#region CountTestCases
-		public int CountTestCases( ITestFilter filter )
-		{
-			return test.CountTestCases( filter );
-		}
-		#endregion
-
-		#region Methods for Running Tests
-
-		public virtual TestResult Run( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
-		{
-			try
-			{
-                log.Debug("Starting test run");
-
-				// Take note of the fact that we are running
-				this.runThread = Thread.CurrentThread;
-
-				listener.RunStarted( this.Test.TestName.FullName, test.CountTestCases( filter ) );
-				
-				testResult = test.Run( listener, filter );
-
-				// Signal that we are done
-				listener.RunFinished( testResult );
-                log.Debug("Test run complete");
-
-				// Return result array
-				return testResult;
-			}
-			catch( Exception exception )
-			{
-				// Signal that we finished with an exception
-				listener.RunFinished( exception );
-				// Rethrow - should we do this?
-				throw;
-			}
-			finally
-			{
-				runThread = null;
-			}
-		}
-
-        public void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
-        {
-            testResult = this.Run(listener, filter, tracing, logLevel);
-        }
-
-        public virtual TestResult EndRun()
-		{
-			return TestResult;
-		}
-
-		/// <summary>
-		/// Wait is a NOP for SimpleTestRunner
-		/// </summary>
-		public virtual void Wait()
-		{
-		}
-
-		public virtual void CancelRun()
-		{
-			if (this.runThread != null)
-			{
-				// Cancel Synchronous run only if on another thread
-				if ( this.runThread == Thread.CurrentThread )
-					throw new InvalidOperationException( "May not CancelRun on same thread that is running the test" );
-
-                ThreadUtility.Kill(this.runThread);
-			}
-		}
-		#endregion
-
-        #region InitializeLifetimeService Override
-        public override object InitializeLifetimeService()
-        {
-            return null;
-        }
-	#endregion
-
-        #region IDisposable Members
-
-        public void Dispose()
-        {
-            Unload();
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 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.Threading;
+using System.Collections;
+using System.Collections.Specialized;
+using NUnit.Core.Filters;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// SimpleTestRunner is the simplest direct-running TestRunner. It
+	/// passes the event listener interface that is provided on to the tests
+	/// to use directly and does nothing to redirect text output. Both
+	/// Run and BeginRun are actually synchronous, although the client
+	/// can usually ignore this. BeginRun + EndRun operates as expected.
+	/// </summary>
+	public class SimpleTestRunner : MarshalByRefObject, TestRunner
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(SimpleTestRunner));
+
+		#region Instance Variables
+
+		/// <summary>
+		/// Identifier for this runner. Must be unique among all
+		/// active runners in order to locate tests. Default
+		/// value of 0 is adequate in applications with a single
+		/// runner or a non-branching chain of runners.
+		/// </summary>
+		private int runnerID = 0;
+
+		/// <summary>
+		/// The loaded test suite
+		/// </summary>
+		private Test test;
+
+		/// <summary>
+		/// The builder we use to load tests, created for each load
+		/// </summary>
+		private TestSuiteBuilder builder;
+
+		/// <summary>
+		/// Results from the last test run
+		/// </summary>
+		private TestResult testResult;
+
+		/// <summary>
+		/// The thread on which Run was called. Set to the
+		/// current thread while a run is in process.
+		/// </summary>
+		private Thread runThread;
+
+		#endregion
+
+		#region Constructor
+		public SimpleTestRunner() : this( 0 ) { }
+
+		public SimpleTestRunner( int runnerID )
+		{
+			this.runnerID = runnerID;
+		}
+		#endregion
+
+		#region Properties
+		public virtual int ID
+		{
+			get { return runnerID; }
+		}
+
+		public IList AssemblyInfo
+		{
+			get { return builder.AssemblyInfo; }
+		}
+		
+		public ITest Test
+		{
+			get { return test == null ? null : new TestNode( test ); }
+		}
+
+		/// <summary>
+		/// Results from the last test run
+		/// </summary>
+		public TestResult TestResult
+		{
+			get { return testResult; }
+		}
+
+		public virtual bool Running
+		{
+			get { return runThread != null && runThread.IsAlive; }
+		}
+		#endregion
+
+		#region Methods for Loading Tests
+		/// <summary>
+		/// Load a TestPackage
+		/// </summary>
+		/// <param name="package">The package to be loaded</param>
+		/// <returns>True on success, false on failure</returns>
+		public bool Load( TestPackage package )
+		{
+            log.Debug("Loading package " + package.Name);
+
+			this.builder = new TestSuiteBuilder();
+
+			this.test = builder.Build( package );
+			if ( test == null ) return false;
+
+			test.SetRunnerID( this.runnerID, true );
+            TestExecutionContext.CurrentContext.TestPackage = package;
+			return true;
+		}
+
+		/// <summary>
+		/// Unload all tests previously loaded
+		/// </summary>
+		public void Unload()
+		{
+            log.Debug("Unloading");
+			this.test = null; // All for now
+		}
+		#endregion
+
+		#region CountTestCases
+		public int CountTestCases( ITestFilter filter )
+		{
+			return test.CountTestCases( filter );
+		}
+		#endregion
+
+		#region Methods for Running Tests
+
+		public virtual TestResult Run( EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel )
+		{
+			try
+			{
+                log.Debug("Starting test run");
+
+				// Take note of the fact that we are running
+				this.runThread = Thread.CurrentThread;
+
+				listener.RunStarted( this.Test.TestName.FullName, test.CountTestCases( filter ) );
+				
+				testResult = test.Run( listener, filter );
+
+				// Signal that we are done
+				listener.RunFinished( testResult );
+                log.Debug("Test run complete");
+
+				// Return result array
+				return testResult;
+			}
+			catch( Exception exception )
+			{
+				// Signal that we finished with an exception
+				listener.RunFinished( exception );
+				// Rethrow - should we do this?
+				throw;
+			}
+			finally
+			{
+				runThread = null;
+			}
+		}
+
+        public void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            testResult = this.Run(listener, filter, tracing, logLevel);
+        }
+
+        public virtual TestResult EndRun()
+		{
+			return TestResult;
+		}
+
+		/// <summary>
+		/// Wait is a NOP for SimpleTestRunner
+		/// </summary>
+		public virtual void Wait()
+		{
+		}
+
+		public virtual void CancelRun()
+		{
+			if (this.runThread != null)
+			{
+				// Cancel Synchronous run only if on another thread
+				if ( this.runThread == Thread.CurrentThread )
+					throw new InvalidOperationException( "May not CancelRun on same thread that is running the test" );
+
+                ThreadUtility.Kill(this.runThread);
+			}
+		}
+		#endregion
+
+        #region InitializeLifetimeService Override
+        public override object InitializeLifetimeService()
+        {
+            return null;
+        }
+	#endregion
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            Unload();
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/StringTextWriter.cs b/src/NUnitCore/core/StringTextWriter.cs
index 8213497..2a299a8 100644
--- a/src/NUnitCore/core/StringTextWriter.cs
+++ b/src/NUnitCore/core/StringTextWriter.cs
@@ -1,128 +1,128 @@
-// ****************************************************************
-// 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.IO;
-using System.Text;
-
-namespace NUnit.Core
-{
-	// TODO: This class is not currently being used. Review to
-	// see if we will use it again, otherwise drop it.
-	#region StringTextWriter
-
-	/// <summary>
-	/// Use this wrapper to ensure that only strings get passed accross the AppDomain
-	/// boundary.  Otherwise tests will break when non-remotable objects are passed to
-	/// Console.Write/WriteLine.
-	/// </summary>
-	public class StringTextWriter : TextWriter
-	{
-		public StringTextWriter( TextWriter aTextWriter )
-		{
-			theTextWriter = aTextWriter;
-		}
-
-		protected TextWriter theTextWriter;
-
-		override public void Write(char aChar)
-		{
-			theTextWriter.Write(aChar);
-		}
-
-		override public void Write(string aString)
-		{
-			theTextWriter.Write(aString);
-		}
-
-		override public void WriteLine(string aString)
-		{
-			theTextWriter.WriteLine(aString);
-		}
-
-		override public System.Text.Encoding Encoding
-		{
-			get { return theTextWriter.Encoding; }
-		}
-
-		public override void Close()
-		{
-			this.Flush();
-			theTextWriter.Close ();
-		}
-
-		public override void Flush()
-		{
-			theTextWriter.Flush ();
-		}
-	}
-
-	#endregion
-
-	#region BufferedStringTextWriter
-
-	/// <summary>
-	/// This wrapper derives from StringTextWriter and adds buffering
-	/// to improve cross-domain performance. The buffer is flushed whenever
-	/// it reaches or exceeds a maximum size or when Flush is called.
-	/// </summary>
-	public class BufferedStringTextWriter : StringTextWriter
-	{
-		public BufferedStringTextWriter( TextWriter aTextWriter ) : base( aTextWriter ){ }
-	
-		private static readonly int MAX_BUFFER = 1000;
-		private StringBuilder sb = new StringBuilder( MAX_BUFFER );
-
-		override public void Write(char aChar)
-		{
-			lock( sb )
-			{
-				sb.Append( aChar );
-				this.CheckBuffer();
-			}
-		}
-
-		override public void Write(string aString)
-		{
-			lock( sb )
-			{
-				sb.Append( aString );
-				this.CheckBuffer();
-			}
-		}
-
-		override public void WriteLine(string aString)
-		{
-			lock( sb )
-			{
-				sb.Append( aString );
-				sb.Append( '\n' );
-				this.CheckBuffer();
-			}
-		}
-
-		override public void Flush()
-		{
-			if ( sb.Length > 0 )
-			{
-				lock( sb )
-				{
-					theTextWriter.Write( sb.ToString() );
-					sb.Length = 0;
-				}
-			}
-
-			theTextWriter.Flush();
-		}
-
-		private void CheckBuffer()
-		{
-			if ( sb.Length >= MAX_BUFFER )
-				this.Flush();
-		}
-	}
-
-	#endregion
-}
+// ****************************************************************
+// 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.IO;
+using System.Text;
+
+namespace NUnit.Core
+{
+	// TODO: This class is not currently being used. Review to
+	// see if we will use it again, otherwise drop it.
+	#region StringTextWriter
+
+	/// <summary>
+	/// Use this wrapper to ensure that only strings get passed accross the AppDomain
+	/// boundary.  Otherwise tests will break when non-remotable objects are passed to
+	/// Console.Write/WriteLine.
+	/// </summary>
+	public class StringTextWriter : TextWriter
+	{
+		public StringTextWriter( TextWriter aTextWriter )
+		{
+			theTextWriter = aTextWriter;
+		}
+
+		protected TextWriter theTextWriter;
+
+		override public void Write(char aChar)
+		{
+			theTextWriter.Write(aChar);
+		}
+
+		override public void Write(string aString)
+		{
+			theTextWriter.Write(aString);
+		}
+
+		override public void WriteLine(string aString)
+		{
+			theTextWriter.WriteLine(aString);
+		}
+
+		override public System.Text.Encoding Encoding
+		{
+			get { return theTextWriter.Encoding; }
+		}
+
+		public override void Close()
+		{
+			this.Flush();
+			theTextWriter.Close ();
+		}
+
+		public override void Flush()
+		{
+			theTextWriter.Flush ();
+		}
+	}
+
+	#endregion
+
+	#region BufferedStringTextWriter
+
+	/// <summary>
+	/// This wrapper derives from StringTextWriter and adds buffering
+	/// to improve cross-domain performance. The buffer is flushed whenever
+	/// it reaches or exceeds a maximum size or when Flush is called.
+	/// </summary>
+	public class BufferedStringTextWriter : StringTextWriter
+	{
+		public BufferedStringTextWriter( TextWriter aTextWriter ) : base( aTextWriter ){ }
+	
+		private static readonly int MAX_BUFFER = 1000;
+		private StringBuilder sb = new StringBuilder( MAX_BUFFER );
+
+		override public void Write(char aChar)
+		{
+			lock( sb )
+			{
+				sb.Append( aChar );
+				this.CheckBuffer();
+			}
+		}
+
+		override public void Write(string aString)
+		{
+			lock( sb )
+			{
+				sb.Append( aString );
+				this.CheckBuffer();
+			}
+		}
+
+		override public void WriteLine(string aString)
+		{
+			lock( sb )
+			{
+				sb.Append( aString );
+				sb.Append( '\n' );
+				this.CheckBuffer();
+			}
+		}
+
+		override public void Flush()
+		{
+			if ( sb.Length > 0 )
+			{
+				lock( sb )
+				{
+					theTextWriter.Write( sb.ToString() );
+					sb.Length = 0;
+				}
+			}
+
+			theTextWriter.Flush();
+		}
+
+		private void CheckBuffer()
+		{
+			if ( sb.Length >= MAX_BUFFER )
+				this.Flush();
+		}
+	}
+
+	#endregion
+}
diff --git a/src/NUnitCore/core/SuiteBuilderAttribute.cs b/src/NUnitCore/core/SuiteBuilderAttribute.cs
index a309099..a2748dd 100644
--- a/src/NUnitCore/core/SuiteBuilderAttribute.cs
+++ b/src/NUnitCore/core/SuiteBuilderAttribute.cs
@@ -1,18 +1,18 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// SuiteBuilderAttribute is used to mark custom suite builders.
-	/// The class so marked must implement the ISuiteBuilder interface.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public sealed class SuiteBuilderAttribute : Attribute
-	{}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// SuiteBuilderAttribute is used to mark custom suite builders.
+	/// The class so marked must implement the ISuiteBuilder interface.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	public sealed class SuiteBuilderAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitCore/core/Summary.xslt b/src/NUnitCore/core/Summary.xslt
index 036283a..246cf3d 100644
--- a/src/NUnitCore/core/Summary.xslt
+++ b/src/NUnitCore/core/Summary.xslt
@@ -1,59 +1,59 @@
-t<?xml version="1.0" encoding="UTF-8" ?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-<xsl:output method='text'/>
-
-<xsl:template match="/">
-	<xsl:apply-templates/>
-</xsl:template>
-
-<xsl:template match="test-results">
-<xsl:text>Tests run: </xsl:text>
-<xsl:value-of select="@total"/>
-<xsl:text>, Errors: </xsl:text>
-<xsl:value-of select="@errors"/>
-<xsl:text>, Failures: </xsl:text>
-<xsl:value-of select="@failures"/>
-<xsl:text>, Time: </xsl:text>
-<xsl:value-of select="test-suite/@time"/>
-<xsl:text> seconds
-</xsl:text>
-<xsl:text>  Not run: </xsl:text>
-<xsl:value-of select="@not-run"/>
-<xsl:text>, Invalid: </xsl:text>
-<xsl:value-of select="@invalid"/>
-<xsl:text>, Ignored: </xsl:text>
-<xsl:value-of select="@ignored"/>
-<xsl:text>, Skipped: </xsl:text>
-<xsl:value-of select="@skipped"/>
-<xsl:text>
-
-</xsl:text>
-
-<xsl:if test="//test-suite[failure]"><xsl:text>Test Fixture SetUp Failures:
-</xsl:text></xsl:if>
-<xsl:apply-templates select="//test-suite[failure]|//test-suite[failure]"/>
-<xsl:if test="//test-case[failure]"><xsl:text>Test Case Failures:
-</xsl:text></xsl:if>
-<xsl:apply-templates select="//test-case[failure]|//test-suite[failure]"/>
-<xsl:if test="//test-case[@executed='False']"><xsl:text>Tests not run:
-</xsl:text></xsl:if>
-<xsl:apply-templates select="//test-case[@executed='False']"/>
-<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
-</xsl:template>
-
-<xsl:template match="test-case|test-suite">
-	<xsl:value-of select="position()"/><xsl:text>) </xsl:text>
-	<xsl:value-of select="@name"/>
-	<xsl:text> : </xsl:text>
-	<xsl:value-of select="child::node()/message"/>
-<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
-	<xsl:if test="failure">
-		<xsl:value-of select="failure/stack-trace"/>
-<xsl:text>
-</xsl:text>
-	</xsl:if>
-</xsl:template>
-
-</xsl:stylesheet>
-
+t<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method='text'/>
+
+<xsl:template match="/">
+	<xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="test-results">
+<xsl:text>Tests run: </xsl:text>
+<xsl:value-of select="@total"/>
+<xsl:text>, Errors: </xsl:text>
+<xsl:value-of select="@errors"/>
+<xsl:text>, Failures: </xsl:text>
+<xsl:value-of select="@failures"/>
+<xsl:text>, Time: </xsl:text>
+<xsl:value-of select="test-suite/@time"/>
+<xsl:text> seconds
+</xsl:text>
+<xsl:text>  Not run: </xsl:text>
+<xsl:value-of select="@not-run"/>
+<xsl:text>, Invalid: </xsl:text>
+<xsl:value-of select="@invalid"/>
+<xsl:text>, Ignored: </xsl:text>
+<xsl:value-of select="@ignored"/>
+<xsl:text>, Skipped: </xsl:text>
+<xsl:value-of select="@skipped"/>
+<xsl:text>
+
+</xsl:text>
+
+<xsl:if test="//test-suite[failure]"><xsl:text>Test Fixture SetUp Failures:
+</xsl:text></xsl:if>
+<xsl:apply-templates select="//test-suite[failure]|//test-suite[failure]"/>
+<xsl:if test="//test-case[failure]"><xsl:text>Test Case Failures:
+</xsl:text></xsl:if>
+<xsl:apply-templates select="//test-case[failure]|//test-suite[failure]"/>
+<xsl:if test="//test-case[@executed='False']"><xsl:text>Tests not run:
+</xsl:text></xsl:if>
+<xsl:apply-templates select="//test-case[@executed='False']"/>
+<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="test-case|test-suite">
+	<xsl:value-of select="position()"/><xsl:text>) </xsl:text>
+	<xsl:value-of select="@name"/>
+	<xsl:text> : </xsl:text>
+	<xsl:value-of select="child::node()/message"/>
+<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text>
+	<xsl:if test="failure">
+		<xsl:value-of select="failure/stack-trace"/>
+<xsl:text>
+</xsl:text>
+	</xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
   
\ No newline at end of file
diff --git a/src/NUnitCore/core/TestAction.cs b/src/NUnitCore/core/TestAction.cs
index 8d69d80..42e2eec 100644
--- a/src/NUnitCore/core/TestAction.cs
+++ b/src/NUnitCore/core/TestAction.cs
@@ -1,96 +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; } }
-    }
-}
+// ****************************************************************
+// 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 e78abf7..3666fb6 100644
--- a/src/NUnitCore/core/TestAssembly.cs
+++ b/src/NUnitCore/core/TestAssembly.cs
@@ -1,37 +1,37 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// TestAssembly is a TestSuite that represents the execution
-    /// of tests in a managed assembly.
-    /// </summary>
-    public class TestAssembly : TestSuite
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TestAssembly"/> class.
-        /// </summary>
-        /// <param name="path">The path.</param>
-        public TestAssembly(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.
-        /// </summary>
-        public override string TestType
-        {
-            get { return "Assembly"; }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// TestAssembly is a TestSuite that represents the execution
+    /// of tests in a managed assembly.
+    /// </summary>
+    public class TestAssembly : TestSuite
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestAssembly"/> class.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        public TestAssembly(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.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "Assembly"; }
+        }
+    }
+}
diff --git a/src/NUnitCore/core/TestBuilderAttribute.cs b/src/NUnitCore/core/TestBuilderAttribute.cs
index b8b7355..460012d 100644
--- a/src/NUnitCore/core/TestBuilderAttribute.cs
+++ b/src/NUnitCore/core/TestBuilderAttribute.cs
@@ -1,26 +1,26 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public class TestBuilderAttribute : Attribute
-	{
-		private Type builderType;
-
-		public TestBuilderAttribute(Type builderType)
-		{
-			this.builderType = builderType;
-		}
-
-		public Type BuilderType
-		{
-			get { return builderType; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	public class TestBuilderAttribute : Attribute
+	{
+		private Type builderType;
+
+		public TestBuilderAttribute(Type builderType)
+		{
+			this.builderType = builderType;
+		}
+
+		public Type BuilderType
+		{
+			get { return builderType; }
+		}
+	}
+}
diff --git a/src/NUnitCore/core/TestCaseBuilderAttribute.cs b/src/NUnitCore/core/TestCaseBuilderAttribute.cs
index a4beee3..4328782 100644
--- a/src/NUnitCore/core/TestCaseBuilderAttribute.cs
+++ b/src/NUnitCore/core/TestCaseBuilderAttribute.cs
@@ -1,18 +1,18 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestBuilderAttribute is used to mark custom test case builders.
-	/// The class so marked must implement the ITestCaseBuilder interface.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public sealed class TestCaseBuilderAttribute : System.Attribute
-	{}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestBuilderAttribute is used to mark custom test case builders.
+	/// The class so marked must implement the ITestCaseBuilder interface.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	public sealed class TestCaseBuilderAttribute : System.Attribute
+	{}
+}
diff --git a/src/NUnitCore/core/TestDecoratorAttribute.cs b/src/NUnitCore/core/TestDecoratorAttribute.cs
index 1883e82..2777b2a 100644
--- a/src/NUnitCore/core/TestDecoratorAttribute.cs
+++ b/src/NUnitCore/core/TestDecoratorAttribute.cs
@@ -1,17 +1,17 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestDecoratorAttribute is used to mark custom suite builders.
-	/// The class so marked must implement the ISuiteBuilder interface.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	public sealed class TestDecoratorAttribute : Attribute
-	{}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// TestDecoratorAttribute is used to mark custom suite builders.
+	/// The class so marked must implement the ISuiteBuilder interface.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	public sealed class TestDecoratorAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitCore/core/TestExecutionContext.cs b/src/NUnitCore/core/TestExecutionContext.cs
index 693fa96..817b19a 100644
--- a/src/NUnitCore/core/TestExecutionContext.cs
+++ b/src/NUnitCore/core/TestExecutionContext.cs
@@ -1,437 +1,454 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections.Specialized;
-using System.Configuration;
-using System.IO;
-using System.Diagnostics;
-using System.Globalization;
-using System.Security.Principal;
-using System.Threading;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Helper class used to save and restore certain static or
-	/// singleton settings in the environment that affect tests 
-	/// or which might be changed by the user tests.
-	/// 
-	/// An internal class is used to hold settings and a stack
-	/// of these objects is pushed and popped as Save and Restore
-	/// are called.
-	/// 
-	/// Static methods for each setting forward to the internal 
-	/// object on the top of the stack.
-	/// </summary>
-	public class TestExecutionContext
-	{
-		#region Static Fields
-
-		/// <summary>
-		/// The current context, head of the list of saved contexts.
-		/// </summary>
-        private static TestExecutionContext current = new TestExecutionContext();
-
-        #endregion
-
-        #region Instance Fields
-
-        /// <summary>
-        /// Indicates whether trace is enabled
-        /// </summary>
-        private bool tracing;
-
-        /// <summary>
-        /// Indicates whether logging is enabled
-        /// </summary>
-        //private bool logging;
-
-        /// <summary>
-        /// Destination for standard output
-        /// </summary>
-        private TextWriter outWriter;
-
-        /// <summary>
-        /// Destination for standard error
-        /// </summary>
-        private TextWriter errorWriter;
-
-        /// <summary>
-        /// Destination for Trace output
-        /// </summary>
-        private TextWriter traceWriter;
-
-        /// <summary>
-        /// Default timeout for test cases
-        /// </summary>
-        private int testCaseTimeout;
-
-        private Log4NetCapture logCapture;
-
-        /// <summary>
-        /// The current working directory
-        /// </summary>
-        private string currentDirectory;
-
-        /// <summary>
-        /// The current culture
-        /// </summary>
-        private CultureInfo currentCulture;
-
-        /// <summary>
-        /// The current UI culture
-        /// </summary>
-        private CultureInfo currentUICulture;
-
-        /// <summary>
-        /// The current Principal.
-        /// </summary>
-        private IPrincipal currentPrincipal;
-
-        /// <summary>
-        /// The currently executing test
-        /// </summary>
-        private Test currentTest;
-
-        /// <summary>
-        /// The active TestResult for the current test
-        /// </summary>
-        private TestResult currentResult;
-
-        /// <summary>
-        /// The TestPackage being executed
-        /// </summary>
-        private TestPackage testPackage;
-
-        /// <summary>
-        /// Link to a prior saved context
-        /// </summary>
-        public TestExecutionContext prior;
-
-        #endregion
-
-        #region Constructors
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TestExecutionContext"/> class.
-        /// </summary>
-        public TestExecutionContext()
-        {
-            this.prior = null;
-            this.tracing = false;
-            //this.logging = false;
-            this.outWriter = Console.Out;
-            this.errorWriter = Console.Error;
-            this.traceWriter = null;
-            this.logCapture = new Log4NetCapture();
-            this.testCaseTimeout = 0;
-
-            this.currentDirectory = Environment.CurrentDirectory;
-            this.currentCulture = CultureInfo.CurrentCulture;
-            this.currentUICulture = CultureInfo.CurrentUICulture;
-            this.currentPrincipal = Thread.CurrentPrincipal;
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TestExecutionContext"/> class.
-        /// </summary>
-        /// <param name="other">An existing instance of TestExecutionContext.</param>
-        public TestExecutionContext(TestExecutionContext other)
-        {
-            this.prior = other;
-            this.tracing = other.tracing;
-            //this.logging = other.logging;
-            this.outWriter = other.outWriter;
-            this.errorWriter = other.errorWriter;
-            this.traceWriter = other.traceWriter;
-            this.logCapture = other.logCapture;
-            this.testCaseTimeout = other.testCaseTimeout;
-
-            this.currentTest = other.currentTest;
-            this.currentResult = other.currentResult;
-            this.testPackage = other.testPackage;
-
-            this.currentDirectory = Environment.CurrentDirectory;
-            this.currentCulture = CultureInfo.CurrentCulture;
-            this.currentUICulture = CultureInfo.CurrentUICulture;
-            this.currentPrincipal = Thread.CurrentPrincipal;
-        }
-
-        #endregion
-
-        #region Static Singleton Instance
-
-        /// <summary>
-        /// Gets the current context.
-        /// </summary>
-        /// <value>The current context.</value>
-        public static TestExecutionContext CurrentContext
-        {
-            get { return current; }
-        }
-
-        #endregion
-
-        #region Properties
-
-        /// <summary>
-        /// Controls whether trace and debug output are written
-        /// to the standard output.
-        /// </summary>
-        public bool Tracing
-        {
-            get { return tracing; }
-            set
-            {
-                if (tracing != value)
-                {
-                    if (traceWriter != null && tracing)
-                        StopTracing();
-
-                    tracing = value;
-
-                    if (traceWriter != null && tracing)
-                        StartTracing();
-                }
-            }
-        }
-
-        /// <summary>
-        /// Controls where Console.Out is directed
-        /// </summary>
-        public TextWriter Out
-        {
-            get { return outWriter; }
-            set
-            {
-                if (outWriter != value)
-                {
-                    outWriter = value;
-                    Console.Out.Flush();
-                    Console.SetOut(outWriter);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Controls where Console.Error is directed
-        /// </summary>
-        public TextWriter Error
-        {
-            get { return errorWriter; }
-            set
-            {
-                if (errorWriter != value)
-                {
-                    errorWriter = value;
-                    Console.Error.Flush();
-                    Console.SetError(errorWriter);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Controls where Trace output is directed
-        /// </summary>
-        public TextWriter TraceWriter
-        {
-            get { return traceWriter; }
-            set
-            {
-                if (traceWriter != value)
-                {
-                    if (traceWriter != null && tracing)
-                        StopTracing();
-
-                    traceWriter = value;
-
-                    if (traceWriter != null && tracing)
-                        StartTracing();
-                }
-            }
-        }
-
-        /// <summary>
-        ///  Gets or sets the Log writer, which is actually held by a log4net 
-        ///  TextWriterAppender. When first set, the appender will be created
-        ///  and will thereafter send any log events to the writer.
-        ///  
-        ///  In normal operation, LogWriter is set to an EventListenerTextWriter
-        ///  connected to the EventQueue in the test domain. The events are
-        ///  subsequently captured in the Gui an the output displayed in
-        ///  the Log tab. The application under test does not need to define
-        ///  any additional appenders.
-        /// </summary>
-        public TextWriter LogWriter
-        {
-            get { return logCapture.Writer; }
-            set { logCapture.Writer = value; }
-        }
-
-        public LoggingThreshold LogLevel
-        {
-            get { return logCapture.Threshold; }
-            set { logCapture.Threshold = value; }
-        }
-
-        private void StopTracing()
-        {
-            traceWriter.Close();
-            System.Diagnostics.Trace.Listeners.Remove("NUnit");
-        }
-
-        private void StartTracing()
-        {
-            System.Diagnostics.Trace.Listeners.Add(new TextWriterTraceListener(traceWriter, "NUnit"));
-        }
-
-        /// <summary>
-        /// Saves and restores the CurrentDirectory
-        /// </summary>
-        public string CurrentDirectory
-        {
-            get { return currentDirectory; }
-            set
-            {
-                currentDirectory = value;
-                Environment.CurrentDirectory = currentDirectory;
-            }
-        }
-
-        /// <summary>
-        /// Saves or restores the CurrentCulture
-        /// </summary>
-        public CultureInfo CurrentCulture
-        {
-            get { return currentCulture; }
-            set
-            {
-                currentCulture = value;
-                Thread.CurrentThread.CurrentCulture = currentCulture;
-            }
-        }
-
-        /// <summary>
-        /// Saves or restores the CurrentUICulture
-        /// </summary>
-        public CultureInfo CurrentUICulture
-        {
-            get { return currentUICulture; }
-            set
-            {
-                currentUICulture = value;
-                Thread.CurrentThread.CurrentUICulture = currentUICulture;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the current <see cref="IPrincipal"/> for the Thread.
-        /// </summary>
-        public IPrincipal CurrentPrincipal
-        {
-            get { return this.currentPrincipal; }
-            set
-            {
-                this.currentPrincipal = value;
-                Thread.CurrentPrincipal = this.currentPrincipal;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the test case timeout value
-        /// </summary>
-        public int TestCaseTimeout
-        {
-            get { return testCaseTimeout; }
-            set { testCaseTimeout = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the current test
-        /// </summary>
-        public Test CurrentTest
-        {
-            get { return currentTest; }
-            set { currentTest = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the current test result
-        /// </summary>
-        public TestResult CurrentResult
-        {
-            get { return currentResult; }
-            set { currentResult = value; }
-        }
-
-        /// <summary>
-        /// Gets the test package currently being run
-        /// </summary>
-        public TestPackage TestPackage
-        {
-            get { return testPackage; }
-            set { testPackage = value; }
-        }
-
-        #endregion
-
-        #region Static Methods
-
-        /// <summary>
-        /// Saves the old context and makes a fresh one 
-        /// current without changing any settings.
-        /// </summary>
-        public static void Save()
-        {
-            TestExecutionContext.current = new TestExecutionContext(current);
-        }
-
-        /// <summary>
-        /// Restores the last saved context and puts
-        /// any saved settings back into effect.
-        /// </summary>
-        public static void Restore()
-        {
-            current.ReverseChanges();
-            current = current.prior;
-        }
-        #endregion
-
-        #region Instance Methods
-
-        /// <summary>
-        /// Used to restore settings to their prior
-        /// values before reverting to a prior context.
-        /// </summary>
-        public void ReverseChanges()
-        {
-            if (prior == null)
-                throw new InvalidOperationException("TestContext: too many Restores");
-
-            this.Tracing = prior.Tracing;
-            this.Out = prior.Out;
-            this.Error = prior.Error;
-            this.CurrentDirectory = prior.CurrentDirectory;
-            this.CurrentCulture = prior.CurrentCulture;
-            this.CurrentUICulture = prior.CurrentUICulture;
-            this.TestCaseTimeout = prior.TestCaseTimeout;
-            this.CurrentPrincipal = prior.CurrentPrincipal;
-        }
-
-        /// <summary>
-        /// Record any changed values in the current context
-        /// </summary>
-        public void Update()
-        {
-            this.currentDirectory = Environment.CurrentDirectory;
-            this.currentCulture = CultureInfo.CurrentCulture;
-            this.currentUICulture = CultureInfo.CurrentUICulture;
-            this.currentPrincipal = System.Threading.Thread.CurrentPrincipal;
-        }
-
-        #endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.IO;
+using System.Diagnostics;
+using System.Globalization;
+using System.Runtime.Remoting.Messaging;
+using System.Security.Principal;
+using System.Threading;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Helper class used to save and restore certain static or
+	/// singleton settings in the environment that affect tests 
+	/// or which might be changed by the user tests.
+	/// 
+	/// An internal class is used to hold settings and a stack
+	/// of these objects is pushed and popped as Save and Restore
+	/// are called.
+	/// 
+	/// Static methods for each setting forward to the internal 
+	/// object on the top of the stack.
+	/// </summary>
+	public class TestExecutionContext
+	{
+		#region Static Fields
+
+		/// <summary>
+		/// The current context, head of the list of saved contexts.
+		/// </summary>
+        private static TestExecutionContext current = new TestExecutionContext();
+
+        #endregion
+
+        #region Instance Fields
+
+        /// <summary>
+        /// Indicates whether trace is enabled
+        /// </summary>
+        private bool tracing;
+
+        /// <summary>
+        /// Indicates whether logging is enabled
+        /// </summary>
+        //private bool logging;
+
+        /// <summary>
+        /// Destination for standard output
+        /// </summary>
+        private TextWriter outWriter;
+
+        /// <summary>
+        /// Destination for standard error
+        /// </summary>
+        private TextWriter errorWriter;
+
+        /// <summary>
+        /// Destination for Trace output
+        /// </summary>
+        private TextWriter traceWriter;
+
+        /// <summary>
+        /// Default timeout for test cases
+        /// </summary>
+        private int testCaseTimeout;
+
+        private Log4NetCapture logCapture;
+
+        /// <summary>
+        /// The current working directory
+        /// </summary>
+        private string currentDirectory;
+
+        /// <summary>
+        /// The current culture
+        /// </summary>
+        private CultureInfo currentCulture;
+
+        /// <summary>
+        /// The current UI culture
+        /// </summary>
+        private CultureInfo currentUICulture;
+
+        /// <summary>
+        /// The current Principal.
+        /// </summary>
+        private IPrincipal currentPrincipal;
+
+        /// <summary>
+        /// The currently executing test
+        /// </summary>
+        private Test currentTest;
+
+        /// <summary>
+        /// The active TestResult for the current test
+        /// </summary>
+        private TestResult currentResult;
+
+        /// <summary>
+        /// The TestPackage being executed
+        /// </summary>
+        private TestPackage testPackage;
+
+        /// <summary>
+        /// Link to a prior saved context
+        /// </summary>
+        public TestExecutionContext prior;
+
+        /// <summary>
+        /// Context dictionary used to provide test access
+        /// to this TestExecutionContext
+        /// </summary>
+        private ContextDictionary contextDictionary;
+
+        #endregion
+
+        #region Constructors
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestExecutionContext"/> class.
+        /// </summary>
+        public TestExecutionContext()
+        {
+            this.prior = null;
+            this.tracing = false;
+            //this.logging = false;
+            this.outWriter = Console.Out;
+            this.errorWriter = Console.Error;
+            this.traceWriter = null;
+            this.logCapture = new Log4NetCapture();
+            this.testCaseTimeout = 0;
+
+            this.currentDirectory = Environment.CurrentDirectory;
+            this.currentCulture = CultureInfo.CurrentCulture;
+            this.currentUICulture = CultureInfo.CurrentUICulture;
+            this.currentPrincipal = Thread.CurrentPrincipal;
+
+            this.contextDictionary = new ContextDictionary(this);
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="TestExecutionContext"/> class.
+        /// </summary>
+        /// <param name="other">An existing instance of TestExecutionContext.</param>
+        public TestExecutionContext(TestExecutionContext other)
+        {
+            this.prior = other;
+            this.tracing = other.tracing;
+            //this.logging = other.logging;
+            this.outWriter = other.outWriter;
+            this.errorWriter = other.errorWriter;
+            this.traceWriter = other.traceWriter;
+            this.logCapture = other.logCapture;
+            this.testCaseTimeout = other.testCaseTimeout;
+
+            this.currentTest = other.currentTest;
+            this.currentResult = other.currentResult;
+            this.testPackage = other.testPackage;
+
+            this.currentDirectory = Environment.CurrentDirectory;
+            this.currentCulture = CultureInfo.CurrentCulture;
+            this.currentUICulture = CultureInfo.CurrentUICulture;
+            this.currentPrincipal = Thread.CurrentPrincipal;
+
+            this.contextDictionary = new ContextDictionary(this);
+        }
+
+        #endregion
+
+        #region Static Singleton Instance
+
+        /// <summary>
+        /// Gets the current context.
+        /// </summary>
+        /// <value>The current context.</value>
+        public static TestExecutionContext CurrentContext
+        {
+            get { return current; }
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Controls whether trace and debug output are written
+        /// to the standard output.
+        /// </summary>
+        public bool Tracing
+        {
+            get { return tracing; }
+            set
+            {
+                if (tracing != value)
+                {
+                    if (traceWriter != null && tracing)
+                        StopTracing();
+
+                    tracing = value;
+
+                    if (traceWriter != null && tracing)
+                        StartTracing();
+                }
+            }
+        }
+
+        /// <summary>
+        /// Controls where Console.Out is directed
+        /// </summary>
+        public TextWriter Out
+        {
+            get { return outWriter; }
+            set
+            {
+                if (outWriter != value)
+                {
+                    outWriter = value;
+                    Console.Out.Flush();
+                    Console.SetOut(outWriter);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Controls where Console.Error is directed
+        /// </summary>
+        public TextWriter Error
+        {
+            get { return errorWriter; }
+            set
+            {
+                if (errorWriter != value)
+                {
+                    errorWriter = value;
+                    Console.Error.Flush();
+                    Console.SetError(errorWriter);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Controls where Trace output is directed
+        /// </summary>
+        public TextWriter TraceWriter
+        {
+            get { return traceWriter; }
+            set
+            {
+                if (traceWriter != value)
+                {
+                    if (traceWriter != null && tracing)
+                        StopTracing();
+
+                    traceWriter = value;
+
+                    if (traceWriter != null && tracing)
+                        StartTracing();
+                }
+            }
+        }
+
+        /// <summary>
+        ///  Gets or sets the Log writer, which is actually held by a log4net 
+        ///  TextWriterAppender. When first set, the appender will be created
+        ///  and will thereafter send any log events to the writer.
+        ///  
+        ///  In normal operation, LogWriter is set to an EventListenerTextWriter
+        ///  connected to the EventQueue in the test domain. The events are
+        ///  subsequently captured in the Gui an the output displayed in
+        ///  the Log tab. The application under test does not need to define
+        ///  any additional appenders.
+        /// </summary>
+        public TextWriter LogWriter
+        {
+            get { return logCapture.Writer; }
+            set { logCapture.Writer = value; }
+        }
+
+        public LoggingThreshold LogLevel
+        {
+            get { return logCapture.Threshold; }
+            set { logCapture.Threshold = value; }
+        }
+
+        private void StopTracing()
+        {
+            traceWriter.Close();
+            System.Diagnostics.Trace.Listeners.Remove("NUnit");
+        }
+
+        private void StartTracing()
+        {
+            System.Diagnostics.Trace.Listeners.Add(new TextWriterTraceListener(traceWriter, "NUnit"));
+        }
+
+        /// <summary>
+        /// Saves and restores the CurrentDirectory
+        /// </summary>
+        public string CurrentDirectory
+        {
+            get { return currentDirectory; }
+            set
+            {
+                currentDirectory = value;
+                Environment.CurrentDirectory = currentDirectory;
+            }
+        }
+
+        /// <summary>
+        /// Saves or restores the CurrentCulture
+        /// </summary>
+        public CultureInfo CurrentCulture
+        {
+            get { return currentCulture; }
+            set
+            {
+                currentCulture = value;
+                Thread.CurrentThread.CurrentCulture = currentCulture;
+            }
+        }
+
+        /// <summary>
+        /// Saves or restores the CurrentUICulture
+        /// </summary>
+        public CultureInfo CurrentUICulture
+        {
+            get { return currentUICulture; }
+            set
+            {
+                currentUICulture = value;
+                Thread.CurrentThread.CurrentUICulture = currentUICulture;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the current <see cref="IPrincipal"/> for the Thread.
+        /// </summary>
+        public IPrincipal CurrentPrincipal
+        {
+            get { return this.currentPrincipal; }
+            set
+            {
+                this.currentPrincipal = value;
+                Thread.CurrentPrincipal = this.currentPrincipal;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the test case timeout value
+        /// </summary>
+        public int TestCaseTimeout
+        {
+            get { return testCaseTimeout; }
+            set { testCaseTimeout = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the current test
+        /// </summary>
+        public Test CurrentTest
+        {
+            get { return currentTest; }
+            set { currentTest = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the current test result
+        /// </summary>
+        public TestResult CurrentResult
+        {
+            get { return currentResult; }
+            set { currentResult = value; }
+        }
+
+        /// <summary>
+        /// Gets the test package currently being run
+        /// </summary>
+        public TestPackage TestPackage
+        {
+            get { return testPackage; }
+            set { testPackage = value; }
+        }
+
+        #endregion
+
+        #region Static Methods
+
+        /// <summary>
+        /// Saves the old context and makes a fresh one 
+        /// current without changing any settings.
+        /// </summary>
+        public static void Save()
+        {
+	        current = new TestExecutionContext(current);
+	        SaveInCallContext();
+        }
+
+		/// <summary>
+        /// Restores the last saved context and puts
+        /// any saved settings back into effect.
+        /// </summary>
+        public static void Restore()
+        {
+            current.ReverseChanges();
+            current = current.prior;
+            SaveInCallContext();
+        }
+
+        private static void SaveInCallContext()
+        {
+            CallContext.SetData("NUnit.Framework.TestContext", current.contextDictionary);
+        }
+
+		#endregion
+
+        #region Instance Methods
+
+        /// <summary>
+        /// Used to restore settings to their prior
+        /// values before reverting to a prior context.
+        /// </summary>
+        public void ReverseChanges()
+        {
+            if (prior == null)
+                throw new InvalidOperationException("TestContext: too many Restores");
+
+            this.Tracing = prior.Tracing;
+            this.Out = prior.Out;
+            this.Error = prior.Error;
+            this.CurrentDirectory = prior.CurrentDirectory;
+            this.CurrentCulture = prior.CurrentCulture;
+            this.CurrentUICulture = prior.CurrentUICulture;
+            this.TestCaseTimeout = prior.TestCaseTimeout;
+            this.CurrentPrincipal = prior.CurrentPrincipal;
+        }
+
+        /// <summary>
+        /// Record any changed values in the current context
+        /// </summary>
+        public void Update()
+        {
+            this.currentDirectory = Environment.CurrentDirectory;
+            this.currentCulture = CultureInfo.CurrentCulture;
+            this.currentUICulture = CultureInfo.CurrentUICulture;
+            this.currentPrincipal = System.Threading.Thread.CurrentPrincipal;
+        }
+
+        #endregion
+	}
+}
diff --git a/src/NUnitCore/core/TestFixture.cs b/src/NUnitCore/core/TestFixture.cs
index 219b072..a788a13 100644
--- a/src/NUnitCore/core/TestFixture.cs
+++ b/src/NUnitCore/core/TestFixture.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestFixture is a surrogate for a user test fixture class,
-	/// containing one or more tests.
-	/// </summary>
-	public class TestFixture : TestSuite
-	{
-		#region Constructors
-        public TestFixture(Type fixtureType)
-            : base(fixtureType) { }
-        public TestFixture(Type fixtureType, object[] arguments)
-            : base(fixtureType, arguments) { }
-        #endregion
-
-		#region TestSuite Overrides
-
-        /// <summary>
-        /// Gets a string representing the kind of test
-        /// that this object represents, for use in display.
-        /// </summary>
-        public override string TestType
-        {
-            get { return "TestFixture"; }
-        }
-
-        public override TestResult Run(EventListener listener, ITestFilter filter)
-        {
-            using ( new DirectorySwapper( AssemblyHelper.GetDirectoryName( FixtureType.Assembly ) ) )
-            {
-                return base.Run(listener, filter);
-            }
-        }
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestFixture is a surrogate for a user test fixture class,
+	/// containing one or more tests.
+	/// </summary>
+	public class TestFixture : TestSuite
+	{
+		#region Constructors
+        public TestFixture(Type fixtureType)
+            : base(fixtureType) { }
+        public TestFixture(Type fixtureType, object[] arguments)
+            : base(fixtureType, arguments) { }
+        #endregion
+
+		#region TestSuite Overrides
+
+        /// <summary>
+        /// Gets a string representing the kind of test
+        /// that this object represents, for use in display.
+        /// </summary>
+        public override string TestType
+        {
+            get { return "TestFixture"; }
+        }
+
+        public override TestResult Run(EventListener listener, ITestFilter filter)
+        {
+            using ( new DirectorySwapper( AssemblyHelper.GetDirectoryName( FixtureType.Assembly ) ) )
+            {
+                return base.Run(listener, filter);
+            }
+        }
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/TestFixtureBuilder.cs b/src/NUnitCore/core/TestFixtureBuilder.cs
index 2bf2428..98ffcc0 100644
--- a/src/NUnitCore/core/TestFixtureBuilder.cs
+++ b/src/NUnitCore/core/TestFixtureBuilder.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestFixtureBuilder contains static methods for building
-	/// TestFixtures from types. It uses builtin SuiteBuilders
-	/// and any installed extensions to do it.
-	/// </summary>
-	public class TestFixtureBuilder
-	{
-		public static bool CanBuildFrom( Type type )
-		{
-			return CoreExtensions.Host.SuiteBuilders.CanBuildFrom( type );
-		}
-
-		/// <summary>
-		/// Build a test fixture from a given type.
-		/// </summary>
-		/// <param name="type">The type to be used for the fixture</param>
-		/// <returns>A TestSuite if the fixture can be built, null if not</returns>
-		public static Test BuildFrom( Type type )
-		{
-			Test suite = CoreExtensions.Host.SuiteBuilders.BuildFrom( type );
-
-			if ( suite != null )
-				suite = CoreExtensions.Host.TestDecorators.Decorate( suite, type );
-
-			return suite;
-		}
-
-		/// <summary>
-		/// Build a fixture from an object. 
-		/// </summary>
-		/// <param name="fixture">The object to be used for the fixture</param>
-		/// <returns>A TestSuite if fixture type can be built, null if not</returns>
-		public static Test BuildFrom( object fixture )
-		{
-			Test suite = BuildFrom( fixture.GetType() );
-			
-			if( suite != null)
-			{
-				suite.Fixture = fixture;
-				
-				// TODO: Integrate building from an object as part of NUnitTestFixtureBuilder
-				if (suite.RunState == RunState.NotRunnable &&
-					Reflect.GetConstructor(fixture.GetType()) == null)
-				{
-					suite.RunState = RunState.Runnable;
-					suite.IgnoreReason = null;
-				}
-			}
-			
-			return suite;
-		}
-
-		/// <summary>
-		/// Private constructor to prevent instantiation
-		/// </summary>
-		private TestFixtureBuilder() { }
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestFixtureBuilder contains static methods for building
+	/// TestFixtures from types. It uses builtin SuiteBuilders
+	/// and any installed extensions to do it.
+	/// </summary>
+	public class TestFixtureBuilder
+	{
+		public static bool CanBuildFrom( Type type )
+		{
+			return CoreExtensions.Host.SuiteBuilders.CanBuildFrom( type );
+		}
+
+		/// <summary>
+		/// Build a test fixture from a given type.
+		/// </summary>
+		/// <param name="type">The type to be used for the fixture</param>
+		/// <returns>A TestSuite if the fixture can be built, null if not</returns>
+		public static Test BuildFrom( Type type )
+		{
+			Test suite = CoreExtensions.Host.SuiteBuilders.BuildFrom( type );
+
+			if ( suite != null )
+				suite = CoreExtensions.Host.TestDecorators.Decorate( suite, type );
+
+			return suite;
+		}
+
+		/// <summary>
+		/// Build a fixture from an object. 
+		/// </summary>
+		/// <param name="fixture">The object to be used for the fixture</param>
+		/// <returns>A TestSuite if fixture type can be built, null if not</returns>
+		public static Test BuildFrom( object fixture )
+		{
+			Test suite = BuildFrom( fixture.GetType() );
+			
+			if( suite != null)
+			{
+				suite.Fixture = fixture;
+				
+				// TODO: Integrate building from an object as part of NUnitTestFixtureBuilder
+				if (suite.RunState == RunState.NotRunnable &&
+					Reflect.GetConstructor(fixture.GetType()) == null)
+				{
+					suite.RunState = RunState.Runnable;
+					suite.IgnoreReason = null;
+				}
+			}
+			
+			return suite;
+		}
+
+		/// <summary>
+		/// Private constructor to prevent instantiation
+		/// </summary>
+		private TestFixtureBuilder() { }
+	}
+}
diff --git a/src/NUnitCore/core/TestMethod.cs b/src/NUnitCore/core/TestMethod.cs
index ace6866..b9c0f6a 100644
--- a/src/NUnitCore/core/TestMethod.cs
+++ b/src/NUnitCore/core/TestMethod.cs
@@ -1,514 +1,516 @@
-// ****************************************************************
-// 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.
-// ****************************************************************
-//#define DEFAULT_APPLIES_TO_TESTCASE
-
-namespace NUnit.Core
-{
-	using System;
-    using System.Collections;
-    using System.Runtime.Remoting.Messaging;
-    using System.Threading;
-	using System.Text;
-	using System.Text.RegularExpressions;
-	using System.Reflection;
-
-#if CLR_2_0 || CLR_4_0
-    using System.Collections.Generic;
-#endif
-
-	/// <summary>
-	/// The TestMethod class represents a Test implemented as a method.
-	/// 
-	/// Because of how exceptions are handled internally, this class
-	/// must incorporate processing of expected exceptions. A change to
-	/// the Test interface might make it easier to process exceptions
-	/// in an object that aggregates a TestMethod in the future.
-	/// </summary>
-	public abstract class TestMethod : Test
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(TestMethod));
-        
-        static ContextDictionary context;
-
-		#region Fields
-		/// <summary>
-		/// The test method
-		/// </summary>
-		internal MethodInfo method;
-
-		/// <summary>
-		/// The SetUp method.
-		/// </summary>
-		protected MethodInfo[] setUpMethods;
-
-		/// <summary>
-		/// The teardown method
-		/// </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>
-        internal ExpectedExceptionProcessor exceptionProcessor;
-
-        /// <summary>
-        /// Arguments to be used in invoking the method
-        /// </summary>
-	    internal object[] arguments;
-
-        /// <summary>
-        /// The expected result of the method return value
-        /// </summary>
-	    internal object expectedResult;
-
-        /// <summary>
-        /// Indicates whether expectedResult was set - thereby allowing null as a value
-        /// </summary>
-        internal bool hasExpectedResult;
-
-        /// <summary>
-        /// The fixture object, if it has been created
-        /// </summary>
-        private object fixture;
-
-        private Exception builderException;
-
-		#endregion
-
-		#region Constructors
-		public TestMethod( MethodInfo method ) 
-			: base( method.ReflectedType.FullName, method.Name ) 
-		{
-            if( method.DeclaringType != method.ReflectedType)
-                this.TestName.Name = method.DeclaringType.Name + "." + method.Name;
-
-            this.method = method;
-		}
-		#endregion
-
-        #region Static Properties
-	    private static ContextDictionary Context
-	    {
-	        get
-	        {
-	            if (context==null)
-	            {
-	                context = new ContextDictionary();
-	            }
-	            return context;
-	        }
-	    }
-        #endregion
-
-		#region Properties
-
-        public override string TestType
-        {
-            get { return "TestMethod"; }
-        }
-
-		public MethodInfo Method
-		{
-			get { return method; }
-		}
-
-        public override Type FixtureType
-        {
-            get { return method.ReflectedType; }
-        }
-
-        public ExpectedExceptionProcessor ExceptionProcessor
-        {
-            get { return exceptionProcessor; }
-            set { exceptionProcessor = value; }
-        }
-
-		public bool ExceptionExpected
-		{
-            get { return exceptionProcessor != null; }
-		}
-
-        public override object Fixture
-        {
-            get { return fixture; }
-            set { fixture = value; }
-        }
-
-        public int Timeout
-        {
-            get
-            {
-                return Properties.Contains("Timeout")
-                    ? (int)Properties["Timeout"]
-                    : TestExecutionContext.CurrentContext.TestCaseTimeout;
-            }
-        }
-		
-		protected override bool ShouldRunOnOwnThread 
-		{
-			get 
-			{
-                return base.ShouldRunOnOwnThread || Timeout > 0;
-			}
-		}
-
-        public Exception BuilderException
-        {
-            get { return builderException; }
-            set { builderException = value; }
-        }
-        #endregion
-
-		#region Run Methods
-        public override TestResult Run(EventListener listener, ITestFilter filter)
-        {
-            log.Debug("Test Starting: " + this.TestName.FullName);
-            listener.TestStarted(this.TestName);
-            long startTime = DateTime.Now.Ticks;
-
-            TestResult testResult = this.RunState == RunState.Runnable || this.RunState == RunState.Explicit
-				? RunTestInContext() : SkipTest();
-
-			log.Debug("Test result = " + testResult.ResultState);
-
-            long stopTime = DateTime.Now.Ticks;
-            double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
-            testResult.Time = time;
-
-            listener.TestFinished(testResult);
-            return testResult;
-        }
-		      
-		private TestResult SkipTest()
-		{
-			TestResult testResult = new TestResult(this);
-			
-            switch (this.RunState)
-            {
-                case RunState.Skipped:
-                default:
-                    testResult.Skip(IgnoreReason);
-                    break;
-                case RunState.NotRunnable:
-                    if (BuilderException != null)
-                        testResult.Invalid(BuilderException);
-                    else
-                        testResult.Invalid(IgnoreReason);
-                    break;
-                case RunState.Ignored:
-                    testResult.Ignore(IgnoreReason);
-                    break;
-            }
-			
-			return testResult;
-		}
-		
-        private TestResult RunTestInContext()
-		{
-			TestExecutionContext.Save();
-
-            TestExecutionContext.CurrentContext.CurrentTest = this;
-
-            ContextDictionary context = Context;
-            context._ec = TestExecutionContext.CurrentContext;
-
-            CallContext.SetData("NUnit.Framework.TestContext", context);
-
-            if (this.Parent != null)
-            {
-                this.Fixture = this.Parent.Fixture;
-                TestSuite suite = this.Parent as TestSuite;
-                if (suite != null)
-                {
-                    this.setUpMethods = suite.GetSetUpMethods();
-                    this.tearDownMethods = suite.GetTearDownMethods();
-#if CLR_2_0 || CLR_4_0
-                    this.suiteActions = suite.GetTestActions();
-#endif
-                }
-            }
-
-            try
-            {
-#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);
-
-                if (this.Properties["_SETCULTURE"] != null)
-                    TestExecutionContext.CurrentContext.CurrentCulture =
-                        new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
-
-                if (this.Properties["_SETUICULTURE"] != null)
-                    TestExecutionContext.CurrentContext.CurrentUICulture =
-                        new System.Globalization.CultureInfo((string)Properties["_SETUICULTURE"]);
-
-				return RunRepeatedTest();
-            }
-            catch (Exception ex)
-            {
-				log.Debug("TestMethod: Caught " + ex.GetType().Name);
-				
-                if (ex is ThreadAbortException)
-                    Thread.ResetAbort();
-
-				TestResult testResult = new TestResult(this);
-                RecordException(ex, testResult, FailureSite.Test);
-				
-				return testResult;
-            }
-            finally
-            {
-                Fixture = null;
-
-                TestExecutionContext.Restore();
-            }
-		}
-		
-		// TODO: Repeated tests need to be implemented as separate tests
-		// in the tree of tests. Once that is done, this method will no
-		// longer be needed and RunTest can be called directly.
-		private TestResult RunRepeatedTest()
-		{
-			TestResult testResult = null;
-			
-			int repeatCount = this.Properties.Contains("Repeat")
-				? (int)this.Properties["Repeat"] : 1;
-			
-            while (repeatCount-- > 0)
-            {
-                testResult = ShouldRunOnOwnThread
-                    ? new TestMethodThread(this).Run(NullListener.NULL, TestFilter.Empty)
-                    : RunTest();
-
-                if (testResult.ResultState == ResultState.Failure ||
-                    testResult.ResultState == ResultState.Error ||
-                    testResult.ResultState == ResultState.Cancelled)
-                {
-                    break;
-                }
-            }
-			
-			return testResult;
-		}
-
-		/// <summary>
-		/// The doRun method is used to run a test internally.
-		/// It assumes that the caller is taking care of any 
-		/// TestFixtureSetUp and TestFixtureTearDown needed.
-		/// </summary>
-		/// <param name="testResult">The result in which to record success or failure</param>
-		public virtual TestResult RunTest()
-		{
-			DateTime start = DateTime.Now;
-
-			TestResult testResult = new TestResult(this);
-			TestExecutionContext.CurrentContext.CurrentResult =  testResult;
-			
-			try
-			{
-                RunSetUp();
-#if CLR_2_0 || CLR_4_0
-			    RunBeforeActions(testResult);
-#endif
-
-				RunTestCase( testResult );
-			}
-			catch(Exception ex)
-			{
-                // doTestCase handles its own exceptions so
-                // if we're here it's a setup exception
-                if (ex is ThreadAbortException)
-                    Thread.ResetAbort();
-
-                RecordException(ex, testResult, FailureSite.SetUp);
-			}
-			finally 
-			{
-#if CLR_2_0 || CLR_4_0
-                RunAfterActions(testResult);
-#endif
-				RunTearDown( testResult );
-
-				DateTime stop = DateTime.Now;
-				TimeSpan span = stop.Subtract(start);
-				testResult.Time = (double)span.Ticks / (double)TimeSpan.TicksPerSecond;
-
-                if (testResult.IsSuccess)
-				{
-					if (this.Properties.Contains("MaxTime"))
-                	{
-                    int elapsedTime = (int)Math.Round(testResult.Time * 1000.0);
-                    int maxTime = (int)this.Properties["MaxTime"];
-
-                    if (maxTime > 0 && elapsedTime > maxTime)
-                        testResult.Failure(
-                            string.Format("Elapsed time of {0}ms exceeds maximum of {1}ms",
-                                elapsedTime, maxTime),
-                            null);
-					}
-					
-					if (testResult.IsSuccess && testResult.Message == null && 
-					    Environment.CurrentDirectory != TestExecutionContext.CurrentContext.prior.CurrentDirectory)
-					{
-						// TODO: Introduce a warning result state in NUnit 3.0
-						testResult.SetResult(ResultState.Success, "Warning: Test changed the CurrentDirectory", null);
-					}
-				}
-			}
-			
-			log.Debug("Test result = " + testResult.ResultState);
-				
-			return testResult;
-		}
-		#endregion
-
-		#region Invoke Methods by Reflection, Recording Errors
-
-#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 )
-                    Reflect.InvokeMethod(setUpMethod, setUpMethod.IsStatic ? null : this.Fixture);
-        }
-
-		private void RunTearDown( TestResult testResult )
-		{
-			try
-			{
-                if (tearDownMethods != null)
-                {
-                    int index = tearDownMethods.Length;
-                    while (--index >= 0)
-                        Reflect.InvokeMethod(tearDownMethods[index], tearDownMethods[index].IsStatic ? null : this.Fixture);
-                }
-			}
-			catch(Exception ex)
-			{
-				if ( ex is NUnitException )
-					ex = ex.InnerException;
-
-                RecordException(ex, testResult, FailureSite.TearDown);
-			}
-		}
-
-		private void RunTestCase( TestResult testResult )
-		{
-            try
-            {
-                RunTestMethod(testResult);
-                if (testResult.IsSuccess && exceptionProcessor != null)
-                    exceptionProcessor.ProcessNoException(testResult);
-            }
-            catch (Exception ex)
-            {
-                if (ex is ThreadAbortException)
-                    Thread.ResetAbort();
-
-                if (exceptionProcessor == null)
-                    RecordException(ex, testResult, FailureSite.Test);
-                else
-                    exceptionProcessor.ProcessException(ex, testResult);
-            }
-		}
-
-		private void RunTestMethod(TestResult testResult)
-		{
-		    object fixture = this.method.IsStatic ? null : this.Fixture;
-
-			object result = Reflect.InvokeMethod( this.method, fixture, this.arguments );
-
-            if (this.hasExpectedResult)
-                NUnitFramework.Assert.AreEqual(expectedResult, result);
-
-            testResult.Success();
-        }
-
-		#endregion
-
-		#region Record Info About An Exception
-		protected virtual void RecordException( Exception exception, TestResult testResult, FailureSite failureSite )
-		{
-            if (exception is NUnitException)
-                exception = exception.InnerException;
-
-            // 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
-    }
-}
+// ****************************************************************
+// 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.
+// ****************************************************************
+//#define DEFAULT_APPLIES_TO_TESTCASE
+
+using System.Diagnostics;
+
+namespace NUnit.Core
+{
+	using System;
+    using System.Collections;
+    using System.Runtime.Remoting.Messaging;
+    using System.Threading;
+	using System.Text;
+	using System.Text.RegularExpressions;
+	using System.Reflection;
+
+#if CLR_2_0 || CLR_4_0
+    using System.Collections.Generic;
+#endif
+
+	/// <summary>
+	/// The TestMethod class represents a Test implemented as a method.
+	/// 
+	/// Because of how exceptions are handled internally, this class
+	/// must incorporate processing of expected exceptions. A change to
+	/// the Test interface might make it easier to process exceptions
+	/// in an object that aggregates a TestMethod in the future.
+	/// </summary>
+	public abstract class TestMethod : Test
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(TestMethod));
+        
+		#region Fields
+		/// <summary>
+		/// The test method
+		/// </summary>
+		internal MethodInfo method;
+
+		/// <summary>
+		/// The SetUp method.
+		/// </summary>
+		protected MethodInfo[] setUpMethods;
+
+		/// <summary>
+		/// The teardown method
+		/// </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>
+        internal ExpectedExceptionProcessor exceptionProcessor;
+
+        /// <summary>
+        /// Arguments to be used in invoking the method
+        /// </summary>
+	    internal object[] arguments;
+
+        /// <summary>
+        /// The expected result of the method return value
+        /// </summary>
+	    internal object expectedResult;
+
+        /// <summary>
+        /// Indicates whether expectedResult was set - thereby allowing null as a value
+        /// </summary>
+        internal bool hasExpectedResult;
+
+        /// <summary>
+        /// The fixture object, if it has been created
+        /// </summary>
+        private object fixture;
+
+        private Exception builderException;
+
+		#endregion
+
+		#region Constructors
+		public TestMethod( MethodInfo method ) 
+			: base( method.ReflectedType.FullName, method.Name ) 
+		{
+            if( method.DeclaringType != method.ReflectedType)
+                this.TestName.Name = method.DeclaringType.Name + "." + method.Name;
+
+            this.method = method;
+		}
+		#endregion
+
+		#region Properties
+
+        public override string TestType
+        {
+            get { return "TestMethod"; }
+        }
+
+		public MethodInfo Method
+		{
+			get { return method; }
+		}
+
+        public override Type FixtureType
+        {
+            get { return method.ReflectedType; }
+        }
+
+        public override string MethodName
+        {
+            get { return method.Name; }
+        }
+
+        public ExpectedExceptionProcessor ExceptionProcessor
+        {
+            get { return exceptionProcessor; }
+            set { exceptionProcessor = value; }
+        }
+
+		public bool ExceptionExpected
+		{
+            get { return exceptionProcessor != null; }
+		}
+
+        public override object Fixture
+        {
+            get { return fixture; }
+            set { fixture = value; }
+        }
+
+        public int Timeout
+        {
+            get
+            {
+                return Properties.Contains("Timeout")
+                    ? (int)Properties["Timeout"]
+                    : TestExecutionContext.CurrentContext.TestCaseTimeout;
+            }
+        }
+		
+		protected override bool ShouldRunOnOwnThread 
+		{
+			get 
+			{
+                return base.ShouldRunOnOwnThread || Timeout > 0;
+			}
+		}
+
+        public Exception BuilderException
+        {
+            get { return builderException; }
+            set { builderException = value; }
+        }
+        #endregion
+
+		#region Run Methods
+        public override TestResult Run(EventListener listener, ITestFilter filter)
+        {
+            log.Debug("Test Starting: " + this.TestName.FullName);
+            listener.TestStarted(this.TestName);
+#if CLR_2_0 || CLR_4_0
+            long startTime = Stopwatch.GetTimestamp();
+#else
+            long startTime = DateTime.Now.Ticks;
+#endif
+
+            TestResult testResult = this.RunState == RunState.Runnable || this.RunState == RunState.Explicit
+				? RunTestInContext() : SkipTest();
+
+			log.Debug("Test result = " + testResult.ResultState);
+
+#if CLR_2_0 || CLR_4_0
+            long stopTime = Stopwatch.GetTimestamp();
+            double time = ((double)(stopTime - startTime)) / (double)Stopwatch.Frequency;
+#else
+            long stopTime = DateTime.Now.Ticks;
+            double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
+#endif
+            testResult.Time = time;
+
+            listener.TestFinished(testResult);
+            return testResult;
+        }
+		      
+		private TestResult SkipTest()
+		{
+			TestResult testResult = new TestResult(this);
+			
+            switch (this.RunState)
+            {
+                case RunState.Skipped:
+                default:
+                    testResult.Skip(IgnoreReason);
+                    break;
+                case RunState.NotRunnable:
+                    if (BuilderException != null)
+                        testResult.Invalid(BuilderException);
+                    else
+                        testResult.Invalid(IgnoreReason);
+                    break;
+                case RunState.Ignored:
+                    testResult.Ignore(IgnoreReason);
+                    break;
+            }
+			
+			return testResult;
+		}
+		
+        private TestResult RunTestInContext()
+		{
+			TestExecutionContext.Save();
+
+            TestExecutionContext.CurrentContext.CurrentTest = this;
+
+            if (this.Parent != null)
+            {
+                this.Fixture = this.Parent.Fixture;
+                TestSuite suite = this.Parent as TestSuite;
+                if (suite != null)
+                {
+                    this.setUpMethods = suite.GetSetUpMethods();
+                    this.tearDownMethods = suite.GetTearDownMethods();
+#if CLR_2_0 || CLR_4_0
+                    this.suiteActions = suite.GetTestActions();
+#endif
+                }
+            }
+
+            try
+            {
+#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);
+
+                if (this.Properties["_SETCULTURE"] != null)
+                    TestExecutionContext.CurrentContext.CurrentCulture =
+                        new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
+                else if (this.Properties["SetCulture"] != null) // In case we are running NUnitLite tests
+                    TestExecutionContext.CurrentContext.CurrentCulture =
+                        new System.Globalization.CultureInfo((string)Properties["SetCulture"]);
+
+                if (this.Properties["_SETUICULTURE"] != null)
+                    TestExecutionContext.CurrentContext.CurrentUICulture =
+                        new System.Globalization.CultureInfo((string)Properties["_SETUICULTURE"]);
+                if (this.Properties["SetUICulture"] != null) // In case we are running NUnitLite tests
+                    TestExecutionContext.CurrentContext.CurrentUICulture =
+                        new System.Globalization.CultureInfo((string)Properties["SetUICulture"]);
+
+				return RunRepeatedTest();
+            }
+            catch (Exception ex)
+            {
+				log.Debug("TestMethod: Caught " + ex.GetType().Name);
+				
+                if (ex is ThreadAbortException)
+                    Thread.ResetAbort();
+
+				TestResult testResult = new TestResult(this);
+                RecordException(ex, testResult, FailureSite.Test);
+				
+				return testResult;
+            }
+            finally
+            {
+                Fixture = null;
+
+                TestExecutionContext.Restore();
+            }
+		}
+		
+		// TODO: Repeated tests need to be implemented as separate tests
+		// in the tree of tests. Once that is done, this method will no
+		// longer be needed and RunTest can be called directly.
+		private TestResult RunRepeatedTest()
+		{
+			TestResult testResult = null;
+			
+			int repeatCount = this.Properties.Contains("Repeat")
+				? (int)this.Properties["Repeat"] : 1;
+			
+            while (repeatCount-- > 0)
+            {
+                testResult = ShouldRunOnOwnThread
+                    ? new TestMethodThread(this).Run(NullListener.NULL, TestFilter.Empty)
+                    : RunTest();
+
+                if (testResult.ResultState == ResultState.Failure ||
+                    testResult.ResultState == ResultState.Error ||
+                    testResult.ResultState == ResultState.Cancelled)
+                {
+                    break;
+                }
+            }
+			
+			return testResult;
+		}
+
+		/// <summary>
+		/// The doRun method is used to run a test internally.
+		/// It assumes that the caller is taking care of any 
+		/// TestFixtureSetUp and TestFixtureTearDown needed.
+		/// </summary>
+		/// <param name="testResult">The result in which to record success or failure</param>
+		public virtual TestResult RunTest()
+		{
+			DateTime start = DateTime.Now;
+
+			TestResult testResult = new TestResult(this);
+			TestExecutionContext.CurrentContext.CurrentResult =  testResult;
+			
+			try
+			{
+                RunSetUp();
+#if CLR_2_0 || CLR_4_0
+			    RunBeforeActions(testResult);
+#endif
+
+				RunTestCase( testResult );
+			}
+			catch(Exception ex)
+			{
+                // doTestCase handles its own exceptions so
+                // if we're here it's a setup exception
+                if (ex is ThreadAbortException)
+                    Thread.ResetAbort();
+
+                RecordException(ex, testResult, FailureSite.SetUp);
+			}
+			finally 
+			{
+#if CLR_2_0 || CLR_4_0
+                RunAfterActions(testResult);
+#endif
+				RunTearDown( testResult );
+
+				DateTime stop = DateTime.Now;
+				TimeSpan span = stop.Subtract(start);
+				testResult.Time = (double)span.Ticks / (double)TimeSpan.TicksPerSecond;
+
+                if (testResult.IsSuccess)
+				{
+					if (this.Properties.Contains("MaxTime"))
+                	{
+                    int elapsedTime = (int)Math.Round(testResult.Time * 1000.0);
+                    int maxTime = (int)this.Properties["MaxTime"];
+
+                    if (maxTime > 0 && elapsedTime > maxTime)
+                        testResult.Failure(
+                            string.Format("Elapsed time of {0}ms exceeds maximum of {1}ms",
+                                elapsedTime, maxTime),
+                            null);
+					}
+					
+					if (testResult.IsSuccess && testResult.Message == null && 
+					    Environment.CurrentDirectory != TestExecutionContext.CurrentContext.prior.CurrentDirectory)
+					{
+						// TODO: Introduce a warning result state in NUnit 3.0
+						testResult.SetResult(ResultState.Success, "Warning: Test changed the CurrentDirectory", null);
+					}
+				}
+			}
+			
+			log.Debug("Test result = " + testResult.ResultState);
+				
+			return testResult;
+		}
+		#endregion
+
+		#region Invoke Methods by Reflection, Recording Errors
+
+#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 )
+                    Reflect.InvokeMethod(setUpMethod, setUpMethod.IsStatic ? null : this.Fixture);
+        }
+
+		private void RunTearDown( TestResult testResult )
+		{
+			try
+			{
+                if (tearDownMethods != null)
+                {
+                    int index = tearDownMethods.Length;
+                    while (--index >= 0)
+                        Reflect.InvokeMethod(tearDownMethods[index], tearDownMethods[index].IsStatic ? null : this.Fixture);
+                }
+			}
+			catch(Exception ex)
+			{
+				if ( ex is NUnitException )
+					ex = ex.InnerException;
+
+                RecordException(ex, testResult, FailureSite.TearDown);
+			}
+		}
+
+		private void RunTestCase( TestResult testResult )
+		{
+            try
+            {
+                object result = RunTestMethod();
+
+                if (this.hasExpectedResult)
+                    NUnitFramework.Assert.AreEqual(expectedResult, result);
+
+                testResult.Success();
+
+                if (testResult.IsSuccess && exceptionProcessor != null)
+                    exceptionProcessor.ProcessNoException(testResult);
+            }
+            catch (Exception ex)
+            {
+                if (ex is ThreadAbortException)
+                    Thread.ResetAbort();
+
+                if (exceptionProcessor == null)
+                    RecordException(ex, testResult, FailureSite.Test);
+                else
+                    exceptionProcessor.ProcessException(ex, testResult);
+            }
+		}
+
+	    protected virtual object RunTestMethod()
+		{
+            object fixture = this.method.IsStatic ? null : this.Fixture;
+            
+            return Reflect.InvokeMethod(this.method, fixture, this.arguments);
+        }
+
+	    #endregion
+
+		#region Record Info About An Exception
+		protected virtual void RecordException( Exception exception, TestResult testResult, FailureSite failureSite )
+		{
+            if (exception is NUnitException)
+                exception = exception.InnerException;
+
+            // 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
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitCore/core/TestRunnerThread.cs b/src/NUnitCore/core/TestRunnerThread.cs
index c36de79..ec2ede2 100644
--- a/src/NUnitCore/core/TestRunnerThread.cs
+++ b/src/NUnitCore/core/TestRunnerThread.cs
@@ -1,142 +1,142 @@
-// ****************************************************************
-// 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.Threading;
-using System.Configuration;
-using System.Collections.Specialized;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestRunnerThread encapsulates running a test on a thread.
-	/// It knows how to create the thread based on configuration
-	/// settings and can cancel abort the test if necessary.
-	/// </summary>
-	public class TestRunnerThread
-	{
-		#region Private Fields
-
-		/// <summary>
-		/// The Test runner to be used in running tests on the thread
-		/// </summary>
-		private TestRunner runner;
-
-		/// <summary>
-		/// The System.Threading.Thread created by the object
-		/// </summary>
-		private Thread thread;
-
-		/// <summary>
-		/// The EventListener interface to receive test events
-		/// </summary>
-		private NUnit.Core.EventListener listener;
-
-		/// <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
-		/// </summary>
-		private TestResult[] results;
-
-		#endregion
-
-		#region Properties
-
-		/// <summary>
-		/// True if the thread is executing
-		/// </summary>
-		public bool IsAlive
-		{
-			get	{ return this.thread.IsAlive; }
-		}
-
-		/// <summary>
-		/// Array of returned results
-		/// </summary>
-		public TestResult[] Results
-		{
-			get { return results; }
-		}
-
-		#endregion
-
-		#region Constructor
-
-		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 = priority;
-            if (apartmentState != ApartmentState.Unknown)
-#if CLR_2_0 || CLR_4_0
-                thread.SetApartmentState(apartmentState);
-#else
-                thread.ApartmentState = apartmentState;
-#endif
-		}
-
-		#endregion
-
-		#region Public Methods
-
-		public void Wait()
-		{
-			if ( this.thread.IsAlive )
-				this.thread.Join();
-		}
-
-		public void Cancel()
-		{
-            ThreadUtility.Kill(this.thread);
-		}
-
-        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();
-        }
-
-		#endregion
-
-		#region Thread Proc
-		/// <summary>
-		/// The thread proc for our actual test run
-		/// </summary>
-		private void TestRunnerThreadProc()
-		{
-            try
-            {
-                results = new TestResult[] { runner.Run(this.listener, this.filter, this.tracing, this.logLevel) };
-            }
-            catch (Exception ex)
-            {
-                if ( !(ex is ThreadAbortException) )
-                    throw new ApplicationException("Exception in TestRunnerThread", ex);
-            }
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.Threading;
+using System.Configuration;
+using System.Collections.Specialized;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestRunnerThread encapsulates running a test on a thread.
+	/// It knows how to create the thread based on configuration
+	/// settings and can cancel abort the test if necessary.
+	/// </summary>
+	public class TestRunnerThread
+	{
+		#region Private Fields
+
+		/// <summary>
+		/// The Test runner to be used in running tests on the thread
+		/// </summary>
+		private TestRunner runner;
+
+		/// <summary>
+		/// The System.Threading.Thread created by the object
+		/// </summary>
+		private Thread thread;
+
+		/// <summary>
+		/// The EventListener interface to receive test events
+		/// </summary>
+		private NUnit.Core.EventListener listener;
+
+		/// <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
+		/// </summary>
+		private TestResult[] results;
+
+		#endregion
+
+		#region Properties
+
+		/// <summary>
+		/// True if the thread is executing
+		/// </summary>
+		public bool IsAlive
+		{
+			get	{ return this.thread.IsAlive; }
+		}
+
+		/// <summary>
+		/// Array of returned results
+		/// </summary>
+		public TestResult[] Results
+		{
+			get { return results; }
+		}
+
+		#endregion
+
+		#region Constructor
+
+		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 = priority;
+            if (apartmentState != ApartmentState.Unknown)
+#if CLR_2_0 || CLR_4_0
+                thread.SetApartmentState(apartmentState);
+#else
+                thread.ApartmentState = apartmentState;
+#endif
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public void Wait()
+		{
+			if ( this.thread.IsAlive )
+				this.thread.Join();
+		}
+
+		public void Cancel()
+		{
+            ThreadUtility.Kill(this.thread);
+		}
+
+        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();
+        }
+
+		#endregion
+
+		#region Thread Proc
+		/// <summary>
+		/// The thread proc for our actual test run
+		/// </summary>
+		private void TestRunnerThreadProc()
+		{
+            try
+            {
+                results = new TestResult[] { runner.Run(this.listener, this.filter, this.tracing, this.logLevel) };
+            }
+            catch (Exception ex)
+            {
+                if ( !(ex is ThreadAbortException) )
+                    throw new ApplicationException("Exception in TestRunnerThread", ex);
+            }
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/TestSuite.cs b/src/NUnitCore/core/TestSuite.cs
index 5835719..c5c6cd4 100644
--- a/src/NUnitCore/core/TestSuite.cs
+++ b/src/NUnitCore/core/TestSuite.cs
@@ -1,648 +1,667 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-
-namespace NUnit.Core
-{
-	using System;
-    using System.Text;
-    using System.Threading;
-	using System.Collections;
-	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>
-	/// 
-	[Serializable]
-	public class TestSuite : Test
-	{
-		#region Fields
-        static Logger log = InternalTrace.GetLogger(typeof(TestSuite));
-
-		/// <summary>
-		/// Our collection of child tests
-		/// </summary>
-		private ArrayList tests = new ArrayList();
-
-        /// <summary>
-        /// The fixture setup methods for this suite
-        /// </summary>
-        protected MethodInfo[] fixtureSetUpMethods;
-
-        /// <summary>
-        /// The fixture teardown methods for this suite
-        /// </summary>
-        protected MethodInfo[] fixtureTearDownMethods;
-
-        /// <summary>
-        /// The setup methods for this suite
-        /// </summary>
-        protected MethodInfo[] setUpMethods;
-
-        /// <summary>
-        /// The teardown methods for this suite
-        /// </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>
-        protected bool maintainTestOrder;
-
-        /// <summary>
-        /// Arguments for use in creating a parameterized fixture
-        /// </summary>
-        internal object[] arguments;
-
-        /// <summary>
-        /// The System.Type of the fixture for this test suite, if there is one
-        /// </summary>
-        private Type fixtureType;
-
-        /// <summary>
-        /// The fixture object, if it has been created
-        /// </summary>
-        private object fixture;
-
-        #endregion
-
-		#region Constructors
-		public TestSuite( string name ) 
-			: base( name ) { }
-
-		public TestSuite( string parentSuiteName, string name ) 
-			: base( parentSuiteName, name ) { }
-
-        public TestSuite(Type fixtureType)
-            : this(fixtureType, null) { }
-
-        public TestSuite(Type fixtureType, object[] arguments)
-            : base(fixtureType.FullName)
-        {
-            string name = TypeHelper.GetDisplayName(fixtureType, arguments);
-            this.TestName.Name = name;
-            
-            this.TestName.FullName = name;
-            string nspace = fixtureType.Namespace;
-            if (nspace != null && nspace != "")
-                this.TestName.FullName = nspace + "." + name;
-            this.fixtureType = fixtureType;
-            this.arguments = arguments;
-        }
-        #endregion
-
-		#region Public Methods
-		public void Sort()
-		{
-            if (!maintainTestOrder)
-            {
-                this.tests.Sort();
-
-                foreach (Test test in Tests)
-                {
-                    TestSuite suite = test as TestSuite;
-                    if (suite != null)
-                        suite.Sort();
-                }
-            }
-		}
-
-		public void Sort(IComparer comparer)
-		{
-			this.tests.Sort(comparer);
-
-			foreach( Test test in Tests )
-			{
-				TestSuite suite = test as TestSuite;
-				if ( suite != null )
-					suite.Sort(comparer);
-			}
-		}
-
-		public void Add( Test test ) 
-		{
-//			if( test.RunState == RunState.Runnable )
-//			{
-//				test.RunState = this.RunState;
-//				test.IgnoreReason = this.IgnoreReason;
-//			}
-			test.Parent = this;
-			tests.Add(test);
-		}
-
-		public void Add( object fixture )
-		{
-			Test test = TestFixtureBuilder.BuildFrom( fixture );
-			if ( test != null )
-				Add( test );
-		}
-		#endregion
-
-		#region Properties
-		public override IList Tests 
-		{
-			get { return tests; }
-		}
-
-		public override bool IsSuite
-		{
-			get { return true; }
-		}
-
-		public override int TestCount
-		{
-			get
-			{
-				int count = 0;
-
-				foreach(Test test in Tests)
-				{
-					count += test.TestCount;
-				}
-				return count;
-			}
-		}
-
-        public override Type FixtureType
-        {
-            get { return fixtureType; }
-        }
-
-        public override object Fixture
-        {
-            get { return fixture; }
-            set { fixture = value; }
-        }
-
-        public MethodInfo[] GetSetUpMethods()
-        {
-            return setUpMethods;
-        }
-
-        public MethodInfo[] GetTearDownMethods()
-        {
-            return tearDownMethods;
-        }
-
-#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
-
-        public override string TestType
-        {
-            get { return "TestSuite"; }
-        }
-
-		public override int CountTestCases(ITestFilter filter)
-		{
-			int count = 0;
-
-			if(filter.Pass(this)) 
-			{
-				foreach(Test test in Tests)
-				{
-					count += test.CountTestCases(filter);
-				}
-			}
-			return count;
-		}
-
-		public override TestResult Run(EventListener listener, ITestFilter filter)
-		{
-            listener.SuiteStarted(this.TestName);
-            long startTime = DateTime.Now.Ticks;
-
-			TestResult suiteResult = this.RunState == RunState.Runnable || this.RunState == RunState.Explicit
-				? RunSuiteInContext(listener, filter)
-				: SkipSuite(listener, filter);
-			
-            long stopTime = DateTime.Now.Ticks;
-            double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
-            suiteResult.Time = time;
-
-            listener.SuiteFinished(suiteResult);
-            return suiteResult;
-		}
-		
-		private TestResult SkipSuite(EventListener listener, ITestFilter filter)
-		{
-			TestResult suiteResult = new TestResult(this);
-			
-            switch (this.RunState)
-            {
-                default:
-                case RunState.Skipped:
-                    SkipAllTests(suiteResult, listener, filter);
-                    break;
-                case RunState.NotRunnable:
-                    MarkAllTestsInvalid(suiteResult, listener, filter);
-                    break;
-                case RunState.Ignored:
-                    IgnoreAllTests(suiteResult, listener, filter);
-                    break;
-            }
-
-			return suiteResult;
-		}
-
-		private TestResult RunSuiteInContext(EventListener listener, ITestFilter filter)
-		{
-            TestExecutionContext.Save();
-
-            try
-            {
-				return ShouldRunOnOwnThread
-	                ? new TestSuiteThread(this).Run(listener, filter)
-	                : RunSuite(listener, filter);
-            }
-            finally
-            {
-                TestExecutionContext.Restore();
-            }
-		}
-
-        public TestResult RunSuite(EventListener listener, ITestFilter filter)
-        {
-			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 =
-                    new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
-
-            if (this.Properties["_SETUICULTURE"] != null)
-                TestExecutionContext.CurrentContext.CurrentUICulture =
-                    new System.Globalization.CultureInfo((string)Properties["_SETUICULTURE"]);
-
-            switch (suiteResult.ResultState)
-            {
-                case ResultState.Failure:
-                case ResultState.Error:
-                    MarkTestsFailed(Tests, suiteResult, listener, filter);
-                    break;
-                case ResultState.NotRunnable:
-                    MarkTestsNotRun(this.Tests, ResultState.NotRunnable, suiteResult.Message, suiteResult, listener, filter);
-                    break;
-                default:
-                    try
-                    {
-                        RunAllTests(suiteResult, listener, filter);
-                    }
-                    finally
-                    {
-#if CLR_2_0 || CLR_4_0
-                        DoOneTimeAfterTestSuiteActions(suiteResult);
-#endif
-                        DoOneTimeTearDown(suiteResult);
-                    }
-                    break;
-            }
-			
-			return suiteResult;
-        }
-		#endregion
-
-		#region Virtual Methods
-        protected virtual void DoOneTimeSetUp(TestResult suiteResult)
-        {
-            if (FixtureType != null)
-            {
-                try
-                {
-					// In case TestFixture was created with fixture object
-					if (Fixture == null && !IsStaticClass( FixtureType ) )
-						CreateUserFixture();
-
-                    if (this.fixtureSetUpMethods != null)
-                        foreach( MethodInfo fixtureSetUp in fixtureSetUpMethods )
-                            Reflect.InvokeMethod(fixtureSetUp, fixtureSetUp.IsStatic ? null : Fixture);
-
-                    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);
-                }
-            }
-        }
-
-#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)
-                Fixture = Reflect.Construct(FixtureType, arguments);
-            else
-			    Fixture = Reflect.Construct(FixtureType);
-		}
-
-        protected virtual void DoOneTimeTearDown(TestResult suiteResult)
-        {
-            if ( this.FixtureType != null)
-            {
-                try
-                {
-                    if (this.fixtureTearDownMethods != null)
-                    {
-                        int index = fixtureTearDownMethods.Length;
-                        while (--index >= 0 )
-                        {
-                            MethodInfo fixtureTearDown = fixtureTearDownMethods[index];
-                            Reflect.InvokeMethod(fixtureTearDown, fixtureTearDown.IsStatic ? null : Fixture);
-                        }
-                    }
-
-					IDisposable disposable = Fixture as IDisposable;
-					if (disposable != null)
-						disposable.Dispose();
-				}
-                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);
-				}
-
-                this.Fixture = null;
-            }
-        }
-
-#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;
-        }
-
-        protected virtual bool IsIgnoreException(Exception ex)
-        {
-            return ex.GetType().FullName == NUnitFramework.IgnoreException;
-        }
-        
-        #endregion
-
-        #region Helper Methods
-
-        private bool IsStaticClass(Type type)
-        {
-            return type.IsAbstract && type.IsSealed;
-        }
-
-        private void RunAllTests(
-			TestResult suiteResult, EventListener listener, ITestFilter filter )
-		{
-            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))
-                {
-                    RunState saveRunState = test.RunState;
-
-                    if (test.RunState == RunState.Runnable && this.RunState != RunState.Runnable && this.RunState != RunState.Explicit )
-                    {
-                        test.RunState = this.RunState;
-                        test.IgnoreReason = this.IgnoreReason;
-                    }
-
-                    TestResult result = test.Run(listener, filter);
-
-					log.Debug("Test result = " + result.ResultState);
-					
-                    suiteResult.AddResult(result);
-					
-					log.Debug("Suite result = " + suiteResult.ResultState);
-
-                    if (saveRunState != test.RunState)
-                    {
-                        test.RunState = saveRunState;
-                        test.IgnoreReason = null;
-                    }
-
-                    if (result.ResultState == ResultState.Cancelled)
-                        break;
-
-                    if ((result.IsError || result.IsFailure) && stopOnError)
-                        break;
-                }
-            }
-		}
-
-        private void SkipAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            suiteResult.Skip(this.IgnoreReason);
-            MarkTestsNotRun(this.Tests, ResultState.Skipped, this.IgnoreReason, suiteResult, listener, filter);
-        }
-
-        private void IgnoreAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            suiteResult.Ignore(this.IgnoreReason);
-            MarkTestsNotRun(this.Tests, ResultState.Ignored, this.IgnoreReason, suiteResult, listener, filter);
-        }
-
-        private void MarkAllTestsInvalid(TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            suiteResult.Invalid(this.IgnoreReason);
-            MarkTestsNotRun(this.Tests, ResultState.NotRunnable, this.IgnoreReason, suiteResult, listener, filter);
-        }
-       
-        private void MarkTestsNotRun(
-            IList tests, ResultState resultState, string ignoreReason, TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            foreach (Test test in ArrayList.Synchronized(tests))
-            {
-                if (filter.Pass(test))
-                    MarkTestNotRun(test, resultState, ignoreReason, suiteResult, listener, filter);
-            }
-        }
-
-        private void MarkTestNotRun(
-            Test test, ResultState resultState, string ignoreReason, TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            if (test is TestSuite)
-            {
-                listener.SuiteStarted(test.TestName);
-                TestResult result = new TestResult( new TestInfo(test) );
-				result.SetResult( resultState, ignoreReason, null );
-                MarkTestsNotRun(test.Tests, resultState, ignoreReason, result, listener, filter);
-                suiteResult.AddResult(result);
-                listener.SuiteFinished(result);
-            }
-            else
-            {
-                listener.TestStarted(test.TestName);
-                TestResult result = new TestResult( new TestInfo(test) );
-                result.SetResult( resultState, ignoreReason, null );
-                suiteResult.AddResult(result);
-                listener.TestFinished(result);
-            }
-        }
-
-        private void MarkTestsFailed(
-            IList tests, TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            foreach (Test test in ArrayList.Synchronized(tests))
-                if (filter.Pass(test))
-                    MarkTestFailed(test, suiteResult, listener, filter);
-        }
-
-        private void MarkTestFailed(
-            Test test, TestResult suiteResult, EventListener listener, ITestFilter filter)
-        {
-            if (test is TestSuite)
-            {
-                listener.SuiteStarted(test.TestName);
-                TestResult result = new TestResult( new TestInfo(test) );
-				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, result, listener, filter);
-                suiteResult.AddResult(result);
-                listener.SuiteFinished(result);
-            }
-            else
-            {
-                listener.TestStarted(test.TestName);
-                TestResult result = new TestResult( new TestInfo(test) );
-				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);
-            }
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+
+namespace NUnit.Core
+{
+	using System;
+    using System.Text;
+    using System.Threading;
+	using System.Collections;
+	using System.Reflection;
+	using NUnit.Core.Filters;
+    using System.Runtime.Remoting.Messaging;
+
+#if CLR_2_0 || CLR_4_0
+    using System.Collections.Generic;
+using System.Diagnostics;
+#endif
+
+	/// <summary>
+	/// Summary description for TestSuite.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class TestSuite : Test
+	{
+		#region Fields
+        static Logger log = InternalTrace.GetLogger(typeof(TestSuite));
+
+		/// <summary>
+		/// Our collection of child tests
+		/// </summary>
+		private ArrayList tests = new ArrayList();
+
+        /// <summary>
+        /// The fixture setup methods for this suite
+        /// </summary>
+        protected MethodInfo[] fixtureSetUpMethods;
+
+        /// <summary>
+        /// The fixture teardown methods for this suite
+        /// </summary>
+        protected MethodInfo[] fixtureTearDownMethods;
+
+        /// <summary>
+        /// The setup methods for this suite
+        /// </summary>
+        protected MethodInfo[] setUpMethods;
+
+        /// <summary>
+        /// The teardown methods for this suite
+        /// </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>
+        protected bool maintainTestOrder;
+
+        /// <summary>
+        /// Arguments for use in creating a parameterized fixture
+        /// </summary>
+        internal object[] arguments;
+
+        /// <summary>
+        /// The System.Type of the fixture for this test suite, if there is one
+        /// </summary>
+        private Type fixtureType;
+
+        /// <summary>
+        /// The fixture object, if it has been created
+        /// </summary>
+        private object fixture;
+
+        #endregion
+
+		#region Constructors
+		public TestSuite( string name ) 
+			: base( name ) { }
+
+		public TestSuite( string parentSuiteName, string name ) 
+			: base( parentSuiteName, name ) { }
+
+        public TestSuite(Type fixtureType)
+            : this(fixtureType, null) { }
+
+        public TestSuite(Type fixtureType, object[] arguments)
+            : base(fixtureType.FullName)
+        {
+            string name = TypeHelper.GetDisplayName(fixtureType, arguments);
+            this.TestName.Name = name;
+            
+            this.TestName.FullName = name;
+            string nspace = fixtureType.Namespace;
+            if (nspace != null && nspace != "")
+                this.TestName.FullName = nspace + "." + name;
+            this.fixtureType = fixtureType;
+            this.arguments = arguments;
+        }
+        #endregion
+
+        #region Public Methods
+		public void Sort()
+		{
+            if (!maintainTestOrder)
+            {
+                this.tests.Sort();
+
+                foreach (Test test in Tests)
+                {
+                    TestSuite suite = test as TestSuite;
+                    if (suite != null)
+                        suite.Sort();
+                }
+            }
+		}
+
+		public void Sort(IComparer comparer)
+		{
+			this.tests.Sort(comparer);
+
+			foreach( Test test in Tests )
+			{
+				TestSuite suite = test as TestSuite;
+				if ( suite != null )
+					suite.Sort(comparer);
+			}
+		}
+
+		public void Add( Test test ) 
+		{
+//			if( test.RunState == RunState.Runnable )
+//			{
+//				test.RunState = this.RunState;
+//				test.IgnoreReason = this.IgnoreReason;
+//			}
+			test.Parent = this;
+			tests.Add(test);
+		}
+
+		public void Add( object fixture )
+		{
+			Test test = TestFixtureBuilder.BuildFrom( fixture );
+			if ( test != null )
+				Add( test );
+		}
+		#endregion
+
+		#region Properties
+		public override IList Tests 
+		{
+			get { return tests; }
+		}
+
+		public override bool IsSuite
+		{
+			get { return true; }
+		}
+
+		public override int TestCount
+		{
+			get
+			{
+				int count = 0;
+
+				foreach(Test test in Tests)
+				{
+					count += test.TestCount;
+				}
+				return count;
+			}
+		}
+
+        public override Type FixtureType
+        {
+            get { return fixtureType; }
+        }
+
+        public override object Fixture
+        {
+            get { return fixture; }
+            set { fixture = value; }
+        }
+
+        public MethodInfo[] GetSetUpMethods()
+        {
+            return setUpMethods;
+        }
+
+        public MethodInfo[] GetTearDownMethods()
+        {
+            return tearDownMethods;
+        }
+
+#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
+
+        public override string TestType
+        {
+            get { return "TestSuite"; }
+        }
+
+		public override int CountTestCases(ITestFilter filter)
+		{
+			int count = 0;
+
+			if(filter.Pass(this)) 
+			{
+				foreach(Test test in Tests)
+				{
+					count += test.CountTestCases(filter);
+				}
+			}
+			return count;
+		}
+
+		public override TestResult Run(EventListener listener, ITestFilter filter)
+		{
+            listener.SuiteStarted(this.TestName);
+#if CLR_2_0 || CLR_4_0
+            long startTime = Stopwatch.GetTimestamp();
+#else
+            long startTime = DateTime.Now.Ticks;
+#endif
+
+			TestResult suiteResult = this.RunState == RunState.Runnable || this.RunState == RunState.Explicit
+				? RunSuiteInContext(listener, filter)
+				: SkipSuite(listener, filter);
+			
+#if CLR_2_0 || CLR_4_0
+            long stopTime = Stopwatch.GetTimestamp();
+            double time = ((double)(stopTime - startTime)) / (double)Stopwatch.Frequency;
+#else
+            long stopTime = DateTime.Now.Ticks;
+            double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond;
+#endif
+            suiteResult.Time = time;
+
+            listener.SuiteFinished(suiteResult);
+            return suiteResult;
+		}
+		
+		private TestResult SkipSuite(EventListener listener, ITestFilter filter)
+		{
+			TestResult suiteResult = new TestResult(this);
+			
+            switch (this.RunState)
+            {
+                default:
+                case RunState.Skipped:
+                    SkipAllTests(suiteResult, listener, filter);
+                    break;
+                case RunState.NotRunnable:
+                    MarkAllTestsInvalid(suiteResult, listener, filter);
+                    break;
+                case RunState.Ignored:
+                    IgnoreAllTests(suiteResult, listener, filter);
+                    break;
+            }
+
+			return suiteResult;
+		}
+
+		private TestResult RunSuiteInContext(EventListener listener, ITestFilter filter)
+		{
+            TestExecutionContext.Save();
+
+            TestExecutionContext.CurrentContext.CurrentTest = this;
+
+            try
+            {
+				return ShouldRunOnOwnThread
+	                ? new TestSuiteThread(this).Run(listener, filter)
+	                : RunSuite(listener, filter);
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+		}
+
+        public TestResult RunSuite(EventListener listener, ITestFilter filter)
+        {
+			TestResult suiteResult = new TestResult(this);
+            TestExecutionContext.CurrentContext.CurrentResult = suiteResult;
+			
+            DoOneTimeSetUp(suiteResult);
+#if CLR_2_0 || CLR_4_0
+            DoOneTimeBeforeTestSuiteActions(suiteResult);
+#endif
+
+            if (this.Properties["_SETCULTURE"] != null)
+                TestExecutionContext.CurrentContext.CurrentCulture =
+                    new System.Globalization.CultureInfo((string)Properties["_SETCULTURE"]);
+            else if (this.Properties["SetCulture"] != null) // For NUnitLite
+                TestExecutionContext.CurrentContext.CurrentCulture =
+                    new System.Globalization.CultureInfo((string)Properties["SetCulture"]);
+
+            if (this.Properties["_SETUICULTURE"] != null)
+                TestExecutionContext.CurrentContext.CurrentUICulture =
+                    new System.Globalization.CultureInfo((string)Properties["_SETUICULTURE"]);
+            else if (this.Properties["SetUICulture"] != null) // For NUnitLite
+                TestExecutionContext.CurrentContext.CurrentUICulture =
+                    new System.Globalization.CultureInfo((string)Properties["SetUICulture"]);
+
+            switch (suiteResult.ResultState)
+            {
+                case ResultState.Failure:
+                case ResultState.Error:
+                    MarkTestsFailed(Tests, suiteResult, listener, filter);
+                    break;
+                case ResultState.NotRunnable:
+                    MarkTestsNotRun(this.Tests, ResultState.NotRunnable, suiteResult.Message, suiteResult, listener, filter);
+                    break;
+                default:
+                    try
+                    {
+                        RunAllTests(suiteResult, listener, filter);
+                    }
+                    finally
+                    {
+#if CLR_2_0 || CLR_4_0
+                        DoOneTimeAfterTestSuiteActions(suiteResult);
+#endif
+                        DoOneTimeTearDown(suiteResult);
+                    }
+                    break;
+            }
+			
+			return suiteResult;
+        }
+		#endregion
+
+		#region Virtual Methods
+        protected virtual void DoOneTimeSetUp(TestResult suiteResult)
+        {
+            if (FixtureType != null)
+            {
+                try
+                {
+					// In case TestFixture was created with fixture object
+					if (Fixture == null && !IsStaticClass( FixtureType ) )
+						CreateUserFixture();
+
+                    if (this.fixtureSetUpMethods != null)
+                        foreach( MethodInfo fixtureSetUp in fixtureSetUpMethods )
+                            Reflect.InvokeMethod(fixtureSetUp, fixtureSetUp.IsStatic ? null : Fixture);
+
+                    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);
+                }
+            }
+        }
+
+#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)
+                Fixture = Reflect.Construct(FixtureType, arguments);
+            else
+			    Fixture = Reflect.Construct(FixtureType);
+		}
+
+        protected virtual void DoOneTimeTearDown(TestResult suiteResult)
+        {
+            if ( this.FixtureType != null)
+            {
+                try
+                {
+                    if (this.fixtureTearDownMethods != null)
+                    {
+                        int index = fixtureTearDownMethods.Length;
+                        while (--index >= 0 )
+                        {
+                            MethodInfo fixtureTearDown = fixtureTearDownMethods[index];
+                            Reflect.InvokeMethod(fixtureTearDown, fixtureTearDown.IsStatic ? null : Fixture);
+                        }
+                    }
+
+					IDisposable disposable = Fixture as IDisposable;
+					if (disposable != null)
+						disposable.Dispose();
+				}
+                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);
+				}
+
+                this.Fixture = null;
+            }
+        }
+
+#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;
+        }
+
+        protected virtual bool IsIgnoreException(Exception ex)
+        {
+            return ex.GetType().FullName == NUnitFramework.IgnoreException;
+        }
+        
+        #endregion
+
+        #region Helper Methods
+
+        private bool IsStaticClass(Type type)
+        {
+            return type.IsAbstract && type.IsSealed;
+        }
+
+        private void RunAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter )
+		{
+            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))
+                {
+                    RunState saveRunState = test.RunState;
+
+                    if (test.RunState == RunState.Runnable && this.RunState != RunState.Runnable && this.RunState != RunState.Explicit )
+                    {
+                        test.RunState = this.RunState;
+                        test.IgnoreReason = this.IgnoreReason;
+                    }
+
+                    TestResult result = test.Run(listener, filter);
+
+					log.Debug("Test result = " + result.ResultState);
+					
+                    suiteResult.AddResult(result);
+					
+					log.Debug("Suite result = " + suiteResult.ResultState);
+
+                    if (saveRunState != test.RunState)
+                    {
+                        test.RunState = saveRunState;
+                        test.IgnoreReason = null;
+                    }
+
+                    if (result.ResultState == ResultState.Cancelled)
+                        break;
+
+                    if ((result.IsError || result.IsFailure || result.ResultState == ResultState.NotRunnable) && stopOnError)
+                        break;
+                }
+            }
+		}
+
+        private void SkipAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            suiteResult.Skip(this.IgnoreReason);
+            MarkTestsNotRun(this.Tests, ResultState.Skipped, this.IgnoreReason, suiteResult, listener, filter);
+        }
+
+        private void IgnoreAllTests(TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            suiteResult.Ignore(this.IgnoreReason);
+            MarkTestsNotRun(this.Tests, ResultState.Ignored, this.IgnoreReason, suiteResult, listener, filter);
+        }
+
+        private void MarkAllTestsInvalid(TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            suiteResult.Invalid(this.IgnoreReason);
+            MarkTestsNotRun(this.Tests, ResultState.NotRunnable, this.IgnoreReason, suiteResult, listener, filter);
+        }
+       
+        private void MarkTestsNotRun(
+            IList tests, ResultState resultState, string ignoreReason, TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            foreach (Test test in ArrayList.Synchronized(tests))
+            {
+                if (filter.Pass(test))
+                    MarkTestNotRun(test, resultState, ignoreReason, suiteResult, listener, filter);
+            }
+        }
+
+        private void MarkTestNotRun(
+            Test test, ResultState resultState, string ignoreReason, TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            if (test is TestSuite)
+            {
+                listener.SuiteStarted(test.TestName);
+                TestResult result = new TestResult( new TestInfo(test) );
+				result.SetResult( resultState, ignoreReason, null );
+                MarkTestsNotRun(test.Tests, resultState, ignoreReason, result, listener, filter);
+                suiteResult.AddResult(result);
+                listener.SuiteFinished(result);
+            }
+            else
+            {
+                listener.TestStarted(test.TestName);
+                TestResult result = new TestResult( new TestInfo(test) );
+                result.SetResult( resultState, ignoreReason, null );
+                suiteResult.AddResult(result);
+                listener.TestFinished(result);
+            }
+        }
+
+        private void MarkTestsFailed(
+            IList tests, TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            foreach (Test test in ArrayList.Synchronized(tests))
+                if (filter.Pass(test))
+                    MarkTestFailed(test, suiteResult, listener, filter);
+        }
+
+        private void MarkTestFailed(
+            Test test, TestResult suiteResult, EventListener listener, ITestFilter filter)
+        {
+            if (test is TestSuite)
+            {
+                listener.SuiteStarted(test.TestName);
+                TestResult result = new TestResult( new TestInfo(test) );
+				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, result, listener, filter);
+                suiteResult.AddResult(result);
+                listener.SuiteFinished(result);
+            }
+            else
+            {
+                listener.TestStarted(test.TestName);
+                TestResult result = new TestResult( new TestInfo(test) );
+				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);
+            }
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/core/TestSuiteBuilder.cs b/src/NUnitCore/core/TestSuiteBuilder.cs
index ea93ec2..b00b6ff 100644
--- a/src/NUnitCore/core/TestSuiteBuilder.cs
+++ b/src/NUnitCore/core/TestSuiteBuilder.cs
@@ -1,132 +1,132 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using NUnit.Core.Builders;
-	using System.Collections;
-	using System.Reflection;
-
-	/// <summary>
-	/// This is the master suite builder for NUnit. It builds a test suite from
-	/// one or more assemblies using a list of internal and external suite builders 
-	/// to create fixtures from the qualified types in each assembly. It implements
-	/// the ISuiteBuilder interface itself, allowing it to be used by other classes
-	/// for queries and suite construction.
-	/// </summary>D:\Dev\NUnit\nunit20\src\NUnitFramework\core\TestBuilderAttribute.cs
-	public class TestSuiteBuilder
-	{
-		#region Instance Variables
-
-		private ArrayList builders = new ArrayList();
-
-		#endregion
-
-		#region Properties
-		public IList Assemblies
-		{
-			get 
-			{
-				ArrayList assemblies = new ArrayList();
-				foreach( TestAssemblyBuilder builder in builders )
-					assemblies.Add( builder.Assembly );
-				return assemblies; 
-			}
-		}
-
-		public IList AssemblyInfo
-		{
-			get
-			{
-				ArrayList info = new ArrayList();
-				foreach( TestAssemblyBuilder builder in this.builders )
-					info.Add( builder.AssemblyInfo );
-
-				return info;
-			}
-		}
-		#endregion
-
-		#region Build Methods
-		/// <summary>
-		/// Build a suite based on a TestPackage
-		/// </summary>
-		/// <param name="package">The TestPackage</param>
-		/// <returns>A TestSuite</returns>
-		public TestSuite Build( TestPackage package )
-		{
-			bool autoNamespaceSuites = package.GetSetting( "AutoNamespaceSuites", true );
-			bool mergeAssemblies = package.GetSetting( "MergeAssemblies", false );
-            TestExecutionContext.CurrentContext.TestCaseTimeout = package.GetSetting("DefaultTimeout", 0);
-
-			if ( package.IsSingleAssembly )
-				return BuildSingleAssembly( package );
-			string targetAssemblyName = null;
-			if( package.TestName != null && package.Assemblies.Contains( package.TestName ) )
-			{
-				targetAssemblyName = package.TestName;
-				package.TestName = null;
-			}
-			
-			TestSuite rootSuite = new ProjectRootSuite( package.FullName );
-			NamespaceTreeBuilder namespaceTree = 
-				new NamespaceTreeBuilder( rootSuite );
-
-			builders.Clear();
-			foreach(string assemblyName in package.Assemblies)
-			{
-				if ( targetAssemblyName == null || targetAssemblyName == assemblyName )
-				{
-					TestAssemblyBuilder builder = new TestAssemblyBuilder();
-					builders.Add( builder );
-
-					Test testAssembly =  builder.Build( assemblyName, package.TestName, autoNamespaceSuites && !mergeAssemblies );
-
-					if ( testAssembly != null )
-					{
-						if (!mergeAssemblies)
-						{
-							rootSuite.Add(testAssembly);
-						}
-						else if (autoNamespaceSuites)
-						{
-							namespaceTree.Add(testAssembly.Tests);
-							rootSuite = namespaceTree.RootSuite;
-						}
-						else
-						{
-							foreach (Test test in testAssembly.Tests)
-								rootSuite.Add(test);
-						}
-					}
-				}
-			}
-
-            ProviderCache.Clear();
-            
-            if (rootSuite.Tests.Count == 0)
-				return null;
-
-			return rootSuite;
-		}
-
-		private TestSuite BuildSingleAssembly( TestPackage package )
-		{
-			TestAssemblyBuilder builder = new TestAssemblyBuilder();
-			builders.Clear();
-			builders.Add( builder );
-
-			TestSuite suite = (TestSuite)builder.Build( 
-				package.FullName, 
-				package.TestName, package.GetSetting( "AutoNamespaceSuites", true ) );
-
-            ProviderCache.Clear();
-
-            return suite;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using NUnit.Core.Builders;
+	using System.Collections;
+	using System.Reflection;
+
+	/// <summary>
+	/// This is the master suite builder for NUnit. It builds a test suite from
+	/// one or more assemblies using a list of internal and external suite builders 
+	/// to create fixtures from the qualified types in each assembly. It implements
+	/// the ISuiteBuilder interface itself, allowing it to be used by other classes
+	/// for queries and suite construction.
+	/// </summary>D:\Dev\NUnit\nunit20\src\NUnitFramework\core\TestBuilderAttribute.cs
+	public class TestSuiteBuilder
+	{
+		#region Instance Variables
+
+		private ArrayList builders = new ArrayList();
+
+		#endregion
+
+		#region Properties
+		public IList Assemblies
+		{
+			get 
+			{
+				ArrayList assemblies = new ArrayList();
+				foreach( TestAssemblyBuilder builder in builders )
+					assemblies.Add( builder.Assembly );
+				return assemblies; 
+			}
+		}
+
+		public IList AssemblyInfo
+		{
+			get
+			{
+				ArrayList info = new ArrayList();
+				foreach( TestAssemblyBuilder builder in this.builders )
+					info.Add( builder.AssemblyInfo );
+
+				return info;
+			}
+		}
+		#endregion
+
+		#region Build Methods
+		/// <summary>
+		/// Build a suite based on a TestPackage
+		/// </summary>
+		/// <param name="package">The TestPackage</param>
+		/// <returns>A TestSuite</returns>
+		public TestSuite Build( TestPackage package )
+		{
+			bool autoNamespaceSuites = package.GetSetting( "AutoNamespaceSuites", true );
+			bool mergeAssemblies = package.GetSetting( "MergeAssemblies", false );
+            TestExecutionContext.CurrentContext.TestCaseTimeout = package.GetSetting("DefaultTimeout", 0);
+
+			if ( package.IsSingleAssembly )
+				return BuildSingleAssembly( package );
+			string targetAssemblyName = null;
+			if( package.TestName != null && package.Assemblies.Contains( package.TestName ) )
+			{
+				targetAssemblyName = package.TestName;
+				package.TestName = null;
+			}
+			
+			TestSuite rootSuite = new ProjectRootSuite( package.FullName );
+			NamespaceTreeBuilder namespaceTree = 
+				new NamespaceTreeBuilder( rootSuite );
+
+			builders.Clear();
+			foreach(string assemblyName in package.Assemblies)
+			{
+				if ( targetAssemblyName == null || targetAssemblyName == assemblyName )
+				{
+					TestAssemblyBuilder builder = new TestAssemblyBuilder();
+					builders.Add( builder );
+
+					Test testAssembly =  builder.Build( assemblyName, package.TestName, autoNamespaceSuites && !mergeAssemblies );
+
+					if ( testAssembly != null )
+					{
+						if (!mergeAssemblies)
+						{
+							rootSuite.Add(testAssembly);
+						}
+						else if (autoNamespaceSuites)
+						{
+							namespaceTree.Add(testAssembly.Tests);
+							rootSuite = namespaceTree.RootSuite;
+						}
+						else
+						{
+							foreach (Test test in testAssembly.Tests)
+								rootSuite.Add(test);
+						}
+					}
+				}
+			}
+
+            ProviderCache.Clear();
+            
+            if (rootSuite.Tests.Count == 0)
+				return null;
+
+			return rootSuite;
+		}
+
+		private TestSuite BuildSingleAssembly( TestPackage package )
+		{
+			TestAssemblyBuilder builder = new TestAssemblyBuilder();
+			builders.Clear();
+			builders.Add( builder );
+
+			TestSuite suite = (TestSuite)builder.Build( 
+				package.FullName, 
+				package.TestName, package.GetSetting( "AutoNamespaceSuites", true ) );
+
+            ProviderCache.Clear();
+
+            return suite;
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/TestThread.cs b/src/NUnitCore/core/TestThread.cs
index b6f088f..501fd7a 100644
--- a/src/NUnitCore/core/TestThread.cs
+++ b/src/NUnitCore/core/TestThread.cs
@@ -1,202 +1,202 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Runtime.Remoting.Messaging;
-using System.Threading;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// Represents a thread of test execution and runs a test
-    /// on a thread, implementing timeout and setting the 
-    /// apartment state appropriately.
-    /// </summary>
-    public abstract class TestThread
-    {
-        static Logger log = InternalTrace.GetLogger(typeof(TestThread));
-
-		private Test test;
-		
-        #region Protected Fields
-        /// <summary>
-        /// The Thread object used to run tests
-        /// </summary>
-        protected Thread thread;
-
-		/// <summary>
-		/// The result of running the test, which must be kept
-		/// separate from the returned TestResult while the thread
-        /// is running to avoid race conditions.
-		/// </summary>
-		protected TestResult threadResult;
-		
-        protected EventListener listener;
-
-        protected ITestFilter filter;
-		
-		protected ContextDictionary contextDictionary;
-
-        /// <summary>
-        /// Unexpected exception thrown by test thread
-        /// </summary>
-        protected Exception thrownException;
-        #endregion
-
-        #region Constructor
-        protected TestThread(Test test)
-        {
-			this.test = test;
-			
-            this.thread = new Thread(new ThreadStart(RunTestProc));
-            thread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
-            thread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
-
-            // Setting to Unknown causes an error under the Mono 1.0 profile
-            if ( test.ApartmentState != ApartmentState.Unknown )
-                this.ApartmentState = test.ApartmentState;		
-        }
-        #endregion
-
-        #region Properties
-        public ApartmentState ApartmentState
-        {
-#if CLR_2_0 || CLR_4_0
-            get { return thread.GetApartmentState(); }
-            set { thread.SetApartmentState(value); }
-#else
-            get { return thread.ApartmentState; }
-            set { thread.ApartmentState = value; }
-#endif
-        }
-        #endregion
-
-        /// <summary>
-        /// Run the test, honoring any timeout value provided. If the
-        /// timeout is exceeded, set the testresult as a failure. As
-        /// currently implemented, the thread proc calls test.doRun,
-        /// which handles all exceptions itself. However, for safety,
-        /// any exception thrown is rethrown upwards.
-        /// 
-        /// TODO: It would be cleaner to call test.Run, since that's
-        /// part of the pubic interface, but it would require some
-        /// restructuring of the Test hierarchy.
-        /// </summary>
-        public TestResult Run(EventListener listener, ITestFilter filter)
-        {
-			TestResult testResult = new TestResult(test);
-			
-            this.thrownException = null;
-            this.listener = listener;
-            this.filter = filter;
-			this.contextDictionary = (ContextDictionary)CallContext.GetData("NUnit.Framework.TestContext");
-
-            log.Debug("Starting test in separate thread");
-            thread.Start();
-            thread.Join(this.Timeout);
-
-            // Timeout?
-            if (thread.IsAlive)
-            {
-				log.Debug("Test timed out - aborting thread");
-                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)
-			{
-				log.Debug("Test threw " + thrownException.GetType().Name);
-				throw thrownException;
-			}
-			else
-			{
-				log.Debug("Test completed normally");
-                testResult = threadResult;
-            }
-			
-			return testResult;
-        }
-
-        /// <summary>
-        /// This is the engine of this class; the actual call to test.doRun!
-        /// Note that any thrown exception is saved for later use!
-        /// </summary>
-        private void RunTestProc()
-        {
-			CallContext.SetData("NUnit.Framework.TestContext", contextDictionary);
-			
-            try
-            {
-                RunTest();
-            }
-            catch (Exception e)
-            {
-                thrownException = e;
-            }
-			finally
-			{
-				CallContext.FreeNamedDataSlot("NUnit.Framework.TestContext");
-			}
-        }
-
-        protected abstract int Timeout { get; }
-        protected abstract void RunTest();
-    }
-
-    public class TestMethodThread : TestThread
-    {
-        private TestMethod testMethod;
-
-        public TestMethodThread(TestMethod testMethod)
-            : base(testMethod)
-        {
-            this.testMethod = testMethod;
-        }
-
-        protected override int Timeout
-        {
-            get 
-            { 
-                return testMethod.Timeout == 0 //|| System.Diagnostics.Debugger.IsAttached
-                    ? System.Threading.Timeout.Infinite
-                    : testMethod.Timeout;
-            }
-        }
-
-        protected override void RunTest()
-        {
-			this.threadResult = testMethod.RunTest();
-        }
-    }
-
-    public class TestSuiteThread : TestThread
-    {
-        private TestSuite suite;
-
-        public TestSuiteThread(TestSuite suite)
-            : base(suite)
-        {
-            this.suite = suite;
-        }
-
-        protected override int Timeout
-        {
-            get { return System.Threading.Timeout.Infinite; }
-        }
-
-        protected override void RunTest()
-        {
-			this.threadResult = suite.RunSuite(listener, filter);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Runtime.Remoting.Messaging;
+using System.Threading;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Represents a thread of test execution and runs a test
+    /// on a thread, implementing timeout and setting the 
+    /// apartment state appropriately.
+    /// </summary>
+    public abstract class TestThread
+    {
+        static Logger log = InternalTrace.GetLogger(typeof(TestThread));
+
+		private Test test;
+		
+        #region Protected Fields
+        /// <summary>
+        /// The Thread object used to run tests
+        /// </summary>
+        protected Thread thread;
+
+		/// <summary>
+		/// The result of running the test, which must be kept
+		/// separate from the returned TestResult while the thread
+        /// is running to avoid race conditions.
+		/// </summary>
+		protected TestResult threadResult;
+		
+        protected EventListener listener;
+
+        protected ITestFilter filter;
+		
+		protected ContextDictionary contextDictionary;
+
+        /// <summary>
+        /// Unexpected exception thrown by test thread
+        /// </summary>
+        protected Exception thrownException;
+        #endregion
+
+        #region Constructor
+        protected TestThread(Test test)
+        {
+			this.test = test;
+			
+            this.thread = new Thread(new ThreadStart(RunTestProc));
+            thread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
+            thread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
+
+            // Setting to Unknown causes an error under the Mono 1.0 profile
+            if ( test.ApartmentState != ApartmentState.Unknown )
+                this.ApartmentState = test.ApartmentState;		
+        }
+        #endregion
+
+        #region Properties
+        public ApartmentState ApartmentState
+        {
+#if CLR_2_0 || CLR_4_0
+            get { return thread.GetApartmentState(); }
+            set { thread.SetApartmentState(value); }
+#else
+            get { return thread.ApartmentState; }
+            set { thread.ApartmentState = value; }
+#endif
+        }
+        #endregion
+
+        /// <summary>
+        /// Run the test, honoring any timeout value provided. If the
+        /// timeout is exceeded, set the testresult as a failure. As
+        /// currently implemented, the thread proc calls test.doRun,
+        /// which handles all exceptions itself. However, for safety,
+        /// any exception thrown is rethrown upwards.
+        /// 
+        /// TODO: It would be cleaner to call test.Run, since that's
+        /// part of the pubic interface, but it would require some
+        /// restructuring of the Test hierarchy.
+        /// </summary>
+        public TestResult Run(EventListener listener, ITestFilter filter)
+        {
+			TestResult testResult = new TestResult(test);
+			
+            this.thrownException = null;
+            this.listener = listener;
+            this.filter = filter;
+			this.contextDictionary = (ContextDictionary)CallContext.GetData("NUnit.Framework.TestContext");
+
+            log.Debug("Starting test in separate thread");
+            thread.Start();
+            thread.Join(this.Timeout);
+
+            // Timeout?
+            if (thread.IsAlive)
+            {
+				log.Debug("Test timed out - aborting thread");
+                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)
+			{
+				log.Debug("Test threw " + thrownException.GetType().Name);
+				throw thrownException;
+			}
+			else
+			{
+				log.Debug("Test completed normally");
+                testResult = threadResult;
+            }
+			
+			return testResult;
+        }
+
+        /// <summary>
+        /// This is the engine of this class; the actual call to test.doRun!
+        /// Note that any thrown exception is saved for later use!
+        /// </summary>
+        private void RunTestProc()
+        {
+			CallContext.SetData("NUnit.Framework.TestContext", contextDictionary);
+			
+            try
+            {
+                RunTest();
+            }
+            catch (Exception e)
+            {
+                thrownException = e;
+            }
+			finally
+			{
+				CallContext.FreeNamedDataSlot("NUnit.Framework.TestContext");
+			}
+        }
+
+        protected abstract int Timeout { get; }
+        protected abstract void RunTest();
+    }
+
+    public class TestMethodThread : TestThread
+    {
+        private TestMethod testMethod;
+
+        public TestMethodThread(TestMethod testMethod)
+            : base(testMethod)
+        {
+            this.testMethod = testMethod;
+        }
+
+        protected override int Timeout
+        {
+            get 
+            { 
+                return testMethod.Timeout == 0 //|| System.Diagnostics.Debugger.IsAttached
+                    ? System.Threading.Timeout.Infinite
+                    : testMethod.Timeout;
+            }
+        }
+
+        protected override void RunTest()
+        {
+			this.threadResult = testMethod.RunTest();
+        }
+    }
+
+    public class TestSuiteThread : TestThread
+    {
+        private TestSuite suite;
+
+        public TestSuiteThread(TestSuite suite)
+            : base(suite)
+        {
+            this.suite = suite;
+        }
+
+        protected override int Timeout
+        {
+            get { return System.Threading.Timeout.Infinite; }
+        }
+
+        protected override void RunTest()
+        {
+			this.threadResult = suite.RunSuite(listener, filter);
+        }
+    }
+}
diff --git a/src/NUnitCore/core/TextCapture.cs b/src/NUnitCore/core/TextCapture.cs
index 219ebd7..7803d2d 100644
--- a/src/NUnitCore/core/TextCapture.cs
+++ b/src/NUnitCore/core/TextCapture.cs
@@ -1,43 +1,43 @@
-// ****************************************************************
-// 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.IO;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// Abstract base for classes that capture text output
-    /// and redirect it to a TextWriter.
-    /// </summary>
-    public abstract class TextCapture
-    {
-        #region Abstract Members
-
-        /// <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 abstract TextWriter Writer 
-        { 
-            get; set; 
-        }
-
-        /// <summary>
-        /// 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 abstract LoggingThreshold Threshold
-        {
-            get; set;
-        }
-
-        #endregion
-    }
-
-}
+// ****************************************************************
+// 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.IO;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Abstract base for classes that capture text output
+    /// and redirect it to a TextWriter.
+    /// </summary>
+    public abstract class TextCapture
+    {
+        #region Abstract Members
+
+        /// <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 abstract TextWriter Writer 
+        { 
+            get; set; 
+        }
+
+        /// <summary>
+        /// 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 abstract LoggingThreshold Threshold
+        {
+            get; set;
+        }
+
+        #endregion
+    }
+
+}
diff --git a/src/NUnitCore/core/ThreadUtility.cs b/src/NUnitCore/core/ThreadUtility.cs
index 62a1b5c..f0662f0 100644
--- a/src/NUnitCore/core/ThreadUtility.cs
+++ b/src/NUnitCore/core/ThreadUtility.cs
@@ -1,52 +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() { }
-    }
-}
+// ****************************************************************
+// Copyright 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 3685917..e1f223e 100644
--- a/src/NUnitCore/core/ThreadedTestRunner.cs
+++ b/src/NUnitCore/core/ThreadedTestRunner.cs
@@ -1,78 +1,78 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-namespace NUnit.Core
-{
-	using System;
-	using System.Threading;
-	using System.Collections.Specialized;
-
-	/// <summary>
-	/// ThreadedTestRunner overrides the Run and BeginRun methods 
-	/// so that they are always run on a separate thread. The actual
-	/// </summary>
-	public class ThreadedTestRunner : ProxyTestRunner
-	{
-        static Logger log = InternalTrace.GetLogger(typeof(ThreadedTestRunner));
-
-		#region Instance Variables
-
-		private TestRunnerThread testRunnerThread;
-        private ApartmentState apartmentState;
-        private ThreadPriority priority;
-
-		#endregion
-
-		#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, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
-        {
-            BeginRun(listener, filter, tracing, logLevel);
-            return EndRun();
-        }
-
-        public override void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
-        {
-            log.Info("BeginRun");
-            testRunnerThread = new TestRunnerThread(this.TestRunner, this.apartmentState, this.priority);
-            testRunnerThread.StartRun(listener, filter, tracing, logLevel);
-        }
-
-        public override TestResult EndRun()
-		{
-            log.Info("EndRun");
-            this.Wait();
-			return this.TestRunner.TestResult;
-		}
-
-		public override void Wait()
-		{
-			if ( testRunnerThread != null )
-				testRunnerThread.Wait();
-		}
-
-		public override void CancelRun()
-		{
-			if ( testRunnerThread != null )
-				testRunnerThread.Cancel();
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+namespace NUnit.Core
+{
+	using System;
+	using System.Threading;
+	using System.Collections.Specialized;
+
+	/// <summary>
+	/// ThreadedTestRunner overrides the Run and BeginRun methods 
+	/// so that they are always run on a separate thread. The actual
+	/// </summary>
+	public class ThreadedTestRunner : ProxyTestRunner
+	{
+        static Logger log = InternalTrace.GetLogger(typeof(ThreadedTestRunner));
+
+		#region Instance Variables
+
+		private TestRunnerThread testRunnerThread;
+        private ApartmentState apartmentState;
+        private ThreadPriority priority;
+
+		#endregion
+
+		#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, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            BeginRun(listener, filter, tracing, logLevel);
+            return EndRun();
+        }
+
+        public override void BeginRun(EventListener listener, ITestFilter filter, bool tracing, LoggingThreshold logLevel)
+        {
+            log.Info("BeginRun");
+            testRunnerThread = new TestRunnerThread(this.TestRunner, this.apartmentState, this.priority);
+            testRunnerThread.StartRun(listener, filter, tracing, logLevel);
+        }
+
+        public override TestResult EndRun()
+		{
+            log.Info("EndRun");
+            this.Wait();
+			return this.TestRunner.TestResult;
+		}
+
+		public override void Wait()
+		{
+			if ( testRunnerThread != null )
+				testRunnerThread.Wait();
+		}
+
+		public override void CancelRun()
+		{
+			if ( testRunnerThread != null )
+				testRunnerThread.Cancel();
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/core/TypeHelper.cs b/src/NUnitCore/core/TypeHelper.cs
index 9aaacfd..69bfdd1 100644
--- a/src/NUnitCore/core/TypeHelper.cs
+++ b/src/NUnitCore/core/TypeHelper.cs
@@ -1,209 +1,211 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Text;
-using System.Text.RegularExpressions;
-
-namespace NUnit.Core
-{
-    public class TypeHelper
-    {
-        public static string GetDisplayName(Type type)
-        {
-#if CLR_2_0 || CLR_4_0
-            if (type.IsGenericParameter)
-                return type.Name;
-
-            if (type.IsGenericType)
-            {
-                string name = type.FullName;
-
-                int index = name.IndexOf("[[");
-                if (index > 0)
-                {
-                    int index2 = name.LastIndexOf("]]");
-                    if (index2 > index)
-                        name = name.Substring(0, index) + name.Substring(index2 + 2);
-                }
-
-                index = name.LastIndexOf('.');
-                if (index >= 0) name = name.Substring(index + 1);
-
-                index = name.IndexOf('`');
-                while (index >= 0)
-                {
-                    int index2 = name.IndexOf('+', index);
-                    if (index2 >= 0)
-                        name = name.Substring(0, index) + name.Substring(index2);
-                    else
-                        name = name.Substring(0, index);
-
-                    index = name.IndexOf('`');
-                }
-
-                StringBuilder sb = new StringBuilder(name);
-
-                sb.Append("<");
-                int cnt = 0;
-                foreach (Type t in type.GetGenericArguments())
-                {
-                    if (cnt++ > 0) sb.Append(",");
-                    sb.Append(GetDisplayName(t));
-                }
-                sb.Append(">");
-
-                return sb.ToString();
-            }
-#endif
-            int lastdot = type.FullName.LastIndexOf('.');
-            return lastdot >= 0
-                ? type.FullName.Substring(lastdot + 1)
-                : type.FullName;
-        }
-
-        public static string GetDisplayName(Type type, object[] arglist)
-        {
-            string baseName = GetDisplayName(type);
-            if (arglist == null || arglist.Length == 0)
-                return baseName;
-
-            StringBuilder sb = new StringBuilder( baseName );
-
-            sb.Append("(");
-            for (int i = 0; i < arglist.Length; i++)
-            {
-                if (i > 0) sb.Append(",");
-
-                object arg = arglist[i];
-                string display = arg == null ? "null" : arg.ToString();
-
-                if (arg is double || arg is float)
-                {
-                    if (display.IndexOf('.') == -1)
-                        display += ".0";
-                    display += arg is double ? "d" : "f";
-                }
-                else if (arg is decimal) display += "m";
-                else if (arg is long) display += "L";
-                else if (arg is ulong) display += "UL";
-                else if (arg is string) display = "\"" + display + "\"";
-
-                sb.Append(display);
-            }
-            sb.Append(")");
-
-            return sb.ToString();
-        }
-
-        public static Type BestCommonType(Type type1, Type type2)
-        {
-            if (type1 == type2) return type1;
-            if (type1 == null) return type2;
-            if (type2 == null) return type1;
-
-            if (TypeHelper.IsNumeric(type1) && TypeHelper.IsNumeric(type2))
-            {
-                if (type1 == typeof(double)) return type1;
-                if (type2 == typeof(double)) return type2;
-
-                if (type1 == typeof(float)) return type1;
-                if (type2 == typeof(float)) return type2;
-
-                if (type1 == typeof(decimal)) return type1;
-                if (type2 == typeof(decimal)) return type2;
-
-                if (type1 == typeof(UInt64)) return type1;
-                if (type2 == typeof(UInt64)) return type2;
-
-                if (type1 == typeof(Int64)) return type1;
-                if (type2 == typeof(Int64)) return type2;
-
-                if (type1 == typeof(UInt32)) return type1;
-                if (type2 == typeof(UInt32)) return type2;
-
-                if (type1 == typeof(Int32)) return type1;
-                if (type2 == typeof(Int32)) return type2;
-
-                if (type1 == typeof(UInt16)) return type1;
-                if (type2 == typeof(UInt16)) return type2;
-
-                if (type1 == typeof(Int16)) return type1;
-                if (type2 == typeof(Int16)) return type2;
-
-                if (type1 == typeof(byte)) return type1;
-                if (type2 == typeof(byte)) return type2;
-
-                if (type1 == typeof(sbyte)) return type1;
-                if (type2 == typeof(sbyte)) return type2;
-            }
-
-            return type1;
-        }
-
-        public static bool IsNumeric(Type type)
-        {
-            return type == typeof(double) ||
-                    type == typeof(float) ||
-                    type == typeof(decimal) ||
-                    type == typeof(Int64) ||
-                    type == typeof(Int32) ||
-                    type == typeof(Int16) ||
-                    type == typeof(UInt64) ||
-                    type == typeof(UInt32) ||
-                    type == typeof(UInt16) ||
-                    type == typeof(byte) ||
-                    type == typeof(sbyte);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        public static Type MakeGenericType(Type type, Type[] typeArgs)
-        {
-            // TODO: Add error handling
-            return type.MakeGenericType(typeArgs);
-        }
-
-        public static bool CanDeduceTypeArgsFromArgs(Type type, object[] arglist, ref Type[] typeArgsOut)
-        {
-            Type[] typeParameters = type.GetGenericArguments();
-
-            foreach (ConstructorInfo ctor in type.GetConstructors())
-            {
-                ParameterInfo[] parameters = ctor.GetParameters();
-                if (parameters.Length != arglist.Length)
-                    continue;
-
-                Type[] typeArgs = new Type[typeParameters.Length];
-                for (int i = 0; i < typeArgs.Length; i++)
-                {
-                    for (int j = 0; j < arglist.Length; j++)
-			        {
-                        if (parameters[j].ParameterType.Equals(typeParameters[i]))
-                            typeArgs[i] = TypeHelper.BestCommonType(
-                                typeArgs[i],
-                                arglist[j].GetType());
-			        }
-
-                    if (typeArgs[i] == null)
-                    {
-                        typeArgs = null;
-                        break;
-                    }
-                }
-
-                if (typeArgs != null)
-                {
-                    typeArgsOut = typeArgs;
-                    return true;
-                }
-            }
-
-            return false;
-        }
-#endif
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace NUnit.Core
+{
+    public class TypeHelper
+    {
+        public static string GetDisplayName(Type type)
+        {
+#if CLR_2_0 || CLR_4_0
+            if (type.IsGenericParameter)
+                return type.Name;
+
+            if (type.IsGenericType)
+            {
+                string name = type.FullName;
+                if (name == null)
+                    name = type.Name;
+
+                int index = name.IndexOf("[[");
+                if (index > 0)
+                {
+                    int index2 = name.LastIndexOf("]]");
+                    if (index2 > index)
+                        name = name.Substring(0, index) + name.Substring(index2 + 2);
+                }
+
+                index = name.LastIndexOf('.');
+                if (index >= 0) name = name.Substring(index + 1);
+
+                index = name.IndexOf('`');
+                while (index >= 0)
+                {
+                    int index2 = name.IndexOf('+', index);
+                    if (index2 >= 0)
+                        name = name.Substring(0, index) + name.Substring(index2);
+                    else
+                        name = name.Substring(0, index);
+
+                    index = name.IndexOf('`');
+                }
+
+                StringBuilder sb = new StringBuilder(name);
+
+                sb.Append("<");
+                int cnt = 0;
+                foreach (Type t in type.GetGenericArguments())
+                {
+                    if (cnt++ > 0) sb.Append(",");
+                    sb.Append(GetDisplayName(t));
+                }
+                sb.Append(">");
+
+                return sb.ToString();
+            }
+#endif
+            int lastdot = type.FullName.LastIndexOf('.');
+            return lastdot >= 0
+                ? type.FullName.Substring(lastdot + 1)
+                : type.FullName;
+        }
+
+        public static string GetDisplayName(Type type, object[] arglist)
+        {
+            string baseName = GetDisplayName(type);
+            if (arglist == null || arglist.Length == 0)
+                return baseName;
+
+            StringBuilder sb = new StringBuilder( baseName );
+
+            sb.Append("(");
+            for (int i = 0; i < arglist.Length; i++)
+            {
+                if (i > 0) sb.Append(",");
+
+                object arg = arglist[i];
+                string display = arg == null ? "null" : arg.ToString();
+
+                if (arg is double || arg is float)
+                {
+                    if (display.IndexOf('.') == -1)
+                        display += ".0";
+                    display += arg is double ? "d" : "f";
+                }
+                else if (arg is decimal) display += "m";
+                else if (arg is long) display += "L";
+                else if (arg is ulong) display += "UL";
+                else if (arg is string) display = "\"" + display + "\"";
+
+                sb.Append(display);
+            }
+            sb.Append(")");
+
+            return sb.ToString();
+        }
+
+        public static Type BestCommonType(Type type1, Type type2)
+        {
+            if (type1 == type2) return type1;
+            if (type1 == null) return type2;
+            if (type2 == null) return type1;
+
+            if (TypeHelper.IsNumeric(type1) && TypeHelper.IsNumeric(type2))
+            {
+                if (type1 == typeof(double)) return type1;
+                if (type2 == typeof(double)) return type2;
+
+                if (type1 == typeof(float)) return type1;
+                if (type2 == typeof(float)) return type2;
+
+                if (type1 == typeof(decimal)) return type1;
+                if (type2 == typeof(decimal)) return type2;
+
+                if (type1 == typeof(UInt64)) return type1;
+                if (type2 == typeof(UInt64)) return type2;
+
+                if (type1 == typeof(Int64)) return type1;
+                if (type2 == typeof(Int64)) return type2;
+
+                if (type1 == typeof(UInt32)) return type1;
+                if (type2 == typeof(UInt32)) return type2;
+
+                if (type1 == typeof(Int32)) return type1;
+                if (type2 == typeof(Int32)) return type2;
+
+                if (type1 == typeof(UInt16)) return type1;
+                if (type2 == typeof(UInt16)) return type2;
+
+                if (type1 == typeof(Int16)) return type1;
+                if (type2 == typeof(Int16)) return type2;
+
+                if (type1 == typeof(byte)) return type1;
+                if (type2 == typeof(byte)) return type2;
+
+                if (type1 == typeof(sbyte)) return type1;
+                if (type2 == typeof(sbyte)) return type2;
+            }
+
+            return type1;
+        }
+
+        public static bool IsNumeric(Type type)
+        {
+            return type == typeof(double) ||
+                    type == typeof(float) ||
+                    type == typeof(decimal) ||
+                    type == typeof(Int64) ||
+                    type == typeof(Int32) ||
+                    type == typeof(Int16) ||
+                    type == typeof(UInt64) ||
+                    type == typeof(UInt32) ||
+                    type == typeof(UInt16) ||
+                    type == typeof(byte) ||
+                    type == typeof(sbyte);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        public static Type MakeGenericType(Type type, Type[] typeArgs)
+        {
+            // TODO: Add error handling
+            return type.MakeGenericType(typeArgs);
+        }
+
+        public static bool CanDeduceTypeArgsFromArgs(Type type, object[] arglist, ref Type[] typeArgsOut)
+        {
+            Type[] typeParameters = type.GetGenericArguments();
+
+            foreach (ConstructorInfo ctor in type.GetConstructors())
+            {
+                ParameterInfo[] parameters = ctor.GetParameters();
+                if (parameters.Length != arglist.Length)
+                    continue;
+
+                Type[] typeArgs = new Type[typeParameters.Length];
+                for (int i = 0; i < typeArgs.Length; i++)
+                {
+                    for (int j = 0; j < arglist.Length; j++)
+			        {
+                        if (parameters[j].ParameterType.Equals(typeParameters[i]))
+                            typeArgs[i] = TypeHelper.BestCommonType(
+                                typeArgs[i],
+                                arglist[j].GetType());
+			        }
+
+                    if (typeArgs[i] == null)
+                    {
+                        typeArgs = null;
+                        break;
+                    }
+                }
+
+                if (typeArgs != null)
+                {
+                    typeArgsOut = typeArgs;
+                    return true;
+                }
+            }
+
+            return false;
+        }
+#endif
+    }
+}
diff --git a/src/NUnitCore/core/nunit.core.build b/src/NUnitCore/core/nunit.core.build
index a4d6b59..db13cc9 100644
--- a/src/NUnitCore/core/nunit.core.build
+++ b/src/NUnitCore/core/nunit.core.build
@@ -1,126 +1,129 @@
-<?xml version="1.0"?>
-<project name="NUnitCore" default="build" basedir=".">
-
-  <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"/>
-    <include name="DomainAgent.cs"/>
-    <include name="EventListenerTextWriter.cs"/>
-    <include name="EventPump.cs"/>
-    <include name="EventQueue.cs"/>
-    <include name="ExpectedExceptionProcessor.cs"/>
-    <include name="ExtensionHost.cs"/>
-    <include name="ExtensionPoint.cs"/>
-    <include name="IgnoreDecorator.cs"/>
-    <include name="InternalTrace.cs"/>
-    <include name="InternalTraceWriter.cs"/>
-    <include name="InvalidSuiteException.cs"/>
-    <include name="InvalidTestFixtureException.cs"/>
-    <include name="LegacySuite.cs"/>
-    <include name="Log4NetCapture.cs"/>
-    <include name="Logger.cs"/>
-    <include name="MethodHelper.cs"/>
-    <include name="NamespaceSuite.cs"/>
-    <include name="NamespaceTreeBuilder.cs"/>
-    <include name="NoTestFixturesException.cs"/>
-    <include name="NullListener.cs"/>
-    <include name="NUnitConfiguration.cs"/>
-    <include name="NUnitException.cs"/>
-    <include name="NUnitFramework.cs"/>
-    <include name="NUnitTestFixture.cs"/>
-    <include name="NUnitTestMethod.cs"/>
-    <include name="ParameterizedFixtureSuite.cs"/>
-    <include name="ParameterizedTestMethodSuite.cs"/>
-    <include name="PlatformHelper.cs"/>
-    <include name="ProjectRootSuite.cs"/>
-    <include name="ProxyTestRunner.cs"/>
-    <include name="QueuingEventListener.cs"/>
-    <include name="Reflect.cs"/>
-    <include name="RemoteTestRunner.cs"/>
-    <include name="SetUpFixture.cs"/>
-    <include name="SimpleTestRunner.cs"/>
-    <include name="StringTextWriter.cs"/>
-    <include name="SuiteBuilderAttribute.cs"/>
-    <include name="TestAction.cs"/>
-    <include name="TestAssembly.cs"/>
-    <include name="TestBuilderAttribute.cs"/>
-    <include name="TestCaseBuilder.cs"/>
-    <include name="TestCaseBuilderAttribute.cs"/>
-    <include name="TestDecoratorAttribute.cs"/>
-    <include name="TestExecutionContext.cs"/>
-    <include name="TestFixture.cs"/>
-    <include name="TestFixtureBuilder.cs"/>
-    <include name="TestMethod.cs"/>
-    <include name="TestRunnerThread.cs"/>
-    <include name="TestSuite.cs"/>
-    <include name="TestSuiteBuilder.cs"/>
-    <include name="TestThread.cs"/>
-    <include name="TextCapture.cs"/>
-    <include name="ThreadedTestRunner.cs"/>
-    <include name="ThreadUtility.cs"/>
-    <include name="TypeHelper.cs"/>
-    <include name="Builders/CombinatorialStrategy.cs"/>
-    <include name="Builders/CombinatorialTestCaseProvider.cs"/>
-    <include name="Builders/CombiningStrategy.cs"/>
-    <include name="Builders/DatapointProvider.cs"/>
-    <include name="Builders/InlineDataPointProvider.cs"/>
-    <include name="Builders/LegacySuiteBuilder.cs"/>
-    <include name="Builders/NUnitTestCaseBuilder.cs"/>
-    <include name="Builders/NUnitTestFixtureBuilder.cs"/>
-    <include name="Builders/PairwiseStrategy.cs"/>
-    <include name="Builders/ProviderCache.cs"/>
-    <include name="Builders/ProviderInfo.cs"/>
-    <include name="Builders/SequentialStrategy.cs"/>
-    <include name="Builders/SetUpFixtureBuilder.cs"/>
-    <include name="Builders/TestAssemblyBuilder.cs"/>
-    <include name="Builders/TestCaseParameterProvider.cs"/>
-    <include name="Builders/TestCaseSourceProvider.cs"/>
-    <include name="Builders/ValueSourceProvider.cs"/>
-    <include name="Extensibility/DataPointProviders.cs"/>
-    <include name="Extensibility/EventListenerCollection.cs"/>
-    <include name="Extensibility/FrameworkRegistry.cs"/>
-    <include name="Extensibility/SuiteBuilderCollection.cs"/>
-    <include name="Extensibility/TestCaseProviders.cs"/>
-    <include name="Extensibility/TestCaseBuilderCollection.cs"/>
-    <include name="Extensibility/TestDecoratorCollection.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.lib.dir}/nunit.core.dll"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-    <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618,1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <references>
-	<include name="System.Configuration.dll"/>
-    <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitCore/core">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="summary.xslt"/>    <!-- and this -->
-        <include name="nunit.core.dll.csproj"/>
-        <include name="nunit.core.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="NUnitCore" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="AbstractTestCaseDecoration.cs"/>
+    <include name="..\..\NUnitFramework\framework\AsyncSynchronizationContext.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="..\..\NUnitFramework\framework\AsyncInvocationRegion.cs" if="${runtime.version >= '2.0'}"/>
+    <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"/>
+    <include name="DomainAgent.cs"/>
+    <include name="EventListenerTextWriter.cs"/>
+    <include name="EventPump.cs"/>
+    <include name="EventQueue.cs"/>
+    <include name="ExpectedExceptionProcessor.cs"/>
+    <include name="ExtensionHost.cs"/>
+    <include name="ExtensionPoint.cs"/>
+    <include name="IgnoreDecorator.cs"/>
+    <include name="InternalTrace.cs"/>
+    <include name="InternalTraceWriter.cs"/>
+    <include name="InvalidSuiteException.cs"/>
+    <include name="InvalidTestFixtureException.cs"/>
+    <include name="LegacySuite.cs"/>
+    <include name="Log4NetCapture.cs"/>
+    <include name="Logger.cs"/>
+    <include name="MethodHelper.cs"/>
+    <include name="NamespaceSuite.cs"/>
+    <include name="NamespaceTreeBuilder.cs"/>
+    <include name="NoTestFixturesException.cs"/>
+    <include name="NullListener.cs"/>
+    <include name="NUnitAsyncTestMethod.cs" if="${runtime.version >= '2.0'}"/>
+    <include name="NUnitConfiguration.cs"/>
+    <include name="NUnitException.cs"/>
+    <include name="NUnitFramework.cs"/>
+    <include name="NUnitTestFixture.cs"/>
+    <include name="NUnitTestMethod.cs"/>
+    <include name="ParameterizedFixtureSuite.cs"/>
+    <include name="ParameterizedTestMethodSuite.cs"/>
+    <include name="PlatformHelper.cs"/>
+    <include name="ProjectRootSuite.cs"/>
+    <include name="ProxyTestRunner.cs"/>
+    <include name="QueuingEventListener.cs"/>
+    <include name="Reflect.cs"/>
+    <include name="RemoteTestRunner.cs"/>
+    <include name="SetUpFixture.cs"/>
+    <include name="SimpleTestRunner.cs"/>
+    <include name="StringTextWriter.cs"/>
+    <include name="SuiteBuilderAttribute.cs"/>
+    <include name="TestAction.cs"/>
+    <include name="TestAssembly.cs"/>
+    <include name="TestBuilderAttribute.cs"/>
+    <include name="TestCaseBuilder.cs"/>
+    <include name="TestCaseBuilderAttribute.cs"/>
+    <include name="TestDecoratorAttribute.cs"/>
+    <include name="TestExecutionContext.cs"/>
+    <include name="TestFixture.cs"/>
+    <include name="TestFixtureBuilder.cs"/>
+    <include name="TestMethod.cs"/>
+    <include name="TestRunnerThread.cs"/>
+    <include name="TestSuite.cs"/>
+    <include name="TestSuiteBuilder.cs"/>
+    <include name="TestThread.cs"/>
+    <include name="TextCapture.cs"/>
+    <include name="ThreadedTestRunner.cs"/>
+    <include name="ThreadUtility.cs"/>
+    <include name="TypeHelper.cs"/>
+    <include name="Builders/CombinatorialStrategy.cs"/>
+    <include name="Builders/CombinatorialTestCaseProvider.cs"/>
+    <include name="Builders/CombiningStrategy.cs"/>
+    <include name="Builders/DatapointProvider.cs"/>
+    <include name="Builders/InlineDataPointProvider.cs"/>
+    <include name="Builders/LegacySuiteBuilder.cs"/>
+    <include name="Builders/NUnitTestCaseBuilder.cs"/>
+    <include name="Builders/NUnitTestFixtureBuilder.cs"/>
+    <include name="Builders/PairwiseStrategy.cs"/>
+    <include name="Builders/ProviderCache.cs"/>
+    <include name="Builders/ProviderInfo.cs"/>
+    <include name="Builders/SequentialStrategy.cs"/>
+    <include name="Builders/SetUpFixtureBuilder.cs"/>
+    <include name="Builders/TestAssemblyBuilder.cs"/>
+    <include name="Builders/TestCaseParameterProvider.cs"/>
+    <include name="Builders/TestCaseSourceProvider.cs"/>
+    <include name="Builders/ValueSourceProvider.cs"/>
+    <include name="Extensibility/DataPointProviders.cs"/>
+    <include name="Extensibility/EventListenerCollection.cs"/>
+    <include name="Extensibility/FrameworkRegistry.cs"/>
+    <include name="Extensibility/SuiteBuilderCollection.cs"/>
+    <include name="Extensibility/TestCaseProviders.cs"/>
+    <include name="Extensibility/TestCaseBuilderCollection.cs"/>
+    <include name="Extensibility/TestDecoratorCollection.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.lib.dir}/nunit.core.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+    <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="618,1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <references>
+	<include name="System.Configuration.dll"/>
+    <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitCore/core">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="summary.xslt"/>    <!-- and this -->
+        <include name="nunit.core.dll.csproj"/>
+        <include name="nunit.core.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/NUnitCore/core/nunit.core.dll.csproj b/src/NUnitCore/core/nunit.core.dll.csproj
index 2c1e6c4..ab89b2f 100644
--- a/src/NUnitCore/core/nunit.core.dll.csproj
+++ b/src/NUnitCore/core/nunit.core.dll.csproj
@@ -1,214 +1,235 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.core</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Core</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <PublishUrl>http://localhost/nunit.core/</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Web</InstallFrom>
-    <UpdateEnabled>true</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <IsWebBootstrapper>true</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <Reference Include="System.Configuration" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AbstractTestCaseDecoration.cs" />
-    <Compile Include="AssemblyHelper.cs" />
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="AssemblyReader.cs" />
-    <Compile Include="AssemblyResolver.cs" />
-    <Compile Include="ActionsHelper.cs" />
-    <Compile Include="Builders\CombinatorialStrategy.cs" />
-    <Compile Include="Builders\CombinatorialTestCaseProvider.cs" />
-    <Compile Include="Builders\CombiningStrategy.cs" />
-    <Compile Include="Builders\DatapointProvider.cs" />
-    <Compile Include="Builders\InlineDataPointProvider.cs" />
-    <Compile Include="Builders\LegacySuiteBuilder.cs" />
-    <Compile Include="Builders\NUnitTestCaseBuilder.cs" />
-    <Compile Include="Builders\NUnitTestFixtureBuilder.cs" />
-    <Compile Include="Builders\PairwiseStrategy.cs" />
-    <Compile Include="Builders\ProviderCache.cs" />
-    <Compile Include="Builders\ProviderInfo.cs" />
-    <Compile Include="Builders\SequentialStrategy.cs" />
-    <Compile Include="Builders\SetUpFixtureBuilder.cs" />
-    <Compile Include="Builders\TestAssemblyBuilder.cs" />
-    <Compile Include="Builders\TestCaseParameterProvider.cs" />
-    <Compile Include="Builders\TestCaseSourceProvider.cs" />
-    <Compile Include="Builders\ValueSourceProvider.cs" />
-    <Compile Include="ContextDictionary.cs" />
-    <Compile Include="CoreExtensions.cs" />
-    <Compile Include="CultureDetector.cs" />
-    <Compile Include="DirectorySwapper.cs" />
-    <Compile Include="DomainAgent.cs" />
-    <Compile Include="EventListenerTextWriter.cs" />
-    <Compile Include="EventPump.cs" />
-    <Compile Include="EventQueue.cs" />
-    <Compile Include="ExpectedExceptionProcessor.cs" />
-    <Compile Include="Extensibility\DataPointProviders.cs" />
-    <Compile Include="Extensibility\EventListenerCollection.cs" />
-    <Compile Include="Extensibility\FrameworkRegistry.cs" />
-    <Compile Include="Extensibility\SuiteBuilderCollection.cs" />
-    <Compile Include="Extensibility\TestCaseBuilderCollection.cs" />
-    <Compile Include="Extensibility\TestCaseProviders.cs" />
-    <Compile Include="Extensibility\TestDecoratorCollection.cs" />
-    <Compile Include="ExtensionHost.cs" />
-    <Compile Include="ExtensionPoint.cs" />
-    <Compile Include="IgnoreDecorator.cs" />
-    <Compile Include="InternalTrace.cs" />
-    <Compile Include="InternalTraceWriter.cs" />
-    <Compile Include="InvalidSuiteException.cs" />
-    <Compile Include="InvalidTestFixtureException.cs" />
-    <Compile Include="LegacySuite.cs" />
-    <Compile Include="Log4NetCapture.cs" />
-    <Compile Include="Logger.cs" />
-    <Compile Include="MethodHelper.cs" />
-    <Compile Include="NamespaceSuite.cs" />
-    <Compile Include="NamespaceTreeBuilder.cs" />
-    <Compile Include="NoTestFixturesException.cs" />
-    <Compile Include="NullListener.cs" />
-    <Compile Include="NUnitConfiguration.cs" />
-    <Compile Include="NUnitException.cs" />
-    <Compile Include="NUnitFramework.cs" />
-    <Compile Include="NUnitTestFixture.cs" />
-    <Compile Include="NUnitTestMethod.cs" />
-    <Compile Include="ParameterizedFixtureSuite.cs" />
-    <Compile Include="ParameterizedTestMethodSuite.cs" />
-    <Compile Include="PlatformHelper.cs" />
-    <Compile Include="ProjectRootSuite.cs" />
-    <Compile Include="ProxyTestRunner.cs" />
-    <Compile Include="QueuingEventListener.cs" />
-    <Compile Include="Reflect.cs" />
-    <Compile Include="RemoteTestRunner.cs" />
-    <Compile Include="SetUpFixture.cs" />
-    <Compile Include="SimpleTestRunner.cs" />
-    <Compile Include="StringTextWriter.cs" />
-    <Compile Include="SuiteBuilderAttribute.cs" />
-    <Compile Include="TestAction.cs" />
-    <Compile Include="TestAssembly.cs" />
-    <Compile Include="TestBuilderAttribute.cs" />
-    <Compile Include="TestCaseBuilderAttribute.cs" />
-    <Compile Include="TestDecoratorAttribute.cs" />
-    <Compile Include="TestExecutionContext.cs" />
-    <Compile Include="TestFixture.cs" />
-    <Compile Include="TestFixtureBuilder.cs" />
-    <Compile Include="TestMethod.cs" />
-    <Compile Include="TestRunnerThread.cs" />
-    <Compile Include="TestSuite.cs" />
-    <Compile Include="TestSuiteBuilder.cs" />
-    <Compile Include="TestThread.cs" />
-    <Compile Include="TextCapture.cs" />
-    <Compile Include="ThreadedTestRunner.cs" />
-    <Compile Include="ThreadUtility.cs" />
-    <Compile Include="TypeHelper.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.core.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.core</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Core</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>http://localhost/nunit.core/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <Reference Include="System.Configuration" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <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>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\NUnitFramework\framework\AsyncInvocationRegion.cs">
+      <Link>AsyncInvocationRegion.cs</Link>
+    </Compile>
+    <Compile Include="..\..\NUnitFramework\framework\AsyncSynchronizationContext.cs">
+      <Link>AsyncSynchronizationContext.cs</Link>
+    </Compile>
+    <Compile Include="AbstractTestCaseDecoration.cs" />
+    <Compile Include="AssemblyHelper.cs" />
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="AssemblyReader.cs" />
+    <Compile Include="AssemblyResolver.cs" />
+    <Compile Include="ActionsHelper.cs" />
+    <Compile Include="Builders\CombinatorialStrategy.cs" />
+    <Compile Include="Builders\CombinatorialTestCaseProvider.cs" />
+    <Compile Include="Builders\CombiningStrategy.cs" />
+    <Compile Include="Builders\DatapointProvider.cs" />
+    <Compile Include="Builders\InlineDataPointProvider.cs" />
+    <Compile Include="Builders\LegacySuiteBuilder.cs" />
+    <Compile Include="Builders\NUnitTestCaseBuilder.cs" />
+    <Compile Include="Builders\NUnitTestFixtureBuilder.cs" />
+    <Compile Include="Builders\PairwiseStrategy.cs" />
+    <Compile Include="Builders\ProviderCache.cs" />
+    <Compile Include="Builders\ProviderInfo.cs" />
+    <Compile Include="Builders\SequentialStrategy.cs" />
+    <Compile Include="Builders\SetUpFixtureBuilder.cs" />
+    <Compile Include="Builders\TestAssemblyBuilder.cs" />
+    <Compile Include="Builders\TestCaseParameterProvider.cs" />
+    <Compile Include="Builders\TestCaseSourceProvider.cs" />
+    <Compile Include="Builders\ValueSourceProvider.cs" />
+    <Compile Include="ContextDictionary.cs" />
+    <Compile Include="CoreExtensions.cs" />
+    <Compile Include="CultureDetector.cs" />
+    <Compile Include="DirectorySwapper.cs" />
+    <Compile Include="DomainAgent.cs" />
+    <Compile Include="EventListenerTextWriter.cs" />
+    <Compile Include="EventPump.cs" />
+    <Compile Include="EventQueue.cs" />
+    <Compile Include="ExpectedExceptionProcessor.cs" />
+    <Compile Include="Extensibility\DataPointProviders.cs" />
+    <Compile Include="Extensibility\EventListenerCollection.cs" />
+    <Compile Include="Extensibility\FrameworkRegistry.cs" />
+    <Compile Include="Extensibility\SuiteBuilderCollection.cs" />
+    <Compile Include="Extensibility\TestCaseBuilderCollection.cs" />
+    <Compile Include="Extensibility\TestCaseProviders.cs" />
+    <Compile Include="Extensibility\TestDecoratorCollection.cs" />
+    <Compile Include="ExtensionHost.cs" />
+    <Compile Include="ExtensionPoint.cs" />
+    <Compile Include="IgnoreDecorator.cs" />
+    <Compile Include="InternalTrace.cs" />
+    <Compile Include="InternalTraceWriter.cs" />
+    <Compile Include="InvalidSuiteException.cs" />
+    <Compile Include="InvalidTestFixtureException.cs" />
+    <Compile Include="LegacySuite.cs" />
+    <Compile Include="Log4NetCapture.cs" />
+    <Compile Include="Logger.cs" />
+    <Compile Include="MethodHelper.cs" />
+    <Compile Include="NamespaceSuite.cs" />
+    <Compile Include="NamespaceTreeBuilder.cs" />
+    <Compile Include="NoTestFixturesException.cs" />
+    <Compile Include="NullListener.cs" />
+    <Compile Include="NUnitAsyncTestMethod.cs" />
+    <Compile Include="NUnitConfiguration.cs" />
+    <Compile Include="NUnitException.cs" />
+    <Compile Include="NUnitFramework.cs" />
+    <Compile Include="NUnitTestFixture.cs" />
+    <Compile Include="NUnitTestMethod.cs" />
+    <Compile Include="ParameterizedFixtureSuite.cs" />
+    <Compile Include="ParameterizedTestMethodSuite.cs" />
+    <Compile Include="PlatformHelper.cs" />
+    <Compile Include="ProjectRootSuite.cs" />
+    <Compile Include="ProxyTestRunner.cs" />
+    <Compile Include="QueuingEventListener.cs" />
+    <Compile Include="Reflect.cs" />
+    <Compile Include="RemoteTestRunner.cs" />
+    <Compile Include="SetUpFixture.cs" />
+    <Compile Include="SimpleTestRunner.cs" />
+    <Compile Include="StringTextWriter.cs" />
+    <Compile Include="SuiteBuilderAttribute.cs" />
+    <Compile Include="TestAction.cs" />
+    <Compile Include="TestAssembly.cs" />
+    <Compile Include="TestBuilderAttribute.cs" />
+    <Compile Include="TestCaseBuilderAttribute.cs" />
+    <Compile Include="TestDecoratorAttribute.cs" />
+    <Compile Include="TestExecutionContext.cs" />
+    <Compile Include="TestFixture.cs" />
+    <Compile Include="TestFixtureBuilder.cs" />
+    <Compile Include="TestMethod.cs" />
+    <Compile Include="TestRunnerThread.cs" />
+    <Compile Include="TestSuite.cs" />
+    <Compile Include="TestSuiteBuilder.cs" />
+    <Compile Include="TestThread.cs" />
+    <Compile Include="TextCapture.cs" />
+    <Compile Include="ThreadedTestRunner.cs" />
+    <Compile Include="ThreadUtility.cs" />
+    <Compile Include="TypeHelper.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.build">
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitCore/interfaces/AssemblyInfo.cs b/src/NUnitCore/interfaces/AssemblyInfo.cs
index d08af6e..15ee288 100644
--- a/src/NUnitCore/interfaces/AssemblyInfo.cs
+++ b/src/NUnitCore/interfaces/AssemblyInfo.cs
@@ -1,14 +1,14 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: CLSCompliant(true)]
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+[assembly: CLSCompliant(true)]
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitCore/interfaces/EventListener.cs b/src/NUnitCore/interfaces/EventListener.cs
index dfd5dba..eb8ded5 100644
--- a/src/NUnitCore/interfaces/EventListener.cs
+++ b/src/NUnitCore/interfaces/EventListener.cs
@@ -1,75 +1,75 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-
-	/// <summary>
-	/// The EventListener interface is used within the NUnit core to receive 
-	/// notifications of significant events while a test is being run. These
-	/// events are propogated to any client, which may choose to convert them
-	/// to .NET events or to use them directly.
-	/// </summary>
-	public interface EventListener
-	{
-		/// <summary>
-		/// Called when a test run is starting
-		/// </summary>
-		/// <param name="name">The name of the test being started</param>
-		/// <param name="testCount">The number of test cases under this test</param>
-		void RunStarted( string name, int testCount );
-
-		/// <summary>
-		/// Called when a run finishes normally
-		/// </summary>
-		/// <param name="result">The result of the test</param>
-		void RunFinished( TestResult result );
-
-		/// <summary>
-		/// Called when a run is terminated due to an exception
-		/// </summary>
-		/// <param name="exception">Exception that was thrown</param>
-		void RunFinished( Exception exception );
-
-		/// <summary>
-		/// Called when a test case is starting
-		/// </summary>
-		/// <param name="testName">The name of the test case</param>
-		void TestStarted(TestName testName);
-			
-		/// <summary>
-		/// Called when a test case has finished
-		/// </summary>
-		/// <param name="result">The result of the test</param>
-		void TestFinished(TestResult result);
-
-		/// <summary>
-		/// Called when a suite is starting
-		/// </summary>
-		/// <param name="testName">The name of the suite</param>
-		void SuiteStarted(TestName testName);
-
-		/// <summary>
-		/// Called when a suite has finished
-		/// </summary>
-		/// <param name="result">The result of the suite</param>
-		void SuiteFinished(TestResult result);
-
-		/// <summary>
-		/// Called when an unhandled exception is detected during
-		/// the execution of a test run.
-		/// </summary>
-		/// <param name="exception">The exception thta was detected</param>
-		void UnhandledException( Exception exception );
-
-		/// <summary>
-		/// Called when the test direts output to the console.
-		/// </summary>
-		/// <param name="testOutput">A console message</param>
-		void TestOutput(TestOutput testOutput);
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+
+	/// <summary>
+	/// The EventListener interface is used within the NUnit core to receive 
+	/// notifications of significant events while a test is being run. These
+	/// events are propogated to any client, which may choose to convert them
+	/// to .NET events or to use them directly.
+	/// </summary>
+	public interface EventListener
+	{
+		/// <summary>
+		/// Called when a test run is starting
+		/// </summary>
+		/// <param name="name">The name of the test being started</param>
+		/// <param name="testCount">The number of test cases under this test</param>
+		void RunStarted( string name, int testCount );
+
+		/// <summary>
+		/// Called when a run finishes normally
+		/// </summary>
+		/// <param name="result">The result of the test</param>
+		void RunFinished( TestResult result );
+
+		/// <summary>
+		/// Called when a run is terminated due to an exception
+		/// </summary>
+		/// <param name="exception">Exception that was thrown</param>
+		void RunFinished( Exception exception );
+
+		/// <summary>
+		/// Called when a test case is starting
+		/// </summary>
+		/// <param name="testName">The name of the test case</param>
+		void TestStarted(TestName testName);
+			
+		/// <summary>
+		/// Called when a test case has finished
+		/// </summary>
+		/// <param name="result">The result of the test</param>
+		void TestFinished(TestResult result);
+
+		/// <summary>
+		/// Called when a suite is starting
+		/// </summary>
+		/// <param name="testName">The name of the suite</param>
+		void SuiteStarted(TestName testName);
+
+		/// <summary>
+		/// Called when a suite has finished
+		/// </summary>
+		/// <param name="result">The result of the suite</param>
+		void SuiteFinished(TestResult result);
+
+		/// <summary>
+		/// Called when an unhandled exception is detected during
+		/// the execution of a test run.
+		/// </summary>
+		/// <param name="exception">The exception thta was detected</param>
+		void UnhandledException( Exception exception );
+
+		/// <summary>
+		/// Called when the test direts output to the console.
+		/// </summary>
+		/// <param name="testOutput">A console message</param>
+		void TestOutput(TestOutput testOutput);
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/Addin.cs b/src/NUnitCore/interfaces/Extensibility/Addin.cs
index bbd754b..c855c45 100644
--- a/src/NUnitCore/interfaces/Extensibility/Addin.cs
+++ b/src/NUnitCore/interfaces/Extensibility/Addin.cs
@@ -1,133 +1,133 @@
-// ****************************************************************
-// Copyright 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.Core.Extensibility
-{
-	/// <summary>
-	/// The Addin class holds information about an addin.
-	/// </summary>
-	[Serializable]
-	public class Addin
-	{
-		#region Private Fields
-		private string typeName;
-		private string name;
-		private string description;
-		private ExtensionType extensionType;
-		private AddinStatus status;
-		private string message;
-		#endregion
-
-		#region Constructor
-		/// <summary>
-		/// Construct an Addin for a type.
-		/// </summary>
-		/// <param name="type">The type to be used</param>
-		public Addin( Type type )
-		{
-			this.typeName = type.AssemblyQualifiedName;
-
-			object[] attrs = type.GetCustomAttributes( typeof(NUnitAddinAttribute), false );
-			if ( attrs.Length == 1 )
-			{
-				NUnitAddinAttribute attr = (NUnitAddinAttribute)attrs[0];
-				this.name = attr.Name;
-				this.description = attr.Description;
-				this.extensionType = attr.Type;
-			}
-
-			if ( this.name == null )
-				this.name = type.Name;
-
-			if ( this.extensionType == 0 )
-				this.extensionType = ExtensionType.Core;
-
-			this.status = AddinStatus.Enabled;
-        }
-		#endregion
-
-		#region Properties
-		/// <summary>
-		/// The name of the Addin
-		/// </summary>
-		public string Name
-		{
-			get { return name; }
-		}
-
-		/// <summary>
-		/// Brief description of what the Addin does
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-		}
-
-		/// <summary>
-		/// The type or types of extension provided, using 
-		/// one or more members of the ExtensionType enumeration.
-		/// </summary>
-		public ExtensionType ExtensionType
-		{
-			get { return extensionType; }
-		}
-
-		/// <summary>
-		/// The AssemblyQualifiedName of the type that implements
-		/// the addin.
-		/// </summary>
-		public string TypeName
-		{
-			get { return typeName; }
-		}
-
-		/// <summary>
-		/// The status of the addin
-		/// </summary>
-		public AddinStatus Status
-		{
-			get { return status; }
-			set { status = value; }
-		}
-
-		/// <summary>
-		/// Any message that clarifies the status of the Addin,
-		/// such as an error message or an explanation of why
-		/// the addin is disabled.
-		/// </summary>
-		public string Message
-		{
-			get { return message; }
-			set { message = value; }
-		}
-		#endregion
-
-        #region Object Overrides
-        /// <summary>
-        /// Return true if two Addins have teh same type name
-        /// </summary>
-        /// <param name="obj">The other addin to be compared</param>
-        public override bool Equals(object obj)
-        {
-            Addin addin = obj as Addin;
-            if (addin == null)
-                return false;
-
-            return this.typeName.Equals(addin.typeName);
-        }
-
-        /// <summary>
-        /// Return a hash code for this addin
-        /// </summary>
-        public override int GetHashCode()
-        {
-            return this.typeName.GetHashCode();
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// The Addin class holds information about an addin.
+	/// </summary>
+	[Serializable]
+	public class Addin
+	{
+		#region Private Fields
+		private string typeName;
+		private string name;
+		private string description;
+		private ExtensionType extensionType;
+		private AddinStatus status;
+		private string message;
+		#endregion
+
+		#region Constructor
+		/// <summary>
+		/// Construct an Addin for a type.
+		/// </summary>
+		/// <param name="type">The type to be used</param>
+		public Addin( Type type )
+		{
+			this.typeName = type.AssemblyQualifiedName;
+
+			object[] attrs = type.GetCustomAttributes( typeof(NUnitAddinAttribute), false );
+			if ( attrs.Length == 1 )
+			{
+				NUnitAddinAttribute attr = (NUnitAddinAttribute)attrs[0];
+				this.name = attr.Name;
+				this.description = attr.Description;
+				this.extensionType = attr.Type;
+			}
+
+			if ( this.name == null )
+				this.name = type.Name;
+
+			if ( this.extensionType == 0 )
+				this.extensionType = ExtensionType.Core;
+
+			this.status = AddinStatus.Enabled;
+        }
+		#endregion
+
+		#region Properties
+		/// <summary>
+		/// The name of the Addin
+		/// </summary>
+		public string Name
+		{
+			get { return name; }
+		}
+
+		/// <summary>
+		/// Brief description of what the Addin does
+		/// </summary>
+		public string Description
+		{
+			get { return description; }
+		}
+
+		/// <summary>
+		/// The type or types of extension provided, using 
+		/// one or more members of the ExtensionType enumeration.
+		/// </summary>
+		public ExtensionType ExtensionType
+		{
+			get { return extensionType; }
+		}
+
+		/// <summary>
+		/// The AssemblyQualifiedName of the type that implements
+		/// the addin.
+		/// </summary>
+		public string TypeName
+		{
+			get { return typeName; }
+		}
+
+		/// <summary>
+		/// The status of the addin
+		/// </summary>
+		public AddinStatus Status
+		{
+			get { return status; }
+			set { status = value; }
+		}
+
+		/// <summary>
+		/// Any message that clarifies the status of the Addin,
+		/// such as an error message or an explanation of why
+		/// the addin is disabled.
+		/// </summary>
+		public string Message
+		{
+			get { return message; }
+			set { message = value; }
+		}
+		#endregion
+
+        #region Object Overrides
+        /// <summary>
+        /// Return true if two Addins have teh same type name
+        /// </summary>
+        /// <param name="obj">The other addin to be compared</param>
+        public override bool Equals(object obj)
+        {
+            Addin addin = obj as Addin;
+            if (addin == null)
+                return false;
+
+            return this.typeName.Equals(addin.typeName);
+        }
+
+        /// <summary>
+        /// Return a hash code for this addin
+        /// </summary>
+        public override int GetHashCode()
+        {
+            return this.typeName.GetHashCode();
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs b/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs
index 601504f..d864934 100644
--- a/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs
+++ b/src/NUnitCore/interfaces/Extensibility/AddinStatus.cs
@@ -1,36 +1,36 @@
-// ****************************************************************
-// Copyright 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.Core.Extensibility
-{
-	/// <summary>
-	/// The AddinStatus enum indicates the load status of an addin.
-	/// </summary>
-    public enum AddinStatus
-    {
-		/// <summary>
-		/// Not known - default
-		/// </summary>
-        Unknown,
-		/// <summary>
-		/// The addin is enabled but not loaded
-		/// </summary>
-        Enabled,
-		/// <summary>
-		/// The addin is disabled
-		/// </summary>
-        Disabled,
-		/// <summary>
-		/// The addin was loaded successfully
-		/// </summary>
-        Loaded,
-		/// <summary>
-		/// An error was encountered loading the addin
-		/// </summary>
-        Error
-    }
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// The AddinStatus enum indicates the load status of an addin.
+	/// </summary>
+    public enum AddinStatus
+    {
+		/// <summary>
+		/// Not known - default
+		/// </summary>
+        Unknown,
+		/// <summary>
+		/// The addin is enabled but not loaded
+		/// </summary>
+        Enabled,
+		/// <summary>
+		/// The addin is disabled
+		/// </summary>
+        Disabled,
+		/// <summary>
+		/// The addin was loaded successfully
+		/// </summary>
+        Loaded,
+		/// <summary>
+		/// An error was encountered loading the addin
+		/// </summary>
+        Error
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs b/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs
index aafbcdc..01e9172 100644
--- a/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ExtensionType.cs
@@ -1,35 +1,35 @@
-// ****************************************************************
-// Copyright 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.Core.Extensibility
-{
-	/// <summary>
-	/// The ExtensionType enumeration is used to indicate the
-	/// kinds of extensions provided by an Addin. The addin
-	/// is only installed by hosts supporting one of its
-	/// extension types.
-	/// </summary>
-	[Flags]
-	public enum ExtensionType
-	{
-		/// <summary>
-		/// A Core extension is installed by the CoreExtensions
-		/// host in each test domain.
-		/// </summary>
-		Core=1,
-
-		/// <summary>
-		/// A Client extension is installed by all clients
-		/// </summary>
-		Client=2,
-
-		/// <summary>
-		/// A Gui extension is installed by the gui client
-		/// </summary>
-		Gui=4
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// The ExtensionType enumeration is used to indicate the
+	/// kinds of extensions provided by an Addin. The addin
+	/// is only installed by hosts supporting one of its
+	/// extension types.
+	/// </summary>
+	[Flags]
+	public enum ExtensionType
+	{
+		/// <summary>
+		/// A Core extension is installed by the CoreExtensions
+		/// host in each test domain.
+		/// </summary>
+		Core=1,
+
+		/// <summary>
+		/// A Client extension is installed by all clients
+		/// </summary>
+		Client=2,
+
+		/// <summary>
+		/// A Gui extension is installed by the gui client
+		/// </summary>
+		Gui=4
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IAddin.cs b/src/NUnitCore/interfaces/Extensibility/IAddin.cs
index 1e355d6..9c8bcc6 100644
--- a/src/NUnitCore/interfaces/Extensibility/IAddin.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IAddin.cs
@@ -1,29 +1,29 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// Add-ins are used to extend NUnti. All add-ins must
-	/// implement the IAddin interface.
-	/// </summary>
-	public interface IAddin
-	{
-		/// <summary>
-		/// When called, the add-in installs itself into
-		/// the host, if possible. Because NUnit uses separate
-		/// hosts for the client and test domain environments,
-		/// an add-in may be invited to istall itself more than
-		/// once. The add-in is responsible for checking which
-		/// extension points are supported by the host that is
-		/// passed to it and taking the appropriate action.
-		/// </summary>
-		/// <param name="host">The host in which to install the add-in</param>
-		/// <returns>True if the add-in was installed, otehrwise false</returns>
-		bool Install( IExtensionHost host );
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// Add-ins are used to extend NUnti. All add-ins must
+	/// implement the IAddin interface.
+	/// </summary>
+	public interface IAddin
+	{
+		/// <summary>
+		/// When called, the add-in installs itself into
+		/// the host, if possible. Because NUnit uses separate
+		/// hosts for the client and test domain environments,
+		/// an add-in may be invited to istall itself more than
+		/// once. The add-in is responsible for checking which
+		/// extension points are supported by the host that is
+		/// passed to it and taking the appropriate action.
+		/// </summary>
+		/// <param name="host">The host in which to install the add-in</param>
+		/// <returns>True if the add-in was installed, otehrwise false</returns>
+		bool Install( IExtensionHost host );
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs b/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs
index 5ea7a0c..12ef042 100644
--- a/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IAddinRegistry.cs
@@ -1,43 +1,43 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// The IAddinRegistry interface allows registering addins
-	/// and retrieving information about them. It is also used
-	///  to record the load status of an addin.
-	/// </summary>
-	public interface IAddinRegistry
-	{
-		/// <summary>
-		/// Gets a list of all addins as Addin objects
-		/// </summary>
-		System.Collections.IList Addins { get; }
-
-		/// <summary>
-		/// Registers an addin
-		/// </summary>
-		/// <param name="addin">The addin to be registered</param>
-		void Register( Addin addin );
-
-        /// <summary>
-        /// Returns true if an addin of a given name is registered
-        /// </summary>
-        /// <param name="name">The name of the addin</param>
-        /// <returns>True if an addin of that name is registered, otherwise false</returns>
-        bool IsAddinRegistered(string name);
-
-		/// <summary>
-		///  Sets the load status of an addin
-		/// </summary>
-		/// <param name="name">The name of the addin</param>
-		/// <param name="status">The status to be set</param>
-		/// <param name="message">An optional message explaining the status</param>
-		void SetStatus( string name, AddinStatus status, string message );
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// The IAddinRegistry interface allows registering addins
+	/// and retrieving information about them. It is also used
+	///  to record the load status of an addin.
+	/// </summary>
+	public interface IAddinRegistry
+	{
+		/// <summary>
+		/// Gets a list of all addins as Addin objects
+		/// </summary>
+		System.Collections.IList Addins { get; }
+
+		/// <summary>
+		/// Registers an addin
+		/// </summary>
+		/// <param name="addin">The addin to be registered</param>
+		void Register( Addin addin );
+
+        /// <summary>
+        /// Returns true if an addin of a given name is registered
+        /// </summary>
+        /// <param name="name">The name of the addin</param>
+        /// <returns>True if an addin of that name is registered, otherwise false</returns>
+        bool IsAddinRegistered(string name);
+
+		/// <summary>
+		///  Sets the load status of an addin
+		/// </summary>
+		/// <param name="name">The name of the addin</param>
+		/// <param name="status">The status to be set</param>
+		/// <param name="message">An optional message explaining the status</param>
+		void SetStatus( string name, AddinStatus status, string message );
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs b/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs
index c3ffd5a..826538a 100644
--- a/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IDataPointProvider.cs
@@ -1,62 +1,62 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-    /// <summary>
-    /// The IDataPointProvider interface is used by extensions
-    /// that provide data for a single test parameter.
-    /// </summary>
-    public interface IDataPointProvider
-    {
-        /// <summary>
-        /// Determine whether any data is available for a parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <returns>True if any data is available, otherwise false.</returns>
-        bool HasDataFor(ParameterInfo parameter);
-
-        /// <summary>
-        /// Return an IEnumerable providing data for use with the
-        /// supplied parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <returns>An IEnumerable providing the required data</returns>
-        IEnumerable GetDataFor(ParameterInfo parameter);
-    }
-
-    /// <summary>
-    /// The IDataPointProvider2 interface extends IDataPointProvider
-    /// by making the test fixture for which the test is being built
-    /// available for use.
-    /// </summary>
-    public interface IDataPointProvider2 : IDataPointProvider
-    {
-        /// <summary>
-        /// Determine whether any data is available for a parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <param name="parentSuite">The test suite for which the test is being built</param>
-        /// <returns>True if any data is available, otherwise false.</returns>
-        bool HasDataFor(ParameterInfo parameter, Test parentSuite);
-
-        /// <summary>
-        /// Return an IEnumerable providing data for use with the
-        /// supplied parameter.
-        /// </summary>
-        /// <param name="parameter">A ParameterInfo representing one
-        /// argument to a parameterized test</param>
-        /// <param name="parentSuite">The test suite for which the test is being built</param>
-        /// <returns>An IEnumerable providing the required data</returns>
-        IEnumerable GetDataFor(ParameterInfo parameter, Test parentSuite);
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    /// <summary>
+    /// The IDataPointProvider interface is used by extensions
+    /// that provide data for a single test parameter.
+    /// </summary>
+    public interface IDataPointProvider
+    {
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        bool HasDataFor(ParameterInfo parameter);
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        IEnumerable GetDataFor(ParameterInfo parameter);
+    }
+
+    /// <summary>
+    /// The IDataPointProvider2 interface extends IDataPointProvider
+    /// by making the test fixture for which the test is being built
+    /// available for use.
+    /// </summary>
+    public interface IDataPointProvider2 : IDataPointProvider
+    {
+        /// <summary>
+        /// Determine whether any data is available for a parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns>True if any data is available, otherwise false.</returns>
+        bool HasDataFor(ParameterInfo parameter, Test parentSuite);
+
+        /// <summary>
+        /// Return an IEnumerable providing data for use with the
+        /// supplied parameter.
+        /// </summary>
+        /// <param name="parameter">A ParameterInfo representing one
+        /// argument to a parameterized test</param>
+        /// <param name="parentSuite">The test suite for which the test is being built</param>
+        /// <returns>An IEnumerable providing the required data</returns>
+        IEnumerable GetDataFor(ParameterInfo parameter, Test parentSuite);
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs b/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs
index d915e59..f407346 100644
--- a/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IExtensionHost.cs
@@ -1,47 +1,47 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// The IExtensionHost interface is implemented by each
-	/// of NUnit's Extension hosts. Currently, there is
-	/// only one host, which resides in the test domain.
-	/// </summary>
-	public interface IExtensionHost
-	{
-        /// <summary>
-        /// Get a list of the ExtensionPoints provided by this host.
-        /// </summary>
-        IExtensionPoint[] ExtensionPoints
-        {
-            get;
-        }
-
-        /// <summary>
-        /// Get an interface to the framework registry
-        /// </summary>
-        [Obsolete("Use the FrameworkRegistry extension point instead")]
-        IFrameworkRegistry FrameworkRegistry
-        {
-            get;
-        }
-
-        /// <summary>
-		/// Return an extension point by name, if present
-		/// </summary>
-		/// <param name="name">The name of the extension point</param>
-		/// <returns>The extension point, if found, otherwise null</returns>
-		IExtensionPoint GetExtensionPoint( string name );
-
-        /// <summary>
-        /// Gets the ExtensionTypes supported by this host
-        /// </summary>
-        /// <returns>An enum indicating the ExtensionTypes supported</returns>
-        ExtensionType ExtensionTypes { get; }
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// The IExtensionHost interface is implemented by each
+	/// of NUnit's Extension hosts. Currently, there is
+	/// only one host, which resides in the test domain.
+	/// </summary>
+	public interface IExtensionHost
+	{
+        /// <summary>
+        /// Get a list of the ExtensionPoints provided by this host.
+        /// </summary>
+        IExtensionPoint[] ExtensionPoints
+        {
+            get;
+        }
+
+        /// <summary>
+        /// Get an interface to the framework registry
+        /// </summary>
+        [Obsolete("Use the FrameworkRegistry extension point instead")]
+        IFrameworkRegistry FrameworkRegistry
+        {
+            get;
+        }
+
+        /// <summary>
+		/// Return an extension point by name, if present
+		/// </summary>
+		/// <param name="name">The name of the extension point</param>
+		/// <returns>The extension point, if found, otherwise null</returns>
+		IExtensionPoint GetExtensionPoint( string name );
+
+        /// <summary>
+        /// Gets the ExtensionTypes supported by this host
+        /// </summary>
+        /// <returns>An enum indicating the ExtensionTypes supported</returns>
+        ExtensionType ExtensionTypes { get; }
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs b/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs
index 6c793e2..0e9ab34 100644
--- a/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IExtensionPoint.cs
@@ -1,65 +1,65 @@
-// ****************************************************************
-// Copyright 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.Core.Extensibility
-{
-    /// <summary>
-    /// Represents a single point of extension for NUnit. Some extension
-    /// points may accept only a single extension, while others may
-    /// accept more than one at the same time.
-    /// </summary>
-    public interface IExtensionPoint
-	{
-		/// <summary>
-		/// Get the name of this extension point
-		/// </summary>
-		string Name { get; }
-
-        /// <summary>
-        /// Get the host that provides this extension point
-        /// </summary>
-        IExtensionHost Host { get; }
-
-        /// <summary>
-        /// Install an extension at this extension point. If the
-        /// extension object does not meet the requirements for
-        /// this extension point, an exception is thrown.
-        /// </summary>
-        /// <param name="extension">The extension to install</param>
-        void Install(object extension);
-
-        /// <summary>
-		/// Removes an extension from this extension point. If the
-		/// extension object is not present, the method returns
-		/// without error.
-        /// </summary>
-        /// <param name="extension"></param>
-		void Remove( object extension );
-	}
-
-    /// <summary>
-    /// Represents a single point of extension for NUnit. Some extension
-    /// points may accept only a single extension, while others may
-    /// accept more than one at the same time. This interface enhances
-    /// IExtensionPoint by allowing specification of a priority
-    /// order for applying addins.
-    /// </summary>
-    public interface IExtensionPoint2 : IExtensionPoint
-    {
-        /// <summary>
-        /// Install an extension at this extension point specifying
-        /// an integer priority value for the extension.If the
-        /// extension object does not meet the requirements for
-        /// this extension point, or if the extension point does
-        /// not support the requested priority level, an exception 
-        /// is thrown.
-        /// </summary>
-        /// <param name="extension">The extension to install</param>
-        /// <param name="priority">The priority level for this extension</param>
-        void Install(object extension, int priority);
-    }
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+    /// <summary>
+    /// Represents a single point of extension for NUnit. Some extension
+    /// points may accept only a single extension, while others may
+    /// accept more than one at the same time.
+    /// </summary>
+    public interface IExtensionPoint
+	{
+		/// <summary>
+		/// Get the name of this extension point
+		/// </summary>
+		string Name { get; }
+
+        /// <summary>
+        /// Get the host that provides this extension point
+        /// </summary>
+        IExtensionHost Host { get; }
+
+        /// <summary>
+        /// Install an extension at this extension point. If the
+        /// extension object does not meet the requirements for
+        /// this extension point, an exception is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        void Install(object extension);
+
+        /// <summary>
+		/// Removes an extension from this extension point. If the
+		/// extension object is not present, the method returns
+		/// without error.
+        /// </summary>
+        /// <param name="extension"></param>
+		void Remove( object extension );
+	}
+
+    /// <summary>
+    /// Represents a single point of extension for NUnit. Some extension
+    /// points may accept only a single extension, while others may
+    /// accept more than one at the same time. This interface enhances
+    /// IExtensionPoint by allowing specification of a priority
+    /// order for applying addins.
+    /// </summary>
+    public interface IExtensionPoint2 : IExtensionPoint
+    {
+        /// <summary>
+        /// Install an extension at this extension point specifying
+        /// an integer priority value for the extension.If the
+        /// extension object does not meet the requirements for
+        /// this extension point, or if the extension point does
+        /// not support the requested priority level, an exception 
+        /// is thrown.
+        /// </summary>
+        /// <param name="extension">The extension to install</param>
+        /// <param name="priority">The priority level for this extension</param>
+        void Install(object extension, int priority);
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs b/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs
index d5262dd..5d3b84d 100644
--- a/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs
+++ b/src/NUnitCore/interfaces/Extensibility/IFrameworkRegistry.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// The IFrameworkRegistry allows extensions to register new
-	/// frameworks or emulations of other frameworks.
-	/// </summary>
-	public interface IFrameworkRegistry
-	{
-		/// <summary>
-		/// Register a framework
-		/// </summary>
-		/// <param name="frameworkName">The name of the framework</param>
-		/// <param name="assemblyName">The name of the assembly that the tests reference</param>
-		void Register( string frameworkName, string assemblyName );
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// The IFrameworkRegistry allows extensions to register new
+	/// frameworks or emulations of other frameworks.
+	/// </summary>
+	public interface IFrameworkRegistry
+	{
+		/// <summary>
+		/// Register a framework
+		/// </summary>
+		/// <param name="frameworkName">The name of the framework</param>
+		/// <param name="assemblyName">The name of the assembly that the tests reference</param>
+		void Register( string frameworkName, string assemblyName );
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs b/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs
index 096006a..9a7faee 100644
--- a/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ISuiteBuilder.cs
@@ -1,37 +1,37 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// The ISuiteBuilder interface is exposed by a class that knows how to
-	/// build a suite from one or more Types. 
-	/// </summary>
-	public interface ISuiteBuilder
-	{
-		/// <summary>
-		/// Examine the type and determine if it is suitable for
-		/// this builder to use in building a TestSuite.
-        /// 
-        /// Note that returning false will cause the type to be ignored 
-        /// in loading the tests. If it is desired to load the suite
-        /// but label it as non-runnable, ignored, etc., then this
-        /// method must return true.
-        /// </summary>
-		/// <param name="type">The type of the fixture to be used</param>
-		/// <returns>True if the type can be used to build a TestSuite</returns>
-		bool CanBuildFrom( Type type );
-
-		/// <summary>
-		/// Build a TestSuite from type provided.
-		/// </summary>
-		/// <param name="type">The type of the fixture to be used</param>
-		/// <returns>A TestSuite</returns>
-		Test BuildFrom( Type type );
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// The ISuiteBuilder interface is exposed by a class that knows how to
+	/// build a suite from one or more Types. 
+	/// </summary>
+	public interface ISuiteBuilder
+	{
+		/// <summary>
+		/// Examine the type and determine if it is suitable for
+		/// this builder to use in building a TestSuite.
+        /// 
+        /// Note that returning false will cause the type to be ignored 
+        /// in loading the tests. If it is desired to load the suite
+        /// but label it as non-runnable, ignored, etc., then this
+        /// method must return true.
+        /// </summary>
+		/// <param name="type">The type of the fixture to be used</param>
+		/// <returns>True if the type can be used to build a TestSuite</returns>
+		bool CanBuildFrom( Type type );
+
+		/// <summary>
+		/// Build a TestSuite from type provided.
+		/// </summary>
+		/// <param name="type">The type of the fixture to be used</param>
+		/// <returns>A TestSuite</returns>
+		Test BuildFrom( Type type );
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs b/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs
index 654fe3b..7179a9e 100644
--- a/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ITestCaseBuilder.cs
@@ -1,70 +1,70 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// The ITestCaseBuilder interface is exposed by a class that knows how to
-	/// build a test case from certain methods. 
-	/// </summary>
-	public interface ITestCaseBuilder
-	{
-        /// <summary>
-        /// Examine the method and determine if it is suitable for
-        /// this builder to use in building a TestCase.
-        /// 
-        /// Note that returning false will cause the method to be ignored 
-        /// in loading the tests. If it is desired to load the method
-        /// but label it as non-runnable, ignored, etc., then this
-        /// method must return true.
-        /// </summary>
-        /// <param name="method">The test method to examine</param>
-        /// <returns>True is the builder can use this method</returns>
-        bool CanBuildFrom(MethodInfo method);
-
-        /// <summary>
-        /// Build a TestCase from the provided MethodInfo.
-        /// </summary>
-        /// <param name="method">The method to be used as a test case</param>
-        /// <returns>A TestCase or null</returns>
-        Test BuildFrom(MethodInfo method);
-    }
-
-    /// <summary>
-    /// ITestCaseBuilder2 extends ITestCaseBuilder with methods
-    /// that include the suite for which the test case is being
-    /// built. Test case builders not needing the suite can
-    /// continue to implement ITestCaseBuilder.
-    /// </summary>
-    public interface ITestCaseBuilder2 : ITestCaseBuilder
-    {
-        /// <summary>
-        /// Examine the method and determine if it is suitable for
-        /// this builder to use in building a TestCase to be
-        /// included in the suite being populated.
-        /// 
-        /// Note that returning false will cause the method to be ignored 
-        /// in loading the tests. If it is desired to load the method
-        /// but label it as non-runnable, ignored, etc., then this
-        /// method must return true.
-        /// </summary>
-        /// <param name="method">The test method to examine</param>
-        /// <param name="suite">The suite being populated</param>
-        /// <returns>True is the builder can use this method</returns>
-        bool CanBuildFrom(MethodInfo method, Test suite);
-
-        /// <summary>
-        /// Build a TestCase from the provided MethodInfo for
-        /// inclusion in the suite being constructed.
-        /// </summary>
-        /// <param name="method">The method to be used as a test case</param>
-        /// <param name="suite">The test suite being populated, or null</param>
-        /// <returns>A TestCase or null</returns>
-        Test BuildFrom(MethodInfo method, Test suite);
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// The ITestCaseBuilder interface is exposed by a class that knows how to
+	/// build a test case from certain methods. 
+	/// </summary>
+	public interface ITestCaseBuilder
+	{
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// this builder to use in building a TestCase.
+        /// 
+        /// Note that returning false will cause the method to be ignored 
+        /// in loading the tests. If it is desired to load the method
+        /// but label it as non-runnable, ignored, etc., then this
+        /// method must return true.
+        /// </summary>
+        /// <param name="method">The test method to examine</param>
+        /// <returns>True is the builder can use this method</returns>
+        bool CanBuildFrom(MethodInfo method);
+
+        /// <summary>
+        /// Build a TestCase from the provided MethodInfo.
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <returns>A TestCase or null</returns>
+        Test BuildFrom(MethodInfo method);
+    }
+
+    /// <summary>
+    /// ITestCaseBuilder2 extends ITestCaseBuilder with methods
+    /// that include the suite for which the test case is being
+    /// built. Test case builders not needing the suite can
+    /// continue to implement ITestCaseBuilder.
+    /// </summary>
+    public interface ITestCaseBuilder2 : ITestCaseBuilder
+    {
+        /// <summary>
+        /// Examine the method and determine if it is suitable for
+        /// this builder to use in building a TestCase to be
+        /// included in the suite being populated.
+        /// 
+        /// Note that returning false will cause the method to be ignored 
+        /// in loading the tests. If it is desired to load the method
+        /// but label it as non-runnable, ignored, etc., then this
+        /// method must return true.
+        /// </summary>
+        /// <param name="method">The test method to examine</param>
+        /// <param name="suite">The suite being populated</param>
+        /// <returns>True is the builder can use this method</returns>
+        bool CanBuildFrom(MethodInfo method, Test suite);
+
+        /// <summary>
+        /// Build a TestCase from the provided MethodInfo for
+        /// inclusion in the suite being constructed.
+        /// </summary>
+        /// <param name="method">The method to be used as a test case</param>
+        /// <param name="suite">The test suite being populated, or null</param>
+        /// <returns>A TestCase or null</returns>
+        Test BuildFrom(MethodInfo method, Test suite);
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs b/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs
index ea84061..f64a98d 100644
--- a/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ITestCaseProvider.cs
@@ -1,60 +1,60 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-    /// <summary>
-    /// The ITestCaseProvider interface is used by extensions
-    /// that provide data for parameterized tests, along with
-    /// certain flags and other indicators used in the test.
-    /// </summary>
-    public interface ITestCaseProvider
-    {
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        bool HasTestCasesFor(MethodInfo method);
-
-        /// <summary>
-        /// Return an IEnumerable providing test cases for use in
-        /// running a paramterized test.
-        /// </summary>
-        /// <param name="method"></param>
-        /// <returns></returns>
-        IEnumerable GetTestCasesFor(MethodInfo method);
-    }
-
-    /// <summary>
-    /// ITestCaseProvider2 extends ITestCaseProvider with methods
-    /// that include the suite for which the test case is being
-    /// built. TestCaseProviders not needing the suite can
-    /// continue to implement ITestCaseBuilder.
-    /// </summary>
-    public interface ITestCaseProvider2 : ITestCaseProvider
-    {
-        /// <summary>
-        /// Determine whether any test cases are available for a parameterized method.
-        /// </summary>
-        /// <param name="method">A MethodInfo representing a parameterized test</param>
-        /// <param name="suite">The suite for which the test case is being built</param>
-        /// <returns>True if any cases are available, otherwise false.</returns>
-        bool HasTestCasesFor(MethodInfo method, Test suite);
-
-        /// <summary>
-        /// Return an IEnumerable providing test cases for use in
-        /// running a paramterized test.
-        /// </summary>
-        /// <param name="method"></param>
-        /// <param name="suite">The suite for which the test case is being built</param>
-        /// <returns></returns>
-        IEnumerable GetTestCasesFor(MethodInfo method, Test suite);
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    /// <summary>
+    /// The ITestCaseProvider interface is used by extensions
+    /// that provide data for parameterized tests, along with
+    /// certain flags and other indicators used in the test.
+    /// </summary>
+    public interface ITestCaseProvider
+    {
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        bool HasTestCasesFor(MethodInfo method);
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        IEnumerable GetTestCasesFor(MethodInfo method);
+    }
+
+    /// <summary>
+    /// ITestCaseProvider2 extends ITestCaseProvider with methods
+    /// that include the suite for which the test case is being
+    /// built. TestCaseProviders not needing the suite can
+    /// continue to implement ITestCaseBuilder.
+    /// </summary>
+    public interface ITestCaseProvider2 : ITestCaseProvider
+    {
+        /// <summary>
+        /// Determine whether any test cases are available for a parameterized method.
+        /// </summary>
+        /// <param name="method">A MethodInfo representing a parameterized test</param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns>True if any cases are available, otherwise false.</returns>
+        bool HasTestCasesFor(MethodInfo method, Test suite);
+
+        /// <summary>
+        /// Return an IEnumerable providing test cases for use in
+        /// running a paramterized test.
+        /// </summary>
+        /// <param name="method"></param>
+        /// <param name="suite">The suite for which the test case is being built</param>
+        /// <returns></returns>
+        IEnumerable GetTestCasesFor(MethodInfo method, Test suite);
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs b/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs
index 78d3cb5..ae73f1b 100644
--- a/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ITestDecorator.cs
@@ -1,54 +1,54 @@
-// ****************************************************************
-// Copyright 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.Core.Extensibility
-{
-	/// <summary>
-	/// DecoratorPriority wraps constants that may be used
-    /// to represent the relative priority of TestDecorators.
-    /// Decorators with a lower priority are applied first
-    /// so that higher priority decorators wrap them.
-    /// 
-    /// NOTE: This feature is subject to change.
-	/// </summary>
-    public class DecoratorPriority
-	{
-	    /// <summary>
-	    /// The default priority, equivalent to Normal
-	    /// </summary>
-        public static readonly int Default = 0;
-        /// <summary>
-        /// Priority for Decorators that must apply first 
-        /// </summary>
-		public static readonly int First = 1;
-        /// <summary>
-        /// Normal Decorator priority
-        /// </summary>
-		public static readonly int Normal = 5;
-        /// <summary>
-        /// Priority for Decorators that must apply last
-        /// </summary>
-	    public static readonly int Last = 9;
-	}
-
-	/// <summary>
-	/// The ITestDecorator interface is exposed by a class that knows how to
-	/// enhance the functionality of a test case or suite by decorating it.
-	/// </summary>
-	public interface ITestDecorator
-	{
-		/// <summary>
-		/// Examine the a Test and either return it as is, modify it
-		/// or return a different TestCase.
-		/// </summary>
-		/// <param name="test">The Test to be decorated</param>
-		/// <param name="member">The MethodInfo used to construct the test</param>
-		/// <returns>The resulting Test</returns>
-		Test Decorate( Test test, MemberInfo member );
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// DecoratorPriority wraps constants that may be used
+    /// to represent the relative priority of TestDecorators.
+    /// Decorators with a lower priority are applied first
+    /// so that higher priority decorators wrap them.
+    /// 
+    /// NOTE: This feature is subject to change.
+	/// </summary>
+    public class DecoratorPriority
+	{
+	    /// <summary>
+	    /// The default priority, equivalent to Normal
+	    /// </summary>
+        public static readonly int Default = 0;
+        /// <summary>
+        /// Priority for Decorators that must apply first 
+        /// </summary>
+		public static readonly int First = 1;
+        /// <summary>
+        /// Normal Decorator priority
+        /// </summary>
+		public static readonly int Normal = 5;
+        /// <summary>
+        /// Priority for Decorators that must apply last
+        /// </summary>
+	    public static readonly int Last = 9;
+	}
+
+	/// <summary>
+	/// The ITestDecorator interface is exposed by a class that knows how to
+	/// enhance the functionality of a test case or suite by decorating it.
+	/// </summary>
+	public interface ITestDecorator
+	{
+		/// <summary>
+		/// Examine the a Test and either return it as is, modify it
+		/// or return a different TestCase.
+		/// </summary>
+		/// <param name="test">The Test to be decorated</param>
+		/// <param name="member">The MethodInfo used to construct the test</param>
+		/// <returns>The resulting Test</returns>
+		Test Decorate( Test test, MemberInfo member );
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs b/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs
index bccd6ca..42670af 100644
--- a/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs
+++ b/src/NUnitCore/interfaces/Extensibility/NUnitAddinAttribute.cs
@@ -1,40 +1,40 @@
-// ****************************************************************
-// Copyright 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.Core.Extensibility
-{
-	/// <summary>
-	/// NUnitAddinAttribute is used to mark all add-ins. The marked class
-	/// must implement the IAddin interface.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)]
-	public sealed class NUnitAddinAttribute : Attribute
-	{
-        /// <summary>
-        /// The name of this addin
-        /// </summary>
-		public string Name;
-
-        /// <summary>
-        /// A description for the addin
-        /// </summary>
-		public string Description;
-
-        /// <summary>
-        /// The type of extension provided
-        /// </summary>
-		public ExtensionType Type;
-
-        /// <summary>
-        /// Default Constructor
-        /// </summary>
-		public NUnitAddinAttribute()
-		{
-			this.Type = ExtensionType.Core;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Extensibility
+{
+	/// <summary>
+	/// NUnitAddinAttribute is used to mark all add-ins. The marked class
+	/// must implement the IAddin interface.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=false)]
+	public sealed class NUnitAddinAttribute : Attribute
+	{
+        /// <summary>
+        /// The name of this addin
+        /// </summary>
+		public string Name;
+
+        /// <summary>
+        /// A description for the addin
+        /// </summary>
+		public string Description;
+
+        /// <summary>
+        /// The type of extension provided
+        /// </summary>
+		public ExtensionType Type;
+
+        /// <summary>
+        /// Default Constructor
+        /// </summary>
+		public NUnitAddinAttribute()
+		{
+			this.Type = ExtensionType.Core;
+		}
+	}
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs b/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
index 84915ee..e136b8b 100644
--- a/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
+++ b/src/NUnitCore/interfaces/Extensibility/ParameterSet.cs
@@ -1,355 +1,355 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Reflection;
-
-namespace NUnit.Core.Extensibility
-{
-    /// <summary>
-    /// ParameterSet encapsulates method arguments and
-    /// other selected parameters needed for constructing
-    /// a parameterized test case.
-    /// </summary>
-    public class ParameterSet : NUnit.Framework.ITestCaseData
-    {
-        #region Constants
-
-        private static readonly string DESCRIPTION = "_DESCRIPTION";
-        //private static readonly string IGNOREREASON = "_IGNOREREASON";
-        private static readonly string CATEGORIES = "_CATEGORIES";
-
-        #endregion
-
-        #region Instance Fields
-
-        private RunState runState;
-        private Exception providerException;
-        private object[] arguments;
-        private object[] originalArguments;
-        private System.Type expectedExceptionType;
-        private string expectedExceptionName;
-        private string expectedMessage;
-        private string matchType;
-        private object expectedResult;
-        private string testName;
-        private string ignoreReason;
-        private bool isIgnored;
-        private bool isExplicit;
-        private bool hasExpectedResult;
-
-        /// <summary>
-        /// A dictionary of properties, used to add information
-        /// to tests without requiring the class to change.
-        /// </summary>
-        private IDictionary properties;
-
-        #endregion
-
-        #region Properties
-        /// <summary>
-        /// The RunState for this set of parameters.
-        /// </summary>
-        public RunState RunState
-        {
-            get { return runState; }
-            set { runState = value; }
-        }
-
-        ///// <summary>
-        ///// The reason for not running the test case
-        ///// represented by this ParameterSet
-        ///// </summary>
-        //public string NotRunReason
-        //{
-        //    get { return (string) Properties[IGNOREREASON]; }
-        //}
-
-        /// <summary>
-        /// Holds any exception thrown by the parameter provider
-        /// </summary>
-        public Exception ProviderException
-        {
-            get { return providerException; }
-        }
-
-        /// <summary>
-        /// The arguments to be used in running the test,
-        /// which must match the method signature.
-        /// </summary>
-        public object[] Arguments
-        {
-            get { return arguments; }
-            set 
-            {
-                arguments = value;
-
-                if (originalArguments == null)
-                    originalArguments = value;
-            }
-        }
-
-        /// <summary>
-        /// The original arguments supplied by the user,
-        /// used for display purposes.
-        /// </summary>
-        public object[] OriginalArguments
-        {
-            get { return originalArguments; }
-        }
-
-        /// <summary>
-        /// The Type of any exception that is expected.
-        /// </summary>
-        public System.Type ExpectedException
-        {
-            get { return expectedExceptionType; }
-            set { expectedExceptionType = value; }
-        }
-
-        /// <summary>
-        /// The FullName of any exception that is expected
-        /// </summary>
-        public string ExpectedExceptionName
-        {
-            get { return expectedExceptionName; }
-            set { expectedExceptionName = value; }
-        }
-
-        /// <summary>
-        /// The Message of any exception that is expected
-        /// </summary>
-        public string ExpectedMessage
-        {
-        	get { return expectedMessage; }
-        	set { expectedMessage = value; }
-        }
-
-        /// <summary>
-        ///  Gets or sets the type of match to be performed on the expected message
-        /// </summary>
-        public string MatchType
-        {
-            get { return matchType; }
-            set { matchType = value; }
-        }
-
-        /// <summary>
-        /// The expected result of the test, which
-        /// must match the method return type.
-        /// </summary>
-        public object Result
-        {
-            get { return expectedResult; }
-            set 
-            { 
-                expectedResult = value;
-                hasExpectedResult = true;
-            }
-        }
-
-        /// <summary>
-        /// Returns true if an expected result has been 
-        /// specified for this parameter set.
-        /// </summary>
-        public bool HasExpectedResult
-        {
-            get { return hasExpectedResult; }
-        }
-
-        /// <summary>
-        /// A description to be applied to this test case
-        /// </summary>
-        public string Description
-        {
-            get { return (string) Properties[DESCRIPTION]; }
-            set 
-            {
-                if (value != null)
-                    Properties[DESCRIPTION] = value;
-                else
-                    Properties.Remove(DESCRIPTION);
-            }
-        }
-
-        /// <summary>
-        /// A name to be used for this test case in lieu
-        /// of the standard generated name containing
-        /// the argument list.
-        /// </summary>
-        public string TestName
-        {
-            get { return testName; }
-            set { testName = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether this <see cref="ParameterSet"/> is ignored.
-        /// </summary>
-        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
-        public bool Ignored
-        {
-            get { return isIgnored; }
-            set { isIgnored = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets 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>
-        public string IgnoreReason
-        {
-            get { return ignoreReason; }
-            set { ignoreReason = value; }
-        }
-
-        /// <summary>
-        /// Gets a list of categories associated with this test.
-        /// </summary>
-        public IList Categories
-        {
-            get
-            {
-                if (Properties[CATEGORIES] == null)
-                    Properties[CATEGORIES] = new ArrayList();
-
-                return (IList)Properties[CATEGORIES];
-            }
-        }
-
-        /// <summary>
-        /// Gets the property dictionary for this test
-        /// </summary>
-        public IDictionary Properties
-        {
-            get
-            {
-                if (properties == null)
-                    properties = new ListDictionary();
-
-                return properties;
-            }
-        }
-        #endregion
-
-        #region Constructors
-        /// <summary>
-        /// Construct a non-runnable ParameterSet, specifying
-        /// the provider excetpion that made it invalid.
-        /// </summary>
-        public ParameterSet(Exception exception)
-        {
-            this.runState = RunState.NotRunnable;
-            this.providerException = exception;
-            this.ignoreReason = exception.Message;
-        }
-
-        /// <summary>
-        /// Construct an empty parameter set, which
-        /// defaults to being Runnable.
-        /// </summary>
-        public ParameterSet()
-        {
-            this.runState = RunState.Runnable;
-        }
-        #endregion
-
-        #region Static Methods
-
-        /// <summary>
-        /// Constructs a ParameterSet from another object, accessing properties 
-        /// by reflection. The object must expose at least an Arguments property
-        /// in order for the test to be runnable.
-        /// </summary>
-        /// <param name="source"></param>
-        public static ParameterSet FromDataSource(object source)
-        {
-            ParameterSet parms = new ParameterSet();
-
-            parms.Arguments = GetParm(source, PropertyNames.Arguments) as object[];
-
-            parms.ExpectedException = GetParm(source, PropertyNames.ExpectedException) as Type;
-            if (parms.ExpectedException != null)
-                parms.ExpectedExceptionName = parms.ExpectedException.FullName;
-            else
-                parms.ExpectedExceptionName = GetParm(source, PropertyNames.ExpectedExceptionName) as string;
-
-            parms.ExpectedMessage = GetParm(source, PropertyNames.ExpectedMessage) as string;
-            object matchEnum = GetParm(source, PropertyNames.MatchType);
-            if ( matchEnum != null )
-                parms.MatchType = matchEnum.ToString();
-
-            // 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)
-                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;
-            if ( props != null )
-                foreach (string key in props.Keys)
-                {
-                    parms.Properties.Add(key, props[key]);
-                    if (key == CATEGORIES) gotCategories = true;
-                }
-
-            // Some sources implement Categories. They may have been
-            // provided as properties or they may be separate.
-            if (!gotCategories)
-            {
-                IList categories = GetParm(source, PropertyNames.Categories) as IList;
-                if (categories != null)
-                    foreach (string cat in categories)
-                        parms.Categories.Add(cat);
-            }
-
-            return parms;
-        }
-
-        private static object GetParm(object source, string name)
-        {
-            Type type = source.GetType();
-            PropertyInfo prop = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
-            if (prop != null)
-                return prop.GetValue(source, null);
-
-            FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetField);
-            if (field != null)
-                return field.GetValue(source);
-
-            return null;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Reflection;
+
+namespace NUnit.Core.Extensibility
+{
+    /// <summary>
+    /// ParameterSet encapsulates method arguments and
+    /// other selected parameters needed for constructing
+    /// a parameterized test case.
+    /// </summary>
+    public class ParameterSet : NUnit.Framework.ITestCaseData
+    {
+        #region Constants
+
+        private static readonly string DESCRIPTION = "_DESCRIPTION";
+        //private static readonly string IGNOREREASON = "_IGNOREREASON";
+        private static readonly string CATEGORIES = "_CATEGORIES";
+
+        #endregion
+
+        #region Instance Fields
+
+        private RunState runState;
+        private Exception providerException;
+        private object[] arguments;
+        private object[] originalArguments;
+        private System.Type expectedExceptionType;
+        private string expectedExceptionName;
+        private string expectedMessage;
+        private string matchType;
+        private object expectedResult;
+        private string testName;
+        private string ignoreReason;
+        private bool isIgnored;
+        private bool isExplicit;
+        private bool hasExpectedResult;
+
+        /// <summary>
+        /// A dictionary of properties, used to add information
+        /// to tests without requiring the class to change.
+        /// </summary>
+        private IDictionary properties;
+
+        #endregion
+
+        #region Properties
+        /// <summary>
+        /// The RunState for this set of parameters.
+        /// </summary>
+        public RunState RunState
+        {
+            get { return runState; }
+            set { runState = value; }
+        }
+
+        ///// <summary>
+        ///// The reason for not running the test case
+        ///// represented by this ParameterSet
+        ///// </summary>
+        //public string NotRunReason
+        //{
+        //    get { return (string) Properties[IGNOREREASON]; }
+        //}
+
+        /// <summary>
+        /// Holds any exception thrown by the parameter provider
+        /// </summary>
+        public Exception ProviderException
+        {
+            get { return providerException; }
+        }
+
+        /// <summary>
+        /// The arguments to be used in running the test,
+        /// which must match the method signature.
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+            set 
+            {
+                arguments = value;
+
+                if (originalArguments == null)
+                    originalArguments = value;
+            }
+        }
+
+        /// <summary>
+        /// The original arguments supplied by the user,
+        /// used for display purposes.
+        /// </summary>
+        public object[] OriginalArguments
+        {
+            get { return originalArguments; }
+        }
+
+        /// <summary>
+        /// The Type of any exception that is expected.
+        /// </summary>
+        public System.Type ExpectedException
+        {
+            get { return expectedExceptionType; }
+            set { expectedExceptionType = value; }
+        }
+
+        /// <summary>
+        /// The FullName of any exception that is expected
+        /// </summary>
+        public string ExpectedExceptionName
+        {
+            get { return expectedExceptionName; }
+            set { expectedExceptionName = value; }
+        }
+
+        /// <summary>
+        /// The Message of any exception that is expected
+        /// </summary>
+        public string ExpectedMessage
+        {
+        	get { return expectedMessage; }
+        	set { expectedMessage = value; }
+        }
+
+        /// <summary>
+        ///  Gets or sets the type of match to be performed on the expected message
+        /// </summary>
+        public string MatchType
+        {
+            get { return matchType; }
+            set { matchType = value; }
+        }
+
+        /// <summary>
+        /// The expected result of the test, which
+        /// must match the method return type.
+        /// </summary>
+        public object Result
+        {
+            get { return expectedResult; }
+            set 
+            { 
+                expectedResult = value;
+                hasExpectedResult = true;
+            }
+        }
+
+        /// <summary>
+        /// Returns true if an expected result has been 
+        /// specified for this parameter set.
+        /// </summary>
+        public bool HasExpectedResult
+        {
+            get { return hasExpectedResult; }
+        }
+
+        /// <summary>
+        /// A description to be applied to this test case
+        /// </summary>
+        public string Description
+        {
+            get { return (string) Properties[DESCRIPTION]; }
+            set 
+            {
+                if (value != null)
+                    Properties[DESCRIPTION] = value;
+                else
+                    Properties.Remove(DESCRIPTION);
+            }
+        }
+
+        /// <summary>
+        /// A name to be used for this test case in lieu
+        /// of the standard generated name containing
+        /// the argument list.
+        /// </summary>
+        public string TestName
+        {
+            get { return testName; }
+            set { testName = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this <see cref="ParameterSet"/> is ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        public bool Ignored
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets 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>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+            set { ignoreReason = value; }
+        }
+
+        /// <summary>
+        /// Gets a list of categories associated with this test.
+        /// </summary>
+        public IList Categories
+        {
+            get
+            {
+                if (Properties[CATEGORIES] == null)
+                    Properties[CATEGORIES] = new ArrayList();
+
+                return (IList)Properties[CATEGORIES];
+            }
+        }
+
+        /// <summary>
+        /// Gets the property dictionary for this test
+        /// </summary>
+        public IDictionary Properties
+        {
+            get
+            {
+                if (properties == null)
+                    properties = new ListDictionary();
+
+                return properties;
+            }
+        }
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Construct a non-runnable ParameterSet, specifying
+        /// the provider excetpion that made it invalid.
+        /// </summary>
+        public ParameterSet(Exception exception)
+        {
+            this.runState = RunState.NotRunnable;
+            this.providerException = exception;
+            this.ignoreReason = exception.Message;
+        }
+
+        /// <summary>
+        /// Construct an empty parameter set, which
+        /// defaults to being Runnable.
+        /// </summary>
+        public ParameterSet()
+        {
+            this.runState = RunState.Runnable;
+        }
+        #endregion
+
+        #region Static Methods
+
+        /// <summary>
+        /// Constructs a ParameterSet from another object, accessing properties 
+        /// by reflection. The object must expose at least an Arguments property
+        /// in order for the test to be runnable.
+        /// </summary>
+        /// <param name="source"></param>
+        public static ParameterSet FromDataSource(object source)
+        {
+            ParameterSet parms = new ParameterSet();
+
+            parms.Arguments = GetParm(source, PropertyNames.Arguments) as object[];
+
+            parms.ExpectedException = GetParm(source, PropertyNames.ExpectedException) as Type;
+            if (parms.ExpectedException != null)
+                parms.ExpectedExceptionName = parms.ExpectedException.FullName;
+            else
+                parms.ExpectedExceptionName = GetParm(source, PropertyNames.ExpectedExceptionName) as string;
+
+            parms.ExpectedMessage = GetParm(source, PropertyNames.ExpectedMessage) as string;
+            object matchEnum = GetParm(source, PropertyNames.MatchType);
+            if ( matchEnum != null )
+                parms.MatchType = matchEnum.ToString();
+
+            // 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)
+                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;
+            if ( props != null )
+                foreach (string key in props.Keys)
+                {
+                    parms.Properties.Add(key, props[key]);
+                    if (key == CATEGORIES) gotCategories = true;
+                }
+
+            // Some sources implement Categories. They may have been
+            // provided as properties or they may be separate.
+            if (!gotCategories)
+            {
+                IList categories = GetParm(source, PropertyNames.Categories) as IList;
+                if (categories != null)
+                    foreach (string cat in categories)
+                        parms.Categories.Add(cat);
+            }
+
+            return parms;
+        }
+
+        private static object GetParm(object source, string name)
+        {
+            Type type = source.GetType();
+            PropertyInfo prop = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);
+            if (prop != null)
+                return prop.GetValue(source, null);
+
+            FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetField);
+            if (field != null)
+                return field.GetValue(source);
+
+            return null;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/Extensibility/TestFramework.cs b/src/NUnitCore/interfaces/Extensibility/TestFramework.cs
index be0b5c0..be5bffc 100644
--- a/src/NUnitCore/interfaces/Extensibility/TestFramework.cs
+++ b/src/NUnitCore/interfaces/Extensibility/TestFramework.cs
@@ -1,42 +1,42 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core.Extensibility
-{
-	/// <summary>
-	/// Summary description for TestFramework.
-	/// </summary>
-	[Serializable]
-	public class TestFramework
-	{
-		#region Instance Fields
-		/// <summary>
-		/// The name of the framework
-		/// </summary>
-		public string Name;
-
-		/// <summary>
-		/// The file name of the assembly that defines the framwork
-		/// </summary>
-		public string AssemblyName;
-		#endregion
-
-		#region Constructor
-		/// <summary>
-		/// Constructs a TestFramwork object given its name and assembly name.
-		/// </summary>
-		/// <param name="frameworkName"></param>
-		/// <param name="assemblyName"></param>
-		public TestFramework( string frameworkName, string assemblyName ) 
-		{
-			this.Name = frameworkName;
-			this.AssemblyName = assemblyName;
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core.Extensibility
+{
+	/// <summary>
+	/// Summary description for TestFramework.
+	/// </summary>
+	[Serializable]
+	public class TestFramework
+	{
+		#region Instance Fields
+		/// <summary>
+		/// The name of the framework
+		/// </summary>
+		public string Name;
+
+		/// <summary>
+		/// The file name of the assembly that defines the framwork
+		/// </summary>
+		public string AssemblyName;
+		#endregion
+
+		#region Constructor
+		/// <summary>
+		/// Constructs a TestFramwork object given its name and assembly name.
+		/// </summary>
+		/// <param name="frameworkName"></param>
+		/// <param name="assemblyName"></param>
+		public TestFramework( string frameworkName, string assemblyName ) 
+		{
+			this.Name = frameworkName;
+			this.AssemblyName = assemblyName;
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/interfaces/Filters/AndFilter.cs b/src/NUnitCore/interfaces/Filters/AndFilter.cs
index 48d9212..42711ff 100644
--- a/src/NUnitCore/interfaces/Filters/AndFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/AndFilter.cs
@@ -1,101 +1,101 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-
-namespace NUnit.Core.Filters
-{
-	/// <summary>
-	/// Combines multiple filters so that a test must pass all 
-	/// of them in order to pass this filter.
-	/// </summary>
-	[Serializable]
-	public class AndFilter : TestFilter
-	{
-		private ArrayList filters = new ArrayList();
-
-		/// <summary>
-		/// Constructs an empty AndFilter
-		/// </summary>
-		public AndFilter() { }
-
-		/// <summary>
-		/// Constructs an AndFilter from an array of filters
-		/// </summary>
-		/// <param name="filters"></param>
-		public AndFilter( params ITestFilter[] filters )
-		{
-			this.filters.AddRange( filters );
-		}
-
-		/// <summary>
-		/// Adds a filter to the list of filters
-		/// </summary>
-		/// <param name="filter">The filter to be added</param>
-		public void Add( ITestFilter filter )
-		{
-			this.filters.Add( filter );
-		}
-
-		/// <summary>
-		/// Return an array of the composing filters
-		/// </summary>
-		public ITestFilter[] Filters
-		{
-			get
-			{
-				return (ITestFilter[])filters.ToArray(typeof(ITestFilter));
-			}
-		}
-
-		/// <summary>
-		/// Checks whether the AndFilter is matched by a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if all the component filters pass, otherwise false</returns>
-		public override bool Pass( ITest test )
-		{
-			foreach( ITestFilter filter in filters )
-				if ( !filter.Pass( test ) )
-					return false;
-
-			return true;
-		}
-
-		/// <summary>
-		/// Checks whether the AndFilter is matched by a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if all the component filters match, otherwise false</returns>
-		public override bool Match( ITest test )
-		{
-			foreach( ITestFilter filter in filters )
-				if ( !filter.Match( test ) )
-					return false;
-
-			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();
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+
+namespace NUnit.Core.Filters
+{
+	/// <summary>
+	/// Combines multiple filters so that a test must pass all 
+	/// of them in order to pass this filter.
+	/// </summary>
+	[Serializable]
+	public class AndFilter : TestFilter
+	{
+		private ArrayList filters = new ArrayList();
+
+		/// <summary>
+		/// Constructs an empty AndFilter
+		/// </summary>
+		public AndFilter() { }
+
+		/// <summary>
+		/// Constructs an AndFilter from an array of filters
+		/// </summary>
+		/// <param name="filters"></param>
+		public AndFilter( params ITestFilter[] filters )
+		{
+			this.filters.AddRange( filters );
+		}
+
+		/// <summary>
+		/// Adds a filter to the list of filters
+		/// </summary>
+		/// <param name="filter">The filter to be added</param>
+		public void Add( ITestFilter filter )
+		{
+			this.filters.Add( filter );
+		}
+
+		/// <summary>
+		/// Return an array of the composing filters
+		/// </summary>
+		public ITestFilter[] Filters
+		{
+			get
+			{
+				return (ITestFilter[])filters.ToArray(typeof(ITestFilter));
+			}
+		}
+
+		/// <summary>
+		/// Checks whether the AndFilter is matched by a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if all the component filters pass, otherwise false</returns>
+		public override bool Pass( ITest test )
+		{
+			foreach( ITestFilter filter in filters )
+				if ( !filter.Pass( test ) )
+					return false;
+
+			return true;
+		}
+
+		/// <summary>
+		/// Checks whether the AndFilter is matched by a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if all the component filters match, otherwise false</returns>
+		public override bool Match( ITest test )
+		{
+			foreach( ITestFilter filter in filters )
+				if ( !filter.Match( test ) )
+					return false;
+
+			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/CategoryFilter.cs b/src/NUnitCore/interfaces/Filters/CategoryFilter.cs
index dd709d1..447b6c9 100644
--- a/src/NUnitCore/interfaces/Filters/CategoryFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/CategoryFilter.cs
@@ -1,102 +1,102 @@
-// ****************************************************************
-// 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.Collections;
-
-namespace NUnit.Core.Filters
-{
-	/// <summary>
-	/// CategoryFilter is able to select or exclude tests
-	/// based on their categories.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class CategoryFilter : TestFilter
-	{
-		ArrayList categories;
-
-		/// <summary>
-		/// Construct an empty CategoryFilter
-		/// </summary>
-		public CategoryFilter()
-		{
-			categories = new ArrayList();
-		}
-
-		/// <summary>
-		/// Construct a CategoryFilter using a single category name
-		/// </summary>
-		/// <param name="name">A category name</param>
-		public CategoryFilter( string name )
-		{
-			categories = new ArrayList();
-			if ( name != null && name != string.Empty )
-				categories.Add( name );
-		}
-
-		/// <summary>
-		/// Construct a CategoryFilter using an array of category names
-		/// </summary>
-		/// <param name="names">An array of category names</param>
-		public CategoryFilter( string[] names )
-		{
-			categories = new ArrayList();
-			if ( names != null )
-				categories.AddRange( names );
-		}
-
-		/// <summary>
-		/// Add a category name to the filter
-		/// </summary>
-		/// <param name="name">A category name</param>
-		public void AddCategory(string name) 
-		{
-			categories.Add( name );
-		}
-
-		/// <summary>
-		/// Check whether the filter matches a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns></returns>
-        public override bool Match(ITest test)
-        {
-			if ( test.Categories == null )
-				return false;
-
-			foreach( string cat in categories )
-				if ( test.Categories.Contains( cat ) )
-					return true;
-
-			return false;
-        }
-		
-		/// <summary>
-		/// Return the string representation of a category filter
-		/// </summary>
-		/// <returns></returns>
-		public override string ToString()
-		{
-			StringBuilder sb = new StringBuilder();
-			for( int i = 0; i < categories.Count; i++ )
-			{
-				if ( i > 0 ) sb.Append( ',' );
-				sb.Append( categories[i] );
-			}
-			return sb.ToString();
-		}
-
-		/// <summary>
-		/// Gets the list of categories from this filter
-		/// </summary>
-		public IList Categories
-		{
-			get { return categories; }
-		}
-	}
-}
+// ****************************************************************
+// 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.Collections;
+
+namespace NUnit.Core.Filters
+{
+	/// <summary>
+	/// CategoryFilter is able to select or exclude tests
+	/// based on their categories.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class CategoryFilter : TestFilter
+	{
+		ArrayList categories;
+
+		/// <summary>
+		/// Construct an empty CategoryFilter
+		/// </summary>
+		public CategoryFilter()
+		{
+			categories = new ArrayList();
+		}
+
+		/// <summary>
+		/// Construct a CategoryFilter using a single category name
+		/// </summary>
+		/// <param name="name">A category name</param>
+		public CategoryFilter( string name )
+		{
+			categories = new ArrayList();
+			if ( name != null && name != string.Empty )
+				categories.Add( name );
+		}
+
+		/// <summary>
+		/// Construct a CategoryFilter using an array of category names
+		/// </summary>
+		/// <param name="names">An array of category names</param>
+		public CategoryFilter( string[] names )
+		{
+			categories = new ArrayList();
+			if ( names != null )
+				categories.AddRange( names );
+		}
+
+		/// <summary>
+		/// Add a category name to the filter
+		/// </summary>
+		/// <param name="name">A category name</param>
+		public void AddCategory(string name) 
+		{
+			categories.Add( name );
+		}
+
+		/// <summary>
+		/// Check whether the filter matches a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns></returns>
+        public override bool Match(ITest test)
+        {
+			if ( test.Categories == null )
+				return false;
+
+			foreach( string cat in categories )
+				if ( test.Categories.Contains( cat ) )
+					return true;
+
+			return false;
+        }
+		
+		/// <summary>
+		/// Return the string representation of a category filter
+		/// </summary>
+		/// <returns></returns>
+		public override string ToString()
+		{
+			StringBuilder sb = new StringBuilder();
+			for( int i = 0; i < categories.Count; i++ )
+			{
+				if ( i > 0 ) sb.Append( ',' );
+				sb.Append( categories[i] );
+			}
+			return sb.ToString();
+		}
+
+		/// <summary>
+		/// Gets the list of categories from this filter
+		/// </summary>
+		public IList Categories
+		{
+			get { return categories; }
+		}
+	}
+}
diff --git a/src/NUnitCore/interfaces/Filters/NameFilter.cs b/src/NUnitCore/interfaces/Filters/NameFilter.cs
index b0ecf96..2a6bbb0 100644
--- a/src/NUnitCore/interfaces/Filters/NameFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/NameFilter.cs
@@ -1,58 +1,58 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Core.Filters
-{
-	/// <summary>
-	/// Summary description for NameFilter.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class NameFilter : TestFilter
-	{
-		private ArrayList testNames = new ArrayList();
-
-		/// <summary>
-		/// Construct an empty NameFilter
-		/// </summary>
-		public NameFilter() { }
-
-		/// <summary>
-		/// Construct a NameFilter for a single TestName
-		/// </summary>
-		/// <param name="testName"></param>
-		public NameFilter( TestName testName )
-		{
-			testNames.Add( testName );
-		}
-
-		/// <summary>
-		/// Add a TestName to a NameFilter
-		/// </summary>
-		/// <param name="testName"></param>
-		public void Add( TestName testName )
-		{
-			testNames.Add( testName );
-		}
-
-		/// <summary>
-		/// Check if a test matches the filter
-		/// </summary>
-		/// <param name="test">The test to match</param>
-		/// <returns>True if it matches, false if not</returns>
-		public override bool Match( ITest test )
-		{
-			foreach( TestName testName in testNames )
-				if ( test.TestName == testName )
-					return true;
-
-			return false;
-		}
-	}
-}
+// ****************************************************************
+// 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;
+
+namespace NUnit.Core.Filters
+{
+	/// <summary>
+	/// Summary description for NameFilter.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class NameFilter : TestFilter
+	{
+		private ArrayList testNames = new ArrayList();
+
+		/// <summary>
+		/// Construct an empty NameFilter
+		/// </summary>
+		public NameFilter() { }
+
+		/// <summary>
+		/// Construct a NameFilter for a single TestName
+		/// </summary>
+		/// <param name="testName"></param>
+		public NameFilter( TestName testName )
+		{
+			testNames.Add( testName );
+		}
+
+		/// <summary>
+		/// Add a TestName to a NameFilter
+		/// </summary>
+		/// <param name="testName"></param>
+		public void Add( TestName testName )
+		{
+			testNames.Add( testName );
+		}
+
+		/// <summary>
+		/// Check if a test matches the filter
+		/// </summary>
+		/// <param name="test">The test to match</param>
+		/// <returns>True if it matches, false if not</returns>
+		public override bool Match( ITest test )
+		{
+			foreach( TestName testName in testNames )
+				if ( test.TestName == testName )
+					return true;
+
+			return false;
+		}
+	}
+}
diff --git a/src/NUnitCore/interfaces/Filters/NotFilter.cs b/src/NUnitCore/interfaces/Filters/NotFilter.cs
index 6bd1972..679f42f 100644
--- a/src/NUnitCore/interfaces/Filters/NotFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/NotFilter.cs
@@ -1,86 +1,98 @@
-// ****************************************************************
-// Copyright 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.Core.Filters
-{
-	/// <summary>
-	/// NotFilter negates the operation of another filter
-	/// </summary>
-	[Serializable]
-	public class NotFilter : TestFilter
-	{
-		ITestFilter baseFilter;
-        bool topLevel = false;
-
-		/// <summary>
-		/// Construct a not filter on another filter
-		/// </summary>
-		/// <param name="baseFilter">The filter to be negated</param>
-		public NotFilter( ITestFilter baseFilter)
-		{
-			this.baseFilter = baseFilter;
-		}
-
-        /// <summary>
-        /// Indicates whether this is a top-level NotFilter,
-        /// requiring special handling of Explicit
-        /// </summary>
-        public bool TopLevel
-        {
-            get { return topLevel; }
-            set { topLevel = value; }
-        }
-
-		/// <summary>
-		/// Gets the base filter
-		/// </summary>
-		public ITestFilter BaseFilter
-		{
-			get { return baseFilter; }
-		}
-
-		/// <summary>
-		/// Check whether the filter matches a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if it matches, otherwise false</returns>
-		public override bool Match( ITest test )
-		{
-            if (topLevel && test.RunState == RunState.Explicit)
-                return false;
-
-			return !baseFilter.Pass( test );
-		}
-
-		/// <summary>
-		/// Determine whether any descendant of the test matches the filter criteria.
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if at least one descendant matches the filter criteria</returns>
-		protected override bool MatchDescendant(ITest test)
-		{
-			if (!test.IsSuite || test.Tests == null || topLevel && test.RunState == RunState.Explicit)
-				return false;
-
-			foreach (ITest child in test.Tests)
-			{
-				if (Match(child) || MatchDescendant(child))
-					return true;
-			}
-
-			return false;
-		}
-
-        /// <summary>
-        /// Return string representation of the filter
-        /// </summary>
-        public override string ToString()
-        {
-            return "not " + baseFilter.ToString();
-        }
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Filters
+{
+	/// <summary>
+	/// NotFilter negates the operation of another filter
+	/// </summary>
+	[Serializable]
+	public class NotFilter : TestFilter
+	{
+		ITestFilter baseFilter;
+        bool topLevel = false;
+
+        /// <summary>
+        /// Construct a not filter on another filter. The topLevel
+        /// argument is used to trigger special handling when tests
+        /// are being excluded.
+        /// </summary>
+        /// <param name="baseFilter">The filter to be negated</param>
+        public NotFilter(ITestFilter baseFilter) : this(baseFilter, false) { }
+
+        /// <summary>
+        /// Construct a not filter on another filter. The topLevel
+        /// argument is used to trigger special handling when tests
+        /// are being excluded.
+        /// </summary>
+        /// <param name="baseFilter">The filter to be negated</param>
+        /// <param name="topLevel">Indicates whether this is a top level NotFilter</param>
+        public NotFilter(ITestFilter baseFilter, bool topLevel)
+        {
+            this.baseFilter = baseFilter;
+            this.topLevel = topLevel;
+        }
+
+        /// <summary>
+        /// Indicates whether this is a top-level NotFilter,
+        /// requiring special handling of Explicit
+        /// </summary>
+        public bool TopLevel
+        {
+            get { return topLevel; }
+            set { topLevel = value; }
+        }
+
+		/// <summary>
+		/// Gets the base filter
+		/// </summary>
+		public ITestFilter BaseFilter
+		{
+			get { return baseFilter; }
+		}
+
+		/// <summary>
+		/// Check whether the filter matches a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if it matches, otherwise false</returns>
+		public override bool Match( ITest test )
+		{
+            if (topLevel && test.RunState == RunState.Explicit)
+                return false;
+
+			return !baseFilter.Pass( test );
+		}
+
+		/// <summary>
+		/// Determine whether any descendant of the test matches the filter criteria.
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if at least one descendant matches the filter criteria</returns>
+		protected override bool MatchDescendant(ITest test)
+		{
+			if (!test.IsSuite || test.Tests == null || topLevel && test.RunState == RunState.Explicit)
+				return false;
+
+			foreach (ITest child in test.Tests)
+			{
+				if (Match(child) || MatchDescendant(child))
+					return true;
+			}
+
+			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 e840992..7b0a343 100644
--- a/src/NUnitCore/interfaces/Filters/OrFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/OrFilter.cs
@@ -1,98 +1,98 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Text;
-
-namespace NUnit.Core.Filters
-{
-	/// <summary>
-	/// Combines multiple filters so that a test must pass one 
-	/// of them in order to pass this filter.
-	/// </summary>
-	[Serializable]
-	public class OrFilter : TestFilter
-	{
-		private ArrayList filters = new ArrayList();
-
-		/// <summary>
-		/// Constructs an empty OrFilter
-		/// </summary>
-		public OrFilter() { }
-
-		/// <summary>
-		/// Constructs an AndFilter from an array of filters
-		/// </summary>
-		/// <param name="filters"></param>
-		public OrFilter( params ITestFilter[] filters )
-		{
-			this.filters.AddRange( filters );
-		}
-
-		/// <summary>
-		/// Adds a filter to the list of filters
-		/// </summary>
-		/// <param name="filter">The filter to be added</param>
-		public void Add( ITestFilter filter )
-		{
-			this.filters.Add( filter );
-		}
-
-		/// <summary>
-		/// Return an array of the composing filters
-		/// </summary>
-		public ITestFilter[] Filters
-		{
-			get
-			{
-				return (ITestFilter[])filters.ToArray(typeof(ITestFilter));
-			}
-		}
-
-		/// <summary>
-		/// Checks whether the OrFilter is matched by a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if any of the component filters pass, otherwise false</returns>
-		public override bool Pass( ITest test )
-		{
-			foreach( ITestFilter filter in filters )
-				if ( filter.Pass( test ) )
-					return true;
-
-			return false;
-		}
-
-		/// <summary>
-		/// Checks whether the OrFilter is matched by a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if any of the component filters match, otherwise false</returns>
-		public override bool Match( ITest test )
-		{
-			foreach( ITestFilter filter in filters )
-				if ( filter.Match( test ) )
-					return true;
-
-			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();
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Text;
+
+namespace NUnit.Core.Filters
+{
+	/// <summary>
+	/// Combines multiple filters so that a test must pass one 
+	/// of them in order to pass this filter.
+	/// </summary>
+	[Serializable]
+	public class OrFilter : TestFilter
+	{
+		private ArrayList filters = new ArrayList();
+
+		/// <summary>
+		/// Constructs an empty OrFilter
+		/// </summary>
+		public OrFilter() { }
+
+		/// <summary>
+		/// Constructs an AndFilter from an array of filters
+		/// </summary>
+		/// <param name="filters"></param>
+		public OrFilter( params ITestFilter[] filters )
+		{
+			this.filters.AddRange( filters );
+		}
+
+		/// <summary>
+		/// Adds a filter to the list of filters
+		/// </summary>
+		/// <param name="filter">The filter to be added</param>
+		public void Add( ITestFilter filter )
+		{
+			this.filters.Add( filter );
+		}
+
+		/// <summary>
+		/// Return an array of the composing filters
+		/// </summary>
+		public ITestFilter[] Filters
+		{
+			get
+			{
+				return (ITestFilter[])filters.ToArray(typeof(ITestFilter));
+			}
+		}
+
+		/// <summary>
+		/// Checks whether the OrFilter is matched by a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if any of the component filters pass, otherwise false</returns>
+		public override bool Pass( ITest test )
+		{
+			foreach( ITestFilter filter in filters )
+				if ( filter.Pass( test ) )
+					return true;
+
+			return false;
+		}
+
+		/// <summary>
+		/// Checks whether the OrFilter is matched by a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if any of the component filters match, otherwise false</returns>
+		public override bool Match( ITest test )
+		{
+			foreach( ITestFilter filter in filters )
+				if ( filter.Match( test ) )
+					return true;
+
+			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/Filters/SimpleNameFilter.cs b/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs
index f277b4c..9b6becf 100644
--- a/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs
+++ b/src/NUnitCore/interfaces/Filters/SimpleNameFilter.cs
@@ -1,75 +1,75 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-
-namespace NUnit.Core.Filters
-{
-	/// <summary>
-	/// SimpleName filter selects tests based on their name
-	/// </summary>
-    [Serializable]
-    public class SimpleNameFilter : TestFilter
-    {
-        private ArrayList names = new ArrayList();
-
-		/// <summary>
-		/// Construct an empty SimpleNameFilter
-		/// </summary>
-        public SimpleNameFilter() { }
-
-        /// <summary>
-        /// Construct a SimpleNameFilter for a single name
-        /// </summary>
-        /// <param name="name">The name the filter will recognize.</param>
-        public SimpleNameFilter(string name)
-        {
-            names.Add(name);
-        }
-
-        /// <summary>
-        /// Construct a SimpleNameFilter for an array of names
-        /// </summary>
-        /// <param names="nameToAdd">The names the filter will recognize.</param>
-        public SimpleNameFilter(string[] namesToAdd)
-        {
-            this.names.AddRange(namesToAdd);
-        }
-
-        /// <summary>
-        /// Add a name to a SimpleNameFilter
-        /// </summary>
-        /// <param name="name">The name to be added.</param>
-        public void Add(string name)
-        {
-            names.Add(name);
-        }
-
-        /// <summary>
-        /// Add an array of names to a SimpleNameFilter
-        /// </summary>
-        /// <param name="namesToAdd">The name to be added.</param>
-        public void Add(string[] namesToAdd)
-        {
-            foreach (string name in namesToAdd)
-                names.Add(name);
-        }
-
-        /// <summary>
-		/// Check whether the filter matches a test
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if it matches, otherwise false</returns>
-		public override bool Match( ITest test )
-		{
-			foreach( string name in names )
-				if ( test.TestName.FullName == name )
-					return true;
-
-			return false;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+
+namespace NUnit.Core.Filters
+{
+	/// <summary>
+	/// SimpleName filter selects tests based on their name
+	/// </summary>
+    [Serializable]
+    public class SimpleNameFilter : TestFilter
+    {
+        private ArrayList names = new ArrayList();
+
+		/// <summary>
+		/// Construct an empty SimpleNameFilter
+		/// </summary>
+        public SimpleNameFilter() { }
+
+        /// <summary>
+        /// Construct a SimpleNameFilter for a single name
+        /// </summary>
+        /// <param name="name">The name the filter will recognize.</param>
+        public SimpleNameFilter(string name)
+        {
+            names.Add(name);
+        }
+
+        /// <summary>
+        /// Construct a SimpleNameFilter for an array of names
+        /// </summary>
+        /// <param names="nameToAdd">The names the filter will recognize.</param>
+        public SimpleNameFilter(string[] namesToAdd)
+        {
+            this.names.AddRange(namesToAdd);
+        }
+
+        /// <summary>
+        /// Add a name to a SimpleNameFilter
+        /// </summary>
+        /// <param name="name">The name to be added.</param>
+        public void Add(string name)
+        {
+            names.Add(name);
+        }
+
+        /// <summary>
+        /// Add an array of names to a SimpleNameFilter
+        /// </summary>
+        /// <param name="namesToAdd">The name to be added.</param>
+        public void Add(string[] namesToAdd)
+        {
+            foreach (string name in namesToAdd)
+                names.Add(name);
+        }
+
+        /// <summary>
+		/// Check whether the filter matches a test
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if it matches, otherwise false</returns>
+		public override bool Match( ITest test )
+		{
+			foreach( string name in names )
+				if ( test.TestName.FullName == name )
+					return true;
+
+			return false;
+		}
+	}
+}
diff --git a/src/NUnitCore/interfaces/IAgency.cs b/src/NUnitCore/interfaces/IAgency.cs
index 6bc8efb..0231c83 100644
--- a/src/NUnitCore/interfaces/IAgency.cs
+++ b/src/NUnitCore/interfaces/IAgency.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// The IAgency interface is implemented by a TestAgency in 
-    /// order to allow TestAgents to register with it.
-    /// </summary>
-    public interface IAgency
-    {
-        /// <summary>
-        /// Registers an agent with an agency
-        /// </summary>
-        /// <param name="agent"></param>
-        void Register(TestAgent agent);
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// The IAgency interface is implemented by a TestAgency in 
+    /// order to allow TestAgents to register with it.
+    /// </summary>
+    public interface IAgency
+    {
+        /// <summary>
+        /// Registers an agent with an agency
+        /// </summary>
+        /// <param name="agent"></param>
+        void Register(TestAgent agent);
+    }
+}
diff --git a/src/NUnitCore/interfaces/IService.cs b/src/NUnitCore/interfaces/IService.cs
index 6d79ece..4b918e3 100644
--- a/src/NUnitCore/interfaces/IService.cs
+++ b/src/NUnitCore/interfaces/IService.cs
@@ -1,25 +1,25 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// The IService interface is implemented by all Services.
-	/// </summary>
-	public interface IService
-	{
-		/// <summary>
-		/// Initialize the Service
-		/// </summary>
-		void InitializeService();
-
-		/// <summary>
-		/// Do any cleanup needed before terminating the service
-		/// </summary>
-		void UnloadService();
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// The IService interface is implemented by all Services.
+	/// </summary>
+	public interface IService
+	{
+		/// <summary>
+		/// Initialize the Service
+		/// </summary>
+		void InitializeService();
+
+		/// <summary>
+		/// Do any cleanup needed before terminating the service
+		/// </summary>
+		void UnloadService();
+	}
+}
diff --git a/src/NUnitCore/interfaces/ITest.cs b/src/NUnitCore/interfaces/ITest.cs
index 634c8e3..698a023 100644
--- a/src/NUnitCore/interfaces/ITest.cs
+++ b/src/NUnitCore/interfaces/ITest.cs
@@ -1,91 +1,103 @@
-// ****************************************************************
-// 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.Collections;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Common interface supported by all representations
-	/// of a test. Only includes informational fields.
-	/// The Run method is specifically excluded to allow
-	/// for data-only representations of a test.
-	/// </summary>
-	public interface ITest
-    {
-        #region Properties
-        /// <summary>
-		/// Gets the completely specified name of the test
-		/// encapsulated in a TestName object.
-		/// </summary>
-		TestName TestName { get; }
-
-		/// <summary>
-		/// Gets a string representing the type of test, e.g.: "Test Case"
-		/// </summary>
-		string TestType { get; }
-
-        /// <summary>
-        /// Indicates whether the test can be run using
-        /// the RunState enum.
-        /// </summary>
-		RunState RunState { get; set; }
-
-		/// <summary>
-		/// Reason for not running the test, if applicable
-		/// </summary>
-		string IgnoreReason { get; set; }
-		
-		/// <summary>
-		/// Count of the test cases ( 1 if this is a test case )
-		/// </summary>
-		int TestCount { get; }
-
-		/// <summary>
-		/// Categories available for this test
-		/// </summary>
-		IList Categories { get; }
-
-		/// <summary>
-		/// Return the description field. 
-		/// </summary>
-		string Description { get; set; }
-
-		/// <summary>
-		/// Return additional properties of the test
-		/// </summary>
-		IDictionary Properties { get; }
-
-		/// <summary>
-		/// True if this is a suite
-		/// </summary>
-		bool IsSuite { get; }
-
-		/// <summary>
-		///  Gets the parent test of this test
-		/// </summary>
-		ITest Parent { get; }
-
-		/// <summary>
-		/// For a test suite, the child tests or suites
-		/// Null if this is not a test suite
-		/// </summary>
-		IList Tests { get; }
-        #endregion
-
-        #region Methods
-		/// <summary>
-		/// Count the test cases that pass a filter. The
-		/// result should match those that would execute
-		/// when passing the same filter to Run.
-		/// </summary>
-		/// <param name="filter">The filter to apply</param>
-		/// <returns>The count of test cases</returns>
-        int CountTestCases(ITestFilter filter);
-        #endregion
-    }
-}
-
+// ****************************************************************
+// 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.Collections;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Common interface supported by all representations
+	/// of a test. Only includes informational fields.
+	/// The Run method is specifically excluded to allow
+	/// for data-only representations of a test.
+	/// </summary>
+	public interface ITest
+    {
+        #region Properties
+        /// <summary>
+		/// Gets the completely specified name of the test
+		/// encapsulated in a TestName object.
+		/// </summary>
+		TestName TestName { get; }
+
+        /// <summary>
+        /// Gets the name of the class containing this test. Returns
+        /// null if the test is not associated with a class.
+        /// </summary>
+        string ClassName { get; }
+
+        /// <summary>
+        /// Gets the name of the method implementing this test.
+        /// Returns null if the test is not implemented as a method.
+        /// </summary>
+        string MethodName { get; }
+
+		/// <summary>
+		/// Gets a string representing the type of test, e.g.: "Test Case"
+		/// </summary>
+		string TestType { get; }
+
+        /// <summary>
+        /// Indicates whether the test can be run using
+        /// the RunState enum.
+        /// </summary>
+		RunState RunState { get; set; }
+
+		/// <summary>
+		/// Reason for not running the test, if applicable
+		/// </summary>
+		string IgnoreReason { get; set; }
+		
+		/// <summary>
+		/// Count of the test cases ( 1 if this is a test case )
+		/// </summary>
+		int TestCount { get; }
+
+		/// <summary>
+		/// Categories available for this test
+		/// </summary>
+		IList Categories { get; }
+
+		/// <summary>
+		/// Return the description field. 
+		/// </summary>
+		string Description { get; set; }
+
+		/// <summary>
+		/// Return additional properties of the test
+		/// </summary>
+		IDictionary Properties { get; }
+
+		/// <summary>
+		/// True if this is a suite
+		/// </summary>
+		bool IsSuite { get; }
+
+		/// <summary>
+		///  Gets the parent test of this test
+		/// </summary>
+		ITest Parent { get; }
+
+		/// <summary>
+		/// For a test suite, the child tests or suites
+		/// Null if this is not a test suite
+		/// </summary>
+		IList Tests { get; }
+        #endregion
+
+        #region Methods
+		/// <summary>
+		/// Count the test cases that pass a filter. The
+		/// result should match those that would execute
+		/// when passing the same filter to Run.
+		/// </summary>
+		/// <param name="filter">The filter to apply</param>
+		/// <returns>The count of test cases</returns>
+        int CountTestCases(ITestFilter filter);
+        #endregion
+    }
+}
+
diff --git a/src/NUnitCore/interfaces/ITestFilter.cs b/src/NUnitCore/interfaces/ITestFilter.cs
index fa4d78e..1aa1550 100644
--- a/src/NUnitCore/interfaces/ITestFilter.cs
+++ b/src/NUnitCore/interfaces/ITestFilter.cs
@@ -1,39 +1,39 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// Interface to be implemented by filters applied to tests.
-	/// The filter applies when running the test, after it has been
-	/// loaded, since this is the only time an ITest exists.
-	/// </summary>
-	public interface ITestFilter
-	{
-		/// <summary>
-		/// Indicates whether this is the EmptyFilter
-		/// </summary>
-		bool IsEmpty { get; }
-
-		/// <summary>
-		/// Determine if a particular test passes the filter criteria. Pass
-		/// may examine the parents and/or descendants of a test, depending
-		/// on the semantics of the particular filter
-		/// </summary>
-		/// <param name="test">The test to which the filter is applied</param>
-		/// <returns>True if the test passes the filter, otherwise false</returns>
-		bool Pass( ITest test );
-
-		/// <summary>
-		/// Determine whether the test itself matches the filter criteria,
-		/// without examining either parents or descendants.
-		/// </summary>
-		/// <param name="test">The test to which the filter is applied</param>
-		/// <returns>True if the filter matches the any parent of the test</returns>
-		bool Match( ITest test );
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// Interface to be implemented by filters applied to tests.
+	/// The filter applies when running the test, after it has been
+	/// loaded, since this is the only time an ITest exists.
+	/// </summary>
+	public interface ITestFilter
+	{
+		/// <summary>
+		/// Indicates whether this is the EmptyFilter
+		/// </summary>
+		bool IsEmpty { get; }
+
+		/// <summary>
+		/// Determine if a particular test passes the filter criteria. Pass
+		/// may examine the parents and/or descendants of a test, depending
+		/// on the semantics of the particular filter
+		/// </summary>
+		/// <param name="test">The test to which the filter is applied</param>
+		/// <returns>True if the test passes the filter, otherwise false</returns>
+		bool Pass( ITest test );
+
+		/// <summary>
+		/// Determine whether the test itself matches the filter criteria,
+		/// without examining either parents or descendants.
+		/// </summary>
+		/// <param name="test">The test to which the filter is applied</param>
+		/// <returns>True if the filter matches the any parent of the test</returns>
+		bool Match( ITest test );
+	}
+}
diff --git a/src/NUnitCore/interfaces/LoggingThreshold.cs b/src/NUnitCore/interfaces/LoggingThreshold.cs
index 425ae01..baf567e 100644
--- a/src/NUnitCore/interfaces/LoggingThreshold.cs
+++ b/src/NUnitCore/interfaces/LoggingThreshold.cs
@@ -1,32 +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,
-    }
-}
+// ****************************************************************
+// 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 f893bc5..bfb681d 100644
--- a/src/NUnitCore/interfaces/OSPlatform.cs
+++ b/src/NUnitCore/interfaces/OSPlatform.cs
@@ -1,345 +1,363 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Runtime.InteropServices;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// OSPlatform represents a particular operating system platform
-    /// </summary>
-    public class OSPlatform
-    {
-        PlatformID platform;
-        Version version;
-        ProductType product;
-
-        #region Static Members
-        private static OSPlatform currentPlatform;
-
-        
-        /// <summary>
-        /// Platform ID for Unix as defined by Microsoft .NET 2.0 and greater
-        /// </summary>
-        public static readonly PlatformID UnixPlatformID_Microsoft = (PlatformID)4;
-
-        /// <summary>
-        /// Platform ID for Unix as defined by Mono
-        /// </summary>
-        public static readonly PlatformID UnixPlatformID_Mono = (PlatformID)128;
-
-        /// <summary>
-        /// Get the OSPlatform under which we are currently running
-        /// </summary>
-        public static OSPlatform CurrentPlatform
-        {
-            get
-            {
-                if (currentPlatform == null)
-                {
-                    OperatingSystem os = Environment.OSVersion;
-
-                    if (os.Platform == PlatformID.Win32NT && os.Version.Major >= 5)
-                    {
-                        OSVERSIONINFOEX osvi = new OSVERSIONINFOEX();
-                        osvi.dwOSVersionInfoSize = (uint)Marshal.SizeOf(osvi);
-                        GetVersionEx(ref osvi);
-                        currentPlatform = new OSPlatform(os.Platform, os.Version, (ProductType)osvi.ProductType);
-                    }
-                    else
-                        currentPlatform = new OSPlatform(os.Platform, os.Version);
-                }
-
-                return currentPlatform;
-            }
-        }
-        #endregion
-
-        #region Members used for Win32NT platform only
-        /// <summary>
-        /// Product Type Enumeration used for Windows
-        /// </summary>
-        public enum ProductType
-        {
-            /// <summary>
-            /// Product type is unknown or unspecified
-            /// </summary>
-            Unknown,
-
-            /// <summary>
-            /// Product type is Workstation
-            /// </summary>
-            WorkStation,
-
-            /// <summary>
-            /// Product type is Domain Controller
-            /// </summary>
-            DomainController,
-
-            /// <summary>
-            /// Product type is Server
-            /// </summary>
-            Server,
-        }
-
-        [StructLayout(LayoutKind.Sequential)]
-        struct OSVERSIONINFOEX
-        {
-            public uint dwOSVersionInfoSize;
-            public uint dwMajorVersion;
-            public uint dwMinorVersion;
-            public uint dwBuildNumber;
-            public uint dwPlatformId;
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
-            public string szCSDVersion;
-            public Int16 wServicePackMajor;
-            public Int16 wServicePackMinor;
-            public Int16 wSuiteMask;
-            public Byte ProductType;
-            public Byte Reserved;
-        }
-
-        [DllImport("Kernel32.dll")]
-        private static extern bool GetVersionEx(ref OSVERSIONINFOEX osvi);
-        #endregion
-
-        /// <summary>
-        /// Construct from a platform ID and version
-        /// </summary>
-        public OSPlatform(PlatformID platform, Version version)
-        {
-            this.platform = platform;
-            this.version = version;
-        }
-
-        /// <summary>
-        /// Construct from a platform ID, version and product type
-        /// </summary>
-        public OSPlatform(PlatformID platform, Version version, ProductType product)
-            : this( platform, version )
-        {
-            this.product = product;
-        }
-
-        /// <summary>
-        /// Get the platform ID of this instance
-        /// </summary>
-        public PlatformID Platform
-        {
-            get { return platform; }
-        }
-
-        /// <summary>
-        /// Get the Version of this instance
-        /// </summary>
-        public Version Version
-        {
-            get { return version; }
-        }
-
-        /// <summary>
-        /// Get the Product Type of this instance
-        /// </summary>
-        public ProductType Product
-        {
-            get { return product; }
-        }
-
-        /// <summary>
-        /// Return true if this is a windows platform
-        /// </summary>
-        public bool IsWindows
-        {
-            get
-            {
-                return platform == PlatformID.Win32NT
-                    || platform == PlatformID.Win32Windows
-                    || platform == PlatformID.Win32S
-                    || platform == PlatformID.WinCE;
-            }
-        }
-
-        /// <summary>
-        /// Return true if this is a Unix or Linux platform
-        /// </summary>
-        public bool IsUnix
-        {
-            get
-            {
-                return platform == UnixPlatformID_Microsoft
-                    || platform == UnixPlatformID_Mono;
-            }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Win32S
-        /// </summary>
-        public bool IsWin32S
-        {
-            get { return platform == PlatformID.Win32S; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Win32Windows
-        /// </summary>
-        public bool IsWin32Windows
-        {
-            get { return platform == PlatformID.Win32Windows; }
-        }
-
-        /// <summary>
-        ///  Return true if the platform is Win32NT
-        /// </summary>
-        public bool IsWin32NT
-        {
-            get { return platform == PlatformID.Win32NT; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows CE
-        /// </summary>
-        public bool IsWinCE
-        {
-            get { return (int)platform == 3; } // PlatformID.WinCE not defined in .NET 1.0
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 95
-        /// </summary>
-        public bool IsWin95
-        {
-            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 0; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 98
-        /// </summary>
-        public bool IsWin98
-        {
-            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 10; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows ME
-        /// </summary>
-        public bool IsWinME
-        {
-            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 90; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is NT 3
-        /// </summary>
-        public bool IsNT3
-        {
-            get { return platform == PlatformID.Win32NT && version.Major == 3; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is NT 4
-        /// </summary>
-        public bool IsNT4
-        {
-            get { return platform == PlatformID.Win32NT && version.Major == 4; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is NT 5
-        /// </summary>
-        public bool IsNT5
-        {
-            get { return platform == PlatformID.Win32NT && version.Major == 5; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 2000
-        /// </summary>
-        public bool IsWin2K
-        {
-            get { return IsNT5 && version.Minor == 0; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows XP
-        /// </summary>
-        public bool IsWinXP
-        {
-            get { return IsNT5 && version.Minor == 1 || (version.Minor == 2 && Product == ProductType.WorkStation); }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 2003 Server
-        /// </summary>
-        public bool IsWin2003Server
-        {
-            get { return IsNT5 && version.Minor == 2 && Product == ProductType.Server; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is NT 6
-        /// </summary>
-        public bool IsNT6
-        {
-            get { return platform == PlatformID.Win32NT && version.Major == 6; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Vista
-        /// </summary>
-        public bool IsVista
-        {
-            get { return IsNT6 && version.Minor == 0 && Product == ProductType.WorkStation; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 2008 Server (original or R2)
-        /// </summary>
-        public bool IsWin2008Server
-        {
-            get { return IsNT6 && Product == ProductType.Server; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 2008 Server (original)
-        /// </summary>
-        public bool IsWin2008ServerR1
-        {
-            get { return IsNT6 && version.Minor == 0 && Product == ProductType.Server; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 2008 Server R2
-        /// </summary>
-        public bool IsWin2008ServerR2
-        {
-            get { return IsNT6 && version.Minor == 1 && Product == ProductType.Server; }
-        }
-
-        /// <summary>
-        /// Return true if the platform is Windows 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; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Runtime.InteropServices;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// OSPlatform represents a particular operating system platform
+    /// </summary>
+    public class OSPlatform
+    {
+        PlatformID platform;
+        Version version;
+        ProductType product;
+
+        #region Static Members
+        private static OSPlatform currentPlatform;
+
+        
+        /// <summary>
+        /// Platform ID for Unix as defined by Microsoft .NET 2.0 and greater
+        /// </summary>
+        public static readonly PlatformID UnixPlatformID_Microsoft = (PlatformID)4;
+
+        /// <summary>
+        /// Platform ID for Unix as defined by Mono
+        /// </summary>
+        public static readonly PlatformID UnixPlatformID_Mono = (PlatformID)128;
+
+        /// <summary>
+        /// Get the OSPlatform under which we are currently running
+        /// </summary>
+        public static OSPlatform CurrentPlatform
+        {
+            get
+            {
+                if (currentPlatform == null)
+                {
+                    OperatingSystem os = Environment.OSVersion;
+
+                    if (os.Platform == PlatformID.Win32NT && os.Version.Major >= 5)
+                    {
+                        OSVERSIONINFOEX osvi = new OSVERSIONINFOEX();
+                        osvi.dwOSVersionInfoSize = (uint)Marshal.SizeOf(osvi);
+                        GetVersionEx(ref osvi);
+                        currentPlatform = new OSPlatform(os.Platform, os.Version, (ProductType)osvi.ProductType);
+                    }
+                    else
+                        currentPlatform = new OSPlatform(os.Platform, os.Version);
+                }
+
+                return currentPlatform;
+            }
+        }
+        #endregion
+
+        #region Members used for Win32NT platform only
+        /// <summary>
+        /// Product Type Enumeration used for Windows
+        /// </summary>
+        public enum ProductType
+        {
+            /// <summary>
+            /// Product type is unknown or unspecified
+            /// </summary>
+            Unknown,
+
+            /// <summary>
+            /// Product type is Workstation
+            /// </summary>
+            WorkStation,
+
+            /// <summary>
+            /// Product type is Domain Controller
+            /// </summary>
+            DomainController,
+
+            /// <summary>
+            /// Product type is Server
+            /// </summary>
+            Server,
+        }
+
+        [StructLayout(LayoutKind.Sequential)]
+        struct OSVERSIONINFOEX
+        {
+            public uint dwOSVersionInfoSize;
+            public uint dwMajorVersion;
+            public uint dwMinorVersion;
+            public uint dwBuildNumber;
+            public uint dwPlatformId;
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
+            public string szCSDVersion;
+            public Int16 wServicePackMajor;
+            public Int16 wServicePackMinor;
+            public Int16 wSuiteMask;
+            public Byte ProductType;
+            public Byte Reserved;
+        }
+
+        [DllImport("Kernel32.dll")]
+        private static extern bool GetVersionEx(ref OSVERSIONINFOEX osvi);
+        #endregion
+
+        /// <summary>
+        /// Construct from a platform ID and version
+        /// </summary>
+        public OSPlatform(PlatformID platform, Version version)
+        {
+            this.platform = platform;
+            this.version = version;
+        }
+
+        /// <summary>
+        /// Construct from a platform ID, version and product type
+        /// </summary>
+        public OSPlatform(PlatformID platform, Version version, ProductType product)
+            : this( platform, version )
+        {
+            this.product = product;
+        }
+
+        /// <summary>
+        /// Get the platform ID of this instance
+        /// </summary>
+        public PlatformID Platform
+        {
+            get { return platform; }
+        }
+
+        /// <summary>
+        /// Get the Version of this instance
+        /// </summary>
+        public Version Version
+        {
+            get { return version; }
+        }
+
+        /// <summary>
+        /// Get the Product Type of this instance
+        /// </summary>
+        public ProductType Product
+        {
+            get { return product; }
+        }
+
+        /// <summary>
+        /// Return true if this is a windows platform
+        /// </summary>
+        public bool IsWindows
+        {
+            get
+            {
+                return platform == PlatformID.Win32NT
+                    || platform == PlatformID.Win32Windows
+                    || platform == PlatformID.Win32S
+                    || platform == PlatformID.WinCE;
+            }
+        }
+
+        /// <summary>
+        /// Return true if this is a Unix or Linux platform
+        /// </summary>
+        public bool IsUnix
+        {
+            get
+            {
+                return platform == UnixPlatformID_Microsoft
+                    || platform == UnixPlatformID_Mono;
+            }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Win32S
+        /// </summary>
+        public bool IsWin32S
+        {
+            get { return platform == PlatformID.Win32S; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Win32Windows
+        /// </summary>
+        public bool IsWin32Windows
+        {
+            get { return platform == PlatformID.Win32Windows; }
+        }
+
+        /// <summary>
+        ///  Return true if the platform is Win32NT
+        /// </summary>
+        public bool IsWin32NT
+        {
+            get { return platform == PlatformID.Win32NT; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows CE
+        /// </summary>
+        public bool IsWinCE
+        {
+            get { return (int)platform == 3; } // PlatformID.WinCE not defined in .NET 1.0
+        }
+
+#if (CLR_2_0 || CLR_4_0) && !NETCF
+        /// <summary>
+        /// Return true if the platform is Xbox
+        /// </summary>
+        public bool IsXbox
+        {
+            get { return platform == PlatformID.Xbox; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is MacOSX
+        /// </summary>
+        public bool IsMacOSX
+        {
+            get { return platform == PlatformID.MacOSX; }
+        }
+#endif
+
+        /// <summary>
+        /// Return true if the platform is Windows 95
+        /// </summary>
+        public bool IsWin95
+        {
+            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 0; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 98
+        /// </summary>
+        public bool IsWin98
+        {
+            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 10; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows ME
+        /// </summary>
+        public bool IsWinME
+        {
+            get { return platform == PlatformID.Win32Windows && version.Major == 4 && version.Minor == 90; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 3
+        /// </summary>
+        public bool IsNT3
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 3; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 4
+        /// </summary>
+        public bool IsNT4
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 4; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 5
+        /// </summary>
+        public bool IsNT5
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 5; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2000
+        /// </summary>
+        public bool IsWin2K
+        {
+            get { return IsNT5 && version.Minor == 0; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows XP
+        /// </summary>
+        public bool IsWinXP
+        {
+            get { return IsNT5 && version.Minor == 1 || (version.Minor == 2 && Product == ProductType.WorkStation); }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2003 Server
+        /// </summary>
+        public bool IsWin2003Server
+        {
+            get { return IsNT5 && version.Minor == 2 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is NT 6
+        /// </summary>
+        public bool IsNT6
+        {
+            get { return platform == PlatformID.Win32NT && version.Major == 6; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Vista
+        /// </summary>
+        public bool IsVista
+        {
+            get { return IsNT6 && version.Minor == 0 && Product == ProductType.WorkStation; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2008 Server (original or R2)
+        /// </summary>
+        public bool IsWin2008Server
+        {
+            get { return IsNT6 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2008 Server (original)
+        /// </summary>
+        public bool IsWin2008ServerR1
+        {
+            get { return IsNT6 && version.Minor == 0 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 2008 Server R2
+        /// </summary>
+        public bool IsWin2008ServerR2
+        {
+            get { return IsNT6 && version.Minor == 1 && Product == ProductType.Server; }
+        }
+
+        /// <summary>
+        /// Return true if the platform is Windows 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 17ab9d3..4be8786 100644
--- a/src/NUnitCore/interfaces/PropertyNames.cs
+++ b/src/NUnitCore/interfaces/PropertyNames.cs
@@ -1,59 +1,59 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// The PropertyNames struct lists common property names, which are
-    /// accessed by reflection in the NUnit core. This provides a modicum 
-    /// of type safety as opposed to using the strings directly.
-    /// </summary>
-    public struct PropertyNames
-    {
-        /// <summary>Exception Type expected from a test</summary>
-        public static readonly string ExpectedException = "ExpectedException";
-        /// <summary>Exception Type expected from a test (pre-2.5)</summary>
-        public static readonly string LegacyExceptionType = "ExceptionType";
-        /// <summary>FullName of the Exception Type expected from a test</summary>
-        public static readonly string ExpectedExceptionName = "ExpectedExceptionName";
-        /// <summary>FullName of the Exception Type expected from a test (pre-2.5)</summary>
-        public static readonly string LegacyExceptionName = "ExceptionName";
-        /// <summary>ExpectedException Message</summary>
-        public static readonly string ExpectedMessage = "ExpectedMessage";
-        /// <summary>ExpectedException MatchType</summary>
-        public static readonly string MatchType = "MatchType";
-        /// <summary>Expected return result from test</summary>
-        public static readonly string 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>
-        public static readonly string TestName = "TestName";
-        /// <summary>Arguments for the test</summary>
-        public static readonly string Arguments = "Arguments";
-        /// <summary>Indicates test case is ignored</summary>
-        public static readonly string Ignored = "Ignored";
-        /// <summary>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>
-        public static readonly string Properties = "Properties";
-        /// <summary>Categories of the test</summary>
-        public static readonly string Categories = "Categories";
-        /// <summary>Name of a category</summary>
-        public static readonly string CategoryName = "Name";
-        /// <summary>Reason for not running a test</summary>
-        public static readonly string Reason = "Reason";
-        /// <summary>Flag indicating excluded test should be marked as Ignored</summary>
-        public static readonly string IgnoreExcluded = "IgnoreExcluded";
-        /// <summary>Name of an addin that must be present to run a test</summary>
-        public static readonly string RequiredAddin = "RequiredAddin";
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// The PropertyNames struct lists common property names, which are
+    /// accessed by reflection in the NUnit core. This provides a modicum 
+    /// of type safety as opposed to using the strings directly.
+    /// </summary>
+    public struct PropertyNames
+    {
+        /// <summary>Exception Type expected from a test</summary>
+        public static readonly string ExpectedException = "ExpectedException";
+        /// <summary>Exception Type expected from a test (pre-2.5)</summary>
+        public static readonly string LegacyExceptionType = "ExceptionType";
+        /// <summary>FullName of the Exception Type expected from a test</summary>
+        public static readonly string ExpectedExceptionName = "ExpectedExceptionName";
+        /// <summary>FullName of the Exception Type expected from a test (pre-2.5)</summary>
+        public static readonly string LegacyExceptionName = "ExceptionName";
+        /// <summary>ExpectedException Message</summary>
+        public static readonly string ExpectedMessage = "ExpectedMessage";
+        /// <summary>ExpectedException MatchType</summary>
+        public static readonly string MatchType = "MatchType";
+        /// <summary>Expected return result from test</summary>
+        public static readonly string 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>
+        public static readonly string TestName = "TestName";
+        /// <summary>Arguments for the test</summary>
+        public static readonly string Arguments = "Arguments";
+        /// <summary>Indicates test case is ignored</summary>
+        public static readonly string Ignored = "Ignored";
+        /// <summary>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>
+        public static readonly string Properties = "Properties";
+        /// <summary>Categories of the test</summary>
+        public static readonly string Categories = "Categories";
+        /// <summary>Name of a category</summary>
+        public static readonly string CategoryName = "Name";
+        /// <summary>Reason for not running a test</summary>
+        public static readonly string Reason = "Reason";
+        /// <summary>Flag indicating excluded test should be marked as Ignored</summary>
+        public static readonly string IgnoreExcluded = "IgnoreExcluded";
+        /// <summary>Name of an addin that must be present to run a test</summary>
+        public static readonly string RequiredAddin = "RequiredAddin";
+    }
+}
diff --git a/src/NUnitCore/interfaces/ResultState.cs b/src/NUnitCore/interfaces/ResultState.cs
index 4a8128c..069c7c5 100644
--- a/src/NUnitCore/interfaces/ResultState.cs
+++ b/src/NUnitCore/interfaces/ResultState.cs
@@ -1,88 +1,88 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// The ResultState enum indicates the result of running a test
-	/// </summary>
-	public enum ResultState
-	{
-        /// <summary>
-        /// The result is inconclusive
-        /// </summary>
-        Inconclusive = 0,
-
-        /// <summary>
-        /// The test was not runnable.
-        /// </summary>
-		NotRunnable = 1, 
-
-        /// <summary>
-        /// The test has been skipped. 
-        /// </summary>
-		Skipped = 2,
-
-        /// <summary>
-        /// The test has been ignored.
-        /// </summary>
-		Ignored = 3,
-
-        /// <summary>
-        /// The test succeeded
-        /// </summary>
-		Success = 4,
-
-        /// <summary>
-        /// The test failed
-        /// </summary>
-		Failure = 5,
-
-        /// <summary>
-        /// The test encountered an unexpected exception
-        /// </summary>
-		Error = 6,
-
-        /// <summary>
-        /// The test was cancelled by the user
-        /// </summary>
-        Cancelled =7
-	}
-
-    /// <summary>
-    /// The FailureSite enum indicates the stage of a test
-    /// in which an error or failure occured.
-    /// </summary>
-    public enum FailureSite
-    {
-        /// <summary>
-        /// Failure in the test itself
-        /// </summary>
-        Test,
-
-        /// <summary>
-        /// Failure in the SetUp method
-        /// </summary>
-        SetUp,
-
-        /// <summary>
-        /// Failure in the TearDown method
-        /// </summary>
-        TearDown,
-
-        /// <summary>
-        /// Failure of a parent test
-        /// </summary>
-        Parent,
-
-        /// <summary>
-        /// Failure of a child test
-        /// </summary>
-        Child
-    }
-
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// The ResultState enum indicates the result of running a test
+	/// </summary>
+	public enum ResultState
+	{
+        /// <summary>
+        /// The result is inconclusive
+        /// </summary>
+        Inconclusive = 0,
+
+        /// <summary>
+        /// The test was not runnable.
+        /// </summary>
+		NotRunnable = 1, 
+
+        /// <summary>
+        /// The test has been skipped. 
+        /// </summary>
+		Skipped = 2,
+
+        /// <summary>
+        /// The test has been ignored.
+        /// </summary>
+		Ignored = 3,
+
+        /// <summary>
+        /// The test succeeded
+        /// </summary>
+		Success = 4,
+
+        /// <summary>
+        /// The test failed
+        /// </summary>
+		Failure = 5,
+
+        /// <summary>
+        /// The test encountered an unexpected exception
+        /// </summary>
+		Error = 6,
+
+        /// <summary>
+        /// The test was cancelled by the user
+        /// </summary>
+        Cancelled =7
+	}
+
+    /// <summary>
+    /// The FailureSite enum indicates the stage of a test
+    /// in which an error or failure occured.
+    /// </summary>
+    public enum FailureSite
+    {
+        /// <summary>
+        /// Failure in the test itself
+        /// </summary>
+        Test,
+
+        /// <summary>
+        /// Failure in the SetUp method
+        /// </summary>
+        SetUp,
+
+        /// <summary>
+        /// Failure in the TearDown method
+        /// </summary>
+        TearDown,
+
+        /// <summary>
+        /// Failure of a parent test
+        /// </summary>
+        Parent,
+
+        /// <summary>
+        /// Failure of a child test
+        /// </summary>
+        Child
+    }
+
+}
diff --git a/src/NUnitCore/interfaces/RunState.cs b/src/NUnitCore/interfaces/RunState.cs
index dda6b59..cc1e0fe 100644
--- a/src/NUnitCore/interfaces/RunState.cs
+++ b/src/NUnitCore/interfaces/RunState.cs
@@ -1,53 +1,53 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// The RunState enum indicates whether a test
-    /// can be executed. When used on a TestResult
-    /// it may also indicate whether the test has
-    /// been executed. See individual values for
-    /// restrictions on use.
-	/// </summary>
-	public enum RunState
-	{
-        /// <summary>
-        /// The test is not runnable.
-        /// </summary>
-		NotRunnable, 
-
-        /// <summary>
-        /// The test is runnable. This value would 
-        /// normally not appear on a TestResult, since
-        /// it would change to Executed.
-        /// </summary>
-		Runnable,
-
-        /// <summary>
-        /// The test can only be run explicitly. Would
-        /// normally not appear on a TestResult, since
-        /// it would change to Executed or Skipped.
-        /// </summary>
-		Explicit,
-
-        /// <summary>
-        /// The test has been skipped. This value may
-        /// appear on a Test when certain attributes
-        /// are used to skip the test.
-        /// </summary>
-		Skipped,
-
-        /// <summary>
-        /// The test has been ignored. May appear on
-        /// a Test, when the IgnoreAttribute is used.
-        /// Appears on a TestResult in that case or
-        /// if the test is dynamically ignored.
-        /// </summary>
-		Ignored
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// The RunState enum indicates whether a test
+    /// can be executed. When used on a TestResult
+    /// it may also indicate whether the test has
+    /// been executed. See individual values for
+    /// restrictions on use.
+	/// </summary>
+	public enum RunState
+	{
+        /// <summary>
+        /// The test is not runnable.
+        /// </summary>
+		NotRunnable, 
+
+        /// <summary>
+        /// The test is runnable. This value would 
+        /// normally not appear on a TestResult, since
+        /// it would change to Executed.
+        /// </summary>
+		Runnable,
+
+        /// <summary>
+        /// The test can only be run explicitly. Would
+        /// normally not appear on a TestResult, since
+        /// it would change to Executed or Skipped.
+        /// </summary>
+		Explicit,
+
+        /// <summary>
+        /// The test has been skipped. This value may
+        /// appear on a Test when certain attributes
+        /// are used to skip the test.
+        /// </summary>
+		Skipped,
+
+        /// <summary>
+        /// The test has been ignored. May appear on
+        /// a Test, when the IgnoreAttribute is used.
+        /// Appears on a TestResult in that case or
+        /// if the test is dynamically ignored.
+        /// </summary>
+		Ignored
+	}
+}
diff --git a/src/NUnitCore/interfaces/RuntimeFramework.cs b/src/NUnitCore/interfaces/RuntimeFramework.cs
index 45c3aa6..4381516 100644
--- a/src/NUnitCore/interfaces/RuntimeFramework.cs
+++ b/src/NUnitCore/interfaces/RuntimeFramework.cs
@@ -1,547 +1,635 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using System.Collections;
-using Microsoft.Win32;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Enumeration identifying a common language 
-	/// runtime implementation.
-	/// </summary>
-	public enum RuntimeType
-	{
-        /// <summary>Any 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 represents a particular version
-	/// of a common language runtime implementation.
-	/// </summary>
-    [Serializable]
-	public sealed class RuntimeFramework
-    {
-        #region Static and Instance Fields
-
-        /// <summary>
-        /// DefaultVersion is an empty Version, used to indicate that
-        /// NUnit should select the CLR version to use for the test.
-        /// </summary>
-        public static readonly Version DefaultVersion = new Version();
-
-        private static RuntimeFramework currentFramework;
-        private static RuntimeFramework[] availableFrameworks;
-        private 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;
-        private Version clrVersion;
-		private string displayName;
-        #endregion
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Collections;
+using Microsoft.Win32;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Enumeration identifying a common language 
+	/// runtime implementation.
+	/// </summary>
+	public enum RuntimeType
+	{
+        /// <summary>Any 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 represents a particular version
+	/// of a common language runtime implementation.
+	/// </summary>
+    [Serializable]
+	public sealed class RuntimeFramework
+    {
+        #region Static and Instance Fields
+
+        /// <summary>
+        /// DefaultVersion is an empty Version, used to indicate that
+        /// NUnit should select the CLR version to use for the test.
+        /// </summary>
+        public static readonly Version DefaultVersion = new Version();
+
+        private static RuntimeFramework currentFramework;
+        private static RuntimeFramework[] availableFrameworks;
+        //private 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;
+        private Version clrVersion;
+		private string displayName;
+        #endregion
+
         #region Constructor
 
         /// <summary>
-		/// Construct from a runtime type and version
-		/// </summary>
-		/// <param name="runtime">The runtime type of the framework</param>
-		/// <param name="version">The version of the framework</param>
-		public RuntimeFramework( RuntimeType runtime, Version version)
-		{
-            this.runtime = runtime;
-
-            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)
+        /// Construct from a runtime type and version. If the version has
+        /// two parts, it is taken as a framework version. If it has three
+        /// or more, it is taken as a CLR version. In either case, the other
+        /// version is deduced based on the runtime type and provided 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;
+
+            if (version.Build < 0)
+                InitFromFrameworkVersion(version);
+            else
+                InitFromClrVersion(version);
+
+
+            //if (version.Major == 3)
+            //    this.clrVersion = new Version(2, 0, 50727);
+            //if(version.Major == 4)
+            //    this.clrVersion = new Version(4, 0, 30319);
+            //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
+            if (version.Major > 0) // 0 means any version
 
-        /// <summary>
-        /// Static method to return a RuntimeFramework object
-        /// for the framework that is currently in use.
-        /// </summary>
-        public static RuntimeFramework CurrentFramework
-        {
-            get
-            {
-                if (currentFramework == null)
+                switch (version.Major)
                 {
-                    Type monoRuntimeType = Type.GetType("Mono.Runtime", false);
-                    bool isMono = monoRuntimeType != null;
-
-                    RuntimeType runtime = isMono ? RuntimeType.Mono : RuntimeType.Net;
-
-                    int major = Environment.Version.Major;
-                    int minor = Environment.Version.Minor;
-
-                    if (isMono)
-					{
-						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)
+                    case 1:
+                        switch (version.Minor)
                         {
-                            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;
-                                }
-                            }
+                            case 0:
+                                this.clrVersion = Runtime == RuntimeType.Mono
+                                    ? new Version(1, 1, 4322)
+                                    : new Version(1, 0, 3705);
+                                break;
+                            case 1:
+                                if (Runtime == RuntimeType.Mono)
+                                    this.frameworkVersion = new Version(1, 0);
+                                this.clrVersion = new Version(1, 1, 4322);
+                                break;
+                            default:
+                                ThrowInvalidFrameworkVersion(version);
+                                break;
                         }
-                    }
-
-                    currentFramework = new RuntimeFramework(runtime, new Version(major, minor));
-                    currentFramework.clrVersion = Environment.Version;
-
-                    if (isMono)
-                    {
-                        MethodInfo getDisplayNameMethod = monoRuntimeType.GetMethod(
-                            "GetDisplayName", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.ExactBinding);
-                        if (getDisplayNameMethod != null)
-                            currentFramework.displayName += string.Format(" ( {0} )",
-                                (string)getDisplayNameMethod.Invoke(null, new object[0]));
-                    }
-                }
-
-                return currentFramework;
-            }
-        }
-
-        /// <summary>
-        /// Gets an array of all available frameworks
-        /// </summary>
-        public static RuntimeFramework[] AvailableFrameworks
-        {
-            get
-            {
-                if (availableFrameworks == null)
-                {
-                    FrameworkCollection frameworks = new FrameworkCollection();
-
-                    AppendDotNetFrameworks(frameworks);
-                    AppendDefaultMonoFramework(frameworks);
-                    // NYI
-                    //AppendMonoFrameworks(frameworks);
-
-                    availableFrameworks = frameworks.ToArray();
+                        break;
+                    case 2:
+                    case 3:
+                        this.clrVersion = new Version(2, 0, 50727);
+                        break;
+                    case 4:
+                        this.clrVersion = new Version(4, 0, 30319);
+                        break;
+                    default:
+                        ThrowInvalidFrameworkVersion(version);
+                        break;
                 }
-
-                return availableFrameworks;
-            }
-        }
-
-        /// <summary>
-        /// Returns true if the current RuntimeFramework is available.
-        /// In the current implementation, only Mono and Microsoft .NET
-        /// are supported.
-        /// </summary>
-        /// <returns>True if it's available, false if not</returns>
-        public bool IsAvailable
-        {
-            get
-            {
-                foreach (RuntimeFramework framework in AvailableFrameworks)
-                    if (this.Supports(framework))
-                        return true;
-
-                return false;
-            }
-        }
-
-        /// <summary>
-        /// The type of this runtime framework
-        /// </summary>
-        public RuntimeType Runtime
-        {
-            get { return runtime; }
-        }
-
-        /// <summary>
-        /// The framework version for this runtime framework
-        /// </summary>
-        public Version FrameworkVersion
-        {
-            get { return frameworkVersion; }
-        }
-
-        /// <summary>
-        /// The CLR version for this runtime framework
-        /// </summary>
-        public Version ClrVersion
-        {
-            get { return clrVersion; }
-        }
-
-        /// <summary>
-        /// Return true if any CLR version may be used in
-        /// matching this RuntimeFramework object.
-        /// </summary>
-        public bool AllowAnyVersion
-        {
-            get { return this.clrVersion == DefaultVersion; }
-        }
-
-        /// <summary>
-        /// Returns the Display name for this framework
-        /// </summary>
-        public string DisplayName
-        {
-            get { return displayName; }
-        }
-
-        #endregion
-
-        #region Public Methods
-
-        /// <summary>
-        /// Parses a string representing a RuntimeFramework.
-        /// The string may be just a RuntimeType name or just
-        /// a Version or a hyphentated RuntimeType-Version or
-        /// a Version prefixed by 'v'.
-        /// </summary>
-        /// <param name="s"></param>
-        /// <returns></returns>
-        public static RuntimeFramework Parse(string s)
-        {
-            RuntimeType runtime = RuntimeType.Any;
-            Version version = DefaultVersion;
-
-            string[] parts = s.Split(new char[] { '-' });
-            if (parts.Length == 2)
-            {
-                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), parts[0], true);
-                string vstring = parts[1];
-                if (vstring != "")
-                    version = new Version(vstring);
-            }
-            else if (char.ToLower(s[0]) == 'v')
-            {
-                version = new Version(s.Substring(1));
-            }
-            else if (IsRuntimeTypeName(s))
-            {
-                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), s, true);
-            }
-            else
-            {
-                version = new Version(s);
-            }
-
-            return new RuntimeFramework(runtime, version);
-        }
-
-        /// <summary>
-        /// Returns the best available framework that matches a target framework.
-        /// If the target framework has a build number specified, then an exact
-        /// match is needed. Otherwise, the matching framework with the highest
-        /// build number is used.
-        /// </summary>
-        /// <param name="target"></param>
-        /// <returns></returns>
-        public static RuntimeFramework GetBestAvailableFramework(RuntimeFramework target)
-        {
-            RuntimeFramework result = target;
-
-            if (target.ClrVersion.Build < 0)
-            {
-                foreach (RuntimeFramework framework in AvailableFrameworks)
-                    if (framework.Supports(target) && 
-                        framework.ClrVersion.Build > result.ClrVersion.Build)
-                    {
-                        result = framework;
-                    }
-            }
-
-            return result;
-        }
-
-        /// <summary>
-        /// Overridden to return the short name of the framework
-        /// </summary>
-        /// <returns></returns>
-		public override string ToString()
-		{
-            if (this.AllowAnyVersion)
-            {
-                return runtime.ToString().ToLower();
-            }
-            else
-            {
-                string vstring = frameworkVersion.ToString();
-                if (runtime == RuntimeType.Any)
-                    return "v" + vstring;
-                else
-                    return runtime.ToString().ToLower() + "-" + vstring;
-            }
-		}
-
-        /// <summary>
-        /// Returns true if this framework'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="target">The RuntimeFramework to be matched.</param>
-        /// <returns>True on match, otherwise false</returns>
-        public bool Supports(RuntimeFramework target)
-        {
-            if (this.Runtime != RuntimeType.Any
-                && target.Runtime != RuntimeType.Any
-                && this.Runtime != target.Runtime)
-                return false;
-
-            if (this.AllowAnyVersion || target.AllowAnyVersion)
-                return true;
-
-            return VersionsMatch(this.ClrVersion, target.ClrVersion)
-                && this.FrameworkVersion.Major >= target.FrameworkVersion.Major
-                && this.FrameworkVersion.Minor >= target.FrameworkVersion.Minor;
-        }
-
-        #endregion
-
-        #region Helper Methods
-
-        private static bool IsRuntimeTypeName(string name)
-        {
-            foreach (string item in Enum.GetNames(typeof(RuntimeType)))
-                if (item.ToLower() == name.ToLower())
-                    return true;
-
-            return false;
-        }
-
-        private static string GetDefaultDisplayName(RuntimeType runtime, Version version)
-        {
-            if (version == DefaultVersion)
-                return runtime.ToString();
-            else if (runtime == RuntimeType.Any)
-                return "v" + version.ToString();
-            else
-                return runtime.ToString() + " " + version.ToString();
-        }
-
-        private static 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)
+        private static void ThrowInvalidFrameworkVersion(Version version)
         {
-            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
-                AppendAllMonoFrameworks(frameworks);
-            else
-                AppendDefaultMonoFramework(frameworks);
+            throw new ArgumentException("Unknown framework version " + version.ToString(), "version");
         }
 
-        private static void AppendAllMonoFrameworks(FrameworkCollection frameworks)
+        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
+
+        /// <summary>
+        /// Static method to return a RuntimeFramework object
+        /// for the framework that is currently in use.
+        /// </summary>
+        public static RuntimeFramework CurrentFramework
+        {
+            get
+            {
+                if (currentFramework == null)
+                {
+                    Type monoRuntimeType = Type.GetType("Mono.Runtime", false);
+                    bool isMono = monoRuntimeType != null;
+
+                    RuntimeType runtime = isMono ? RuntimeType.Mono : RuntimeType.Net;
+
+                    int major = Environment.Version.Major;
+                    int minor = Environment.Version.Minor;
+
+                    if (isMono)
+					{
+						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;
+                                }
+                            }
+                        }
+                    }
+                    else if (major == 4)
+                    {
+                        minor = Type.GetType("System.Reflection.ReflectionContext", false) != null
+                            ? 5
+                            : 0;
+                    }
+
+                    currentFramework = new RuntimeFramework(runtime, new Version(major, minor));
+                    currentFramework.clrVersion = Environment.Version;
+
+                    if (isMono)
+                    {
+                        MethodInfo getDisplayNameMethod = monoRuntimeType.GetMethod(
+                            "GetDisplayName", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.ExactBinding);
+                        if (getDisplayNameMethod != null)
+                            currentFramework.displayName += string.Format(" ( {0} )",
+                                (string)getDisplayNameMethod.Invoke(null, new object[0]));
+                    }
+                }
+
+                return currentFramework;
+            }
+        }
+
+        /// <summary>
+        /// Gets an array of all available frameworks
+        /// </summary>
+        public static RuntimeFramework[] AvailableFrameworks
+        {
+            get
+            {
+                if (availableFrameworks == null)
+                {
+                    FrameworkCollection frameworks = new FrameworkCollection();
+
+                    AppendDotNetFrameworks(frameworks);
+                    AppendDefaultMonoFramework(frameworks);
+                    // NYI
+                    //AppendMonoFrameworks(frameworks);
+
+                    availableFrameworks = frameworks.ToArray();
+                }
+
+                return availableFrameworks;
+            }
+        }
+
+        /// <summary>
+        /// Returns true if the current RuntimeFramework is available.
+        /// In the current implementation, only Mono and Microsoft .NET
+        /// are supported.
+        /// </summary>
+        /// <returns>True if it's available, false if not</returns>
+        public bool IsAvailable
+        {
+            get
+            {
+                foreach (RuntimeFramework framework in AvailableFrameworks)
+                    if (this.Supports(framework))
+                        return true;
+
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// The type of this runtime framework
+        /// </summary>
+        public RuntimeType Runtime
+        {
+            get { return runtime; }
+        }
+
+        /// <summary>
+        /// The framework version for this runtime framework
+        /// </summary>
+        public Version FrameworkVersion
+        {
+            get { return frameworkVersion; }
+        }
+
+        /// <summary>
+        /// The CLR version for this runtime framework
+        /// </summary>
+        public Version ClrVersion
+        {
+            get { return clrVersion; }
+        }
+
+        /// <summary>
+        /// Return true if any CLR version may be used in
+        /// matching this RuntimeFramework object.
+        /// </summary>
+        public bool AllowAnyVersion
+        {
+            get { return this.clrVersion == DefaultVersion; }
+        }
+
+        /// <summary>
+        /// Returns the Display name for this framework
+        /// </summary>
+        public string DisplayName
+        {
+            get { return displayName; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        /// <summary>
+        /// Parses a string representing a RuntimeFramework.
+        /// The string may be just a RuntimeType name or just
+        /// a Version or a hyphentated RuntimeType-Version or
+        /// a Version prefixed by 'v'.
+        /// </summary>
+        /// <param name="s"></param>
+        /// <returns></returns>
+        public static RuntimeFramework Parse(string s)
+        {
+            RuntimeType runtime = RuntimeType.Any;
+            Version version = DefaultVersion;
+
+            string[] parts = s.Split(new char[] { '-' });
+            if (parts.Length == 2)
+            {
+                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), parts[0], true);
+                string vstring = parts[1];
+                if (vstring != "")
+                    version = new Version(vstring);
+            }
+            else if (char.ToLower(s[0]) == 'v')
+            {
+                version = new Version(s.Substring(1));
+            }
+            else if (IsRuntimeTypeName(s))
+            {
+                runtime = (RuntimeType)System.Enum.Parse(typeof(RuntimeType), s, true);
+            }
+            else
+            {
+                version = new Version(s);
+            }
+
+            return new RuntimeFramework(runtime, version);
+        }
+
+        /// <summary>
+        /// Returns the best available framework that matches a target framework.
+        /// If the target framework has a build number specified, then an exact
+        /// match is needed. Otherwise, the matching framework with the highest
+        /// build number is used.
+        /// </summary>
+        /// <param name="target"></param>
+        /// <returns></returns>
+        public static RuntimeFramework GetBestAvailableFramework(RuntimeFramework target)
+        {
+            RuntimeFramework result = target;
+
+            if (target.ClrVersion.Build < 0)
+            {
+                foreach (RuntimeFramework framework in AvailableFrameworks)
+                    if (framework.Supports(target) && 
+                        framework.ClrVersion.Build > result.ClrVersion.Build)
+                    {
+                        result = framework;
+                    }
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// Overridden to return the short name of the framework
+        /// </summary>
+        /// <returns></returns>
+		public override string ToString()
+		{
+            if (this.AllowAnyVersion)
+            {
+                return runtime.ToString().ToLower();
+            }
+            else
+            {
+                string vstring = frameworkVersion.ToString();
+                if (runtime == RuntimeType.Any)
+                    return "v" + vstring;
+                else
+                    return runtime.ToString().ToLower() + "-" + vstring;
+            }
+		}
+
+        /// <summary>
+        /// Returns true if this framework'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 and those requiring .NET 4.0 to run under 4.5.
+        /// </summary>
+        /// <param name="target">The RuntimeFramework to be matched.</param>
+        /// <returns>True on match, otherwise false</returns>
+        public bool Supports(RuntimeFramework target)
+        {
+            if (this.Runtime != RuntimeType.Any
+                && target.Runtime != RuntimeType.Any
+                && this.Runtime != target.Runtime)
+                return false;
+
+            if (this.AllowAnyVersion || target.AllowAnyVersion)
+                return true;
+
+            return VersionsMatch(this.ClrVersion, target.ClrVersion)
+                && this.FrameworkVersion.Major >= target.FrameworkVersion.Major
+                && this.FrameworkVersion.Minor >= target.FrameworkVersion.Minor;
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private static bool IsRuntimeTypeName(string name)
+        {
+            foreach (string item in Enum.GetNames(typeof(RuntimeType)))
+                if (item.ToLower() == name.ToLower())
+                    return true;
+
+            return false;
+        }
+
+        private static string GetDefaultDisplayName(RuntimeType runtime, Version version)
+        {
+            if (version == DefaultVersion)
+                return runtime.ToString();
+            else if (runtime == RuntimeType.Any)
+                return "v" + version.ToString();
+            else if (runtime == RuntimeType.Mono && version.Major == 1)
+                return "Mono 1.0";
+            else
+                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)
+                AppendAllMonoFrameworks(frameworks);
+            else
+                AppendDefaultMonoFramework(frameworks);
+        }
+
+        private static void AppendAllMonoFrameworks(FrameworkCollection frameworks)
+        {
+            // TODO: Find multiple installed Mono versions under Linux
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+            {
+                // Use registry to find alternate versions
+                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                if (key == null) return;
+
+                foreach (string version in key.GetSubKeyNames())
+                {
+                    RegistryKey subKey = key.OpenSubKey(version);
+                    string monoPrefix = subKey.GetValue("SdkInstallRoot") as string;
+
+                    AppendMonoFramework(frameworks, monoPrefix, version);
+                }
+            }
+            else
+                AppendDefaultMonoFramework(frameworks);
+        }
+
+        // This method works for Windows and Linux but currently
+        // is only called under Linux.
+        private static void AppendDefaultMonoFramework(FrameworkCollection frameworks)
+        {
+            string monoPrefix = null;
+            string version = null;
+
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+            {
+                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                if (key != null)
+                {
+                    version = key.GetValue("DefaultCLR") as string;
+                    if (version != null && version != "")
+                    {
+                        key = key.OpenSubKey(version);
+                        if (key != null)
+                            monoPrefix = key.GetValue("SdkInstallRoot") as string;
+                    }
+                }
+            }
+            else // Assuming we're currently running Mono - change if more runtimes are added
+            {
+                string libMonoDir = Path.GetDirectoryName(typeof(object).Assembly.Location);
+                monoPrefix = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(libMonoDir)));
+            }
+
+            AppendMonoFramework(frameworks, monoPrefix, version);
+        }
+
+        private static void AppendMonoFramework(FrameworkCollection frameworks, string monoPrefix, string version)
+        {
+            if (monoPrefix != null)
+            {
+                string displayFmt = version != null
+                    ? "Mono " + version + " - {0} Profile"
+                    : "Mono {0} Profile";
+
+                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/1.0/mscorlib.dll")))
+                {
+                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(1, 1, 4322));
+                    framework.displayName = string.Format(displayFmt, "1.0");
+                    frameworks.Add(framework);
+                }
+
+                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/2.0/mscorlib.dll")))
+                {
+                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(2, 0, 50727));
+                    framework.displayName = string.Format(displayFmt, "2.0");
+                    frameworks.Add(framework);
+                }
+
+                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/4.0/mscorlib.dll")))
+                {
+                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(4, 0, 30319));
+                    framework.displayName = string.Format(displayFmt, "4.0");
+                    frameworks.Add(framework);
+                }
+            }
+        }
+
+        private static void AppendDotNetFrameworks(FrameworkCollection frameworks)
         {
-            // TODO: Find multiple installed Mono versions under Linux
             if (Environment.OSVersion.Platform == PlatformID.Win32NT)
             {
-                // Use registry to find alternate versions
-                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
-                if (key == null) return;
-
-                foreach (string version in key.GetSubKeyNames())
-                {
-                    RegistryKey subKey = key.OpenSubKey(version);
-                    string monoPrefix = subKey.GetValue("SdkInstallRoot") as string;
-
-                    AppendMonoFramework(frameworks, monoPrefix, version);
-                }
-            }
-            else
-                AppendDefaultMonoFramework(frameworks);
-        }
-
-        // This method works for Windows and Linux but currently
-        // is only called under Linux.
-        private static void AppendDefaultMonoFramework(FrameworkCollection frameworks)
-        {
-            string monoPrefix = null;
-            string version = null;
+                // Handle Version 1.0, using a different registry key
+                AppendExtremelyOldDotNetFrameworkVersions(frameworks);
 
-            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
-            {
-                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Novell\Mono");
+                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\NET Framework Setup\NDP");
                 if (key != null)
                 {
-                    version = key.GetValue("DefaultCLR") as string;
-                    if (version != null && version != "")
+                    foreach (string name in key.GetSubKeyNames())
                     {
-                        key = key.OpenSubKey(version);
-                        if (key != null)
-                            monoPrefix = key.GetValue("SdkInstallRoot") as string;
+                        if (name.StartsWith("v"))
+                        {
+                            RegistryKey versionKey = key.OpenSubKey(name);
+
+                            if (name == "v4")
+                                // Version 4 and 4.5
+                                AppendDotNetFourFrameworkVersions(frameworks, versionKey);
+                            else
+                                // Versions 1.1 through 3.5
+                                AppendOlderDotNetFrameworkVersion(frameworks, versionKey, new Version(name.Substring(1)));
+                        }
                     }
                 }
             }
-            else // Assuming we're currently running Mono - change if more runtimes are added
-            {
-                string libMonoDir = Path.GetDirectoryName(typeof(object).Assembly.Location);
-                monoPrefix = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(libMonoDir)));
-            }
-
-            AppendMonoFramework(frameworks, monoPrefix, version);
         }
 
-        private static void AppendMonoFramework(FrameworkCollection frameworks, string monoPrefix, string version)
+        private static void AppendExtremelyOldDotNetFrameworkVersions(FrameworkCollection frameworks)
         {
-            if (monoPrefix != null)
-            {
-                string displayFmt = version != null
-                    ? "Mono " + version + " - {0} Profile"
-                    : "Mono {0} Profile";
-
-                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/1.0/mscorlib.dll")))
-                {
-                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(1, 1, 4322));
-                    framework.displayName = string.Format(displayFmt, "1.0");
-                    frameworks.Add(framework);
-                }
-
-                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/2.0/mscorlib.dll")))
-                {
-                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(2, 0, 50727));
-                    framework.displayName = string.Format(displayFmt, "2.0");
-                    frameworks.Add(framework);
-                }
+            RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NETFramework\policy\v1.0");
+            if (key != null)
+                foreach (string build in key.GetValueNames())
+                    frameworks.Add(new RuntimeFramework(RuntimeType.Net, new Version("1.0." + build)));
+        }
 
-                if (File.Exists(Path.Combine(monoPrefix, "lib/mono/4.0/mscorlib.dll")))
-                {
-                    RuntimeFramework framework = new RuntimeFramework(RuntimeType.Mono, new Version(4, 0, 30319));
-                    framework.displayName = string.Format(displayFmt, "4.0");
-                    frameworks.Add(framework);
-                }
-            }
+        private static void AppendOlderDotNetFrameworkVersion(FrameworkCollection frameworks, RegistryKey versionKey, Version version)
+        {
+            if (CheckInstallDword(versionKey))
+                frameworks.Add(new RuntimeFramework(RuntimeType.Net, version));
         }
 
-        private static void AppendDotNetFrameworks(FrameworkCollection frameworks)
+        // Note: this method cannot be generalized past V4, because (a)  it has
+        // specific code for detecting .NET 4.5 and (b) we don't know what
+        // microsoft will do in the future
+        private static void AppendDotNetFourFrameworkVersions(FrameworkCollection frameworks, RegistryKey versionKey)
         {
-            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+            // For now, we just look at the Full profile
+            RegistryKey profileKey = versionKey.OpenSubKey("Full");
+            if (CheckInstallDword(profileKey))
             {
-                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\.NETFramework\policy");
-                if (key != null)
+                RuntimeFramework framework = new RuntimeFramework(RuntimeType.Net, new Version(4, 0));
+                frameworks.Add(framework);
+
+                int release = (int)profileKey.GetValue("Release", 0);
+                if (release > 0)
                 {
-                    foreach (string name in key.GetSubKeyNames())
-                    {
-                        if (name.StartsWith("v"))
-                        {
-                            RegistryKey key2 = key.OpenSubKey(name);
-                            foreach (string build in key2.GetValueNames())
-                                frameworks.Add(new RuntimeFramework(RuntimeType.Net, new Version(name.Substring(1) + "." + build)));
-                        }
-                    }
+                    framework = new RuntimeFramework(RuntimeType.Net, new Version(4, 5));
+                    frameworks.Add(framework);
                 }
             }
         }
 
-#if CLR_2_0 || CLR_4_0
-        private class FrameworkCollection : System.Collections.Generic.List<RuntimeFramework> { }
-#else
-        private class FrameworkCollection : ArrayList 
+        private static bool CheckInstallDword(RegistryKey key)
         {
-            public new RuntimeFramework[] ToArray()
-            {
-                return (RuntimeFramework[])ToArray(typeof(RuntimeFramework));
-            }
+            return (int)key.GetValue("Install", 0) == 1;
         }
-#endif
 
-        #endregion
-    }
-}
+#if CLR_2_0 || CLR_4_0
+        private class FrameworkCollection : System.Collections.Generic.List<RuntimeFramework> { }
+#else
+        private class FrameworkCollection : ArrayList 
+        {
+            public new RuntimeFramework[] ToArray()
+            {
+                return (RuntimeFramework[])ToArray(typeof(RuntimeFramework));
+            }
+        }
+#endif
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/Test.cs b/src/NUnitCore/interfaces/Test.cs
index bb28d46..5074049 100644
--- a/src/NUnitCore/interfaces/Test.cs
+++ b/src/NUnitCore/interfaces/Test.cs
@@ -1,361 +1,392 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Collections;
-	using System.Collections.Specialized;
-    using System.Threading;
-	using System.Reflection;
-
-	/// <summary>
-	///		Test Class.
-	/// </summary>
-	public abstract class Test : ITest, IComparable
-    {
-        #region Constants
-        //private static readonly string SETCULTURE = "_SETCULTURE";
-        private static readonly string DESCRIPTION = "_DESCRIPTION";
-        private static readonly string IGNOREREASON = "_IGNOREREASON";
-        private static readonly string CATEGORIES = "_CATEGORIES";
-        #endregion
-
-        #region Fields
-        /// <summary>
-		/// TestName that identifies this test
-		/// </summary>
-		private TestName testName;
-
-		/// <summary>
-		/// Indicates whether the test should be executed
-		/// </summary>
-		private RunState runState;
-
-		/// <summary>
-		/// Test suite containing this test, or null
-		/// </summary>
-		private Test parent;
-		
-		/// <summary>
-		/// A dictionary of properties, used to add information
-		/// to tests without requiring the class to change.
-		/// </summary>
-		private IDictionary properties;
-
-		#endregion
-
-        #region Properties
-        /// <summary>
-        /// Return true if the test requires a thread
-        /// </summary>
-        public bool RequiresThread
-        {
-            get { return Properties.Contains("RequiresThread") && (bool)Properties["RequiresThread"]; }
-        }
-
-        /// <summary>
-        /// Get the desired apartment state for running the test
-        /// </summary>
-        public ApartmentState ApartmentState
-        {
-            get
-            {
-                return Properties.Contains("APARTMENT_STATE")
-                    ? (ApartmentState)Properties["APARTMENT_STATE"]
-                    : GetCurrentApartment();
-            }
-        }
-
-        /// <summary>
-        /// Get the current apartment state of the test
-        /// </summary>
-        protected ApartmentState GetCurrentApartment()
-        {
-#if CLR_2_0 || CLR_4_0
-            return Thread.CurrentThread.GetApartmentState();
-#else
-            return Thread.CurrentThread.ApartmentState;
-#endif
-        }
-
-        /// <summary>
-        /// Gets a boolean value indicating whether this 
-        /// test should run on it's own thread.
-        /// </summary>
-        protected virtual bool ShouldRunOnOwnThread
-        {
-            get
-            {
-                return RequiresThread
-                    || ApartmentState != ApartmentState.Unknown
-                    && ApartmentState != GetCurrentApartment();
-            }
-        }
-		#endregion
-
-        #region Construction
-
-        /// <summary>
-		/// Constructs a test given its name
-		/// </summary>
-		/// <param name="name">The name of the test</param>
-		protected Test( string name )
-		{
-			this.testName = new TestName();
-			this.testName.FullName = name;
-			this.testName.Name = name;
-			this.testName.TestID = new TestID();
-
-            this.runState = RunState.Runnable;
-		}
-
-		/// <summary>
-		/// Constructs a test given the path through the
-		/// test hierarchy to its parent and a name.
-		/// </summary>
-		/// <param name="pathName">The parent tests full name</param>
-		/// <param name="name">The name of the test</param>
-		protected Test( string pathName, string name ) 
-		{ 
-			this.testName = new TestName();
-			this.testName.FullName = pathName == null || pathName == string.Empty 
-				? name : pathName + "." + name;
-			this.testName.Name = name;
-			this.testName.TestID = new TestID();
-
-            this.runState = RunState.Runnable;
-		}
-
-		/// <summary>
-		/// Constructs a test given a TestName object
-		/// </summary>
-		/// <param name="testName">The TestName for this test</param>
-		protected Test( TestName testName )
-		{
-			this.testName = testName;
-			
-			this.runState = RunState.Runnable;
-		}
-
-		/// <summary>
-		/// Sets the runner id of a test and optionally its children
-		/// </summary>
-		/// <param name="runnerID">The runner id to be used</param>
-		/// <param name="recursive">True if all children should get the same id</param>
-		public void SetRunnerID( int runnerID, bool recursive )
-		{
-			this.testName.RunnerID = runnerID;
-
-			if ( recursive && this.Tests != null )
-				foreach( Test child in this.Tests )
-					child.SetRunnerID( runnerID, true );
-		}
-
-		#endregion
-
-		#region ITest Members
-
-        #region Properties
-		/// <summary>
-		/// Gets the TestName of the test
-		/// </summary>
-        public TestName TestName
-		{
-			get { return testName; }
-		}
-
-		/// <summary>
-		/// Gets a string representing the kind of test
-		/// that this object represents, for use in display.
-		/// </summary>
-        public abstract string TestType
-        {
-            get;
-        }
-
-
-		/// <summary>
-		/// Whether or not the test should be run
-		/// </summary>
-        public RunState RunState
-        {
-            get { return runState; }
-            set { runState = value; }
-        }
-
-		/// <summary>
-		/// Reason for not running the test, if applicable
-		/// </summary>
-		public string IgnoreReason
-		{
-			get { return (string)Properties[IGNOREREASON]; }
-			set 
-            {
-                if (value == null)
-                    Properties.Remove(IGNOREREASON);
-                else
-                    Properties[IGNOREREASON] = value;
-            }
-		}
-
-		/// <summary>
-		/// Gets a count of test cases represented by
-		/// or contained under this test.
-		/// </summary>
-		public virtual int TestCount 
-		{ 
-			get { return 1; } 
-		}
-
-		/// <summary>
-		/// Gets a list of categories associated with this test.
-		/// </summary>
-		public IList Categories 
-		{
-			get 
-            {
-                if (Properties[CATEGORIES] == null)
-                    Properties[CATEGORIES] = new ArrayList();
-
-                return (IList)Properties[CATEGORIES]; 
-            }
-			set 
-            {
-                Properties[CATEGORIES] = value; 
-            }
-		}
-
-		/// <summary>
-		/// Gets a description associated with this test.
-		/// </summary>
-		public String Description
-		{
-			get { return (string)Properties[DESCRIPTION]; }
-			set 
-            {
-                if (value == null)
-                    Properties.Remove(DESCRIPTION);
-                else
-                    Properties[DESCRIPTION] = value; 
-            }
-		}
-
-		/// <summary>
-		/// Gets the property dictionary for this test
-		/// </summary>
-		public IDictionary Properties
-		{
-			get 
-			{
-				if ( properties == null )
-					properties = new ListDictionary();
-
-				return properties; 
-			}
-			set
-			{
-				properties = value;
-			}
-		}
-
-		/// <summary>
-		/// Indicates whether this test is a suite
-		/// </summary>
-        public virtual bool IsSuite
-        {
-            get { return false; }
-        }
-
-
-		/// <summary>
-		/// Gets the parent test of this test
-		/// </summary>
-		ITest ITest.Parent 
-		{
-			get { return parent; }
-		}
-
-		/// <summary>
-		/// Gets the parent as a Test object.
-		/// Used by the core to set the parent.
-		/// </summary>
-		public Test Parent
-		{
-			get { return parent; }
-			set { parent = value; }
-		}
-
-		/// <summary>
-		/// Gets this test's child tests
-		/// </summary>
-		public virtual IList Tests 
-        {
-            get { return null; } 
-        }
-
-		/// <summary>
-		/// Gets the Type of the fixture used in running this test
-		/// </summary>
-		public virtual Type FixtureType
-		{
-			get { return null; }
-		}
-
-		/// <summary>
-		/// Gets or sets a fixture object for running this test
-		/// </summary>
-		public  abstract object Fixture
-		{
-			get; set;
-        }
-        #endregion
-
-        #region Methods
-		/// <summary>
-		/// Gets a count of test cases that would be run using
-		/// the specified filter.
-		/// </summary>
-		/// <param name="filter"></param>
-		/// <returns></returns>
-        public virtual int CountTestCases(ITestFilter filter)
-        {
-            if (filter.Pass(this))
-                return 1;
-
-            return 0;
-        }
-
-        /// <summary>
-        /// Runs the test under a particular filter, sending
-        /// notifications to a listener.
-        /// </summary>
-        /// <param name="listener">An event listener to receive notifications</param>
-        /// <param name="filter">A filter used in running the test</param>
-        /// <returns></returns>
-        public abstract TestResult Run(EventListener listener, ITestFilter filter);
-        #endregion
-
-        #endregion
-
-		#region IComparable Members
-		/// <summary>
-		/// Compares this test to another test for sorting purposes
-		/// </summary>
-		/// <param name="obj">The other test</param>
-		/// <returns>Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test</returns>
-		public int CompareTo(object obj)
-		{
-			Test other = obj as Test;
-			
-			if ( other == null )
-				return -1;
-
-			return this.TestName.FullName.CompareTo( other.TestName.FullName );
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.Collections;
+	using System.Collections.Specialized;
+    using System.Threading;
+	using System.Reflection;
+
+	/// <summary>
+	///		Test Class.
+	/// </summary>
+	public abstract class Test : ITest, IComparable
+    {
+        #region Constants
+        //private static readonly string SETCULTURE = "_SETCULTURE";
+        private static readonly string DESCRIPTION = "_DESCRIPTION";
+        private static readonly string IGNOREREASON = "_IGNOREREASON";
+        private static readonly string CATEGORIES = "_CATEGORIES";
+        #endregion
+
+        #region Fields
+        /// <summary>
+		/// TestName that identifies this test
+		/// </summary>
+		private TestName testName;
+
+		/// <summary>
+		/// Indicates whether the test should be executed
+		/// </summary>
+		private RunState runState;
+
+		/// <summary>
+		/// Test suite containing this test, or null
+		/// </summary>
+		private Test parent;
+		
+		/// <summary>
+		/// A dictionary of properties, used to add information
+		/// to tests without requiring the class to change.
+		/// </summary>
+		private IDictionary properties;
+
+		#endregion
+
+        #region Properties
+        /// <summary>
+        /// Return true if the test requires a thread
+        /// </summary>
+        public bool RequiresThread
+        {
+            get { return Properties.Contains("RequiresThread") && (bool)Properties["RequiresThread"]; }
+        }
+
+        /// <summary>
+        /// Get the desired apartment state for running the test
+        /// </summary>
+        public ApartmentState ApartmentState
+        {
+            get
+            {
+                return Properties.Contains("APARTMENT_STATE")
+                    ? (ApartmentState)Properties["APARTMENT_STATE"]
+                    : GetCurrentApartment();
+            }
+        }
+
+        /// <summary>
+        /// Get the current apartment state of the test
+        /// </summary>
+        protected ApartmentState GetCurrentApartment()
+        {
+#if CLR_2_0 || CLR_4_0
+            return Thread.CurrentThread.GetApartmentState();
+#else
+            return Thread.CurrentThread.ApartmentState;
+#endif
+        }
+
+        /// <summary>
+        /// Gets a boolean value indicating whether this 
+        /// test should run on it's own thread.
+        /// </summary>
+        protected virtual bool ShouldRunOnOwnThread
+        {
+            get
+            {
+                return RequiresThread
+                    || ApartmentState != ApartmentState.Unknown
+                    && ApartmentState != GetCurrentApartment();
+            }
+        }
+		#endregion
+
+        #region Construction
+
+        /// <summary>
+		/// Constructs a test given its name
+		/// </summary>
+		/// <param name="name">The name of the test</param>
+		protected Test( string name )
+		{
+			this.testName = new TestName();
+			this.testName.FullName = name;
+			this.testName.Name = name;
+			this.testName.TestID = new TestID();
+
+            this.runState = RunState.Runnable;
+		}
+
+		/// <summary>
+		/// Constructs a test given the path through the
+		/// test hierarchy to its parent and a name.
+		/// </summary>
+		/// <param name="pathName">The parent tests full name</param>
+		/// <param name="name">The name of the test</param>
+		protected Test( string pathName, string name ) 
+		{ 
+			this.testName = new TestName();
+			this.testName.FullName = pathName == null || pathName == string.Empty 
+				? name : pathName + "." + name;
+			this.testName.Name = name;
+			this.testName.TestID = new TestID();
+
+            this.runState = RunState.Runnable;
+		}
+
+		/// <summary>
+		/// Constructs a test given a TestName object
+		/// </summary>
+		/// <param name="testName">The TestName for this test</param>
+		protected Test( TestName testName )
+		{
+			this.testName = testName;
+			
+			this.runState = RunState.Runnable;
+		}
+
+		/// <summary>
+		/// Sets the runner id of a test and optionally its children
+		/// </summary>
+		/// <param name="runnerID">The runner id to be used</param>
+		/// <param name="recursive">True if all children should get the same id</param>
+		public void SetRunnerID( int runnerID, bool recursive )
+		{
+			this.testName.RunnerID = runnerID;
+
+			if ( recursive && this.Tests != null )
+				foreach( Test child in this.Tests )
+					child.SetRunnerID( runnerID, true );
+		}
+
+		#endregion
+
+		#region ITest Members
+
+        #region Properties
+		/// <summary>
+		/// Gets the TestName of the test
+		/// </summary>
+        public TestName TestName
+		{
+			get { return testName; }
+		}
+
+		/// <summary>
+		/// Gets a string representing the kind of test
+		/// that this object represents, for use in display.
+		/// </summary>
+        public abstract string TestType
+        {
+            get;
+        }
+
+
+		/// <summary>
+		/// Whether or not the test should be run
+		/// </summary>
+        public RunState RunState
+        {
+            get { return runState; }
+            set { runState = value; }
+        }
+
+		/// <summary>
+		/// Reason for not running the test, if applicable
+		/// </summary>
+		public string IgnoreReason
+		{
+			get { return (string)Properties[IGNOREREASON]; }
+			set 
+            {
+                if (value == null)
+                    Properties.Remove(IGNOREREASON);
+                else
+                    Properties[IGNOREREASON] = value;
+            }
+		}
+
+		/// <summary>
+		/// Gets a count of test cases represented by
+		/// or contained under this test.
+		/// </summary>
+		public virtual int TestCount 
+		{ 
+			get { return 1; } 
+		}
+
+		/// <summary>
+		/// Gets a list of categories associated with this test.
+		/// </summary>
+		public IList Categories 
+		{
+			get 
+            {
+                if (Properties[CATEGORIES] == null)
+                    Properties[CATEGORIES] = new ArrayList();
+
+                return (IList)Properties[CATEGORIES]; 
+            }
+			set 
+            {
+                Properties[CATEGORIES] = value; 
+            }
+		}
+
+		/// <summary>
+		/// Gets a description associated with this test.
+		/// </summary>
+		public String Description
+		{
+			get { return (string)Properties[DESCRIPTION]; }
+			set 
+            {
+                if (value == null)
+                    Properties.Remove(DESCRIPTION);
+                else
+                    Properties[DESCRIPTION] = value; 
+            }
+		}
+
+		/// <summary>
+		/// Gets the property dictionary for this test
+		/// </summary>
+		public IDictionary Properties
+		{
+			get 
+			{
+				if ( properties == null )
+					properties = new ListDictionary();
+
+				return properties; 
+			}
+			set
+			{
+				properties = value;
+			}
+		}
+
+		/// <summary>
+		/// Indicates whether this test is a suite
+		/// </summary>
+        public virtual bool IsSuite
+        {
+            get { return false; }
+        }
+
+
+		/// <summary>
+		/// Gets the parent test of this test
+		/// </summary>
+		ITest ITest.Parent 
+		{
+			get { return parent; }
+		}
+
+		/// <summary>
+		/// Gets the parent as a Test object.
+		/// Used by the core to set the parent.
+		/// </summary>
+		public Test Parent
+		{
+			get { return parent; }
+			set { parent = value; }
+		}
+
+		/// <summary>
+		/// Gets this test's child tests
+		/// </summary>
+		public virtual IList Tests 
+        {
+            get { return null; } 
+        }
+
+		/// <summary>
+		/// Gets the Type of the fixture used in running this test
+		/// </summary>
+		public virtual Type FixtureType
+		{
+			get { return null; }
+		}
+
+        /// <summary>
+        /// Gets the name of the class containing this test. Returns
+        /// null if the test is not associated with a class.
+        /// </summary>
+        public string ClassName
+        {
+            get
+            {
+                Type type = FixtureType;
+
+                if (type == null)
+                    return null;
+
+#if CLR_2_0 || CLR_4_0
+                if (type.IsGenericType)
+                    type = type.GetGenericTypeDefinition();
+#endif
+
+                return type.FullName;
+            }
+        }
+
+        /// <summary>
+        /// Gets the name of the method implementing this test.
+        /// Returns null if the test is not implemented as a method.
+        /// </summary>
+        public virtual string MethodName
+        {
+            get { return null; }
+        }
+
+		/// <summary>
+		/// Gets or sets a fixture object for running this test
+		/// </summary>
+		public  abstract object Fixture
+		{
+			get; set;
+        }
+        #endregion
+
+        #region Methods
+		/// <summary>
+		/// Gets a count of test cases that would be run using
+		/// the specified filter.
+		/// </summary>
+		/// <param name="filter"></param>
+		/// <returns></returns>
+        public virtual int CountTestCases(ITestFilter filter)
+        {
+            if (filter.Pass(this))
+                return 1;
+
+            return 0;
+        }
+
+        /// <summary>
+        /// Runs the test under a particular filter, sending
+        /// notifications to a listener.
+        /// </summary>
+        /// <param name="listener">An event listener to receive notifications</param>
+        /// <param name="filter">A filter used in running the test</param>
+        /// <returns></returns>
+        public abstract TestResult Run(EventListener listener, ITestFilter filter);
+        #endregion
+
+        #endregion
+
+		#region IComparable Members
+		/// <summary>
+		/// Compares this test to another test for sorting purposes
+		/// </summary>
+		/// <param name="obj">The other test</param>
+		/// <returns>Value of -1, 0 or +1 depending on whether the current test is less than, equal to or greater than the other test</returns>
+		public int CompareTo(object obj)
+		{
+			Test other = obj as Test;
+			
+			if ( other == null )
+				return -1;
+
+			return this.TestName.FullName.CompareTo( other.TestName.FullName );
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestAgent.cs b/src/NUnitCore/interfaces/TestAgent.cs
index ecec2ec..826c087 100644
--- a/src/NUnitCore/interfaces/TestAgent.cs
+++ b/src/NUnitCore/interfaces/TestAgent.cs
@@ -1,111 +1,111 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-    /// <summary>
-	/// Abstract base for all types of TestAgents.
-    /// A TestAgent provides services of locating,
-    /// loading and running tests in a particular
-    /// context such as an AppDomain or Process.
-	/// </summary>
-	public abstract class TestAgent : MarshalByRefObject, IDisposable
-	{
-		#region Fields
-		/// <summary>
-		/// Reference to the TestAgency that controls this agent
-		/// </summary>
-		private IAgency agency;
-
-		/// <summary>
-		/// This agent's assigned id
-		/// </summary>
-		private Guid agentId;
-		#endregion
-
-		#region Constructors
-        /// <summary>
-        /// Constructs a TestAgent
-        /// </summary>
-        /// <param name="agentId"></param>
-        public TestAgent(Guid agentId)
-        {
-            this.agentId = agentId;
-        }
-
-        /// <summary>
-        /// Consructor used by TestAgency when creating
-        /// an agent.
-        /// </summary>
-        /// <param name="agentId"></param>
-        /// <param name="agency"></param>
-		public TestAgent( Guid agentId, IAgency agency )
-		{
-			this.agency = agency;
-			this.agentId = agentId;
-		}
-		#endregion
-
-		#region Properties
-        /// <summary>
-        /// The TestAgency with which this agent is asssociated,
-        /// or null if the agent is not tied to an agency.
-        /// </summary>
-		public IAgency Agency
-		{
-			get { return agency; }
-		}
-
-        /// <summary>
-        /// A Guid that uniquely identifies this agent.
-        /// </summary>
-		public Guid Id
-		{
-			get { return agentId; }
-		}
-		#endregion
-
-		#region Absract Methods
-        /// <summary>
-        /// Starts the agent, performing any required initialization
-        /// </summary>
-        /// <returns></returns>
-        public abstract bool Start();
-
-        /// <summary>
-        /// Stops the agent, releasing any resources
-        /// </summary>
-        public abstract void Stop();
-
-		/// <summary>
-		///  Creates a runner using a given runner id
-		/// </summary>
-        public abstract TestRunner CreateRunner(int runnerId);
-		#endregion
-
-        #region IDisposable Members
-        /// <summary>
-        /// Dispose is overridden to stop the agent
-        /// </summary>
-        public void Dispose()
-        {
-            this.Stop();
-        }
-        #endregion
-
-        #region InitializeLifeTimeService
-        /// <summary>
-        /// Overridden to cause object to live indefinitely
-        /// </summary>
-        public override object InitializeLifetimeService()
-        {
-            return null;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+    /// <summary>
+	/// Abstract base for all types of TestAgents.
+    /// A TestAgent provides services of locating,
+    /// loading and running tests in a particular
+    /// context such as an AppDomain or Process.
+	/// </summary>
+	public abstract class TestAgent : MarshalByRefObject, IDisposable
+	{
+		#region Fields
+		/// <summary>
+		/// Reference to the TestAgency that controls this agent
+		/// </summary>
+		private IAgency agency;
+
+		/// <summary>
+		/// This agent's assigned id
+		/// </summary>
+		private Guid agentId;
+		#endregion
+
+		#region Constructors
+        /// <summary>
+        /// Constructs a TestAgent
+        /// </summary>
+        /// <param name="agentId"></param>
+        public TestAgent(Guid agentId)
+        {
+            this.agentId = agentId;
+        }
+
+        /// <summary>
+        /// Consructor used by TestAgency when creating
+        /// an agent.
+        /// </summary>
+        /// <param name="agentId"></param>
+        /// <param name="agency"></param>
+		public TestAgent( Guid agentId, IAgency agency )
+		{
+			this.agency = agency;
+			this.agentId = agentId;
+		}
+		#endregion
+
+		#region Properties
+        /// <summary>
+        /// The TestAgency with which this agent is asssociated,
+        /// or null if the agent is not tied to an agency.
+        /// </summary>
+		public IAgency Agency
+		{
+			get { return agency; }
+		}
+
+        /// <summary>
+        /// A Guid that uniquely identifies this agent.
+        /// </summary>
+		public Guid Id
+		{
+			get { return agentId; }
+		}
+		#endregion
+
+		#region Absract Methods
+        /// <summary>
+        /// Starts the agent, performing any required initialization
+        /// </summary>
+        /// <returns></returns>
+        public abstract bool Start();
+
+        /// <summary>
+        /// Stops the agent, releasing any resources
+        /// </summary>
+        public abstract void Stop();
+
+		/// <summary>
+		///  Creates a runner using a given runner id
+		/// </summary>
+        public abstract TestRunner CreateRunner(int runnerId);
+		#endregion
+
+        #region IDisposable Members
+        /// <summary>
+        /// Dispose is overridden to stop the agent
+        /// </summary>
+        public void Dispose()
+        {
+            this.Stop();
+        }
+        #endregion
+
+        #region InitializeLifeTimeService
+        /// <summary>
+        /// Overridden to cause object to live indefinitely
+        /// </summary>
+        public override object InitializeLifetimeService()
+        {
+            return null;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/TestAssemblyInfo.cs b/src/NUnitCore/interfaces/TestAssemblyInfo.cs
index 94445c9..e8cbc72 100644
--- a/src/NUnitCore/interfaces/TestAssemblyInfo.cs
+++ b/src/NUnitCore/interfaces/TestAssemblyInfo.cs
@@ -1,146 +1,146 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Reflection;
-using System.Diagnostics;
-using System.IO;
-using System.Text;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestAssemblyInfo holds information about a loaded test assembly
-	/// </summary>
-	[Serializable]
-	public class TestAssemblyInfo
-	{
-		private string assemblyName;
-        private Version imageRuntimeVersion;
-        private RuntimeFramework runnerRuntimeFramework;
-        private int processId;
-        private string moduleName;
-        private string domainName;
-        private string appBase;
-        private string binPath;
-        private string configFile;
-        private IList testFrameworks;
-
-        /// <summary>
-        /// Constructs a TestAssemblyInfo
-        /// </summary>
-        /// <param name="assemblyName">The name of the assembly</param>
-        /// <param name="imageRuntimeVersion">The version of the runtime for which the assembly was built</param>
-        /// <param name="runnerRuntimeFramework">The runtime framework under which the assembly is loaded</param>
-        /// <param name="testFrameworks">A list of test framework useds by the assembly</param>
-		public TestAssemblyInfo( string assemblyName, Version imageRuntimeVersion, RuntimeFramework runnerRuntimeFramework, IList testFrameworks )
-		{
-			this.assemblyName = assemblyName;
-            this.imageRuntimeVersion = imageRuntimeVersion;
-            this.runnerRuntimeFramework = runnerRuntimeFramework;
-            this.testFrameworks = testFrameworks;
-            Process p = Process.GetCurrentProcess();
-            this.processId = p.Id;
-			Assembly entryAssembly = Assembly.GetEntryAssembly();
-            this.moduleName = entryAssembly != null
-				? Path.GetFileName(Assembly.GetEntryAssembly().Location)
-				: p.MainModule.ModuleName;
-            this.domainName = AppDomain.CurrentDomain.FriendlyName;
-            this.appBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
-            this.configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
-            this.binPath = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath;
-		}
-
-        /// <summary>
-        /// Gets the name of the assembly
-        /// </summary>
-		public string Name
-		{
-			get { return assemblyName; }
-		}
-
-        /// <summary>
-        /// Gets the runtime version for which the assembly was built
-        /// </summary>
-        public Version ImageRuntimeVersion
-        {
-            get { return imageRuntimeVersion; }
-        }
-
-        /// <summary>
-        /// Gets the runtime framework under which the assembly is loaded
-        /// </summary>
-        public RuntimeFramework RunnerRuntimeFramework
-        {
-            get { return runnerRuntimeFramework; }
-        }
-
-        /// <summary>
-        /// Gets the runtime version under which the assembly is loaded
-        /// </summary>
-        public Version RunnerRuntimeVersion
-        {
-            get { return runnerRuntimeFramework.ClrVersion; }
-        }
-
-        /// <summary>
-        /// The Id of the process in which the assembly is loaded
-        /// </summary>
-        public int ProcessId
-        {
-            get { return processId; }
-        }
-
-        /// <summary>
-        /// The friendly name of the AppDomain in which the assembly is loaded
-        /// </summary>
-        public string DomainName
-        {
-            get { return domainName; }
-        }
-
-        /// <summary>
-        /// The Application Base of the AppDomain in which the assembly is loaded
-        /// </summary>
-        public string ApplicationBase
-        {
-            get { return appBase; }
-        }
-
-        /// <summary>
-        /// The PrivateBinPath of the AppDomain in which the assembly is loaded
-        /// </summary>
-        public string PrivateBinPath
-        {
-            get { return binPath; }
-        }
-
-        /// <summary>
-        /// The ConfigurationFile of the AppDomain in which the assembly is loaded
-        /// </summary>
-        public string ConfigurationFile
-        {
-            get { return configFile; }
-        }
-
-        /// <summary>
-        /// The name of the main module of the process in which the assembly is loaded 
-        /// </summary>
-        public string ModuleName
-        {
-            get { return moduleName; }
-			set { moduleName = value; }
-        }
-
-        /// <summary>
-        /// Gets a list of testframeworks referenced by the assembly
-        /// </summary>
-		public IList TestFrameworks
-		{
-			get { return testFrameworks; }
-		}
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestAssemblyInfo holds information about a loaded test assembly
+	/// </summary>
+	[Serializable]
+	public class TestAssemblyInfo
+	{
+		private string assemblyName;
+        private Version imageRuntimeVersion;
+        private RuntimeFramework runnerRuntimeFramework;
+        private int processId;
+        private string moduleName;
+        private string domainName;
+        private string appBase;
+        private string binPath;
+        private string configFile;
+        private IList testFrameworks;
+
+        /// <summary>
+        /// Constructs a TestAssemblyInfo
+        /// </summary>
+        /// <param name="assemblyName">The name of the assembly</param>
+        /// <param name="imageRuntimeVersion">The version of the runtime for which the assembly was built</param>
+        /// <param name="runnerRuntimeFramework">The runtime framework under which the assembly is loaded</param>
+        /// <param name="testFrameworks">A list of test framework useds by the assembly</param>
+		public TestAssemblyInfo( string assemblyName, Version imageRuntimeVersion, RuntimeFramework runnerRuntimeFramework, IList testFrameworks )
+		{
+			this.assemblyName = assemblyName;
+            this.imageRuntimeVersion = imageRuntimeVersion;
+            this.runnerRuntimeFramework = runnerRuntimeFramework;
+            this.testFrameworks = testFrameworks;
+            Process p = Process.GetCurrentProcess();
+            this.processId = p.Id;
+			Assembly entryAssembly = Assembly.GetEntryAssembly();
+            this.moduleName = entryAssembly != null
+				? Path.GetFileName(Assembly.GetEntryAssembly().Location)
+				: p.MainModule.ModuleName;
+            this.domainName = AppDomain.CurrentDomain.FriendlyName;
+            this.appBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
+            this.configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
+            this.binPath = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath;
+		}
+
+        /// <summary>
+        /// Gets the name of the assembly
+        /// </summary>
+		public string Name
+		{
+			get { return assemblyName; }
+		}
+
+        /// <summary>
+        /// Gets the runtime version for which the assembly was built
+        /// </summary>
+        public Version ImageRuntimeVersion
+        {
+            get { return imageRuntimeVersion; }
+        }
+
+        /// <summary>
+        /// Gets the runtime framework under which the assembly is loaded
+        /// </summary>
+        public RuntimeFramework RunnerRuntimeFramework
+        {
+            get { return runnerRuntimeFramework; }
+        }
+
+        /// <summary>
+        /// Gets the runtime version under which the assembly is loaded
+        /// </summary>
+        public Version RunnerRuntimeVersion
+        {
+            get { return runnerRuntimeFramework.ClrVersion; }
+        }
+
+        /// <summary>
+        /// The Id of the process in which the assembly is loaded
+        /// </summary>
+        public int ProcessId
+        {
+            get { return processId; }
+        }
+
+        /// <summary>
+        /// The friendly name of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string DomainName
+        {
+            get { return domainName; }
+        }
+
+        /// <summary>
+        /// The Application Base of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string ApplicationBase
+        {
+            get { return appBase; }
+        }
+
+        /// <summary>
+        /// The PrivateBinPath of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string PrivateBinPath
+        {
+            get { return binPath; }
+        }
+
+        /// <summary>
+        /// The ConfigurationFile of the AppDomain in which the assembly is loaded
+        /// </summary>
+        public string ConfigurationFile
+        {
+            get { return configFile; }
+        }
+
+        /// <summary>
+        /// The name of the main module of the process in which the assembly is loaded 
+        /// </summary>
+        public string ModuleName
+        {
+            get { return moduleName; }
+			set { moduleName = value; }
+        }
+
+        /// <summary>
+        /// Gets a list of testframeworks referenced by the assembly
+        /// </summary>
+		public IList TestFrameworks
+		{
+			get { return testFrameworks; }
+		}
+    }
+}
diff --git a/src/NUnitCore/interfaces/TestFilter.cs b/src/NUnitCore/interfaces/TestFilter.cs
index b66cc4f..51f5e69 100644
--- a/src/NUnitCore/interfaces/TestFilter.cs
+++ b/src/NUnitCore/interfaces/TestFilter.cs
@@ -1,102 +1,102 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// Interface to be implemented by filters applied to tests.
-	/// The filter applies when running the test, after it has been
-	/// loaded, since this is the only time an ITest exists.
-	/// </summary>
-	[Serializable]
-	public abstract class TestFilter : ITestFilter
-	{
-		/// <summary>
-		/// Unique Empty filter.
-		/// </summary>
-		public static TestFilter Empty = new EmptyFilter();
-
-		/// <summary>
-		/// Indicates whether this is the EmptyFilter
-		/// </summary>
-		public bool IsEmpty
-		{
-			get { return this is TestFilter.EmptyFilter; }
-		}
-
-		/// <summary>
-		/// Determine if a particular test passes the filter criteria. The default 
-		/// implementation checks the test itself, its parents and any descendants.
-		/// 
-		/// Derived classes may override this method or any of the Match methods
-		/// to change the behavior of the filter.
-		/// </summary>
-		/// <param name="test">The test to which the filter is applied</param>
-		/// <returns>True if the test passes the filter, otherwise false</returns>
-		public virtual bool Pass( ITest test )
-		{
-			return Match(test) || MatchParent(test) || MatchDescendant(test);
-		}
-
-		/// <summary>
-		/// Determine whether the test itself matches the filter criteria, without
-		/// examining either parents or descendants.
-		/// </summary>
-		/// <param name="test">The test to which the filter is applied</param>
-		/// <returns>True if the filter matches the any parent of the test</returns>
-		public abstract bool Match(ITest test);
-
-		/// <summary>
-		/// Determine whether any ancestor of the test mateches the filter criteria
-		/// </summary>
-		/// <param name="test">The test to which the filter is applied</param>
-		/// <returns>True if the filter matches the an ancestor of the test</returns>
-		protected virtual bool MatchParent(ITest test)
-		{
-			return (test.RunState != RunState.Explicit && test.Parent != null && 
-				( Match(test.Parent) || MatchParent(test.Parent)) );
-		}
-
-		/// <summary>
-		/// Determine whether any descendant of the test matches the filter criteria.
-		/// </summary>
-		/// <param name="test">The test to be matched</param>
-		/// <returns>True if at least one descendant matches the filter criteria</returns>
-		protected virtual bool MatchDescendant(ITest test)
-		{
-			if (!test.IsSuite || test.Tests == null)
-				return false;
-
-			foreach (ITest child in test.Tests)
-			{
-				if (Match(child) || MatchDescendant(child))
-					return true;
-			}
-
-			return false;
-		}
-		
-		/// <summary>
-		/// Nested class provides an empty filter - one that always
-		/// returns true when called, unless the test is marked explicit.
-		/// </summary>
-		[Serializable]
-		private class EmptyFilter : TestFilter
-		{
-			public override bool Match( ITest test )
-			{
-				return test.RunState != RunState.Explicit;
-			}
-
-			public override bool Pass( ITest test )
-			{
-				return test.RunState != RunState.Explicit;
-			}
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// Interface to be implemented by filters applied to tests.
+	/// The filter applies when running the test, after it has been
+	/// loaded, since this is the only time an ITest exists.
+	/// </summary>
+	[Serializable]
+	public abstract class TestFilter : ITestFilter
+	{
+		/// <summary>
+		/// Unique Empty filter.
+		/// </summary>
+		public static TestFilter Empty = new EmptyFilter();
+
+		/// <summary>
+		/// Indicates whether this is the EmptyFilter
+		/// </summary>
+		public bool IsEmpty
+		{
+			get { return this is TestFilter.EmptyFilter; }
+		}
+
+		/// <summary>
+		/// Determine if a particular test passes the filter criteria. The default 
+		/// implementation checks the test itself, its parents and any descendants.
+		/// 
+		/// Derived classes may override this method or any of the Match methods
+		/// to change the behavior of the filter.
+		/// </summary>
+		/// <param name="test">The test to which the filter is applied</param>
+		/// <returns>True if the test passes the filter, otherwise false</returns>
+		public virtual bool Pass( ITest test )
+		{
+			return Match(test) || MatchParent(test) || MatchDescendant(test);
+		}
+
+		/// <summary>
+		/// Determine whether the test itself matches the filter criteria, without
+		/// examining either parents or descendants.
+		/// </summary>
+		/// <param name="test">The test to which the filter is applied</param>
+		/// <returns>True if the filter matches the any parent of the test</returns>
+		public abstract bool Match(ITest test);
+
+		/// <summary>
+		/// Determine whether any ancestor of the test mateches the filter criteria
+		/// </summary>
+		/// <param name="test">The test to which the filter is applied</param>
+		/// <returns>True if the filter matches the an ancestor of the test</returns>
+		protected virtual bool MatchParent(ITest test)
+		{
+			return (test.RunState != RunState.Explicit && test.Parent != null && 
+				( Match(test.Parent) || MatchParent(test.Parent)) );
+		}
+
+		/// <summary>
+		/// Determine whether any descendant of the test matches the filter criteria.
+		/// </summary>
+		/// <param name="test">The test to be matched</param>
+		/// <returns>True if at least one descendant matches the filter criteria</returns>
+		protected virtual bool MatchDescendant(ITest test)
+		{
+			if (!test.IsSuite || test.Tests == null)
+				return false;
+
+			foreach (ITest child in test.Tests)
+			{
+				if (Match(child) || MatchDescendant(child))
+					return true;
+			}
+
+			return false;
+		}
+		
+		/// <summary>
+		/// Nested class provides an empty filter - one that always
+		/// returns true when called, unless the test is marked explicit.
+		/// </summary>
+		[Serializable]
+		private class EmptyFilter : TestFilter
+		{
+			public override bool Match( ITest test )
+			{
+				return test.RunState != RunState.Explicit;
+			}
+
+			public override bool Pass( ITest test )
+			{
+				return test.RunState != RunState.Explicit;
+			}
+		}
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestID.cs b/src/NUnitCore/interfaces/TestID.cs
index 4b00c34..cf80fe7 100644
--- a/src/NUnitCore/interfaces/TestID.cs
+++ b/src/NUnitCore/interfaces/TestID.cs
@@ -1,144 +1,144 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestID encapsulates a unique identifier for tests. As
-	/// currently implemented, this is an integer and is unique
-	/// within the AppDomain. TestID is one component of a 
-	/// TestName. We use this object, rather than a raw int,
-	/// for two reasons: (1) to hide the implementation so
-	/// it may be changed later if necessary and (2) so that the
-	/// id may be null in a "weak" TestName.
-	/// </summary>
-	[Serializable]
-	public class TestID : ICloneable
-	{
-		#region Fields
-			/// <summary>
-			/// The int key that distinguishes this test from all others created
-			/// by the same runner.
-			/// </summary>
-			private int id;
-		
-		/// <summary>
-		/// Static value to seed ids. It's started at 1000 so any
-		/// uninitialized ids will stand out.
-		/// </summary>
-		private static int nextID = 1000;
-
-		#endregion
-
-		#region Construction
-		/// <summary>
-		/// Construct a new TestID
-		/// </summary>
-		public TestID()
-		{
-			this.id = unchecked( nextID++ );
-		}
-
-		/// <summary>
-		/// Construct a TestID with a given value.
-		/// Used in parsing test names and in order
-		/// to construct an artificial test node for
-		/// aggregating multiple test runners.
-		/// </summary>
-		/// <param name="id"></param>
-		public TestID( int id )
-		{
-			this.id = id;
-		}
-		#endregion
-
-		#region Static Methods
-		/// <summary>
-		/// Parse a TestID from it's string representation
-		/// </summary>
-		/// <param name="s"></param>
-		/// <returns></returns>
-		public static TestID Parse( string s )
-		{
-			int id = Int32.Parse( s );
-			return new TestID( id );
-		}
-		#endregion
-
-		#region Object Overrides
-		/// <summary>
-		/// Override of Equals method to allow comparison of TestIDs
-		/// </summary>
-		/// <param name="obj"></param>
-		/// <returns></returns>
-		public override bool Equals(object obj)
-		{
-			TestID other = obj as TestID;
-			if ( other != null )
-				return this.id == other.id;
-
-			return base.Equals (obj);
-		}
-
-		/// <summary>
-		/// Override of GetHashCode for TestIDs
-		/// </summary>
-		/// <returns></returns>
-		public override int GetHashCode()
-		{
-			return id.GetHashCode();
-		}
-
-		/// <summary>
-		/// Override ToString() to display the int id
-		/// </summary>
-		/// <returns></returns>
-		public override string ToString()
-		{
-			return id.ToString();
-		}
-		#endregion
-
-		#region Operator Overrides
-        /// <summary>
-        /// Operator == override
-        /// </summary>
-        /// <param name="id1"></param>
-        /// <param name="id2"></param>
-        /// <returns></returns>
-		public static bool operator ==( TestID id1, TestID id2 )
-		{
-			if ( Object.Equals( id1, null ) )
-				return Object.Equals( id2, null );
-
-			return id1.Equals( id2 );
-		}
-
-        /// <summary>
-        /// Operator != override
-        /// </summary>
-        /// <param name="id1"></param>
-        /// <param name="id2"></param>
-        /// <returns></returns>
-		public static bool operator !=( TestID id1, TestID id2 )
-		{
-			return id1 == id2 ? false : true;
-		}
-		#endregion
-
-		#region ICloneable Implementation
-        /// <summary>
-        /// Clone this TestID
-        /// </summary>
-        /// <returns>An identical TestID</returns>
-		public object Clone()
-		{
-			return this.MemberwiseClone();
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// TestID encapsulates a unique identifier for tests. As
+	/// currently implemented, this is an integer and is unique
+	/// within the AppDomain. TestID is one component of a 
+	/// TestName. We use this object, rather than a raw int,
+	/// for two reasons: (1) to hide the implementation so
+	/// it may be changed later if necessary and (2) so that the
+	/// id may be null in a "weak" TestName.
+	/// </summary>
+	[Serializable]
+	public class TestID : ICloneable
+	{
+		#region Fields
+			/// <summary>
+			/// The int key that distinguishes this test from all others created
+			/// by the same runner.
+			/// </summary>
+			private int id;
+		
+		/// <summary>
+		/// Static value to seed ids. It's started at 1000 so any
+		/// uninitialized ids will stand out.
+		/// </summary>
+		private static int nextID = 1000;
+
+		#endregion
+
+		#region Construction
+		/// <summary>
+		/// Construct a new TestID
+		/// </summary>
+		public TestID()
+		{
+			this.id = unchecked( nextID++ );
+		}
+
+		/// <summary>
+		/// Construct a TestID with a given value.
+		/// Used in parsing test names and in order
+		/// to construct an artificial test node for
+		/// aggregating multiple test runners.
+		/// </summary>
+		/// <param name="id"></param>
+		public TestID( int id )
+		{
+			this.id = id;
+		}
+		#endregion
+
+		#region Static Methods
+		/// <summary>
+		/// Parse a TestID from it's string representation
+		/// </summary>
+		/// <param name="s"></param>
+		/// <returns></returns>
+		public static TestID Parse( string s )
+		{
+			int id = Int32.Parse( s );
+			return new TestID( id );
+		}
+		#endregion
+
+		#region Object Overrides
+		/// <summary>
+		/// Override of Equals method to allow comparison of TestIDs
+		/// </summary>
+		/// <param name="obj"></param>
+		/// <returns></returns>
+		public override bool Equals(object obj)
+		{
+			TestID other = obj as TestID;
+			if ( other != null )
+				return this.id == other.id;
+
+			return base.Equals (obj);
+		}
+
+		/// <summary>
+		/// Override of GetHashCode for TestIDs
+		/// </summary>
+		/// <returns></returns>
+		public override int GetHashCode()
+		{
+			return id.GetHashCode();
+		}
+
+		/// <summary>
+		/// Override ToString() to display the int id
+		/// </summary>
+		/// <returns></returns>
+		public override string ToString()
+		{
+			return id.ToString();
+		}
+		#endregion
+
+		#region Operator Overrides
+        /// <summary>
+        /// Operator == override
+        /// </summary>
+        /// <param name="id1"></param>
+        /// <param name="id2"></param>
+        /// <returns></returns>
+		public static bool operator ==( TestID id1, TestID id2 )
+		{
+			if ( Object.Equals( id1, null ) )
+				return Object.Equals( id2, null );
+
+			return id1.Equals( id2 );
+		}
+
+        /// <summary>
+        /// Operator != override
+        /// </summary>
+        /// <param name="id1"></param>
+        /// <param name="id2"></param>
+        /// <returns></returns>
+		public static bool operator !=( TestID id1, TestID id2 )
+		{
+			return id1 == id2 ? false : true;
+		}
+		#endregion
+
+		#region ICloneable Implementation
+        /// <summary>
+        /// Clone this TestID
+        /// </summary>
+        /// <returns>An identical TestID</returns>
+		public object Clone()
+		{
+			return this.MemberwiseClone();
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestInfo.cs b/src/NUnitCore/interfaces/TestInfo.cs
index 9aa3443..addb94d 100644
--- a/src/NUnitCore/interfaces/TestInfo.cs
+++ b/src/NUnitCore/interfaces/TestInfo.cs
@@ -1,254 +1,276 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestInfo holds common info about a test. It represents only
-	/// a single test or a suite and contains no references to other
-	/// tests. Since it is informational only, it can easily be passed
-	/// around using .Net remoting.
-	/// 
-	/// TestInfo is used directly in all EventListener events and in
-	/// TestResults. It contains an ID, which can be used by a 
-	/// runner to locate the actual test.
-	/// 
-	/// TestInfo also serves as the base class for TestNode, which
-	/// adds hierarchical information and is used in client code to
-	/// maintain a visible image of the structure of the tests.
-	/// </summary>
-	[Serializable]
-	public class TestInfo : ITest
-	{
-		#region Instance Variables
-		/// <summary>
-		/// TestName that identifies this test
-		/// </summary>
-		private TestName testName;
-
-		private string testType;
-
-        private RunState runState;
-
-		/// <summary>
-		/// Reason for not running the test
-		/// </summary>
-		private string ignoreReason;
-
-		/// <summary>
-		/// Number of test cases in this test or suite
-		/// </summary>
-		private int testCaseCount;
-
-		/// <summary>
-		/// True if this is a suite
-		/// </summary>
-		private bool isSuite;
-
-		/// <summary>
-		/// The test description
-		/// </summary>
-		private string description;
-
-		/// <summary>
-		/// A list of all the categories assigned to a test
-		/// </summary>
-		private ArrayList categories = new ArrayList();
-
-		/// <summary>
-		/// A dictionary of properties, used to add information
-		/// to tests without requiring the class to change.
-		/// </summary>
-		private ListDictionary properties = new ListDictionary();
-
-		#endregion
-
-		#region Constructors
-		/// <summary>
-		/// Construct from an ITest
-		/// </summary>
-		/// <param name="test">Test from which a TestNode is to be constructed</param>
-		public TestInfo( ITest test )
-		{
-			this.testName = (TestName)test.TestName.Clone();
-			this.testType = test.TestType;
-
-            this.runState = test.RunState;
-			this.ignoreReason = test.IgnoreReason;
-			this.description = test.Description;
-			this.isSuite = test.IsSuite;
-
-			if (test.Categories != null) 
-				this.categories.AddRange(test.Categories);
-			if (test.Properties != null)
-			{
-				this.properties = new ListDictionary();
-				foreach( DictionaryEntry entry in test.Properties )
-					this.properties.Add( entry.Key, entry.Value );
-			}
-
-			this.testCaseCount = test.TestCount;
-		}
-
-		/// <summary>
-		/// Construct as a parent to multiple tests.
-		/// </summary>
-		/// <param name="testName">The name to use for the new test</param>
-		/// <param name="tests">An array of child tests</param>
-		public TestInfo( TestName testName, ITest[] tests )
-		{
-			this.testName = testName;
-			this.testType = "Test Project";
-
-            this.runState = RunState.Runnable;
-			this.ignoreReason = null;
-			this.description = null;
-			this.isSuite = true;
-
-            if ( tests != null )
-			    foreach( ITest test in tests )
-    				this.testCaseCount += test.TestCount;
-		}
-
-		/// <summary>
-		/// Construct given a test name
-		/// </summary>
-		/// <param name="testName">The TestName for the new test</param>
-		public TestInfo( TestName testName ) : this( testName, null) { }
-		#endregion
-
-		#region Properties
-		/// <summary>
-		/// Gets the completely specified name of the test
-		/// encapsulated in a TestName object.
-		/// </summary>
-		public TestName TestName
-		{
-			get { return testName; }
-		}
-
-		/// <summary>
-		/// Gets a string representing the kind of test this
-		/// object represents for display purposes.
-		/// </summary>
-		public string TestType
-		{
-			get { return testType; }
-		}
-
-		/// <summary>
-		/// The test description 
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-			set { description = value; }
-		}
-
-		/// <summary>
-		/// Gets the RunState for this test
-		/// </summary>
-        public RunState RunState
-        {
-            get { return runState; }
-            set { runState = value; }
-        }
-
-		/// <summary>
-		/// The reason for ignoring a test
-		/// </summary>
-		public string IgnoreReason
-		{
-			get { return ignoreReason; }
-			set { ignoreReason = value; }
-		}
-
-		/// <summary>
-		/// Count of test cases in this test.
-		/// </summary>
-		public int TestCount
-		{ 
-			get { return testCaseCount; } 
-		}
-
-		/// <summary>
-		///  Gets the parent test of this test
-		/// </summary>
-		public virtual ITest Parent
-		{
-			get { return null; }
-		}
-
-		/// <summary>
-		/// Gets a list of the categories applied to this test
-		/// </summary>
-		public IList Categories 
-		{
-			get { return categories; }
-		}
-
-		/// <summary>
-		/// Gets a list of any child tests
-		/// </summary>
-		public virtual IList Tests
-		{
-			get { return null; }
-		}
-
-		/// <summary>
-		/// True if this is a suite, false if a test case
-		/// </summary>
-		public bool IsSuite
-		{
-			get { return isSuite; }
-		}
-
-		/// <summary>
-		/// Gets the Properties dictionary for this test
-		/// </summary>
-		public IDictionary Properties
-		{
-			get 
-			{
-				if ( properties == null )
-					properties = new ListDictionary();
-
-				return properties; 
-			}
-		}
-		#endregion
-
-        #region Methods
-		/// <summary>
-		/// Counts the test cases that would be run if this
-		/// test were executed using the provided filter.
-		/// </summary>
-		/// <param name="filter">The filter to apply</param>
-		/// <returns>A count of test cases</returns>
-        public virtual int CountTestCases(ITestFilter filter)
-        {
-            if (filter.IsEmpty)
-                return TestCount;
-
-            if (!isSuite)
-                return filter.Pass(this) ? 1 : 0;
-
-            int count = 0;
-            if (filter.Pass(this))
-            {
-                foreach (ITest test in Tests)
-                {
-                    count += test.CountTestCases(filter);
-                }
-            }
-            return count;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestInfo holds common info about a test. It represents only
+	/// a single test or a suite and contains no references to other
+	/// tests. Since it is informational only, it can easily be passed
+	/// around using .Net remoting.
+	/// 
+	/// TestInfo is used directly in all EventListener events and in
+	/// TestResults. It contains an ID, which can be used by a 
+	/// runner to locate the actual test.
+	/// 
+	/// TestInfo also serves as the base class for TestNode, which
+	/// adds hierarchical information and is used in client code to
+	/// maintain a visible image of the structure of the tests.
+	/// </summary>
+	[Serializable]
+	public class TestInfo : ITest
+	{
+		#region Instance Variables
+		/// <summary>
+		/// TestName that identifies this test
+		/// </summary>
+		private TestName testName;
+
+        private string className;
+
+        private string methodName;
+
+		private string testType;
+
+        private RunState runState;
+
+		/// <summary>
+		/// Reason for not running the test
+		/// </summary>
+		private string ignoreReason;
+
+		/// <summary>
+		/// Number of test cases in this test or suite
+		/// </summary>
+		private int testCaseCount;
+
+		/// <summary>
+		/// True if this is a suite
+		/// </summary>
+		private bool isSuite;
+
+		/// <summary>
+		/// The test description
+		/// </summary>
+		private string description;
+
+		/// <summary>
+		/// A list of all the categories assigned to a test
+		/// </summary>
+		private ArrayList categories = new ArrayList();
+
+		/// <summary>
+		/// A dictionary of properties, used to add information
+		/// to tests without requiring the class to change.
+		/// </summary>
+		private ListDictionary properties = new ListDictionary();
+
+		#endregion
+
+		#region Constructors
+		/// <summary>
+		/// Construct from an ITest
+		/// </summary>
+		/// <param name="test">Test from which a TestNode is to be constructed</param>
+		public TestInfo( ITest test )
+		{
+			this.testName = (TestName)test.TestName.Clone();
+			this.testType = test.TestType;
+
+            this.runState = test.RunState;
+			this.ignoreReason = test.IgnoreReason;
+			this.description = test.Description;
+			this.isSuite = test.IsSuite;
+            this.className = test.ClassName;
+            this.methodName = test.MethodName;
+
+			if (test.Categories != null) 
+				this.categories.AddRange(test.Categories);
+			if (test.Properties != null)
+			{
+				this.properties = new ListDictionary();
+				foreach( DictionaryEntry entry in test.Properties )
+					this.properties.Add( entry.Key, entry.Value );
+			}
+
+			this.testCaseCount = test.TestCount;
+		}
+
+		/// <summary>
+		/// Construct as a parent to multiple tests.
+		/// </summary>
+		/// <param name="testName">The name to use for the new test</param>
+		/// <param name="tests">An array of child tests</param>
+		public TestInfo( TestName testName, ITest[] tests )
+		{
+			this.testName = testName;
+			this.testType = "Test Project";
+
+            this.runState = RunState.Runnable;
+			this.ignoreReason = null;
+			this.description = null;
+			this.isSuite = true;
+
+            if ( tests != null )
+			    foreach( ITest test in tests )
+    				this.testCaseCount += test.TestCount;
+		}
+
+		/// <summary>
+		/// Construct given a test name
+		/// </summary>
+		/// <param name="testName">The TestName for the new test</param>
+		public TestInfo( TestName testName ) : this( testName, null) { }
+		#endregion
+
+		#region Properties
+		/// <summary>
+		/// Gets the completely specified name of the test
+		/// encapsulated in a TestName object.
+		/// </summary>
+		public TestName TestName
+		{
+			get { return testName; }
+		}
+
+        /// <summary>
+        /// The name of the class containing this test, or null
+        /// </summary>
+        public string ClassName
+        {
+            get { return className; }
+        }
+
+        /// <summary>
+        /// The name of the method implementing this test, or null
+        /// </summary>
+        public string MethodName
+        {
+            get { return methodName; }
+        }
+
+		/// <summary>
+		/// Gets a string representing the kind of test this
+		/// object represents for display purposes.
+		/// </summary>
+		public string TestType
+		{
+			get { return testType; }
+		}
+
+		/// <summary>
+		/// The test description 
+		/// </summary>
+		public string Description
+		{
+			get { return description; }
+			set { description = value; }
+		}
+
+		/// <summary>
+		/// Gets the RunState for this test
+		/// </summary>
+        public RunState RunState
+        {
+            get { return runState; }
+            set { runState = value; }
+        }
+
+		/// <summary>
+		/// The reason for ignoring a test
+		/// </summary>
+		public string IgnoreReason
+		{
+			get { return ignoreReason; }
+			set { ignoreReason = value; }
+		}
+
+		/// <summary>
+		/// Count of test cases in this test.
+		/// </summary>
+		public int TestCount
+		{ 
+			get { return testCaseCount; } 
+		}
+
+		/// <summary>
+		///  Gets the parent test of this test
+		/// </summary>
+		public virtual ITest Parent
+		{
+			get { return null; }
+		}
+
+		/// <summary>
+		/// Gets a list of the categories applied to this test
+		/// </summary>
+		public IList Categories 
+		{
+			get { return categories; }
+		}
+
+		/// <summary>
+		/// Gets a list of any child tests
+		/// </summary>
+		public virtual IList Tests
+		{
+			get { return null; }
+		}
+
+		/// <summary>
+		/// True if this is a suite, false if a test case
+		/// </summary>
+		public bool IsSuite
+		{
+			get { return isSuite; }
+		}
+
+		/// <summary>
+		/// Gets the Properties dictionary for this test
+		/// </summary>
+		public IDictionary Properties
+		{
+			get 
+			{
+				if ( properties == null )
+					properties = new ListDictionary();
+
+				return properties; 
+			}
+		}
+		#endregion
+
+        #region Methods
+		/// <summary>
+		/// Counts the test cases that would be run if this
+		/// test were executed using the provided filter.
+		/// </summary>
+		/// <param name="filter">The filter to apply</param>
+		/// <returns>A count of test cases</returns>
+        public virtual int CountTestCases(ITestFilter filter)
+        {
+            if (filter.IsEmpty)
+                return TestCount;
+
+            if (!isSuite)
+                return filter.Pass(this) ? 1 : 0;
+
+            int count = 0;
+            if (filter.Pass(this))
+            {
+                foreach (ITest test in Tests)
+                {
+                    count += test.CountTestCases(filter);
+                }
+            }
+            return count;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/interfaces/TestName.cs b/src/NUnitCore/interfaces/TestName.cs
index 46be25f..51acc23 100644
--- a/src/NUnitCore/interfaces/TestName.cs
+++ b/src/NUnitCore/interfaces/TestName.cs
@@ -1,204 +1,204 @@
-// ****************************************************************
-// Copyright 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.Core
-{
-	/// <summary>
-	/// TestName encapsulates all info needed to identify and
-	/// locate a test that has been loaded by a runner. It consists
-	/// of a three components: the simple name of the test, an int
-	/// id that is unique to a given tree of tests and an int 
-	/// runner id that identifies the particular runner that
-	/// holds the test instance.
-	/// </summary>
-	[Serializable]
-	public class TestName : ICloneable
-	{
-		#region Fields
-		/// <summary>
-		/// ID that uniquely identifies the test
-		/// </summary>
-		private TestID testID;
-
-		private int runnerID;
-
-		/// <summary>
-		/// The simple name of the test, without qualification
-		/// </summary>
-		private string name;
-
-		/// <summary>
-		/// The fully qualified name of the test
-		/// </summary>
-		private string fullName;
-		#endregion
-
-		#region Properties
-		/// <summary>
-		/// Gets or sets the TestID that uniquely identifies this test
-		/// </summary>
-		public TestID TestID
-		{
-			get { return testID; }
-			set { testID = value; }
-		}
-
-		/// <summary>
-		/// Gets the ID for the runner that created the test from
-		/// the TestID, or returns -1 if the TestID is null.
-		/// </summary>
-		public int RunnerID
-		{
-			get { return runnerID; }
-			set { runnerID = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the simple name of the test
-		/// </summary>
-		public string Name
-		{
-			get { return name; }
-			set { name = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the full (qualified) name of the test
-		/// </summary>
-		public string FullName
-		{
-			get { return fullName; }
-			set { fullName = value; }
-		}
-
-		/// <summary>
-		/// Get the string representation of this test name, incorporating all
-		/// the components of the name.
-		/// </summary>
-		public string UniqueName
-		{
-			get
-			{
-				if ( this.testID == null )
-					return string.Format( "[{0}]{1}", this.runnerID, this.fullName );
-				else
-					return string.Format( "[{0}-{1}]{2}", this.RunnerID, this.testID, this.fullName );
-			}
-		}
-		#endregion
-
-		#region Static Methods
-        /// <summary>
-        /// Parse a string representation of a TestName,
-        /// returning a TestName.
-        /// </summary>
-        /// <param name="s">The string to parse</param>
-        /// <returns>A TestName</returns>
-		public static TestName Parse( string s )
-		{
-			if ( s == null ) throw new ArgumentNullException( "s", "Cannot parse a null string" );
-
-			TestName testName = new TestName();
-			testName.FullName = testName.Name = s;
-
-			if ( s.StartsWith( "[" ) )
-			{
-				int rbrack = s.IndexOf( "]" );
-				if ( rbrack < 0 || rbrack == s.Length - 1 )
-					throw new FormatException( "Invalid TestName format: " + s );
-
-				testName.FullName = testName.Name = s.Substring( rbrack + 1 );
-
-				int dash = s.IndexOf( "-" );
-				if ( dash < 0 || dash > rbrack )
-					testName.RunnerID = Int32.Parse( s.Substring( 1, rbrack - 1 ) );
-				else
-				{
-					testName.RunnerID = Int32.Parse( s.Substring( 1, dash - 1 ) );
-					testName.TestID = TestID.Parse( s.Substring( dash + 1, rbrack - dash - 1 ) );
-				}
-			}
-
-			return testName;
-		}
-		#endregion
-
-		#region Object Overrides
-		/// <summary>
-		/// Compares two TestNames for equality
-		/// </summary>
-		/// <param name="obj">the other TestID</param>
-		/// <returns>True if the two TestIDs are equal</returns>
-		public override bool Equals(object obj)
-		{
-			TestName other = obj as TestName;
-			if ( other == null )
-				return base.Equals (obj);
-
-			return this.TestID == other.testID
-				&& this.runnerID == other.runnerID 
-				&& this.fullName == other.fullName;
-		}
-
-		/// <summary>
-		/// Calculates a hashcode for this TestID
-		/// </summary>
-		/// <returns>The hash code.</returns>
-		public override int GetHashCode()
-		{
-			return unchecked( this.testID.GetHashCode() + this.fullName.GetHashCode() );
-		}
-
-		/// <summary>
-		/// Override ToString() to display the UniqueName
-		/// </summary>
-		/// <returns></returns>
-		public override string ToString()
-		{
-			return this.UniqueName;
-		}
-		#endregion
-
-		#region Operator Overrides
-        /// <summary>
-        /// Override the == operator
-        /// </summary>
-        /// <param name="name1"></param>
-        /// <param name="name2"></param>
-        /// <returns></returns>
-		public static bool operator ==( TestName name1, TestName name2 )
-		{
-			if ( Object.Equals( name1, null ) )
-				return Object.Equals( name2, null );
-
-			return name1.Equals( name2 );
-		}
-
-        /// <summary>
-        /// Override the != operator
-        /// </summary>
-        /// <param name="name1"></param>
-        /// <param name="name2"></param>
-        /// <returns></returns>
-		public static bool operator !=( TestName name1, TestName name2 )
-		{
-			return name1 == name2 ? false : true;
-		}
-		#endregion
-
-		#region ICloneable Implementation
-		/// <summary>
-		/// Returns a duplicate of this TestName
-		/// </summary>
-		/// <returns></returns>
-		public object Clone()
-		{
-			return this.MemberwiseClone();
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Core
+{
+	/// <summary>
+	/// TestName encapsulates all info needed to identify and
+	/// locate a test that has been loaded by a runner. It consists
+	/// of a three components: the simple name of the test, an int
+	/// id that is unique to a given tree of tests and an int 
+	/// runner id that identifies the particular runner that
+	/// holds the test instance.
+	/// </summary>
+	[Serializable]
+	public class TestName : ICloneable
+	{
+		#region Fields
+		/// <summary>
+		/// ID that uniquely identifies the test
+		/// </summary>
+		private TestID testID;
+
+		private int runnerID;
+
+		/// <summary>
+		/// The simple name of the test, without qualification
+		/// </summary>
+		private string name;
+
+		/// <summary>
+		/// The fully qualified name of the test
+		/// </summary>
+		private string fullName;
+		#endregion
+
+		#region Properties
+		/// <summary>
+		/// Gets or sets the TestID that uniquely identifies this test
+		/// </summary>
+		public TestID TestID
+		{
+			get { return testID; }
+			set { testID = value; }
+		}
+
+		/// <summary>
+		/// Gets the ID for the runner that created the test from
+		/// the TestID, or returns -1 if the TestID is null.
+		/// </summary>
+		public int RunnerID
+		{
+			get { return runnerID; }
+			set { runnerID = value; }
+		}
+
+		/// <summary>
+		/// Gets or sets the simple name of the test
+		/// </summary>
+		public string Name
+		{
+			get { return name; }
+			set { name = value; }
+		}
+
+		/// <summary>
+		/// Gets or sets the full (qualified) name of the test
+		/// </summary>
+		public string FullName
+		{
+			get { return fullName; }
+			set { fullName = value; }
+		}
+
+		/// <summary>
+		/// Get the string representation of this test name, incorporating all
+		/// the components of the name.
+		/// </summary>
+		public string UniqueName
+		{
+			get
+			{
+				if ( this.testID == null )
+					return string.Format( "[{0}]{1}", this.runnerID, this.fullName );
+				else
+					return string.Format( "[{0}-{1}]{2}", this.RunnerID, this.testID, this.fullName );
+			}
+		}
+		#endregion
+
+		#region Static Methods
+        /// <summary>
+        /// Parse a string representation of a TestName,
+        /// returning a TestName.
+        /// </summary>
+        /// <param name="s">The string to parse</param>
+        /// <returns>A TestName</returns>
+		public static TestName Parse( string s )
+		{
+			if ( s == null ) throw new ArgumentNullException( "s", "Cannot parse a null string" );
+
+			TestName testName = new TestName();
+			testName.FullName = testName.Name = s;
+
+			if ( s.StartsWith( "[" ) )
+			{
+				int rbrack = s.IndexOf( "]" );
+				if ( rbrack < 0 || rbrack == s.Length - 1 )
+					throw new FormatException( "Invalid TestName format: " + s );
+
+				testName.FullName = testName.Name = s.Substring( rbrack + 1 );
+
+				int dash = s.IndexOf( "-" );
+				if ( dash < 0 || dash > rbrack )
+					testName.RunnerID = Int32.Parse( s.Substring( 1, rbrack - 1 ) );
+				else
+				{
+					testName.RunnerID = Int32.Parse( s.Substring( 1, dash - 1 ) );
+					testName.TestID = TestID.Parse( s.Substring( dash + 1, rbrack - dash - 1 ) );
+				}
+			}
+
+			return testName;
+		}
+		#endregion
+
+		#region Object Overrides
+		/// <summary>
+		/// Compares two TestNames for equality
+		/// </summary>
+		/// <param name="obj">the other TestID</param>
+		/// <returns>True if the two TestIDs are equal</returns>
+		public override bool Equals(object obj)
+		{
+			TestName other = obj as TestName;
+			if ( other == null )
+				return base.Equals (obj);
+
+			return this.TestID == other.testID
+				&& this.runnerID == other.runnerID 
+				&& this.fullName == other.fullName;
+		}
+
+		/// <summary>
+		/// Calculates a hashcode for this TestID
+		/// </summary>
+		/// <returns>The hash code.</returns>
+		public override int GetHashCode()
+		{
+			return unchecked( this.testID.GetHashCode() + this.fullName.GetHashCode() );
+		}
+
+		/// <summary>
+		/// Override ToString() to display the UniqueName
+		/// </summary>
+		/// <returns></returns>
+		public override string ToString()
+		{
+			return this.UniqueName;
+		}
+		#endregion
+
+		#region Operator Overrides
+        /// <summary>
+        /// Override the == operator
+        /// </summary>
+        /// <param name="name1"></param>
+        /// <param name="name2"></param>
+        /// <returns></returns>
+		public static bool operator ==( TestName name1, TestName name2 )
+		{
+			if ( Object.Equals( name1, null ) )
+				return Object.Equals( name2, null );
+
+			return name1.Equals( name2 );
+		}
+
+        /// <summary>
+        /// Override the != operator
+        /// </summary>
+        /// <param name="name1"></param>
+        /// <param name="name2"></param>
+        /// <returns></returns>
+		public static bool operator !=( TestName name1, TestName name2 )
+		{
+			return name1 == name2 ? false : true;
+		}
+		#endregion
+
+		#region ICloneable Implementation
+		/// <summary>
+		/// Returns a duplicate of this TestName
+		/// </summary>
+		/// <returns></returns>
+		public object Clone()
+		{
+			return this.MemberwiseClone();
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestNode.cs b/src/NUnitCore/interfaces/TestNode.cs
index aeaaa0b..a5978f8 100644
--- a/src/NUnitCore/interfaces/TestNode.cs
+++ b/src/NUnitCore/interfaces/TestNode.cs
@@ -1,88 +1,88 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// TestNode represents a single test or suite in the test hierarchy.
-	/// TestNode holds common info needed about a test and represents a
-	/// single node - either a test or a suite - in the hierarchy of tests.
-	/// 
-	/// TestNode extends TestInfo, which holds all the information with
-	/// the exception of the list of child classes. When constructed from
-	/// a Test, TestNodes are always fully populated with child TestNodes.
-	/// 
-	/// Like TestInfo, TestNode is purely a data class, and is not able
-	/// to execute tests.
-	/// 
-	/// </summary>
-	[Serializable]
-	public class TestNode : TestInfo
-	{
-		#region Instance Variables
-		private ITest parent;
-
-		/// <summary>
-		/// For a test suite, the child tests or suites
-		/// Null if this is not a test suite
-		/// </summary>
-		private ArrayList tests;
-		#endregion
-
-		#region Constructors
-		/// <summary>
-		/// Construct from an ITest
-		/// </summary>
-		/// <param name="test">Test from which a TestNode is to be constructed</param>
-		public TestNode ( ITest test ) : base( test )
-		{
-			if ( test.IsSuite )
-			{
-				this.tests = new ArrayList();
-				
-				foreach( ITest child in test.Tests )
-				{
-					TestNode node = new TestNode( child );
-					this.Tests.Add( node );
-					node.parent = this;
-				}
-			}
-		}
-
-        /// <summary>
-        /// Construct a TestNode given a TestName and an
-        /// array of child tests.
-        /// </summary>
-        /// <param name="testName">The TestName of the new test</param>
-        /// <param name="tests">An array of tests to be added as children of the new test</param>
-	    public TestNode ( TestName testName, ITest[] tests ) : base( testName, tests )
-		{
-			this.tests = new ArrayList();
-			this.tests.AddRange( tests );
-		}
-		#endregion
-
-		#region Properties
-        /// <summary>
-        /// Gets the parent test of the current test
-        /// </summary>
-		public override ITest Parent
-		{
-			get { return parent; }
-		}
-
-		/// <summary>
-		/// Array of child tests, null if this is a test case.
-		/// </summary>
-		public override IList Tests 
-		{
-			get { return tests; }
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// TestNode represents a single test or suite in the test hierarchy.
+	/// TestNode holds common info needed about a test and represents a
+	/// single node - either a test or a suite - in the hierarchy of tests.
+	/// 
+	/// TestNode extends TestInfo, which holds all the information with
+	/// the exception of the list of child classes. When constructed from
+	/// a Test, TestNodes are always fully populated with child TestNodes.
+	/// 
+	/// Like TestInfo, TestNode is purely a data class, and is not able
+	/// to execute tests.
+	/// 
+	/// </summary>
+	[Serializable]
+	public class TestNode : TestInfo
+	{
+		#region Instance Variables
+		private ITest parent;
+
+		/// <summary>
+		/// For a test suite, the child tests or suites
+		/// Null if this is not a test suite
+		/// </summary>
+		private ArrayList tests;
+		#endregion
+
+		#region Constructors
+		/// <summary>
+		/// Construct from an ITest
+		/// </summary>
+		/// <param name="test">Test from which a TestNode is to be constructed</param>
+		public TestNode ( ITest test ) : base( test )
+		{
+			if ( test.IsSuite )
+			{
+				this.tests = new ArrayList();
+				
+				foreach( ITest child in test.Tests )
+				{
+					TestNode node = new TestNode( child );
+					this.Tests.Add( node );
+					node.parent = this;
+				}
+			}
+		}
+
+        /// <summary>
+        /// Construct a TestNode given a TestName and an
+        /// array of child tests.
+        /// </summary>
+        /// <param name="testName">The TestName of the new test</param>
+        /// <param name="tests">An array of tests to be added as children of the new test</param>
+	    public TestNode ( TestName testName, ITest[] tests ) : base( testName, tests )
+		{
+			this.tests = new ArrayList();
+			this.tests.AddRange( tests );
+		}
+		#endregion
+
+		#region Properties
+        /// <summary>
+        /// Gets the parent test of the current test
+        /// </summary>
+		public override ITest Parent
+		{
+			get { return parent; }
+		}
+
+		/// <summary>
+		/// Array of child tests, null if this is a test case.
+		/// </summary>
+		public override IList Tests 
+		{
+			get { return tests; }
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestOutput.cs b/src/NUnitCore/interfaces/TestOutput.cs
index 7a5bc8e..0032104 100644
--- a/src/NUnitCore/interfaces/TestOutput.cs
+++ b/src/NUnitCore/interfaces/TestOutput.cs
@@ -1,92 +1,92 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-namespace NUnit.Core
-{
-	using System;
-
-    /// <summary>
-    /// The TestOutput class holds a unit of output from 
-    /// a test to either stdOut or stdErr
-    /// </summary>
-	[Serializable]
-	public class TestOutput
-	{
-		string text;
-		TestOutputType type;
-
-        /// <summary>
-        /// Construct with text and an ouput destination type
-        /// </summary>
-        /// <param name="text">Text to be output</param>
-        /// <param name="type">Destination of output</param>
-		public TestOutput(string text, TestOutputType type)
-		{
-			this.text = text;
-			this.type = type;
-		}
-
-        /// <summary>
-        /// Return string representation of the object for debugging
-        /// </summary>
-        /// <returns></returns>
-		public override string ToString()
-		{
-			return type + ": " + text;
-		}
-
-        /// <summary>
-        /// Get the text 
-        /// </summary>
-		public string Text
-		{
-			get
-			{
-				return this.text;
-			}
-		}
-
-        /// <summary>
-        /// Get the output type
-        /// </summary>
-		public TestOutputType Type
-		{
-			get
-			{
-				return this.type;
-			}
-		}
-	}
-
-    /// <summary>
-    /// Enum representing the output destination
-    /// It uses combinable flags so that a given
-    /// output control can accept multiple types
-    /// of output. Normally, each individual
-    /// output uses a single flag value.
-    /// </summary>
-	public enum TestOutputType
-	{
-        /// <summary>
-        /// Send output to stdOut
-        /// </summary>
-		Out, 
-        
-        /// <summary>
-        /// Send output to stdErr
-        /// </summary>
-        Error,
-
-		/// <summary>
-		/// Send output to Trace
-		/// </summary>
-		Trace,
-
-		/// <summary>
-		/// Send output to Log
-		/// </summary>
-		Log
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+namespace NUnit.Core
+{
+	using System;
+
+    /// <summary>
+    /// The TestOutput class holds a unit of output from 
+    /// a test to either stdOut or stdErr
+    /// </summary>
+	[Serializable]
+	public class TestOutput
+	{
+		string text;
+		TestOutputType type;
+
+        /// <summary>
+        /// Construct with text and an ouput destination type
+        /// </summary>
+        /// <param name="text">Text to be output</param>
+        /// <param name="type">Destination of output</param>
+		public TestOutput(string text, TestOutputType type)
+		{
+			this.text = text;
+			this.type = type;
+		}
+
+        /// <summary>
+        /// Return string representation of the object for debugging
+        /// </summary>
+        /// <returns></returns>
+		public override string ToString()
+		{
+			return type + ": " + text;
+		}
+
+        /// <summary>
+        /// Get the text 
+        /// </summary>
+		public string Text
+		{
+			get
+			{
+				return this.text;
+			}
+		}
+
+        /// <summary>
+        /// Get the output type
+        /// </summary>
+		public TestOutputType Type
+		{
+			get
+			{
+				return this.type;
+			}
+		}
+	}
+
+    /// <summary>
+    /// Enum representing the output destination
+    /// It uses combinable flags so that a given
+    /// output control can accept multiple types
+    /// of output. Normally, each individual
+    /// output uses a single flag value.
+    /// </summary>
+	public enum TestOutputType
+	{
+        /// <summary>
+        /// Send output to stdOut
+        /// </summary>
+		Out, 
+        
+        /// <summary>
+        /// Send output to stdErr
+        /// </summary>
+        Error,
+
+		/// <summary>
+		/// Send output to Trace
+		/// </summary>
+		Trace,
+
+		/// <summary>
+		/// Send output to Log
+		/// </summary>
+		Log
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestPackage.cs b/src/NUnitCore/interfaces/TestPackage.cs
index 768919d..e233d50 100644
--- a/src/NUnitCore/interfaces/TestPackage.cs
+++ b/src/NUnitCore/interfaces/TestPackage.cs
@@ -1,289 +1,289 @@
-// ****************************************************************
-// Copyright 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.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.Core
-{
-    /// <summary>
-    /// Represents the manner in which test assemblies are
-    /// distributed across processes.
-    /// </summary>
-    public enum ProcessModel
-    {
-        /// <summary>
-        /// Use the default setting, depending on the runner
-        /// and the nature of the tests to be loaded.
-        /// </summary>
-        Default,
-        /// <summary>
-        /// Run tests directly in the NUnit process
-        /// </summary>
-        Single,
-        /// <summary>
-        /// Run tests in a single separate process
-        /// </summary>
-        Separate,
-        /// <summary>
-        /// Run tests in a separate process per assembly
-        /// </summary>
-        Multiple
-    }
-
-    /// <summary>
-    /// Represents the manner in which test assemblies use
-    /// AppDomains to provide isolation
-    /// </summary>
-    public enum DomainUsage
-    {
-        /// <summary>
-        /// Use the default setting, depending on the runner
-        /// and the nature of the tests to be loaded.
-        /// </summary>
-        Default,
-        /// <summary>
-        /// Don't create a test domain - run in the primary AppDomain
-        /// </summary>
-        None,
-        /// <summary>
-        /// Run tests in a single separate test domain
-        /// </summary>
-        Single,
-        /// <summary>
-        /// Run tests in a separate domain per assembly
-        /// </summary>
-        Multiple
-    }
-
-    /// <summary>
-	/// TestPackage holds information about a set of tests to
-	/// be loaded by a TestRunner. It may represent a single
-	/// assembly or a set of assemblies. It supports selection
-	/// of a single test fixture for loading.
-	/// </summary>
-	[Serializable]
-	public class TestPackage
-	{
-		private string name;
-		private string fullName;
-
-		private ListDictionary settings = new ListDictionary();
-
-		private string basePath;
-		private string configFile;
-		private string binPath;
-		private bool autoBinPath;
-
-		private ArrayList assemblies;
-		private string testName;
-		private bool isSingleAssembly;
-
-
-		/// <summary>
-		/// Construct a package, specifying the name of the package.
-		/// If the package name is an assembly file type (dll or exe)
-		/// then the resulting package represents a single assembly.
-		/// Otherwise it is a container for multiple assemblies.
-		/// </summary>
-		/// <param name="name">The name of the package</param>
-		public TestPackage( string name )
-		{          
-            this.fullName = name;
-			this.name = Path.GetFileName( name );
-			this.assemblies = new ArrayList();
-			if ( IsAssemblyFileType( name ) )
-			{
-                if (!Path.IsPathRooted(name))
-                    throw new ArgumentException("Assembly in TestPackage must be specified as an absolute path", "name");
-                
-                this.isSingleAssembly = true;
-				this.assemblies.Add(name);
-			}
-		}
-
-		/// <summary>
-		/// Construct a package, specifying the name to be used
-		/// and a list of assemblies.
-		/// </summary>
-		/// <param name="name">The package name, used to name the top-level test node</param>
-		/// <param name="assemblies">The list of assemblies comprising the package</param>
-		public TestPackage( string name, IList assemblies )
-		{
-			this.fullName = name;
-			this.name = Path.GetFileName( name );
-			this.assemblies = new ArrayList();
-            foreach (string assembly in assemblies)
-            {
-                if (!Path.IsPathRooted(assembly))
-                    throw new ArgumentException("Assembly in TestPackage must be specified as an absolute path", "assemblies");
-                this.assemblies.Add(assembly);
-            }
-			this.isSingleAssembly = false;
-		}
-
-		/// <summary>
-		/// Gets the name of the package
-		/// </summary>
-		public string Name
-		{
-			get { return name; }
-		}
-
-		/// <summary>
-		/// Gets the full name of the package, which is usually
-		/// the path to the NUnit project used to create the it
-		/// </summary>
-		public string FullName
-		{
-			get { return fullName; }
-		}
-
-		/// <summary>
-		/// The BasePath to be used in loading the assemblies
-		/// </summary>
-		public string BasePath
-		{
-			get { return basePath; }
-			set { basePath = value; }
-		}
-
-		/// <summary>
-		/// The configuration file to be used
-		/// </summary>
-		public string ConfigurationFile
-		{
-			get { return configFile; }
-			set { configFile = value; }
-		}
-
-		/// <summary>
-		/// Addditional directories to be probed when loading assemblies
-		/// </summary>
-		public string PrivateBinPath
-		{
-			get { return binPath; }
-			set { binPath = value; }
-		}
-
-		/// <summary>
-		/// Indicates whether the probing path should be generated
-		/// automatically based on the list of assemblies.
-		/// </summary>
-		public bool AutoBinPath
-		{
-			get { return autoBinPath; }
-			set { autoBinPath = value; }
-		}
-
-		/// <summary>
-		/// Assemblies to be loaded. At least one must be specified.
-		/// </summary>
-		public IList Assemblies
-		{
-			get { return assemblies; }
-		}
-
-		/// <summary>
-		/// Return true if the package represents a single assembly.
-		/// No root node is displayed in that case.
-		/// </summary>
-		public bool IsSingleAssembly
-		{
-			get { return isSingleAssembly; }
-		}
-
-		/// <summary>
-		/// Fully qualified name of test to be loaded. If not 
-		/// specified, all the tests in the assemblies are loaded.
-		/// </summary>
-		public string TestName
-		{
-			get { return testName; }
-			set { testName = value; }
-		}
-
-		/// <summary>
-		/// Gets the dictionary of settings for this TestPackage
-		/// </summary>
-		public IDictionary Settings
-		{
-			get { return settings; }
-		}
-
-        /// <summary>
-        /// Return the value of a setting or a default.
-        /// </summary>
-        /// <param name="name">The name of the setting</param>
-        /// <param name="defaultSetting">The default value</param>
-        /// <returns></returns>
-        public object GetSetting(string name, object defaultSetting)
-        {
-            object setting = settings[name];
-
-            return setting == null ? defaultSetting : setting;
-        }
-
-        /// <summary>
-        /// Return the value of a string setting or a default.
-        /// </summary>
-        /// <param name="name">The name of the setting</param>
-        /// <param name="defaultSetting">The default value</param>
-        /// <returns></returns>
-        public string GetSetting(string name, string defaultSetting)
-        {
-            object setting = settings[name];
-
-            return setting == null ? defaultSetting : (string)setting;
-        }
-
-        /// <summary>
-        /// Return the value of a bool setting or a default.
-        /// </summary>
-        /// <param name="name">The name of the setting</param>
-        /// <param name="defaultSetting">The default value</param>
-        /// <returns></returns>
-        public bool GetSetting(string name, bool defaultSetting)
-        {
-            object setting = settings[name];
-
-            return setting == null ? defaultSetting : (bool)setting;
-        }
-
-        /// <summary>
-        /// Return the value of an int setting or a default.
-        /// </summary>
-        /// <param name="name">The name of the setting</param>
-        /// <param name="defaultSetting">The default value</param>
-        /// <returns></returns>
-        public int GetSetting(string name, int defaultSetting)
-        {
-            object setting = settings[name];
-
-            return setting == null ? defaultSetting : (int)setting;
-        }
-
-        /// <summary>
-        /// Return the value of a enum setting or a default.
-        /// </summary>
-        /// <param name="name">The name of the setting</param>
-        /// <param name="defaultSetting">The default value</param>
-        /// <returns></returns>
-        public System.Enum GetSetting(string name, System.Enum defaultSetting)
-        {
-            object setting = settings[name];
-
-            return setting == null ? defaultSetting : (System.Enum)setting;
-        }
-
-        private static bool IsAssemblyFileType(string path)
-		{
-			string extension = Path.GetExtension( path ).ToLower();
-			return extension == ".dll" || extension == ".exe";
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Core
+{
+    /// <summary>
+    /// Represents the manner in which test assemblies are
+    /// distributed across processes.
+    /// </summary>
+    public enum ProcessModel
+    {
+        /// <summary>
+        /// Use the default setting, depending on the runner
+        /// and the nature of the tests to be loaded.
+        /// </summary>
+        Default,
+        /// <summary>
+        /// Run tests directly in the NUnit process
+        /// </summary>
+        Single,
+        /// <summary>
+        /// Run tests in a single separate process
+        /// </summary>
+        Separate,
+        /// <summary>
+        /// Run tests in a separate process per assembly
+        /// </summary>
+        Multiple
+    }
+
+    /// <summary>
+    /// Represents the manner in which test assemblies use
+    /// AppDomains to provide isolation
+    /// </summary>
+    public enum DomainUsage
+    {
+        /// <summary>
+        /// Use the default setting, depending on the runner
+        /// and the nature of the tests to be loaded.
+        /// </summary>
+        Default,
+        /// <summary>
+        /// Don't create a test domain - run in the primary AppDomain
+        /// </summary>
+        None,
+        /// <summary>
+        /// Run tests in a single separate test domain
+        /// </summary>
+        Single,
+        /// <summary>
+        /// Run tests in a separate domain per assembly
+        /// </summary>
+        Multiple
+    }
+
+    /// <summary>
+	/// TestPackage holds information about a set of tests to
+	/// be loaded by a TestRunner. It may represent a single
+	/// assembly or a set of assemblies. It supports selection
+	/// of a single test fixture for loading.
+	/// </summary>
+	[Serializable]
+	public class TestPackage
+	{
+		private string name;
+		private string fullName;
+
+		private ListDictionary settings = new ListDictionary();
+
+		private string basePath;
+		private string configFile;
+		private string binPath;
+		private bool autoBinPath;
+
+		private ArrayList assemblies;
+		private string testName;
+		private bool isSingleAssembly;
+
+
+		/// <summary>
+		/// Construct a package, specifying the name of the package.
+		/// If the package name is an assembly file type (dll or exe)
+		/// then the resulting package represents a single assembly.
+		/// Otherwise it is a container for multiple assemblies.
+		/// </summary>
+		/// <param name="name">The name of the package</param>
+		public TestPackage( string name )
+		{          
+            this.fullName = name;
+			this.name = Path.GetFileName( name );
+			this.assemblies = new ArrayList();
+			if ( IsAssemblyFileType( name ) )
+			{
+                if (!Path.IsPathRooted(name))
+                    throw new ArgumentException("Assembly in TestPackage must be specified as an absolute path", "name");
+                
+                this.isSingleAssembly = true;
+				this.assemblies.Add(name);
+			}
+		}
+
+		/// <summary>
+		/// Construct a package, specifying the name to be used
+		/// and a list of assemblies.
+		/// </summary>
+		/// <param name="name">The package name, used to name the top-level test node</param>
+		/// <param name="assemblies">The list of assemblies comprising the package</param>
+		public TestPackage( string name, IList assemblies )
+		{
+			this.fullName = name;
+			this.name = Path.GetFileName( name );
+			this.assemblies = new ArrayList();
+            foreach (string assembly in assemblies)
+            {
+                if (!Path.IsPathRooted(assembly))
+                    throw new ArgumentException("Assembly in TestPackage must be specified as an absolute path", "assemblies");
+                this.assemblies.Add(assembly);
+            }
+			this.isSingleAssembly = false;
+		}
+
+		/// <summary>
+		/// Gets the name of the package
+		/// </summary>
+		public string Name
+		{
+			get { return name; }
+		}
+
+		/// <summary>
+		/// Gets the full name of the package, which is usually
+		/// the path to the NUnit project used to create the it
+		/// </summary>
+		public string FullName
+		{
+			get { return fullName; }
+		}
+
+		/// <summary>
+		/// The BasePath to be used in loading the assemblies
+		/// </summary>
+		public string BasePath
+		{
+			get { return basePath; }
+			set { basePath = value; }
+		}
+
+		/// <summary>
+		/// The configuration file to be used
+		/// </summary>
+		public string ConfigurationFile
+		{
+			get { return configFile; }
+			set { configFile = value; }
+		}
+
+		/// <summary>
+		/// Addditional directories to be probed when loading assemblies
+		/// </summary>
+		public string PrivateBinPath
+		{
+			get { return binPath; }
+			set { binPath = value; }
+		}
+
+		/// <summary>
+		/// Indicates whether the probing path should be generated
+		/// automatically based on the list of assemblies.
+		/// </summary>
+		public bool AutoBinPath
+		{
+			get { return autoBinPath; }
+			set { autoBinPath = value; }
+		}
+
+		/// <summary>
+		/// Assemblies to be loaded. At least one must be specified.
+		/// </summary>
+		public IList Assemblies
+		{
+			get { return assemblies; }
+		}
+
+		/// <summary>
+		/// Return true if the package represents a single assembly.
+		/// No root node is displayed in that case.
+		/// </summary>
+		public bool IsSingleAssembly
+		{
+			get { return isSingleAssembly; }
+		}
+
+		/// <summary>
+		/// Fully qualified name of test to be loaded. If not 
+		/// specified, all the tests in the assemblies are loaded.
+		/// </summary>
+		public string TestName
+		{
+			get { return testName; }
+			set { testName = value; }
+		}
+
+		/// <summary>
+		/// Gets the dictionary of settings for this TestPackage
+		/// </summary>
+		public IDictionary Settings
+		{
+			get { return settings; }
+		}
+
+        /// <summary>
+        /// Return the value of a setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public object GetSetting(string name, object defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : setting;
+        }
+
+        /// <summary>
+        /// Return the value of a string setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public string GetSetting(string name, string defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (string)setting;
+        }
+
+        /// <summary>
+        /// Return the value of a bool setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public bool GetSetting(string name, bool defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (bool)setting;
+        }
+
+        /// <summary>
+        /// Return the value of an int setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public int GetSetting(string name, int defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (int)setting;
+        }
+
+        /// <summary>
+        /// Return the value of a enum setting or a default.
+        /// </summary>
+        /// <param name="name">The name of the setting</param>
+        /// <param name="defaultSetting">The default value</param>
+        /// <returns></returns>
+        public System.Enum GetSetting(string name, System.Enum defaultSetting)
+        {
+            object setting = settings[name];
+
+            return setting == null ? defaultSetting : (System.Enum)setting;
+        }
+
+        private static bool IsAssemblyFileType(string path)
+		{
+			string extension = Path.GetExtension( path ).ToLower();
+			return extension == ".dll" || extension == ".exe";
+		}
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestResult.cs b/src/NUnitCore/interfaces/TestResult.cs
index 279c916..ef280ed 100644
--- a/src/NUnitCore/interfaces/TestResult.cs
+++ b/src/NUnitCore/interfaces/TestResult.cs
@@ -1,509 +1,509 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core
-{
-	using System;
-	using System.Text;
-	using System.Collections;
-
-	/// <summary>
-	/// The TestResult class represents
-	/// the result of a test and is used to
-	/// communicate results across AppDomains.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class TestResult
-	{
-		#region Fields
-		/// <summary>
-		/// Indicates the result of the test
-		/// </summary>
-		private ResultState resultState;
-
-		/// <summary>
-		/// Indicates the location of a failure
-		/// </summary>
-        private FailureSite failureSite;
-
-		/// <summary>
-		/// The elapsed time for executing this test
-		/// </summary>
-		private double time = 0.0;
-
-		/// <summary>
-		/// The test that this result pertains to
-		/// </summary>
-		private readonly TestInfo test;
-
-		/// <summary>
-		/// The stacktrace at the point of failure
-		/// </summary>
-		private string stackTrace;
-
-		/// <summary>
-		/// Message giving the reason for failure
-		/// </summary>
-		private string message;
-
-		/// <summary>
-		/// List of child results
-		/// </summary>
-		private IList results;
-
-		/// <summary>
-		/// Number of asserts executed by this test
-		/// </summary>
-		private int assertCount = 0;
-
-		#endregion
-
-		#region Constructor
-		/// <summary>
-		/// Construct a test result given a TestInfo
-		/// </summary>
-		/// <param name="test">The test to be used</param>
-		public TestResult(TestInfo test)
-		{
-			this.test = test;
-			this.message = test.IgnoreReason;
-		}
-
-        /// <summary>
-        /// Construct a TestResult given an ITest
-        /// </summary>
-        /// <param name="test"></param>
-        public TestResult(ITest test) : this( new TestInfo(test) ) { }
-
-		/// <summary>
-		/// Construct a TestResult given a TestName
-		/// </summary>
-		/// <param name="testName">A TestName</param>
-		public TestResult(TestName testName) : this( new TestInfo( testName ) ) { }
-		#endregion
-
-        #region Properties
-
-		/// <summary>
-		/// Gets the ResultState of the test result, which 
-		/// indicates the success or failure of the test.
-		/// </summary>
-        public ResultState ResultState
-        {
-            get { return resultState; }
-        }
-
-		/// <summary>
-		/// Gets the stage of the test in which a failure
-		/// or error occured.
-		/// </summary>
-        public FailureSite FailureSite
-        {
-            get { return failureSite; }
-        }
-
-		/// <summary>
-		/// Indicates whether the test executed
-		/// </summary>
-        public bool Executed
-        {
-            get
-            {
-                return resultState == ResultState.Success ||
-                       resultState == ResultState.Failure ||
-                       resultState == ResultState.Error ||
-                       resultState == ResultState.Inconclusive;
-            }
-        }
-
-		/// <summary>
-		/// Gets the name of the test result
-		/// </summary>
-		public virtual string Name
-		{
-			get { return test.TestName.Name; }
-		}
-
-		/// <summary>
-		/// Gets the full name of the test result
-		/// </summary>
-		public virtual string FullName
-		{
-			get { return test.TestName.FullName; }
-		}
-
-		/// <summary>
-		/// Gets the test associated with this result
-		/// </summary>
-        public ITest Test
-        {
-            get { return test; }
-        }
-
-		/// <summary>
-		/// Indicates whether the test ran successfully
-		/// </summary>
-        public virtual bool IsSuccess
-        {
-            get { return resultState == ResultState.Success; }
-        }
-
-        /// <summary>
-        /// Indicates whether the test failed
-        /// </summary>
-        public virtual bool IsFailure
-        {
-            get { return resultState == ResultState.Failure;  }
-        }
-
-	    /// <summary>
-	    /// Indicates whether the test had an error (as opposed to a failure)
-	    /// </summary>
-        public virtual bool IsError
-	    {
-            get { return resultState == ResultState.Error;  }   
-	    }
-
-		/// <summary>
-		/// Gets a description associated with the test
-		/// </summary>
-        public string Description
-        {
-            get { return test.Description; }
-        }
-
-		/// <summary>
-		/// Gets the elapsed time for running the test
-		/// </summary>
-        public double Time
-        {
-            get { return time; }
-            set { time = value; }
-        }
-
-		/// <summary>
-		/// Gets the message associated with a test
-		/// failure or with not running the test
-		/// </summary>
-        public string Message
-        {
-            get { return message; }
-        }
-
-		/// <summary>
-		/// Gets any stacktrace associated with an
-		/// error or failure.
-		/// </summary>
-        public virtual string StackTrace
-        {
-            get { return stackTrace; }
-            set { stackTrace = value; }
-        }
-
-		/// <summary>
-		/// Gets or sets the count of asserts executed
-		/// when running the test.
-		/// </summary>
-        public int AssertCount
-        {
-            get { return assertCount; }
-            set { assertCount = value; }
-        }
-
-        /// <summary>
-        /// Return true if this result has any child results
-        /// </summary>
-	    public bool HasResults
-	    {
-            get { return results != null && results.Count > 0; }    
-	    }
-
-		/// <summary>
-		/// Gets a list of the child results of this TestResult
-		/// </summary>
-		public IList Results
-		{
-			get { return results; }
-		}
-
-		#endregion
-
-        #region Public Methods
-        /// <summary>
-        /// Mark the test as succeeding
-        /// </summary>
-        public void Success()
-        {
-            SetResult( ResultState.Success, null, null );
-        }
-
-        /// <summary>
-        /// Mark the test as succeeding and set a message
-        /// </summary>
-        public void Success( string message )
-        {
-            SetResult( ResultState.Success, message, null );
-        }
-
-        /// <summary>
-		/// Mark the test as ignored.
-		/// </summary>
-		/// <param name="reason">The reason the test was not run</param>
-		public void Ignore(string reason)
-		{
-			Ignore( reason, null );
-		}
-
-		/// <summary>
-		/// Mark the test as ignored.
-		/// </summary>
-		/// <param name="ex">The ignore exception that was thrown</param>
-		public void Ignore( Exception ex )
-		{
-			Ignore( ex.Message, BuildStackTrace( ex ) );
-		}
-
-		/// <summary>
-		/// Mark the test as ignored.
-		/// </summary>
-		/// <param name="reason">The reason the test was not run</param>
-		/// <param name="stackTrace">Stack trace giving the location of the command</param>
-		public void Ignore(string reason, string stackTrace)
-		{
-			SetResult( ResultState.Ignored, reason, stackTrace );
-		}
-
-		/// <summary>
-		/// Mark the test as skipped.
-		/// </summary>
-		/// <param name="reason">The reason the test was not run</param>
-        public void Skip(string reason)
-        {
-            SetResult(ResultState.Skipped, reason, null);
-        }
-
-        /// <summary>
-        /// Mark the test a not runnable with a reason
-        /// </summary>
-        /// <param name="reason">The reason the test is invalid</param>
-        public void Invalid( string reason )
-        {
-            SetResult( ResultState.NotRunnable, reason, null );
-        }
-
-        /// <summary>
-        /// Mark the test as not runnable due to a builder exception
-        /// </summary>
-        /// <param name="ex">The exception thrown by the builder or an addin</param>
-        public void Invalid(Exception ex)
-        {
-            SetResult(ResultState.NotRunnable, BuildMessage( ex ), BuildStackTrace(ex));
-        }
-
-	    /// <summary>
-		/// Set the result of the test
-		/// </summary>
-		/// <param name="resultState">The ResultState to use in the result</param>
-		/// <param name="reason">The reason the test was not run</param>
-        /// <param name="stackTrace">Stack trace giving the location of the command</param>
-        /// <param name="failureSite">The location of the failure, if any</param>
-        public void SetResult(ResultState resultState, string reason, string stackTrace, FailureSite failureSite)
-		{
-            if (failureSite == FailureSite.SetUp)
-                reason = "SetUp : " + reason;
-            else if (failureSite == FailureSite.TearDown)
-            {
-                reason = "TearDown : " + reason;
-                stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
-
-                if (this.message != null)
-                    reason = this.message + Environment.NewLine + reason;
-                if (this.stackTrace != null)
-                    stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
-            }
-
-            this.resultState = resultState;
-            this.message = reason;
-            this.stackTrace = stackTrace;
-            this.failureSite = failureSite;
-		}
-
-        /// <summary>
-        /// Set the result of the test
-        /// </summary>
-        /// <param name="resultState">The ResultState to use in the result</param>
-        /// <param name="reason">The reason the test was not run</param>
-        /// <param name="stackTrace">Stack trace giving the location of the command</param>
-        public void SetResult(ResultState resultState, string reason, string stackTrace)
-        {
-            SetResult(resultState, reason, stackTrace, FailureSite.Test);
-        }
-
-        /// <summary>
-        /// Set the result of the test.
-        /// </summary>
-        /// <param name="resultState">The ResultState to use in the result</param>
-        /// <param name="ex">The exception that caused this result</param>
-        /// <param name="failureSite">The site at which an error or failure occured</param>
-        public void SetResult(ResultState resultState, Exception ex, FailureSite failureSite)
-        {
-            if (resultState == ResultState.Cancelled)
-                SetResult(resultState, "Test cancelled by user", BuildStackTrace(ex));
-            else if (resultState == ResultState.Error)
-                SetResult( resultState, BuildMessage(ex), BuildStackTrace(ex), failureSite);
-            else
-                SetResult(resultState, ex.Message, ex.StackTrace, failureSite);
-        }
-   
-        /// <summary>
-		/// Mark the test as a failure due to an
-		/// assertion having failed.
-		/// </summary>
-		/// <param name="message">Message to display</param>
-		/// <param name="stackTrace">Stack trace giving the location of the failure</param>
-		public void Failure(string message, string stackTrace)
-        {
-            Failure(message, stackTrace, FailureSite.Test);
-        }
-
-		/// <summary>
-		/// Mark the test as a failure due to an
-		/// assertion having failed.
-		/// </summary>
-		/// <param name="message">Message to display</param>
-		/// <param name="stackTrace">Stack trace giving the location of the failure</param>
-		/// <param name="failureSite">The site of the failure</param>
-		public void Failure(string message, string stackTrace, FailureSite failureSite )
-		{
-            SetResult( Core.ResultState.Failure, message, stackTrace );
-            this.failureSite = failureSite;
-		}
-
-		/// <summary>
-		/// Marks the result as an error due to an exception thrown
-		/// by the test.
-		/// </summary>
-		/// <param name="exception">The exception that was caught</param>
-        public void Error(Exception exception)
-        {
-            Error(exception, FailureSite.Test);
-        }
-
-		/// <summary>
-		/// Marks the result as an error due to an exception thrown
-		/// from the indicated FailureSite.
-		/// </summary>
-		/// <param name="exception">The exception that was caught</param>
-        /// <param name="failureSite">The site from which it was thrown</param>
-        public void Error(Exception exception, FailureSite failureSite)
-		{
-            SetResult(ResultState.Error, exception, failureSite);
-            //string message = BuildMessage(exception);
-            //string stackTrace = BuildStackTrace(exception);
-
-            //if (failureSite == FailureSite.TearDown)
-            //{
-            //    message = "TearDown : " + message;
-            //    stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
-
-            //    if (this.message != null)
-            //        message = this.message + Environment.NewLine + message;
-            //    if (this.stackTrace != null)
-            //        stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
-            //}
-
-            //SetResult( ResultState.Error, message, stackTrace );
-            //this.failureSite = failureSite;
-        }
-
-		/// <summary>
-		/// Add a child result
-		/// </summary>
-		/// <param name="result">The child result to be added</param>
-		public void AddResult(TestResult result) 
-		{
-			if ( results == null )
-				results = new ArrayList();
-
-			this.results.Add(result);
-
-            switch (result.ResultState)
-            {
-                case ResultState.Failure:
-                case ResultState.Error:
-                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;
-            }
-		}
-		#endregion
-
-		#region Exception Helpers
-
-		private static string BuildMessage(Exception exception)
-		{
-			StringBuilder sb = new StringBuilder();
-			sb.AppendFormat( "{0} : {1}", exception.GetType().ToString(), exception.Message );
-
-			Exception inner = exception.InnerException;
-			while( inner != null )
-			{
-				sb.Append( Environment.NewLine );
-				sb.AppendFormat( "  ----> {0} : {1}", inner.GetType().ToString(), inner.Message );
-				inner = inner.InnerException;
-			}
-
-			return sb.ToString();
-		}
-		
-		private static string BuildStackTrace(Exception exception)
-		{
-            StringBuilder sb = new StringBuilder( GetStackTrace( exception ) );
-
-            Exception inner = exception.InnerException;
-            while( inner != null )
-            {
-                sb.Append( Environment.NewLine );
-                sb.Append( "--" );
-                sb.Append( inner.GetType().Name );
-                sb.Append( Environment.NewLine );
-                sb.Append( GetStackTrace( inner ) );
-
-                inner = inner.InnerException;
-            }
-
-            return sb.ToString();
-		}
-
-		private static string GetStackTrace(Exception exception)
-		{
-			try
-			{
-				return exception.StackTrace;
-			}
-			catch( Exception )
-			{
-				return "No stack trace available";
-			}
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core
+{
+	using System;
+	using System.Text;
+	using System.Collections;
+
+	/// <summary>
+	/// The TestResult class represents
+	/// the result of a test and is used to
+	/// communicate results across AppDomains.
+	/// </summary>
+	/// 
+	[Serializable]
+	public class TestResult
+	{
+		#region Fields
+		/// <summary>
+		/// Indicates the result of the test
+		/// </summary>
+		private ResultState resultState;
+
+		/// <summary>
+		/// Indicates the location of a failure
+		/// </summary>
+        private FailureSite failureSite;
+
+		/// <summary>
+		/// The elapsed time for executing this test
+		/// </summary>
+		private double time = 0.0;
+
+		/// <summary>
+		/// The test that this result pertains to
+		/// </summary>
+		private readonly TestInfo test;
+
+		/// <summary>
+		/// The stacktrace at the point of failure
+		/// </summary>
+		private string stackTrace;
+
+		/// <summary>
+		/// Message giving the reason for failure
+		/// </summary>
+		private string message;
+
+		/// <summary>
+		/// List of child results
+		/// </summary>
+		private IList results;
+
+		/// <summary>
+		/// Number of asserts executed by this test
+		/// </summary>
+		private int assertCount = 0;
+
+		#endregion
+
+		#region Constructor
+		/// <summary>
+		/// Construct a test result given a TestInfo
+		/// </summary>
+		/// <param name="test">The test to be used</param>
+		public TestResult(TestInfo test)
+		{
+			this.test = test;
+			this.message = test.IgnoreReason;
+		}
+
+        /// <summary>
+        /// Construct a TestResult given an ITest
+        /// </summary>
+        /// <param name="test"></param>
+        public TestResult(ITest test) : this( new TestInfo(test) ) { }
+
+		/// <summary>
+		/// Construct a TestResult given a TestName
+		/// </summary>
+		/// <param name="testName">A TestName</param>
+		public TestResult(TestName testName) : this( new TestInfo( testName ) ) { }
+		#endregion
+
+        #region Properties
+
+		/// <summary>
+		/// Gets the ResultState of the test result, which 
+		/// indicates the success or failure of the test.
+		/// </summary>
+        public ResultState ResultState
+        {
+            get { return resultState; }
+        }
+
+		/// <summary>
+		/// Gets the stage of the test in which a failure
+		/// or error occured.
+		/// </summary>
+        public FailureSite FailureSite
+        {
+            get { return failureSite; }
+        }
+
+		/// <summary>
+		/// Indicates whether the test executed
+		/// </summary>
+        public bool Executed
+        {
+            get
+            {
+                return resultState == ResultState.Success ||
+                       resultState == ResultState.Failure ||
+                       resultState == ResultState.Error ||
+                       resultState == ResultState.Inconclusive;
+            }
+        }
+
+		/// <summary>
+		/// Gets the name of the test result
+		/// </summary>
+		public virtual string Name
+		{
+			get { return test.TestName.Name; }
+		}
+
+		/// <summary>
+		/// Gets the full name of the test result
+		/// </summary>
+		public virtual string FullName
+		{
+			get { return test.TestName.FullName; }
+		}
+
+		/// <summary>
+		/// Gets the test associated with this result
+		/// </summary>
+        public ITest Test
+        {
+            get { return test; }
+        }
+
+		/// <summary>
+		/// Indicates whether the test ran successfully
+		/// </summary>
+        public virtual bool IsSuccess
+        {
+            get { return resultState == ResultState.Success; }
+        }
+
+        /// <summary>
+        /// Indicates whether the test failed
+        /// </summary>
+        public virtual bool IsFailure
+        {
+            get { return resultState == ResultState.Failure;  }
+        }
+
+	    /// <summary>
+	    /// Indicates whether the test had an error (as opposed to a failure)
+	    /// </summary>
+        public virtual bool IsError
+	    {
+            get { return resultState == ResultState.Error;  }   
+	    }
+
+		/// <summary>
+		/// Gets a description associated with the test
+		/// </summary>
+        public string Description
+        {
+            get { return test.Description; }
+        }
+
+		/// <summary>
+		/// Gets the elapsed time for running the test
+		/// </summary>
+        public double Time
+        {
+            get { return time; }
+            set { time = value; }
+        }
+
+		/// <summary>
+		/// Gets the message associated with a test
+		/// failure or with not running the test
+		/// </summary>
+        public string Message
+        {
+            get { return message; }
+        }
+
+		/// <summary>
+		/// Gets any stacktrace associated with an
+		/// error or failure.
+		/// </summary>
+        public virtual string StackTrace
+        {
+            get { return stackTrace; }
+            set { stackTrace = value; }
+        }
+
+		/// <summary>
+		/// Gets or sets the count of asserts executed
+		/// when running the test.
+		/// </summary>
+        public int AssertCount
+        {
+            get { return assertCount; }
+            set { assertCount = value; }
+        }
+
+        /// <summary>
+        /// Return true if this result has any child results
+        /// </summary>
+	    public bool HasResults
+	    {
+            get { return results != null && results.Count > 0; }    
+	    }
+
+		/// <summary>
+		/// Gets a list of the child results of this TestResult
+		/// </summary>
+		public IList Results
+		{
+			get { return results; }
+		}
+
+		#endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Mark the test as succeeding
+        /// </summary>
+        public void Success()
+        {
+            SetResult( ResultState.Success, null, null );
+        }
+
+        /// <summary>
+        /// Mark the test as succeeding and set a message
+        /// </summary>
+        public void Success( string message )
+        {
+            SetResult( ResultState.Success, message, null );
+        }
+
+        /// <summary>
+		/// Mark the test as ignored.
+		/// </summary>
+		/// <param name="reason">The reason the test was not run</param>
+		public void Ignore(string reason)
+		{
+			Ignore( reason, null );
+		}
+
+		/// <summary>
+		/// Mark the test as ignored.
+		/// </summary>
+		/// <param name="ex">The ignore exception that was thrown</param>
+		public void Ignore( Exception ex )
+		{
+			Ignore( ex.Message, BuildStackTrace( ex ) );
+		}
+
+		/// <summary>
+		/// Mark the test as ignored.
+		/// </summary>
+		/// <param name="reason">The reason the test was not run</param>
+		/// <param name="stackTrace">Stack trace giving the location of the command</param>
+		public void Ignore(string reason, string stackTrace)
+		{
+			SetResult( ResultState.Ignored, reason, stackTrace );
+		}
+
+		/// <summary>
+		/// Mark the test as skipped.
+		/// </summary>
+		/// <param name="reason">The reason the test was not run</param>
+        public void Skip(string reason)
+        {
+            SetResult(ResultState.Skipped, reason, null);
+        }
+
+        /// <summary>
+        /// Mark the test a not runnable with a reason
+        /// </summary>
+        /// <param name="reason">The reason the test is invalid</param>
+        public void Invalid( string reason )
+        {
+            SetResult( ResultState.NotRunnable, reason, null );
+        }
+
+        /// <summary>
+        /// Mark the test as not runnable due to a builder exception
+        /// </summary>
+        /// <param name="ex">The exception thrown by the builder or an addin</param>
+        public void Invalid(Exception ex)
+        {
+            SetResult(ResultState.NotRunnable, BuildMessage( ex ), BuildStackTrace(ex));
+        }
+
+	    /// <summary>
+		/// Set the result of the test
+		/// </summary>
+		/// <param name="resultState">The ResultState to use in the result</param>
+		/// <param name="reason">The reason the test was not run</param>
+        /// <param name="stackTrace">Stack trace giving the location of the command</param>
+        /// <param name="failureSite">The location of the failure, if any</param>
+        public void SetResult(ResultState resultState, string reason, string stackTrace, FailureSite failureSite)
+		{
+            if (failureSite == FailureSite.SetUp)
+                reason = "SetUp : " + reason;
+            else if (failureSite == FailureSite.TearDown)
+            {
+                reason = "TearDown : " + reason;
+                stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
+
+                if (this.message != null)
+                    reason = this.message + Environment.NewLine + reason;
+                if (this.stackTrace != null)
+                    stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
+            }
+
+            this.resultState = resultState;
+            this.message = reason;
+            this.stackTrace = stackTrace;
+            this.failureSite = failureSite;
+		}
+
+        /// <summary>
+        /// Set the result of the test
+        /// </summary>
+        /// <param name="resultState">The ResultState to use in the result</param>
+        /// <param name="reason">The reason the test was not run</param>
+        /// <param name="stackTrace">Stack trace giving the location of the command</param>
+        public void SetResult(ResultState resultState, string reason, string stackTrace)
+        {
+            SetResult(resultState, reason, stackTrace, FailureSite.Test);
+        }
+
+        /// <summary>
+        /// Set the result of the test.
+        /// </summary>
+        /// <param name="resultState">The ResultState to use in the result</param>
+        /// <param name="ex">The exception that caused this result</param>
+        /// <param name="failureSite">The site at which an error or failure occured</param>
+        public void SetResult(ResultState resultState, Exception ex, FailureSite failureSite)
+        {
+            if (resultState == ResultState.Cancelled)
+                SetResult(resultState, "Test cancelled by user", BuildStackTrace(ex));
+            else if (resultState == ResultState.Error)
+                SetResult( resultState, BuildMessage(ex), BuildStackTrace(ex), failureSite);
+            else
+                SetResult(resultState, ex.Message, ex.StackTrace, failureSite);
+        }
+   
+        /// <summary>
+		/// Mark the test as a failure due to an
+		/// assertion having failed.
+		/// </summary>
+		/// <param name="message">Message to display</param>
+		/// <param name="stackTrace">Stack trace giving the location of the failure</param>
+		public void Failure(string message, string stackTrace)
+        {
+            Failure(message, stackTrace, FailureSite.Test);
+        }
+
+		/// <summary>
+		/// Mark the test as a failure due to an
+		/// assertion having failed.
+		/// </summary>
+		/// <param name="message">Message to display</param>
+		/// <param name="stackTrace">Stack trace giving the location of the failure</param>
+		/// <param name="failureSite">The site of the failure</param>
+		public void Failure(string message, string stackTrace, FailureSite failureSite )
+		{
+            SetResult( Core.ResultState.Failure, message, stackTrace );
+            this.failureSite = failureSite;
+		}
+
+		/// <summary>
+		/// Marks the result as an error due to an exception thrown
+		/// by the test.
+		/// </summary>
+		/// <param name="exception">The exception that was caught</param>
+        public void Error(Exception exception)
+        {
+            Error(exception, FailureSite.Test);
+        }
+
+		/// <summary>
+		/// Marks the result as an error due to an exception thrown
+		/// from the indicated FailureSite.
+		/// </summary>
+		/// <param name="exception">The exception that was caught</param>
+        /// <param name="failureSite">The site from which it was thrown</param>
+        public void Error(Exception exception, FailureSite failureSite)
+		{
+            SetResult(ResultState.Error, exception, failureSite);
+            //string message = BuildMessage(exception);
+            //string stackTrace = BuildStackTrace(exception);
+
+            //if (failureSite == FailureSite.TearDown)
+            //{
+            //    message = "TearDown : " + message;
+            //    stackTrace = "--TearDown" + Environment.NewLine + stackTrace;
+
+            //    if (this.message != null)
+            //        message = this.message + Environment.NewLine + message;
+            //    if (this.stackTrace != null)
+            //        stackTrace = this.stackTrace + Environment.NewLine + stackTrace;
+            //}
+
+            //SetResult( ResultState.Error, message, stackTrace );
+            //this.failureSite = failureSite;
+        }
+
+		/// <summary>
+		/// Add a child result
+		/// </summary>
+		/// <param name="result">The child result to be added</param>
+		public void AddResult(TestResult result) 
+		{
+			if ( results == null )
+				results = new ArrayList();
+
+			this.results.Add(result);
+
+            switch (result.ResultState)
+            {
+                case ResultState.Failure:
+                case ResultState.Error:
+                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;
+            }
+		}
+		#endregion
+
+		#region Exception Helpers
+
+		private static string BuildMessage(Exception exception)
+		{
+			StringBuilder sb = new StringBuilder();
+			sb.AppendFormat( "{0} : {1}", exception.GetType().ToString(), exception.Message );
+
+			Exception inner = exception.InnerException;
+			while( inner != null )
+			{
+				sb.Append( Environment.NewLine );
+				sb.AppendFormat( "  ----> {0} : {1}", inner.GetType().ToString(), inner.Message );
+				inner = inner.InnerException;
+			}
+
+			return sb.ToString();
+		}
+		
+		private static string BuildStackTrace(Exception exception)
+		{
+            StringBuilder sb = new StringBuilder( GetStackTrace( exception ) );
+
+            Exception inner = exception.InnerException;
+            while( inner != null )
+            {
+                sb.Append( Environment.NewLine );
+                sb.Append( "--" );
+                sb.Append( inner.GetType().Name );
+                sb.Append( Environment.NewLine );
+                sb.Append( GetStackTrace( inner ) );
+
+                inner = inner.InnerException;
+            }
+
+            return sb.ToString();
+		}
+
+		private static string GetStackTrace(Exception exception)
+		{
+			try
+			{
+				return exception.StackTrace;
+			}
+			catch( Exception )
+			{
+				return "No stack trace available";
+			}
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitCore/interfaces/TestRunner.cs b/src/NUnitCore/interfaces/TestRunner.cs
index 4a6a479..6317489 100644
--- a/src/NUnitCore/interfaces/TestRunner.cs
+++ b/src/NUnitCore/interfaces/TestRunner.cs
@@ -1,158 +1,158 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.IO;
-
-namespace NUnit.Core
-{
-	/// <summary>
-	/// The TestRunner Interface allows client code, such as the NUnit console and
-	/// gui runners, to load and run tests. This is the lowest level interface generally
-	/// supported for running tests and is implemented by the RemoteTestRunner class in
-	/// the NUnit core as well as by other classes running on the client side.
-	/// 
-	/// The Load method is used to load a suite of tests from one or more 
-	/// assemblies, returning a tree of TestNodes to the caller.
-	/// 
-	/// The CountTestCases family of methods returns the number of test cases in the
-	/// loaded suite, either in its entirety or by using a filter to count a subset of tests.
-	/// 
-	/// The Run family of methods performs a test run synchronously, returning a TestResult
-	/// or TestResult[] to the caller. If provided, an EventListener interface will be 
-	/// notified of significant events in the running of the tests. A filter may be used
-    /// to run a subset of the tests.
-    ///
-    /// BeginRun and EndRun provide a simplified form of the asynchronous invocation
-	/// pattern used in many places within the .NET framework. Because the current
-	/// implementation allows only one run to be in process at a time, an IAsyncResult
-	/// is not used at this time.
-    /// 
-    /// Methods to cancel a run and to wait for a run to complete are also provided. The 
-    /// result of the last run may be obtained by querying the TestResult property.
-    /// 
-    /// </summary>
-	public interface TestRunner : IDisposable
-	{
-		#region Properties
-		/// <summary>
-		/// TestRunners are identified by an ID. So long as there
-		/// is only one test runner or a single chain of test runners,
-		/// the default id of 0 may be used. However, any client that
-		/// creates multiple runners must ensure that each one has a
-		/// unique ID in order to locate and run specific tests.
-		/// </summary>
-		int ID
-		{
-			get;
-		}
-
-		/// <summary>
-		/// Running indicates whether a test is in progress. To retrieve the
-		/// results from an asynchronous test run, wait till Running is false.
-		/// </summary>
-		bool Running
-		{
-			get;
-		}
-
-		/// <summary>
-		/// Returns information about loaded assemblies
-		/// </summary>
-		IList AssemblyInfo
-		{
-			get;
-		}
-
-		/// <summary>
-		/// The loaded test, converted to a tree of TestNodes so they can be
-		/// serialized and marshalled to a remote client.
-		/// </summary>
-		ITest Test
-		{
-			get;
-		}
-
-		/// <summary>
-		/// Result of the last test run.
-		/// </summary>
-		TestResult TestResult
-		{
-			get;
-		}
-		#endregion
-
-		#region Load and Unload Methods
-		/// <summary>
-		/// Load the assemblies in a test package
-		/// </summary>
-		/// <param name="package">The test package to be loaded</param>
-		/// <returns>True if the tests were loaded successfully, otherwise false</returns>
-		bool Load( TestPackage package );
-
-		/// <summary>
-		/// Unload all tests previously loaded
-		/// </summary>
-		void Unload();
-		#endregion
-
-		#region CountTestCases Methods
-		/// <summary>
-		/// Count Test Cases using a filter
-		/// </summary>
-		/// <param name="filter">The filter to apply</param>
-		/// <returns>The number of test cases found</returns>
-		int CountTestCases(ITestFilter filter );
-		#endregion
-
-		#region Run Methods
-
-        /// <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. 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>
-		TestResult EndRun();
-
-		/// <summary>
-		///  Cancel the test run that is in progress. For a synchronous run,
-		///  a client wanting to call this must create a separate run thread.
-		/// </summary>
-		void CancelRun();
-
-		/// <summary>
-		/// Wait for the test run in progress to complete. For a synchronous run,
-		/// a client wanting to call this must create a separate run thread. In
-		/// particular, a gui client calling this method is likely to hang, since
-		/// events will not be able to invoke methods on the gui thread.
-		/// </summary>
-		void Wait();
-		#endregion
-	}
-}
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.IO;
+
+namespace NUnit.Core
+{
+	/// <summary>
+	/// The TestRunner Interface allows client code, such as the NUnit console and
+	/// gui runners, to load and run tests. This is the lowest level interface generally
+	/// supported for running tests and is implemented by the RemoteTestRunner class in
+	/// the NUnit core as well as by other classes running on the client side.
+	/// 
+	/// The Load method is used to load a suite of tests from one or more 
+	/// assemblies, returning a tree of TestNodes to the caller.
+	/// 
+	/// The CountTestCases family of methods returns the number of test cases in the
+	/// loaded suite, either in its entirety or by using a filter to count a subset of tests.
+	/// 
+	/// The Run family of methods performs a test run synchronously, returning a TestResult
+	/// or TestResult[] to the caller. If provided, an EventListener interface will be 
+	/// notified of significant events in the running of the tests. A filter may be used
+    /// to run a subset of the tests.
+    ///
+    /// BeginRun and EndRun provide a simplified form of the asynchronous invocation
+	/// pattern used in many places within the .NET framework. Because the current
+	/// implementation allows only one run to be in process at a time, an IAsyncResult
+	/// is not used at this time.
+    /// 
+    /// Methods to cancel a run and to wait for a run to complete are also provided. The 
+    /// result of the last run may be obtained by querying the TestResult property.
+    /// 
+    /// </summary>
+	public interface TestRunner : IDisposable
+	{
+		#region Properties
+		/// <summary>
+		/// TestRunners are identified by an ID. So long as there
+		/// is only one test runner or a single chain of test runners,
+		/// the default id of 0 may be used. However, any client that
+		/// creates multiple runners must ensure that each one has a
+		/// unique ID in order to locate and run specific tests.
+		/// </summary>
+		int ID
+		{
+			get;
+		}
+
+		/// <summary>
+		/// Running indicates whether a test is in progress. To retrieve the
+		/// results from an asynchronous test run, wait till Running is false.
+		/// </summary>
+		bool Running
+		{
+			get;
+		}
+
+		/// <summary>
+		/// Returns information about loaded assemblies
+		/// </summary>
+		IList AssemblyInfo
+		{
+			get;
+		}
+
+		/// <summary>
+		/// The loaded test, converted to a tree of TestNodes so they can be
+		/// serialized and marshalled to a remote client.
+		/// </summary>
+		ITest Test
+		{
+			get;
+		}
+
+		/// <summary>
+		/// Result of the last test run.
+		/// </summary>
+		TestResult TestResult
+		{
+			get;
+		}
+		#endregion
+
+		#region Load and Unload Methods
+		/// <summary>
+		/// Load the assemblies in a test package
+		/// </summary>
+		/// <param name="package">The test package to be loaded</param>
+		/// <returns>True if the tests were loaded successfully, otherwise false</returns>
+		bool Load( TestPackage package );
+
+		/// <summary>
+		/// Unload all tests previously loaded
+		/// </summary>
+		void Unload();
+		#endregion
+
+		#region CountTestCases Methods
+		/// <summary>
+		/// Count Test Cases using a filter
+		/// </summary>
+		/// <param name="filter">The filter to apply</param>
+		/// <returns>The number of test cases found</returns>
+		int CountTestCases(ITestFilter filter );
+		#endregion
+
+		#region Run Methods
+
+        /// <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. 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>
+		TestResult EndRun();
+
+		/// <summary>
+		///  Cancel the test run that is in progress. For a synchronous run,
+		///  a client wanting to call this must create a separate run thread.
+		/// </summary>
+		void CancelRun();
+
+		/// <summary>
+		/// Wait for the test run in progress to complete. For a synchronous run,
+		/// a client wanting to call this must create a separate run thread. In
+		/// particular, a gui client calling this method is likely to hang, since
+		/// events will not be able to invoke methods on the gui thread.
+		/// </summary>
+		void Wait();
+		#endregion
+	}
+}
+
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.build b/src/NUnitCore/interfaces/nunit.core.interfaces.build
index 92dd02e..118a7c5 100644
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.build
+++ b/src/NUnitCore/interfaces/nunit.core.interfaces.build
@@ -1,79 +1,79 @@
-<?xml version="1.0"?>
-<project name="NUnitCoreInterfaces" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="EventListener.cs"/>
-        <include name="IAgency.cs"/>
-        <include name="IService.cs"/>
-        <include name="ITest.cs"/>
-        <include name="ITestFilter.cs"/>
-    <include name="LoggingThreshold.cs"/>
-        <include name="OSPlatform.cs"/>
-        <include name="PropertyNames.cs"/>
-        <include name="ResultState.cs"/>
-        <include name="RunState.cs"/>
-        <include name="RuntimeFramework.cs"/>
-        <include name="Test.cs"/>
-        <include name="TestAgent.cs"/>
-        <include name="TestAssemblyInfo.cs"/>
-        <include name="TestFilter.cs"/>
-        <include name="TestID.cs"/>
-        <include name="TestInfo.cs"/>
-        <include name="TestName.cs"/>
-        <include name="TestNode.cs"/>
-        <include name="TestOutput.cs"/>
-        <include name="TestPackage.cs"/>
-        <include name="TestResult.cs"/>
-        <include name="TestRunner.cs"/>
-        <include name="Extensibility/Addin.cs"/>
-        <include name="Extensibility/AddinStatus.cs"/>
-        <include name="Extensibility/ExtensionType.cs"/>
-        <include name="Extensibility/IAddin.cs"/>
-        <include name="Extensibility/IAddinRegistry.cs"/>
-        <include name="Extensibility/IDataPointProvider.cs"/>
-        <include name="Extensibility/IExtensionHost.cs"/>
-        <include name="Extensibility/IExtensionPoint.cs"/>
-        <include name="Extensibility/IFrameworkRegistry.cs"/>
-        <include name="Extensibility/ISuiteBuilder.cs"/>
-        <include name="Extensibility/ITestCaseBuilder.cs"/>
-        <include name="Extensibility/ITestCaseProvider.cs"/>
-        <include name="Extensibility/ITestDecorator.cs"/>
-        <include name="Extensibility/NUnitAddinAttribute.cs"/>
-        <include name="Extensibility/ParameterSet.cs"/>
-        <include name="Extensibility/TestFramework.cs"/>
-        <include name="Filters/AndFilter.cs"/>
-        <include name="Filters/CategoryFilter.cs"/>
-        <include name="Filters/NameFilter.cs"/>
-        <include name="Filters/NotFilter.cs"/>
-        <include name="Filters/OrFilter.cs"/>
-        <include name="Filters/SimpleNameFilter.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.lib.dir}/nunit.core.interfaces.dll"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-        <include name="../../NUnitFramework/framework/ITestCaseData.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitCore/interfaces">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit.core.interfaces.dll.csproj"/>
-        <include name="nunit.core.interfaces.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitCoreInterfaces" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="EventListener.cs"/>
+        <include name="IAgency.cs"/>
+        <include name="IService.cs"/>
+        <include name="ITest.cs"/>
+        <include name="ITestFilter.cs"/>
+    <include name="LoggingThreshold.cs"/>
+        <include name="OSPlatform.cs"/>
+        <include name="PropertyNames.cs"/>
+        <include name="ResultState.cs"/>
+        <include name="RunState.cs"/>
+        <include name="RuntimeFramework.cs"/>
+        <include name="Test.cs"/>
+        <include name="TestAgent.cs"/>
+        <include name="TestAssemblyInfo.cs"/>
+        <include name="TestFilter.cs"/>
+        <include name="TestID.cs"/>
+        <include name="TestInfo.cs"/>
+        <include name="TestName.cs"/>
+        <include name="TestNode.cs"/>
+        <include name="TestOutput.cs"/>
+        <include name="TestPackage.cs"/>
+        <include name="TestResult.cs"/>
+        <include name="TestRunner.cs"/>
+        <include name="Extensibility/Addin.cs"/>
+        <include name="Extensibility/AddinStatus.cs"/>
+        <include name="Extensibility/ExtensionType.cs"/>
+        <include name="Extensibility/IAddin.cs"/>
+        <include name="Extensibility/IAddinRegistry.cs"/>
+        <include name="Extensibility/IDataPointProvider.cs"/>
+        <include name="Extensibility/IExtensionHost.cs"/>
+        <include name="Extensibility/IExtensionPoint.cs"/>
+        <include name="Extensibility/IFrameworkRegistry.cs"/>
+        <include name="Extensibility/ISuiteBuilder.cs"/>
+        <include name="Extensibility/ITestCaseBuilder.cs"/>
+        <include name="Extensibility/ITestCaseProvider.cs"/>
+        <include name="Extensibility/ITestDecorator.cs"/>
+        <include name="Extensibility/NUnitAddinAttribute.cs"/>
+        <include name="Extensibility/ParameterSet.cs"/>
+        <include name="Extensibility/TestFramework.cs"/>
+        <include name="Filters/AndFilter.cs"/>
+        <include name="Filters/CategoryFilter.cs"/>
+        <include name="Filters/NameFilter.cs"/>
+        <include name="Filters/NotFilter.cs"/>
+        <include name="Filters/OrFilter.cs"/>
+        <include name="Filters/SimpleNameFilter.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.lib.dir}/nunit.core.interfaces.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+        <include name="../../NUnitFramework/framework/ITestCaseData.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitCore/interfaces">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.core.interfaces.dll.csproj"/>
+        <include name="nunit.core.interfaces.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj b/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
index 6be88d0..8a6ccca 100644
--- a/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
+++ b/src/NUnitCore/interfaces/nunit.core.interfaces.dll.csproj
@@ -1,135 +1,169 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{435428F8-5995-4CE4-8022-93D595A8CC0F}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.core.interfaces</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Core</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;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>
-    <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;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>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="..\..\NUnitFramework\framework\ITestCaseData.cs">
-      <Link>Extensibility\ITestCaseData.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="EventListener.cs" />
-    <Compile Include="Extensibility\Addin.cs" />
-    <Compile Include="Extensibility\AddinStatus.cs" />
-    <Compile Include="Extensibility\ExtensionType.cs" />
-    <Compile Include="Extensibility\IAddin.cs" />
-    <Compile Include="Extensibility\IAddinRegistry.cs" />
-    <Compile Include="Extensibility\IDataPointProvider.cs" />
-    <Compile Include="Extensibility\IExtensionHost.cs" />
-    <Compile Include="Extensibility\IExtensionPoint.cs" />
-    <Compile Include="Extensibility\IFrameworkRegistry.cs" />
-    <Compile Include="Extensibility\ISuiteBuilder.cs" />
-    <Compile Include="Extensibility\ITestCaseBuilder.cs" />
-    <Compile Include="Extensibility\ITestCaseProvider.cs" />
-    <Compile Include="Extensibility\ITestDecorator.cs" />
-    <Compile Include="Extensibility\NUnitAddinAttribute.cs" />
-    <Compile Include="Extensibility\ParameterSet.cs" />
-    <Compile Include="Extensibility\TestFramework.cs" />
-    <Compile Include="Filters\AndFilter.cs" />
-    <Compile Include="Filters\CategoryFilter.cs" />
-    <Compile Include="Filters\NameFilter.cs" />
-    <Compile Include="Filters\NotFilter.cs" />
-    <Compile Include="Filters\OrFilter.cs" />
-    <Compile Include="Filters\SimpleNameFilter.cs" />
-    <Compile Include="IAgency.cs" />
-    <Compile Include="IService.cs" />
-    <Compile Include="ITest.cs" />
-    <Compile Include="ITestFilter.cs" />
-    <Compile Include="OSPlatform.cs" />
-    <Compile Include="PropertyNames.cs" />
-    <Compile Include="ResultState.cs" />
-    <Compile Include="RunState.cs" />
-    <Compile Include="RuntimeFramework.cs" />
-    <Compile Include="Test.cs" />
-    <Compile Include="TestAgent.cs" />
-    <Compile Include="TestAssemblyInfo.cs" />
-    <Compile Include="TestFilter.cs" />
-    <Compile Include="TestID.cs" />
-    <Compile Include="TestInfo.cs" />
-    <Compile Include="TestName.cs" />
-    <Compile Include="TestNode.cs" />
-    <Compile Include="TestOutput.cs" />
-    <Compile Include="TestPackage.cs" />
-    <Compile Include="TestResult.cs" />
-    <Compile Include="TestRunner.cs" />
-    <Compile Include="LoggingThreshold.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.core.interfaces.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{435428F8-5995-4CE4-8022-93D595A8CC0F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.core.interfaces</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Core</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <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>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\lib\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <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>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\NUnitFramework\framework\ITestCaseData.cs">
+      <Link>Extensibility\ITestCaseData.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="EventListener.cs" />
+    <Compile Include="Extensibility\Addin.cs" />
+    <Compile Include="Extensibility\AddinStatus.cs" />
+    <Compile Include="Extensibility\ExtensionType.cs" />
+    <Compile Include="Extensibility\IAddin.cs" />
+    <Compile Include="Extensibility\IAddinRegistry.cs" />
+    <Compile Include="Extensibility\IDataPointProvider.cs" />
+    <Compile Include="Extensibility\IExtensionHost.cs" />
+    <Compile Include="Extensibility\IExtensionPoint.cs" />
+    <Compile Include="Extensibility\IFrameworkRegistry.cs" />
+    <Compile Include="Extensibility\ISuiteBuilder.cs" />
+    <Compile Include="Extensibility\ITestCaseBuilder.cs" />
+    <Compile Include="Extensibility\ITestCaseProvider.cs" />
+    <Compile Include="Extensibility\ITestDecorator.cs" />
+    <Compile Include="Extensibility\NUnitAddinAttribute.cs" />
+    <Compile Include="Extensibility\ParameterSet.cs" />
+    <Compile Include="Extensibility\TestFramework.cs" />
+    <Compile Include="Filters\AndFilter.cs" />
+    <Compile Include="Filters\CategoryFilter.cs" />
+    <Compile Include="Filters\NameFilter.cs" />
+    <Compile Include="Filters\NotFilter.cs" />
+    <Compile Include="Filters\OrFilter.cs" />
+    <Compile Include="Filters\SimpleNameFilter.cs" />
+    <Compile Include="IAgency.cs" />
+    <Compile Include="IService.cs" />
+    <Compile Include="ITest.cs" />
+    <Compile Include="ITestFilter.cs" />
+    <Compile Include="OSPlatform.cs" />
+    <Compile Include="PropertyNames.cs" />
+    <Compile Include="ResultState.cs" />
+    <Compile Include="RunState.cs" />
+    <Compile Include="RuntimeFramework.cs" />
+    <Compile Include="Test.cs" />
+    <Compile Include="TestAgent.cs" />
+    <Compile Include="TestAssemblyInfo.cs" />
+    <Compile Include="TestFilter.cs" />
+    <Compile Include="TestID.cs" />
+    <Compile Include="TestInfo.cs" />
+    <Compile Include="TestName.cs" />
+    <Compile Include="TestNode.cs" />
+    <Compile Include="TestOutput.cs" />
+    <Compile Include="TestPackage.cs" />
+    <Compile Include="TestResult.cs" />
+    <Compile Include="TestRunner.cs" />
+    <Compile Include="LoggingThreshold.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.interfaces.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitCore/interfaces/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitCore/interfaces/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..3bc48c4
Binary files /dev/null and b/src/NUnitCore/interfaces/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.dll.csproj.FileListAbsolute.txt b/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.dll.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..eed1160
--- /dev/null
+++ b/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.dll.csproj.FileListAbsolute.txt
@@ -0,0 +1,6 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit.core.interfaces.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit.core.interfaces.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitCore\interfaces\obj\Debug\nunit.core.interfaces.dll
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitCore\interfaces\obj\Debug\nunit.core.interfaces.pdb
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\lib\nunit.core.interfaces.xml
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitCore\interfaces\obj\Debug\nunit.core.interfaces.dll.csprojResolveAssemblyReference.cache
diff --git a/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.dll.csprojResolveAssemblyReference.cache b/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.dll.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..68f71b1
Binary files /dev/null and b/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.dll.csprojResolveAssemblyReference.cache differ
diff --git a/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.pdb b/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.pdb
new file mode 100644
index 0000000..a7a71a4
Binary files /dev/null and b/src/NUnitCore/interfaces/obj/Debug/nunit.core.interfaces.pdb differ
diff --git a/src/NUnitCore/tests-net45/NUnitAsyncTestMethodTests.cs b/src/NUnitCore/tests-net45/NUnitAsyncTestMethodTests.cs
new file mode 100644
index 0000000..e1fc7c9
--- /dev/null
+++ b/src/NUnitCore/tests-net45/NUnitAsyncTestMethodTests.cs
@@ -0,0 +1,111 @@
+#if NET_3_5 || NET_4_0 || NET_4_5
+using System;
+using System.Collections;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Threading;
+using NUnit.Core;
+using NUnit.Core.Builders;
+using NUnit.Framework;
+using test_assembly_net45;
+
+namespace nunit.core.tests.net45
+{
+	[TestFixture]
+	public class NUnitAsyncTestMethodTests
+	{
+		private NUnitTestCaseBuilder _builder;
+
+		[SetUp]
+		public void Setup()
+		{
+			_builder = new NUnitTestCaseBuilder();
+		}
+
+		public IEnumerable TestCases
+		{
+			get
+			{
+				yield return new object[] { Method(f => f.VoidTestSuccess()), ResultState.Success, 1 };
+				yield return new object[] { Method(f => f.VoidTestFailure()), ResultState.Failure, 1 };
+				yield return new object[] { Method(f => f.VoidTestError()), ResultState.Error, 0 };
+				yield return new object[] { Method(f => f.VoidTestExpectedException()), ResultState.Success, 0 };
+
+				yield return new object[] { Method(f => f.TaskTestSuccess()), ResultState.Success, 1 };
+				yield return new object[] { Method(f => f.TaskTestFailure()), ResultState.Failure, 1 };
+				yield return new object[] { Method(f => f.TaskTestError()), ResultState.Error, 0 };
+				yield return new object[] { Method(f => f.TaskTestExpectedException()), ResultState.Success, 0 };
+
+				yield return new object[] { Method(f => f.TaskTTestCaseWithResultCheckSuccess()), ResultState.Success, 0 };
+				yield return new object[] { Method(f => f.TaskTTestCaseWithResultCheckFailure()), ResultState.Failure, 0 };
+				yield return new object[] { Method(f => f.TaskTTestCaseWithResultCheckError()), ResultState.Failure, 0 };
+				yield return new object[] { Method(f => f.TaskTTestCaseWithResultCheckSuccessReturningNull()), ResultState.Success, 0 };
+				yield return new object[] { Method(f => f.TaskTTestCaseWithoutResultCheckExpectedExceptionSuccess()), ResultState.Success, 0 };
+
+				yield return new object[] { Method(f => f.NestedVoidTestSuccess()), ResultState.Success, 1 };
+				yield return new object[] { Method(f => f.NestedVoidTestFailure()), ResultState.Failure, 1 };
+				yield return new object[] { Method(f => f.NestedVoidTestError()), ResultState.Error, 0 };
+
+				yield return new object[] { Method(f => f.NestedTaskTestSuccess()), ResultState.Success, 1 };
+				yield return new object[] { Method(f => f.NestedTaskTestFailure()), ResultState.Failure, 1 };
+				yield return new object[] { Method(f => f.NestedTaskTestError()), ResultState.Error, 0 };
+
+				yield return new object[] { Method(f => f.VoidTestMultipleSuccess()), ResultState.Success, 1 };
+				yield return new object[] { Method(f => f.VoidTestMultipleFailure()), ResultState.Failure, 1 };
+				yield return new object[] { Method(f => f.VoidTestMultipleError()), ResultState.Error, 0 };
+
+				yield return new object[] { Method(f => f.TaskTestMultipleSuccess()), ResultState.Success, 1 };
+				yield return new object[] { Method(f => f.TaskTestMultipleFailure()), ResultState.Failure, 1 };
+				yield return new object[] { Method(f => f.TaskTestMultipleError()), ResultState.Error, 0 };
+
+				yield return new object[] { Method(f => f.VoidCheckTestContextAcrossTasks()), ResultState.Success, 2 };
+				yield return new object[] { Method(f => f.VoidCheckTestContextWithinTestBody()), ResultState.Success, 2 };
+				yield return new object[] { Method(f => f.TaskCheckTestContextAcrossTasks()), ResultState.Success, 2 };
+				yield return new object[] { Method(f => f.TaskCheckTestContextWithinTestBody()), ResultState.Success, 2 };
+
+				yield return new object[] { Method(f => f.VoidAsyncVoidChildCompletingEarlierThanTest()), ResultState.Success, 0 };
+				yield return new object[] { Method(f => f.VoidAsyncVoidChildThrowingImmediately()), ResultState.Success, 0 };
+			}
+		}
+
+		[Test]
+		[TestCaseSource("TestCases")]
+		public void RunTests(MethodInfo testMethod, ResultState resultState, int assertionCount)
+		{
+			var method = _builder.BuildFrom(testMethod);
+
+			var result = method.Run(new NullListener(), TestFilter.Empty);
+
+			Assert.That(result.Executed, Is.True, "Was not executed");
+			Assert.That(result.ResultState, Is.EqualTo(resultState), "Wrong result state");
+			Assert.That(result.AssertCount, Is.EqualTo(assertionCount), "Wrong assertion count");
+		}
+
+		[Test]
+		public void SynchronizationContextSwitching()
+		{
+			var context = new CustomSynchronizationContext();
+
+			SynchronizationContext.SetSynchronizationContext(context);
+
+			var method = _builder.BuildFrom(Method(f => f.Yield()));
+
+			var result = method.Run(new NullListener(), TestFilter.Empty);
+
+			Assert.AreSame(context, SynchronizationContext.Current);
+			Assert.That(result.Executed, Is.True, "Was not executed");
+			Assert.That(result.ResultState, Is.EqualTo(ResultState.Success), "Wrong result state");
+			Assert.That(result.AssertCount, Is.EqualTo(0), "Wrong assertion count");
+		}
+
+		private static MethodInfo Method(Expression<Action<AsyncRealFixture>> action)
+		{
+			return ((MethodCallExpression)action.Body).Method;
+		}
+
+		public class CustomSynchronizationContext : SynchronizationContext
+		{
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests-net45/NUnitTestCaseBuilderTests.cs b/src/NUnitCore/tests-net45/NUnitTestCaseBuilderTests.cs
new file mode 100644
index 0000000..7f2d087
--- /dev/null
+++ b/src/NUnitCore/tests-net45/NUnitTestCaseBuilderTests.cs
@@ -0,0 +1,93 @@
+#if NET_3_5 || NET_4_0 || NET_4_5
+using System;
+using System.Collections;
+using System.Linq.Expressions;
+using System.Reflection;
+using NUnit.Core;
+using NUnit.Core.Builders;
+using NUnit.Framework;
+using test_assembly_net45;
+
+namespace nunit.core.tests.net45
+{
+	[TestFixture]
+	public class NUnitTestCaseBuilderTests
+	{
+		private NUnitTestCaseBuilder _sut;
+
+		[SetUp]
+		public void Setup()
+		{
+			_sut = new NUnitTestCaseBuilder();
+		}
+
+		public IEnumerable AsyncTestsSource
+		{
+			get
+			{
+				yield return new object[] { Method(f => f.AsyncVoidTest()), RunState.Runnable };
+				yield return new object[] { Method(f => f.AsyncTaskTest()), RunState.Runnable };
+				yield return new object[] { Method(f => f.AsyncTaskTTest()), RunState.NotRunnable };
+			}
+		}
+
+		public IEnumerable AsyncTestCasesSource
+		{
+			get
+			{
+				yield return new object[] { Method(f => f.AsyncVoidTestCaseWithResultCheck()), RunState.NotRunnable };
+				yield return new object[] { Method(f => f.AsyncTaskTestCaseWithResultCheck()), RunState.NotRunnable };
+				yield return new object[] { Method(f => f.AsyncTaskTTestCaseWithResultCheck()), RunState.Runnable };
+				yield return new object[] { Method(f => f.AsyncVoidTestCaseWithoutResultCheck()), RunState.Runnable };
+				yield return new object[] { Method(f => f.AsyncTaskTestCaseWithoutResultCheck()), RunState.Runnable };
+				yield return new object[] { Method(f => f.AsyncTaskTTestCaseWithoutResultCheck()), RunState.NotRunnable };
+				yield return new object[] { Method(f => f.AsyncTaskTTestCaseExpectedExceptionWithoutResultCheck()), RunState.Runnable };
+			}
+		}
+
+		[TestCaseSource("AsyncTestsSource")]
+		public void AsyncTests(MethodInfo method, RunState state)
+		{
+			var built = _sut.BuildFrom(method);
+
+			Assert.That(built, Is.InstanceOf<NUnitAsyncTestMethod>());
+			Assert.That(built.RunState, Is.EqualTo(state));
+		}
+
+		[TestCaseSource("AsyncTestCasesSource")]
+		public void AsyncTestCases(MethodInfo method, RunState state)
+		{
+			var built = _sut.BuildFrom(method);
+
+			var testMethod = built.Tests[0] as NUnitAsyncTestMethod;
+
+			Assert.IsNotNull(testMethod);
+
+			Assert.That(testMethod.RunState, Is.EqualTo(state));
+		}
+
+		[Test]
+		public void Non_async_task()
+		{
+			var built = _sut.BuildFrom(Method(f => f.NonAsyncTask()));
+
+			Assert.That(built, Is.Not.InstanceOf<NUnitAsyncTestMethod>());
+			Assert.That(built.RunState, Is.EqualTo(RunState.NotRunnable));
+		}
+
+		[Test]
+		public void Non_async_task_with_result()
+		{
+			var built = _sut.BuildFrom(Method(f => f.NonAsyncTaskWithResult()));
+
+			Assert.That(built, Is.Not.InstanceOf<NUnitAsyncTestMethod>());
+			Assert.That(built.RunState, Is.EqualTo(RunState.NotRunnable));
+		}
+
+		private static MethodInfo Method(Expression<Action<AsyncDummyFixture>> action)
+		{
+			return ((MethodCallExpression) action.Body).Method;
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests-net45/nunit.core.tests.net45.build b/src/NUnitCore/tests-net45/nunit.core.tests.net45.build
new file mode 100644
index 0000000..a5523ef
--- /dev/null
+++ b/src/NUnitCore/tests-net45/nunit.core.tests.net45.build
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<project name="NUnitCoreTestsNet45" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="NUnitTestCaseBuilderTests.cs"/>
+    <include name="NUnitAsyncTestMethodTests.cs"/>
+  </patternset>
+
+  <target name="build" if ="${runtime.version >= '2.0'}">
+
+    <echo message=".NET 4.5 is not installed - skipping nunit.core.tests.net45"
+	unless="${framework::exists('net-4.5')}"/>
+
+    <if test="${framework::exists('net-4.5')}">
+
+      <property name="previousFramework" value="${nant.settings.currentframework}"/>
+      <property name="nant.settings.currentframework" value="net-4.5"/>
+
+      <csc target="library" 
+         output="${current.test.dir}/nunit.core.tests.net45.dll"
+         debug="${build.debug}" 
+         define="${build.defines}">
+        <nowarn>
+          <warning number="618,672"/>
+        </nowarn>
+        <sources>
+          <patternset refid="source-files"/>
+          <include name="../../GeneratedAssemblyInfo.cs"/>
+        </sources>
+        <resources prefix="NUnit.Core.Tests.45">
+          <include name="Results.xsd"/>
+         </resources>
+        <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.test.dir}/test-assembly-net45.dll"/>
+        </references>
+      </csc>
+
+      <property name="nant.settings.currentframework" value="${previousFramework}"/>
+
+    </if>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitCore/tests-net45">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.core.tests.net45.csproj"/>
+        <include name="nunit.core.tests.net45.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/NUnitCore/tests-net45/nunit.core.tests.net45.csproj b/src/NUnitCore/tests-net45/nunit.core.tests.net45.csproj
new file mode 100644
index 0000000..87c89a8
--- /dev/null
+++ b/src/NUnitCore/tests-net45/nunit.core.tests.net45.csproj
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{689A54F0-2B54-4D15-96A7-D8B6E6FE32B1}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>nunit.core.tests.net45</RootNamespace>
+    <AssemblyName>nunit.core.tests.45</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </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_4_0,NET_4_5,CS_5_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <DefineConstants>TRACE;CLR_4_0,NET_4_5,CS_5_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="NUnitAsyncTestMethodTests.cs" />
+    <Compile Include="NUnitTestCaseBuilderTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.tests.net45.build">
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </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-assembly-net45\test-assembly-net45.csproj">
+      <Project>{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}</Project>
+      <Name>test-assembly-net45</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
+      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
+      <Name>test-assembly</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\core\nunit.core.dll.csproj">
+      <Project>{ebd43a7f-afca-4281-bb53-5cdd91f966a3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428f8-5995-4ce4-8022-93d595a8cc0f}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+  </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/NUnitCore/tests/ActionAttributeExceptionTests.cs b/src/NUnitCore/tests/ActionAttributeExceptionTests.cs
index bca8e09..d98a286 100644
--- a/src/NUnitCore/tests/ActionAttributeExceptionTests.cs
+++ b/src/NUnitCore/tests/ActionAttributeExceptionTests.cs
@@ -1,79 +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
+// ****************************************************************
+// 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
index ba10b4d..583d52c 100644
--- a/src/NUnitCore/tests/ActionAttributeTests.cs
+++ b/src/NUnitCore/tests/ActionAttributeTests.cs
@@ -1,190 +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);
-        }
-    }
-}
+// ****************************************************************
+// 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/AllTests.cs b/src/NUnitCore/tests/AllTests.cs
index f0e4724..0cc8c9b 100644
--- a/src/NUnitCore/tests/AllTests.cs
+++ b/src/NUnitCore/tests/AllTests.cs
@@ -1,29 +1,29 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.TestData;
-
-namespace NUnit.Core.Tests
-{
-	public class AllTests
-	{
-		[Suite]
-		public static TestSuite Suite
-		{
-			get 
-			{
-				TestSuite suite = new TestSuite("All Tests");
-				suite.Add( new OneTestCase() );
-				suite.Add( new AssemblyTests() );
-				suite.Add( new NoNamespaceTestFixture() );
-				return suite;
-			}
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	public class AllTests
+	{
+		[Suite]
+		public static TestSuite Suite
+		{
+			get 
+			{
+				TestSuite suite = new TestSuite("All Tests");
+				suite.Add( new OneTestCase() );
+				suite.Add( new AssemblyTests() );
+				suite.Add( new NoNamespaceTestFixture() );
+				return suite;
+			}
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/AssemblyHelperTests.cs b/src/NUnitCore/tests/AssemblyHelperTests.cs
index 04bccf6..a27d081 100644
--- a/src/NUnitCore/tests/AssemblyHelperTests.cs
+++ b/src/NUnitCore/tests/AssemblyHelperTests.cs
@@ -1,63 +1,88 @@
-// ****************************************************************
-// 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;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class AssemblyHelperTests
-    {
-        [Test]
-        public void GetPathForAssembly()
-        {
-            string path = AssemblyHelper.GetAssemblyPath(this.GetType().Assembly);
-            Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
-            Assert.That(File.Exists(path));
-        }
-
-        [Test]
-        public void GetPathForType()
-        {
-            string path = AssemblyHelper.GetAssemblyPath(this.GetType());
-            Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
-            Assert.That(File.Exists(path));
-        }
-		
-		[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);
-        }
-}
-}
+// ****************************************************************
+// 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 System.Reflection;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class AssemblyHelperTests
+    {
+        [Test]
+        public void GetPathForAssembly()
+        {
+            string path = AssemblyHelper.GetAssemblyPath(this.GetType().Assembly);
+            Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
+            Assert.That(File.Exists(path));
+        }
+
+        [Test]
+        public void GetPathForType()
+        {
+            string path = AssemblyHelper.GetAssemblyPath(this.GetType());
+            Assert.That(Path.GetFileName(path), Is.EqualTo("nunit.core.tests.dll").IgnoreCase);
+            Assert.That(File.Exists(path));
+        }
+		
+        // The following tests are only useful to the extent that the test cases
+        // match what will actually be provided to the method in production.
+        // As currently used, NUnit's codebase can only use the file: schema,
+        // since we don't load assemblies from anything but files. The uri's
+        // provided can be absolute file paths or UNC paths.
+
+#if CLR_2_0 || CLR_4_0
+        [Platform("Win")]
+        [TestCase(@"file:///C:/path/to/assembly.dll", @"C:\path\to\assembly.dll")]
+        [TestCase(@"file://C:/path/to/assembly.dll", @"C:\path\to\assembly.dll")]
+        [TestCase(@"file://C:/my%20path/to%20my/assembly.dll", @"C:\my path\to my\assembly.dll")]
+        [TestCase(@"file:///C:/dev/C%23/assembly.dll", @"C:\dev\C#\assembly.dll")]
+        [TestCase(@"file:///C:/dev/funnychars?:=/assembly.dll", @"C:\dev\funnychars?:=\assembly.dll")]
+        [TestCase(@"file:///path/to/assembly.dll", @"/path/to/assembly.dll")]
+        [TestCase(@"file://server/path/to/assembly.dll", @"\\server\path\to\assembly.dll")]
+        [TestCase(@"file:///my%20path/to%20my/assembly.dll", @"/my path/to my/assembly.dll")]
+        [TestCase(@"file:///dev/C%23/assembly.dll", @"/dev/C#/assembly.dll")]
+        [TestCase(@"file:///dev/funnychars?:=/assembly.dll", @"/dev/funnychars?:=/assembly.dll")]
+        public void GetAssemblyPathFromEscapedCodeBase_Windows(string uri, string expectedPath)
+        {
+            string localPath = AssemblyHelper.GetAssemblyPathFromEscapedCodeBase(uri);
+            Assert.That(localPath, Is.SamePath(expectedPath));
+        }
+
+        [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 GetAssemblyPathFromEscapedCodeBase_Linux(string uri)
+        {
+            return AssemblyHelper.GetAssemblyPathFromEscapedCodeBase(uri);
+        }
+#else
+        [Platform("Win")]
+        [TestCase(@"file:///C:/path/to/assembly.dll", @"C:\path\to\assembly.dll")]
+        [TestCase(@"file://C:/path/to/assembly.dll", @"C:\path\to\assembly.dll")]
+        [TestCase(@"file://C:/my path/to my/assembly.dll", @"C:\my path\to my\assembly.dll")]
+        [TestCase(@"file:///C:/dev/C#/assembly.dll", @"C:\dev\C#\assembly.dll")]
+        [TestCase(@"file:///C:/dev/funnychars?:=/assembly.dll", @"C:\dev\funnychars?:=\assembly.dll")]
+        [TestCase(@"file:///path/to/assembly.dll", @"/path/to/assembly.dll")]
+        [TestCase(@"file://server/path/to/assembly.dll", @"\\server\path\to\assembly.dll")]
+        [TestCase(@"file:///my path/to my/assembly.dll", @"/my path/to my/assembly.dll")]
+        [TestCase(@"file:///dev/C#/assembly.dll", @"/dev/C#/assembly.dll")]
+        [TestCase(@"file:///dev/funnychars?:=/assembly.dll", @"/dev/funnychars?:=/assembly.dll")]
+        public void GetAssemblyPathFromCodeBase_Windows(string uri, string expectedPath)
+        {
+            string localPath = AssemblyHelper.GetAssemblyPathFromCodeBase(uri);
+            Assert.That(localPath, Is.SamePath(expectedPath));
+        }
+#endif
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitCore/tests/AssemblyReaderTests.cs b/src/NUnitCore/tests/AssemblyReaderTests.cs
index 2e74fb5..4bed0e6 100644
--- a/src/NUnitCore/tests/AssemblyReaderTests.cs
+++ b/src/NUnitCore/tests/AssemblyReaderTests.cs
@@ -1,77 +1,77 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-using System.IO;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class AssemblyReaderTests
-	{
-		private AssemblyReader rdr;
-
-		[SetUp]
-		public void CreateReader()
-		{
-			rdr = new AssemblyReader( this.GetType().Assembly );
-		}
-
-		[TearDown]
-		public void DisposeReader()
-		{
-			if ( rdr != null )
-				rdr.Dispose();
-
-			rdr = null;
-		}
-
-		[Test]
-		public void CreateFromPath()
-		{
-            string path = AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly.GetAssembly(GetType()));
-            Assert.AreEqual(path, new AssemblyReader(path).AssemblyPath);
-		}
-
-		[Test]
-		public void CreateFromAssembly()
-		{
-            string path = AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly.GetAssembly(GetType()));
-            Assert.AreEqual(path, rdr.AssemblyPath);
-		}
-
-		[Test]
-		public void IsValidPeFile()
-		{
-			Assert.IsTrue( rdr.IsValidPeFile );
-		}
-
-		[Test]
-		public void IsValidPeFile_Fails()
-		{
-			string configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
-			Assert.IsFalse( new AssemblyReader( configFile ).IsValidPeFile );
-		}
-
-		[Test]
-		public void IsDotNetFile()
-		{
-			Assert.IsTrue( rdr.IsDotNetFile );
-		}
-
-		[Test]
-		public void ImageRuntimeVersion()
-		{
-			string runtimeVersion = rdr.ImageRuntimeVersion;
-
-			StringAssert.StartsWith( "v", runtimeVersion );
-			new Version( runtimeVersion.Substring( 1 ) );
-			// This fails when we force running under a prior version
-			// Assert.LessOrEqual( version, Environment.Version );
-		}
-
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+using System.IO;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class AssemblyReaderTests
+	{
+		private AssemblyReader rdr;
+
+		[SetUp]
+		public void CreateReader()
+		{
+			rdr = new AssemblyReader( this.GetType().Assembly );
+		}
+
+		[TearDown]
+		public void DisposeReader()
+		{
+			if ( rdr != null )
+				rdr.Dispose();
+
+			rdr = null;
+		}
+
+		[Test]
+		public void CreateFromPath()
+		{
+            string path = AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly.GetAssembly(GetType()));
+            Assert.AreEqual(path, new AssemblyReader(path).AssemblyPath);
+		}
+
+		[Test]
+		public void CreateFromAssembly()
+		{
+            string path = AssemblyHelper.GetAssemblyPath(System.Reflection.Assembly.GetAssembly(GetType()));
+            Assert.AreEqual(path, rdr.AssemblyPath);
+		}
+
+		[Test]
+		public void IsValidPeFile()
+		{
+			Assert.IsTrue( rdr.IsValidPeFile );
+		}
+
+		[Test]
+		public void IsValidPeFile_Fails()
+		{
+			string configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
+			Assert.IsFalse( new AssemblyReader( configFile ).IsValidPeFile );
+		}
+
+		[Test]
+		public void IsDotNetFile()
+		{
+			Assert.IsTrue( rdr.IsDotNetFile );
+		}
+
+		[Test]
+		public void ImageRuntimeVersion()
+		{
+			string runtimeVersion = rdr.ImageRuntimeVersion;
+
+			StringAssert.StartsWith( "v", runtimeVersion );
+			new Version( runtimeVersion.Substring( 1 ) );
+			// This fails when we force running under a prior version
+			// Assert.LessOrEqual( version, Environment.Version );
+		}
+
+	}
+}
diff --git a/src/NUnitCore/tests/AssemblyResolverTests.cs b/src/NUnitCore/tests/AssemblyResolverTests.cs
index bf92b04..c82d64a 100644
--- a/src/NUnitCore/tests/AssemblyResolverTests.cs
+++ b/src/NUnitCore/tests/AssemblyResolverTests.cs
@@ -1,58 +1,58 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-namespace NUnit.Core.Tests
-{
-	using System;
-	using NUnit.Framework;
-	using System.IO;
-
-	[TestFixture]
-	public class AssemblyResolverTests
-	{
-		string appBasePath;
-
-		[TestFixtureSetUp]
-		public void TestFixtureSetUp()
-		{
-			this.appBasePath = Environment.ExpandEnvironmentVariables(@"%temp%\AssemblyResolver");
-			if (Directory.Exists(this.appBasePath))
-			{
-				Directory.Delete(this.appBasePath, true);
-			}
-			Directory.CreateDirectory(this.appBasePath);
-		}
-
-
-		[TestFixtureTearDown]
-		public void TestFixtureTearDown()
-		{
-			Directory.Delete(this.appBasePath, true);
-		}
-
-		[Test]
-		public void AddFile()
-		{
-			AppDomain domain = null;
-			try
-			{
-				domain = AppDomain.CreateDomain("AssemblyResolver", null, this.appBasePath, null, false);
-				AssemblyResolver assemblyResolver = (AssemblyResolver)domain.CreateInstanceFromAndUnwrap(typeof(AssemblyResolver).Assembly.CodeBase, typeof(AssemblyResolver).FullName);
-				using (assemblyResolver)
-				{
-					Type type = typeof(TestAttribute);
-					// ensure that assembly containing type can be found
-					assemblyResolver.AddFile(type.Assembly.CodeBase);
-					domain.CreateInstance(type.Assembly.FullName, type.FullName);
-				}
-			}
-			finally
-			{
-				AppDomain.Unload(domain);
-			}
-
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+namespace NUnit.Core.Tests
+{
+	using System;
+	using NUnit.Framework;
+	using System.IO;
+
+	[TestFixture]
+	public class AssemblyResolverTests
+	{
+		string appBasePath;
+
+		[TestFixtureSetUp]
+		public void TestFixtureSetUp()
+		{
+			this.appBasePath = Environment.ExpandEnvironmentVariables(@"%temp%\AssemblyResolver");
+			if (Directory.Exists(this.appBasePath))
+			{
+				Directory.Delete(this.appBasePath, true);
+			}
+			Directory.CreateDirectory(this.appBasePath);
+		}
+
+
+		[TestFixtureTearDown]
+		public void TestFixtureTearDown()
+		{
+			Directory.Delete(this.appBasePath, true);
+		}
+
+		[Test]
+		public void AddFile()
+		{
+			AppDomain domain = null;
+			try
+			{
+				domain = AppDomain.CreateDomain("AssemblyResolver", null, this.appBasePath, null, false);
+				AssemblyResolver assemblyResolver = (AssemblyResolver)domain.CreateInstanceFromAndUnwrap(typeof(AssemblyResolver).Assembly.CodeBase, typeof(AssemblyResolver).FullName);
+				using (assemblyResolver)
+				{
+					Type type = typeof(TestAttribute);
+					// ensure that assembly containing type can be found
+					assemblyResolver.AddFile(type.Assembly.CodeBase);
+					domain.CreateInstance(type.Assembly.FullName, type.FullName);
+				}
+			}
+			finally
+			{
+				AppDomain.Unload(domain);
+			}
+
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/AssemblyTests.cs b/src/NUnitCore/tests/AssemblyTests.cs
index a0c51fa..7b8f164 100644
--- a/src/NUnitCore/tests/AssemblyTests.cs
+++ b/src/NUnitCore/tests/AssemblyTests.cs
@@ -1,91 +1,91 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core.Tests
-{
-	using System;
-	using System.Configuration;
-	using System.Diagnostics;
-	using System.IO;
-	using System.Reflection;
-	using System.Reflection.Emit;
-	using System.Threading;
-	using NUnit.Framework;
-
-	[TestFixture]
-	public class AssemblyTests 
-	{
-        private string thisDll;
-	    private string noTestFixturesDll;
-
-		[SetUp]
-		public void InitStrings()
-		{
-            thisDll = AssemblyHelper.GetAssemblyPath(this.GetType());
-            noTestFixturesDll = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestUtilities.TestBuilder));
-		}
-
-		// TODO: Review and remove unnecessary tests
-
-		[Test]
-		public void RunSetsCurrentDirectory()
-		{
-			Assert.IsTrue( File.Exists( thisDll ), "Run does not set current directory" );
-		}
-
-        //[Test]
-        //public void NUnitTraceIsEnabled()
-        //{
-        //    Assert.IsNotNull( Trace.Listeners["NUnit"] );
-        //}
-
-		[Test]
-		public void LoadAssembly()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( thisDll ) );
-            Assert.IsNotNull(suite, "Unable to load " + thisDll);
-			Assert.IsTrue( File.Exists( thisDll ), "Load does not set current Directory" );
-		}
-
-		[Test]
-		[ExpectedException(typeof(FileNotFoundException))]
-		public void LoadAssemblyNotFound()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			builder.Build( new TestPackage( "/XXXX.dll" ) );
-		}
-
-		[Test]
-		public void LoadAssemblyWithoutTestFixtures()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( noTestFixturesDll ) );
-            Assert.IsNotNull(suite, "Unable to load " + noTestFixturesDll);
-            Assert.AreEqual(RunState.Runnable, suite.RunState);
-			Assert.AreEqual( 0, suite.Tests.Count );
-		}
-
-		[Test]
-		public void LoadTestFixtureFromAssembly()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			TestPackage package = new TestPackage( thisDll );
-			package.TestName = this.GetType().FullName;
-			Test suite= builder.Build( package );
-			Assert.IsNotNull(suite, "Should not be Null");
-		}
-
-		[Test]
-		public void AppSettingsLoaded()
-		{
-			string configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
-			Assert.IsTrue( File.Exists( configFile ), string.Format( "{0} does not exist", configFile ) );
-			Assert.IsNull(ConfigurationSettings.AppSettings["tooltip.ShowAlways"]);
-			Assert.AreEqual("54321",ConfigurationSettings.AppSettings["test.setting"]);
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core.Tests
+{
+	using System;
+	using System.Configuration;
+	using System.Diagnostics;
+	using System.IO;
+	using System.Reflection;
+	using System.Reflection.Emit;
+	using System.Threading;
+	using NUnit.Framework;
+
+	[TestFixture]
+	public class AssemblyTests 
+	{
+        private string thisDll;
+	    private string noTestFixturesDll;
+
+		[SetUp]
+		public void InitStrings()
+		{
+            thisDll = AssemblyHelper.GetAssemblyPath(this.GetType());
+            noTestFixturesDll = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestUtilities.TestBuilder));
+		}
+
+		// TODO: Review and remove unnecessary tests
+
+		[Test]
+		public void RunSetsCurrentDirectory()
+		{
+			Assert.IsTrue( File.Exists( thisDll ), "Run does not set current directory" );
+		}
+
+        //[Test]
+        //public void NUnitTraceIsEnabled()
+        //{
+        //    Assert.IsNotNull( Trace.Listeners["NUnit"] );
+        //}
+
+		[Test]
+		public void LoadAssembly()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( thisDll ) );
+            Assert.IsNotNull(suite, "Unable to load " + thisDll);
+			Assert.IsTrue( File.Exists( thisDll ), "Load does not set current Directory" );
+		}
+
+		[Test]
+		[ExpectedException(typeof(FileNotFoundException))]
+		public void LoadAssemblyNotFound()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			builder.Build( new TestPackage( "/XXXX.dll" ) );
+		}
+
+		[Test]
+		public void LoadAssemblyWithoutTestFixtures()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( noTestFixturesDll ) );
+            Assert.IsNotNull(suite, "Unable to load " + noTestFixturesDll);
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+			Assert.AreEqual( 0, suite.Tests.Count );
+		}
+
+		[Test]
+		public void LoadTestFixtureFromAssembly()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			TestPackage package = new TestPackage( thisDll );
+			package.TestName = this.GetType().FullName;
+			Test suite= builder.Build( package );
+			Assert.IsNotNull(suite, "Should not be Null");
+		}
+
+		[Test]
+		public void AppSettingsLoaded()
+		{
+			string configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
+			Assert.IsTrue( File.Exists( configFile ), string.Format( "{0} does not exist", configFile ) );
+			Assert.IsNull(ConfigurationSettings.AppSettings["tooltip.ShowAlways"]);
+			Assert.AreEqual("54321",ConfigurationSettings.AppSettings["test.setting"]);
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/AssemblyVersionFixture.cs b/src/NUnitCore/tests/AssemblyVersionFixture.cs
index 56160af..f7fba45 100644
--- a/src/NUnitCore/tests/AssemblyVersionFixture.cs
+++ b/src/NUnitCore/tests/AssemblyVersionFixture.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using System.Threading;
-using System.Reflection.Emit;
-
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class AssemblyVersionFixture
-	{
-		[Test]
-        // TODO: Figure out what we're testing here! Was there a bug?
-		public void Version()
-		{
-			Version version = new Version("1.0.0.2002");
-			string nameString = "TestAssembly";
-
-			AssemblyName assemblyName = new AssemblyName(); 
-			assemblyName.Name = nameString;
-			assemblyName.Version = version;
-			MakeDynamicAssembly(assemblyName);
-
-			Assembly assembly = FindAssemblyByName(nameString);
-
-			System.Version foundVersion = assembly.GetName().Version;
-			Assert.AreEqual(version, foundVersion);
-		}
-
-		private Assembly FindAssemblyByName(string name)
-		{
-			// Get all the assemblies currently loaded in the application domain.
-			Assembly[] myAssemblies = Thread.GetDomain().GetAssemblies();
-
-			Assembly assembly = null;
-			for(int i = 0; i < myAssemblies.Length && assembly == null; i++)
-			{
-				if(String.Compare(myAssemblies[i].GetName().Name, name) == 0)
-					assembly = myAssemblies[i];
-			}
-			return assembly;
-		}
-
-		public static void MakeDynamicAssembly(AssemblyName myAssemblyName)
-		{
-			Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);			
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Threading;
+using System.Reflection.Emit;
+
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class AssemblyVersionFixture
+	{
+		[Test]
+        // TODO: Figure out what we're testing here! Was there a bug?
+		public void Version()
+		{
+			Version version = new Version("1.0.0.2002");
+			string nameString = "TestAssembly";
+
+			AssemblyName assemblyName = new AssemblyName(); 
+			assemblyName.Name = nameString;
+			assemblyName.Version = version;
+			MakeDynamicAssembly(assemblyName);
+
+			Assembly assembly = FindAssemblyByName(nameString);
+
+			System.Version foundVersion = assembly.GetName().Version;
+			Assert.AreEqual(version, foundVersion);
+		}
+
+		private Assembly FindAssemblyByName(string name)
+		{
+			// Get all the assemblies currently loaded in the application domain.
+			Assembly[] myAssemblies = Thread.GetDomain().GetAssemblies();
+
+			Assembly assembly = null;
+			for(int i = 0; i < myAssemblies.Length && assembly == null; i++)
+			{
+				if(String.Compare(myAssemblies[i].GetName().Name, name) == 0)
+					assembly = myAssemblies[i];
+			}
+			return assembly;
+		}
+
+		public static void MakeDynamicAssembly(AssemblyName myAssemblyName)
+		{
+			Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);			
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/AssertPassFixture.cs b/src/NUnitCore/tests/AssertPassFixture.cs
index 62d1f03..b68c4ca 100644
--- a/src/NUnitCore/tests/AssertPassFixture.cs
+++ b/src/NUnitCore/tests/AssertPassFixture.cs
@@ -1,46 +1,46 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class AssertPassFixture
-    {
-        [Test]
-        public void AssertPassReturnsSuccess()
-        {
-            Assert.Pass("This test is OK!");
-        }
-
-        [Test]
-        public void SubsequentFailureIsIrrelevant()
-        {
-            Assert.Pass("This test is OK!");
-            Assert.Fail("No it's NOT!");
-        }
-    }
-
-    [TestFixture]
-    public class AssertInconclusiveFixture
-    {
-        [Test]
-        public void AssertInconclusiveThrowsException()
-        {
-            Exception ex = Assert.Throws(
-                typeof(InconclusiveException),
-                new TestDelegate(InconclusiveTest));
-            Assert.AreEqual("Unable to run test", ex.Message);
-        }
-
-        private static void InconclusiveTest()
-        {
-            Assert.Inconclusive("Unable to run test");
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class AssertPassFixture
+    {
+        [Test]
+        public void AssertPassReturnsSuccess()
+        {
+            Assert.Pass("This test is OK!");
+        }
+
+        [Test]
+        public void SubsequentFailureIsIrrelevant()
+        {
+            Assert.Pass("This test is OK!");
+            Assert.Fail("No it's NOT!");
+        }
+    }
+
+    [TestFixture]
+    public class AssertInconclusiveFixture
+    {
+        [Test]
+        public void AssertInconclusiveThrowsException()
+        {
+            Exception ex = Assert.Throws(
+                typeof(InconclusiveException),
+                new TestDelegate(InconclusiveTest));
+            Assert.AreEqual("Unable to run test", ex.Message);
+        }
+
+        private static void InconclusiveTest()
+        {
+            Assert.Inconclusive("Unable to run test");
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/AttributeDescriptionFixture.cs b/src/NUnitCore/tests/AttributeDescriptionFixture.cs
index 7d0f86a..61520cb 100644
--- a/src/NUnitCore/tests/AttributeDescriptionFixture.cs
+++ b/src/NUnitCore/tests/AttributeDescriptionFixture.cs
@@ -1,100 +1,100 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Reflection;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.TestUtilities;
-using NUnit.TestData.AttributeDescriptionFixture;
-
-namespace NUnit.Core.Tests
-{
-	// TODO: Review to see if we need these tests
-
-	[TestFixture]
-	public class TestAttributeFixture
-	{
-		static readonly Type FixtureType = typeof( MockFixture );
-
-		[Test]
-		public void ReflectionTest()
-		{
-			Test testCase = TestBuilder.MakeTestCase( FixtureType, "Method" );
-			Assert.AreEqual( RunState.Runnable, testCase.RunState );
-		}
-
-        [Test]
-        public void Description()
-        {
-            Test testCase = TestBuilder.MakeTestCase(FixtureType, "Method");
-            Assert.AreEqual("Test Description", testCase.Description);
-        }
-
-        [Test]
-        public void DescriptionInResult()
-        {
-            TestSuite suite = new TestSuite("Mock Fixture");
-            suite.Add(TestBuilder.MakeFixture(typeof(MockFixture)));
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-
-            TestResult caseResult = TestFinder.Find("Method", result, true);
-            Assert.AreEqual("Test Description", caseResult.Description);
-
-            caseResult = TestFinder.Find("NoDescriptionMethod", result, true);
-            Assert.IsNull(caseResult.Description);
-        }
-
-        [Test]
-		public void NoDescription()
-		{
-			Test testCase = TestBuilder.MakeTestCase( FixtureType, "NoDescriptionMethod" );
-			Assert.IsNull(testCase.Description);
-		}
-
-		[Test]
-		public void FixtureDescription()
-		{
-			TestSuite suite = new TestSuite("suite");
-			suite.Add( TestBuilder.MakeFixture( typeof( MockFixture ) ) );
-
-			IList tests = suite.Tests;
-			TestSuite mockFixtureSuite = (TestSuite)tests[0];
-
-			Assert.AreEqual("Fixture Description", mockFixtureSuite.Description);
-		}
-
-		[Test]
-		public void FixtureDescriptionInResult()
-		{
-			TestSuite suite = new TestSuite("Mock Fixture");
-			suite.Add( TestBuilder.MakeFixture( typeof( MockFixture ) ) );
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-
-		    TestResult fixtureResult = TestFinder.Find("MockFixture", result, true);
-            Assert.AreEqual("Fixture Description", fixtureResult.Description);
-		}
-
-        [Test]
-        public void SeparateDescriptionAttribute()
-        {
-            Test testCase = TestBuilder.MakeTestCase(FixtureType, "SeparateDescriptionMethod");
-            Assert.AreEqual("Separate Description", testCase.Description);
-        }
-
-        [Test]
-        public void SeparateDescriptionInResult()
-        {
-            TestSuite suite = new TestSuite("Mock Fixture");
-            suite.Add(TestBuilder.MakeFixture(typeof(MockFixture)));
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-
-            TestResult caseResult = TestFinder.Find("SeparateDescriptionMethod", result, true);
-            Assert.AreEqual("Separate Description", caseResult.Description);
-        }
-
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Reflection;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.TestUtilities;
+using NUnit.TestData.AttributeDescriptionFixture;
+
+namespace NUnit.Core.Tests
+{
+	// TODO: Review to see if we need these tests
+
+	[TestFixture]
+	public class TestAttributeFixture
+	{
+		static readonly Type FixtureType = typeof( MockFixture );
+
+		[Test]
+		public void ReflectionTest()
+		{
+			Test testCase = TestBuilder.MakeTestCase( FixtureType, "Method" );
+			Assert.AreEqual( RunState.Runnable, testCase.RunState );
+		}
+
+        [Test]
+        public void Description()
+        {
+            Test testCase = TestBuilder.MakeTestCase(FixtureType, "Method");
+            Assert.AreEqual("Test Description", testCase.Description);
+        }
+
+        [Test]
+        public void DescriptionInResult()
+        {
+            TestSuite suite = new TestSuite("Mock Fixture");
+            suite.Add(TestBuilder.MakeFixture(typeof(MockFixture)));
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+
+            TestResult caseResult = TestFinder.Find("Method", result, true);
+            Assert.AreEqual("Test Description", caseResult.Description);
+
+            caseResult = TestFinder.Find("NoDescriptionMethod", result, true);
+            Assert.IsNull(caseResult.Description);
+        }
+
+        [Test]
+		public void NoDescription()
+		{
+			Test testCase = TestBuilder.MakeTestCase( FixtureType, "NoDescriptionMethod" );
+			Assert.IsNull(testCase.Description);
+		}
+
+		[Test]
+		public void FixtureDescription()
+		{
+			TestSuite suite = new TestSuite("suite");
+			suite.Add( TestBuilder.MakeFixture( typeof( MockFixture ) ) );
+
+			IList tests = suite.Tests;
+			TestSuite mockFixtureSuite = (TestSuite)tests[0];
+
+			Assert.AreEqual("Fixture Description", mockFixtureSuite.Description);
+		}
+
+		[Test]
+		public void FixtureDescriptionInResult()
+		{
+			TestSuite suite = new TestSuite("Mock Fixture");
+			suite.Add( TestBuilder.MakeFixture( typeof( MockFixture ) ) );
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+
+		    TestResult fixtureResult = TestFinder.Find("MockFixture", result, true);
+            Assert.AreEqual("Fixture Description", fixtureResult.Description);
+		}
+
+        [Test]
+        public void SeparateDescriptionAttribute()
+        {
+            Test testCase = TestBuilder.MakeTestCase(FixtureType, "SeparateDescriptionMethod");
+            Assert.AreEqual("Separate Description", testCase.Description);
+        }
+
+        [Test]
+        public void SeparateDescriptionInResult()
+        {
+            TestSuite suite = new TestSuite("Mock Fixture");
+            suite.Add(TestBuilder.MakeFixture(typeof(MockFixture)));
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+
+            TestResult caseResult = TestFinder.Find("SeparateDescriptionMethod", result, true);
+            Assert.AreEqual("Separate Description", caseResult.Description);
+        }
+
+    }
+}
diff --git a/src/NUnitCore/tests/AttributeInheritance.cs b/src/NUnitCore/tests/AttributeInheritance.cs
index 78dc41f..9f5ee54 100644
--- a/src/NUnitCore/tests/AttributeInheritance.cs
+++ b/src/NUnitCore/tests/AttributeInheritance.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class AttributeInheritance
-	{
-		NUnitTestFixtureBuilder builder;
-
-		[SetUp]
-		public void CreateBuilder()
-		{
-			builder = new NUnitTestFixtureBuilder();
-		}
-
-		[Test]
-		public void InheritedFixtureAttributeIsRecognized()
-		{
-			Assert.That( builder.CanBuildFrom( typeof (TestData.When_collecting_test_fixtures) ) );
-		}
-
-		[Test]
-		public void InheritedTestAttributeIsRecognized()
-		{
-			Test fixture = builder.BuildFrom( typeof( TestData.When_collecting_test_fixtures ) );
-			Assert.AreEqual( 1, fixture.TestCount );
-		}
-
-        [Test]
-        public void InheritedExplicitAttributeIsRecognized()
-        {
-            Test fixture = builder.BuildFrom(typeof(TestData.AttributeInheritanceFixture));
-            Test test = TestUtilities.TestFinder.Find("ShouldBeExplicit", fixture, false);
-            Assert.That(test.RunState, Is.EqualTo(RunState.Explicit));
-            Assert.That(test.IgnoreReason, Is.EqualTo("Work in progress"));
-        }
-
-        [Test]
-        public void InheritedIgnoreAttributeIsRecognized()
-        {
-            Test fixture = builder.BuildFrom(typeof(TestData.AttributeInheritanceFixture));
-            Test test = TestUtilities.TestFinder.Find("ShouldBeIgnored", fixture, false);
-            Assert.That(test.RunState, Is.EqualTo(RunState.Ignored));
-            Assert.That(test.IgnoreReason, Is.EqualTo("Not yet implemented"));
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class AttributeInheritance
+	{
+		NUnitTestFixtureBuilder builder;
+
+		[SetUp]
+		public void CreateBuilder()
+		{
+			builder = new NUnitTestFixtureBuilder();
+		}
+
+		[Test]
+		public void InheritedFixtureAttributeIsRecognized()
+		{
+			Assert.That( builder.CanBuildFrom( typeof (TestData.When_collecting_test_fixtures) ) );
+		}
+
+		[Test]
+		public void InheritedTestAttributeIsRecognized()
+		{
+			Test fixture = builder.BuildFrom( typeof( TestData.When_collecting_test_fixtures ) );
+			Assert.AreEqual( 1, fixture.TestCount );
+		}
+
+        [Test]
+        public void InheritedExplicitAttributeIsRecognized()
+        {
+            Test fixture = builder.BuildFrom(typeof(TestData.AttributeInheritanceFixture));
+            Test test = TestUtilities.TestFinder.Find("ShouldBeExplicit", fixture, false);
+            Assert.That(test.RunState, Is.EqualTo(RunState.Explicit));
+            Assert.That(test.IgnoreReason, Is.EqualTo("Work in progress"));
+        }
+
+        [Test]
+        public void InheritedIgnoreAttributeIsRecognized()
+        {
+            Test fixture = builder.BuildFrom(typeof(TestData.AttributeInheritanceFixture));
+            Test test = TestUtilities.TestFinder.Find("ShouldBeIgnored", fixture, false);
+            Assert.That(test.RunState, Is.EqualTo(RunState.Ignored));
+            Assert.That(test.IgnoreReason, Is.EqualTo("Not yet implemented"));
+        }
+	}
+}
diff --git a/src/NUnitCore/tests/BasicRunnerTests.cs b/src/NUnitCore/tests/BasicRunnerTests.cs
index ce0b643..3cfba64 100644
--- a/src/NUnitCore/tests/BasicRunnerTests.cs
+++ b/src/NUnitCore/tests/BasicRunnerTests.cs
@@ -1,190 +1,190 @@
-// ****************************************************************
-// Copyright 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.Collections;
-
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Util;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Base class for tests of various kinds of runners. The derived
-	/// class should use SetUp to create the runner and assign it to
-	/// the protected field runner and perform any cleanup in TearDown.
-	/// If creating the runner is resource intensive, it may be possible
-	/// to use TestFixtureSetUp and TestFixtureTearDown instead. 
-	/// </summary>
-	public abstract class BasicRunnerTests
-	{
-		private static readonly string testsDll = NoNamespaceTestFixture.AssemblyPath;
-		private static readonly string mockDll = MockAssembly.AssemblyPath;
-		private readonly string[] assemblies = new string[] { testsDll, mockDll };
-        private readonly RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
-
-		protected TestRunner runner;
-        private TestPackage package1;
-        private TestPackage package2;
-
-		[TestFixtureSetUp]
-		public void SetUpRunner()
-		{
-			runner = CreateRunner( 123 );
-			Assert.IsNotNull( runner, "Derived test class failed to set runner" );
-		}
-
-        [TestFixtureTearDown]
-        public void TearDownRunner()
-        {
-            DestroyRunner();
-        }
-
-        [SetUp]
-        public void CreatePackages()
-        {
-            package1 = new TestPackage(MockAssembly.AssemblyPath);
-            package2 = new TestPackage("TestSuite", assemblies);
-
-            // Set current framework explicitly to avoid running out of process
-            // unless explicitly called for by derived test.
-            package1.Settings["RuntimeFramework"] = currentFramework;
-            package2.Settings["RuntimeFramework"] = currentFramework;
-        }
-
-		protected abstract TestRunner CreateRunner( int runnerID );
-
-        protected virtual void DestroyRunner()
-        {
-            if (runner != null)
-                runner.Unload();
-        }
-
-        [Test]
-        public void CheckRunnerID()
-        {
-            Assert.AreEqual(123, runner.ID);
-        }
-
-        [Test]
-		public virtual void LoadAndReloadAssembly() 
-		{
-            Assert.IsTrue(runner.Load(package1), "Unable to load assembly");
-            runner.Unload();
-            Assert.IsTrue(runner.Load(package1), "Unable to reload assembly");
-        }
-
-		[Test]
-		public void LoadAssemblyWithoutNamespaces()
-		{
-            package1.Settings["AutoNamespaceSuites"] = false;
-            Assert.IsTrue(runner.Load(package1), "Unable to load assembly");
-			ITest test = runner.Test;
-			Assert.IsNotNull( test );
-			Assert.AreEqual( MockAssembly.Classes, test.Tests.Count );
-			Assert.AreEqual( "MockTestFixture", ((ITest)test.Tests[0]).TestName.Name );
-		}
-
-		[Test]
-		public void LoadAssemblyWithFixture()
-		{
-			package1.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-			Assert.IsTrue( runner.Load( package1 ) );
-		}
-
-		[Test]
-		public void LoadAssemblyWithSuite()
-		{
-			package1.TestName = "NUnit.Tests.Assemblies.MockSuite";
-			runner.Load( package1 );
-			Assert.IsNotNull(runner.Test, "Unable to build suite");
-		}
-
-		[Test]
-		public void CountTestCases()
-		{
-			runner.Load(package1);
-			Assert.AreEqual( MockAssembly.Tests, runner.Test.TestCount );
-		}
-
-		[Test]
-		public void LoadMultipleAssemblies()
-		{
-			runner.Load( package2 );
-			Assert.IsNotNull( runner.Test, "Unable to load assemblies" );
-		}
-
-		[Test]
-		public void LoadMultipleAssembliesWithFixture()
-		{
-            package2.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-			runner.Load( package2 );
-			Assert.IsNotNull(runner.Test, "Unable to build suite");
-		}
-
-		[Test]
-		public void LoadMultipleAssembliesWithSuite()
-		{
-            package2.TestName = "NUnit.Tests.Assemblies.MockSuite";
-			runner.Load( package2 );
-			Assert.IsNotNull(runner.Test, "Unable to build suite");
-		}
-
-		[Test]
-		public void CountTestCasesAcrossMultipleAssemblies()
-		{
-			runner.Load(package2);
-			Assert.AreEqual( NoNamespaceTestFixture.Tests + MockAssembly.Tests, 
-				runner.Test.TestCount );			
-		}
-
-		[Test]
-		public void RunAssembly()
-		{
-			runner.Load(package1);
-			TestResult result = runner.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
-			ResultSummarizer summary = new ResultSummarizer(result);
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
-		}
-
-		[Test]
-		public void RunAssemblyUsingBeginAndEndRun()
-		{
-			runner.Load(package1);
-			runner.BeginRun( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
-			TestResult result = runner.EndRun();
-			Assert.IsNotNull( result );
-			ResultSummarizer summary = new ResultSummarizer( result );
-			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
-		}
-
-		[Test]
-		public void RunMultipleAssemblies()
-		{
-			runner.Load( package2 );
-			TestResult result = runner.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
-			ResultSummarizer summary = new ResultSummarizer(result);
-			Assert.AreEqual( 
-				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
-				summary.TestsRun);
-		}
-
-		[Test]
-		public void RunMultipleAssembliesUsingBeginAndEndRun()
-		{
-			runner.Load( package2 );
-			runner.BeginRun( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
-			TestResult result = runner.EndRun();
-			Assert.IsNotNull( result );
-			ResultSummarizer summary = new ResultSummarizer( result );
-			Assert.AreEqual( 
-				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
-				summary.TestsRun);
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Collections;
+
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Util;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Base class for tests of various kinds of runners. The derived
+	/// class should use SetUp to create the runner and assign it to
+	/// the protected field runner and perform any cleanup in TearDown.
+	/// If creating the runner is resource intensive, it may be possible
+	/// to use TestFixtureSetUp and TestFixtureTearDown instead. 
+	/// </summary>
+	public abstract class BasicRunnerTests
+	{
+		private static readonly string testsDll = NoNamespaceTestFixture.AssemblyPath;
+		private static readonly string mockDll = MockAssembly.AssemblyPath;
+		private readonly string[] assemblies = new string[] { testsDll, mockDll };
+        private readonly RuntimeFramework currentFramework = RuntimeFramework.CurrentFramework;
+
+		protected TestRunner runner;
+        private TestPackage package1;
+        private TestPackage package2;
+
+		[TestFixtureSetUp]
+		public void SetUpRunner()
+		{
+			runner = CreateRunner( 123 );
+			Assert.IsNotNull( runner, "Derived test class failed to set runner" );
+		}
+
+        [TestFixtureTearDown]
+        public void TearDownRunner()
+        {
+            DestroyRunner();
+        }
+
+        [SetUp]
+        public void CreatePackages()
+        {
+            package1 = new TestPackage(MockAssembly.AssemblyPath);
+            package2 = new TestPackage("TestSuite", assemblies);
+
+            // Set current framework explicitly to avoid running out of process
+            // unless explicitly called for by derived test.
+            package1.Settings["RuntimeFramework"] = currentFramework;
+            package2.Settings["RuntimeFramework"] = currentFramework;
+        }
+
+		protected abstract TestRunner CreateRunner( int runnerID );
+
+        protected virtual void DestroyRunner()
+        {
+            if (runner != null)
+                runner.Unload();
+        }
+
+        [Test]
+        public void CheckRunnerID()
+        {
+            Assert.AreEqual(123, runner.ID);
+        }
+
+        [Test]
+		public virtual void LoadAndReloadAssembly() 
+		{
+            Assert.IsTrue(runner.Load(package1), "Unable to load assembly");
+            runner.Unload();
+            Assert.IsTrue(runner.Load(package1), "Unable to reload assembly");
+        }
+
+		[Test]
+		public void LoadAssemblyWithoutNamespaces()
+		{
+            package1.Settings["AutoNamespaceSuites"] = false;
+            Assert.IsTrue(runner.Load(package1), "Unable to load assembly");
+			ITest test = runner.Test;
+			Assert.IsNotNull( test );
+			Assert.AreEqual( MockAssembly.Classes, test.Tests.Count );
+			Assert.AreEqual( "MockTestFixture", ((ITest)test.Tests[0]).TestName.Name );
+		}
+
+		[Test]
+		public void LoadAssemblyWithFixture()
+		{
+			package1.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			Assert.IsTrue( runner.Load( package1 ) );
+		}
+
+		[Test]
+		public void LoadAssemblyWithSuite()
+		{
+			package1.TestName = "NUnit.Tests.Assemblies.MockSuite";
+			runner.Load( package1 );
+			Assert.IsNotNull(runner.Test, "Unable to build suite");
+		}
+
+		[Test]
+		public void CountTestCases()
+		{
+			runner.Load(package1);
+			Assert.AreEqual( MockAssembly.Tests, runner.Test.TestCount );
+		}
+
+		[Test]
+		public void LoadMultipleAssemblies()
+		{
+			runner.Load( package2 );
+			Assert.IsNotNull( runner.Test, "Unable to load assemblies" );
+		}
+
+		[Test]
+		public void LoadMultipleAssembliesWithFixture()
+		{
+            package2.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			runner.Load( package2 );
+			Assert.IsNotNull(runner.Test, "Unable to build suite");
+		}
+
+		[Test]
+		public void LoadMultipleAssembliesWithSuite()
+		{
+            package2.TestName = "NUnit.Tests.Assemblies.MockSuite";
+			runner.Load( package2 );
+			Assert.IsNotNull(runner.Test, "Unable to build suite");
+		}
+
+		[Test]
+		public void CountTestCasesAcrossMultipleAssemblies()
+		{
+			runner.Load(package2);
+			Assert.AreEqual( NoNamespaceTestFixture.Tests + MockAssembly.Tests, 
+				runner.Test.TestCount );			
+		}
+
+		[Test]
+		public void RunAssembly()
+		{
+			runner.Load(package1);
+			TestResult result = runner.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
+			ResultSummarizer summary = new ResultSummarizer(result);
+			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
+		}
+
+		[Test]
+		public void RunAssemblyUsingBeginAndEndRun()
+		{
+			runner.Load(package1);
+			runner.BeginRun( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
+			TestResult result = runner.EndRun();
+			Assert.IsNotNull( result );
+			ResultSummarizer summary = new ResultSummarizer( result );
+			Assert.AreEqual( MockAssembly.Tests - MockAssembly.NotRun, summary.TestsRun );
+		}
+
+		[Test]
+		public void RunMultipleAssemblies()
+		{
+			runner.Load( package2 );
+			TestResult result = runner.Run( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
+			ResultSummarizer summary = new ResultSummarizer(result);
+			Assert.AreEqual( 
+				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
+				summary.TestsRun);
+		}
+
+		[Test]
+		public void RunMultipleAssembliesUsingBeginAndEndRun()
+		{
+			runner.Load( package2 );
+			runner.BeginRun( NullListener.NULL, TestFilter.Empty, false, LoggingThreshold.Off );
+			TestResult result = runner.EndRun();
+			Assert.IsNotNull( result );
+			ResultSummarizer summary = new ResultSummarizer( result );
+			Assert.AreEqual( 
+				NoNamespaceTestFixture.Tests + MockAssembly.Tests - MockAssembly.NotRun, 
+				summary.TestsRun);
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/CallContextTests.cs b/src/NUnitCore/tests/CallContextTests.cs
index a33b202..0c8ab07 100644
--- a/src/NUnitCore/tests/CallContextTests.cs
+++ b/src/NUnitCore/tests/CallContextTests.cs
@@ -1,136 +1,152 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Threading;
-using System.Runtime.Remoting.Messaging;
-using System.Security.Principal;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	// TODO: Make this work for .NET 2.0
-	[TestFixture]
-	public class CallContextTests
-	{
-		const string CONTEXT_DATA = "MyContextData";
-//		IPrincipal savedPrincipal;
-
-//		[SetUp]
-//		public void SaveCurrentPrincipal()
-//		{
-//			savedPrincipal = System.Threading.Thread.CurrentPrincipal;
-//		}
-//
-//		[TearDown]
-//		public void RestoreCurrentPrincipal()
-//		{
-//			System.Threading.Thread.CurrentPrincipal = savedPrincipal;
-//			CallContext.FreeNamedDataSlot(CONTEXT_DATA);
-//		}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Threading;
+using System.Runtime.Remoting.Messaging;
+using System.Security.Principal;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	// TODO: Make this work for .NET 2.0
+	[TestFixture]
+	public class CallContextTests
+	{
+		const string CONTEXT_DATA = "MyContextData";
+//		IPrincipal savedPrincipal;
+
+//		[SetUp]
+//		public void SaveCurrentPrincipal()
+//		{
+//			savedPrincipal = System.Threading.Thread.CurrentPrincipal;
+//		}
+//
+//		[TearDown]
+//		public void RestoreCurrentPrincipal()
+//		{
+//			System.Threading.Thread.CurrentPrincipal = savedPrincipal;
+//			CallContext.FreeNamedDataSlot(CONTEXT_DATA);
+//		}
+
+        [TestFixtureTearDown]
+        public void FreeCallContextDataSlot()
+        {
+            // NOTE: We don't want possible side effects on other cross context tests.
+            CallContext.FreeNamedDataSlot(CONTEXT_DATA);
+        }
 
-        [TestFixtureTearDown]
-        public void FreeCallContextDataSlot()
+        [Test]
+        public void ILogicalThreadAffinativeTest()
         {
-            // NOTE: We don't want possible side effects on other cross context tests.
-            CallContext.FreeNamedDataSlot(CONTEXT_DATA);
+            CallContext.SetData(CONTEXT_DATA, new EmptyCallContextData());
         }
 
-		[Test]
-		public void ILogicalThreadAffinativeTest()
-		{	
-			CallContext.SetData( CONTEXT_DATA, new EmptyCallContextData() );
-		}
-
-		[Test]
-		public void ILogicalThreadAffinativeTestConsole()
-		{	
-			CallContext.SetData( CONTEXT_DATA, new EmptyCallContextData() );
-			// TODO: make this Assertable
-			//Console.WriteLine("ILogicalThreadAffinativeTest");
-			Console.Out.Flush();
-		}
-
-		[Test]
-		public void GenericPrincipalTest()
-		{
-			GenericIdentity ident = new GenericIdentity("Bob");
-			GenericPrincipal prpal = new GenericPrincipal(ident, 
-				new string[] {"Level1"});
-
-			CallContext.SetData( CONTEXT_DATA, new PrincipalCallContextData( prpal ) );
-		}
-
-		[Test]
-		public void SetGenericPrincipalOnThread()
-		{
-			GenericIdentity ident = new GenericIdentity("Bob");
-			GenericPrincipal prpal = new GenericPrincipal(ident, 
-				new string[] {"Level1"});
-
-			System.Threading.Thread.CurrentPrincipal = prpal;
-		}
-
-		[Test]
-		public void SetCustomPrincipalOnThread()
-		{
-			MyPrincipal prpal = new MyPrincipal();
-
-			System.Threading.Thread.CurrentPrincipal = prpal;
-		}
-
-		[Test]
-		public void UseCustomIdentity()
-		{
-			TestIdentity ident = new TestIdentity( "test" );
-			GenericPrincipal principal = new GenericPrincipal( ident, new string[] { "Level1" } );
-		
-			System.Threading.Thread.CurrentPrincipal = principal;
-		}
-	}
-
-	/// <summary>
-	/// Helper class that implements ILogicalThreadAffinative
-	/// but holds no data at all
-	/// </summary>
-	[Serializable]
-	public class EmptyCallContextData : ILogicalThreadAffinative
-	{
-	}
-
-	[Serializable]
-	public class PrincipalCallContextData : ILogicalThreadAffinative
-	{
-		public PrincipalCallContextData( IPrincipal principal )
-		{
-		}
-	}
-
-	[Serializable]
-	public class MyPrincipal : IPrincipal
-	{
-		public IIdentity Identity
-		{
-			get
-			{
-				// TODO:  Add MyPrincipal.Identity getter implementation
-				return null;
-			}
-		}
-
-		public bool IsInRole(string role)
-		{
-			// TODO:  Add MyPrincipal.IsInRole implementation
-			return false;
-		}
-	}
+        [Test]
+        public void ILogicalThreadAffinativeTest_Bug1167805_ReadSchema()
+        {
+            CallContext.SetData(CONTEXT_DATA, new EmptyCallContextData());
+            System.Xml.Schema.XmlSchema.Read(new System.IO.StringReader(@"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'></xsd:schema>"), null);
+        }
 
-	[Serializable]
-	public class TestIdentity : GenericIdentity
-	{
-		public TestIdentity( string name ) : base( name ) { }
-	}
+        [Test]
+        public void ILogicalThreadAffinativeTest_Bug1167805_AccessEvidence()
+        {
+            CallContext.SetData(CONTEXT_DATA, new EmptyCallContextData());
+            System.Security.Policy.Evidence ev = AppDomain.CurrentDomain.Evidence;
+            Console.WriteLine(ev);
+        }
 
-}
+        [Test]
+		public void ILogicalThreadAffinativeTestConsole()
+		{	
+			CallContext.SetData( CONTEXT_DATA, new EmptyCallContextData() );
+
+			// TODO: make this Assertable
+			//Console.WriteLine("ILogicalThreadAffinativeTest");
+			Console.Out.Flush();
+		}
+
+		[Test]
+		public void GenericPrincipalTest()
+		{
+			GenericIdentity ident = new GenericIdentity("Bob");
+			GenericPrincipal prpal = new GenericPrincipal(ident, 
+				new string[] {"Level1"});
+
+			CallContext.SetData( CONTEXT_DATA, new PrincipalCallContextData( prpal ) );
+		}
+
+		[Test]
+		public void SetGenericPrincipalOnThread()
+		{
+			GenericIdentity ident = new GenericIdentity("Bob");
+			GenericPrincipal prpal = new GenericPrincipal(ident, 
+				new string[] {"Level1"});
+
+			System.Threading.Thread.CurrentPrincipal = prpal;
+		}
+
+		[Test]
+		public void SetCustomPrincipalOnThread()
+		{
+			MyPrincipal prpal = new MyPrincipal();
+
+			System.Threading.Thread.CurrentPrincipal = prpal;
+		}
+
+		[Test]
+		public void UseCustomIdentity()
+		{
+			TestIdentity ident = new TestIdentity( "test" );
+			GenericPrincipal principal = new GenericPrincipal( ident, new string[] { "Level1" } );
+		
+			System.Threading.Thread.CurrentPrincipal = principal;
+		}
+	}
+
+	/// <summary>
+	/// Helper class that implements ILogicalThreadAffinative
+	/// but holds no data at all
+	/// </summary>
+	[Serializable]
+	public class EmptyCallContextData : ILogicalThreadAffinative
+	{
+	}
+
+	[Serializable]
+	public class PrincipalCallContextData : ILogicalThreadAffinative
+	{
+		public PrincipalCallContextData( IPrincipal principal )
+		{
+		}
+	}
+
+	[Serializable]
+	public class MyPrincipal : IPrincipal
+	{
+		public IIdentity Identity
+		{
+			get
+			{
+				// TODO:  Add MyPrincipal.Identity getter implementation
+				return null;
+			}
+		}
+
+		public bool IsInRole(string role)
+		{
+			// TODO:  Add MyPrincipal.IsInRole implementation
+			return false;
+		}
+	}
+
+	[Serializable]
+	public class TestIdentity : GenericIdentity
+	{
+		public TestIdentity( string name ) : base( name ) { }
+	}
+
+}
diff --git a/src/NUnitCore/tests/CategoryAttributeTests.cs b/src/NUnitCore/tests/CategoryAttributeTests.cs
index d93f059..8fd25e0 100644
--- a/src/NUnitCore/tests/CategoryAttributeTests.cs
+++ b/src/NUnitCore/tests/CategoryAttributeTests.cs
@@ -1,68 +1,68 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.TestData.CategoryAttributeTests;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for CategoryAttributeTests.
-	/// </summary>
-	[TestFixture]
-	public class CategoryAttributeTests
-	{
-		TestSuite fixture;
-
-		[SetUp]
-		public void CreateFixture()
-		{
-			fixture = TestBuilder.MakeFixture( typeof( FixtureWithCategories ) );
-		}
-
-		[Test]
-		public void CategoryOnFixture()
-		{
-			Assert.Contains( "DataBase", fixture.Categories );
-		}
-
-		[Test]
-		public void CategoryOnTestCase()
-		{
-			Test test1 = (Test)fixture.Tests[0];
-			Assert.Contains( "Long", test1.Categories );
-		}
-
-		[Test]
-		public void CanDeriveFromCategoryAttribute()
-		{
-			Test test2 = (Test)fixture.Tests[1];
-			Assert.Contains( "Critical", test2.Categories );
-		}
-		
-		[Test]
-		public void DerivedCategoryMayBeInherited()
-		{
-			Assert.Contains("MyCategory", fixture.Categories);
-		}
-
-        [Test]
-        public void CountTestsWithoutCategoryFilter()
-        {
-            Assert.That(fixture.CountTestCases(TestFilter.Empty), Is.EqualTo(2));
-        }
-
-        [TestCase("Database", Result = 0)]
-        [TestCase("Long", Result = 1)]
-        [TestCase("Critical", Result = 1)]
-        public int CountTestsUsingCategoryFilter(string name)
-        {
-            TestFilter filter = new Filters.CategoryFilter(name);
-            return fixture.CountTestCases(filter);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData.CategoryAttributeTests;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for CategoryAttributeTests.
+	/// </summary>
+	[TestFixture]
+	public class CategoryAttributeTests
+	{
+		TestSuite fixture;
+
+		[SetUp]
+		public void CreateFixture()
+		{
+			fixture = TestBuilder.MakeFixture( typeof( FixtureWithCategories ) );
+		}
+
+		[Test]
+		public void CategoryOnFixture()
+		{
+			Assert.Contains( "DataBase", fixture.Categories );
+		}
+
+		[Test]
+		public void CategoryOnTestCase()
+		{
+			Test test1 = (Test)fixture.Tests[0];
+			Assert.Contains( "Long", test1.Categories );
+		}
+
+		[Test]
+		public void CanDeriveFromCategoryAttribute()
+		{
+			Test test2 = (Test)fixture.Tests[1];
+			Assert.Contains( "Critical", test2.Categories );
+		}
+		
+		[Test]
+		public void DerivedCategoryMayBeInherited()
+		{
+			Assert.Contains("MyCategory", fixture.Categories);
+		}
+
+        [Test]
+        public void CountTestsWithoutCategoryFilter()
+        {
+            Assert.That(fixture.CountTestCases(TestFilter.Empty), Is.EqualTo(2));
+        }
+
+        [TestCase("Database", Result = 0)]
+        [TestCase("Long", Result = 1)]
+        [TestCase("Critical", Result = 1)]
+        public int CountTestsUsingCategoryFilter(string name)
+        {
+            TestFilter filter = new Filters.CategoryFilter(name);
+            return fixture.CountTestCases(filter);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/CombinatorialTests.cs b/src/NUnitCore/tests/CombinatorialTests.cs
index badd299..8f601fc 100644
--- a/src/NUnitCore/tests/CombinatorialTests.cs
+++ b/src/NUnitCore/tests/CombinatorialTests.cs
@@ -1,82 +1,82 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class CombinatorialTests
-    {
-        [Test]
-        public void SingleArgument(
-            [Values(1.3, 1.7, 1.5)] double x)
-        {
-            Assert.That(x > 1.0 && x < 2.0);
-        }
-
-        [Test, Combinatorial]
-        public void TwoArguments_Combinatorial(
-            [Values(1, 2, 3)] int x,
-            [Values(10, 20)] int y)
-        {
-            Assert.That(x > 0 && x < 4 && y % 10 == 0);
-        }
-
-        [Test, Sequential]
-        public void TwoArguments_Sequential(
-            [Values(1, 2, 3)] int x,
-            [Values(10, 20)] int y)
-        {
-            Assert.That(x > 0 && x < 4 && y % 10 == 0);
-        }
-
-        [Test, Combinatorial]
-        public void ThreeArguments_Combinatorial(
-            [Values(1, 2, 3)] int x,
-            [Values(10, 20)] int y,
-            [Values("Charlie", "Joe", "Frank")] string name)
-        {
-            Assert.That(x > 0 && x < 4 && y % 10 == 0);
-            Assert.That(name.Length >= 2);
-        }
-
-        [Test, Sequential]
-        public void ThreeArguments_Sequential(
-            [Values(1, 2, 3)] int x,
-            [Values(10, 20)] int y,
-            [Values("Charlie", "Joe", "Frank")] string name)
-        {
-            Assert.That(x > 0 && x < 4 && y % 10 == 0);
-            Assert.That(name.Length >= 2);
-        }
-
-        [Test]
-        public void RangeTest(
-            [Range(0.2, 0.6, 0.2)] double a,
-            [Range(10, 20, 5)] int b)
-        {
-        }
-        
-        [Test, Sequential]
-        public void RandomTest(
-            [Random(32, 212, 5)] int x,
-            [Random(5)] double y)
-        {
-            Assert.That(x,Is.InRange(32,212));
-            Assert.That(y,Is.InRange(0.0,1.0));
-        }
-
-        [Test, Sequential]
-        public void RandomArgsAreIndependent(
-            [Random(1)] double x,
-            [Random(1)] double y)
-        {
-            Assert.AreNotEqual(x, y);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class CombinatorialTests
+    {
+        [Test]
+        public void SingleArgument(
+            [Values(1.3, 1.7, 1.5)] double x)
+        {
+            Assert.That(x > 1.0 && x < 2.0);
+        }
+
+        [Test, Combinatorial]
+        public void TwoArguments_Combinatorial(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+        }
+
+        [Test, Sequential]
+        public void TwoArguments_Sequential(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+        }
+
+        [Test, Combinatorial]
+        public void ThreeArguments_Combinatorial(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y,
+            [Values("Charlie", "Joe", "Frank")] string name)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+            Assert.That(name.Length >= 2);
+        }
+
+        [Test, Sequential]
+        public void ThreeArguments_Sequential(
+            [Values(1, 2, 3)] int x,
+            [Values(10, 20)] int y,
+            [Values("Charlie", "Joe", "Frank")] string name)
+        {
+            Assert.That(x > 0 && x < 4 && y % 10 == 0);
+            Assert.That(name.Length >= 2);
+        }
+
+        [Test]
+        public void RangeTest(
+            [Range(0.2, 0.6, 0.2)] double a,
+            [Range(10, 20, 5)] int b)
+        {
+        }
+        
+        [Test, Sequential]
+        public void RandomTest(
+            [Random(32, 212, 5)] int x,
+            [Random(5)] double y)
+        {
+            Assert.That(x,Is.InRange(32,212));
+            Assert.That(y,Is.InRange(0.0,1.0));
+        }
+
+        [Test, Sequential]
+        public void RandomArgsAreIndependent(
+            [Random(1)] double x,
+            [Random(1)] double y)
+        {
+            Assert.AreNotEqual(x, y);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/CoreExtensionsTests.cs b/src/NUnitCore/tests/CoreExtensionsTests.cs
index 779a064..6205123 100644
--- a/src/NUnitCore/tests/CoreExtensionsTests.cs
+++ b/src/NUnitCore/tests/CoreExtensionsTests.cs
@@ -1,200 +1,200 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Text;
-using System.Reflection;
-#if NET_3_5 || NET_4_0
-using NSubstitute;
-#endif
-using NUnit.Framework;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class CoreExtensionsTests
-	{
-		private CoreExtensions host;
-
-		[SetUp]
-		public void CreateHost()
-		{
-			host = new CoreExtensions();
-		}
-
-		[Test]
-		public void HasSuiteBuildersExtensionPoint()
-		{
-			IExtensionPoint ep = host.GetExtensionPoint( "SuiteBuilders" );
-			Assert.IsNotNull( ep );
-			Assert.AreEqual( "SuiteBuilders", ep.Name );
-			Assert.AreEqual( typeof( SuiteBuilderCollection ), ep.GetType() );
-		}
-
-		[Test]
-		public void HasTestCaseBuildersExtensionPoint()
-		{
-			IExtensionPoint ep = host.GetExtensionPoint( "TestCaseBuilders" );
-			Assert.IsNotNull( ep );
-			Assert.AreEqual( "TestCaseBuilders", ep.Name );
-			Assert.AreEqual( typeof( TestCaseBuilderCollection ), ep.GetType() );
-		}
-
-		[Test]
-		public void HasTestDecoratorsExtensionPoint()
-		{
-			IExtensionPoint ep = host.GetExtensionPoint( "TestDecorators" );
-			Assert.IsNotNull( ep );
-			Assert.AreEqual( "TestDecorators", ep.Name );
-			Assert.AreEqual( typeof( TestDecoratorCollection ), ep.GetType() );
-		}
-
-		[Test]
-		public void HasEventListenerExtensionPoint()
-		{
-			IExtensionPoint ep = host.GetExtensionPoint( "EventListeners" );
-			Assert.IsNotNull( ep );
-			Assert.AreEqual( "EventListeners", ep.Name );
-			Assert.AreEqual( typeof( EventListenerCollection ), ep.GetType() );
-		}
-
-		[Test]
-		public void HasTestFrameworkRegistry()
-		{
-			IExtensionPoint ep = host.GetExtensionPoint( "FrameworkRegistry" );
-			Assert.IsNotNull( ep );
-			Assert.AreEqual( "FrameworkRegistry", ep.Name );
-			Assert.AreEqual( typeof( FrameworkRegistry ), ep.GetType() );
-		}
-
-        class MockDecorator : ITestDecorator
-        {
-            private string name;
-            private StringBuilder sb;
-
-            public MockDecorator(string name, StringBuilder sb)
-            {
-                this.name = name;
-                this.sb = sb;
-            }
-
-            public Test Decorate(Test test, MemberInfo member)
-            {
-                sb.Append(name);
-                return test;
-            }
-        }
-
-        [Test]
-        public void DecoratorsRunInOrderOfPriorities()
-        {
-            StringBuilder sb = new StringBuilder();
-
-            ITestDecorator mock0 = new MockDecorator("mock0", sb);
-            ITestDecorator mock1 = new MockDecorator("mock1", sb);
-            ITestDecorator mock3a = new MockDecorator("mock3a", sb);
-            ITestDecorator mock3b = new MockDecorator("mock3b", sb);
-            ITestDecorator mock3c = new MockDecorator("mock3c", sb);
-            ITestDecorator mock5a = new MockDecorator("mock5a", sb);
-            ITestDecorator mock5b = new MockDecorator("mock5b", sb);
-            ITestDecorator mock8 = new MockDecorator("mock8", sb);
-            ITestDecorator mock9 = new MockDecorator("mock9", sb);
-
-            IExtensionPoint2 ep = (IExtensionPoint2)host.GetExtensionPoint("TestDecorators");
-            ep.Install(mock8, 8);
-            ep.Install(mock5a, 5);
-            ep.Install(mock1, 1);
-            ep.Install(mock3a, 3);
-            ep.Install(mock3b, 3);
-            ep.Install(mock9, 9);
-            ep.Install(mock3c, 3);
-            ep.Install(mock0);
-            ep.Install(mock5b, 5);
-
-            ITestDecorator decorators = (ITestDecorator)ep;
-            decorators.Decorate(null, null);
-            Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
-
-            sb.Remove(0, sb.Length);
-            decorators.Decorate(null, null);
-            Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
-        }
-
-#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()
-		{
-            ISuiteBuilder mockBuilder = Substitute.For<ISuiteBuilder>();
-            mockBuilder.CanBuildFrom(Arg.Any<Type>()).Returns(true);
-			
-			IExtensionPoint ep = host.GetExtensionPoint("SuiteBuilders");
-            ep.Install(mockBuilder);
-			ISuiteBuilder builders = (ISuiteBuilder)ep;
-			builders.BuildFrom( null );
-
-            mockBuilder.Received().BuildFrom(null);
-		}
-
-        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-        public void CanAddTestCaseBuilder()
-        {
-            ITestCaseBuilder mockBuilder = Substitute.For<ITestCaseBuilder>();
-            mockBuilder.CanBuildFrom(null).Returns(true);
-
-            IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
-            ep.Install(mockBuilder);
-            ITestCaseBuilder builders = (ITestCaseBuilder)ep;
-            builders.BuildFrom(null);
-
-            mockBuilder.Received().BuildFrom(null);
-        }
-
-        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-        public void CanAddTestCaseBuilder2()
-        {
-            ITestCaseBuilder2 mockBuilder = Substitute.For<ITestCaseBuilder2>();
-            mockBuilder.CanBuildFrom(null, null).Returns(true);
-
-            IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
-            ep.Install(mockBuilder);
-            ITestCaseBuilder2 builders = (ITestCaseBuilder2)ep;
-            builders.BuildFrom(null, null);
-
-            mockBuilder.Received().BuildFrom(null, null);
-        }
-
-        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-		public void CanAddEventListener()
-		{
-            EventListener mockListener = Substitute.For<EventListener>();
-
-			IExtensionPoint ep = host.GetExtensionPoint("EventListeners");
-			ep.Install( mockListener );
-			EventListener listeners = (EventListener)ep;
-
-			listeners.RunStarted( "test", 0 );
-            mockListener.Received().RunStarted("test", 0);
-
-			listeners.RunFinished( new TestResult( new TestInfo( new TestSuite( "test" ) ) ) );
-            mockListener.Received().RunFinished(Arg.Is<TestResult>(x=>x.Name=="test"));
-		}
-#endif
-	}
-}
+// ****************************************************************
+// Copyright 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;
+#if NET_3_5 || NET_4_0 || NET_4_5
+using NSubstitute;
+#endif
+using NUnit.Framework;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class CoreExtensionsTests
+	{
+		private CoreExtensions host;
+
+		[SetUp]
+		public void CreateHost()
+		{
+			host = new CoreExtensions();
+		}
+
+		[Test]
+		public void HasSuiteBuildersExtensionPoint()
+		{
+			IExtensionPoint ep = host.GetExtensionPoint( "SuiteBuilders" );
+			Assert.IsNotNull( ep );
+			Assert.AreEqual( "SuiteBuilders", ep.Name );
+			Assert.AreEqual( typeof( SuiteBuilderCollection ), ep.GetType() );
+		}
+
+		[Test]
+		public void HasTestCaseBuildersExtensionPoint()
+		{
+			IExtensionPoint ep = host.GetExtensionPoint( "TestCaseBuilders" );
+			Assert.IsNotNull( ep );
+			Assert.AreEqual( "TestCaseBuilders", ep.Name );
+			Assert.AreEqual( typeof( TestCaseBuilderCollection ), ep.GetType() );
+		}
+
+		[Test]
+		public void HasTestDecoratorsExtensionPoint()
+		{
+			IExtensionPoint ep = host.GetExtensionPoint( "TestDecorators" );
+			Assert.IsNotNull( ep );
+			Assert.AreEqual( "TestDecorators", ep.Name );
+			Assert.AreEqual( typeof( TestDecoratorCollection ), ep.GetType() );
+		}
+
+		[Test]
+		public void HasEventListenerExtensionPoint()
+		{
+			IExtensionPoint ep = host.GetExtensionPoint( "EventListeners" );
+			Assert.IsNotNull( ep );
+			Assert.AreEqual( "EventListeners", ep.Name );
+			Assert.AreEqual( typeof( EventListenerCollection ), ep.GetType() );
+		}
+
+		[Test]
+		public void HasTestFrameworkRegistry()
+		{
+			IExtensionPoint ep = host.GetExtensionPoint( "FrameworkRegistry" );
+			Assert.IsNotNull( ep );
+			Assert.AreEqual( "FrameworkRegistry", ep.Name );
+			Assert.AreEqual( typeof( FrameworkRegistry ), ep.GetType() );
+		}
+
+        class MockDecorator : ITestDecorator
+        {
+            private string name;
+            private StringBuilder sb;
+
+            public MockDecorator(string name, StringBuilder sb)
+            {
+                this.name = name;
+                this.sb = sb;
+            }
+
+            public Test Decorate(Test test, MemberInfo member)
+            {
+                sb.Append(name);
+                return test;
+            }
+        }
+
+        [Test]
+        public void DecoratorsRunInOrderOfPriorities()
+        {
+            StringBuilder sb = new StringBuilder();
+
+            ITestDecorator mock0 = new MockDecorator("mock0", sb);
+            ITestDecorator mock1 = new MockDecorator("mock1", sb);
+            ITestDecorator mock3a = new MockDecorator("mock3a", sb);
+            ITestDecorator mock3b = new MockDecorator("mock3b", sb);
+            ITestDecorator mock3c = new MockDecorator("mock3c", sb);
+            ITestDecorator mock5a = new MockDecorator("mock5a", sb);
+            ITestDecorator mock5b = new MockDecorator("mock5b", sb);
+            ITestDecorator mock8 = new MockDecorator("mock8", sb);
+            ITestDecorator mock9 = new MockDecorator("mock9", sb);
+
+            IExtensionPoint2 ep = (IExtensionPoint2)host.GetExtensionPoint("TestDecorators");
+            ep.Install(mock8, 8);
+            ep.Install(mock5a, 5);
+            ep.Install(mock1, 1);
+            ep.Install(mock3a, 3);
+            ep.Install(mock3b, 3);
+            ep.Install(mock9, 9);
+            ep.Install(mock3c, 3);
+            ep.Install(mock0);
+            ep.Install(mock5b, 5);
+
+            ITestDecorator decorators = (ITestDecorator)ep;
+            decorators.Decorate(null, null);
+            Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
+
+            sb.Remove(0, sb.Length);
+            decorators.Decorate(null, null);
+            Assert.AreEqual("mock0mock1mock3cmock3bmock3amock5bmock5amock8mock9", sb.ToString());
+        }
+
+#if NET_3_5 || NET_4_0 || NET_4_5
+        [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()
+		{
+            ISuiteBuilder mockBuilder = Substitute.For<ISuiteBuilder>();
+            mockBuilder.CanBuildFrom(Arg.Any<Type>()).Returns(true);
+			
+			IExtensionPoint ep = host.GetExtensionPoint("SuiteBuilders");
+            ep.Install(mockBuilder);
+			ISuiteBuilder builders = (ISuiteBuilder)ep;
+			builders.BuildFrom( null );
+
+            mockBuilder.Received().BuildFrom(null);
+		}
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+        public void CanAddTestCaseBuilder()
+        {
+            ITestCaseBuilder mockBuilder = Substitute.For<ITestCaseBuilder>();
+            mockBuilder.CanBuildFrom(null).Returns(true);
+
+            IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
+            ep.Install(mockBuilder);
+            ITestCaseBuilder builders = (ITestCaseBuilder)ep;
+            builders.BuildFrom(null);
+
+            mockBuilder.Received().BuildFrom(null);
+        }
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+        public void CanAddTestCaseBuilder2()
+        {
+            ITestCaseBuilder2 mockBuilder = Substitute.For<ITestCaseBuilder2>();
+            mockBuilder.CanBuildFrom(null, null).Returns(true);
+
+            IExtensionPoint ep = host.GetExtensionPoint("TestCaseBuilders");
+            ep.Install(mockBuilder);
+            ITestCaseBuilder2 builders = (ITestCaseBuilder2)ep;
+            builders.BuildFrom(null, null);
+
+            mockBuilder.Received().BuildFrom(null, null);
+        }
+
+        [Test, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+		public void CanAddEventListener()
+		{
+            EventListener mockListener = Substitute.For<EventListener>();
+
+			IExtensionPoint ep = host.GetExtensionPoint("EventListeners");
+			ep.Install( mockListener );
+			EventListener listeners = (EventListener)ep;
+
+			listeners.RunStarted( "test", 0 );
+            mockListener.Received().RunStarted("test", 0);
+
+			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 dc3b64f..a466739 100644
--- a/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
+++ b/src/NUnitCore/tests/CultureSettingAndDetectionTests.cs
@@ -1,163 +1,163 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Globalization;
-using NUnit.Framework;
-using NUnit.TestData.CultureAttributeTests;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for CultureDetectionTests.
-	/// </summary>
-	[TestFixture]
-	public class CultureSettingAndDetectionTests
-	{
-		private CultureDetector detector = new CultureDetector("fr-FR");
-
-		private void ExpectMatch( string culture )
-		{
-			if ( !detector.IsCultureSupported( culture ) )
-				Assert.Fail( string.Format( "Failed to match \"{0}\"" , culture ) );
-		}
-
-		private void ExpectMatch( CultureAttribute attr )
-		{
-			if ( !detector.IsCultureSupported( attr ) )
-				Assert.Fail( string.Format( "Failed to match attribute with Include=\"{0}\",Exclude=\"{1}\"", attr.Include, attr.Exclude ) );
-		}
-
-		private void ExpectFailure( string culture )
-		{
-			if ( detector.IsCultureSupported( culture ) )
-				Assert.Fail( string.Format( "Should not match \"{0}\"" , culture ) );
-			Assert.AreEqual( "Only supported under culture " + culture, detector.Reason );
-		}
-
-		private void ExpectFailure( CultureAttribute attr, string msg )
-		{
-			if ( detector.IsCultureSupported( attr ) )
-				Assert.Fail( string.Format( "Should not match attribute with Include=\"{0}\",Exclude=\"{1}\"",
-					attr.Include, attr.Exclude ) );
-			Assert.AreEqual( msg, detector.Reason );
-		}
-
-		[Test]
-		public void CanMatchStrings()
-		{
-			ExpectMatch( "fr-FR" );
-			ExpectMatch( "fr" );
-			ExpectMatch( "fr-FR,fr-BE,fr-CA" );
-			ExpectMatch( "en,de,fr,it" );
-			ExpectFailure( "en-GB" );
-			ExpectFailure( "en" );
-			ExpectFailure( "fr-CA" );
-			ExpectFailure( "fr-BE,fr-CA" );
-			ExpectFailure( "en,de,it" );
-		}
-
-		[Test]
-		public void CanMatchAttributeWithInclude()
-		{
-			ExpectMatch( new CultureAttribute( "fr-FR" ) );
-			ExpectMatch( new CultureAttribute( "fr-FR,fr-BE,fr-CA" ) );
-			ExpectFailure( new CultureAttribute( "en" ), "Only supported under culture en" );
-			ExpectFailure( new CultureAttribute( "en,de,it" ), "Only supported under culture en,de,it" );
-		}
-
-		[Test]
-		public void CanMatchAttributeWithExclude()
-		{
-			CultureAttribute attr = new CultureAttribute();
-			attr.Exclude = "en";
-			ExpectMatch( attr );
-			attr.Exclude = "en,de,it";
-			ExpectMatch( attr );
-			attr.Exclude = "fr";
-			ExpectFailure( attr, "Not supported under culture fr");
-			attr.Exclude = "fr-FR,fr-BE,fr-CA";
-			ExpectFailure( attr, "Not supported under culture fr-FR,fr-BE,fr-CA" );
-		}
-
-		[Test]
-		public void CanMatchAttributeWithIncludeAndExclude()
-		{
-			CultureAttribute attr = new CultureAttribute( "en,fr,de,it" );
-			attr.Exclude="fr-CA,fr-BE";
-			ExpectMatch( attr );
-			attr.Exclude = "fr-FR";
-			ExpectFailure( attr, "Not supported under culture fr-FR" );
-		}
-
-		[Test,SetCulture("fr-FR")]
-		public void LoadWithFrenchCulture()
-		{
-			Assert.AreEqual( "fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly" );
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( FixtureWithCultureAttribute ) );
-			Assert.AreEqual( RunState.Runnable, fixture.RunState, "Fixture" );
-			foreach( Test test in fixture.Tests )
-			{
-				RunState expected = test.TestName.Name == "FrenchTest" ? RunState.Runnable : RunState.Skipped;
-				Assert.AreEqual( expected, test.RunState, test.TestName.Name );
-			}
-		}
-
-		[Test,SetCulture("fr-CA")]
-		public void LoadWithFrenchCanadianCulture()
-		{
-			Assert.AreEqual( "fr-CA", CultureInfo.CurrentCulture.Name, "Culture not set correctly" );
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( FixtureWithCultureAttribute ) );
-			Assert.AreEqual( RunState.Runnable, fixture.RunState, "Fixture" );
-			foreach( Test test in fixture.Tests )
-			{
-				RunState expected = test.TestName.Name.StartsWith( "French" ) ? RunState.Runnable : RunState.Skipped;
-				Assert.AreEqual( expected, test.RunState, test.TestName.Name );
-			}
-		}
-
-		[Test,SetCulture("ru-RU")]
-		public void LoadWithRussianCulture()
-		{
-			Assert.AreEqual( "ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly" );
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( FixtureWithCultureAttribute ) );
-			Assert.AreEqual( RunState.Skipped, fixture.RunState, "Fixture" );
-			foreach( Test test in fixture.Tests )
-				Assert.AreEqual( RunState.Skipped, test.RunState, test.TestName.Name );
-		}
-
-		[Test]
-		public void SettingInvalidCultureGivesError()
-		{
-			TestResult result = TestBuilder.RunTestCase( typeof( InvalidCultureFixture ), "InvalidCultureSet" );
-			Assert.AreEqual( ResultState.Error, result.ResultState );
-
-            Assert.That(result.Message, Text.StartsWith("System.ArgumentException").Or.StartsWith("System.Globalization.CultureNotFoundException"));
-            Assert.That(result.Message, Text.Contains("xx-XX").IgnoreCase);
-		}
-
-		[TestFixture, SetCulture("en-GB")]
-		public class NestedFixture
-		{
-			[Test]
-			public void CanSetCultureOnFixture()
-			{
-				Assert.AreEqual( "en-GB", CultureInfo.CurrentCulture.Name );
-			}
-		}
-
-#if CLR_2_0 || CLR_4_0
-        [Test, SetCulture("de-DE")]
-        [TestCase(Result="01.06.2010 00:00:00")]
-        public string UseWithParameterizedTest()
-        {
-            return new DateTime(2010, 6, 1).ToString();
-        }
-#endif
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Globalization;
+using NUnit.Framework;
+using NUnit.TestData.CultureAttributeTests;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for CultureDetectionTests.
+	/// </summary>
+	[TestFixture]
+	public class CultureSettingAndDetectionTests
+	{
+		private CultureDetector detector = new CultureDetector("fr-FR");
+
+		private void ExpectMatch( string culture )
+		{
+			if ( !detector.IsCultureSupported( culture ) )
+				Assert.Fail( string.Format( "Failed to match \"{0}\"" , culture ) );
+		}
+
+		private void ExpectMatch( CultureAttribute attr )
+		{
+			if ( !detector.IsCultureSupported( attr ) )
+				Assert.Fail( string.Format( "Failed to match attribute with Include=\"{0}\",Exclude=\"{1}\"", attr.Include, attr.Exclude ) );
+		}
+
+		private void ExpectFailure( string culture )
+		{
+			if ( detector.IsCultureSupported( culture ) )
+				Assert.Fail( string.Format( "Should not match \"{0}\"" , culture ) );
+			Assert.AreEqual( "Only supported under culture " + culture, detector.Reason );
+		}
+
+		private void ExpectFailure( CultureAttribute attr, string msg )
+		{
+			if ( detector.IsCultureSupported( attr ) )
+				Assert.Fail( string.Format( "Should not match attribute with Include=\"{0}\",Exclude=\"{1}\"",
+					attr.Include, attr.Exclude ) );
+			Assert.AreEqual( msg, detector.Reason );
+		}
+
+		[Test]
+		public void CanMatchStrings()
+		{
+			ExpectMatch( "fr-FR" );
+			ExpectMatch( "fr" );
+			ExpectMatch( "fr-FR,fr-BE,fr-CA" );
+			ExpectMatch( "en,de,fr,it" );
+			ExpectFailure( "en-GB" );
+			ExpectFailure( "en" );
+			ExpectFailure( "fr-CA" );
+			ExpectFailure( "fr-BE,fr-CA" );
+			ExpectFailure( "en,de,it" );
+		}
+
+		[Test]
+		public void CanMatchAttributeWithInclude()
+		{
+			ExpectMatch( new CultureAttribute( "fr-FR" ) );
+			ExpectMatch( new CultureAttribute( "fr-FR,fr-BE,fr-CA" ) );
+			ExpectFailure( new CultureAttribute( "en" ), "Only supported under culture en" );
+			ExpectFailure( new CultureAttribute( "en,de,it" ), "Only supported under culture en,de,it" );
+		}
+
+		[Test]
+		public void CanMatchAttributeWithExclude()
+		{
+			CultureAttribute attr = new CultureAttribute();
+			attr.Exclude = "en";
+			ExpectMatch( attr );
+			attr.Exclude = "en,de,it";
+			ExpectMatch( attr );
+			attr.Exclude = "fr";
+			ExpectFailure( attr, "Not supported under culture fr");
+			attr.Exclude = "fr-FR,fr-BE,fr-CA";
+			ExpectFailure( attr, "Not supported under culture fr-FR,fr-BE,fr-CA" );
+		}
+
+		[Test]
+		public void CanMatchAttributeWithIncludeAndExclude()
+		{
+			CultureAttribute attr = new CultureAttribute( "en,fr,de,it" );
+			attr.Exclude="fr-CA,fr-BE";
+			ExpectMatch( attr );
+			attr.Exclude = "fr-FR";
+			ExpectFailure( attr, "Not supported under culture fr-FR" );
+		}
+
+		[Test,SetCulture("fr-FR")]
+		public void LoadWithFrenchCulture()
+		{
+			Assert.AreEqual( "fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly" );
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( FixtureWithCultureAttribute ) );
+			Assert.AreEqual( RunState.Runnable, fixture.RunState, "Fixture" );
+			foreach( Test test in fixture.Tests )
+			{
+				RunState expected = test.TestName.Name == "FrenchTest" ? RunState.Runnable : RunState.Skipped;
+				Assert.AreEqual( expected, test.RunState, test.TestName.Name );
+			}
+		}
+
+		[Test,SetCulture("fr-CA")]
+		public void LoadWithFrenchCanadianCulture()
+		{
+			Assert.AreEqual( "fr-CA", CultureInfo.CurrentCulture.Name, "Culture not set correctly" );
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( FixtureWithCultureAttribute ) );
+			Assert.AreEqual( RunState.Runnable, fixture.RunState, "Fixture" );
+			foreach( Test test in fixture.Tests )
+			{
+				RunState expected = test.TestName.Name.StartsWith( "French" ) ? RunState.Runnable : RunState.Skipped;
+				Assert.AreEqual( expected, test.RunState, test.TestName.Name );
+			}
+		}
+
+		[Test,SetCulture("ru-RU")]
+		public void LoadWithRussianCulture()
+		{
+			Assert.AreEqual( "ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly" );
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( FixtureWithCultureAttribute ) );
+			Assert.AreEqual( RunState.Skipped, fixture.RunState, "Fixture" );
+			foreach( Test test in fixture.Tests )
+				Assert.AreEqual( RunState.Skipped, test.RunState, test.TestName.Name );
+		}
+
+		[Test]
+		public void SettingInvalidCultureGivesError()
+		{
+			TestResult result = TestBuilder.RunTestCase( typeof( InvalidCultureFixture ), "InvalidCultureSet" );
+			Assert.AreEqual( ResultState.Error, result.ResultState );
+
+            Assert.That(result.Message, Text.StartsWith("System.ArgumentException").Or.StartsWith("System.Globalization.CultureNotFoundException"));
+            Assert.That(result.Message, Text.Contains("xx-XX").IgnoreCase);
+		}
+
+		[TestFixture, SetCulture("en-GB")]
+		public class NestedFixture
+		{
+			[Test]
+			public void CanSetCultureOnFixture()
+			{
+				Assert.AreEqual( "en-GB", CultureInfo.CurrentCulture.Name );
+			}
+		}
+
+#if CLR_2_0 || CLR_4_0
+        [Test, SetCulture("de-DE")]
+        [TestCase(Result="01.06.2010 00:00:00")]
+        public string UseWithParameterizedTest()
+        {
+            return new DateTime(2010, 6, 1).ToString();
+        }
+#endif
+	}
+}
diff --git a/src/NUnitCore/tests/DatapointTests.cs b/src/NUnitCore/tests/DatapointTests.cs
index c524c5f..c170f2d 100644
--- a/src/NUnitCore/tests/DatapointTests.cs
+++ b/src/NUnitCore/tests/DatapointTests.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// 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;
-using NUnit.TestData.DatapointFixture;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-    public class DatapointTests
-    {
-        private void RunTestOnFixture(Type fixtureType)
-        {
-            TestResult result = TestBuilder.RunTestFixture(fixtureType);
-            NUnit.Util.ResultSummarizer summary = new NUnit.Util.ResultSummarizer(result);
-            Assert.That(summary.Passed, Is.EqualTo(2));
-            Assert.That(summary.Inconclusive, Is.EqualTo(3));
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Success));
-        }
-
-        [Test]
-        public void WorksOnField()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Field_Double));
-        }
-
-        [Test]
-        public void WorksOnArray()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Field_ArrayOfDouble));
-        }
-
-        [Test]
-        public void WorksOnPropertyReturningArray()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Property_ArrayOfDouble));
-        }
-
-        [Test]
-        public void WorksOnMethodReturningArray()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Method_ArrayOfDouble));
-        }
-
-#if CLR_2_0 || CLR_4_0 
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void WorksOnIEnumerableOfT()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Field_IEnumerableOfDouble));
-        }
-
-        [Test]
-        public void WorksOnPropertyReturningIEnumerableOfT()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Property_IEnumerableOfDouble));
-        }
-
-        [Test]
-        public void WorksOnMethodReturningIEnumerableOfT()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Method_IEnumerableOfDouble));
-        }
-
-        [Test]
-        public void WorksOnIteratorReturningIEnumerableOfT()
-        {
-            RunTestOnFixture(typeof(SquareRootTest_Iterator_IEnumerableOfDouble));
-        }
-#endif
-#endif
-    }
-}
+// ****************************************************************
+// 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;
+using NUnit.TestData.DatapointFixture;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    public class DatapointTests
+    {
+        private void RunTestOnFixture(Type fixtureType)
+        {
+            TestResult result = TestBuilder.RunTestFixture(fixtureType);
+            NUnit.Util.ResultSummarizer summary = new NUnit.Util.ResultSummarizer(result);
+            Assert.That(summary.Passed, Is.EqualTo(2));
+            Assert.That(summary.Inconclusive, Is.EqualTo(3));
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Success));
+        }
+
+        [Test]
+        public void WorksOnField()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Field_Double));
+        }
+
+        [Test]
+        public void WorksOnArray()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Field_ArrayOfDouble));
+        }
+
+        [Test]
+        public void WorksOnPropertyReturningArray()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Property_ArrayOfDouble));
+        }
+
+        [Test]
+        public void WorksOnMethodReturningArray()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Method_ArrayOfDouble));
+        }
+
+#if CLR_2_0 || CLR_4_0 
+#if CS_3_0 || CS_4_0 || CS_5_0
+        [Test]
+        public void WorksOnIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Field_IEnumerableOfDouble));
+        }
+
+        [Test]
+        public void WorksOnPropertyReturningIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Property_IEnumerableOfDouble));
+        }
+
+        [Test]
+        public void WorksOnMethodReturningIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Method_IEnumerableOfDouble));
+        }
+
+        [Test]
+        public void WorksOnIteratorReturningIEnumerableOfT()
+        {
+            RunTestOnFixture(typeof(SquareRootTest_Iterator_IEnumerableOfDouble));
+        }
+#endif
+#endif
+    }
+}
diff --git a/src/NUnitCore/tests/DirectoryChangeTests.cs b/src/NUnitCore/tests/DirectoryChangeTests.cs
index 048ef31..ddafc29 100644
--- a/src/NUnitCore/tests/DirectoryChangeTests.cs
+++ b/src/NUnitCore/tests/DirectoryChangeTests.cs
@@ -1,26 +1,26 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.TestData;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class DirectoryChangeTests
-	{
-		[Test]
-		public void ChangingCurrentDirectoryGivesWarning()
-		{
-			TestResult result = TestBuilder.RunTestCase(typeof(DirectoryChangeFixture), "ChangeCurrentDirectory");
-			Assert.AreEqual(ResultState.Success, result.ResultState);
-			Assert.AreEqual("Warning: Test changed the CurrentDirectory", result.Message);
-		}
-	}
-}
-
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class DirectoryChangeTests
+	{
+		[Test]
+		public void ChangingCurrentDirectoryGivesWarning()
+		{
+			TestResult result = TestBuilder.RunTestCase(typeof(DirectoryChangeFixture), "ChangeCurrentDirectory");
+			Assert.AreEqual(ResultState.Success, result.ResultState);
+			Assert.AreEqual("Warning: Test changed the CurrentDirectory", result.Message);
+		}
+	}
+}
+
diff --git a/src/NUnitCore/tests/DirectorySwapperTests.cs b/src/NUnitCore/tests/DirectorySwapperTests.cs
index d8b3836..5461b84 100644
--- a/src/NUnitCore/tests/DirectorySwapperTests.cs
+++ b/src/NUnitCore/tests/DirectorySwapperTests.cs
@@ -1,58 +1,58 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.IO;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Tests of the DirectorySwapper class
-	/// </summary>
-	[TestFixture]
-	public class DirectorySwapperTests
-	{
-		private string thisDirectory;
-		private string driveRoot;
-		
-		[SetUp]
-		public void Init()
-		{
-			thisDirectory = Environment.CurrentDirectory;
-			driveRoot = Path.GetPathRoot( thisDirectory );
-		}
-
-		[TearDown]
-		public void Cleanup()
-		{
-			Environment.CurrentDirectory = thisDirectory;
-		}
-
-		[Test]
-		public void ChangeAndRestore()
-		{
-			using( new DirectorySwapper() )
-			{
-				Assert.AreEqual( thisDirectory, Environment.CurrentDirectory );
-				Environment.CurrentDirectory = driveRoot;
-				Assert.AreEqual( driveRoot, Environment.CurrentDirectory );
-			}
-
-			Assert.AreEqual( thisDirectory, Environment.CurrentDirectory );
-		}
-
-		[Test]
-		public void SwapAndRestore()
-		{
-			using( new DirectorySwapper( driveRoot ) )
-			{
-				Assert.AreEqual( driveRoot, Environment.CurrentDirectory );
-			}
-
-			Assert.AreEqual( thisDirectory, Environment.CurrentDirectory );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Tests of the DirectorySwapper class
+	/// </summary>
+	[TestFixture]
+	public class DirectorySwapperTests
+	{
+		private string thisDirectory;
+		private string driveRoot;
+		
+		[SetUp]
+		public void Init()
+		{
+			thisDirectory = Environment.CurrentDirectory;
+			driveRoot = Path.GetPathRoot( thisDirectory );
+		}
+
+		[TearDown]
+		public void Cleanup()
+		{
+			Environment.CurrentDirectory = thisDirectory;
+		}
+
+		[Test]
+		public void ChangeAndRestore()
+		{
+			using( new DirectorySwapper() )
+			{
+				Assert.AreEqual( thisDirectory, Environment.CurrentDirectory );
+				Environment.CurrentDirectory = driveRoot;
+				Assert.AreEqual( driveRoot, Environment.CurrentDirectory );
+			}
+
+			Assert.AreEqual( thisDirectory, Environment.CurrentDirectory );
+		}
+
+		[Test]
+		public void SwapAndRestore()
+		{
+			using( new DirectorySwapper( driveRoot ) )
+			{
+				Assert.AreEqual( driveRoot, Environment.CurrentDirectory );
+			}
+
+			Assert.AreEqual( thisDirectory, Environment.CurrentDirectory );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/EventQueueTests.cs b/src/NUnitCore/tests/EventQueueTests.cs
index ee7dfef..feadfd8 100644
--- a/src/NUnitCore/tests/EventQueueTests.cs
+++ b/src/NUnitCore/tests/EventQueueTests.cs
@@ -1,626 +1,626 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Diagnostics;
-using System.IO;
-using System.Threading;
-using NUnit.Core.Extensibility;
-using NUnit.Framework;
-
-using ThreadState = System.Threading.ThreadState;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for EventQueueTests.
-	/// </summary>
-    [TestFixture]
-    public class EventQueueTests
-    {
-        static readonly Event[] events = {
-				new RunStartedEvent( string.Empty, 0 ),
-				new SuiteStartedEvent( null ),
-                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Log )),
-				new TestStartedEvent( null ),
-                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Out )),
-				new TestFinishedEvent( null ),
-                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Trace )),
-				new SuiteFinishedEvent( null ),
-				new RunFinishedEvent( (TestResult)null )
-			};
-
-        private static void EnqueueEvents(EventQueue q)
-        {
-            foreach (Event e in events)
-                q.Enqueue(e);
-        }
-
-        private static void SendEvents(EventListener el)
-        {
-            foreach (Event e in events)
-                e.Send(el);
-        }
-
-        private static void VerifyQueue(EventQueue q)
-        {
-            for (int index = 0; index < events.Length; index++)
-            {
-                Event e = q.Dequeue(false);
-                Assert.AreEqual(events[index].GetType(), e.GetType(),
-                    string.Format("Event {0}", index));
-            }
-        }
-
-        private static void StartPump(EventPump pump, int waitTime)
-        {
-            pump.Start();
-            WaitForPumpToStart(pump, waitTime);
-        }
-
-        private static void StopPump(EventPump pump, int waitTime)
-        {
-            pump.Stop();
-            WaitForPumpToStop(pump, waitTime);
-        }
-
-        private static void WaitForPumpToStart(EventPump pump, int waitTime)
-        {
-            while (waitTime > 0 && pump.PumpState != EventPumpState.Pumping)
-            {
-                Thread.Sleep(100);
-                waitTime -= 100;
-            }
-        }
-
-        private static void WaitForPumpToStop(EventPump pump, int waitTime)
-        {
-            while (waitTime > 0 && pump.PumpState != EventPumpState.Stopped)
-            {
-                Thread.Sleep(100);
-                waitTime -= 100;
-            }
-        }
-
-        #region EventQueue tests
-
-        [Test]
-        public void QueueEvents()
-        {
-            EventQueue q = new EventQueue();
-            EnqueueEvents(q);
-            VerifyQueue(q);
-        }
-
-         [Test]
-        public void DequeueEmpty()
-        {
-            EventQueue q = new EventQueue();
-            Assert.IsNull(q.Dequeue(false));
-        }
-
-        [TestFixture]
-        public class DequeueBlocking_StopTest : ProducerConsumerTest
-        {
-            private EventQueue q;
-            private volatile int receivedEvents;
-
-            [Test]
-            [Timeout(1000)]
-            public void DequeueBlocking_Stop()
-            {
-                this.q = new EventQueue();
-                this.receivedEvents = 0;
-                this.RunProducerConsumer();
-                Assert.AreEqual(events.Length + 1, this.receivedEvents);
-            }
-
-            protected override void Producer()
-            {
-                EnqueueEvents(this.q);
-                while (this.receivedEvents < events.Length)
-                {
-                    Thread.Sleep(30);
-                }
-
-                this.q.Stop();
-            }
-
-            protected override void Consumer()
-            {
-                Event e;
-                do
-                {
-                    e = this.q.Dequeue(true);
-                    this.receivedEvents++;
-                    Thread.MemoryBarrier();
-                }
-                while (e != null);
-            }
-        }
-
-        [TestFixture]
-        public class SetWaitHandle_Enqueue_SynchronousTest : ProducerConsumerTest
-        {
-            private EventQueue q;
-            private AutoResetEvent waitHandle;
-            private volatile bool afterEnqueue;
-
-            [Test]
-            [Timeout(1000)]
-            public void SetWaitHandle_Enqueue_Synchronous()
-            {
-                using (this.waitHandle = new AutoResetEvent(false))
-                {
-                    this.q = new EventQueue();
-                    this.q.SetWaitHandleForSynchronizedEvents(this.waitHandle);
-                    this.afterEnqueue = false;
-                    this.RunProducerConsumer();
-                }
-            }
-
-            protected override void Producer()
-            {
-                Event synchronousEvent = new RunStartedEvent(string.Empty, 0);
-                Assert.IsTrue(synchronousEvent.IsSynchronous);
-                this.q.Enqueue(synchronousEvent);
-                this.afterEnqueue = true;
-                Thread.MemoryBarrier();
-            }
-
-            protected override void Consumer()
-            {
-                this.q.Dequeue(true);
-                Thread.Sleep(30);
-                Assert.IsFalse(this.afterEnqueue);
-                this.waitHandle.Set();
-                Thread.Sleep(30);
-                Assert.IsTrue(this.afterEnqueue);
-            }
-        }
-
-        [TestFixture]
-        public class SetWaitHandle_Enqueue_AsynchronousTest : ProducerConsumerTest
-        {
-            private EventQueue q;
-            private volatile bool afterEnqueue;
-
-            [Test]
-            [Timeout(1000)]
-            public void SetWaitHandle_Enqueue_Asynchronous()
-            {
-                using (AutoResetEvent waitHandle = new AutoResetEvent(false))
-                {
-                    this.q = new EventQueue();
-                    this.q.SetWaitHandleForSynchronizedEvents(waitHandle);
-                    this.afterEnqueue = false;
-                    this.RunProducerConsumer();
-                }
-            }
-
-            protected override void Producer()
-            {
-                Event asynchronousEvent = new OutputEvent(new TestOutput(string.Empty, TestOutputType.Trace));
-                Assert.IsFalse(asynchronousEvent.IsSynchronous);
-                this.q.Enqueue(asynchronousEvent);
-                this.afterEnqueue = true;
-                Thread.MemoryBarrier();
-            }
-
-            protected override void Consumer()
-            {
-                this.q.Dequeue(true);
-                Thread.Sleep(30);
-                Assert.IsTrue(this.afterEnqueue);
-            }
-        }
-
-        #endregion EventQueue tests
-
-        #region QueuingEventListener tests
-
-        [Test]
-        public void SendEvents()
-        {
-            QueuingEventListener el = new QueuingEventListener();
-            SendEvents(el);
-            VerifyQueue(el.Events);
-        }
-
-        #endregion
-
-        #region EventPump tests
-
-        [Test]
-        public void StartAndStopPumpOnEmptyQueue()
-        {
-            EventQueue q = new EventQueue();
-            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
-            {
-                pump.Name = "StartAndStopPumpOnEmptyQueue";
-                StartPump(pump, 1000);
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
-                StopPump(pump, 1000);
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-            }
-        }
-
-        [Test]
-        public void PumpAutoStopsOnRunFinished()
-        {
-            EventQueue q = new EventQueue();
-            using (EventPump pump = new EventPump(NullListener.NULL, q, true))
-            {
-                pump.Name = "PumpAutoStopsOnRunFinished";
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-                StartPump(pump, 1000);
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
-                q.Enqueue(new RunFinishedEvent(new Exception()));
-                WaitForPumpToStop(pump, 1000);
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-            }
-        }
-
-        [Test]
-        [Timeout(3000)]
-        public void PumpEvents()
-        {
-            EventQueue q = new EventQueue();
-            QueuingEventListener el = new QueuingEventListener();
-            using (EventPump pump = new EventPump(el, q, false))
-            {
-                pump.Name = "PumpEvents";
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-                StartPump(pump, 1000);
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
-                EnqueueEvents(q);
-                StopPump(pump, 1000);
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-            }
-            VerifyQueue(el.Events);
-        }
-
-        [Test]
-        [Timeout(2000)]
-        public void PumpEventsWithAutoStop()
-        {
-             EventQueue q = new EventQueue();
-            QueuingEventListener el = new QueuingEventListener();
-            using (EventPump pump = new EventPump(el, q, true))
-            {
-                pump.Name = "PumpEventsWithAutoStop";
-                pump.Start();
-                EnqueueEvents(q);
-                int tries = 10;
-                while (--tries > 0 && q.Count > 0)
-                {
-                    Thread.Sleep(100);
-                }
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-            }
-        }
-
-        [Test]
-        [Timeout(2000)]
-        public void PumpPendingEventsAfterAutoStop()
-        {
-            EventQueue q = new EventQueue();
-            EnqueueEvents(q);
-            Event[] eventsAfterStop =
-            {
-                new OutputEvent(new TestOutput("foo", TestOutputType.Out)),
-                new OutputEvent(new TestOutput("bar", TestOutputType.Trace)),
-            };
-            foreach (Event e in eventsAfterStop)
-            {
-                q.Enqueue(e);
-            }
-
-            QueuingEventListener el = new QueuingEventListener();
-            using (EventPump pump = new EventPump(el, q, true))
-            {
-                pump.Name = "PumpPendingEventsAfterAutoStop";
-                pump.Start();
-                int tries = 10;
-                while (--tries > 0 && q.Count > 0)
-                {
-                    Thread.Sleep(100);
-                }
-
-                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
-            }
-            Assert.That(el.Events.Count, Is.EqualTo(events.Length + eventsAfterStop.Length));
-        }
-
-        [Test]
-        [Timeout(1000)]
-        public void PumpSynchronousAndAsynchronousEvents()
-        {
-            EventQueue q = new EventQueue();
-            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
-            {
-                pump.Name = "PumpSynchronousAndAsynchronousEvents";
-                pump.Start();
-
-                int numberOfAsynchronousEvents = 0;
-                int sumOfAsynchronousQueueLength = 0;
-                const int Repetitions = 2;
-                for (int i = 0; i < Repetitions; i++)
-                {
-                    foreach (Event e in events)
-                    {
-                        q.Enqueue(e);
-                        if (e.IsSynchronous)
-                        {
-                            Assert.That(q.Count, Is.EqualTo(0));
-                        }
-                        else
-                        {
-                            sumOfAsynchronousQueueLength += q.Count;
-                            numberOfAsynchronousEvents++;
-                        }
-                    }
-                }
-
-                Console.WriteLine("Average queue length: {0}", (float)sumOfAsynchronousQueueLength / numberOfAsynchronousEvents);
-            }
-        }
-
-        /// <summary>
-        /// Verifies that when
-        /// (1) Traces are captured and fed into the EventListeners, and
-        /// (2) an EventListener writes Traces,
-        /// the Trace / EventPump / EventListener do not deadlock.
-        /// </summary>
-        /// <remarks>
-        /// This mainly simulates the object structure created by RemoteTestRunner.Run.
-        /// </remarks>
-        [Test]
-        [Timeout(1000)]
-        public void TracingEventListenerDoesNotDeadlock()
-        {
-            QueuingEventListener upstreamListener = new QueuingEventListener();
-            EventQueue upstreamListenerQueue = upstreamListener.Events;
-
-            // Install a TraceListener sending TestOutput events to the upstreamListener.
-            // This simulates RemoteTestRunner.StartTextCapture, where TestContext installs such a TraceListener.
-            TextWriter traceWriter = new EventListenerTextWriter(upstreamListener, TestOutputType.Trace);
-            const string TraceListenerName = "TracingEventListenerDoesNotDeadlock";
-            TraceListener feedingTraceToUpstreamListener = new TextWriterTraceListener(traceWriter, TraceListenerName);
-
-            try
-            {
-                Trace.Listeners.Add(feedingTraceToUpstreamListener);
-
-                // downstreamListenerToTrace simulates an EventListener installed e.g. by an Addin, 
-                // which may call Trace within the EventListener methods:
-                TracingEventListener downstreamListenerToTrace = new TracingEventListener();
-                using (EventPump pump = new EventPump(downstreamListenerToTrace, upstreamListenerQueue, false))
-                {
-                    pump.Name = "TracingEventListenerDoesNotDeadlock";
-                    pump.Start();
-
-                    const int Repetitions = 10;
-                    for (int i = 0; i < Repetitions; i++)
-                    {
-                        foreach (Event e in events)
-                        {
-                            Trace.WriteLine("Before sending {0} event.", e.GetType().Name);
-                            e.Send(upstreamListener);
-                            Trace.WriteLine("After sending {0} event.", e.GetType().Name);
-                        }
-                    }
-                }
-            }
-            finally
-            {
-                Trace.Listeners.Remove(TraceListenerName);
-                feedingTraceToUpstreamListener.Dispose();
-            }
-        }
-
-        /// <summary> 
-        /// Floods the queue of an EventPump with multiple concurrent event producers.
-        /// Prints the maximum queue length to Console, but does not implement an
-        /// oracle on what the maximum queue length should be.
-        /// </summary>
-        /// <param name="numberOfProducers">The number of concurrent producer threads.</param>
-        /// <param name="producerDelay">
-        /// If <c>true</c>, the producer threads slow down by adding a short delay time.
-        /// </param>
-        [TestCase(1, false)]
-        [TestCase(5, true)]
-        [TestCase(5, false)]
-        [Explicit("Takes several seconds. Just prints the queue length of the EventPump to Console, but has no oracle regarding this.")]
-        public void EventPumpQueueLength(int numberOfProducers, bool producerDelay)
-        {
-            EventQueue q = new EventQueue();
-            EventProducer[] producers = new EventProducer[numberOfProducers];
-            for (int i = 0; i < numberOfProducers; i++)
-            {
-                producers[i] = new EventProducer(q, i, producerDelay);
-            }
-
-            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
-            {
-                pump.Name = "EventPumpQueueLength";
-                pump.Start();
-
-                foreach (EventProducer p in producers)
-                {
-                    p.ProducerThread.Start();
-                }
-                foreach (EventProducer p in producers)
-                {
-                    p.ProducerThread.Join();
-                }
-                pump.Stop();
-            }
-            Assert.That(q.Count, Is.EqualTo(0));
-
-            foreach (EventProducer p in producers)
-            {
-                Console.WriteLine(
-                    "#Events: {0}, MaxQueueLength: {1}", p.SentEventsCount, p.MaxQueueLength);
-                Assert.IsNull(p.Exception, "{0}", p.Exception);
-            }
-        }
-
-        #endregion
-    
-        public abstract class ProducerConsumerTest
-        {
-            private volatile Exception myConsumerException;
-
-            protected void RunProducerConsumer()
-            {
-                this.myConsumerException = null;
-                Thread consumerThread = new Thread(new ThreadStart(this.ConsumerThreadWrapper));
-                try
-                {
-                    consumerThread.Start();
-                    this.Producer();
-                    bool consumerStopped = consumerThread.Join(1000);
-                    Assert.IsTrue(consumerStopped);
-                }
-                finally
-                {
-                    ThreadUtility.Kill(consumerThread);
-                }
-
-                Assert.IsNull(this.myConsumerException);
-            }
-
-            protected abstract void Producer();
-
-            protected abstract void Consumer();
-
-            private void ConsumerThreadWrapper()
-            {
-                try
-                {
-                    this.Consumer();
-                }
-                catch (ThreadAbortException)
-                {
-                    Thread.ResetAbort();
-                }
-                catch (Exception ex)
-                {
-                    this.myConsumerException = ex;
-                }
-            }
-        }
-
-        private class EventProducer
-        {
-            public readonly Thread ProducerThread;
-            public int SentEventsCount;
-            public int MaxQueueLength;
-            public Exception Exception;
-            private readonly EventQueue queue;
-            private readonly bool delay;
-
-            public EventProducer(EventQueue q, int id, bool delay)
-            {
-                this.queue = q;
-                this.ProducerThread = new Thread(new ThreadStart(this.Produce));
-                this.ProducerThread.Name = this.GetType().FullName + id;
-                this.delay = delay;
-            }
-
-            private void Produce()
-            {
-                try
-                {
-                    Event e = new OutputEvent(new TestOutput(this.ProducerThread.Name, TestOutputType.Log));
-                    DateTime start = DateTime.Now;
-                    while (DateTime.Now - start <= TimeSpan.FromSeconds(3))
-                    {
-                        this.queue.Enqueue(e);
-                        this.SentEventsCount++;
-                        this.MaxQueueLength = Math.Max(this.queue.Count, this.MaxQueueLength);
-
-                        // without Sleep or with just a Sleep(0), the EventPump thread does not keep up and the queue gets very long
-                        if (this.delay)
-                        {
-                            Thread.Sleep(1);
-                        }
-                    }
-                }
-                catch (Exception ex)
-                {
-                    this.Exception = ex;
-                }
-            }
-        }
-
-        private class TracingEventListener : EventListener
-        {
-            #region EventListener Members
-            public void RunStarted(string name, int testCount)
-            {
-                WriteTrace("RunStarted({0},{1})", name, testCount);
-            }
-
-            public void RunFinished(TestResult result)
-            {
-                WriteTrace("RunFinished({0})", result);
-            }
-
-            public void RunFinished(Exception exception)
-            {
-                WriteTrace("RunFinished({0})", exception);
-            }
-
-            public void TestStarted(TestName testName)
-            {
-                WriteTrace("TestStarted({0})", testName);
-            }
-
-            public void TestFinished(TestResult result)
-            {
-                WriteTrace("TestFinished({0})", result);
-            }
-
-            public void SuiteStarted(TestName testName)
-            {
-                WriteTrace("SuiteStarted({0})", testName);
-            }
-
-            public void SuiteFinished(TestResult result)
-            {
-                WriteTrace("SuiteFinished({0})", result);
-            }
-
-            public void UnhandledException(Exception exception)
-            {
-                WriteTrace("UnhandledException({0})", exception);
-            }
-
-            public void TestOutput(TestOutput testOutput)
-            {
-                if (testOutput.Type != TestOutputType.Trace)
-                {
-                    WriteTrace("TestOutput {0}: '{1}'", testOutput.Type, testOutput.Text);
-                }
-            }
-            #endregion
-
-#if CLR_2_0 || CLR_4_0
-            private static void WriteTrace(string message, params object[] args)
-            {
-                Trace.TraceInformation(message, args);
-            }
-#else
-            private static void WriteTrace(string message, params object[] args)
-            {
-                Trace.WriteLine(string.Format(message, args));
-            }
-#endif
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Diagnostics;
+using System.IO;
+using System.Threading;
+using NUnit.Core.Extensibility;
+using NUnit.Framework;
+
+using ThreadState = System.Threading.ThreadState;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for EventQueueTests.
+	/// </summary>
+    [TestFixture]
+    public class EventQueueTests
+    {
+        static readonly Event[] events = {
+				new RunStartedEvent( string.Empty, 0 ),
+				new SuiteStartedEvent( null ),
+                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Log )),
+				new TestStartedEvent( null ),
+                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Out )),
+				new TestFinishedEvent( null ),
+                new OutputEvent( new TestOutput( string.Empty, TestOutputType.Trace )),
+				new SuiteFinishedEvent( null ),
+				new RunFinishedEvent( (TestResult)null )
+			};
+
+        private static void EnqueueEvents(EventQueue q)
+        {
+            foreach (Event e in events)
+                q.Enqueue(e);
+        }
+
+        private static void SendEvents(EventListener el)
+        {
+            foreach (Event e in events)
+                e.Send(el);
+        }
+
+        private static void VerifyQueue(EventQueue q)
+        {
+            for (int index = 0; index < events.Length; index++)
+            {
+                Event e = q.Dequeue(false);
+                Assert.AreEqual(events[index].GetType(), e.GetType(),
+                    string.Format("Event {0}", index));
+            }
+        }
+
+        private static void StartPump(EventPump pump, int waitTime)
+        {
+            pump.Start();
+            WaitForPumpToStart(pump, waitTime);
+        }
+
+        private static void StopPump(EventPump pump, int waitTime)
+        {
+            pump.Stop();
+            WaitForPumpToStop(pump, waitTime);
+        }
+
+        private static void WaitForPumpToStart(EventPump pump, int waitTime)
+        {
+            while (waitTime > 0 && pump.PumpState != EventPumpState.Pumping)
+            {
+                Thread.Sleep(100);
+                waitTime -= 100;
+            }
+        }
+
+        private static void WaitForPumpToStop(EventPump pump, int waitTime)
+        {
+            while (waitTime > 0 && pump.PumpState != EventPumpState.Stopped)
+            {
+                Thread.Sleep(100);
+                waitTime -= 100;
+            }
+        }
+
+        #region EventQueue tests
+
+        [Test]
+        public void QueueEvents()
+        {
+            EventQueue q = new EventQueue();
+            EnqueueEvents(q);
+            VerifyQueue(q);
+        }
+
+         [Test]
+        public void DequeueEmpty()
+        {
+            EventQueue q = new EventQueue();
+            Assert.IsNull(q.Dequeue(false));
+        }
+
+        [TestFixture]
+        public class DequeueBlocking_StopTest : ProducerConsumerTest
+        {
+            private EventQueue q;
+            private volatile int receivedEvents;
+
+            [Test]
+            [Timeout(1000)]
+            public void DequeueBlocking_Stop()
+            {
+                this.q = new EventQueue();
+                this.receivedEvents = 0;
+                this.RunProducerConsumer();
+                Assert.AreEqual(events.Length + 1, this.receivedEvents);
+            }
+
+            protected override void Producer()
+            {
+                EnqueueEvents(this.q);
+                while (this.receivedEvents < events.Length)
+                {
+                    Thread.Sleep(30);
+                }
+
+                this.q.Stop();
+            }
+
+            protected override void Consumer()
+            {
+                Event e;
+                do
+                {
+                    e = this.q.Dequeue(true);
+                    this.receivedEvents++;
+                    Thread.MemoryBarrier();
+                }
+                while (e != null);
+            }
+        }
+
+        [TestFixture]
+        public class SetWaitHandle_Enqueue_SynchronousTest : ProducerConsumerTest
+        {
+            private EventQueue q;
+            private AutoResetEvent waitHandle;
+            private volatile bool afterEnqueue;
+
+            [Test]
+            [Timeout(1000)]
+            public void SetWaitHandle_Enqueue_Synchronous()
+            {
+                using (this.waitHandle = new AutoResetEvent(false))
+                {
+                    this.q = new EventQueue();
+                    this.q.SetWaitHandleForSynchronizedEvents(this.waitHandle);
+                    this.afterEnqueue = false;
+                    this.RunProducerConsumer();
+                }
+            }
+
+            protected override void Producer()
+            {
+                Event synchronousEvent = new RunStartedEvent(string.Empty, 0);
+                Assert.IsTrue(synchronousEvent.IsSynchronous);
+                this.q.Enqueue(synchronousEvent);
+                this.afterEnqueue = true;
+                Thread.MemoryBarrier();
+            }
+
+            protected override void Consumer()
+            {
+                this.q.Dequeue(true);
+                Thread.Sleep(30);
+                Assert.IsFalse(this.afterEnqueue);
+                this.waitHandle.Set();
+                Thread.Sleep(30);
+                Assert.IsTrue(this.afterEnqueue);
+            }
+        }
+
+        [TestFixture]
+        public class SetWaitHandle_Enqueue_AsynchronousTest : ProducerConsumerTest
+        {
+            private EventQueue q;
+            private volatile bool afterEnqueue;
+
+            [Test]
+            [Timeout(1000)]
+            public void SetWaitHandle_Enqueue_Asynchronous()
+            {
+                using (AutoResetEvent waitHandle = new AutoResetEvent(false))
+                {
+                    this.q = new EventQueue();
+                    this.q.SetWaitHandleForSynchronizedEvents(waitHandle);
+                    this.afterEnqueue = false;
+                    this.RunProducerConsumer();
+                }
+            }
+
+            protected override void Producer()
+            {
+                Event asynchronousEvent = new OutputEvent(new TestOutput(string.Empty, TestOutputType.Trace));
+                Assert.IsFalse(asynchronousEvent.IsSynchronous);
+                this.q.Enqueue(asynchronousEvent);
+                this.afterEnqueue = true;
+                Thread.MemoryBarrier();
+            }
+
+            protected override void Consumer()
+            {
+                this.q.Dequeue(true);
+                Thread.Sleep(30);
+                Assert.IsTrue(this.afterEnqueue);
+            }
+        }
+
+        #endregion EventQueue tests
+
+        #region QueuingEventListener tests
+
+        [Test]
+        public void SendEvents()
+        {
+            QueuingEventListener el = new QueuingEventListener();
+            SendEvents(el);
+            VerifyQueue(el.Events);
+        }
+
+        #endregion
+
+        #region EventPump tests
+
+        [Test]
+        public void StartAndStopPumpOnEmptyQueue()
+        {
+            EventQueue q = new EventQueue();
+            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
+            {
+                pump.Name = "StartAndStopPumpOnEmptyQueue";
+                StartPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
+                StopPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+        }
+
+        [Test]
+        public void PumpAutoStopsOnRunFinished()
+        {
+            EventQueue q = new EventQueue();
+            using (EventPump pump = new EventPump(NullListener.NULL, q, true))
+            {
+                pump.Name = "PumpAutoStopsOnRunFinished";
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+                StartPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
+                q.Enqueue(new RunFinishedEvent(new Exception()));
+                WaitForPumpToStop(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+        }
+
+        [Test]
+        [Timeout(3000)]
+        public void PumpEvents()
+        {
+            EventQueue q = new EventQueue();
+            QueuingEventListener el = new QueuingEventListener();
+            using (EventPump pump = new EventPump(el, q, false))
+            {
+                pump.Name = "PumpEvents";
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+                StartPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Pumping));
+                EnqueueEvents(q);
+                StopPump(pump, 1000);
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+            VerifyQueue(el.Events);
+        }
+
+        [Test]
+        [Timeout(2000)]
+        public void PumpEventsWithAutoStop()
+        {
+             EventQueue q = new EventQueue();
+            QueuingEventListener el = new QueuingEventListener();
+            using (EventPump pump = new EventPump(el, q, true))
+            {
+                pump.Name = "PumpEventsWithAutoStop";
+                pump.Start();
+                EnqueueEvents(q);
+                int tries = 10;
+                while (--tries > 0 && q.Count > 0)
+                {
+                    Thread.Sleep(100);
+                }
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+        }
+
+        [Test]
+        [Timeout(2000)]
+        public void PumpPendingEventsAfterAutoStop()
+        {
+            EventQueue q = new EventQueue();
+            EnqueueEvents(q);
+            Event[] eventsAfterStop =
+            {
+                new OutputEvent(new TestOutput("foo", TestOutputType.Out)),
+                new OutputEvent(new TestOutput("bar", TestOutputType.Trace)),
+            };
+            foreach (Event e in eventsAfterStop)
+            {
+                q.Enqueue(e);
+            }
+
+            QueuingEventListener el = new QueuingEventListener();
+            using (EventPump pump = new EventPump(el, q, true))
+            {
+                pump.Name = "PumpPendingEventsAfterAutoStop";
+                pump.Start();
+                int tries = 10;
+                while (--tries > 0 && q.Count > 0)
+                {
+                    Thread.Sleep(100);
+                }
+
+                Assert.That(pump.PumpState, Is.EqualTo(EventPumpState.Stopped));
+            }
+            Assert.That(el.Events.Count, Is.EqualTo(events.Length + eventsAfterStop.Length));
+        }
+
+        [Test]
+        [Timeout(1000)]
+        public void PumpSynchronousAndAsynchronousEvents()
+        {
+            EventQueue q = new EventQueue();
+            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
+            {
+                pump.Name = "PumpSynchronousAndAsynchronousEvents";
+                pump.Start();
+
+                int numberOfAsynchronousEvents = 0;
+                int sumOfAsynchronousQueueLength = 0;
+                const int Repetitions = 2;
+                for (int i = 0; i < Repetitions; i++)
+                {
+                    foreach (Event e in events)
+                    {
+                        q.Enqueue(e);
+                        if (e.IsSynchronous)
+                        {
+                            Assert.That(q.Count, Is.EqualTo(0));
+                        }
+                        else
+                        {
+                            sumOfAsynchronousQueueLength += q.Count;
+                            numberOfAsynchronousEvents++;
+                        }
+                    }
+                }
+
+                Console.WriteLine("Average queue length: {0}", (float)sumOfAsynchronousQueueLength / numberOfAsynchronousEvents);
+            }
+        }
+
+        /// <summary>
+        /// Verifies that when
+        /// (1) Traces are captured and fed into the EventListeners, and
+        /// (2) an EventListener writes Traces,
+        /// the Trace / EventPump / EventListener do not deadlock.
+        /// </summary>
+        /// <remarks>
+        /// This mainly simulates the object structure created by RemoteTestRunner.Run.
+        /// </remarks>
+        [Test]
+        [Timeout(1000)]
+        public void TracingEventListenerDoesNotDeadlock()
+        {
+            QueuingEventListener upstreamListener = new QueuingEventListener();
+            EventQueue upstreamListenerQueue = upstreamListener.Events;
+
+            // Install a TraceListener sending TestOutput events to the upstreamListener.
+            // This simulates RemoteTestRunner.StartTextCapture, where TestContext installs such a TraceListener.
+            TextWriter traceWriter = new EventListenerTextWriter(upstreamListener, TestOutputType.Trace);
+            const string TraceListenerName = "TracingEventListenerDoesNotDeadlock";
+            TraceListener feedingTraceToUpstreamListener = new TextWriterTraceListener(traceWriter, TraceListenerName);
+
+            try
+            {
+                Trace.Listeners.Add(feedingTraceToUpstreamListener);
+
+                // downstreamListenerToTrace simulates an EventListener installed e.g. by an Addin, 
+                // which may call Trace within the EventListener methods:
+                TracingEventListener downstreamListenerToTrace = new TracingEventListener();
+                using (EventPump pump = new EventPump(downstreamListenerToTrace, upstreamListenerQueue, false))
+                {
+                    pump.Name = "TracingEventListenerDoesNotDeadlock";
+                    pump.Start();
+
+                    const int Repetitions = 10;
+                    for (int i = 0; i < Repetitions; i++)
+                    {
+                        foreach (Event e in events)
+                        {
+                            Trace.WriteLine(string.Format("Before sending {0} event.", e.GetType().Name));
+                            e.Send(upstreamListener);
+                            Trace.WriteLine(string.Format("After sending {0} event.", e.GetType().Name));
+                        }
+                    }
+                }
+            }
+            finally
+            {
+                Trace.Listeners.Remove(TraceListenerName);
+                feedingTraceToUpstreamListener.Dispose();
+            }
+        }
+
+        /// <summary> 
+        /// Floods the queue of an EventPump with multiple concurrent event producers.
+        /// Prints the maximum queue length to Console, but does not implement an
+        /// oracle on what the maximum queue length should be.
+        /// </summary>
+        /// <param name="numberOfProducers">The number of concurrent producer threads.</param>
+        /// <param name="producerDelay">
+        /// If <c>true</c>, the producer threads slow down by adding a short delay time.
+        /// </param>
+        [TestCase(1, false)]
+        [TestCase(5, true)]
+        [TestCase(5, false)]
+        [Explicit("Takes several seconds. Just prints the queue length of the EventPump to Console, but has no oracle regarding this.")]
+        public void EventPumpQueueLength(int numberOfProducers, bool producerDelay)
+        {
+            EventQueue q = new EventQueue();
+            EventProducer[] producers = new EventProducer[numberOfProducers];
+            for (int i = 0; i < numberOfProducers; i++)
+            {
+                producers[i] = new EventProducer(q, i, producerDelay);
+            }
+
+            using (EventPump pump = new EventPump(NullListener.NULL, q, false))
+            {
+                pump.Name = "EventPumpQueueLength";
+                pump.Start();
+
+                foreach (EventProducer p in producers)
+                {
+                    p.ProducerThread.Start();
+                }
+                foreach (EventProducer p in producers)
+                {
+                    p.ProducerThread.Join();
+                }
+                pump.Stop();
+            }
+            Assert.That(q.Count, Is.EqualTo(0));
+
+            foreach (EventProducer p in producers)
+            {
+                Console.WriteLine(
+                    "#Events: {0}, MaxQueueLength: {1}", p.SentEventsCount, p.MaxQueueLength);
+                Assert.IsNull(p.Exception, "{0}", p.Exception);
+            }
+        }
+
+        #endregion
+    
+        public abstract class ProducerConsumerTest
+        {
+            private volatile Exception myConsumerException;
+
+            protected void RunProducerConsumer()
+            {
+                this.myConsumerException = null;
+                Thread consumerThread = new Thread(new ThreadStart(this.ConsumerThreadWrapper));
+                try
+                {
+                    consumerThread.Start();
+                    this.Producer();
+                    bool consumerStopped = consumerThread.Join(1000);
+                    Assert.IsTrue(consumerStopped);
+                }
+                finally
+                {
+                    ThreadUtility.Kill(consumerThread);
+                }
+
+                Assert.IsNull(this.myConsumerException);
+            }
+
+            protected abstract void Producer();
+
+            protected abstract void Consumer();
+
+            private void ConsumerThreadWrapper()
+            {
+                try
+                {
+                    this.Consumer();
+                }
+                catch (ThreadAbortException)
+                {
+                    Thread.ResetAbort();
+                }
+                catch (Exception ex)
+                {
+                    this.myConsumerException = ex;
+                }
+            }
+        }
+
+        private class EventProducer
+        {
+            public readonly Thread ProducerThread;
+            public int SentEventsCount;
+            public int MaxQueueLength;
+            public Exception Exception;
+            private readonly EventQueue queue;
+            private readonly bool delay;
+
+            public EventProducer(EventQueue q, int id, bool delay)
+            {
+                this.queue = q;
+                this.ProducerThread = new Thread(new ThreadStart(this.Produce));
+                this.ProducerThread.Name = this.GetType().FullName + id;
+                this.delay = delay;
+            }
+
+            private void Produce()
+            {
+                try
+                {
+                    Event e = new OutputEvent(new TestOutput(this.ProducerThread.Name, TestOutputType.Log));
+                    DateTime start = DateTime.Now;
+                    while (DateTime.Now - start <= TimeSpan.FromSeconds(3))
+                    {
+                        this.queue.Enqueue(e);
+                        this.SentEventsCount++;
+                        this.MaxQueueLength = Math.Max(this.queue.Count, this.MaxQueueLength);
+
+                        // without Sleep or with just a Sleep(0), the EventPump thread does not keep up and the queue gets very long
+                        if (this.delay)
+                        {
+                            Thread.Sleep(1);
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    this.Exception = ex;
+                }
+            }
+        }
+
+        private class TracingEventListener : EventListener
+        {
+            #region EventListener Members
+            public void RunStarted(string name, int testCount)
+            {
+                WriteTrace("RunStarted({0},{1})", name, testCount);
+            }
+
+            public void RunFinished(TestResult result)
+            {
+                WriteTrace("RunFinished({0})", result);
+            }
+
+            public void RunFinished(Exception exception)
+            {
+                WriteTrace("RunFinished({0})", exception);
+            }
+
+            public void TestStarted(TestName testName)
+            {
+                WriteTrace("TestStarted({0})", testName);
+            }
+
+            public void TestFinished(TestResult result)
+            {
+                WriteTrace("TestFinished({0})", result);
+            }
+
+            public void SuiteStarted(TestName testName)
+            {
+                WriteTrace("SuiteStarted({0})", testName);
+            }
+
+            public void SuiteFinished(TestResult result)
+            {
+                WriteTrace("SuiteFinished({0})", result);
+            }
+
+            public void UnhandledException(Exception exception)
+            {
+                WriteTrace("UnhandledException({0})", exception);
+            }
+
+            public void TestOutput(TestOutput testOutput)
+            {
+                if (testOutput.Type != TestOutputType.Trace)
+                {
+                    WriteTrace("TestOutput {0}: '{1}'", testOutput.Type, testOutput.Text);
+                }
+            }
+            #endregion
+
+#if CLR_2_0 || CLR_4_0
+            private static void WriteTrace(string message, params object[] args)
+            {
+                Trace.TraceInformation(message, args);
+            }
+#else
+            private static void WriteTrace(string message, params object[] args)
+            {
+                Trace.WriteLine(string.Format(message, args));
+            }
+#endif
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/EventTestFixture.cs b/src/NUnitCore/tests/EventTestFixture.cs
index 2292029..d672d19 100644
--- a/src/NUnitCore/tests/EventTestFixture.cs
+++ b/src/NUnitCore/tests/EventTestFixture.cs
@@ -1,91 +1,91 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for EventTestFixture.
-	/// </summary>
-	/// 
-	[TestFixture(Description="Tests that proper events are generated when running  test")]
-	public class EventTestFixture
-	{
-        private string testsDll = MockAssembly.AssemblyPath;
-
-		internal class EventCounter : EventListener
-		{
-			internal int runStarted = 0;
-			internal int runFinished = 0;
-			internal int testCaseStart = 0;
-			internal int testCaseFinished = 0;
-			internal int suiteStarted = 0;
-			internal int suiteFinished = 0;
-
-			public void RunStarted(string name, int testCount)
-			{
-				runStarted++;
-			}
-
-			public void RunFinished(NUnit.Core.TestResult result)
-			{
-				runFinished++;
-			}
-
-			public void RunFinished(Exception exception)
-			{
-				runFinished++;
-			}
-
-			public void TestStarted(TestName testName)
-			{
-				testCaseStart++;
-			}
-			
-			public void TestFinished(TestResult result)
-			{
-				testCaseFinished++;
-			}
-
-			public void SuiteStarted(TestName suiteName)
-			{
-				suiteStarted++;
-			}
-
-			public void SuiteFinished(TestResult result)
-			{
-				suiteFinished++;
-			}
-
-			public void UnhandledException( Exception exception )
-			{
-			}
-
-			public void TestOutput(TestOutput testOutput)
-			{
-			}
-		}
-
-		[Test]
-		public void CheckEventListening()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test testSuite = builder.Build( new TestPackage( testsDll ) );
-			
-			EventCounter counter = new EventCounter();
-            testSuite.Run(counter, TestFilter.Empty);
-			Assert.AreEqual(testSuite.CountTestCases(TestFilter.Empty), counter.testCaseStart);
-			Assert.AreEqual(testSuite.CountTestCases(TestFilter.Empty), counter.testCaseFinished);
-
-			Assert.AreEqual(MockAssembly.SuitesRun, counter.suiteStarted);
-			Assert.AreEqual(MockAssembly.SuitesRun, counter.suiteFinished);
-		}
-	}
-}
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for EventTestFixture.
+	/// </summary>
+	/// 
+	[TestFixture(Description="Tests that proper events are generated when running  test")]
+	public class EventTestFixture
+	{
+        private string testsDll = MockAssembly.AssemblyPath;
+
+		internal class EventCounter : EventListener
+		{
+			internal int runStarted = 0;
+			internal int runFinished = 0;
+			internal int testCaseStart = 0;
+			internal int testCaseFinished = 0;
+			internal int suiteStarted = 0;
+			internal int suiteFinished = 0;
+
+			public void RunStarted(string name, int testCount)
+			{
+				runStarted++;
+			}
+
+			public void RunFinished(NUnit.Core.TestResult result)
+			{
+				runFinished++;
+			}
+
+			public void RunFinished(Exception exception)
+			{
+				runFinished++;
+			}
+
+			public void TestStarted(TestName testName)
+			{
+				testCaseStart++;
+			}
+			
+			public void TestFinished(TestResult result)
+			{
+				testCaseFinished++;
+			}
+
+			public void SuiteStarted(TestName suiteName)
+			{
+				suiteStarted++;
+			}
+
+			public void SuiteFinished(TestResult result)
+			{
+				suiteFinished++;
+			}
+
+			public void UnhandledException( Exception exception )
+			{
+			}
+
+			public void TestOutput(TestOutput testOutput)
+			{
+			}
+		}
+
+		[Test]
+		public void CheckEventListening()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test testSuite = builder.Build( new TestPackage( testsDll ) );
+			
+			EventCounter counter = new EventCounter();
+            testSuite.Run(counter, TestFilter.Empty);
+			Assert.AreEqual(testSuite.CountTestCases(TestFilter.Empty), counter.testCaseStart);
+			Assert.AreEqual(testSuite.CountTestCases(TestFilter.Empty), counter.testCaseFinished);
+
+			Assert.AreEqual(MockAssembly.SuitesRun, counter.suiteStarted);
+			Assert.AreEqual(MockAssembly.SuitesRun, counter.suiteFinished);
+		}
+	}
+}
+
diff --git a/src/NUnitCore/tests/ExpectExceptionTest.cs b/src/NUnitCore/tests/ExpectExceptionTest.cs
index 8c60edc..1d8b676 100644
--- a/src/NUnitCore/tests/ExpectExceptionTest.cs
+++ b/src/NUnitCore/tests/ExpectExceptionTest.cs
@@ -1,452 +1,452 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Runtime.Serialization;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.TestData.ExpectExceptionTest;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// 
-	/// </summary>
-	[TestFixture]
-	public class ExpectExceptionTest 
-	{
-		[Test, ExpectedException]
-		public void CanExpectUnspecifiedException()
-		{
-			throw new ArgumentException();
-		}
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException))]
-        public void TestSucceedsWithSpecifiedExceptionType()
-        {
-            throw new ArgumentException("argument exception");
-        }
-
-        [Test]
-        [ExpectedException(ExpectedException=typeof(ArgumentException))]
-        public void TestSucceedsWithSpecifiedExceptionTypeAsNamedParameter()
-        {
-            throw new ArgumentException("argument exception");
-        }
-
-        [Test]
-        [ExpectedException("System.ArgumentException")]
-        public void TestSucceedsWithSpecifiedExceptionName()
-        {
-            throw new ArgumentException("argument exception");
-        }
-
-        [Test]
-        [ExpectedException(ExpectedExceptionName="System.ArgumentException")]
-        public void TestSucceedsWithSpecifiedExceptionNameAsNamedParameter()
-        {
-            throw new ArgumentException("argument exception");
-        }
-
-        [Test]
-		[ExpectedException(typeof(ArgumentException),ExpectedMessage="argument exception")]
-		public void TestSucceedsWithSpecifiedExceptionTypeAndMessage()
-		{
-			throw new ArgumentException("argument exception");
-		}
-
-		[Test]
-		[ExpectedException(typeof(ArgumentException), ExpectedMessage="argument exception", MatchType=MessageMatch.Exact)]
-		public void TestSucceedsWithSpecifiedExceptionTypeAndExactMatch()
-		{
-			throw new ArgumentException("argument exception");
-		}
-
-		[Test]
-		[ExpectedException(typeof(ArgumentException),ExpectedMessage="invalid", MatchType=MessageMatch.Contains)]
-		public void TestSucceedsWithSpecifiedExceptionTypeAndContainsMatch()
-		{
-			throw new ArgumentException("argument invalid exception");
-		}
-
-		[Test]
-		[ExpectedException(typeof(ArgumentException),ExpectedMessage="exception$", MatchType=MessageMatch.Regex)]
-		public void TestSucceedsWithSpecifiedExceptionTypeAndRegexMatch()
-		{
-			throw new ArgumentException("argument invalid exception");
-		}
-
-        [Test]
-        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "argument invalid", MatchType = MessageMatch.StartsWith)]
-        public void TestSucceedsWithSpecifiedExceptionTypeAndStartsWithMatch()
-        {
-            throw new ArgumentException("argument invalid exception");
-        }
-
-//        [Test]
-//        [ExpectedException("System.ArgumentException", "argument exception")]
-//        public void TestSucceedsWithSpecifiedExceptionNameAndMessage_OldFormat()
-//        {
-//            throw new ArgumentException("argument exception");
-//        }
-
-        [Test]
-        [ExpectedException("System.ArgumentException", ExpectedMessage = "argument exception")]
-        public void TestSucceedsWithSpecifiedExceptionNameAndMessage_NewFormat()
-        {
-            throw new ArgumentException("argument exception");
-        }
-
-        [Test]
-		[ExpectedException("System.ArgumentException",ExpectedMessage="argument exception",MatchType=MessageMatch.Exact)]
-		public void TestSucceedsWithSpecifiedExceptionNameAndExactMatch()
-		{
-			throw new ArgumentException("argument exception");
-		}
-
-		[Test]
-		[ExpectedException("System.ArgumentException",ExpectedMessage="invalid", MatchType=MessageMatch.Contains)]
-		public void TestSucceedsWhenSpecifiedExceptionNameAndContainsMatch()
-		{
-			throw new ArgumentException("argument invalid exception");
-		}
-
-		[Test]
-		[ExpectedException("System.ArgumentException",ExpectedMessage="exception$", MatchType=MessageMatch.Regex)]
-		public void TestSucceedsWhenSpecifiedExceptionNameAndRegexMatch()
-		{
-			throw new ArgumentException("argument invalid exception");
-		}
-
-		[Test]
-		public void TestFailsWhenBaseExceptionIsThrown()
-		{
-			Type fixtureType = typeof(BaseException);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "BaseExceptionTest" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "BaseExceptionTest should have failed");
-			StringAssert.StartsWith(
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: System.ArgumentException" + Environment.NewLine +
-				" but was: System.Exception",
-				result.Message);
-		}
-
-		[Test]
-		public void TestFailsWhenDerivedExceptionIsThrown()
-		{
-			Type fixtureType = typeof(DerivedException);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "DerivedExceptionTest" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "DerivedExceptionTest should have failed");
-			StringAssert.StartsWith( 
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: System.Exception" + Environment.NewLine +
-				" but was: System.ArgumentException",
-				result.Message);
-		}
-
-        [Test]
-        public void TestMismatchedExceptionType()
-        {
-            Type fixtureType = typeof(MismatchedException);
-            Test test = TestBuilder.MakeTestCase(fixtureType, "MismatchedExceptionType");
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
-            StringAssert.StartsWith(
-                "An unexpected exception type was thrown" + Environment.NewLine +
-                "Expected: System.ArgumentException" + Environment.NewLine +
-                " but was: System.ArgumentOutOfRangeException",
-                result.Message);
-        }
-
-        [Test]
-        public void TestMismatchedExceptionTypeAsNamedParameter()
-        {
-            Type fixtureType = typeof(MismatchedException);
-            Test test = TestBuilder.MakeTestCase(fixtureType, "MismatchedExceptionTypeAsNamedParameter");
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
-            StringAssert.StartsWith(
-                "An unexpected exception type was thrown" + Environment.NewLine +
-                "Expected: System.ArgumentException" + Environment.NewLine +
-                " but was: System.ArgumentOutOfRangeException",
-                result.Message);
-        }
-
-        [Test]
-		public void TestMismatchedExceptionTypeWithUserMessage()
-		{
-			Type fixtureType = typeof(MismatchedException);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionTypeWithUserMessage" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			StringAssert.StartsWith(
-				"custom message" + Environment.NewLine +
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: System.ArgumentException" + Environment.NewLine +
-				" but was: System.ArgumentOutOfRangeException", 
-				result.Message);
-		}
-
-		[Test]
-		public void TestMismatchedExceptionName()
-		{
-			Type fixtureType = typeof(MismatchedException);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionName" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "MismatchedExceptionName should have failed");
-			StringAssert.StartsWith(
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: System.ArgumentException" + Environment.NewLine +
-				" but was: System.ArgumentOutOfRangeException", 
-				result.Message);
-		}
-
-		[Test]
-		public void TestMismatchedExceptionNameWithUserMessage()
-		{
-			Type fixtureType = typeof(MismatchedException);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionNameWithUserMessage" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			StringAssert.StartsWith(
-				"custom message" + Environment.NewLine +
-				"An unexpected exception type was thrown" + Environment.NewLine +
-				"Expected: System.ArgumentException" + Environment.NewLine +
-				" but was: System.ArgumentOutOfRangeException", 
-				result.Message);
-		}
-
-		[Test]
-		public void TestMismatchedExceptionMessage()
-		{
-			Type fixtureType = typeof(TestThrowsExceptionWithWrongMessage);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestThrow" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "TestThrow should have failed");
-			Assert.AreEqual(
-				"The exception message text was incorrect" + Environment.NewLine +
-				"Expected: not the message" + Environment.NewLine +
-				" but was: the message", 
-				result.Message);
-		}
-
-		[Test]
-		public void TestMismatchedExceptionMessageWithUserMessage()
-		{
-			Type fixtureType = typeof(TestThrowsExceptionWithWrongMessage);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestThrowWithUserMessage" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "TestThrow should have failed");
-			Assert.AreEqual(
-				"custom message" + Environment.NewLine +
-				"The exception message text was incorrect" + Environment.NewLine +
-				"Expected: not the message" + Environment.NewLine +
-				" but was: the message", 
-				result.Message);
-		}
-
-		[Test]
-		public void TestUnspecifiedExceptionNotThrown()
-		{
-			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowUnspecifiedException" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			Assert.AreEqual("An Exception was expected", result.Message);
-		}
-
-		[Test]
-		public void TestUnspecifiedExceptionNotThrownWithUserMessage()
-		{
-			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowUnspecifiedExceptionWithUserMessage" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			Assert.AreEqual("custom message" + Environment.NewLine + "An Exception was expected", result.Message);
-		}
-
-		[Test]
-		public void TestExceptionTypeNotThrown()
-		{
-			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionType" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			Assert.AreEqual("System.ArgumentException was expected", result.Message);
-		}
-
-		[Test]
-		public void TestExceptionTypeNotThrownWithUserMessage()
-		{
-			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionTypeWithUserMessage" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			Assert.AreEqual("custom message" + Environment.NewLine + "System.ArgumentException was expected", result.Message);
-		}
-
-		[Test]
-		public void TestExceptionNameNotThrown()
-		{
-			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionName" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			Assert.AreEqual("System.ArgumentException was expected", result.Message);
-		}
-
-		[Test]
-		public void TestExceptionNameNotThrownWithUserMessage()
-		{
-			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
-			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionNameWithUserMessage" );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsFailure, "Test method should have failed");
-			Assert.AreEqual("custom message" + Environment.NewLine + "System.ArgumentException was expected", result.Message);
-		}
-
-		[Test] 
-		public void MethodThrowsException()
-		{
-			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsExceptionFixture ) );
-			Assert.AreEqual(true, result.IsFailure);
-		}
-
-		[Test] 
-		public void MethodThrowsRightExceptionMessage()
-		{
-			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsExceptionWithRightMessage ) );
-			Assert.AreEqual(true, result.IsSuccess);
-		}
-
-		[Test]
-		public void MethodThrowsArgumentOutOfRange()
-		{
-			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsArgumentOutOfRangeException ) );
-			Assert.AreEqual(true, result.IsSuccess );
-		}
-
-		[Test] 
-		public void MethodThrowsWrongExceptionMessage()
-		{
-			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsExceptionWithWrongMessage ) );
-			Assert.AreEqual(true, result.IsFailure);
-		}
-
-		[Test]
-		public void SetUpThrowsSameException()
-		{
-			TestResult result = TestBuilder.RunTestFixture( typeof( SetUpExceptionTests ) );
-			Assert.AreEqual(true, result.IsFailure);
-		}
-
-		[Test]
-		public void TearDownThrowsSameException()
-		{
-			TestResult result = TestBuilder.RunTestFixture( typeof( TearDownExceptionTests ) );
-			Assert.AreEqual(true, result.IsFailure);
-		}
-
-		[Test]
-		public void AssertFailBeforeException() 
-		{ 
-			TestResult suiteResult = TestBuilder.RunTestFixture( typeof (TestAssertsBeforeThrowingException) );
-			Assert.AreEqual( ResultState.Failure, suiteResult.ResultState );
-			TestResult result = (TestResult)suiteResult.Results[0];
-			Assert.AreEqual( "private message", result.Message );
-		} 
-
-		internal class MyAppException : System.Exception
-		{
-			public MyAppException (string message) : base(message) 
-			{}
-
-			public MyAppException(string message, Exception inner) :
-				base(message, inner) 
-			{}
-
-			protected MyAppException(SerializationInfo info, 
-				StreamingContext context) : base(info,context)
-			{}
-		}
-
-		[Test]
-		[ExpectedException(typeof(MyAppException))] 
-		public void ThrowingMyAppException() 
-		{ 
-			throw new MyAppException("my app");
-		}
-
-		[Test]
-		[ExpectedException(typeof(MyAppException), ExpectedMessage="my app")] 
-		public void ThrowingMyAppExceptionWithMessage() 
-		{ 
-			throw new MyAppException("my app");
-		}
-
-		[Test]
-		[ExpectedException(typeof(NUnitException))]
-		public void ThrowNUnitException()
-		{
-			throw new NUnitException("Nunit exception");
-		}
-
-		[Test]
-		public void ExceptionHandlerIsCalledWhenExceptionMatches_AlternateHandler()
-		{
-			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsArgumentException_AlternateHandler" );
-            test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsFalse(fixture.HandlerCalled, "Base Handler should not be called" );
-			Assert.IsTrue(fixture.AlternateHandlerCalled, "Alternate Handler should be called" );
-		}
-	
-		[Test]
-		public void ExceptionHandlerIsCalledWhenExceptionMatches()
-		{
-			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsArgumentException" );
-            test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(fixture.HandlerCalled, "Base Handler should be called");
-			Assert.IsFalse(fixture.AlternateHandlerCalled, "Alternate Handler should not be called");
-		}
-	
-		[Test]
-		public void ExceptionHandlerIsNotCalledWhenExceptionDoesNotMatch()
-		{
-			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsApplicationException" );
-            test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsFalse( fixture.HandlerCalled, "Base Handler should not be called" );
-			Assert.IsFalse( fixture.AlternateHandlerCalled, "Alternate Handler should not be called" );
-		}
-
-		[Test]
-		public void ExceptionHandlerIsNotCalledWhenExceptionDoesNotMatch_AlternateHandler()
-		{
-			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsApplicationException_AlternateHandler" );
-            test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsFalse(fixture.HandlerCalled, "Base Handler should not be called");
-			Assert.IsFalse(fixture.AlternateHandlerCalled, "Alternate Handler should not be called");
-		}
-
-		[Test]
-		public void TestIsNotRunnableWhenAlternateHandlerIsNotFound()
-		{
-			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
-			Test test = TestBuilder.MakeTestCase( fixture, "MethodWithBadHandler" );
-			Assert.AreEqual( RunState.NotRunnable, test.RunState );
-			Assert.AreEqual(
-				"The specified exception handler DeliberatelyMissingHandler was not found",
-				test.IgnoreReason );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Runtime.Serialization;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData.ExpectExceptionTest;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// 
+	/// </summary>
+	[TestFixture]
+	public class ExpectExceptionTest 
+	{
+		[Test, ExpectedException]
+		public void CanExpectUnspecifiedException()
+		{
+			throw new ArgumentException();
+		}
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void TestSucceedsWithSpecifiedExceptionType()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException=typeof(ArgumentException))]
+        public void TestSucceedsWithSpecifiedExceptionTypeAsNamedParameter()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
+        [ExpectedException("System.ArgumentException")]
+        public void TestSucceedsWithSpecifiedExceptionName()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
+        [ExpectedException(ExpectedExceptionName="System.ArgumentException")]
+        public void TestSucceedsWithSpecifiedExceptionNameAsNamedParameter()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
+		[ExpectedException(typeof(ArgumentException),ExpectedMessage="argument exception")]
+		public void TestSucceedsWithSpecifiedExceptionTypeAndMessage()
+		{
+			throw new ArgumentException("argument exception");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentException), ExpectedMessage="argument exception", MatchType=MessageMatch.Exact)]
+		public void TestSucceedsWithSpecifiedExceptionTypeAndExactMatch()
+		{
+			throw new ArgumentException("argument exception");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentException),ExpectedMessage="invalid", MatchType=MessageMatch.Contains)]
+		public void TestSucceedsWithSpecifiedExceptionTypeAndContainsMatch()
+		{
+			throw new ArgumentException("argument invalid exception");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentException),ExpectedMessage="exception$", MatchType=MessageMatch.Regex)]
+		public void TestSucceedsWithSpecifiedExceptionTypeAndRegexMatch()
+		{
+			throw new ArgumentException("argument invalid exception");
+		}
+
+        [Test]
+        [ExpectedException(typeof(ArgumentException), ExpectedMessage = "argument invalid", MatchType = MessageMatch.StartsWith)]
+        public void TestSucceedsWithSpecifiedExceptionTypeAndStartsWithMatch()
+        {
+            throw new ArgumentException("argument invalid exception");
+        }
+
+//        [Test]
+//        [ExpectedException("System.ArgumentException", "argument exception")]
+//        public void TestSucceedsWithSpecifiedExceptionNameAndMessage_OldFormat()
+//        {
+//            throw new ArgumentException("argument exception");
+//        }
+
+        [Test]
+        [ExpectedException("System.ArgumentException", ExpectedMessage = "argument exception")]
+        public void TestSucceedsWithSpecifiedExceptionNameAndMessage_NewFormat()
+        {
+            throw new ArgumentException("argument exception");
+        }
+
+        [Test]
+		[ExpectedException("System.ArgumentException",ExpectedMessage="argument exception",MatchType=MessageMatch.Exact)]
+		public void TestSucceedsWithSpecifiedExceptionNameAndExactMatch()
+		{
+			throw new ArgumentException("argument exception");
+		}
+
+		[Test]
+		[ExpectedException("System.ArgumentException",ExpectedMessage="invalid", MatchType=MessageMatch.Contains)]
+		public void TestSucceedsWhenSpecifiedExceptionNameAndContainsMatch()
+		{
+			throw new ArgumentException("argument invalid exception");
+		}
+
+		[Test]
+		[ExpectedException("System.ArgumentException",ExpectedMessage="exception$", MatchType=MessageMatch.Regex)]
+		public void TestSucceedsWhenSpecifiedExceptionNameAndRegexMatch()
+		{
+			throw new ArgumentException("argument invalid exception");
+		}
+
+		[Test]
+		public void TestFailsWhenBaseExceptionIsThrown()
+		{
+			Type fixtureType = typeof(BaseException);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "BaseExceptionTest" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "BaseExceptionTest should have failed");
+			StringAssert.StartsWith(
+				"An unexpected exception type was thrown" + Environment.NewLine +
+				"Expected: System.ArgumentException" + Environment.NewLine +
+				" but was: System.Exception",
+				result.Message);
+		}
+
+		[Test]
+		public void TestFailsWhenDerivedExceptionIsThrown()
+		{
+			Type fixtureType = typeof(DerivedException);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "DerivedExceptionTest" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "DerivedExceptionTest should have failed");
+			StringAssert.StartsWith( 
+				"An unexpected exception type was thrown" + Environment.NewLine +
+				"Expected: System.Exception" + Environment.NewLine +
+				" but was: System.ArgumentException",
+				result.Message);
+		}
+
+        [Test]
+        public void TestMismatchedExceptionType()
+        {
+            Type fixtureType = typeof(MismatchedException);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "MismatchedExceptionType");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
+            StringAssert.StartsWith(
+                "An unexpected exception type was thrown" + Environment.NewLine +
+                "Expected: System.ArgumentException" + Environment.NewLine +
+                " but was: System.ArgumentOutOfRangeException",
+                result.Message);
+        }
+
+        [Test]
+        public void TestMismatchedExceptionTypeAsNamedParameter()
+        {
+            Type fixtureType = typeof(MismatchedException);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "MismatchedExceptionTypeAsNamedParameter");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsTrue(result.IsFailure, "MismatchedExceptionType should have failed");
+            StringAssert.StartsWith(
+                "An unexpected exception type was thrown" + Environment.NewLine +
+                "Expected: System.ArgumentException" + Environment.NewLine +
+                " but was: System.ArgumentOutOfRangeException",
+                result.Message);
+        }
+
+        [Test]
+		public void TestMismatchedExceptionTypeWithUserMessage()
+		{
+			Type fixtureType = typeof(MismatchedException);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionTypeWithUserMessage" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			StringAssert.StartsWith(
+				"custom message" + Environment.NewLine +
+				"An unexpected exception type was thrown" + Environment.NewLine +
+				"Expected: System.ArgumentException" + Environment.NewLine +
+				" but was: System.ArgumentOutOfRangeException", 
+				result.Message);
+		}
+
+		[Test]
+		public void TestMismatchedExceptionName()
+		{
+			Type fixtureType = typeof(MismatchedException);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionName" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "MismatchedExceptionName should have failed");
+			StringAssert.StartsWith(
+				"An unexpected exception type was thrown" + Environment.NewLine +
+				"Expected: System.ArgumentException" + Environment.NewLine +
+				" but was: System.ArgumentOutOfRangeException", 
+				result.Message);
+		}
+
+		[Test]
+		public void TestMismatchedExceptionNameWithUserMessage()
+		{
+			Type fixtureType = typeof(MismatchedException);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "MismatchedExceptionNameWithUserMessage" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			StringAssert.StartsWith(
+				"custom message" + Environment.NewLine +
+				"An unexpected exception type was thrown" + Environment.NewLine +
+				"Expected: System.ArgumentException" + Environment.NewLine +
+				" but was: System.ArgumentOutOfRangeException", 
+				result.Message);
+		}
+
+		[Test]
+		public void TestMismatchedExceptionMessage()
+		{
+			Type fixtureType = typeof(TestThrowsExceptionWithWrongMessage);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestThrow" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "TestThrow should have failed");
+			Assert.AreEqual(
+				"The exception message text was incorrect" + Environment.NewLine +
+				"Expected: not the message" + Environment.NewLine +
+				" but was: the message", 
+				result.Message);
+		}
+
+		[Test]
+		public void TestMismatchedExceptionMessageWithUserMessage()
+		{
+			Type fixtureType = typeof(TestThrowsExceptionWithWrongMessage);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestThrowWithUserMessage" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "TestThrow should have failed");
+			Assert.AreEqual(
+				"custom message" + Environment.NewLine +
+				"The exception message text was incorrect" + Environment.NewLine +
+				"Expected: not the message" + Environment.NewLine +
+				" but was: the message", 
+				result.Message);
+		}
+
+		[Test]
+		public void TestUnspecifiedExceptionNotThrown()
+		{
+			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowUnspecifiedException" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			Assert.AreEqual("An Exception was expected", result.Message);
+		}
+
+		[Test]
+		public void TestUnspecifiedExceptionNotThrownWithUserMessage()
+		{
+			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowUnspecifiedExceptionWithUserMessage" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			Assert.AreEqual("custom message" + Environment.NewLine + "An Exception was expected", result.Message);
+		}
+
+		[Test]
+		public void TestExceptionTypeNotThrown()
+		{
+			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionType" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			Assert.AreEqual("System.ArgumentException was expected", result.Message);
+		}
+
+		[Test]
+		public void TestExceptionTypeNotThrownWithUserMessage()
+		{
+			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionTypeWithUserMessage" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			Assert.AreEqual("custom message" + Environment.NewLine + "System.ArgumentException was expected", result.Message);
+		}
+
+		[Test]
+		public void TestExceptionNameNotThrown()
+		{
+			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionName" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			Assert.AreEqual("System.ArgumentException was expected", result.Message);
+		}
+
+		[Test]
+		public void TestExceptionNameNotThrownWithUserMessage()
+		{
+			Type fixtureType = typeof(TestDoesNotThrowExceptionFixture);
+			Test test = TestBuilder.MakeTestCase( fixtureType, "TestDoesNotThrowExceptionNameWithUserMessage" );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsFailure, "Test method should have failed");
+			Assert.AreEqual("custom message" + Environment.NewLine + "System.ArgumentException was expected", result.Message);
+		}
+
+		[Test] 
+		public void MethodThrowsException()
+		{
+			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsExceptionFixture ) );
+			Assert.AreEqual(true, result.IsFailure);
+		}
+
+		[Test] 
+		public void MethodThrowsRightExceptionMessage()
+		{
+			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsExceptionWithRightMessage ) );
+			Assert.AreEqual(true, result.IsSuccess);
+		}
+
+		[Test]
+		public void MethodThrowsArgumentOutOfRange()
+		{
+			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsArgumentOutOfRangeException ) );
+			Assert.AreEqual(true, result.IsSuccess );
+		}
+
+		[Test] 
+		public void MethodThrowsWrongExceptionMessage()
+		{
+			TestResult result = TestBuilder.RunTestFixture( typeof( TestThrowsExceptionWithWrongMessage ) );
+			Assert.AreEqual(true, result.IsFailure);
+		}
+
+		[Test]
+		public void SetUpThrowsSameException()
+		{
+			TestResult result = TestBuilder.RunTestFixture( typeof( SetUpExceptionTests ) );
+			Assert.AreEqual(true, result.IsFailure);
+		}
+
+		[Test]
+		public void TearDownThrowsSameException()
+		{
+			TestResult result = TestBuilder.RunTestFixture( typeof( TearDownExceptionTests ) );
+			Assert.AreEqual(true, result.IsFailure);
+		}
+
+		[Test]
+		public void AssertFailBeforeException() 
+		{ 
+			TestResult suiteResult = TestBuilder.RunTestFixture( typeof (TestAssertsBeforeThrowingException) );
+			Assert.AreEqual( ResultState.Failure, suiteResult.ResultState );
+			TestResult result = (TestResult)suiteResult.Results[0];
+			Assert.AreEqual( "private message", result.Message );
+		} 
+
+		internal class MyAppException : System.Exception
+		{
+			public MyAppException (string message) : base(message) 
+			{}
+
+			public MyAppException(string message, Exception inner) :
+				base(message, inner) 
+			{}
+
+			protected MyAppException(SerializationInfo info, 
+				StreamingContext context) : base(info,context)
+			{}
+		}
+
+		[Test]
+		[ExpectedException(typeof(MyAppException))] 
+		public void ThrowingMyAppException() 
+		{ 
+			throw new MyAppException("my app");
+		}
+
+		[Test]
+		[ExpectedException(typeof(MyAppException), ExpectedMessage="my app")] 
+		public void ThrowingMyAppExceptionWithMessage() 
+		{ 
+			throw new MyAppException("my app");
+		}
+
+		[Test]
+		[ExpectedException(typeof(NUnitException))]
+		public void ThrowNUnitException()
+		{
+			throw new NUnitException("Nunit exception");
+		}
+
+		[Test]
+		public void ExceptionHandlerIsCalledWhenExceptionMatches_AlternateHandler()
+		{
+			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
+			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsArgumentException_AlternateHandler" );
+            test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsFalse(fixture.HandlerCalled, "Base Handler should not be called" );
+			Assert.IsTrue(fixture.AlternateHandlerCalled, "Alternate Handler should be called" );
+		}
+	
+		[Test]
+		public void ExceptionHandlerIsCalledWhenExceptionMatches()
+		{
+			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
+			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsArgumentException" );
+            test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(fixture.HandlerCalled, "Base Handler should be called");
+			Assert.IsFalse(fixture.AlternateHandlerCalled, "Alternate Handler should not be called");
+		}
+	
+		[Test]
+		public void ExceptionHandlerIsNotCalledWhenExceptionDoesNotMatch()
+		{
+			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
+			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsApplicationException" );
+            test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsFalse( fixture.HandlerCalled, "Base Handler should not be called" );
+			Assert.IsFalse( fixture.AlternateHandlerCalled, "Alternate Handler should not be called" );
+		}
+
+		[Test]
+		public void ExceptionHandlerIsNotCalledWhenExceptionDoesNotMatch_AlternateHandler()
+		{
+			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
+			Test test = TestBuilder.MakeTestCase( fixture, "ThrowsApplicationException_AlternateHandler" );
+            test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsFalse(fixture.HandlerCalled, "Base Handler should not be called");
+			Assert.IsFalse(fixture.AlternateHandlerCalled, "Alternate Handler should not be called");
+		}
+
+		[Test]
+		public void TestIsNotRunnableWhenAlternateHandlerIsNotFound()
+		{
+			ExceptionHandlerCalledClass fixture = new ExceptionHandlerCalledClass();
+			Test test = TestBuilder.MakeTestCase( fixture, "MethodWithBadHandler" );
+			Assert.AreEqual( RunState.NotRunnable, test.RunState );
+			Assert.AreEqual(
+				"The specified exception handler DeliberatelyMissingHandler was not found",
+				test.IgnoreReason );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/FailFixture.cs b/src/NUnitCore/tests/FailFixture.cs
index a167ab9..aabca8a 100644
--- a/src/NUnitCore/tests/FailFixture.cs
+++ b/src/NUnitCore/tests/FailFixture.cs
@@ -1,78 +1,78 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.TestData.FailFixture;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class FailFixture
-	{
-		[Test]
-		public void VerifyFailWorks()
-		{
-			TestResult result = TestBuilder.RunTestCase( 
-				typeof(VerifyFailThrowsException), 
-				"CallAssertFail" );
-			Assert.IsTrue(result.IsFailure, "Should have failed");
-			Assert.AreEqual(
-				VerifyFailThrowsException.failureMessage, 
-				result.Message);
-		}
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void FailThrowsAssertionException()
-		{
-			Assert.Fail(String.Empty);
-		}
-
-		[Test]
-		public void FailInheritsFromSystemException() 
-		{
-			try 
-			{
-				Assert.Fail();
-			} 
-			catch (System.Exception) 
-			{
-				return;
-			}
-
-			throw new AssertionException("fail"); // You can't call fail() here
-		}
-
-		[Test]
-		public void FailRecordsInnerException()
-		{
-			Type fixtureType = typeof(VerifyTestResultRecordsInnerExceptions);
-			string expectedMessage ="System.Exception : Outer Exception" + Environment.NewLine + "  ----> System.Exception : Inner Exception";
-			NUnit.Core.TestResult result = TestBuilder.RunTestCase(fixtureType, "ThrowInnerException");
-			Assert.AreEqual(ResultState.Error, result.ResultState );
-			Assert.AreEqual(expectedMessage, result.Message);
-		}
-
-		[Test]
-		public void BadStackTraceIsHandled()
-		{
-			TestResult result = TestBuilder.RunTestCase( typeof( BadStackTraceFixture ), "TestFailure" );
-			Assert.AreEqual( ResultState.Error, result.ResultState );
-			Assert.AreEqual( "NUnit.TestData.FailFixture.ExceptionWithBadStackTrace : thrown by me", result.Message );
-			Assert.AreEqual( "No stack trace available", result.StackTrace );
-		}
-
-		[Test]
-		public void CustomExceptionIsHandled()
-		{
-			TestResult result = TestBuilder.RunTestCase( typeof( CustomExceptionFixture ), "ThrowCustomException" );
-			Assert.AreEqual( ResultState.Error, result.ResultState );
-			Assert.AreEqual( "NUnit.TestData.FailFixture.CustomExceptionFixture+CustomException : message", result.Message );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData.FailFixture;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class FailFixture
+	{
+		[Test]
+		public void VerifyFailWorks()
+		{
+			TestResult result = TestBuilder.RunTestCase( 
+				typeof(VerifyFailThrowsException), 
+				"CallAssertFail" );
+			Assert.IsTrue(result.IsFailure, "Should have failed");
+			Assert.AreEqual(
+				VerifyFailThrowsException.failureMessage, 
+				result.Message);
+		}
+
+		[Test]
+		[ExpectedException(typeof(AssertionException))]
+		public void FailThrowsAssertionException()
+		{
+			Assert.Fail(String.Empty);
+		}
+
+		[Test]
+		public void FailInheritsFromSystemException() 
+		{
+			try 
+			{
+				Assert.Fail();
+			} 
+			catch (System.Exception) 
+			{
+				return;
+			}
+
+			throw new AssertionException("fail"); // You can't call fail() here
+		}
+
+		[Test]
+		public void FailRecordsInnerException()
+		{
+			Type fixtureType = typeof(VerifyTestResultRecordsInnerExceptions);
+			string expectedMessage ="System.Exception : Outer Exception" + Environment.NewLine + "  ----> System.Exception : Inner Exception";
+			NUnit.Core.TestResult result = TestBuilder.RunTestCase(fixtureType, "ThrowInnerException");
+			Assert.AreEqual(ResultState.Error, result.ResultState );
+			Assert.AreEqual(expectedMessage, result.Message);
+		}
+
+		[Test]
+		public void BadStackTraceIsHandled()
+		{
+			TestResult result = TestBuilder.RunTestCase( typeof( BadStackTraceFixture ), "TestFailure" );
+			Assert.AreEqual( ResultState.Error, result.ResultState );
+			Assert.AreEqual( "NUnit.TestData.FailFixture.ExceptionWithBadStackTrace : thrown by me", result.Message );
+			Assert.AreEqual( "No stack trace available", result.StackTrace );
+		}
+
+		[Test]
+		public void CustomExceptionIsHandled()
+		{
+			TestResult result = TestBuilder.RunTestCase( typeof( CustomExceptionFixture ), "ThrowCustomException" );
+			Assert.AreEqual( ResultState.Error, result.ResultState );
+			Assert.AreEqual( "NUnit.TestData.FailFixture.CustomExceptionFixture+CustomException : message", result.Message );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs b/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
index 59d36e3..4dd383c 100644
--- a/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
+++ b/src/NUnitCore/tests/FixtureSetUpTearDownTest.cs
@@ -1,364 +1,364 @@
-// ****************************************************************
-// 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.Security.Principal;
-using System.Threading;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.Util;
-using NUnit.TestUtilities;
-using NUnit.TestData.FixtureSetUpTearDown;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class FixtureSetupTearDownTest
-	{
-		private TestResult RunTestOnFixture( object fixture )
-		{
-			TestSuite suite = TestBuilder.MakeFixture( fixture.GetType() );
-			suite.Fixture = fixture;
-            return suite.Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		[Test]
-		public void MakeSureSetUpAndTearDownAreCalled()
-		{
-			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(1, fixture.setUpCount, "SetUp");
-			Assert.AreEqual(1, fixture.tearDownCount, "TearDown");
-		}
-
-		[Test]
-		public void MakeSureSetUpAndTearDownAreCalledOnExplicitFixture()
-		{
-			ExplicitSetUpAndTearDownFixture fixture = new ExplicitSetUpAndTearDownFixture();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(1, fixture.setUpCount, "SetUp");
-			Assert.AreEqual(1, fixture.tearDownCount, "TearDown");
-		}
-
-		[Test]
-		public void CheckInheritedSetUpAndTearDownAreCalled()
-		{
-			InheritSetUpAndTearDown fixture = new InheritSetUpAndTearDown();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(1, fixture.setUpCount);
-			Assert.AreEqual(1, fixture.tearDownCount);
-		}
-
-        [Test]
-        public static void StaticSetUpAndTearDownAreCalled()
-        {
-            StaticSetUpAndTearDownFixture.setUpCount = 0;
-            StaticSetUpAndTearDownFixture.tearDownCount = 0;
-            TestBuilder.RunTestFixture(typeof(StaticSetUpAndTearDownFixture));
-
-            Assert.AreEqual(1, StaticSetUpAndTearDownFixture.setUpCount);
-            Assert.AreEqual(1, StaticSetUpAndTearDownFixture.tearDownCount);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public static void StaticClassSetUpAndTearDownAreCalled()
-        {
-            StaticClassSetUpAndTearDownFixture.setUpCount = 0;
-            StaticClassSetUpAndTearDownFixture.tearDownCount = 0;
-            TestBuilder.RunTestFixture(typeof(StaticClassSetUpAndTearDownFixture));
-
-            Assert.AreEqual(1, StaticClassSetUpAndTearDownFixture.setUpCount);
-            Assert.AreEqual(1, StaticClassSetUpAndTearDownFixture.tearDownCount);
-        }
-#endif
-
-		[Test]
-		public void OverriddenSetUpAndTearDownAreNotCalled()
-		{
-            DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
-            RunTestOnFixture(fixture);
-
-            Assert.AreEqual(0, fixture.setUpCount);
-            Assert.AreEqual(0, fixture.tearDownCount);
-            Assert.AreEqual(1, fixture.derivedSetUpCount);
-            Assert.AreEqual(1, fixture.derivedTearDownCount);
-        }
-
-        [Test]
-        public void BaseSetUpCalledFirstAndTearDownCalledLast()
-        {
-            DerivedSetUpAndTearDownFixture fixture = new DerivedSetUpAndTearDownFixture();
-            RunTestOnFixture(fixture);
-
-            Assert.AreEqual(1, fixture.setUpCount);
-            Assert.AreEqual(1, fixture.tearDownCount);
-            Assert.AreEqual(1, fixture.derivedSetUpCount);
-            Assert.AreEqual(1, fixture.derivedTearDownCount);
-            Assert.That(fixture.baseSetUpCalledFirst, "Base SetUp called first");
-            Assert.That(fixture.baseTearDownCalledLast, "Base TearDown called last");
-        }
-
-        [Test]
-        public void StaticBaseSetUpCalledFirstAndTearDownCalledLast()
-        {
-            StaticSetUpAndTearDownFixture.setUpCount = 0;
-            StaticSetUpAndTearDownFixture.tearDownCount = 0;
-            DerivedStaticSetUpAndTearDownFixture.derivedSetUpCount = 0;
-            DerivedStaticSetUpAndTearDownFixture.derivedTearDownCount = 0;
-
-            DerivedStaticSetUpAndTearDownFixture fixture = new DerivedStaticSetUpAndTearDownFixture();
-            RunTestOnFixture(fixture);
-
-            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.setUpCount);
-            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.tearDownCount);
-            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.derivedSetUpCount);
-            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.derivedTearDownCount);
-            Assert.That(DerivedStaticSetUpAndTearDownFixture.baseSetUpCalledFirst, "Base SetUp called first");
-            Assert.That(DerivedStaticSetUpAndTearDownFixture.baseTearDownCalledLast, "Base TearDown called last");
-        }
-
-        [Test]
-		public void HandleErrorInFixtureSetup() 
-		{
-			MisbehavingFixture fixture = new MisbehavingFixture();
-			fixture.blowUpInSetUp = true;
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
-			Assert.AreEqual( 0, fixture.tearDownCount, "tearDownCOunt" );
-
-			// should have one suite and one fixture
-			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-			
-			Assert.AreEqual(ResultState.Error, result.ResultState);
-			Assert.AreEqual("SetUp : System.Exception : This was thrown from fixture setup", result.Message, "TestSuite Message");
-			Assert.IsNotNull(result.StackTrace, "TestSuite StackTrace should not be null");
-
-			TestResult testResult = ((TestResult)result.Results[0]);
-			Assert.IsTrue(testResult.Executed, "Test should have executed");
-			Assert.AreEqual("TestFixtureSetUp failed in MisbehavingFixture", testResult.Message, "TestSuite Message");
-            Assert.AreEqual(FailureSite.Parent, testResult.FailureSite);
-			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "Test stackTrace should match TestSuite stackTrace" );
-		}
-
-		[Test]
-		public void RerunFixtureAfterSetUpFixed() 
-		{
-			MisbehavingFixture fixture = new MisbehavingFixture();
-			fixture.blowUpInSetUp = true;
-			TestResult result = RunTestOnFixture( fixture );
-
-			// should have one suite and one fixture
-			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-			Assert.IsTrue(result.Executed, "Suite should have executed");
-
-			//fix the blow up in setup
-			fixture.Reinitialize();
-			result = RunTestOnFixture( fixture );
-
-			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
-			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
-
-			// should have one suite and one fixture
-			summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-		}
-
-		[Test]
-		public void HandleIgnoreInFixtureSetup() 
-		{
-			IgnoreInFixtureSetUp fixture = new IgnoreInFixtureSetUp();
-			TestResult result = RunTestOnFixture( fixture );
-
-			// should have one suite and one fixture
-			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(0, summ.TestsRun);
-			Assert.AreEqual(1, summ.TestsNotRun);
-			Assert.IsFalse(result.Executed, "Suite should not have executed");
-			Assert.AreEqual("TestFixtureSetUp called Ignore", result.Message);
-			Assert.IsNotNull(result.StackTrace, "StackTrace should not be null");
-
-			TestResult testResult = ((TestResult)result.Results[0]);
-			Assert.IsFalse(testResult.Executed, "Testcase should not have executed");
-			Assert.AreEqual("TestFixtureSetUp called Ignore", testResult.Message );
-		}
-
-		[Test]
-		public void HandleErrorInFixtureTearDown() 
-		{
-			MisbehavingFixture fixture = new MisbehavingFixture();
-			fixture.blowUpInTearDown = true;
-			TestResult result = RunTestOnFixture( fixture );
-			Assert.AreEqual(1, result.Results.Count);
-			Assert.IsTrue(result.Executed, "Suite should have executed");
-			Assert.IsTrue(result.IsFailure, "Suite should have failed" );
-
-			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
-			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
-
-			Assert.AreEqual("This was thrown from fixture teardown", result.Message);
-			Assert.IsNotNull(result.StackTrace, "StackTrace should not be null");
-
-			// should have one suite and one fixture
-			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-		}
-
-		[Test]
-		public void HandleExceptionInFixtureConstructor()
-		{
-			TestSuite suite = TestBuilder.MakeFixture( typeof( ExceptionInConstructor ) );
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-
-			// should have one suite and one fixture
-			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-			
-			Assert.AreEqual(ResultState.Error, result.ResultState);
-			Assert.AreEqual("SetUp : System.Exception : This was thrown in constructor", result.Message, "TestSuite Message");
-			Assert.IsNotNull(result.StackTrace, "TestSuite StackTrace should not be null");
-
-			TestResult testResult = ((TestResult)result.Results[0]);
-			Assert.IsTrue(testResult.Executed, "Testcase should have executed");
-			Assert.AreEqual("TestFixtureSetUp failed in ExceptionInConstructor", testResult.Message, "TestSuite Message");
-            Assert.AreEqual(FailureSite.Parent, testResult.FailureSite);
-			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "Test stackTrace should match TestSuite stackTrace" );
-		}
-
-		[Test]
-		public void RerunFixtureAfterTearDownFixed() 
-		{
-			MisbehavingFixture fixture = new MisbehavingFixture();
-			fixture.blowUpInTearDown = true;
-			TestResult result = RunTestOnFixture( fixture );
-			Assert.AreEqual(1, result.Results.Count);
-
-			// should have one suite and one fixture
-			ResultSummarizer summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-
-			fixture.Reinitialize();
-			result = RunTestOnFixture( fixture );
-
-			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
-			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
-
-			summ = new ResultSummarizer(result);
-			Assert.AreEqual(1, summ.TestsRun);
-			Assert.AreEqual(0, summ.TestsNotRun);
-		}
-
-		[Test]
-		public void HandleSetUpAndTearDownWithTestInName()
-		{
-			SetUpAndTearDownWithTestInName fixture = new SetUpAndTearDownWithTestInName();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(1, fixture.setUpCount);
-			Assert.AreEqual(1, fixture.tearDownCount);
-		}
-
-		[Test]
-		public void RunningSingleMethodCallsSetUpAndTearDown()
-		{
-			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
-			TestSuite suite = TestBuilder.MakeFixture( fixture.GetType() );
-			suite.Fixture = fixture;
-			Test test = (Test)suite.Tests[0];
-			
-			suite.Run(NullListener.NULL, new Filters.NameFilter( test.TestName ) );
-
-			Assert.AreEqual(1, fixture.setUpCount);
-			Assert.AreEqual(1, fixture.tearDownCount);
-		}
-
-		[Test]
-		public void IgnoredFixtureShouldNotCallFixtureSetUpOrTearDown()
-		{
-			IgnoredFixture fixture = new IgnoredFixture();
-			TestSuite suite = new TestSuite("IgnoredFixtureSuite");
-			TestSuite fixtureSuite = TestBuilder.MakeFixture( fixture.GetType() );
-			suite.Fixture = fixture;
-			Test test = (Test)fixtureSuite.Tests[0];
-			suite.Add( fixtureSuite );
-
-            fixtureSuite.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running fixture" );
-			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running fixture" );
-
-            suite.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running enclosing suite" );
-			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running enclosing suite" );
-
-            test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running a test case" );
-			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running a test case" );
-		}
-
-		[Test]
-		public void FixtureWithNoTestsCallsFixtureSetUpAndTearDown()
-		{
-            // NOTE: Beginning with NUnit 2.5.3, FixtureSetUp and TearDown
-            // are called even if the fixture contains no tests.
-
-			FixtureWithNoTests fixture = new FixtureWithNoTests();
-			RunTestOnFixture( fixture );		
-			Assert.IsTrue( fixture.setupCalled, "TestFixtureSetUp not called" );
-			Assert.IsTrue( fixture.teardownCalled, "TestFixtureTearDown not called" );
-		}
-
-        [Test]
-        public void DisposeCalledWhenFixtureImplementsIDisposable()
-        {
-            DisposableFixture fixture = new DisposableFixture();
-            RunTestOnFixture(fixture);
-            Assert.IsTrue(fixture.disposeCalled);
-        }
-
-        [TestFixture]
-        class ChangesMadeInFixtureSetUp
-        {
-            [TestFixtureSetUp]
-            public void TestFixtureSetUp()
-            {
-                GenericIdentity identity = new GenericIdentity("foo");
-                Thread.CurrentPrincipal = new GenericPrincipal(identity, new string[0]);
-
-                System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-GB");
-                Thread.CurrentThread.CurrentCulture = culture;
-                Thread.CurrentThread.CurrentUICulture = culture;
-            }
-
-            [Test]
-            public void TestThatChangesPersistUsingSameThread()
-            {
-                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name);
-                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentCulture.Name);
-                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentUICulture.Name);
-            }
-
-            [Test, RequiresThread]
-            public void TestThatChangesPersistUsingSeparateThread()
-            {
-                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name);
-                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentCulture.Name);
-                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentUICulture.Name);
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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.Security.Principal;
+using System.Threading;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.Util;
+using NUnit.TestUtilities;
+using NUnit.TestData.FixtureSetUpTearDown;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class FixtureSetupTearDownTest
+	{
+		private TestResult RunTestOnFixture( object fixture )
+		{
+			TestSuite suite = TestBuilder.MakeFixture( fixture.GetType() );
+			suite.Fixture = fixture;
+            return suite.Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		[Test]
+		public void MakeSureSetUpAndTearDownAreCalled()
+		{
+			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(1, fixture.setUpCount, "SetUp");
+			Assert.AreEqual(1, fixture.tearDownCount, "TearDown");
+		}
+
+		[Test]
+		public void MakeSureSetUpAndTearDownAreCalledOnExplicitFixture()
+		{
+			ExplicitSetUpAndTearDownFixture fixture = new ExplicitSetUpAndTearDownFixture();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(1, fixture.setUpCount, "SetUp");
+			Assert.AreEqual(1, fixture.tearDownCount, "TearDown");
+		}
+
+		[Test]
+		public void CheckInheritedSetUpAndTearDownAreCalled()
+		{
+			InheritSetUpAndTearDown fixture = new InheritSetUpAndTearDown();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(1, fixture.setUpCount);
+			Assert.AreEqual(1, fixture.tearDownCount);
+		}
+
+        [Test]
+        public static void StaticSetUpAndTearDownAreCalled()
+        {
+            StaticSetUpAndTearDownFixture.setUpCount = 0;
+            StaticSetUpAndTearDownFixture.tearDownCount = 0;
+            TestBuilder.RunTestFixture(typeof(StaticSetUpAndTearDownFixture));
+
+            Assert.AreEqual(1, StaticSetUpAndTearDownFixture.setUpCount);
+            Assert.AreEqual(1, StaticSetUpAndTearDownFixture.tearDownCount);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public static void StaticClassSetUpAndTearDownAreCalled()
+        {
+            StaticClassSetUpAndTearDownFixture.setUpCount = 0;
+            StaticClassSetUpAndTearDownFixture.tearDownCount = 0;
+            TestBuilder.RunTestFixture(typeof(StaticClassSetUpAndTearDownFixture));
+
+            Assert.AreEqual(1, StaticClassSetUpAndTearDownFixture.setUpCount);
+            Assert.AreEqual(1, StaticClassSetUpAndTearDownFixture.tearDownCount);
+        }
+#endif
+
+		[Test]
+		public void OverriddenSetUpAndTearDownAreNotCalled()
+		{
+            DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
+            RunTestOnFixture(fixture);
+
+            Assert.AreEqual(0, fixture.setUpCount);
+            Assert.AreEqual(0, fixture.tearDownCount);
+            Assert.AreEqual(1, fixture.derivedSetUpCount);
+            Assert.AreEqual(1, fixture.derivedTearDownCount);
+        }
+
+        [Test]
+        public void BaseSetUpCalledFirstAndTearDownCalledLast()
+        {
+            DerivedSetUpAndTearDownFixture fixture = new DerivedSetUpAndTearDownFixture();
+            RunTestOnFixture(fixture);
+
+            Assert.AreEqual(1, fixture.setUpCount);
+            Assert.AreEqual(1, fixture.tearDownCount);
+            Assert.AreEqual(1, fixture.derivedSetUpCount);
+            Assert.AreEqual(1, fixture.derivedTearDownCount);
+            Assert.That(fixture.baseSetUpCalledFirst, "Base SetUp called first");
+            Assert.That(fixture.baseTearDownCalledLast, "Base TearDown called last");
+        }
+
+        [Test]
+        public void StaticBaseSetUpCalledFirstAndTearDownCalledLast()
+        {
+            StaticSetUpAndTearDownFixture.setUpCount = 0;
+            StaticSetUpAndTearDownFixture.tearDownCount = 0;
+            DerivedStaticSetUpAndTearDownFixture.derivedSetUpCount = 0;
+            DerivedStaticSetUpAndTearDownFixture.derivedTearDownCount = 0;
+
+            DerivedStaticSetUpAndTearDownFixture fixture = new DerivedStaticSetUpAndTearDownFixture();
+            RunTestOnFixture(fixture);
+
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.setUpCount);
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.tearDownCount);
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.derivedSetUpCount);
+            Assert.AreEqual(1, DerivedStaticSetUpAndTearDownFixture.derivedTearDownCount);
+            Assert.That(DerivedStaticSetUpAndTearDownFixture.baseSetUpCalledFirst, "Base SetUp called first");
+            Assert.That(DerivedStaticSetUpAndTearDownFixture.baseTearDownCalledLast, "Base TearDown called last");
+        }
+
+        [Test]
+		public void HandleErrorInFixtureSetup() 
+		{
+			MisbehavingFixture fixture = new MisbehavingFixture();
+			fixture.blowUpInSetUp = true;
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
+			Assert.AreEqual( 0, fixture.tearDownCount, "tearDownCOunt" );
+
+			// should have one suite and one fixture
+			ResultSummarizer summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+			
+			Assert.AreEqual(ResultState.Error, result.ResultState);
+			Assert.AreEqual("SetUp : System.Exception : This was thrown from fixture setup", result.Message, "TestSuite Message");
+			Assert.IsNotNull(result.StackTrace, "TestSuite StackTrace should not be null");
+
+			TestResult testResult = ((TestResult)result.Results[0]);
+			Assert.IsTrue(testResult.Executed, "Test should have executed");
+			Assert.AreEqual("TestFixtureSetUp failed in MisbehavingFixture", testResult.Message, "TestSuite Message");
+            Assert.AreEqual(FailureSite.Parent, testResult.FailureSite);
+			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "Test stackTrace should match TestSuite stackTrace" );
+		}
+
+		[Test]
+		public void RerunFixtureAfterSetUpFixed() 
+		{
+			MisbehavingFixture fixture = new MisbehavingFixture();
+			fixture.blowUpInSetUp = true;
+			TestResult result = RunTestOnFixture( fixture );
+
+			// should have one suite and one fixture
+			ResultSummarizer summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+			Assert.IsTrue(result.Executed, "Suite should have executed");
+
+			//fix the blow up in setup
+			fixture.Reinitialize();
+			result = RunTestOnFixture( fixture );
+
+			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
+			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
+
+			// should have one suite and one fixture
+			summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+		}
+
+		[Test]
+		public void HandleIgnoreInFixtureSetup() 
+		{
+			IgnoreInFixtureSetUp fixture = new IgnoreInFixtureSetUp();
+			TestResult result = RunTestOnFixture( fixture );
+
+			// should have one suite and one fixture
+			ResultSummarizer summ = new ResultSummarizer(result);
+			Assert.AreEqual(0, summ.TestsRun);
+			Assert.AreEqual(1, summ.TestsNotRun);
+			Assert.IsFalse(result.Executed, "Suite should not have executed");
+			Assert.AreEqual("TestFixtureSetUp called Ignore", result.Message);
+			Assert.IsNotNull(result.StackTrace, "StackTrace should not be null");
+
+			TestResult testResult = ((TestResult)result.Results[0]);
+			Assert.IsFalse(testResult.Executed, "Testcase should not have executed");
+			Assert.AreEqual("TestFixtureSetUp called Ignore", testResult.Message );
+		}
+
+		[Test]
+		public void HandleErrorInFixtureTearDown() 
+		{
+			MisbehavingFixture fixture = new MisbehavingFixture();
+			fixture.blowUpInTearDown = true;
+			TestResult result = RunTestOnFixture( fixture );
+			Assert.AreEqual(1, result.Results.Count);
+			Assert.IsTrue(result.Executed, "Suite should have executed");
+			Assert.IsTrue(result.IsFailure, "Suite should have failed" );
+
+			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
+			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
+
+			Assert.AreEqual("This was thrown from fixture teardown", result.Message);
+			Assert.IsNotNull(result.StackTrace, "StackTrace should not be null");
+
+			// should have one suite and one fixture
+			ResultSummarizer summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+		}
+
+		[Test]
+		public void HandleExceptionInFixtureConstructor()
+		{
+			TestSuite suite = TestBuilder.MakeFixture( typeof( ExceptionInConstructor ) );
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+
+			// should have one suite and one fixture
+			ResultSummarizer summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+			
+			Assert.AreEqual(ResultState.Error, result.ResultState);
+			Assert.AreEqual("SetUp : System.Exception : This was thrown in constructor", result.Message, "TestSuite Message");
+			Assert.IsNotNull(result.StackTrace, "TestSuite StackTrace should not be null");
+
+			TestResult testResult = ((TestResult)result.Results[0]);
+			Assert.IsTrue(testResult.Executed, "Testcase should have executed");
+			Assert.AreEqual("TestFixtureSetUp failed in ExceptionInConstructor", testResult.Message, "TestSuite Message");
+            Assert.AreEqual(FailureSite.Parent, testResult.FailureSite);
+			Assert.AreEqual(testResult.StackTrace, testResult.StackTrace, "Test stackTrace should match TestSuite stackTrace" );
+		}
+
+		[Test]
+		public void RerunFixtureAfterTearDownFixed() 
+		{
+			MisbehavingFixture fixture = new MisbehavingFixture();
+			fixture.blowUpInTearDown = true;
+			TestResult result = RunTestOnFixture( fixture );
+			Assert.AreEqual(1, result.Results.Count);
+
+			// should have one suite and one fixture
+			ResultSummarizer summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+
+			fixture.Reinitialize();
+			result = RunTestOnFixture( fixture );
+
+			Assert.AreEqual( 1, fixture.setUpCount, "setUpCount" );
+			Assert.AreEqual( 1, fixture.tearDownCount, "tearDownCOunt" );
+
+			summ = new ResultSummarizer(result);
+			Assert.AreEqual(1, summ.TestsRun);
+			Assert.AreEqual(0, summ.TestsNotRun);
+		}
+
+		[Test]
+		public void HandleSetUpAndTearDownWithTestInName()
+		{
+			SetUpAndTearDownWithTestInName fixture = new SetUpAndTearDownWithTestInName();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(1, fixture.setUpCount);
+			Assert.AreEqual(1, fixture.tearDownCount);
+		}
+
+		[Test]
+		public void RunningSingleMethodCallsSetUpAndTearDown()
+		{
+			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
+			TestSuite suite = TestBuilder.MakeFixture( fixture.GetType() );
+			suite.Fixture = fixture;
+			Test test = (Test)suite.Tests[0];
+			
+			suite.Run(NullListener.NULL, new Filters.NameFilter( test.TestName ) );
+
+			Assert.AreEqual(1, fixture.setUpCount);
+			Assert.AreEqual(1, fixture.tearDownCount);
+		}
+
+		[Test]
+		public void IgnoredFixtureShouldNotCallFixtureSetUpOrTearDown()
+		{
+			IgnoredFixture fixture = new IgnoredFixture();
+			TestSuite suite = new TestSuite("IgnoredFixtureSuite");
+			TestSuite fixtureSuite = TestBuilder.MakeFixture( fixture.GetType() );
+			suite.Fixture = fixture;
+			Test test = (Test)fixtureSuite.Tests[0];
+			suite.Add( fixtureSuite );
+
+            fixtureSuite.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running fixture" );
+			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running fixture" );
+
+            suite.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running enclosing suite" );
+			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running enclosing suite" );
+
+            test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsFalse( fixture.setupCalled, "TestFixtureSetUp called running a test case" );
+			Assert.IsFalse( fixture.teardownCalled, "TestFixtureTearDown called running a test case" );
+		}
+
+		[Test]
+		public void FixtureWithNoTestsCallsFixtureSetUpAndTearDown()
+		{
+            // NOTE: Beginning with NUnit 2.5.3, FixtureSetUp and TearDown
+            // are called even if the fixture contains no tests.
+
+			FixtureWithNoTests fixture = new FixtureWithNoTests();
+			RunTestOnFixture( fixture );		
+			Assert.IsTrue( fixture.setupCalled, "TestFixtureSetUp not called" );
+			Assert.IsTrue( fixture.teardownCalled, "TestFixtureTearDown not called" );
+		}
+
+        [Test]
+        public void DisposeCalledWhenFixtureImplementsIDisposable()
+        {
+            DisposableFixture fixture = new DisposableFixture();
+            RunTestOnFixture(fixture);
+            Assert.IsTrue(fixture.disposeCalled);
+        }
+
+        [TestFixture]
+        class ChangesMadeInFixtureSetUp
+        {
+            [TestFixtureSetUp]
+            public void TestFixtureSetUp()
+            {
+                GenericIdentity identity = new GenericIdentity("foo");
+                Thread.CurrentPrincipal = new GenericPrincipal(identity, new string[0]);
+
+                System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-GB");
+                Thread.CurrentThread.CurrentCulture = culture;
+                Thread.CurrentThread.CurrentUICulture = culture;
+            }
+
+            [Test]
+            public void TestThatChangesPersistUsingSameThread()
+            {
+                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentCulture.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentUICulture.Name);
+            }
+
+            [Test, RequiresThread]
+            public void TestThatChangesPersistUsingSeparateThread()
+            {
+                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentCulture.Name);
+                Assert.AreEqual("en-GB", Thread.CurrentThread.CurrentUICulture.Name);
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs b/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
index 0f3c990..70cf3ad 100644
--- a/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
+++ b/src/NUnitCore/tests/Generic/DeduceTypeArgsFromArgs.cs
@@ -1,31 +1,31 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-#if CLR_2_0 || CLR_4_0
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests.Generic
-{
-    [Category("Generics")]
-    [TestFixture(100.0, 42)]
-    [TestFixture(42, 100.0)]
-    public class DeduceTypeArgsFromArgs<T1, T2>
-    {
-        public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
-        {
-        }
-
-        [TestCase(5, 7)]
-        public void TestMyArgTypes(T1 t1, T2 t2)
-        {
-            Assert.That(t1, Is.TypeOf<T1>());
-            Assert.That(t2, Is.TypeOf<T2>());
-        }
-    }
-}
-#endif
-
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [Category("Generics")]
+    [TestFixture(100.0, 42)]
+    [TestFixture(42, 100.0)]
+    public class DeduceTypeArgsFromArgs<T1, T2>
+    {
+        public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
+        {
+        }
+
+        [TestCase(5, 7)]
+        public void TestMyArgTypes(T1 t1, T2 t2)
+        {
+            Assert.That(t1, Is.TypeOf<T1>());
+            Assert.That(t2, Is.TypeOf<T2>());
+        }
+    }
+}
+#endif
+
diff --git a/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs b/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
index a4a1032..c19cfb9 100644
--- a/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
+++ b/src/NUnitCore/tests/Generic/SimpleGenericFixture.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-#if CLR_2_0 || CLR_4_0
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Text;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests.Generic
-{
-    [Category("Generics")]
-    [TestFixture(typeof(List<int>))]
-    [TestFixture(TypeArgs=new Type[] {typeof(ArrayList)} )]
-    public class SimpleGenericFixture<TList> where TList : IList, new()
-    {
-        [Test]
-        public void TestCollectionCount()
-        {
-            Console.WriteLine("TList is {0}", typeof(TList));
-            IList list = new TList();
-            list.Add(1);
-            list.Add(2);
-            list.Add(3);
-            Assert.AreEqual(3, list.Count);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [Category("Generics")]
+    [TestFixture(typeof(List<int>))]
+    [TestFixture(TypeArgs=new Type[] {typeof(ArrayList)} )]
+    public class SimpleGenericFixture<TList> where TList : IList, new()
+    {
+        [Test]
+        public void TestCollectionCount()
+        {
+            Console.WriteLine("TList is {0}", typeof(TList));
+            IList list = new TList();
+            list.Add(1);
+            list.Add(2);
+            list.Add(3);
+            Assert.AreEqual(3, list.Count);
+        }
+    }
+}
 #endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs b/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
index 6d06ac8..b3da4d8 100644
--- a/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
+++ b/src/NUnitCore/tests/Generic/SimpleGenericMethods.cs
@@ -1,51 +1,51 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-#if CLR_2_0 || CLR_4_0
-using System;
-using System.Collections.Generic;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests.Generic
-{
-    [TestFixture,Category("Generics")]
-    class SimpleGenericMethods
-    {
-        [TestCase(5, 2, "ABC")]
-        [TestCase(5.0, 2.0, "ABC")]
-        [TestCase(5, 2.0, "ABC")]
-        [TestCase(5.0, 2L, "ABC")]
-        public void GenericTestMethodWithOneTypeParameter<T>(T x, T y, string label)
-        {
-            Assert.AreEqual(5, x);
-            Assert.AreEqual(2, y);
-            Assert.AreEqual("ABC", label);
-        }
-
-        [TestCase(5, 2, "ABC")]
-        [TestCase(5.0, 2.0, "ABC")]
-        [TestCase(5, 2.0, "ABC")]
-        [TestCase(5.0, 2L, "ABC")]
-        public void GenericTestMethodWithTwoTypeParameters<T1, T2>(T1 x, T2 y, string label)
-        {
-            Assert.AreEqual(5, x);
-            Assert.AreEqual(2, y);
-            Assert.AreEqual("ABC", label);
-        }
-
-        [TestCase(5, 2, "ABC")]
-        [TestCase(5.0, 2.0, "ABC")]
-        [TestCase(5, 2.0, "ABC")]
-        [TestCase(5.0, 2L, "ABC")]
-        public void GenericTestMethodWithTwoTypeParameters_Reversed<T1, T2>(T2 x, T1 y, string label)
-        {
-            Assert.AreEqual(5, x);
-            Assert.AreEqual(2, y);
-            Assert.AreEqual("ABC", label);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [TestFixture,Category("Generics")]
+    class SimpleGenericMethods
+    {
+        [TestCase(5, 2, "ABC")]
+        [TestCase(5.0, 2.0, "ABC")]
+        [TestCase(5, 2.0, "ABC")]
+        [TestCase(5.0, 2L, "ABC")]
+        public void GenericTestMethodWithOneTypeParameter<T>(T x, T y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(5, 2, "ABC")]
+        [TestCase(5.0, 2.0, "ABC")]
+        [TestCase(5, 2.0, "ABC")]
+        [TestCase(5.0, 2L, "ABC")]
+        public void GenericTestMethodWithTwoTypeParameters<T1, T2>(T1 x, T2 y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(5, 2, "ABC")]
+        [TestCase(5.0, 2.0, "ABC")]
+        [TestCase(5, 2.0, "ABC")]
+        [TestCase(5.0, 2L, "ABC")]
+        public void GenericTestMethodWithTwoTypeParameters_Reversed<T1, T2>(T2 x, T1 y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+    }
+}
 #endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs b/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
index a8cfcb6..fc11b45 100644
--- a/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
+++ b/src/NUnitCore/tests/Generic/TypeParameterUsedWithTestMethod.cs
@@ -1,25 +1,25 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-#if CLR_2_0 || CLR_4_0
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests.Generic
-{
-    [Category("Generics")]
-    [TestFixture(typeof(double))]
-    public class TypeParameterUsedWithTestMethod<T>
-    {
-        [TestCase(5)]
-        [TestCase(1.23)]
-        public void TestMyArgType(T x)
-        {
-            Assert.That(x, Is.TypeOf(typeof(T)));
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests.Generic
+{
+    [Category("Generics")]
+    [TestFixture(typeof(double))]
+    public class TypeParameterUsedWithTestMethod<T>
+    {
+        [TestCase(5)]
+        [TestCase(1.23)]
+        public void TestMyArgType(T x)
+        {
+            Assert.That(x, Is.TypeOf(typeof(T)));
+        }
+    }
+}
 #endif
\ No newline at end of file
diff --git a/src/NUnitCore/tests/IgnoreFixture.cs b/src/NUnitCore/tests/IgnoreFixture.cs
index 36d2b7e..b6f822a 100644
--- a/src/NUnitCore/tests/IgnoreFixture.cs
+++ b/src/NUnitCore/tests/IgnoreFixture.cs
@@ -1,133 +1,133 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.TestUtilities;
-using NUnit.TestData.IgnoreFixture;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Tests of IgnoreException and Assert.Ignore
-	/// </summary>
-	[TestFixture]
-	public class IgnoreFixture
-	{
-		[Test]
-		public void IgnoreThrowsIgnoreException()
-		{
-			//Note that we can't use ExpectedException here because
-			//Assert.Ignore takes precedence and the test is ignored.
-			try
-			{
-				Assert.Ignore("I threw this!");
-			}
-			catch(IgnoreException ex)
-			{
-				Assert.AreEqual("I threw this!", ex.Message);
-			}
-		}
-
-		[Test]
-		public void IgnoreWorksForTestCase()
-		{
-            Type fixtureType = typeof(IgnoredTestCaseFixture);
-            Test test = TestBuilder.MakeTestCase(fixtureType, "CallsIgnore");
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.IsFalse(result.Executed, "Test should not run");
-            Assert.AreEqual("Ignore me", result.Message);
-        }
-
-        [Test]
-        public void IgnoreTakesPrecedenceOverExpectedException()
-        {
-            Type fixtureType = typeof(IgnoredTestCaseFixture);
-            Test test = TestBuilder.MakeTestCase(fixtureType, "CallsIgnoreWithExpectedException");
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.IsFalse(result.Executed, "Test should not run");
-            Assert.AreEqual("Ignore me", result.Message);
-        }
-
-		[Test]
-		public void IgnoreWorksForTestSuite()
-		{
-			//IgnoredTestSuiteFixture testFixture = new IgnoredTestSuiteFixture();
-			TestSuite suite = new TestSuite("IgnoredTestFixture");
-			suite.Add( TestBuilder.MakeFixture( typeof( IgnoredTestSuiteFixture ) ) );
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-
-			TestResult fixtureResult = (TestResult)result.Results[0];
-			Assert.IsFalse( fixtureResult.Executed, "Fixture should not have been executed" );
-			
-			foreach( TestResult testResult in fixtureResult.Results )
-				Assert.IsFalse( testResult.Executed, "Test case should not have been executed" );
-		}
-
-		[Test]
-		public void IgnoreWorksFromSetUp()
-		{
-			TestSuite testFixture = TestBuilder.MakeFixture( typeof( IgnoreInSetUpFixture ) );
-            TestResult fixtureResult = testFixture.Run(NullListener.NULL, TestFilter.Empty);
-		
-			foreach( TestResult testResult in fixtureResult.Results )
-				Assert.IsFalse( testResult.Executed, "Test case should not have been executed" );
-		}
-
-		[Test]
-		public void IgnoreWithUserMessage()
-		{
-			try
-			{
-				Assert.Ignore( "my message" );
-			}
-			catch( IgnoreException ex )
-			{
-				Assert.AreEqual( "my message", ex.Message );
-			}
-		}
-
-		[Test]
-		public void IgnoreWithUserMessage_OneArg()
-		{
-			try
-			{
-				Assert.Ignore( "The number is {0}", 5 );
-			}
-			catch( IgnoreException ex )
-			{
-				Assert.AreEqual( "The number is 5", ex.Message );
-			}
-		}
-
-		[Test]
-		public void IgnoreWithUserMessage_ThreeArgs()
-		{
-			try
-			{
-				Assert.Ignore( "The numbers are {0}, {1} and {2}", 1, 2, 3 );
-			}
-			catch( IgnoreException ex )
-			{
-				Assert.AreEqual( "The numbers are 1, 2 and 3", ex.Message );
-			}
-		}
-
-		[Test]
-		public void IgnoreWithUserMessage_ArrayOfArgs()
-		{
-			try
-			{
-			Assert.Ignore( "The numbers are {0}, {1} and {2}", new object[] { 1, 2, 3 } );
-			}
-			catch( IgnoreException ex )
-			{
-				Assert.AreEqual( "The numbers are 1, 2 and 3", ex.Message );
-			}
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.TestUtilities;
+using NUnit.TestData.IgnoreFixture;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Tests of IgnoreException and Assert.Ignore
+	/// </summary>
+	[TestFixture]
+	public class IgnoreFixture
+	{
+		[Test]
+		public void IgnoreThrowsIgnoreException()
+		{
+			//Note that we can't use ExpectedException here because
+			//Assert.Ignore takes precedence and the test is ignored.
+			try
+			{
+				Assert.Ignore("I threw this!");
+			}
+			catch(IgnoreException ex)
+			{
+				Assert.AreEqual("I threw this!", ex.Message);
+			}
+		}
+
+		[Test]
+		public void IgnoreWorksForTestCase()
+		{
+            Type fixtureType = typeof(IgnoredTestCaseFixture);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "CallsIgnore");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsFalse(result.Executed, "Test should not run");
+            Assert.AreEqual("Ignore me", result.Message);
+        }
+
+        [Test]
+        public void IgnoreTakesPrecedenceOverExpectedException()
+        {
+            Type fixtureType = typeof(IgnoredTestCaseFixture);
+            Test test = TestBuilder.MakeTestCase(fixtureType, "CallsIgnoreWithExpectedException");
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.IsFalse(result.Executed, "Test should not run");
+            Assert.AreEqual("Ignore me", result.Message);
+        }
+
+		[Test]
+		public void IgnoreWorksForTestSuite()
+		{
+			//IgnoredTestSuiteFixture testFixture = new IgnoredTestSuiteFixture();
+			TestSuite suite = new TestSuite("IgnoredTestFixture");
+			suite.Add( TestBuilder.MakeFixture( typeof( IgnoredTestSuiteFixture ) ) );
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+
+			TestResult fixtureResult = (TestResult)result.Results[0];
+			Assert.IsFalse( fixtureResult.Executed, "Fixture should not have been executed" );
+			
+			foreach( TestResult testResult in fixtureResult.Results )
+				Assert.IsFalse( testResult.Executed, "Test case should not have been executed" );
+		}
+
+		[Test]
+		public void IgnoreWorksFromSetUp()
+		{
+			TestSuite testFixture = TestBuilder.MakeFixture( typeof( IgnoreInSetUpFixture ) );
+            TestResult fixtureResult = testFixture.Run(NullListener.NULL, TestFilter.Empty);
+		
+			foreach( TestResult testResult in fixtureResult.Results )
+				Assert.IsFalse( testResult.Executed, "Test case should not have been executed" );
+		}
+
+		[Test]
+		public void IgnoreWithUserMessage()
+		{
+			try
+			{
+				Assert.Ignore( "my message" );
+			}
+			catch( IgnoreException ex )
+			{
+				Assert.AreEqual( "my message", ex.Message );
+			}
+		}
+
+		[Test]
+		public void IgnoreWithUserMessage_OneArg()
+		{
+			try
+			{
+				Assert.Ignore( "The number is {0}", 5 );
+			}
+			catch( IgnoreException ex )
+			{
+				Assert.AreEqual( "The number is 5", ex.Message );
+			}
+		}
+
+		[Test]
+		public void IgnoreWithUserMessage_ThreeArgs()
+		{
+			try
+			{
+				Assert.Ignore( "The numbers are {0}, {1} and {2}", 1, 2, 3 );
+			}
+			catch( IgnoreException ex )
+			{
+				Assert.AreEqual( "The numbers are 1, 2 and 3", ex.Message );
+			}
+		}
+
+		[Test]
+		public void IgnoreWithUserMessage_ArrayOfArgs()
+		{
+			try
+			{
+			Assert.Ignore( "The numbers are {0}, {1} and {2}", new object[] { 1, 2, 3 } );
+			}
+			catch( IgnoreException ex )
+			{
+				Assert.AreEqual( "The numbers are 1, 2 and 3", ex.Message );
+			}
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/LegacySuiteTests.cs b/src/NUnitCore/tests/LegacySuiteTests.cs
index 60f7f1b..8dcee51 100644
--- a/src/NUnitCore/tests/LegacySuiteTests.cs
+++ b/src/NUnitCore/tests/LegacySuiteTests.cs
@@ -1,142 +1,142 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.TestData;
-using NUnit.TestData.LegacySuiteData;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for LegacySuiteTests.
-	/// </summary>
-	[TestFixture]
-	public class LegacySuiteTests
-	{
-        static int setupCount = 0;
-        static int teardownCount = 0;
-        private Builders.LegacySuiteBuilder builder = new Builders.LegacySuiteBuilder();
-
-        [Test]
-        public void SuiteReturningTestSuite()
-        {
-            Test suite = builder.BuildFrom(typeof(NUnit.Core.Tests.AllTests));
-            Assert.AreEqual(RunState.Runnable, suite.RunState);
-            Assert.AreEqual(3, suite.Tests.Count);
-            Assert.AreEqual(10, suite.TestCount);
-        }
-
-        [Test]
-        public void SuiteReturningFixtures()
-        {
-            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtures));
-            Assert.AreEqual(RunState.Runnable, suite.RunState);
-            Assert.AreEqual(3, suite.Tests.Count);
-            Assert.AreEqual(10, suite.TestCount);
-        }
-
-        private class LegacySuiteReturningFixtures
-        {
-            [Suite]
-            public static IEnumerable Suite
-            {
-                get
-                {
-                    ArrayList suite = new ArrayList();
-                    suite.Add(new OneTestCase());
-                    suite.Add(new AssemblyTests());
-                    suite.Add(new NoNamespaceTestFixture());
-                    return suite;
-                }
-            }
-        }
-
-        [Test]
-        public void SuiteReturningFixtureWithArguments()
-        {
-            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtureWithArguments));
-            Assert.AreEqual(RunState.Runnable, suite.RunState);
-            Assert.AreEqual(1, suite.Tests.Count);
-            Assert.AreEqual(0, suite.TestCount);
-        }
-
-        [Test]
-        public void SuiteReturningTypes()
-        {
-            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningTypes));
-            Assert.AreEqual(RunState.Runnable, suite.RunState);
-            Assert.AreEqual(3, suite.Tests.Count);
-            Assert.AreEqual(10, suite.TestCount);
-        }
-
-        private class LegacySuiteReturningTypes
-        {
-            [Suite]
-            public static IEnumerable Suite
-            {
-                get
-                {
-                    ArrayList suite = new ArrayList();
-                    suite.Add(typeof(OneTestCase));
-                    suite.Add(typeof(AssemblyTests));
-                    suite.Add(typeof(NoNamespaceTestFixture));
-                    return suite;
-                }
-            }
-        }
-
-        [Test]
-		public void SetUpAndTearDownAreCalled()
-		{
-            setupCount = teardownCount = 0;
-			Test suite = builder.BuildFrom( typeof( LegacySuiteWithSetUpAndTearDown ) );
-            Assert.AreEqual(RunState.Runnable, suite.RunState);
-            suite.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.AreEqual( 1, setupCount );
-			Assert.AreEqual( 1, teardownCount );
-		}
-
-		private class LegacySuiteWithSetUpAndTearDown
-		{
- 			[Suite]
-			public static TestSuite TheSuite
-			{
-				get { return new TestSuite( "EmptySuite" ); }
-			}
-
-			[TestFixtureSetUp]
-			public void SetUpMethod()
-			{
-				setupCount++;
-			}
-
-			[TestFixtureTearDown]
-			public void TearDownMethod()
-			{
-				teardownCount++;
-			}
-		}
-
-        [Test]
-        public void SuitePropertyWithInvalidType()
-        {
-            Test suite = builder.BuildFrom(typeof(LegacySuiteWithInvalidPropertyType));
-            Assert.AreEqual(RunState.NotRunnable, suite.RunState);
-        }
-
-        private class LegacySuiteWithInvalidPropertyType
-        {
-            [Suite]
-            public static object TheSuite
-            {
-                get { return null; }
-            }
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.TestData;
+using NUnit.TestData.LegacySuiteData;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for LegacySuiteTests.
+	/// </summary>
+	[TestFixture]
+	public class LegacySuiteTests
+	{
+        static int setupCount = 0;
+        static int teardownCount = 0;
+        private Builders.LegacySuiteBuilder builder = new Builders.LegacySuiteBuilder();
+
+        [Test]
+        public void SuiteReturningTestSuite()
+        {
+            Test suite = builder.BuildFrom(typeof(NUnit.Core.Tests.AllTests));
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            Assert.AreEqual(3, suite.Tests.Count);
+            Assert.AreEqual(10, suite.TestCount);
+        }
+
+        [Test]
+        public void SuiteReturningFixtures()
+        {
+            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtures));
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            Assert.AreEqual(3, suite.Tests.Count);
+            Assert.AreEqual(10, suite.TestCount);
+        }
+
+        private class LegacySuiteReturningFixtures
+        {
+            [Suite]
+            public static IEnumerable Suite
+            {
+                get
+                {
+                    ArrayList suite = new ArrayList();
+                    suite.Add(new OneTestCase());
+                    suite.Add(new AssemblyTests());
+                    suite.Add(new NoNamespaceTestFixture());
+                    return suite;
+                }
+            }
+        }
+
+        [Test]
+        public void SuiteReturningFixtureWithArguments()
+        {
+            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningFixtureWithArguments));
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            Assert.AreEqual(1, suite.Tests.Count);
+            Assert.AreEqual(0, suite.TestCount);
+        }
+
+        [Test]
+        public void SuiteReturningTypes()
+        {
+            Test suite = builder.BuildFrom(typeof(LegacySuiteReturningTypes));
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            Assert.AreEqual(3, suite.Tests.Count);
+            Assert.AreEqual(10, suite.TestCount);
+        }
+
+        private class LegacySuiteReturningTypes
+        {
+            [Suite]
+            public static IEnumerable Suite
+            {
+                get
+                {
+                    ArrayList suite = new ArrayList();
+                    suite.Add(typeof(OneTestCase));
+                    suite.Add(typeof(AssemblyTests));
+                    suite.Add(typeof(NoNamespaceTestFixture));
+                    return suite;
+                }
+            }
+        }
+
+        [Test]
+		public void SetUpAndTearDownAreCalled()
+		{
+            setupCount = teardownCount = 0;
+			Test suite = builder.BuildFrom( typeof( LegacySuiteWithSetUpAndTearDown ) );
+            Assert.AreEqual(RunState.Runnable, suite.RunState);
+            suite.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.AreEqual( 1, setupCount );
+			Assert.AreEqual( 1, teardownCount );
+		}
+
+		private class LegacySuiteWithSetUpAndTearDown
+		{
+ 			[Suite]
+			public static TestSuite TheSuite
+			{
+				get { return new TestSuite( "EmptySuite" ); }
+			}
+
+			[TestFixtureSetUp]
+			public void SetUpMethod()
+			{
+				setupCount++;
+			}
+
+			[TestFixtureTearDown]
+			public void TearDownMethod()
+			{
+				teardownCount++;
+			}
+		}
+
+        [Test]
+        public void SuitePropertyWithInvalidType()
+        {
+            Test suite = builder.BuildFrom(typeof(LegacySuiteWithInvalidPropertyType));
+            Assert.AreEqual(RunState.NotRunnable, suite.RunState);
+        }
+
+        private class LegacySuiteWithInvalidPropertyType
+        {
+            [Suite]
+            public static object TheSuite
+            {
+                get { return null; }
+            }
+        }
+	}
+}
diff --git a/src/NUnitCore/tests/MaxTimeTests.cs b/src/NUnitCore/tests/MaxTimeTests.cs
index aff0e41..c6fb797 100644
--- a/src/NUnitCore/tests/MaxTimeTests.cs
+++ b/src/NUnitCore/tests/MaxTimeTests.cs
@@ -1,70 +1,70 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.TestData;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Tests for MaxTime decoration.
-	/// </summary>
-    [TestFixture]
-    public class MaxTimeTests
-	{
-		[Test,MaxTime(1000)]
-		public void MaxTimeNotExceeded()
-		{
-		}
-
-        // TODO: We need a way to simulate the clock reliably
-        [Test]
-        public void MaxTimeExceeded()
-        {
-            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixture));
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            result = (TestResult)result.Results[0];
-            StringAssert.IsMatch(@"Elapsed time of \d*ms exceeds maximum of 1ms", result.Message);
-        }
-
-        [Test, MaxTime(1000)]
-        [ExpectedException(typeof(AssertionException), ExpectedMessage = "Intentional Failure")]
-        public void FailureReport()
-        {
-            Assert.Fail("Intentional Failure");
-        }
-
-        [Test]
-        public void FailureReportHasPriorityOverMaxTime()
-		{
-            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixtureWithFailure));
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            result = (TestResult)result.Results[0];
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            StringAssert.IsMatch("Intentional Failure", result.Message);
-        }
-
-        [Test, MaxTime(1000), ExpectedException]
-        public void ErrorReport()
-        {
-            throw new Exception();
-        }
-
-        [Test]
-        public void ErrorReportHasPriorityOverMaxTime()
-        {
-            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixtureWithError));
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            result = (TestResult)result.Results[0];
-            Assert.AreEqual(ResultState.Error, result.ResultState);
-            StringAssert.IsMatch("Exception message", result.Message);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Tests for MaxTime decoration.
+	/// </summary>
+    [TestFixture]
+    public class MaxTimeTests
+	{
+		[Test,MaxTime(1000)]
+		public void MaxTimeNotExceeded()
+		{
+		}
+
+        // TODO: We need a way to simulate the clock reliably
+        [Test]
+        public void MaxTimeExceeded()
+        {
+            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixture));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            result = (TestResult)result.Results[0];
+            StringAssert.IsMatch(@"Elapsed time of \d*ms exceeds maximum of 1ms", result.Message);
+        }
+
+        [Test, MaxTime(1000)]
+        [ExpectedException(typeof(AssertionException), ExpectedMessage = "Intentional Failure")]
+        public void FailureReport()
+        {
+            Assert.Fail("Intentional Failure");
+        }
+
+        [Test]
+        public void FailureReportHasPriorityOverMaxTime()
+		{
+            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixtureWithFailure));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.IsMatch("Intentional Failure", result.Message);
+        }
+
+        [Test, MaxTime(1000), ExpectedException]
+        public void ErrorReport()
+        {
+            throw new Exception();
+        }
+
+        [Test]
+        public void ErrorReportHasPriorityOverMaxTime()
+        {
+            Test test = TestFixtureBuilder.BuildFrom(typeof(MaxTimeFixtureWithError));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(ResultState.Error, result.ResultState);
+            StringAssert.IsMatch("Exception message", result.Message);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/NUnitTestCaseBuilderTests.cs b/src/NUnitCore/tests/NUnitTestCaseBuilderTests.cs
new file mode 100644
index 0000000..53ed6bf
--- /dev/null
+++ b/src/NUnitCore/tests/NUnitTestCaseBuilderTests.cs
@@ -0,0 +1,67 @@
+using System.Collections;
+using System.Reflection;
+using NUnit.Core.Builders;
+using NUnit.Framework;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class NUnitTestCaseBuilderTests
+	{
+		private NUnitTestCaseBuilder _sut;
+
+		[SetUp]
+		public void Setup()
+		{
+			_sut = new NUnitTestCaseBuilder();
+		}
+
+		public IEnumerable TestsSource
+		{
+			get
+			{
+				return new TestCaseData[] {
+                    new TestCaseData( Method("NonVoidTest"), RunState.NotRunnable )
+                };
+			}
+		}
+
+		public IEnumerable TestCasesSource
+		{
+			get
+			{
+				return new TestCaseData[] {
+                    new TestCaseData( Method("VoidTestCaseWithExpectedResult"), RunState.NotRunnable )
+                };
+			}
+		}
+
+		[TestCaseSource("TestsSource")]
+		public void Tests(MethodInfo method, RunState state)
+		{
+			Test built = _sut.BuildFrom(method);
+
+			Assert.That(built, Is.InstanceOf(typeof(NUnitTestMethod)));
+			Assert.That(built.RunState, Is.EqualTo(state));
+		}
+
+		[TestCaseSource("TestCasesSource")]
+		public void TestCases(MethodInfo method, RunState state)
+		{
+			Test built = _sut.BuildFrom(method);
+
+			NUnitTestMethod testMethod = built.Tests[0] as NUnitTestMethod;
+
+			Assert.IsNotNull(testMethod);
+
+			Assert.That(testMethod.RunState, Is.EqualTo(state));
+		}
+
+		public MethodInfo Method(string name)
+		{
+			return typeof (TestCaseBuilderFixture).GetMethod(name);
+		}
+	}
+}
+
diff --git a/src/NUnitCore/tests/NameFilterTest.cs b/src/NUnitCore/tests/NameFilterTest.cs
index db02e58..f3a8148 100644
--- a/src/NUnitCore/tests/NameFilterTest.cs
+++ b/src/NUnitCore/tests/NameFilterTest.cs
@@ -1,121 +1,121 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-using NUnit.Core.Builders;
-using NUnit.Core.Filters;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class NameFilterTest
-	{
-		private TestSuite testSuite;
-		private Test mock3;
-
-		[SetUp]
-		public void SetUp() 
-		{
-			testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add( TestBuilder.MakeFixture( typeof( MockTestFixture ) ) );
-			mock3 = TestFinder.Find("MockTest3", testSuite, true);
-		}
-
-		[Test]
-		public void SingleNameMatch() 
-		{
-			string fullName = "NUnit.Tests.Assemblies.MockTestFixture.MockTest3";
-			Assert.AreEqual(fullName, mock3.TestName.FullName);
-			NameFilter filter = new NameFilter(mock3.TestName);
-			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-			Assert.AreEqual("NUnit.Tests.Assemblies.MockTestFixture", ((TestSuite)testSuite.Tests[0]).TestName.FullName);
-			Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
-		}
-
-		[Test]
-		public void MultipleNameMatch() 
-		{
-			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
-			NameFilter filter = new NameFilter();
-			filter.Add(mock3.TestName);
-			filter.Add(mock1.TestName);
-			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-			Assert.IsTrue(filter.Pass(mock1), "Name Filter did not pass test case");
-			Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
-		}
-
-		[Test]
-		public void SuiteNameMatch() 
-		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
-			NameFilter filter = new NameFilter(mockTest.TestName);
-			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-			Assert.IsTrue(filter.Pass(mockTest), "Suite did not pass test case");
-			Assert.IsTrue(filter.Pass(testSuite), "Suite did not pass test case");
-		}
-
-		[Test]
-		public void TestDoesNotMatch() 
-		{
-			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
-			NameFilter filter = new NameFilter(mock1.TestName);
-			Assert.IsFalse(filter.Pass(mock3), "Name Filter did pass test case");
-			Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass test suite");
-		}
-
-		[Test]
-		public void HighLevelSuite() 
-		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
-			NameFilter filter = new NameFilter(testSuite.TestName);
-			Assert.AreEqual( true, filter.Pass(mock3), "test case");
-			Assert.AreEqual( true, filter.Pass(mockTest), "middle suite");
-			Assert.AreEqual( true, filter.Pass(testSuite), "test suite");
-		}
-
-		[Test]
-		public void ExplicitTestCaseDoesNotMatchWhenNotSelectedDirectly()
-		{
-			Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
-			NameFilter filter = new NameFilter( testSuite.TestName );
-			Assert.AreEqual( false, filter.Pass(explicitTest) );
-		}
-
-		[Test]
-		public void ExplicitTestCaseMatchesWhenSelectedDirectly()
-		{
-			Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
-			NameFilter filter = new NameFilter( explicitTest.TestName );
-			Assert.IsTrue(filter.Pass(explicitTest), "Name Filter did not pass on test case" );
-			Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass on test suite" );
-		}
-
-		[Test]
-		public void ExplicitTestSuiteDoesNotMatchWhenNotSelectedDirectly()
-		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
-			mockTest.RunState = RunState.Explicit;
-			NameFilter filter = new NameFilter(testSuite.TestName);
-			Assert.AreEqual( false, filter.Pass(mock3), "descendant of explicit suite should not match" );
-			Assert.AreEqual( false, filter.Pass(mockTest), "explicit suite should not match" );
-		}
-
-		[Test]
-		public void ExplicitTestSuiteMatchesWhenSelectedDirectly()
-		{
-			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
-			mockTest.RunState = RunState.Explicit;
-			NameFilter filter = new NameFilter(mockTest.TestName);
-			Assert.AreEqual( true, filter.Pass(mock3), "test case" );
-			Assert.AreEqual( true, filter.Pass(mockTest), "middle suite");
-			Assert.AreEqual( true, filter.Pass(testSuite), "test suite");
-		}
-	}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+using NUnit.Core.Builders;
+using NUnit.Core.Filters;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class NameFilterTest
+	{
+		private TestSuite testSuite;
+		private Test mock3;
+
+		[SetUp]
+		public void SetUp() 
+		{
+			testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add( TestBuilder.MakeFixture( typeof( MockTestFixture ) ) );
+			mock3 = TestFinder.Find("MockTest3", testSuite, true);
+		}
+
+		[Test]
+		public void SingleNameMatch() 
+		{
+			string fullName = "NUnit.Tests.Assemblies.MockTestFixture.MockTest3";
+			Assert.AreEqual(fullName, mock3.TestName.FullName);
+			NameFilter filter = new NameFilter(mock3.TestName);
+			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
+			Assert.AreEqual("NUnit.Tests.Assemblies.MockTestFixture", ((TestSuite)testSuite.Tests[0]).TestName.FullName);
+			Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
+		}
+
+		[Test]
+		public void MultipleNameMatch() 
+		{
+			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
+			NameFilter filter = new NameFilter();
+			filter.Add(mock3.TestName);
+			filter.Add(mock1.TestName);
+			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
+			Assert.IsTrue(filter.Pass(mock1), "Name Filter did not pass test case");
+			Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
+		}
+
+		[Test]
+		public void SuiteNameMatch() 
+		{
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
+			NameFilter filter = new NameFilter(mockTest.TestName);
+			Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
+			Assert.IsTrue(filter.Pass(mockTest), "Suite did not pass test case");
+			Assert.IsTrue(filter.Pass(testSuite), "Suite did not pass test case");
+		}
+
+		[Test]
+		public void TestDoesNotMatch() 
+		{
+			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
+			NameFilter filter = new NameFilter(mock1.TestName);
+			Assert.IsFalse(filter.Pass(mock3), "Name Filter did pass test case");
+			Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass test suite");
+		}
+
+		[Test]
+		public void HighLevelSuite() 
+		{
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
+			NameFilter filter = new NameFilter(testSuite.TestName);
+			Assert.AreEqual( true, filter.Pass(mock3), "test case");
+			Assert.AreEqual( true, filter.Pass(mockTest), "middle suite");
+			Assert.AreEqual( true, filter.Pass(testSuite), "test suite");
+		}
+
+		[Test]
+		public void ExplicitTestCaseDoesNotMatchWhenNotSelectedDirectly()
+		{
+			Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
+			NameFilter filter = new NameFilter( testSuite.TestName );
+			Assert.AreEqual( false, filter.Pass(explicitTest) );
+		}
+
+		[Test]
+		public void ExplicitTestCaseMatchesWhenSelectedDirectly()
+		{
+			Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
+			NameFilter filter = new NameFilter( explicitTest.TestName );
+			Assert.IsTrue(filter.Pass(explicitTest), "Name Filter did not pass on test case" );
+			Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass on test suite" );
+		}
+
+		[Test]
+		public void ExplicitTestSuiteDoesNotMatchWhenNotSelectedDirectly()
+		{
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
+			mockTest.RunState = RunState.Explicit;
+			NameFilter filter = new NameFilter(testSuite.TestName);
+			Assert.AreEqual( false, filter.Pass(mock3), "descendant of explicit suite should not match" );
+			Assert.AreEqual( false, filter.Pass(mockTest), "explicit suite should not match" );
+		}
+
+		[Test]
+		public void ExplicitTestSuiteMatchesWhenSelectedDirectly()
+		{
+			NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite) TestFinder.Find("MockTestFixture", testSuite, true);
+			mockTest.RunState = RunState.Explicit;
+			NameFilter filter = new NameFilter(mockTest.TestName);
+			Assert.AreEqual( true, filter.Pass(mock3), "test case" );
+			Assert.AreEqual( true, filter.Pass(mockTest), "middle suite");
+			Assert.AreEqual( true, filter.Pass(testSuite), "test suite");
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/NUnitCore/tests/NamespaceAssemblyTests.cs b/src/NUnitCore/tests/NamespaceAssemblyTests.cs
index bdbd8f5..3e64998 100644
--- a/src/NUnitCore/tests/NamespaceAssemblyTests.cs
+++ b/src/NUnitCore/tests/NamespaceAssemblyTests.cs
@@ -1,83 +1,83 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Tests.Assemblies;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class NamespaceAssemblyTests
-	{
-        private string testsDll = MockAssembly.AssemblyPath;
-        private string nonamespaceDLL = NoNamespaceTestFixture.AssemblyPath;
-		
-		[Test]
-		public void LoadTestFixtureFromAssembly()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			TestPackage package = new TestPackage( testsDll );
-			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-			Test suite= builder.Build( package );
-			Assert.IsNotNull(suite);
-		}
-
-		[Test]
-		public void TestRoot()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( testsDll ) );
-			Assert.AreEqual(testsDll, suite.TestName.Name);
-		}
-
-		[Test]
-		public void Hierarchy()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( testsDll ) );
-
-            suite = (Test)suite.Tests[0];
-            Assert.AreEqual("NUnit", suite.TestName.Name);
-
-            suite = (Test)suite.Tests[0];
-            Assert.AreEqual("Tests", suite.TestName.Name);
-			Assert.AreEqual(MockAssembly.Classes, suite.Tests.Count);
-
-			Test singletonSuite = TestFinder.Find("Singletons", suite, false);
-			Assert.AreEqual(1, singletonSuite.Tests.Count);
-
-			Test mockSuite = TestFinder.Find("Assemblies", suite, false);
-			Assert.AreEqual(1, mockSuite.Tests.Count);
-
-			Test mockFixtureSuite = TestFinder.Find("MockTestFixture", mockSuite, false);
-			Assert.AreEqual(MockTestFixture.Tests, mockFixtureSuite.Tests.Count);
-
-			foreach(Test t in mockFixtureSuite.Tests)
-			{
-				Assert.IsFalse(t.IsSuite, "Should not be a suite");
-			}
-		}
-			
-		[Test]
-		public void NoNamespaceInAssembly()
-		{
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( nonamespaceDLL ) );
-			Assert.IsNotNull(suite);
-			Assert.AreEqual( NoNamespaceTestFixture.Tests, suite.TestCount );
-
-			suite = (TestSuite)suite.Tests[0];
-			Assert.IsNotNull(suite);
-			Assert.AreEqual( "NoNamespaceTestFixture", suite.TestName.Name );
-			Assert.AreEqual( "NoNamespaceTestFixture", suite.TestName.FullName );
-		}
-	}
-}
+// ****************************************************************
+// 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.Reflection;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Tests.Assemblies;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class NamespaceAssemblyTests
+	{
+        private string testsDll = MockAssembly.AssemblyPath;
+        private string nonamespaceDLL = NoNamespaceTestFixture.AssemblyPath;
+		
+		[Test]
+		public void LoadTestFixtureFromAssembly()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			TestPackage package = new TestPackage( testsDll );
+			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			Test suite= builder.Build( package );
+			Assert.IsNotNull(suite);
+		}
+
+		[Test]
+		public void TestRoot()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( testsDll ) );
+			Assert.AreEqual(testsDll, suite.TestName.Name);
+		}
+
+		[Test]
+		public void Hierarchy()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( testsDll ) );
+
+            suite = (Test)suite.Tests[0];
+            Assert.AreEqual("NUnit", suite.TestName.Name);
+
+            suite = (Test)suite.Tests[0];
+            Assert.AreEqual("Tests", suite.TestName.Name);
+			Assert.AreEqual(MockAssembly.Classes, suite.Tests.Count);
+
+			Test singletonSuite = TestFinder.Find("Singletons", suite, false);
+			Assert.AreEqual(1, singletonSuite.Tests.Count);
+
+			Test mockSuite = TestFinder.Find("Assemblies", suite, false);
+			Assert.AreEqual(1, mockSuite.Tests.Count);
+
+			Test mockFixtureSuite = TestFinder.Find("MockTestFixture", mockSuite, false);
+			Assert.AreEqual(MockTestFixture.Tests, mockFixtureSuite.Tests.Count);
+
+			foreach(Test t in mockFixtureSuite.Tests)
+			{
+				Assert.IsFalse(t.IsSuite, "Should not be a suite");
+			}
+		}
+			
+		[Test]
+		public void NoNamespaceInAssembly()
+		{
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( nonamespaceDLL ) );
+			Assert.IsNotNull(suite);
+			Assert.AreEqual( NoNamespaceTestFixture.Tests, suite.TestCount );
+
+			suite = (TestSuite)suite.Tests[0];
+			Assert.IsNotNull(suite);
+			Assert.AreEqual( "NoNamespaceTestFixture", suite.TestName.Name );
+			Assert.AreEqual( "NoNamespaceTestFixture", suite.TestName.FullName );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/PairwiseTests.cs b/src/NUnitCore/tests/PairwiseTests.cs
index a27205f..ad390d1 100644
--- a/src/NUnitCore/tests/PairwiseTests.cs
+++ b/src/NUnitCore/tests/PairwiseTests.cs
@@ -1,122 +1,122 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class PairwiseTest
-    {
-        [TestFixture]
-        public class LiveTest
-        {
-            public Hashtable pairsTested = new Hashtable();
-
-            [TestFixtureSetUp]
-            public void TestFixtureSetUp()
-            {
-                pairsTested = new Hashtable();
-            }
-
-            [TestFixtureTearDown]
-            public void TestFixtureTearDown()
-            {
-                Assert.That(pairsTested.Count, Is.EqualTo(16));
-            }
-
-            [Test, Pairwise]
-            public void Test(
-                [Values("a", "b", "c")] string a,
-                [Values("+", "-")] string b,
-                [Values("x", "y")] string c)
-            {
-                Console.WriteLine("Pairwise: {0} {1} {2}", a, b, c);
-
-                pairsTested[a + b] = null;
-                pairsTested[a + c] = null;
-                pairsTested[b + c] = null;
-            }
-        }
-
-        // Test data is taken from various sources. See "Lessons Learned
-        // in Software Testing" pp 53-59, for example. For orthogonal cases, see 
-        // http://www.freequality.org/sites/www_freequality_org/documents/tools/Tagarray_files/tamatrix.htm
-        internal static object[] cases = new object[]
-        {
-#if ORIGINAL
-            new TestCaseData( new int[] { 2, 4 }, 8, 8 ).SetName("Test 2x4"),
-            new TestCaseData( new int[] { 2, 2, 2 }, 5, 4 ).SetName("Test 2x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2 }, 6, 6 ).SetName("Test 3x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2, 2 }, 7, 6 ).SetName("Test 3x2x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2, 2, 2 }, 8, 6 ).SetName("Test 3x2x2x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2, 2, 2, 2 }, 9, 8 ).SetName("Test 3x2x2x2x2x2"),
-            new TestCaseData( new int[] { 3, 3, 3 }, 12, 9 ).SetName("Test 3x3x3"),
-            new TestCaseData( new int[] { 4, 4, 4 }, 22, 16 ).SetName("Test 4x4x4"),
-            new TestCaseData( new int[] { 5, 5, 5 }, 34, 25 ).SetName("Test 5x5x5")
-#else
-            new TestCaseData( new int[] { 2, 4 }, 8, 8 ).SetName("Test 2x4"),
-            new TestCaseData( new int[] { 2, 2, 2 }, 5, 4 ).SetName("Test 2x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2 }, 7, 6 ).SetName("Test 3x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2, 2 }, 8, 6 ).SetName("Test 3x2x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2, 2, 2 }, 9, 6 ).SetName("Test 3x2x2x2x2"),
-            new TestCaseData( new int[] { 3, 2, 2, 2, 2, 2 }, 9, 8 ).SetName("Test 3x2x2x2x2x2"),
-            new TestCaseData( new int[] { 3, 3, 3 }, 9, 9 ).SetName("Test 3x3x3"),
-            new TestCaseData( new int[] { 4, 4, 4 }, 17, 16 ).SetName("Test 4x4x4"),
-            new TestCaseData( new int[] { 5, 5, 5 }, 27, 25 ).SetName("Test 5x5x5")
-#endif
-        };
-
-        [Test, TestCaseSource("cases")]
-        public void Test(int[] dimensions, int bestSoFar, int targetCases)
-        {
-            int features = dimensions.Length;
-
-            string[][] sources = new string[features][];
-
-            for (int i = 0; i < features; i++)
-            {
-                string featureName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(i, 1);
-
-                int n = dimensions[i];
-                sources[i] = new string[n];
-                for (int j = 0; j < n; j++)
-                    sources[i][j] = featureName + j.ToString();
-            }
-
-            CombiningStrategy strategy = new PairwiseStrategy(sources);
-
-            Hashtable pairs = new Hashtable();
-            int cases = 0;
-            foreach (NUnit.Core.Extensibility.ParameterSet testcase in strategy.GetTestCases())
-            {
-                for (int i = 1; i < features; i++)
-                    for (int j = 0; j < i; j++)
-                    {
-                        string a = testcase.Arguments[i] as string;
-                        string b = testcase.Arguments[j] as string;
-                        pairs[a + b] = null;
-                    }
-
-                ++cases;
-            }
-
-            int expectedPairs = 0;
-            for (int i = 1; i < features; i++)
-                for (int j = 0; j < i; j++)
-                    expectedPairs += dimensions[i] * dimensions[j];
-
-            Assert.That(pairs.Count, Is.EqualTo(expectedPairs), "Number of pairs is incorrect");
-            Assert.That(cases, Is.AtMost(bestSoFar), "Regression: Number of test cases exceeded target previously reached");
-#if DEBUG
-            //Assert.That(cases, Is.AtMost(targetCases), "Number of test cases exceeded target");
-#endif
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class PairwiseTest
+    {
+        [TestFixture]
+        public class LiveTest
+        {
+            public Hashtable pairsTested = new Hashtable();
+
+            [TestFixtureSetUp]
+            public void TestFixtureSetUp()
+            {
+                pairsTested = new Hashtable();
+            }
+
+            [TestFixtureTearDown]
+            public void TestFixtureTearDown()
+            {
+                Assert.That(pairsTested.Count, Is.EqualTo(16));
+            }
+
+            [Test, Pairwise]
+            public void Test(
+                [Values("a", "b", "c")] string a,
+                [Values("+", "-")] string b,
+                [Values("x", "y")] string c)
+            {
+                Console.WriteLine("Pairwise: {0} {1} {2}", a, b, c);
+
+                pairsTested[a + b] = null;
+                pairsTested[a + c] = null;
+                pairsTested[b + c] = null;
+            }
+        }
+
+        // Test data is taken from various sources. See "Lessons Learned
+        // in Software Testing" pp 53-59, for example. For orthogonal cases, see 
+        // http://www.freequality.org/sites/www_freequality_org/documents/tools/Tagarray_files/tamatrix.htm
+        internal static object[] cases = new object[]
+        {
+#if ORIGINAL
+            new TestCaseData( new int[] { 2, 4 }, 8, 8 ).SetName("Test 2x4"),
+            new TestCaseData( new int[] { 2, 2, 2 }, 5, 4 ).SetName("Test 2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2 }, 6, 6 ).SetName("Test 3x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2 }, 7, 6 ).SetName("Test 3x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2 }, 8, 6 ).SetName("Test 3x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2, 2 }, 9, 8 ).SetName("Test 3x2x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 3, 3 }, 12, 9 ).SetName("Test 3x3x3"),
+            new TestCaseData( new int[] { 4, 4, 4 }, 22, 16 ).SetName("Test 4x4x4"),
+            new TestCaseData( new int[] { 5, 5, 5 }, 34, 25 ).SetName("Test 5x5x5")
+#else
+            new TestCaseData( new int[] { 2, 4 }, 8, 8 ).SetName("Test 2x4"),
+            new TestCaseData( new int[] { 2, 2, 2 }, 5, 4 ).SetName("Test 2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2 }, 7, 6 ).SetName("Test 3x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2 }, 8, 6 ).SetName("Test 3x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2 }, 9, 6 ).SetName("Test 3x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 2, 2, 2, 2, 2 }, 9, 8 ).SetName("Test 3x2x2x2x2x2"),
+            new TestCaseData( new int[] { 3, 3, 3 }, 9, 9 ).SetName("Test 3x3x3"),
+            new TestCaseData( new int[] { 4, 4, 4 }, 17, 16 ).SetName("Test 4x4x4"),
+            new TestCaseData( new int[] { 5, 5, 5 }, 27, 25 ).SetName("Test 5x5x5")
+#endif
+        };
+
+        [Test, TestCaseSource("cases")]
+        public void Test(int[] dimensions, int bestSoFar, int targetCases)
+        {
+            int features = dimensions.Length;
+
+            string[][] sources = new string[features][];
+
+            for (int i = 0; i < features; i++)
+            {
+                string featureName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(i, 1);
+
+                int n = dimensions[i];
+                sources[i] = new string[n];
+                for (int j = 0; j < n; j++)
+                    sources[i][j] = featureName + j.ToString();
+            }
+
+            CombiningStrategy strategy = new PairwiseStrategy(sources);
+
+            Hashtable pairs = new Hashtable();
+            int cases = 0;
+            foreach (NUnit.Core.Extensibility.ParameterSet testcase in strategy.GetTestCases())
+            {
+                for (int i = 1; i < features; i++)
+                    for (int j = 0; j < i; j++)
+                    {
+                        string a = testcase.Arguments[i] as string;
+                        string b = testcase.Arguments[j] as string;
+                        pairs[a + b] = null;
+                    }
+
+                ++cases;
+            }
+
+            int expectedPairs = 0;
+            for (int i = 1; i < features; i++)
+                for (int j = 0; j < i; j++)
+                    expectedPairs += dimensions[i] * dimensions[j];
+
+            Assert.That(pairs.Count, Is.EqualTo(expectedPairs), "Number of pairs is incorrect");
+            Assert.That(cases, Is.AtMost(bestSoFar), "Regression: Number of test cases exceeded target previously reached");
+#if DEBUG
+            //Assert.That(cases, Is.AtMost(targetCases), "Number of test cases exceeded target");
+#endif
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs b/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
index 8f3da1a..89ed102 100644
--- a/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
+++ b/src/NUnitCore/tests/ParameterizedTestFixtureTests.cs
@@ -1,201 +1,219 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture("hello", "hello", "goodbye")]
-    [TestFixture("zip", "zip")]
-    [TestFixture(42, 42, 99)]
-    public class ParameterizedTestFixture
-    {
-        private string eq1;
-        private string eq2;
-        private string neq;
-        
-        public ParameterizedTestFixture(string eq1, string eq2, string neq)
-        {
-            this.eq1 = eq1;
-            this.eq2 = eq2;
-            this.neq = neq;
-        }
-
-        public ParameterizedTestFixture(string eq1, string eq2)
-            : this(eq1, eq2, null) { }
-
-        public ParameterizedTestFixture(int eq1, int eq2, int neq)
-        {
-            this.eq1 = eq1.ToString();
-            this.eq2 = eq2.ToString();
-            this.neq = neq.ToString();
-        }
-
-        [Test]
-        public void TestEquality()
-        {
-            Assert.AreEqual(eq1, eq2);
-            if (eq1 != null && eq2 != null)
-                Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
-        }
-
-        [Test]
-        public void TestInequality()
-        {
-            Assert.AreNotEqual(eq1, neq);
-            if (eq1 != null && neq != null)
-                Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
-        }
-    }
-
-#if CLR_2_0 || CLR_4_0
-    [TestFixture("A", null)]
-    [TestFixture(null, "A")]
-    [TestFixture(null, null)]
-    public class ParameterizedTestFixtureWithNullArguments
-    {
-        string a;
-        string b;
-
-        public ParameterizedTestFixtureWithNullArguments(string a, string b)
-        {
-            this.a = a;
-            this.b = b;
-        }
-
-        [Test]
-        public void TestMethod() 
-        {
-            Assert.That(a == null || b == null);
-        }
-    }
-#endif
-
-    [TestFixture(42)]
-    public class ParameterizedTestFixtureWithDataSources
-    {
-        private int answer;
-
-        internal object[] myData = { new int[] { 6, 7 }, new int[] { 3, 14 } };
-
-        public ParameterizedTestFixtureWithDataSources(int val)
-        {
-            this.answer = val;
-        }
-
-        [Test, TestCaseSource("myData")]
-        public void CanAccessTestCaseSource(int x, int y)
-        {
-            Assert.That(x * y, Is.EqualTo(answer));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        IEnumerable GenerateData()
-        {
-            for(int i = 1; i <= answer; i++)
-                if ( answer%i == 0 )
-                    yield return new int[] { i, answer/i  };
-        }
-
-        [Test, TestCaseSource("GenerateData")]
-        public void CanGenerateDataFromParameter(int x, int y)
-        {
-            Assert.That(x * y, Is.EqualTo(answer));
-        }
-#endif
-
-        internal int[] intvals = new int[] { 1, 2, 3 };
-
-        [Test]
-        public void CanAccessValueSource(
-            [ValueSource("intvals")] int x)
-        {
-            Assert.That(answer % x == 0);
-        }
-    }
-
-    public class ParameterizedTestFixtureNamingTests
-    {
-        Test fixture;
-
-        [SetUp]
-        public void MakeFixture()
-        {
-            fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.ParameterizedTestFixture));
-        }
-
-        [Test]
-        public void TopLevelSuiteIsNamedCorrectly()
-        {
-            Assert.That(fixture.TestName.Name, Is.EqualTo("ParameterizedTestFixture"));
-            Assert.That(fixture.TestName.FullName, Is.EqualTo("NUnit.TestData.ParameterizedTestFixture"));
-        }
-
-        [Test]
-        public void SuiteHasCorrectNumberOfInstances()
-        {
-            Assert.That(fixture.Tests.Count, Is.EqualTo(2));
-        }
-
-        [Test]
-        public void FixtureInstancesAreNamedCorrectly()
-        {
-            ArrayList names = new ArrayList();
-            ArrayList fullnames = new ArrayList();
-            foreach (Test test in fixture.Tests)
-            {
-                names.Add(test.TestName.Name);
-                fullnames.Add(test.TestName.FullName);
-            }
-
-            Assert.That(names, Is.EquivalentTo(new string[] {
-                "ParameterizedTestFixture(1)", "ParameterizedTestFixture(2)" }));
-            Assert.That(fullnames, Is.EquivalentTo(new string[] {
-                "NUnit.TestData.ParameterizedTestFixture(1)", "NUnit.TestData.ParameterizedTestFixture(2)" }));
-        }
-
-        [Test]
-        public void MethodWithoutParamsIsNamedCorrectly()
-        {
-            Test instance = (Test)fixture.Tests[0];
-            Test method = TestFinder.Find("MethodWithoutParams", instance, false);
-            Assert.That(method, Is.Not.Null );
-            Assert.That(method.TestName.FullName, Is.EqualTo(instance.TestName.FullName + ".MethodWithoutParams"));
-        }
-
-        [Test]
-        public void MethodWithParamsIsNamedCorrectly()
-        {
-            Test instance = (Test)fixture.Tests[0];
-            Test method = TestFinder.Find("MethodWithParams", instance, false);
-            Assert.That(method, Is.Not.Null);
-            
-            Test testcase = (Test)method.Tests[0];
-            Assert.That(testcase.TestName.Name, Is.EqualTo("MethodWithParams(10,20)"));
-            Assert.That(testcase.TestName.FullName, Is.EqualTo(instance.TestName.FullName + ".MethodWithParams(10,20)"));
-        }
-    }
-
-    public class ParameterizedTestFixtureTests
-    {
-        [Test]
-        public void CanSpecifyCategory()
-        {
-            Test fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.TestFixtureWithSingleCategory));
-            Assert.AreEqual(new string[] { "XYZ" }, fixture.Categories);
-        }
-
-        [Test]
-        public void CanSpecifyMultipleCategories()
-        {
-            Test fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.TestFixtureWithMultipleCategories));
-            Assert.AreEqual(new string[] { "X", "Y", "Z" }, fixture.Categories);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture("hello", "hello", "goodbye")]
+    [TestFixture("zip", "zip")]
+    [TestFixture(42, 42, 99)]
+    public class ParameterizedTestFixture
+    {
+        private string eq1;
+        private string eq2;
+        private string neq;
+        
+        public ParameterizedTestFixture(string eq1, string eq2, string neq)
+        {
+            this.eq1 = eq1;
+            this.eq2 = eq2;
+            this.neq = neq;
+        }
+
+        public ParameterizedTestFixture(string eq1, string eq2)
+            : this(eq1, eq2, null) { }
+
+        public ParameterizedTestFixture(int eq1, int eq2, int neq)
+        {
+            this.eq1 = eq1.ToString();
+            this.eq2 = eq2.ToString();
+            this.neq = neq.ToString();
+        }
+
+        [Test]
+        public void TestEquality()
+        {
+            Assert.AreEqual(eq1, eq2);
+            if (eq1 != null && eq2 != null)
+                Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
+        }
+
+        [Test]
+        public void TestInequality()
+        {
+            Assert.AreNotEqual(eq1, neq);
+            if (eq1 != null && neq != null)
+                Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
+        }
+    }
+
+#if CLR_2_0 || CLR_4_0
+    [TestFixture("A", null)]
+    [TestFixture(null, "A")]
+    [TestFixture(null, null)]
+    public class ParameterizedTestFixtureWithNullArguments
+    {
+        string a;
+        string b;
+
+        public ParameterizedTestFixtureWithNullArguments(string a, string b)
+        {
+            this.a = a;
+            this.b = b;
+        }
+
+        [Test]
+        public void TestMethod() 
+        {
+            Assert.That(a == null || b == null);
+        }
+    }
+#endif
+
+    [TestFixture(42)]
+    public class ParameterizedTestFixtureWithDataSources
+    {
+        private int answer;
+
+        internal object[] myData = { new int[] { 6, 7 }, new int[] { 3, 14 } };
+
+        public ParameterizedTestFixtureWithDataSources(int val)
+        {
+            this.answer = val;
+        }
+
+        [Test, TestCaseSource("myData")]
+        public void CanAccessTestCaseSource(int x, int y)
+        {
+            Assert.That(x * y, Is.EqualTo(answer));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        IEnumerable GenerateData()
+        {
+            for(int i = 1; i <= answer; i++)
+                if ( answer%i == 0 )
+                    yield return new int[] { i, answer/i  };
+        }
+
+        [Test, TestCaseSource("GenerateData")]
+        public void CanGenerateDataFromParameter(int x, int y)
+        {
+            Assert.That(x * y, Is.EqualTo(answer));
+        }
+#endif
+
+        internal int[] intvals = new int[] { 1, 2, 3 };
+
+        [Test]
+        public void CanAccessValueSource(
+            [ValueSource("intvals")] int x)
+        {
+            Assert.That(answer % x == 0);
+        }
+    }
+
+    public class ParameterizedTestFixtureNamingTests
+    {
+        Test fixture;
+
+        [SetUp]
+        public void MakeFixture()
+        {
+            fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.ParameterizedTestFixture));
+        }
+
+        [Test]
+        public void TopLevelSuiteIsNamedCorrectly()
+        {
+            Assert.That(fixture.TestName.Name, Is.EqualTo("ParameterizedTestFixture"));
+            Assert.That(fixture.TestName.FullName, Is.EqualTo("NUnit.TestData.ParameterizedTestFixture"));
+        }
+
+        [Test]
+        public void SuiteHasCorrectNumberOfInstances()
+        {
+            Assert.That(fixture.Tests.Count, Is.EqualTo(2));
+        }
+
+        [Test]
+        public void FixtureInstancesAreNamedCorrectly()
+        {
+            ArrayList names = new ArrayList();
+            ArrayList fullnames = new ArrayList();
+            foreach (Test test in fixture.Tests)
+            {
+                names.Add(test.TestName.Name);
+                fullnames.Add(test.TestName.FullName);
+            }
+
+            Assert.That(names, Is.EquivalentTo(new string[] {
+                "ParameterizedTestFixture(1)", "ParameterizedTestFixture(2)" }));
+            Assert.That(fullnames, Is.EquivalentTo(new string[] {
+                "NUnit.TestData.ParameterizedTestFixture(1)", "NUnit.TestData.ParameterizedTestFixture(2)" }));
+        }
+
+        [Test]
+        public void MethodWithoutParamsIsNamedCorrectly()
+        {
+            Test instance = (Test)fixture.Tests[0];
+            Test method = TestFinder.Find("MethodWithoutParams", instance, false);
+            Assert.That(method, Is.Not.Null );
+            Assert.That(method.TestName.FullName, Is.EqualTo(instance.TestName.FullName + ".MethodWithoutParams"));
+        }
+
+        [Test]
+        public void MethodWithParamsIsNamedCorrectly()
+        {
+            Test instance = (Test)fixture.Tests[0];
+            Test method = TestFinder.Find("MethodWithParams", instance, false);
+            Assert.That(method, Is.Not.Null);
+            
+            Test testcase = (Test)method.Tests[0];
+            Assert.That(testcase.TestName.Name, Is.EqualTo("MethodWithParams(10,20)"));
+            Assert.That(testcase.TestName.FullName, Is.EqualTo(instance.TestName.FullName + ".MethodWithParams(10,20)"));
+        }
+    }
+
+    public class ParameterizedTestFixtureTests
+    {
+        [Test]
+        public void CanSpecifyCategory()
+        {
+            Test fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.TestFixtureWithSingleCategory));
+            Assert.AreEqual(new string[] { "XYZ" }, fixture.Categories);
+        }
+
+        [Test]
+        public void CanSpecifyMultipleCategories()
+        {
+            Test fixture = TestBuilder.MakeFixture(typeof(NUnit.TestData.TestFixtureWithMultipleCategories));
+            Assert.AreEqual(new string[] { "X", "Y", "Z" }, fixture.Categories);
+        }
+    }
+
+    [TestFixture(typeof(int))]
+    [TestFixture(typeof(string))]
+    public class ParameterizedTestFixtureWithTypeAsArgument
+    {
+        private readonly Type _someType;
+
+        public ParameterizedTestFixtureWithTypeAsArgument(Type someType)
+        {
+            _someType = someType;
+        }
+
+        [Test]
+        public void MakeSureTypeIsInSystemNamespace()
+        {
+            Assert.AreEqual("System", _someType.Namespace);
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/PlatformDetectionTests.cs b/src/NUnitCore/tests/PlatformDetectionTests.cs
index 5d640c8..57337c3 100644
--- a/src/NUnitCore/tests/PlatformDetectionTests.cs
+++ b/src/NUnitCore/tests/PlatformDetectionTests.cs
@@ -1,364 +1,391 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for PlatformHelperTests.
-	/// </summary>
-	[TestFixture]
-	public class PlatformDetectionTests
-	{
-		private static readonly PlatformHelper win95Helper = new PlatformHelper( 
-			new OSPlatform( PlatformID.Win32Windows , new Version( 4, 0 ) ),
-			new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ) );
-
-		private static readonly PlatformHelper winXPHelper = new PlatformHelper( 
-			new OSPlatform( PlatformID.Win32NT , new Version( 5,1 ) ),
-			new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ) );
-
-		private void CheckOSPlatforms( OSPlatform os, 
-			string expectedPlatforms )
-		{
-			CheckPlatforms(
-				new PlatformHelper( os, RuntimeFramework.CurrentFramework ),
-				expectedPlatforms,
-				PlatformHelper.OSPlatforms );
-		}
-
-		private void CheckRuntimePlatforms( RuntimeFramework runtimeFramework, 
-			string expectedPlatforms )
-		{
-			CheckPlatforms(
-				new PlatformHelper( OSPlatform.CurrentPlatform, runtimeFramework ),
-				expectedPlatforms,
-				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, 
-			string expectedPlatforms, string checkPlatforms )
-		{
-			string[] expected = expectedPlatforms.Split( new char[] { ',' } );
-			string[] check = checkPlatforms.Split( new char[] { ',' } );
-
-			foreach( string testPlatform in check )
-			{
-				bool shouldPass = false;
-
-				foreach( string platform in expected )
-					if ( shouldPass = platform.ToLower() == testPlatform.ToLower() )
-						break;
-
-				bool didPass = helper.IsPlatformSupported( testPlatform );
-				
-				if ( shouldPass && !didPass )
-					Assert.Fail( "Failed to detect {0}", testPlatform );
-				else if ( didPass && !shouldPass )
-					Assert.Fail( "False positive on {0}", testPlatform );
-				else if ( !shouldPass && !didPass )
-					Assert.AreEqual( "Only supported on " + testPlatform, helper.Reason );
-			}
-		}
-
-		[Test]
-		public void DetectWin95()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 0 ) ),
-				"Win95,Win32Windows,Win32,Win" );
-		}
-
-		[Test]
-		public void DetectWin98()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 10 ) ),
-				"Win98,Win32Windows,Win32,Win" );
-		}
-
-		[Test]
-		public void DetectWinMe()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 90 ) ),
-				"WinMe,Win32Windows,Win32,Win" );
-		}
-
-        // WinCE isn't defined in .NET 1.0.
-		[Test, Platform(Exclude="Net-1.0")]
-		public void DetectWinCE()
-		{
-            PlatformID winCE = (PlatformID)Enum.Parse(typeof(PlatformID), "WinCE");
-			CheckOSPlatforms(
-                new OSPlatform(winCE, new Version(1, 0)),
-				"WinCE,Win32,Win" );
-		}
-
-		[Test]
-		public void DetectNT3()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32NT, new Version( 3, 51 ) ),
-				"NT3,Win32NT,Win32,Win" );
-		}
-
-		[Test]
-		public void DetectNT4()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32NT, new Version( 4, 0 ) ),
-				"NT4,Win32NT,Win32,Win,Win-4.0" );
-		}
-
-		[Test]
-		public void DetectWin2K()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32NT, new Version( 5, 0 ) ),
-				"Win2K,NT5,Win32NT,Win32,Win,Win-5.0" );
-		}
-
-		[Test]
-		public void DetectWinXP()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32NT, new Version( 5, 1 ) ),
-				"WinXP,NT5,Win32NT,Win32,Win,Win-5.1" );
-		}
-
-		[Test]
-		public void DetectWinXPProfessionalX64()
-		{
-			CheckOSPlatforms( 
-				new OSPlatform( PlatformID.Win32NT, new Version( 5, 2 ), OSPlatform.ProductType.WorkStation ),
-				"WinXP,NT5,Win32NT,Win32,Win,Win-5.1" );
-		}
-
-		[Test]
-		public void DetectWin2003Server()
-		{
-            CheckOSPlatforms(
-                new OSPlatform(PlatformID.Win32NT, new Version(5, 2), OSPlatform.ProductType.Server),
-                "Win2003Server,NT5,Win32NT,Win32,Win,Win-5.2");
-        }
-
-        [Test]
-        public void DetectVista()
-        {
-            CheckOSPlatforms(
-                new OSPlatform(PlatformID.Win32NT, new Version(6, 0), OSPlatform.ProductType.WorkStation),
-                "Vista,NT6,Win32NT,Win32,Win,Win-6.0");
-        }
-
-        [Test]
-        public void DetectWin2008ServerOriginal()
-        {
-            CheckOSPlatforms(
-                new OSPlatform(PlatformID.Win32NT, new Version(6, 0), OSPlatform.ProductType.Server),
-                "Win2008Server,NT6,Win32NT,Win32,Win,Win-6.0");
-        }
-
-        [Test]
-        public void DetectWin2008ServerR2()
-        {
-            CheckOSPlatforms(
-                new OSPlatform(PlatformID.Win32NT, new Version(6, 1), OSPlatform.ProductType.Server),
-                "Win2008Server,Win2008ServerR2,NT6,Win32NT,Win32,Win,Win-6.1");
-        }
-
-        [Test]
-        public void DetectWindows7()
-        {
-            CheckOSPlatforms(
-                new OSPlatform(PlatformID.Win32NT, new Version(6, 1), OSPlatform.ProductType.WorkStation),
-                "Windows7,NT6,Win32NT,Win32,Win,Win-6.1");
-        }
-
-        [Test]
-        public void DetectUnixUnderMicrosoftDotNet()
-        {
-            CheckOSPlatforms(
-                new OSPlatform(OSPlatform.UnixPlatformID_Microsoft, new Version()),
-                "UNIX,Linux");
-        }
-
-        // This throws under Microsoft .Net due to the invlaid enumeration value of 128
-        [Test, Platform(Exclude="Net")]
-        public void DetectUnixUnderMono()
-        {
-            CheckOSPlatforms(
-                new OSPlatform(OSPlatform.UnixPlatformID_Mono, new Version()),
-                "UNIX,Linux");
-        }
-
-        [Test]
-		public void DetectNet10()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.Net, new Version( 1, 0, 3705, 0 ) ),
-				"NET,NET-1.0" );
-		}
-
-		[Test]
-		public void DetectNet11()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ),
-				"NET,NET-1.1" );
-		}
-
-        [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, 30319, 0)),
-                "Net,Net-4.0");
-        }
-
-		[Test]
-		public void DetectNetCF()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.NetCF, new Version( 1, 1, 4322, 0 ) ),
-				"NetCF" );
-		}
-
-		[Test]
-		public void DetectSSCLI()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.SSCLI, new Version( 1, 0, 3, 0 ) ),
-				"SSCLI,Rotor" );
-		}
-
-		[Test]
-		public void DetectMono10()
-		{
-			CheckRuntimePlatforms(
-				new RuntimeFramework( RuntimeType.Mono, new Version( 1, 1, 4322, 0 ) ),
-				"Mono,Mono-1.0" );
-		}
-
-        [Test]
-        public void DetectMono20()
-        {
-            CheckRuntimePlatforms(
-                new RuntimeFramework(RuntimeType.Mono, new Version(2, 0, 50727, 0)),
-                "Mono,Mono-2.0");
-        }
-
-        [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" ) );
-			Assert.IsTrue( winXPHelper.IsPlatformSupported( "net-1.1.4322.0" ) );
-			Assert.IsFalse( winXPHelper.IsPlatformSupported( "net-1.1.4323.0" ) );
-			Assert.IsFalse( winXPHelper.IsPlatformSupported( "net-1.1.4322.1" ) );
-		}
-
-		[Test]
-		public void ArrayOfPlatforms()
-		{
-			string[] platforms = new string[] { "NT4", "Win2K", "WinXP" };
-			Assert.IsTrue( winXPHelper.IsPlatformSupported( platforms ) );
-			Assert.IsFalse( win95Helper.IsPlatformSupported( platforms ) );
-		}
-
-		[Test]
-		public void PlatformAttribute_Include()
-		{
-			PlatformAttribute attr = new PlatformAttribute( "Win2K,WinXP,NT4" );
-			Assert.IsTrue( winXPHelper.IsPlatformSupported( attr ) );
-			Assert.IsFalse( win95Helper.IsPlatformSupported( attr ) );
-			Assert.AreEqual("Only supported on Win2K,WinXP,NT4", win95Helper.Reason);
-		}
-
-		[Test]
-		public void PlatformAttribute_Exclude()
-		{
-			PlatformAttribute attr = new PlatformAttribute();
-			attr.Exclude = "Win2K,WinXP,NT4";
-			Assert.IsFalse( winXPHelper.IsPlatformSupported( attr ) );
-			Assert.AreEqual( "Not supported on Win2K,WinXP,NT4", winXPHelper.Reason );
-			Assert.IsTrue( win95Helper.IsPlatformSupported( attr ) );
-		}
-
-		[Test]
-		public void PlatformAttribute_IncludeAndExclude()
-		{
-			PlatformAttribute attr = new PlatformAttribute( "Win2K,WinXP,NT4" );
-			attr.Exclude = "Mono";
-			Assert.IsFalse( win95Helper.IsPlatformSupported( attr ) );
-			Assert.AreEqual( "Only supported on Win2K,WinXP,NT4", win95Helper.Reason );
-			Assert.IsTrue( winXPHelper.IsPlatformSupported( attr ) );
-			attr.Exclude = "Net";
-			Assert.IsFalse( win95Helper.IsPlatformSupported( attr ) );
-			Assert.AreEqual( "Only supported on Win2K,WinXP,NT4", win95Helper.Reason );
-			Assert.IsFalse( winXPHelper.IsPlatformSupported( attr ) );
-			Assert.AreEqual( "Not supported on Net", winXPHelper.Reason );
-		}
-
-		[Test]
-		public void PlatformAttribute_InvalidPlatform()
-		{
-			PlatformAttribute attr = new PlatformAttribute( "Net-1.0,Net11,Mono" );
-			Assert.IsFalse( winXPHelper.IsPlatformSupported( attr ) );
-			Assert.AreEqual( "Invalid platform name: Net11", winXPHelper.Reason );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Diagnostics;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for PlatformHelperTests.
+	/// </summary>
+	[TestFixture]
+	public class PlatformDetectionTests
+	{
+		private static readonly PlatformHelper win95Helper = new PlatformHelper( 
+			new OSPlatform( PlatformID.Win32Windows , new Version( 4, 0 ) ),
+			new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ) );
+
+		private static readonly PlatformHelper winXPHelper = new PlatformHelper( 
+			new OSPlatform( PlatformID.Win32NT , new Version( 5,1 ) ),
+			new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ) );
+
+		private void CheckOSPlatforms( OSPlatform os, 
+			string expectedPlatforms )
+		{
+			CheckPlatforms(
+				new PlatformHelper( os, RuntimeFramework.CurrentFramework ),
+				expectedPlatforms,
+				PlatformHelper.OSPlatforms );
+		}
+
+		private void CheckRuntimePlatforms( RuntimeFramework runtimeFramework, 
+			string expectedPlatforms )
+		{
+			CheckPlatforms(
+				new PlatformHelper( OSPlatform.CurrentPlatform, runtimeFramework ),
+				expectedPlatforms,
+				PlatformHelper.RuntimePlatforms + ",NET-1.0,NET-1.1,NET-2.0,NET-3.0,NET-3.5,NET-4.0,NET-4.5,MONO-1.0,MONO-2.0,MONO-3.0,MONO-3.5,MONO-4.0" );
+		}
+
+		private void CheckPlatforms( PlatformHelper helper, 
+			string expectedPlatforms, string checkPlatforms )
+		{
+			string[] expected = expectedPlatforms.Split( new char[] { ',' } );
+			string[] check = checkPlatforms.Split( new char[] { ',' } );
+
+			foreach( string testPlatform in check )
+			{
+				bool shouldPass = false;
+
+				foreach( string platform in expected )
+					if ( shouldPass = platform.ToLower() == testPlatform.ToLower() )
+						break;
+
+				bool didPass = helper.IsPlatformSupported( testPlatform );
+				
+				if ( shouldPass && !didPass )
+					Assert.Fail( "Failed to detect {0}", testPlatform );
+				else if ( didPass && !shouldPass )
+					Assert.Fail( "False positive on {0}", testPlatform );
+				else if ( !shouldPass && !didPass )
+					Assert.AreEqual( "Only supported on " + testPlatform, helper.Reason );
+			}
+		}
+
+		[Test]
+		public void DetectWin95()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 0 ) ),
+				"Win95,Win32Windows,Win32,Win" );
+		}
+
+		[Test]
+		public void DetectWin98()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 10 ) ),
+				"Win98,Win32Windows,Win32,Win" );
+		}
+
+		[Test]
+		public void DetectWinMe()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32Windows, new Version( 4, 90 ) ),
+				"WinMe,Win32Windows,Win32,Win" );
+		}
+
+        // WinCE isn't defined in .NET 1.0.
+		[Test, Platform(Exclude="Net-1.0")]
+		public void DetectWinCE()
+		{
+            PlatformID winCE = (PlatformID)Enum.Parse(typeof(PlatformID), "WinCE");
+			CheckOSPlatforms(
+                new OSPlatform(winCE, new Version(1, 0)),
+				"WinCE,Win32,Win" );
+		}
+
+		[Test]
+		public void DetectNT3()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32NT, new Version( 3, 51 ) ),
+				"NT3,Win32NT,Win32,Win" );
+		}
+
+		[Test]
+		public void DetectNT4()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32NT, new Version( 4, 0 ) ),
+				"NT4,Win32NT,Win32,Win,Win-4.0" );
+		}
+
+		[Test]
+		public void DetectWin2K()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32NT, new Version( 5, 0 ) ),
+				"Win2K,NT5,Win32NT,Win32,Win,Win-5.0" );
+		}
+
+		[Test]
+		public void DetectWinXP()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32NT, new Version( 5, 1 ) ),
+				"WinXP,NT5,Win32NT,Win32,Win,Win-5.1" );
+		}
+
+		[Test]
+		public void DetectWinXPProfessionalX64()
+		{
+			CheckOSPlatforms( 
+				new OSPlatform( PlatformID.Win32NT, new Version( 5, 2 ), OSPlatform.ProductType.WorkStation ),
+				"WinXP,NT5,Win32NT,Win32,Win,Win-5.1" );
+		}
+
+		[Test]
+		public void DetectWin2003Server()
+		{
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(5, 2), OSPlatform.ProductType.Server),
+                "Win2003Server,NT5,Win32NT,Win32,Win,Win-5.2");
+        }
+
+        [Test]
+        public void DetectVista()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 0), OSPlatform.ProductType.WorkStation),
+                "Vista,NT6,Win32NT,Win32,Win,Win-6.0");
+        }
+
+        [Test]
+        public void DetectWin2008ServerOriginal()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 0), OSPlatform.ProductType.Server),
+                "Win2008Server,NT6,Win32NT,Win32,Win,Win-6.0");
+        }
+
+        [Test]
+        public void DetectWin2008ServerR2()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 1), OSPlatform.ProductType.Server),
+                "Win2008Server,Win2008ServerR2,NT6,Win32NT,Win32,Win,Win-6.1");
+        }
+
+        [Test]
+        public void DetectWindows7()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Win32NT, new Version(6, 1), OSPlatform.ProductType.WorkStation),
+                "Windows7,NT6,Win32NT,Win32,Win,Win-6.1");
+        }
+
+        [Test]
+        public void DetectUnixUnderMicrosoftDotNet()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(OSPlatform.UnixPlatformID_Microsoft, new Version()),
+                "UNIX,Linux");
+        }
+
+        // This throws under Microsoft .Net due to the invlaid enumeration value of 128
+        [Test, Platform(Exclude="Net")]
+        public void DetectUnixUnderMono()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(OSPlatform.UnixPlatformID_Mono, new Version()),
+                "UNIX,Linux");
+        }
+
+#if (CLR_2_0 || CLR_4_0) && !NETCF
+        [Test]
+        public void DetectXbox()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.Xbox, new Version(0, 0)),
+                "Xbox");
+        }
+
+        [Test]
+        public void DetectMacOSX()
+        {
+            CheckOSPlatforms(
+                new OSPlatform(PlatformID.MacOSX, new Version(0, 0)),
+                "MacOSX");
+        }
+#endif
+
+        [Test]
+		public void DetectNet10()
+		{
+			CheckRuntimePlatforms(
+				new RuntimeFramework( RuntimeType.Net, new Version( 1, 0, 3705, 0 ) ),
+				"NET,NET-1.0" );
+		}
+
+		[Test]
+		public void DetectNet11()
+		{
+			CheckRuntimePlatforms(
+				new RuntimeFramework( RuntimeType.Net, new Version( 1, 1, 4322, 0 ) ),
+				"NET,NET-1.1" );
+		}
+
+        [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, 30319, 0)),
+                "Net,Net-4.0");
+        }
+
+		[Test]
+		public void DetectNet45()
+		{
+			CheckRuntimePlatforms(
+				new RuntimeFramework(RuntimeType.Net, new Version(4, 5)),
+				"Net,Net-4.0,Net-4.5");
+		}
+
+		[Test]
+		public void DetectNetCF()
+		{
+			CheckRuntimePlatforms(
+				new RuntimeFramework( RuntimeType.NetCF, new Version( 1, 1, 4322, 0 ) ),
+				"NetCF" );
+		}
+
+		[Test]
+		public void DetectSSCLI()
+		{
+			CheckRuntimePlatforms(
+				new RuntimeFramework( RuntimeType.SSCLI, new Version( 1, 0, 3, 0 ) ),
+				"SSCLI,Rotor" );
+		}
+
+		[Test]
+		public void DetectMono10()
+		{
+			CheckRuntimePlatforms(
+				new RuntimeFramework( RuntimeType.Mono, new Version( 1, 1, 4322, 0 ) ),
+				"Mono,Mono-1.0" );
+		}
+
+        [Test]
+        public void DetectMono20()
+        {
+            CheckRuntimePlatforms(
+                new RuntimeFramework(RuntimeType.Mono, new Version(2, 0, 50727, 0)),
+                "Mono,Mono-2.0");
+        }
+
+        [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" ) );
+			Assert.IsTrue( winXPHelper.IsPlatformSupported( "net-1.1.4322.0" ) );
+			Assert.IsFalse( winXPHelper.IsPlatformSupported( "net-1.1.4323.0" ) );
+			Assert.IsFalse( winXPHelper.IsPlatformSupported( "net-1.1.4322.1" ) );
+		}
+
+		[Test]
+		public void ArrayOfPlatforms()
+		{
+			string[] platforms = new string[] { "NT4", "Win2K", "WinXP" };
+			Assert.IsTrue( winXPHelper.IsPlatformSupported( platforms ) );
+			Assert.IsFalse( win95Helper.IsPlatformSupported( platforms ) );
+		}
+
+		[Test]
+		public void PlatformAttribute_Include()
+		{
+			PlatformAttribute attr = new PlatformAttribute( "Win2K,WinXP,NT4" );
+			Assert.IsTrue( winXPHelper.IsPlatformSupported( attr ) );
+			Assert.IsFalse( win95Helper.IsPlatformSupported( attr ) );
+			Assert.AreEqual("Only supported on Win2K,WinXP,NT4", win95Helper.Reason);
+		}
+
+		[Test]
+		public void PlatformAttribute_Exclude()
+		{
+			PlatformAttribute attr = new PlatformAttribute();
+			attr.Exclude = "Win2K,WinXP,NT4";
+			Assert.IsFalse( winXPHelper.IsPlatformSupported( attr ) );
+			Assert.AreEqual( "Not supported on Win2K,WinXP,NT4", winXPHelper.Reason );
+			Assert.IsTrue( win95Helper.IsPlatformSupported( attr ) );
+		}
+
+		[Test]
+		public void PlatformAttribute_IncludeAndExclude()
+		{
+			PlatformAttribute attr = new PlatformAttribute( "Win2K,WinXP,NT4" );
+			attr.Exclude = "Mono";
+			Assert.IsFalse( win95Helper.IsPlatformSupported( attr ) );
+			Assert.AreEqual( "Only supported on Win2K,WinXP,NT4", win95Helper.Reason );
+			Assert.IsTrue( winXPHelper.IsPlatformSupported( attr ) );
+			attr.Exclude = "Net";
+			Assert.IsFalse( win95Helper.IsPlatformSupported( attr ) );
+			Assert.AreEqual( "Only supported on Win2K,WinXP,NT4", win95Helper.Reason );
+			Assert.IsFalse( winXPHelper.IsPlatformSupported( attr ) );
+			Assert.AreEqual( "Not supported on Net", winXPHelper.Reason );
+		}
+
+		[Test]
+		public void PlatformAttribute_InvalidPlatform()
+		{
+			PlatformAttribute attr = new PlatformAttribute( "Net-1.0,Net11,Mono" );
+			Assert.IsFalse( winXPHelper.IsPlatformSupported( attr ) );
+			Assert.AreEqual( "Invalid platform name: Net11", winXPHelper.Reason );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/PropertyAttributeTests.cs b/src/NUnitCore/tests/PropertyAttributeTests.cs
index b3eb8f8..07f5689 100644
--- a/src/NUnitCore/tests/PropertyAttributeTests.cs
+++ b/src/NUnitCore/tests/PropertyAttributeTests.cs
@@ -1,53 +1,53 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.TestData.PropertyAttributeTests;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class PropertyAttributeTests
-	{
-		TestSuite fixture;
-
-		[SetUp]
-		public void CreateFixture()
-		{
-			fixture = TestBuilder.MakeFixture( typeof( FixtureWithProperties ) );
-		}
-
-		[Test]
-		public void PropertyWithStringValue()
-		{
-			Test test1 = (Test)fixture.Tests[0];
-			Assert.AreEqual( "Charlie", test1.Properties["user"] );
-		}
-
-		[Test]
-		public void PropertiesWithNumericValues()
-		{
-			Test test2 = (Test)fixture.Tests[1];
-			Assert.AreEqual( 10.0, test2.Properties["X"] );
-			Assert.AreEqual( 17.0, test2.Properties["Y"] );
-		}
-
-		[Test]
-		public void PropertyWorksOnFixtures()
-		{
-			Assert.AreEqual( "SomeClass", fixture.Properties["ClassUnderTest"] );
-		}
-
-		[Test]
-		public void CanDeriveFromPropertyAttribute()
-		{
-			Test test3 = (Test)fixture.Tests[2];
-			Assert.AreEqual( 5, test3.Properties["Priority"] );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData.PropertyAttributeTests;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class PropertyAttributeTests
+	{
+		TestSuite fixture;
+
+		[SetUp]
+		public void CreateFixture()
+		{
+			fixture = TestBuilder.MakeFixture( typeof( FixtureWithProperties ) );
+		}
+
+		[Test]
+		public void PropertyWithStringValue()
+		{
+			Test test1 = (Test)fixture.Tests[0];
+			Assert.AreEqual( "Charlie", test1.Properties["user"] );
+		}
+
+		[Test]
+		public void PropertiesWithNumericValues()
+		{
+			Test test2 = (Test)fixture.Tests[1];
+			Assert.AreEqual( 10.0, test2.Properties["X"] );
+			Assert.AreEqual( 17.0, test2.Properties["Y"] );
+		}
+
+		[Test]
+		public void PropertyWorksOnFixtures()
+		{
+			Assert.AreEqual( "SomeClass", fixture.Properties["ClassUnderTest"] );
+		}
+
+		[Test]
+		public void CanDeriveFromPropertyAttribute()
+		{
+			Test test3 = (Test)fixture.Tests[2];
+			Assert.AreEqual( 5, test3.Properties["Priority"] );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/ReflectTests.cs b/src/NUnitCore/tests/ReflectTests.cs
index 958b0bf..29b44c3 100644
--- a/src/NUnitCore/tests/ReflectTests.cs
+++ b/src/NUnitCore/tests/ReflectTests.cs
@@ -1,177 +1,177 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class ReflectTests
-	{
-		private readonly Type myType = typeof( Colors.MyClass );
-		private readonly BindingFlags BF = BindingFlags.Public | BindingFlags.Instance;
-
-		[Test]
-		public void CanDetectAttributes()
-		{
-			Assert.IsFalse( Reflect.HasAttribute( myType, "Colors.RedAttribute", false ), "Red" );
-			Assert.IsTrue( Reflect.HasAttribute( myType, "Colors.GreenAttribute", false ), "Green" );
-			Assert.IsFalse( Reflect.HasAttribute( myType, "Colors.BlueAttribute", false ), "Blue" );
-		}
-
-		[Test]
-		public void CanDetectInheritedAttributes()
-		{
-			Assert.IsTrue( Reflect.HasAttribute( myType, "Colors.RedAttribute", true ), "Red" );
-			Assert.IsTrue( Reflect.HasAttribute( myType, "Colors.GreenAttribute", true ), "Green" );
-			Assert.IsFalse( Reflect.HasAttribute( myType, "Colors.BlueAttribute", true ), "Blue" );
-		}
-
-		[Test]
-		public void GetAttribute()
-		{
-			Assert.IsNull( Reflect.GetAttribute( myType, "Colors.RedAttribute", false ), "Red" );
-			Assert.AreEqual( "GreenAttribute", 
-				Reflect.GetAttribute( myType, "Colors.GreenAttribute", false ).GetType().Name );
-			Assert.IsNull( Reflect.GetAttribute( myType, "Colors.BlueAttribute", false ), "Blue" );
-		}
-
-		[Test]
-		public void GetAttributes()
-		{
-			Assert.AreEqual( 1, Reflect.GetAttributes( myType, false ).Length );
-			Assert.AreEqual( 0, Reflect.GetAttributes( myType, "Colors.RedAttribute", false ).Length, "Red" );
-			Assert.AreEqual( 1, Reflect.GetAttributes( myType, "Colors.GreenAttribute", false ).Length, "Green" );
-			Assert.AreEqual( 0, Reflect.GetAttributes( myType, "Colors.BlueAttribute", false ).Length, "Blue" );
-		}
-
-		[Test]
-		public void GetInheritedAttribute()
-		{
-			Assert.AreEqual( "RedAttribute", 
-				Reflect.GetAttribute( myType, "Colors.RedAttribute", true ).GetType().Name );
-			Assert.AreEqual( "GreenAttribute", 
-				Reflect.GetAttribute( myType, "Colors.GreenAttribute", true ).GetType().Name );
-			Assert.IsNull( Reflect.GetAttribute( myType, "Colors.BlueAttribute", true ), "Blue" );
-		}
-	
-		[Test]
-		public void GetInheritedAttributes()
-		{
-			Assert.AreEqual( 2, Reflect.GetAttributes( myType, true ).Length );
-			Assert.AreEqual( 1, Reflect.GetAttributes( myType, "Colors.RedAttribute", true ).Length, "Red" );
-			Assert.AreEqual( 1, Reflect.GetAttributes( myType, "Colors.GreenAttribute", true ).Length, "Green" );
-			Assert.AreEqual( 0, Reflect.GetAttributes( myType, "Colors.BlueAttribute", true ).Length , "Blue" );
-		}
-	
-		[Test]
-		public void InheritsFrom()
-		{
-			Assert.IsTrue( Reflect.InheritsFrom( myType, "Colors.BaseClass" ) );
-		}
-
-		[Test]
-		public void HasInterface()
-		{
-			Assert.IsTrue( Reflect.HasInterface( myType, "Colors.MyInterface" ) );
-		}
-
-		[Test]
-		public void GetConstructor()
-		{
-			Assert.IsNotNull( Reflect.GetConstructor( myType ) );
-		}
-
-		[Test]
-		public void GetMethodsWithAttribute()
-		{
-            MethodInfo[] methods = Reflect.GetMethodsWithAttribute(myType, "Colors.BlueAttribute", false);
-            Assert.That(
-                List.Map(methods).Property("Name"), 
-                Is.EqualTo(new string[] {"BaseBlueMethod", "BlueMethod"} ));
-        }
-
-		[Test]
-		public void GetNamedMethod()
-		{
-			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "BlueMethod" ) );
-		}
-
-		[Test]
-		public void GetNamedMethodWithArgs()
-		{
-			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "TwoArgs", new string[] { "System.Int32", "System.String" } ) );
-		}
-
-		[Test]
-		public void GetPropertyWithAttribute()
-		{
-			Assert.IsNotNull( Reflect.GetPropertyWithAttribute( myType, "Colors.RedAttribute" ) );
-		}
-
-		[Test]
-		public void GetNamedProperty()
-		{
-			Assert.IsNotNull( Reflect.GetNamedProperty( myType, "RedProperty", BF ) );
-		}
-
-		[Test]
-		public void GetPropertyValue()
-		{
-			Assert.AreEqual( 42, Reflect.GetPropertyValue( new Colors.MyClass(), "RedProperty", BF ) );
-		}
-
-		[Test]
-		public void Construct()
-		{
-			Assert.IsNotNull( Reflect.Construct( myType ) );
-		}
-
-		[Test] 
-		public void InvokeMethod()
-		{
-			Colors.MyClass myClass = new Colors.MyClass();
-			MethodInfo method = Reflect.GetNamedMethod( myType, "BlueMethod" );
-			Reflect.InvokeMethod( method, myClass );
-			Assert.IsTrue( myClass.BlueInvoked );
-		}
-	}
-}
-
-namespace Colors
-{
-	class RedAttribute : Attribute { }
-	class GreenAttribute : Attribute { }
-	class BlueAttribute : Attribute { }
-	class BrightRedAttribute : RedAttribute { }
-
-	interface MyInterface
-	{
-	}
-
-	[Red]
-	class BaseClass : MyInterface
-	{
-        [Blue]
-        public void BaseBlueMethod() { }
-	}
-
-	[Green]
-	class MyClass : BaseClass
-	{
-		public bool BlueInvoked = false;
-
-		[Blue]
-		public void BlueMethod() { BlueInvoked = true; }
-
-		[Red]
-		public int RedProperty { get { return 42; } }
-
-		public void TwoArgs( int i, string s ) { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class ReflectTests
+	{
+		private readonly Type myType = typeof( Colors.MyClass );
+		private readonly BindingFlags BF = BindingFlags.Public | BindingFlags.Instance;
+
+		[Test]
+		public void CanDetectAttributes()
+		{
+			Assert.IsFalse( Reflect.HasAttribute( myType, "Colors.RedAttribute", false ), "Red" );
+			Assert.IsTrue( Reflect.HasAttribute( myType, "Colors.GreenAttribute", false ), "Green" );
+			Assert.IsFalse( Reflect.HasAttribute( myType, "Colors.BlueAttribute", false ), "Blue" );
+		}
+
+		[Test]
+		public void CanDetectInheritedAttributes()
+		{
+			Assert.IsTrue( Reflect.HasAttribute( myType, "Colors.RedAttribute", true ), "Red" );
+			Assert.IsTrue( Reflect.HasAttribute( myType, "Colors.GreenAttribute", true ), "Green" );
+			Assert.IsFalse( Reflect.HasAttribute( myType, "Colors.BlueAttribute", true ), "Blue" );
+		}
+
+		[Test]
+		public void GetAttribute()
+		{
+			Assert.IsNull( Reflect.GetAttribute( myType, "Colors.RedAttribute", false ), "Red" );
+			Assert.AreEqual( "GreenAttribute", 
+				Reflect.GetAttribute( myType, "Colors.GreenAttribute", false ).GetType().Name );
+			Assert.IsNull( Reflect.GetAttribute( myType, "Colors.BlueAttribute", false ), "Blue" );
+		}
+
+		[Test]
+		public void GetAttributes()
+		{
+			Assert.AreEqual( 1, Reflect.GetAttributes( myType, false ).Length );
+			Assert.AreEqual( 0, Reflect.GetAttributes( myType, "Colors.RedAttribute", false ).Length, "Red" );
+			Assert.AreEqual( 1, Reflect.GetAttributes( myType, "Colors.GreenAttribute", false ).Length, "Green" );
+			Assert.AreEqual( 0, Reflect.GetAttributes( myType, "Colors.BlueAttribute", false ).Length, "Blue" );
+		}
+
+		[Test]
+		public void GetInheritedAttribute()
+		{
+			Assert.AreEqual( "RedAttribute", 
+				Reflect.GetAttribute( myType, "Colors.RedAttribute", true ).GetType().Name );
+			Assert.AreEqual( "GreenAttribute", 
+				Reflect.GetAttribute( myType, "Colors.GreenAttribute", true ).GetType().Name );
+			Assert.IsNull( Reflect.GetAttribute( myType, "Colors.BlueAttribute", true ), "Blue" );
+		}
+	
+		[Test]
+		public void GetInheritedAttributes()
+		{
+			Assert.AreEqual( 2, Reflect.GetAttributes( myType, true ).Length );
+			Assert.AreEqual( 1, Reflect.GetAttributes( myType, "Colors.RedAttribute", true ).Length, "Red" );
+			Assert.AreEqual( 1, Reflect.GetAttributes( myType, "Colors.GreenAttribute", true ).Length, "Green" );
+			Assert.AreEqual( 0, Reflect.GetAttributes( myType, "Colors.BlueAttribute", true ).Length , "Blue" );
+		}
+	
+		[Test]
+		public void InheritsFrom()
+		{
+			Assert.IsTrue( Reflect.InheritsFrom( myType, "Colors.BaseClass" ) );
+		}
+
+		[Test]
+		public void HasInterface()
+		{
+			Assert.IsTrue( Reflect.HasInterface( myType, "Colors.MyInterface" ) );
+		}
+
+		[Test]
+		public void GetConstructor()
+		{
+			Assert.IsNotNull( Reflect.GetConstructor( myType ) );
+		}
+
+		[Test]
+		public void GetMethodsWithAttribute()
+		{
+            MethodInfo[] methods = Reflect.GetMethodsWithAttribute(myType, "Colors.BlueAttribute", false);
+            Assert.That(
+                List.Map(methods).Property("Name"), 
+                Is.EqualTo(new string[] {"BaseBlueMethod", "BlueMethod"} ));
+        }
+
+		[Test]
+		public void GetNamedMethod()
+		{
+			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "BlueMethod" ) );
+		}
+
+		[Test]
+		public void GetNamedMethodWithArgs()
+		{
+			Assert.IsNotNull( Reflect.GetNamedMethod( myType, "TwoArgs", new string[] { "System.Int32", "System.String" } ) );
+		}
+
+		[Test]
+		public void GetPropertyWithAttribute()
+		{
+			Assert.IsNotNull( Reflect.GetPropertyWithAttribute( myType, "Colors.RedAttribute" ) );
+		}
+
+		[Test]
+		public void GetNamedProperty()
+		{
+			Assert.IsNotNull( Reflect.GetNamedProperty( myType, "RedProperty", BF ) );
+		}
+
+		[Test]
+		public void GetPropertyValue()
+		{
+			Assert.AreEqual( 42, Reflect.GetPropertyValue( new Colors.MyClass(), "RedProperty", BF ) );
+		}
+
+		[Test]
+		public void Construct()
+		{
+			Assert.IsNotNull( Reflect.Construct( myType ) );
+		}
+
+		[Test] 
+		public void InvokeMethod()
+		{
+			Colors.MyClass myClass = new Colors.MyClass();
+			MethodInfo method = Reflect.GetNamedMethod( myType, "BlueMethod" );
+			Reflect.InvokeMethod( method, myClass );
+			Assert.IsTrue( myClass.BlueInvoked );
+		}
+	}
+}
+
+namespace Colors
+{
+	class RedAttribute : Attribute { }
+	class GreenAttribute : Attribute { }
+	class BlueAttribute : Attribute { }
+	class BrightRedAttribute : RedAttribute { }
+
+	interface MyInterface
+	{
+	}
+
+	[Red]
+	class BaseClass : MyInterface
+	{
+        [Blue]
+        public void BaseBlueMethod() { }
+	}
+
+	[Green]
+	class MyClass : BaseClass
+	{
+		public bool BlueInvoked = false;
+
+		[Blue]
+		public void BlueMethod() { BlueInvoked = true; }
+
+		[Red]
+		public int RedProperty { get { return 42; } }
+
+		public void TwoArgs( int i, string s ) { }
+	}
+}
diff --git a/src/NUnitCore/tests/RemoteRunnerTests.cs b/src/NUnitCore/tests/RemoteRunnerTests.cs
index 26e0c98..946e601 100644
--- a/src/NUnitCore/tests/RemoteRunnerTests.cs
+++ b/src/NUnitCore/tests/RemoteRunnerTests.cs
@@ -1,26 +1,26 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Collections;
-
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Util;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class RemoteRunnerTests : BasicRunnerTests
-	{
-		protected override TestRunner CreateRunner( int runnerID )
-		{
-			return new RemoteTestRunner( runnerID );
-		}
-	}
-}
+// ****************************************************************
+// 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.Collections;
+
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Util;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class RemoteRunnerTests : BasicRunnerTests
+	{
+		protected override TestRunner CreateRunner( int runnerID )
+		{
+			return new RemoteTestRunner( runnerID );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/RepeatedTestFixture.cs b/src/NUnitCore/tests/RepeatedTestFixture.cs
index 9ab0656..cd28c1b 100644
--- a/src/NUnitCore/tests/RepeatedTestFixture.cs
+++ b/src/NUnitCore/tests/RepeatedTestFixture.cs
@@ -1,101 +1,101 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.TestData.RepeatedTestFixture;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class RepeatedTestFixture
-	{
-		private MethodInfo successMethod;
-		private MethodInfo failOnFirstMethod;
-		private MethodInfo failOnThirdMethod;
-
-		[SetUp]
-		public void SetUp()
-		{
-			Type testType = typeof(RepeatSuccessFixture);
-			successMethod = testType.GetMethod ("RepeatSuccess");
-			testType = typeof(RepeatFailOnFirstFixture);
-			failOnFirstMethod = testType.GetMethod("RepeatFailOnFirst");
-			testType = typeof(RepeatFailOnThirdFixture);
-			failOnThirdMethod = testType.GetMethod("RepeatFailOnThird");
-		}
-
-		private TestResult RunTestOnFixture( object fixture )
-		{
-			Test suite = TestFixtureBuilder.BuildFrom( fixture );
-			Assert.AreEqual( 1, suite.Tests.Count, "Test case count" );
-            return suite.Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		[Test]
-		public void RepeatSuccess()
-		{
-			Assert.IsNotNull (successMethod);
-			RepeatSuccessFixture fixture = new RepeatSuccessFixture();
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.IsTrue(result.IsSuccess);
-			Assert.AreEqual(1, fixture.FixtureSetupCount);
-			Assert.AreEqual(1, fixture.FixtureTeardownCount);
-			Assert.AreEqual(3, fixture.SetupCount);
-			Assert.AreEqual(3, fixture.TeardownCount);
-			Assert.AreEqual(3, fixture.Count);
-		}
-
-		[Test]
-		public void RepeatFailOnFirst()
-		{
-			Assert.IsNotNull (failOnFirstMethod);
-			RepeatFailOnFirstFixture fixture = new RepeatFailOnFirstFixture();
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.IsFalse(result.IsSuccess);
-			Assert.AreEqual(1, fixture.SetupCount);
-			Assert.AreEqual(1, fixture.TeardownCount);
-			Assert.AreEqual(1, fixture.Count);
-		}
-
-		[Test]
-		public void RepeatFailOnThird()
-		{
-			Assert.IsNotNull (failOnThirdMethod);
-			RepeatFailOnThirdFixture fixture = new RepeatFailOnThirdFixture();
-			TestResult result = RunTestOnFixture( fixture );
-
-			Assert.IsFalse(result.IsSuccess);
-			Assert.AreEqual(3, fixture.SetupCount);
-			Assert.AreEqual(3, fixture.TeardownCount);
-			Assert.AreEqual(3, fixture.Count);
-		}
-
-		[Test]
-		public void IgnoreWorksWithRepeatedTest()
-		{
-			RepeatedTestWithIgnore fixture = new RepeatedTestWithIgnore();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual( 0, fixture.SetupCount );
-			Assert.AreEqual( 0, fixture.TeardownCount );
-			Assert.AreEqual( 0, fixture.Count );
-		}
-
-        [Test]
-        public void CategoryWorksWithRepeatedTest()
-        {
-            Test suite = TestFixtureBuilder.BuildFrom(typeof(RepeatedTestWithCategory));
-            Test test = suite.Tests[0] as Test;
-            Assert.IsNotNull(test.Categories);
-            Assert.AreEqual(1, test.Categories.Count);
-            Assert.AreEqual("SAMPLE", test.Categories[0]);
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.TestData.RepeatedTestFixture;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class RepeatedTestFixture
+	{
+		private MethodInfo successMethod;
+		private MethodInfo failOnFirstMethod;
+		private MethodInfo failOnThirdMethod;
+
+		[SetUp]
+		public void SetUp()
+		{
+			Type testType = typeof(RepeatSuccessFixture);
+			successMethod = testType.GetMethod ("RepeatSuccess");
+			testType = typeof(RepeatFailOnFirstFixture);
+			failOnFirstMethod = testType.GetMethod("RepeatFailOnFirst");
+			testType = typeof(RepeatFailOnThirdFixture);
+			failOnThirdMethod = testType.GetMethod("RepeatFailOnThird");
+		}
+
+		private TestResult RunTestOnFixture( object fixture )
+		{
+			Test suite = TestFixtureBuilder.BuildFrom( fixture );
+			Assert.AreEqual( 1, suite.Tests.Count, "Test case count" );
+            return suite.Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		[Test]
+		public void RepeatSuccess()
+		{
+			Assert.IsNotNull (successMethod);
+			RepeatSuccessFixture fixture = new RepeatSuccessFixture();
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.IsTrue(result.IsSuccess);
+			Assert.AreEqual(1, fixture.FixtureSetupCount);
+			Assert.AreEqual(1, fixture.FixtureTeardownCount);
+			Assert.AreEqual(3, fixture.SetupCount);
+			Assert.AreEqual(3, fixture.TeardownCount);
+			Assert.AreEqual(3, fixture.Count);
+		}
+
+		[Test]
+		public void RepeatFailOnFirst()
+		{
+			Assert.IsNotNull (failOnFirstMethod);
+			RepeatFailOnFirstFixture fixture = new RepeatFailOnFirstFixture();
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.IsFalse(result.IsSuccess);
+			Assert.AreEqual(1, fixture.SetupCount);
+			Assert.AreEqual(1, fixture.TeardownCount);
+			Assert.AreEqual(1, fixture.Count);
+		}
+
+		[Test]
+		public void RepeatFailOnThird()
+		{
+			Assert.IsNotNull (failOnThirdMethod);
+			RepeatFailOnThirdFixture fixture = new RepeatFailOnThirdFixture();
+			TestResult result = RunTestOnFixture( fixture );
+
+			Assert.IsFalse(result.IsSuccess);
+			Assert.AreEqual(3, fixture.SetupCount);
+			Assert.AreEqual(3, fixture.TeardownCount);
+			Assert.AreEqual(3, fixture.Count);
+		}
+
+		[Test]
+		public void IgnoreWorksWithRepeatedTest()
+		{
+			RepeatedTestWithIgnore fixture = new RepeatedTestWithIgnore();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual( 0, fixture.SetupCount );
+			Assert.AreEqual( 0, fixture.TeardownCount );
+			Assert.AreEqual( 0, fixture.Count );
+		}
+
+        [Test]
+        public void CategoryWorksWithRepeatedTest()
+        {
+            Test suite = TestFixtureBuilder.BuildFrom(typeof(RepeatedTestWithCategory));
+            Test test = suite.Tests[0] as Test;
+            Assert.IsNotNull(test.Categories);
+            Assert.AreEqual(1, test.Categories.Count);
+            Assert.AreEqual("SAMPLE", test.Categories[0]);
+        }
+	}
+}
diff --git a/src/NUnitCore/tests/Results.xsd b/src/NUnitCore/tests/Results.xsd
index 3afb840..3dae552 100644
--- a/src/NUnitCore/tests/Results.xsd
+++ b/src/NUnitCore/tests/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/src/NUnitCore/tests/RuntimeFrameworkTests.cs b/src/NUnitCore/tests/RuntimeFrameworkTests.cs
index 3073e88..8962292 100644
--- a/src/NUnitCore/tests/RuntimeFrameworkTests.cs
+++ b/src/NUnitCore/tests/RuntimeFrameworkTests.cs
@@ -1,225 +1,362 @@
-// ****************************************************************
-// 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
-{
-    [TestFixture]
-    public class RuntimeFrameworkTests
-    {
-        static RuntimeType currentRuntime = 
-            Type.GetType("Mono.Runtime", false) != null ? RuntimeType.Mono : RuntimeType.Net;
-
-        [Test]
-        public void CanGetCurrentFramework()
-        {
-            RuntimeFramework framework = RuntimeFramework.CurrentFramework;
-
-            Assert.That(framework.Runtime, Is.EqualTo(currentRuntime));
-            Assert.That(framework.ClrVersion, Is.EqualTo(Environment.Version));
-        }
-
-        [Test]
-        public void CurrentFrameworkHasBuildSpecified()
-        {
-            Assert.That(RuntimeFramework.CurrentFramework.ClrVersion.Build, Is.GreaterThan(0));
-        }
-
-        [Test]
-        public void CurrentFrameworkMustBeAvailable()
-        {
-            Assert.That(RuntimeFramework.CurrentFramework.IsAvailable);
-        }
-
-        [Test]
-        public void CanListAvailableFrameworks()
-        {
-            RuntimeFramework[] available = RuntimeFramework.AvailableFrameworks;
-            Assert.That(available, Has.Length.GreaterThan(0) );
-            bool foundCurrent = false;
-            foreach (RuntimeFramework framework in available)
-            {
-                Console.WriteLine("Available: {0}", framework.DisplayName);
-                foundCurrent |= RuntimeFramework.CurrentFramework.Supports(framework);
-            }
-            Assert.That(foundCurrent, "CurrentFramework not listed");
-        }
-
-        [TestCaseSource("frameworkData")]
-        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);
-        }
-
-        [TestCaseSource("frameworkData")]
-        public void CanParseRuntimeFramework(FrameworkData data)
-        {
-            RuntimeFramework framework = RuntimeFramework.Parse(data.representation);
-            Assert.AreEqual(data.runtime, framework.Runtime);
-            Assert.AreEqual(data.clrVersion, framework.ClrVersion);
-        }
-
-        [TestCaseSource("frameworkData")]
-        public void CanDisplayFrameworkAsString(FrameworkData data)
-        {
-            RuntimeFramework framework = new RuntimeFramework(data.runtime, data.frameworkVersion);
-            Assert.AreEqual(data.representation, framework.ToString());
-            Assert.AreEqual(data.displayName, framework.DisplayName);
-        }
-
-        [TestCaseSource("matchData")]
-        public bool CanMatchRuntimes(RuntimeFramework f1, RuntimeFramework f2)
-        {
-            return f1.Supports(f2);
-        }
-
-        internal static TestCaseData[] matchData = new TestCaseData[] {
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(3,5)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
-                new RuntimeFramework(RuntimeType.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)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
-                new RuntimeFramework(RuntimeType.Mono, new Version(2,0))) 
-                .Returns(false),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(1,1))) 
-                .Returns(false),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0,50727)), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0,40607))) 
-                .Returns(false),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Mono, new Version(1,1)), // non-existent version but it works
-                new RuntimeFramework(RuntimeType.Mono, new Version(1,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Mono, new Version(2,0)),
-                new RuntimeFramework(RuntimeType.Any, new Version(2,0)))
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
-                new RuntimeFramework(RuntimeType.Mono, new Version(2,0)))
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
-                new RuntimeFramework(RuntimeType.Any, new Version(2,0)))
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
-                new RuntimeFramework(RuntimeType.Any, new Version(4,0)))
-                .Returns(false),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, RuntimeFramework.DefaultVersion), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)),
-                new RuntimeFramework(RuntimeType.Net, RuntimeFramework.DefaultVersion)) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Any, RuntimeFramework.DefaultVersion), 
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0))) 
-                .Returns(true),
-            new TestCaseData(
-                new RuntimeFramework(RuntimeType.Net, new Version(2,0)),
-                new RuntimeFramework(RuntimeType.Any, RuntimeFramework.DefaultVersion)) 
-                .Returns(true)
-            };
-
-        public struct FrameworkData
-        {
-            public RuntimeType runtime;
-            public Version frameworkVersion;
-            public Version clrVersion;
-            public string representation;
-            public string displayName;
-
-            public FrameworkData(RuntimeType runtime, Version frameworkVersion, Version clrVersion,
-                string representation, string displayName)
-            {
-                this.runtime = runtime;
-                this.frameworkVersion = frameworkVersion;
-                this.clrVersion = clrVersion;
-                this.representation = representation;
-                this.displayName = displayName;
-            }
-
-            public override string ToString()
-            {
-                return string.Format("<{0},{1},{2}>", this.runtime, this.frameworkVersion, this.clrVersion);
-            }
-        }
-
-        internal FrameworkData[] frameworkData = new FrameworkData[] {
-            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,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,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")
-        };
-    }
-}
+// ****************************************************************
+// 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 NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class RuntimeFrameworkTests
+    {
+        static RuntimeType currentRuntime = 
+            Type.GetType("Mono.Runtime", false) != null ? RuntimeType.Mono : RuntimeType.Net;
+
+        [Test]
+        public void CanGetCurrentFramework()
+        {
+            RuntimeFramework framework = RuntimeFramework.CurrentFramework;
+
+            Console.WriteLine("Running under {0}", framework.DisplayName);
+			Assert.That(framework.Runtime, Is.EqualTo(currentRuntime));
+            Assert.That(framework.ClrVersion, Is.EqualTo(Environment.Version));
+        }
+
+        [Test]
+        public void CurrentFrameworkHasBuildSpecified()
+        {
+            Assert.That(RuntimeFramework.CurrentFramework.ClrVersion.Build, Is.GreaterThan(0));
+        }
+
+        [Test]
+        public void CurrentFrameworkMustBeAvailable()
+        {
+            Assert.That(RuntimeFramework.CurrentFramework.IsAvailable);
+        }
+
+        [Test]
+        public void CanListAvailableFrameworks()
+        {
+            RuntimeFramework[] available = RuntimeFramework.AvailableFrameworks;
+            Assert.That(available, Has.Length.GreaterThan(0) );
+            bool foundCurrent = false;
+            foreach (RuntimeFramework framework in available)
+            {
+                Console.WriteLine("Available: {0}", framework.DisplayName);
+                foundCurrent |= RuntimeFramework.CurrentFramework.Supports(framework);
+            }
+            Assert.That(foundCurrent, "CurrentFramework not listed");
+        }
+
+        [TestCaseSource("frameworkData")]
+        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)
+        {
+            // Can't create using CLR version if we expect version 3.0, 3.5 or 4.5
+            Assume.That(data.frameworkVersion.Major != 3);
+            if (data.frameworkVersion.Major == 4)
+                Assume.That(data.frameworkVersion.Minor != 5);
+
+            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);
+        }
+
+        [TestCaseSource("frameworkData")]
+        public void CanParseRuntimeFramework(FrameworkData data)
+        {
+            RuntimeFramework framework = RuntimeFramework.Parse(data.representation);
+            Assert.AreEqual(data.runtime, framework.Runtime);
+            Assert.AreEqual(data.clrVersion, framework.ClrVersion);
+        }
+
+        [TestCaseSource("frameworkData")]
+        public void CanDisplayFrameworkAsString(FrameworkData data)
+        {
+            RuntimeFramework framework = new RuntimeFramework(data.runtime, data.frameworkVersion);
+            Assert.AreEqual(data.representation, framework.ToString());
+            Assert.AreEqual(data.displayName, framework.DisplayName);
+        }
+
+        [TestCaseSource("AllFrameworks")]
+        public void AnyFrameworkSupportsItself(RuntimeFramework framework)
+        {
+            Assert.That(framework.Supports(framework));
+        }
+
+        [Test]
+        public void Mono11IsSynonymousWithMono10()
+        {
+            RuntimeFramework mono10 = new RuntimeFramework(RuntimeType.Mono, new Version(1, 0));
+            RuntimeFramework mono11 = new RuntimeFramework(RuntimeType.Mono, new Version(1, 1));
+
+            Assert.That(mono11.ToString(), Is.EqualTo("mono-1.0"));
+            Assert.That(mono11.DisplayName, Is.EqualTo("Mono 1.0"));
+            Assert.That(mono11.Runtime, Is.EqualTo(RuntimeType.Mono));
+            Assert.That(mono11.FrameworkVersion, Is.EqualTo(new Version(1, 0)));
+
+            Assert.That(mono11.Supports(mono10));
+            Assert.That(mono10.Supports(mono11));
+        }
+
+        [TestCase("net-1.0.3705")]
+        [TestCase("net-1.1.4322")]
+        [TestCase("net-2.0.50727")]
+        [TestCase("net-4.0.30319")]
+        public void WellKnownClrVersions_SupportEquivalentFrameworkVersions(string s)
+        {
+            RuntimeFramework f1 = RuntimeFramework.Parse(s);
+            RuntimeFramework f2 = new RuntimeFramework(f1.Runtime, f1.FrameworkVersion);
+
+            Assert.That(f1.Runtime, Is.EqualTo(f2.Runtime));
+            Assert.That(f1.FrameworkVersion, Is.EqualTo(f2.FrameworkVersion));
+            Assert.That(f1.ClrVersion, Is.EqualTo(f2.ClrVersion));
+
+            Assert.That(f1.Supports(f2));
+            Assert.That(f2.Supports(f1));
+        }
+
+        [TestCaseSource("LowHigh")]
+        public void SameRuntime_HigherVersion_NotSupported(RuntimeFramework f1, RuntimeFramework f2)
+        {
+            Assert.False(f1.Supports(f2));
+        }
+
+        [TestCaseSource("HighLow_SameCLR")]
+        public void SameRuntime_LowerVersion_SameCLR_Supported(RuntimeFramework f1, RuntimeFramework f2)
+        {
+            Assert.That(f1.Supports(f2));
+        }
+
+        [TestCaseSource("HighLow_DifferentCLR")]
+        public void SameRuntime_LowerVersion_DifferentCLR_NotSupported(RuntimeFramework f1, RuntimeFramework f2)
+        {
+            Assert.False(f1.Supports(f2));
+        }
+
+        [TestCaseSource("MonoFrameworks")]
+        public void DifferentRuntimes_NotSupported(RuntimeFramework f1)
+        {
+            RuntimeFramework f2 = new RuntimeFramework(RuntimeType.Net, f1.FrameworkVersion);
+
+            Assert.False(f1.Supports(f2));
+            Assert.False(f2.Supports(f1));
+        }
+
+        [Test]
+        public void SameRuntimes_DifferentBuilds_NotSupported()
+        {
+            RuntimeFramework f1 = new RuntimeFramework(RuntimeType.Net, new Version(2, 0, 50727));
+            RuntimeFramework f2 = new RuntimeFramework(RuntimeType.Net, new Version(2, 0, 40607));
+
+            Assert.False(f1.Supports(f2));
+            Assert.False(f2.Supports(f1));
+        }
+
+        [TestCaseSource("MicrosoftFrameworks")]
+        [TestCaseSource("MonoFrameworks")]
+        public void UnspecifiedRuntime_SameVersion_Supported(RuntimeFramework f1)
+        {
+            // NOTE: Mono 1.0 has a 1.1 ClrVersion, so this doesn't work.
+            // Since we're phasing out support for 1.x versions, we
+            // aren't planning to fix this.
+            Assume.That(f1.ToString() != "mono-1.0");
+
+            RuntimeFramework f2 = new RuntimeFramework(RuntimeType.Any, f1.FrameworkVersion);
+            Assert.That(f1.Supports(f2));
+            Assert.That(f2.Supports(f1));
+        }
+
+        [TestCaseSource("MicrosoftFrameworks")]
+        [TestCaseSource("MonoFrameworks")]
+        public void UnspecifiedVersion_SameRuntime_Supported(RuntimeFramework f1)
+        {
+            RuntimeFramework f2 = new RuntimeFramework(f1.Runtime, RuntimeFramework.DefaultVersion);
+            Assert.That(f1.Supports(f2));
+            Assert.That(f2.Supports(f1));
+        }
+
+        [TestCaseSource("MicrosoftFrameworks")]
+        [TestCaseSource("MonoFrameworks")]
+        public void UnspecifiedRuntimeAndVersion_Supported(RuntimeFramework f1)
+        {
+            RuntimeFramework f2 = new RuntimeFramework(RuntimeType.Any, RuntimeFramework.DefaultVersion);
+            Assert.That(f1.Supports(f2));
+            Assert.That(f2.Supports(f1));
+        }
+
+        #region TestCaseSources
+
+        static TestCaseData[] LowHigh
+        {
+            get { return GetFrameworkPairs(false); }
+        }
+
+        static TestCaseData[] HighLow_SameCLR
+        {
+            get { return GetFrameworkPairs(true, true, false); }
+        }
+
+        static TestCaseData[] HighLow_DifferentCLR
+        {
+            get { return GetFrameworkPairs(true, false, true); }
+        }
+
+        static RuntimeFramework[] AllFrameworks
+        {
+            get
+            {
+                RuntimeFramework[] frameworks =
+                    new RuntimeFramework[MicrosoftFrameworks.Length + MonoFrameworks.Length + UnspecifiedFrameworks.Length];
+
+                int index = 0;
+                foreach (RuntimeFramework[] array in _frameworkArrays)
+                    foreach (RuntimeFramework framework in array)
+                        frameworks[index++] = framework;
+
+                return frameworks;
+            }
+        }
+
+        static readonly RuntimeFramework[] MicrosoftFrameworks = new RuntimeFramework[] {
+            new RuntimeFramework(RuntimeType.Net, new Version(1,0)),
+            new RuntimeFramework(RuntimeType.Net, new Version(1,1)),
+            new RuntimeFramework(RuntimeType.Net, new Version(2,0)),
+            new RuntimeFramework(RuntimeType.Net, new Version(3,0)),
+            new RuntimeFramework(RuntimeType.Net, new Version(3,5)),
+            new RuntimeFramework(RuntimeType.Net, new Version(4,0)),
+            new RuntimeFramework(RuntimeType.Net, new Version(4,5))
+        };
+
+        static readonly RuntimeFramework[] MonoFrameworks = new RuntimeFramework[] {
+            new RuntimeFramework(RuntimeType.Mono, new Version(1,0)),
+            new RuntimeFramework(RuntimeType.Mono, new Version(2,0)),
+            new RuntimeFramework(RuntimeType.Mono, new Version(3,0)),
+            new RuntimeFramework(RuntimeType.Mono, new Version(3,5)),
+            new RuntimeFramework(RuntimeType.Mono, new Version(4,0)),
+            new RuntimeFramework(RuntimeType.Mono, new Version(4,5))
+        };
+
+        static readonly RuntimeFramework[] UnspecifiedFrameworks = new RuntimeFramework[] {
+            new RuntimeFramework(RuntimeType.Any, new Version(1,0)),
+            new RuntimeFramework(RuntimeType.Any, new Version(1,1)),
+            new RuntimeFramework(RuntimeType.Any, new Version(2,0)),
+            new RuntimeFramework(RuntimeType.Any, new Version(3,0)),
+            new RuntimeFramework(RuntimeType.Any, new Version(3,5)),
+            new RuntimeFramework(RuntimeType.Any, new Version(4,0)),
+            new RuntimeFramework(RuntimeType.Any, new Version(4,5))
+        };
+
+        static readonly RuntimeFramework[][] _frameworkArrays =
+            new RuntimeFramework[][] { MicrosoftFrameworks, MonoFrameworks, UnspecifiedFrameworks };
+
+        public struct FrameworkData
+        {
+            public RuntimeType runtime;
+            public Version frameworkVersion;
+            public Version clrVersion;
+            public string representation;
+            public string displayName;
+
+            public FrameworkData(RuntimeType runtime, Version frameworkVersion, Version clrVersion,
+                string representation, string displayName)
+            {
+                this.runtime = runtime;
+                this.frameworkVersion = frameworkVersion;
+                this.clrVersion = clrVersion;
+                this.representation = representation;
+                this.displayName = displayName;
+            }
+
+            public override string ToString()
+            {
+                return string.Format("<{0},{1},{2}>", this.runtime, this.frameworkVersion, this.clrVersion);
+            }
+        }
+
+        internal FrameworkData[] frameworkData = new FrameworkData[] {
+            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,1), new Version(1,1,4322), "net-1.1", "Net 1.1"),
+            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(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, new Version(4,5), new Version(4,0,30319), "net-4.5", "Net 4.5"),
+            new FrameworkData(RuntimeType.Net, RuntimeFramework.DefaultVersion, RuntimeFramework.DefaultVersion, "net", "Net"),
+            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(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,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(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")
+        };
+        
+        #endregion
+
+        #region Helper Methods
+
+        static TestCaseData[] GetFrameworkPairs(bool highToLow)
+        {
+            return GetFrameworkPairs(highToLow, true, true);
+        }
+
+        static TestCaseData[] GetFrameworkPairs(bool highToLow, bool sameCLR, bool differentCLR)
+        {
+            int fullCount = PairCount(MicrosoftFrameworks) + PairCount(MonoFrameworks) + PairCount(UnspecifiedFrameworks);
+            int count = 0;
+            if (sameCLR && differentCLR)
+                count = fullCount;
+            else if (sameCLR)
+                count = 12;
+            else if (differentCLR)
+                count = fullCount - 12;
+
+            TestCaseData[] cases = new TestCaseData[count];
+
+            int index = 0;
+            foreach (RuntimeFramework[] farray in _frameworkArrays)
+                for (int i = 0; i < farray.Length - 1; i++)
+                    for (int j = i + 1; j < farray.Length; j++)
+                    {
+                        RuntimeFramework f1 = farray[i];
+                        RuntimeFramework f2 = farray[j];
+
+                        if (sameCLR && f1.ClrVersion == f2.ClrVersion || differentCLR && f1.ClrVersion != f2.ClrVersion)
+                            cases[index++] = highToLow
+                                ? new TestCaseData(f2, f1)
+                                : new TestCaseData(f1, f2);
+                    }
+
+            return cases;
+        }
+
+        static int PairCount(RuntimeFramework[] array)
+        {
+            return array.Length * (array.Length - 1) / 2;
+        }
+
+        private RuntimeFramework Framework(string representation)
+        {
+            return RuntimeFramework.Parse(representation);
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/tests/SerializationBug.cs b/src/NUnitCore/tests/SerializationBug.cs
index 8498f65..c63a27a 100644
--- a/src/NUnitCore/tests/SerializationBug.cs
+++ b/src/NUnitCore/tests/SerializationBug.cs
@@ -1,73 +1,73 @@
-// ****************************************************************
-// 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.Runtime.Serialization;
-using System.IO;
-using System.Runtime.Serialization.Formatters.Binary;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class SerializationBug
-	{
-		private static readonly string fileName = Path.GetTempFileName();
-
-		[Serializable] 
-		public class Perob 
-		{ 
-			public int i; 
-			public int j; 
-			public Perob(int ii,int jj) 
-			{ 
-				i = ii; 
-				j = jj; 
-			} 
-
-			public void Serialize(string filename) 
-			{ 
-				StreamWriter stm = new StreamWriter(File.OpenWrite( filename )); 
-				BinaryFormatter bf=new BinaryFormatter(); 
-				bf.Serialize(stm.BaseStream,this); 
-				stm.Close(); 
-			} 
-			public static Perob Deserialize(string filename) 
-			{ 
-				Perob rv; 
-				using (StreamReader stm = new StreamReader(File.OpenRead( filename ))) 
-				{
-					BinaryFormatter bf=new BinaryFormatter(); 
-					object obj = bf.Deserialize(stm.BaseStream);
-					rv = obj as Perob; 
-				}
-				return rv; 
-			}
-		} 
-
-		[TearDown]
-		public void CleanUp()
-		{
-			FileInfo file = new FileInfo(fileName);
-			if(file.Exists)
-				file.Delete();
-		}
-
-		[Test] 
-		public void SaveAndLoad() 
-		{ 
-			Perob p = new Perob(3,4); 
-			p.Serialize( fileName ); 
-
-			Perob np = Perob.Deserialize( fileName ); 
-
-			Assert.IsNotNull(np, "np != null"); 
-			Assert.AreEqual(p.i, np.i, "i neq" ); 
-			Assert.AreEqual(p.j, np.j, "j neq" ); 
-		} 
-	}
-}
-
+// ****************************************************************
+// 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.Runtime.Serialization;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class SerializationBug
+	{
+		private static readonly string fileName = Path.GetTempFileName();
+
+		[Serializable] 
+		public class Perob 
+		{ 
+			public int i; 
+			public int j; 
+			public Perob(int ii,int jj) 
+			{ 
+				i = ii; 
+				j = jj; 
+			} 
+
+			public void Serialize(string filename) 
+			{ 
+				StreamWriter stm = new StreamWriter(File.OpenWrite( filename )); 
+				BinaryFormatter bf=new BinaryFormatter(); 
+				bf.Serialize(stm.BaseStream,this); 
+				stm.Close(); 
+			} 
+			public static Perob Deserialize(string filename) 
+			{ 
+				Perob rv; 
+				using (StreamReader stm = new StreamReader(File.OpenRead( filename ))) 
+				{
+					BinaryFormatter bf=new BinaryFormatter(); 
+					object obj = bf.Deserialize(stm.BaseStream);
+					rv = obj as Perob; 
+				}
+				return rv; 
+			}
+		} 
+
+		[TearDown]
+		public void CleanUp()
+		{
+			FileInfo file = new FileInfo(fileName);
+			if(file.Exists)
+				file.Delete();
+		}
+
+		[Test] 
+		public void SaveAndLoad() 
+		{ 
+			Perob p = new Perob(3,4); 
+			p.Serialize( fileName ); 
+
+			Perob np = Perob.Deserialize( fileName ); 
+
+			Assert.IsNotNull(np, "np != null"); 
+			Assert.AreEqual(p.i, np.i, "i neq" ); 
+			Assert.AreEqual(p.j, np.j, "j neq" ); 
+		} 
+	}
+}
+
diff --git a/src/NUnitCore/tests/SetCultureAttributeTests.cs b/src/NUnitCore/tests/SetCultureAttributeTests.cs
index dd93ab0..487bff7 100644
--- a/src/NUnitCore/tests/SetCultureAttributeTests.cs
+++ b/src/NUnitCore/tests/SetCultureAttributeTests.cs
@@ -1,103 +1,103 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Globalization;
-using NUnit.Framework;
-using NUnit.TestData.CultureAttributeTests;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class SetCultureAttributeTests
-    {
-        private CultureInfo originalCulture;
-//        private CultureInfo originalUICulture;
-
-        [SetUp]
-        public void Setup()
-        {
-            originalCulture = CultureInfo.CurrentCulture;
-//            originalUICulture = CultureInfo.CurrentUICulture;
-        }        
-
-        [Test, SetUICulture("fr-FR")]
-        public void SetUICultureOnlyToFrench()
-        {
-            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
-            Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetUICulture("fr-CA")]
-        public void SetUICultureOnlyToFrenchCanadian()
-        {
-            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
-            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetUICulture("ru-RU")]
-        public void SetUICultureOnlyToRussian()
-        {
-            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
-            Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetCulture("fr-FR"), SetUICulture("fr-FR")]
-        public void SetBothCulturesToFrench()
-        {
-            Assert.AreEqual("fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-            Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetCulture("fr-CA"), SetUICulture("fr-CA")]
-        public void SetBothCulturesToFrenchCanadian()
-        {
-            Assert.AreEqual("fr-CA", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetCulture("ru-RU"), SetUICulture("ru-RU")]
-        public void SetBothCulturesToRussian()
-        {
-            Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-            Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetCulture("fr-FR"), SetUICulture("fr-CA")]
-        public void SetMixedCulturesToFrenchAndUIFrenchCanadian()
-        {
-            Assert.AreEqual("fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [Test, SetCulture("ru-RU"), SetUICulture("en-US")]
-        public void SetMixedCulturesToRussianAndUIEnglishUS()
-        {
-            Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-            Assert.AreEqual("en-US", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-        }
-
-        [TestFixture, SetCulture("ru-RU"), SetUICulture("ru-RU")]
-        class NestedBehavior
-        {
-            [Test]
-            public void InheritedRussian()
-            {
-                Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-                Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-            }
-
-            [Test, SetUICulture("fr-FR")]
-            public void InheritedRussianWithUIFrench()
-            {
-                Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
-                Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
-            }
-        }        
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Globalization;
+using NUnit.Framework;
+using NUnit.TestData.CultureAttributeTests;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class SetCultureAttributeTests
+    {
+        private CultureInfo originalCulture;
+//        private CultureInfo originalUICulture;
+
+        [SetUp]
+        public void Setup()
+        {
+            originalCulture = CultureInfo.CurrentCulture;
+//            originalUICulture = CultureInfo.CurrentUICulture;
+        }        
+
+        [Test, SetUICulture("fr-FR")]
+        public void SetUICultureOnlyToFrench()
+        {
+            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetUICulture("fr-CA")]
+        public void SetUICultureOnlyToFrenchCanadian()
+        {
+            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetUICulture("ru-RU")]
+        public void SetUICultureOnlyToRussian()
+        {
+            Assert.AreEqual(CultureInfo.CurrentCulture, originalCulture, "Culture should not change");
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("fr-FR"), SetUICulture("fr-FR")]
+        public void SetBothCulturesToFrench()
+        {
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("fr-CA"), SetUICulture("fr-CA")]
+        public void SetBothCulturesToFrenchCanadian()
+        {
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("ru-RU"), SetUICulture("ru-RU")]
+        public void SetBothCulturesToRussian()
+        {
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("fr-FR"), SetUICulture("fr-CA")]
+        public void SetMixedCulturesToFrenchAndUIFrenchCanadian()
+        {
+            Assert.AreEqual("fr-FR", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("fr-CA", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [Test, SetCulture("ru-RU"), SetUICulture("en-US")]
+        public void SetMixedCulturesToRussianAndUIEnglishUS()
+        {
+            Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+            Assert.AreEqual("en-US", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+        }
+
+        [TestFixture, SetCulture("ru-RU"), SetUICulture("ru-RU")]
+        class NestedBehavior
+        {
+            [Test]
+            public void InheritedRussian()
+            {
+                Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+                Assert.AreEqual("ru-RU", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+            }
+
+            [Test, SetUICulture("fr-FR")]
+            public void InheritedRussianWithUIFrench()
+            {
+                Assert.AreEqual("ru-RU", CultureInfo.CurrentCulture.Name, "Culture not set correctly");
+                Assert.AreEqual("fr-FR", CultureInfo.CurrentUICulture.Name, "UICulture not set correctly");
+            }
+        }        
+    }
+}
diff --git a/src/NUnitCore/tests/SetUpFixtureTests.cs b/src/NUnitCore/tests/SetUpFixtureTests.cs
index 7a4c0fc..339de1f 100644
--- a/src/NUnitCore/tests/SetUpFixtureTests.cs
+++ b/src/NUnitCore/tests/SetUpFixtureTests.cs
@@ -1,180 +1,180 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Util;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class SetUpFixtureTests
-    {
-        private static readonly string testAssembly = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestData.EmptyFixture));
-
-        #region SetUp
-        [SetUp]
-        public void SetUp()
-        {
-            TestUtilities.SimpleEventRecorder.Clear();
-        }
-        #endregion SetUp
-
-        private TestResult runTests(string nameSpace)
-        {
-            return runTests(nameSpace, TestFilter.Empty);
-        }
-        private TestResult runTests(string nameSpace, TestFilter filter)
-        {
-            TestSuiteBuilder builder = new TestSuiteBuilder();
-			TestPackage package = new TestPackage( testAssembly );
-			package.TestName = nameSpace;
-            Test suite = builder.Build( package );
-            return suite.Run(new NullListener(),filter);
-        }
-
-        #region Builder
-        /// <summary>
-        /// Tests that the TestSuiteBuilder correctly interperets a SetupFixture class as a 'virtual namespace' into which 
-        /// all it's sibling classes are inserted.
-        /// </summary>
-        [NUnit.Framework.Test]
-        public void NamespaceSetUpFixtureReplacesNamespaceNodeInTree()
-        {
-            string nameSpace = "NUnit.TestData.SetupFixture.Namespace1";
-            TestSuiteBuilder builder = new TestSuiteBuilder();
-			TestPackage package = new TestPackage( testAssembly );
-			package.TestName = nameSpace;
-			Test suite= builder.Build( package );
-
-            Assert.IsNotNull(suite);
-
-            Assert.AreEqual(testAssembly, suite.TestName.Name);
-            Assert.AreEqual(1, suite.Tests.Count);
-
-            string[] nameSpaceBits = nameSpace.Split('.');
-            for (int i = 0; i < nameSpaceBits.Length; i++)
-            {
-                suite = suite.Tests[0] as TestSuite;
-                Assert.AreEqual(nameSpaceBits[i], suite.TestName.Name);
-                Assert.AreEqual(1, suite.Tests.Count);
-            }
-
-            Assert.IsInstanceOf(typeof(SetUpFixture), suite);
-
-            suite = suite.Tests[0] as TestSuite;
-            Assert.AreEqual("SomeTestFixture", suite.TestName.Name);
-            Assert.AreEqual(1, suite.Tests.Count);
-        }
-        #endregion Builder
-
-        #region NoNamespaceBuilder
-        /// <summary>
-        /// Tests that the TestSuiteBuilder correctly interperets a SetupFixture class with no parent namespace 
-        /// as a 'virtual assembly' into which all it's sibling fixtures are inserted.
-        /// </summary>
-        [NUnit.Framework.Test]
-        public void AssemblySetUpFixtureReplacesAssemblyNodeInTree()
-        {
-            TestSuiteBuilder builder = new TestSuiteBuilder();
-            Test suite = builder.Build( new TestPackage( testAssembly ) );
-
-            Assert.IsNotNull(suite);
-            Assert.IsInstanceOf(typeof(SetUpFixture), suite);
-
-            suite = suite.Tests[1] as TestSuite;
-            Assert.AreEqual("SomeTestFixture", suite.TestName.Name);
-            Assert.AreEqual(1, suite.TestCount);
-        }
-        #endregion NoNamespaceBuilder
-
-
-        #region Simple
-        [NUnit.Framework.Test]
-        public void NamespaceSetUpFixtureWrapsExecutionOfSingleTest()
-        {
-            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace1").IsSuccess);
-            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
-                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                  "NamespaceTearDown");
-        }
-        #endregion Simple
-
-        #region Static
-        [Test]
-        public void NamespaceSetUpMethodsMayBeStatic()
-        {
-            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace5").IsSuccess);
-            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
-                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                  "NamespaceTearDown");
-        }
-        #endregion
-
-        #region TwoTestFixtures
-        [NUnit.Framework.Test]
-        public void NamespaceSetUpFixtureWrapsExecutionOfTwoTests()
-        {
-            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace2").IsSuccess);
-            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
-                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                  "NamespaceTearDown");
-        }
-        #endregion TwoTestFixtures
-
-        #region SubNamespace
-        [NUnit.Framework.Test]
-        public void NamespaceSetUpFixtureWrapsNestedNamespaceSetUpFixture()
-        {
-            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace3").IsSuccess);
-            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
-                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                    "SubNamespaceSetup",
-                                        "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                    "SubNamespaceTearDown",
-                                  "NamespaceTearDown");
-        }
-        #endregion SubNamespace
-
-        #region TwoSetUpFixtures
-        [NUnit.Framework.Test]
-        public void WithTwoSetUpFixtuesOnlyOneIsUsed()
-        {
-            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace4").IsSuccess);
-            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup2",
-                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
-                                  "NamespaceTearDown2");
-        }
-        #endregion TwoSetUpFixtures
-
-        #region NoNamespaceSetupFixture
-        [NUnit.Framework.Test]
-        public void AssemblySetupFixtureWrapsExecutionOfTest()
-        {
-            TestResult result = runTests(null, new Filters.SimpleNameFilter("SomeTestFixture"));
-            ResultSummarizer summ = new ResultSummarizer(result);
-            Assert.AreEqual(1, summ.TestsRun);
-            Assert.IsTrue(result.IsSuccess);
-            TestUtilities.SimpleEventRecorder.Verify("RootNamespaceSetup",
-                                    "Test",
-                                  "RootNamespaceTearDown");
-        }
-        #endregion NoNamespaceSetupFixture
-    }
-}
-
-
-
-
-
-
-
-
-
-
-
-
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Util;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class SetUpFixtureTests
+    {
+        private static readonly string testAssembly = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestData.EmptyFixture));
+
+        #region SetUp
+        [SetUp]
+        public void SetUp()
+        {
+            TestUtilities.SimpleEventRecorder.Clear();
+        }
+        #endregion SetUp
+
+        private TestResult runTests(string nameSpace)
+        {
+            return runTests(nameSpace, TestFilter.Empty);
+        }
+        private TestResult runTests(string nameSpace, TestFilter filter)
+        {
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+			TestPackage package = new TestPackage( testAssembly );
+			package.TestName = nameSpace;
+            Test suite = builder.Build( package );
+            return suite.Run(new NullListener(),filter);
+        }
+
+        #region Builder
+        /// <summary>
+        /// Tests that the TestSuiteBuilder correctly interperets a SetupFixture class as a 'virtual namespace' into which 
+        /// all it's sibling classes are inserted.
+        /// </summary>
+        [NUnit.Framework.Test]
+        public void NamespaceSetUpFixtureReplacesNamespaceNodeInTree()
+        {
+            string nameSpace = "NUnit.TestData.SetupFixture.Namespace1";
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+			TestPackage package = new TestPackage( testAssembly );
+			package.TestName = nameSpace;
+			Test suite= builder.Build( package );
+
+            Assert.IsNotNull(suite);
+
+            Assert.AreEqual(testAssembly, suite.TestName.Name);
+            Assert.AreEqual(1, suite.Tests.Count);
+
+            string[] nameSpaceBits = nameSpace.Split('.');
+            for (int i = 0; i < nameSpaceBits.Length; i++)
+            {
+                suite = suite.Tests[0] as TestSuite;
+                Assert.AreEqual(nameSpaceBits[i], suite.TestName.Name);
+                Assert.AreEqual(1, suite.Tests.Count);
+            }
+
+            Assert.IsInstanceOf(typeof(SetUpFixture), suite);
+
+            suite = suite.Tests[0] as TestSuite;
+            Assert.AreEqual("SomeTestFixture", suite.TestName.Name);
+            Assert.AreEqual(1, suite.Tests.Count);
+        }
+        #endregion Builder
+
+        #region NoNamespaceBuilder
+        /// <summary>
+        /// Tests that the TestSuiteBuilder correctly interperets a SetupFixture class with no parent namespace 
+        /// as a 'virtual assembly' into which all it's sibling fixtures are inserted.
+        /// </summary>
+        [NUnit.Framework.Test]
+        public void AssemblySetUpFixtureReplacesAssemblyNodeInTree()
+        {
+            TestSuiteBuilder builder = new TestSuiteBuilder();
+            Test suite = builder.Build( new TestPackage( testAssembly ) );
+
+            Assert.IsNotNull(suite);
+            Assert.IsInstanceOf(typeof(SetUpFixture), suite);
+
+            suite = suite.Tests[1] as TestSuite;
+            Assert.AreEqual("SomeTestFixture", suite.TestName.Name);
+            Assert.AreEqual(1, suite.TestCount);
+        }
+        #endregion NoNamespaceBuilder
+
+
+        #region Simple
+        [NUnit.Framework.Test]
+        public void NamespaceSetUpFixtureWrapsExecutionOfSingleTest()
+        {
+            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace1").IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                  "NamespaceTearDown");
+        }
+        #endregion Simple
+
+        #region Static
+        [Test]
+        public void NamespaceSetUpMethodsMayBeStatic()
+        {
+            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace5").IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                  "NamespaceTearDown");
+        }
+        #endregion
+
+        #region TwoTestFixtures
+        [NUnit.Framework.Test]
+        public void NamespaceSetUpFixtureWrapsExecutionOfTwoTests()
+        {
+            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace2").IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                  "NamespaceTearDown");
+        }
+        #endregion TwoTestFixtures
+
+        #region SubNamespace
+        [NUnit.Framework.Test]
+        public void NamespaceSetUpFixtureWrapsNestedNamespaceSetUpFixture()
+        {
+            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace3").IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                    "SubNamespaceSetup",
+                                        "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                    "SubNamespaceTearDown",
+                                  "NamespaceTearDown");
+        }
+        #endregion SubNamespace
+
+        #region TwoSetUpFixtures
+        [NUnit.Framework.Test]
+        public void WithTwoSetUpFixtuesOnlyOneIsUsed()
+        {
+            Assert.IsTrue(runTests("NUnit.TestData.SetupFixture.Namespace4").IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("NamespaceSetup2",
+                                    "FixtureSetup", "Setup", "Test", "TearDown", "FixtureTearDown",
+                                  "NamespaceTearDown2");
+        }
+        #endregion TwoSetUpFixtures
+
+        #region NoNamespaceSetupFixture
+        [NUnit.Framework.Test]
+        public void AssemblySetupFixtureWrapsExecutionOfTest()
+        {
+            TestResult result = runTests(null, new Filters.SimpleNameFilter("SomeTestFixture"));
+            ResultSummarizer summ = new ResultSummarizer(result);
+            Assert.AreEqual(1, summ.TestsRun);
+            Assert.IsTrue(result.IsSuccess);
+            TestUtilities.SimpleEventRecorder.Verify("RootNamespaceSetup",
+                                    "Test",
+                                  "RootNamespaceTearDown");
+        }
+        #endregion NoNamespaceSetupFixture
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NUnitCore/tests/SetUpTest.cs b/src/NUnitCore/tests/SetUpTest.cs
index 96e6118..3c499bf 100644
--- a/src/NUnitCore/tests/SetUpTest.cs
+++ b/src/NUnitCore/tests/SetUpTest.cs
@@ -1,147 +1,147 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.TestUtilities;
-using NUnit.TestData.SetUpTest;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class SetUpTest
-	{
-		[Test]
-		public void SetUpAndTearDownCounter()
-		{
-			SetUpAndTearDownCounterFixture fixture = new SetUpAndTearDownCounterFixture();
-			TestBuilder.RunTestFixture( fixture );
-
-			Assert.AreEqual(3, fixture.setUpCounter);
-			Assert.AreEqual(3, fixture.tearDownCounter);
-		}
-
-		
-		[Test]
-		public void MakeSureSetUpAndTearDownAreCalled()
-		{
-			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
-			TestBuilder.RunTestFixture( fixture );
-
-			Assert.IsTrue(fixture.wasSetUpCalled);
-			Assert.IsTrue(fixture.wasTearDownCalled);
-		}
-
-		[Test]
-		public void CheckInheritedSetUpAndTearDownAreCalled()
-		{
-			InheritSetUpAndTearDown fixture = new InheritSetUpAndTearDown();
-			TestBuilder.RunTestFixture( fixture );
-
-			Assert.IsTrue(fixture.wasSetUpCalled);
-			Assert.IsTrue(fixture.wasTearDownCalled);
-		}
-
-		[Test]
-		public void CheckOverriddenSetUpAndTearDownAreNotCalled()
-		{
-			DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
-			TestBuilder.RunTestFixture( fixture );
-
-			Assert.IsFalse(fixture.wasSetUpCalled);
-			Assert.IsFalse(fixture.wasTearDownCalled);
-			Assert.IsTrue(fixture.derivedSetUpCalled);
-			Assert.IsTrue(fixture.derivedTearDownCalled);
-		}
-
-        [Test]
-        public void MultipleSetUpAndTearDownMethodsAreCalled()
-        {
-            MultipleSetUpTearDownFixture fixture = new MultipleSetUpTearDownFixture();
-            TestBuilder.RunTestFixture(fixture);
-
-            Assert.IsTrue(fixture.wasSetUp1Called, "SetUp1");
-            Assert.IsTrue(fixture.wasSetUp2Called, "SetUp2");
-            Assert.IsTrue(fixture.wasSetUp3Called, "SetUp3");
-            Assert.IsTrue(fixture.wasTearDown1Called, "TearDown1");
-            Assert.IsTrue(fixture.wasTearDown2Called, "TearDown2");
-        }
-
-        [Test]
-        public void BaseSetUpIsCalledFirstTearDownLast()
-        {
-            DerivedClassWithSeparateSetUp fixture = new DerivedClassWithSeparateSetUp();
-            TestBuilder.RunTestFixture(fixture);
-
-            Assert.IsTrue(fixture.wasSetUpCalled, "Base SetUp Called");
-            Assert.IsTrue(fixture.wasTearDownCalled, "Base TearDown Called");
-            Assert.IsTrue(fixture.wasDerivedSetUpCalled, "Derived SetUp Called");
-            Assert.IsTrue(fixture.wasDerivedTearDownCalled, "Derived TearDown Called");
-            Assert.IsTrue(fixture.wasBaseSetUpCalledFirst, "SetUp Order");
-            Assert.IsTrue(fixture.wasBaseTearDownCalledLast, "TearDown Order");
-        }
-
-        [Test]
-        public void SetupRecordsOriginalExceptionThownByTestCase()
-        {
-            Exception e = new Exception("Test message for exception thrown from setup");
-            SetupAndTearDownExceptionFixture fixture = new SetupAndTearDownExceptionFixture();
-            fixture.setupException = e;
-            TestResult result = TestBuilder.RunTestFixture(fixture);
-            Assert.IsTrue(result.HasResults, "Fixture test should have child result.");
-            result = (TestResult)result.Results[0];
-            Assert.AreEqual(result.ResultState, ResultState.Error, "Test should be in error state");
-            Assert.AreEqual(result.FailureSite, FailureSite.SetUp, "Test should be failed at setup site");
-            string expected = string.Format("SetUp : {0} : {1}", e.GetType().FullName, e.Message);
-            Assert.AreEqual(expected, result.Message);
-        }
-
-        [Test]
-        public void TearDownRecordsOriginalExceptionThownByTestCase()
-        {
-            Exception e = new Exception("Test message for exception thrown from tear down");
-            SetupAndTearDownExceptionFixture fixture = new SetupAndTearDownExceptionFixture();
-            fixture.tearDownException = e;
-            TestResult result = TestBuilder.RunTestFixture(fixture);
-            Assert.IsTrue(result.HasResults, "Fixture test should have child result.");
-            result = (TestResult)result.Results[0];
-            Assert.AreEqual(result.ResultState, ResultState.Error, "Test should be in error state");
-            Assert.AreEqual(result.FailureSite, FailureSite.TearDown, "Test should be failed at tear down site");
-            string expected = string.Format("TearDown : {0} : {1}", e.GetType().FullName, e.Message);
-            Assert.AreEqual(expected, result.Message);
-        }
-
-        public class SetupCallBase
-        {
-            protected int setupCount = 0;
-            public virtual void Init()
-            {
-                setupCount++;
-            }
-            public virtual void AssertCount()
-            {
-            }
-        }
-
-        [TestFixture]
-        // Test for bug 441022
-        public class SetupCallDerived : SetupCallBase
-        {
-            [SetUp]
-            public override void Init()
-            {
-                setupCount++;
-                base.Init();
-            }
-            [Test]
-            public override void AssertCount()
-            {
-                Assert.AreEqual(2, setupCount);
-            }
-        }
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.TestUtilities;
+using NUnit.TestData.SetUpTest;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class SetUpTest
+	{
+		[Test]
+		public void SetUpAndTearDownCounter()
+		{
+			SetUpAndTearDownCounterFixture fixture = new SetUpAndTearDownCounterFixture();
+			TestBuilder.RunTestFixture( fixture );
+
+			Assert.AreEqual(3, fixture.setUpCounter);
+			Assert.AreEqual(3, fixture.tearDownCounter);
+		}
+
+		
+		[Test]
+		public void MakeSureSetUpAndTearDownAreCalled()
+		{
+			SetUpAndTearDownFixture fixture = new SetUpAndTearDownFixture();
+			TestBuilder.RunTestFixture( fixture );
+
+			Assert.IsTrue(fixture.wasSetUpCalled);
+			Assert.IsTrue(fixture.wasTearDownCalled);
+		}
+
+		[Test]
+		public void CheckInheritedSetUpAndTearDownAreCalled()
+		{
+			InheritSetUpAndTearDown fixture = new InheritSetUpAndTearDown();
+			TestBuilder.RunTestFixture( fixture );
+
+			Assert.IsTrue(fixture.wasSetUpCalled);
+			Assert.IsTrue(fixture.wasTearDownCalled);
+		}
+
+		[Test]
+		public void CheckOverriddenSetUpAndTearDownAreNotCalled()
+		{
+			DefineInheritSetUpAndTearDown fixture = new DefineInheritSetUpAndTearDown();
+			TestBuilder.RunTestFixture( fixture );
+
+			Assert.IsFalse(fixture.wasSetUpCalled);
+			Assert.IsFalse(fixture.wasTearDownCalled);
+			Assert.IsTrue(fixture.derivedSetUpCalled);
+			Assert.IsTrue(fixture.derivedTearDownCalled);
+		}
+
+        [Test]
+        public void MultipleSetUpAndTearDownMethodsAreCalled()
+        {
+            MultipleSetUpTearDownFixture fixture = new MultipleSetUpTearDownFixture();
+            TestBuilder.RunTestFixture(fixture);
+
+            Assert.IsTrue(fixture.wasSetUp1Called, "SetUp1");
+            Assert.IsTrue(fixture.wasSetUp2Called, "SetUp2");
+            Assert.IsTrue(fixture.wasSetUp3Called, "SetUp3");
+            Assert.IsTrue(fixture.wasTearDown1Called, "TearDown1");
+            Assert.IsTrue(fixture.wasTearDown2Called, "TearDown2");
+        }
+
+        [Test]
+        public void BaseSetUpIsCalledFirstTearDownLast()
+        {
+            DerivedClassWithSeparateSetUp fixture = new DerivedClassWithSeparateSetUp();
+            TestBuilder.RunTestFixture(fixture);
+
+            Assert.IsTrue(fixture.wasSetUpCalled, "Base SetUp Called");
+            Assert.IsTrue(fixture.wasTearDownCalled, "Base TearDown Called");
+            Assert.IsTrue(fixture.wasDerivedSetUpCalled, "Derived SetUp Called");
+            Assert.IsTrue(fixture.wasDerivedTearDownCalled, "Derived TearDown Called");
+            Assert.IsTrue(fixture.wasBaseSetUpCalledFirst, "SetUp Order");
+            Assert.IsTrue(fixture.wasBaseTearDownCalledLast, "TearDown Order");
+        }
+
+        [Test]
+        public void SetupRecordsOriginalExceptionThownByTestCase()
+        {
+            Exception e = new Exception("Test message for exception thrown from setup");
+            SetupAndTearDownExceptionFixture fixture = new SetupAndTearDownExceptionFixture();
+            fixture.setupException = e;
+            TestResult result = TestBuilder.RunTestFixture(fixture);
+            Assert.IsTrue(result.HasResults, "Fixture test should have child result.");
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(result.ResultState, ResultState.Error, "Test should be in error state");
+            Assert.AreEqual(result.FailureSite, FailureSite.SetUp, "Test should be failed at setup site");
+            string expected = string.Format("SetUp : {0} : {1}", e.GetType().FullName, e.Message);
+            Assert.AreEqual(expected, result.Message);
+        }
+
+        [Test]
+        public void TearDownRecordsOriginalExceptionThownByTestCase()
+        {
+            Exception e = new Exception("Test message for exception thrown from tear down");
+            SetupAndTearDownExceptionFixture fixture = new SetupAndTearDownExceptionFixture();
+            fixture.tearDownException = e;
+            TestResult result = TestBuilder.RunTestFixture(fixture);
+            Assert.IsTrue(result.HasResults, "Fixture test should have child result.");
+            result = (TestResult)result.Results[0];
+            Assert.AreEqual(result.ResultState, ResultState.Error, "Test should be in error state");
+            Assert.AreEqual(result.FailureSite, FailureSite.TearDown, "Test should be failed at tear down site");
+            string expected = string.Format("TearDown : {0} : {1}", e.GetType().FullName, e.Message);
+            Assert.AreEqual(expected, result.Message);
+        }
+
+        public class SetupCallBase
+        {
+            protected int setupCount = 0;
+            public virtual void Init()
+            {
+                setupCount++;
+            }
+            public virtual void AssertCount()
+            {
+            }
+        }
+
+        [TestFixture]
+        // Test for bug 441022
+        public class SetupCallDerived : SetupCallBase
+        {
+            [SetUp]
+            public override void Init()
+            {
+                setupCount++;
+                base.Init();
+            }
+            [Test]
+            public override void AssertCount()
+            {
+                Assert.AreEqual(2, setupCount);
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/SimpleNameFilterTests.cs b/src/NUnitCore/tests/SimpleNameFilterTests.cs
index 5c0571e..21b23d7 100644
--- a/src/NUnitCore/tests/SimpleNameFilterTests.cs
+++ b/src/NUnitCore/tests/SimpleNameFilterTests.cs
@@ -1,121 +1,121 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-using NUnit.Core.Builders;
-using NUnit.Core.Filters;
-using NUnit.Tests.Singletons;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class SimpleNameFilterTests
-    {
-        private TestSuite testSuite;
-        private Test mock3;
-
-        [SetUp]
-        public void SetUp()
-        {
-            testSuite = new TestSuite("Mock Test Suite");
-            testSuite.Add(TestBuilder.MakeFixture(typeof(MockTestFixture)));
-            mock3 = TestFinder.Find("MockTest3", testSuite, true);
-        }
-
-        [Test]
-        public void SingleNameMatch()
-        {
-            string fullName = "NUnit.Tests.Assemblies.MockTestFixture.MockTest3";
-            Assert.AreEqual(fullName, mock3.TestName.FullName);
-            SimpleNameFilter filter = new SimpleNameFilter(fullName);
-            Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-            Assert.AreEqual("NUnit.Tests.Assemblies.MockTestFixture", ((TestSuite)testSuite.Tests[0]).TestName.FullName);
-            Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
-        }
-
-        [Test]
-        public void MultipleNameMatch()
-        {
-            Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
-            SimpleNameFilter filter = new SimpleNameFilter();
-            filter.Add("NUnit.Tests.Assemblies.MockTestFixture.MockTest3");
-            filter.Add("NUnit.Tests.Assemblies.MockTestFixture.MockTest1");
-            Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-            Assert.IsTrue(filter.Pass(mock1), "Name Filter did not pass test case");
-            Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
-        }
-
-        [Test]
-        public void SuiteNameMatch()
-        {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
-            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
-            Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
-            Assert.IsTrue(filter.Pass(mockTest), "Fixture did not pass test case");
-            Assert.IsTrue(filter.Pass(testSuite), "Suite did not pass test case");
-        }
-
-        [Test]
-        public void TestDoesNotMatch()
-        {
-            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture.MockTest1");
-            Assert.IsFalse(filter.Pass(mock3), "Name Filter did pass test case");
-            Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass test suite");
-        }
-
-        [Test]
-        public void HighLevelSuite()
-        {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
-            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
-            Assert.AreEqual(true, filter.Pass(mock3), "test case");
-            Assert.AreEqual(true, filter.Pass(mockTest), "fixture");
-            Assert.AreEqual(true, filter.Pass(testSuite), "test suite");
-        }
-
-        [Test]
-        public void ExplicitTestCaseDoesNotMatchWhenNotSelectedDirectly()
-        {
-            Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
-            SimpleNameFilter filter = new SimpleNameFilter("Mock Test Suite");
-            Assert.AreEqual(false, filter.Pass(explicitTest));
-        }
-
-        [Test]
-        public void ExplicitTestCaseMatchesWhenSelectedDirectly()
-        {
-            Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
-            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture.ExplicitlyRunTest");
-            Assert.IsTrue(filter.Pass(explicitTest), "Name Filter did not pass on test case");
-            Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass on test suite");
-        }
-
-        [Test]
-        public void ExplicitTestSuiteDoesNotMatchWhenNotSelectedDirectly()
-        {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
-			mockTest.RunState = RunState.Explicit;
-            SimpleNameFilter filter = new SimpleNameFilter("Mock Test Suite");
-            Assert.AreEqual(false, filter.Pass(mock3), "descendant of explicit suite should not match");
-            Assert.AreEqual(false, filter.Pass(mockTest), "explicit suite should not match");
-        }
-
-        [Test]
-        public void ExplicitTestSuiteMatchesWhenSelectedDirectly()
-        {
-            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
-			mockTest.RunState = RunState.Explicit;
-            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
-            Assert.AreEqual(true, filter.Pass(mock3), "test case");
-            Assert.AreEqual(true, filter.Pass(mockTest), "middle suite");
-            Assert.AreEqual(true, filter.Pass(testSuite), "test suite");
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+using NUnit.Core.Builders;
+using NUnit.Core.Filters;
+using NUnit.Tests.Singletons;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class SimpleNameFilterTests
+    {
+        private TestSuite testSuite;
+        private Test mock3;
+
+        [SetUp]
+        public void SetUp()
+        {
+            testSuite = new TestSuite("Mock Test Suite");
+            testSuite.Add(TestBuilder.MakeFixture(typeof(MockTestFixture)));
+            mock3 = TestFinder.Find("MockTest3", testSuite, true);
+        }
+
+        [Test]
+        public void SingleNameMatch()
+        {
+            string fullName = "NUnit.Tests.Assemblies.MockTestFixture.MockTest3";
+            Assert.AreEqual(fullName, mock3.TestName.FullName);
+            SimpleNameFilter filter = new SimpleNameFilter(fullName);
+            Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
+            Assert.AreEqual("NUnit.Tests.Assemblies.MockTestFixture", ((TestSuite)testSuite.Tests[0]).TestName.FullName);
+            Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
+        }
+
+        [Test]
+        public void MultipleNameMatch()
+        {
+            Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
+            SimpleNameFilter filter = new SimpleNameFilter();
+            filter.Add("NUnit.Tests.Assemblies.MockTestFixture.MockTest3");
+            filter.Add("NUnit.Tests.Assemblies.MockTestFixture.MockTest1");
+            Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
+            Assert.IsTrue(filter.Pass(mock1), "Name Filter did not pass test case");
+            Assert.IsTrue(filter.Pass((TestSuite)testSuite.Tests[0]), "Name Filter did not pass test suite");
+        }
+
+        [Test]
+        public void SuiteNameMatch()
+        {
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
+            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
+            Assert.IsTrue(filter.Pass(mock3), "Name Filter did not pass test case");
+            Assert.IsTrue(filter.Pass(mockTest), "Fixture did not pass test case");
+            Assert.IsTrue(filter.Pass(testSuite), "Suite did not pass test case");
+        }
+
+        [Test]
+        public void TestDoesNotMatch()
+        {
+            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture.MockTest1");
+            Assert.IsFalse(filter.Pass(mock3), "Name Filter did pass test case");
+            Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass test suite");
+        }
+
+        [Test]
+        public void HighLevelSuite()
+        {
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
+            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
+            Assert.AreEqual(true, filter.Pass(mock3), "test case");
+            Assert.AreEqual(true, filter.Pass(mockTest), "fixture");
+            Assert.AreEqual(true, filter.Pass(testSuite), "test suite");
+        }
+
+        [Test]
+        public void ExplicitTestCaseDoesNotMatchWhenNotSelectedDirectly()
+        {
+            Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
+            SimpleNameFilter filter = new SimpleNameFilter("Mock Test Suite");
+            Assert.AreEqual(false, filter.Pass(explicitTest));
+        }
+
+        [Test]
+        public void ExplicitTestCaseMatchesWhenSelectedDirectly()
+        {
+            Test explicitTest = TestFinder.Find("ExplicitlyRunTest", testSuite, true);
+            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture.ExplicitlyRunTest");
+            Assert.IsTrue(filter.Pass(explicitTest), "Name Filter did not pass on test case");
+            Assert.IsTrue(filter.Pass(testSuite), "Name Filter did not pass on test suite");
+        }
+
+        [Test]
+        public void ExplicitTestSuiteDoesNotMatchWhenNotSelectedDirectly()
+        {
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
+			mockTest.RunState = RunState.Explicit;
+            SimpleNameFilter filter = new SimpleNameFilter("Mock Test Suite");
+            Assert.AreEqual(false, filter.Pass(mock3), "descendant of explicit suite should not match");
+            Assert.AreEqual(false, filter.Pass(mockTest), "explicit suite should not match");
+        }
+
+        [Test]
+        public void ExplicitTestSuiteMatchesWhenSelectedDirectly()
+        {
+            NUnit.Core.TestSuite mockTest = (NUnit.Core.TestSuite)TestFinder.Find("MockTestFixture", testSuite, true);
+			mockTest.RunState = RunState.Explicit;
+            SimpleNameFilter filter = new SimpleNameFilter("NUnit.Tests.Assemblies.MockTestFixture");
+            Assert.AreEqual(true, filter.Pass(mock3), "test case");
+            Assert.AreEqual(true, filter.Pass(mockTest), "middle suite");
+            Assert.AreEqual(true, filter.Pass(testSuite), "test suite");
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/SimpleTestRunnerTests.cs b/src/NUnitCore/tests/SimpleTestRunnerTests.cs
index f403f93..7766129 100644
--- a/src/NUnitCore/tests/SimpleTestRunnerTests.cs
+++ b/src/NUnitCore/tests/SimpleTestRunnerTests.cs
@@ -1,36 +1,36 @@
-// ****************************************************************
-// Copyright 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.Tests.Assemblies;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Tests of BaseTestRunner
-	/// </summary>
-	[TestFixture]
-	public class SimpleTestRunnerTests : BasicRunnerTests
-	{
-		private SimpleTestRunner myRunner;
-
-		protected override TestRunner CreateRunner( int runnerID )
-		{
-			myRunner = new SimpleTestRunner( runnerID );
-			return myRunner;
-		}
-
-//		[Test]
-//		public void BeginRunIsSynchronous()
-//		{
-//			myRunner.Load( "mock-assembly.dll" );
-//			myRunner.BeginRun( NullListener.NULL );
-//			Assert.IsFalse( myRunner.Running );
-//		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Tests.Assemblies;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Tests of BaseTestRunner
+	/// </summary>
+	[TestFixture]
+	public class SimpleTestRunnerTests : BasicRunnerTests
+	{
+		private SimpleTestRunner myRunner;
+
+		protected override TestRunner CreateRunner( int runnerID )
+		{
+			myRunner = new SimpleTestRunner( runnerID );
+			return myRunner;
+		}
+
+//		[Test]
+//		public void BeginRunIsSynchronous()
+//		{
+//			myRunner.Load( "mock-assembly.dll" );
+//			myRunner.BeginRun( NullListener.NULL );
+//			Assert.IsFalse( myRunner.Running );
+//		}
+	}
+}
diff --git a/src/NUnitCore/tests/StackOverflowTestFixture.cs b/src/NUnitCore/tests/StackOverflowTestFixture.cs
index f6f5793..2d305be 100644
--- a/src/NUnitCore/tests/StackOverflowTestFixture.cs
+++ b/src/NUnitCore/tests/StackOverflowTestFixture.cs
@@ -1,31 +1,31 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using System.Runtime.InteropServices;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for StackOverflowTestFixture.
-	/// </summary>
-	[TestFixture, Platform(Exclude="Net-2.0,Net-4.0,Mono",Reason="Cannot handle StackOverflowException in managed code")]
-	public class StackOverflowTestFixture
-	{
-		private void FunctionCallsSelf()
-		{
-			FunctionCallsSelf();
-		}
-
-		[Test, ExpectedException] // StackOverflowException in .NET, NullReferenceExcepton in Mono
-		[Platform(Exclude="Net-2.0,linux",Reason="Cannot handle StackOverflowException in managed code")]
-		public void SimpleOverflow()
-		{
-            FunctionCallsSelf();
-        }
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using System.Runtime.InteropServices;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for StackOverflowTestFixture.
+	/// </summary>
+	[TestFixture, Platform(Exclude="Net-2.0,Net-4.0,Mono",Reason="Cannot handle StackOverflowException in managed code")]
+	public class StackOverflowTestFixture
+	{
+		private void FunctionCallsSelf()
+		{
+			FunctionCallsSelf();
+		}
+
+		[Test, ExpectedException] // StackOverflowException in .NET, NullReferenceExcepton in Mono
+		[Platform(Exclude="Net-2.0,linux",Reason="Cannot handle StackOverflowException in managed code")]
+		public void SimpleOverflow()
+		{
+            FunctionCallsSelf();
+        }
+	}
+}
diff --git a/src/NUnitCore/tests/SuiteBuilderTests.cs b/src/NUnitCore/tests/SuiteBuilderTests.cs
index 7630aa5..a5f24aa 100644
--- a/src/NUnitCore/tests/SuiteBuilderTests.cs
+++ b/src/NUnitCore/tests/SuiteBuilderTests.cs
@@ -1,136 +1,136 @@
-// ****************************************************************
-// 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 NUnit.Core;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class SuiteBuilderTests
-	{
-        private string testsDll = AssemblyHelper.GetAssemblyPath(typeof(SuiteBuilderTests));
-		private string testData = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestData.EmptyFixture));
-		private string tempFile;
-		private TestSuiteBuilder builder;
-
-		[SetUp]
-		public void CreateBuilder()
-		{
-			builder = new TestSuiteBuilder();
-            tempFile = Path.ChangeExtension(Path.GetTempFileName(), ".dll");
-		}
-		[TearDown]
-		public void TearDown()
-		{
-			FileInfo info = new FileInfo(tempFile);
-			if(info.Exists) info.Delete();
-		}
-
-		[Test]
-		public void LoadAssembly() 
-		{
-			Test suite = builder.Build( new TestPackage( testsDll ) );
-			Assert.IsNotNull(suite, "Unable to build suite" );
-			Assert.AreEqual( 1, suite.Tests.Count );
-			Assert.AreEqual( "NUnit", ((ITest)suite.Tests[0]).TestName.Name );
-		}
-
-		[Test]
-		public void LoadAssemblyWithoutNamespaces()
-		{
-			TestPackage package = new TestPackage( testsDll );
-			package.Settings["AutoNamespaceSuites"] = false;
-			Test suite = builder.Build( package );
-			Assert.IsNotNull(suite, "Unable to build suite" );
-			Assert.Greater( suite.Tests.Count, 1 );
-			Assert.AreEqual( "TestFixture", ((ITest)suite.Tests[0]).TestType );
-		}
-
-		[Test]
-		public void LoadFixture()
-		{
-			TestPackage package = new TestPackage( testsDll );
-			package.TestName = "NUnit.Core.Tests.SuiteBuilderTests";
-			Test suite= builder.Build( package );
-			Assert.IsNotNull(suite, "Unable to build suite");
-		}
-
-		[Test]
-		public void LoadSuite()
-		{
-			TestPackage package = new TestPackage( testsDll );
-			package.TestName = "NUnit.Core.Tests.AllTests";
-			Test suite= builder.Build( package );
-			Assert.IsNotNull(suite, "Unable to build suite");
-			Assert.AreEqual( 3, suite.Tests.Count );
-		}
-
-		[Test]
-		public void LoadNamespaceAsSuite()
-		{
-			TestPackage package = new TestPackage( testsDll );
-			package.TestName = "NUnit.Core.Tests";
-			Test suite= builder.Build( package );
-			Assert.IsNotNull( suite );
-			Assert.AreEqual( testsDll, suite.TestName.Name );
-			Assert.AreEqual( "NUnit", ((Test)suite.Tests[0]).TestName.Name );
-		}
-
-		[Test]
-		public void DiscoverSuite()
-		{
-			TestPackage package = new TestPackage( testData );
-			package.TestName = "NUnit.TestData.LegacySuiteData.Suite";
-			Test suite = builder.Build( package );
-			Assert.IsNotNull(suite, "Could not discover suite attribute");
-		}
-
-		[Test]
-		public void WrongReturnTypeSuite()
-		{
-			TestPackage package = new TestPackage( testData );
-			package.TestName = "NUnit.TestData.LegacySuiteData.NonConformingSuite";
-			Test suite = builder.Build( package );
-			Assert.AreEqual(RunState.NotRunnable, suite.RunState);
-            Assert.AreEqual("Suite property must return either TestSuite or IEnumerable", suite.IgnoreReason);
-		}
-
-		[Test]
-		[ExpectedException(typeof(FileNotFoundException))]
-		public void FileNotFound()
-		{
-			builder.Build( new TestPackage( "/xxxx.dll" ) );
-		}
-
-		// Gives FileNotFoundException on Mono
-		[Test, ExpectedException(typeof(BadImageFormatException))]
-		public void InvalidAssembly()
-		{
-			FileInfo file = new FileInfo( tempFile );
-
-			StreamWriter sw = file.AppendText();
-
-			sw.WriteLine("This is a new entry to add to the file");
-			sw.WriteLine("This is yet another line to add...");
-			sw.Flush();
-			sw.Close();
-
-			builder.Build( new TestPackage( tempFile ) );
-		}
-
-		[Test]
-		public void FixtureNotFound()
-		{
-			TestPackage package = new TestPackage( testsDll );
-			package.TestName = "NUnit.Tests.Junk";
-			Assert.IsNull( builder.Build( package ) );
-		}
-	}
-}
+// ****************************************************************
+// 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 NUnit.Core;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class SuiteBuilderTests
+	{
+        private string testsDll = AssemblyHelper.GetAssemblyPath(typeof(SuiteBuilderTests));
+		private string testData = AssemblyHelper.GetAssemblyPath(typeof(NUnit.TestData.EmptyFixture));
+		private string tempFile;
+		private TestSuiteBuilder builder;
+
+		[SetUp]
+		public void CreateBuilder()
+		{
+			builder = new TestSuiteBuilder();
+            tempFile = Path.ChangeExtension(Path.GetTempFileName(), ".dll");
+		}
+		[TearDown]
+		public void TearDown()
+		{
+			FileInfo info = new FileInfo(tempFile);
+			if(info.Exists) info.Delete();
+		}
+
+		[Test]
+		public void LoadAssembly() 
+		{
+			Test suite = builder.Build( new TestPackage( testsDll ) );
+			Assert.IsNotNull(suite, "Unable to build suite" );
+			Assert.AreEqual( 1, suite.Tests.Count );
+			Assert.AreEqual( "NUnit", ((ITest)suite.Tests[0]).TestName.Name );
+		}
+
+		[Test]
+		public void LoadAssemblyWithoutNamespaces()
+		{
+			TestPackage package = new TestPackage( testsDll );
+			package.Settings["AutoNamespaceSuites"] = false;
+			Test suite = builder.Build( package );
+			Assert.IsNotNull(suite, "Unable to build suite" );
+			Assert.Greater( suite.Tests.Count, 1 );
+			Assert.AreEqual( "TestFixture", ((ITest)suite.Tests[0]).TestType );
+		}
+
+		[Test]
+		public void LoadFixture()
+		{
+			TestPackage package = new TestPackage( testsDll );
+			package.TestName = "NUnit.Core.Tests.SuiteBuilderTests";
+			Test suite= builder.Build( package );
+			Assert.IsNotNull(suite, "Unable to build suite");
+		}
+
+		[Test]
+		public void LoadSuite()
+		{
+			TestPackage package = new TestPackage( testsDll );
+			package.TestName = "NUnit.Core.Tests.AllTests";
+			Test suite= builder.Build( package );
+			Assert.IsNotNull(suite, "Unable to build suite");
+			Assert.AreEqual( 3, suite.Tests.Count );
+		}
+
+		[Test]
+		public void LoadNamespaceAsSuite()
+		{
+			TestPackage package = new TestPackage( testsDll );
+			package.TestName = "NUnit.Core.Tests";
+			Test suite= builder.Build( package );
+			Assert.IsNotNull( suite );
+			Assert.AreEqual( testsDll, suite.TestName.Name );
+			Assert.AreEqual( "NUnit", ((Test)suite.Tests[0]).TestName.Name );
+		}
+
+		[Test]
+		public void DiscoverSuite()
+		{
+			TestPackage package = new TestPackage( testData );
+			package.TestName = "NUnit.TestData.LegacySuiteData.Suite";
+			Test suite = builder.Build( package );
+			Assert.IsNotNull(suite, "Could not discover suite attribute");
+		}
+
+		[Test]
+		public void WrongReturnTypeSuite()
+		{
+			TestPackage package = new TestPackage( testData );
+			package.TestName = "NUnit.TestData.LegacySuiteData.NonConformingSuite";
+			Test suite = builder.Build( package );
+			Assert.AreEqual(RunState.NotRunnable, suite.RunState);
+            Assert.AreEqual("Suite property must return either TestSuite or IEnumerable", suite.IgnoreReason);
+		}
+
+		[Test]
+		[ExpectedException(typeof(FileNotFoundException))]
+		public void FileNotFound()
+		{
+			builder.Build( new TestPackage( "/xxxx.dll" ) );
+		}
+
+		// Gives FileNotFoundException on Mono
+		[Test, ExpectedException(typeof(BadImageFormatException))]
+		public void InvalidAssembly()
+		{
+			FileInfo file = new FileInfo( tempFile );
+
+			StreamWriter sw = file.AppendText();
+
+			sw.WriteLine("This is a new entry to add to the file");
+			sw.WriteLine("This is yet another line to add...");
+			sw.Flush();
+			sw.Close();
+
+			builder.Build( new TestPackage( tempFile ) );
+		}
+
+		[Test]
+		public void FixtureNotFound()
+		{
+			TestPackage package = new TestPackage( testsDll );
+			package.TestName = "NUnit.Tests.Junk";
+			Assert.IsNull( builder.Build( package ) );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs b/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs
index 6574871..e68ac79 100644
--- a/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs
+++ b/src/NUnitCore/tests/SuiteBuilderTests_Multiple.cs
@@ -1,63 +1,63 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Util;
-using NUnit.Tests.Assemblies;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class SuiteBuilderTests_Multiple
-	{
-		private static readonly int totalTests = NoNamespaceTestFixture.Tests + MockAssembly.Tests;
-
-		private TestSuiteBuilder builder;
-		private static string[] assemblies = new string[] {
-            NoNamespaceTestFixture.AssemblyPath,
-            MockAssembly.AssemblyPath
-        };
-		private Test loadedSuite;
-
-		[SetUp]
-		public void LoadSuite()
-		{
-			builder = new TestSuiteBuilder();
-			loadedSuite = builder.Build( new TestPackage( "TestSuite", assemblies ) );
-		}
-
-		[Test]
-		public void BuildSuite()
-		{
-			Assert.IsNotNull( loadedSuite );
-		}
-
-		[Test]
-		public void RootNode()
-		{
-			Assert.AreEqual( "TestSuite", loadedSuite.TestName.Name );
-		}
-
-		[Test]
-		public void TestCaseCount()
-		{
-			Assert.AreEqual( totalTests , loadedSuite.TestCount);
-		}
-
-		[Test]
-		public void LoadFixture()
-		{
-			TestPackage package = new TestPackage( "Multiple Assemblies", assemblies );
-			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
-			TestSuite suite = builder.Build( package );
-			Assert.IsNotNull( suite );
-			Assert.AreEqual( MockTestFixture.Tests, suite.TestCount );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Util;
+using NUnit.Tests.Assemblies;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class SuiteBuilderTests_Multiple
+	{
+		private static readonly int totalTests = NoNamespaceTestFixture.Tests + MockAssembly.Tests;
+
+		private TestSuiteBuilder builder;
+		private static string[] assemblies = new string[] {
+            NoNamespaceTestFixture.AssemblyPath,
+            MockAssembly.AssemblyPath
+        };
+		private Test loadedSuite;
+
+		[SetUp]
+		public void LoadSuite()
+		{
+			builder = new TestSuiteBuilder();
+			loadedSuite = builder.Build( new TestPackage( "TestSuite", assemblies ) );
+		}
+
+		[Test]
+		public void BuildSuite()
+		{
+			Assert.IsNotNull( loadedSuite );
+		}
+
+		[Test]
+		public void RootNode()
+		{
+			Assert.AreEqual( "TestSuite", loadedSuite.TestName.Name );
+		}
+
+		[Test]
+		public void TestCaseCount()
+		{
+			Assert.AreEqual( totalTests , loadedSuite.TestCount);
+		}
+
+		[Test]
+		public void LoadFixture()
+		{
+			TestPackage package = new TestPackage( "Multiple Assemblies", assemblies );
+			package.TestName = "NUnit.Tests.Assemblies.MockTestFixture";
+			TestSuite suite = builder.Build( package );
+			Assert.IsNotNull( suite );
+			Assert.AreEqual( MockTestFixture.Tests, suite.TestCount );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestAssemblyBuilderTests.cs b/src/NUnitCore/tests/TestAssemblyBuilderTests.cs
index 69b7428..71d1845 100644
--- a/src/NUnitCore/tests/TestAssemblyBuilderTests.cs
+++ b/src/NUnitCore/tests/TestAssemblyBuilderTests.cs
@@ -1,46 +1,46 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-
-namespace NUnit.Core.Tests
-{
-    // It's no longer possible to load assemblies at a relative
-    // location to the current directory.
-    // TODO: Create other tests
-	//[TestFixture]
-    //public class TestAssemblyBuilderTests
-    //{
-    //    [Test]
-    //    public void CanLoadAssemblyInCurrentDirectory()
-    //    {
-    //        TestAssemblyBuilder builder = new TestAssemblyBuilder();
-    //        Assert.IsNotNull( builder.Build( "mock-assembly.dll", false ) );
-    //    }
-
-    //    [Test]
-    //    public void CanLoadAssemblyAtRelativeDirectoryLocation()
-    //    {
-    //        DirectoryInfo current = new DirectoryInfo( Environment.CurrentDirectory );
-    //        string dir = current.Name;
-    //        string parentDir = current.Parent.FullName;
-
-    //        try
-    //        {
-    //            Environment.CurrentDirectory = parentDir;
-    //            TestAssemblyBuilder builder = new TestAssemblyBuilder();
-    //            Assert.IsNotNull( builder.Build( dir + Path.DirectorySeparatorChar + "mock-assembly.dll", false ) );
-    //        }
-    //        finally
-    //        {
-    //            Environment.CurrentDirectory = current.FullName;
-    //        }
-    //    }
-	//}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+
+namespace NUnit.Core.Tests
+{
+    // It's no longer possible to load assemblies at a relative
+    // location to the current directory.
+    // TODO: Create other tests
+	//[TestFixture]
+    //public class TestAssemblyBuilderTests
+    //{
+    //    [Test]
+    //    public void CanLoadAssemblyInCurrentDirectory()
+    //    {
+    //        TestAssemblyBuilder builder = new TestAssemblyBuilder();
+    //        Assert.IsNotNull( builder.Build( "mock-assembly.dll", false ) );
+    //    }
+
+    //    [Test]
+    //    public void CanLoadAssemblyAtRelativeDirectoryLocation()
+    //    {
+    //        DirectoryInfo current = new DirectoryInfo( Environment.CurrentDirectory );
+    //        string dir = current.Name;
+    //        string parentDir = current.Parent.FullName;
+
+    //        try
+    //        {
+    //            Environment.CurrentDirectory = parentDir;
+    //            TestAssemblyBuilder builder = new TestAssemblyBuilder();
+    //            Assert.IsNotNull( builder.Build( dir + Path.DirectorySeparatorChar + "mock-assembly.dll", false ) );
+    //        }
+    //        finally
+    //        {
+    //            Environment.CurrentDirectory = current.FullName;
+    //        }
+    //    }
+	//}
+}
diff --git a/src/NUnitCore/tests/TestCaseAttributeTests.cs b/src/NUnitCore/tests/TestCaseAttributeTests.cs
index 000f808..95dbe03 100644
--- a/src/NUnitCore/tests/TestCaseAttributeTests.cs
+++ b/src/NUnitCore/tests/TestCaseAttributeTests.cs
@@ -1,321 +1,321 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.TestData;
-using NUnit.TestUtilities;
-using System.Collections;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class TestCaseAttributeTests
-    {
-        [TestCase(12, 3, 4)]
-        [TestCase(12, 2, 6)]
-        [TestCase(12, 4, 3)]
-        [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
-        [TestCase(12, 0, 0, ExpectedExceptionName = "System.DivideByZeroException")]
-        public void IntegerDivisionWithResultPassedToTest(int n, int d, int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        [TestCase(12, 3, Result = 4)]
-        [TestCase(12, 2, Result = 6)]
-        [TestCase(12, 4, Result = 3)]
-        [TestCase(12, 0, ExpectedException = typeof(System.DivideByZeroException))]
-        [TestCase(12, 0, ExpectedExceptionName = "System.DivideByZeroException",
-            TestName = "DivisionByZeroThrowsException")]
-        public int IntegerDivisionWithResultCheckedByNUnit(int n, int d)
-        {
-            return n / d;
-        }
-
-        [TestCase(2, 2, Result=4)]
-        public double CanConvertIntToDouble(double x, double y)
-        {
-            return x + y;
-        }
-
-        [TestCase("2.2", "3.3", Result = 5.5)]
-        public decimal CanConvertStringToDecimal(decimal x, decimal y)
-        {
-            return x + y;
-        }
-
-        [TestCase(2.2, 3.3, Result = 5.5)]
-        public decimal CanConvertDoubleToDecimal(decimal x, decimal y)
-        {
-            return x + y;
-        }
-
-        [TestCase(5, 2, Result = 7)]
-        public decimal CanConvertIntToDecimal(decimal x, decimal y)
-        {
-            return x + y;
-        }
-
-        [TestCase(5, 2, Result = 7)]
-        public short CanConvertSmallIntsToShort(short x, short y)
-        {
-            return (short)(x + y);
-        }
-
-        [TestCase(5, 2, Result = 7)]
-        public byte CanConvertSmallIntsToByte(byte x, byte y)
-        {
-            return (byte)(x + y);
-        }
-
-        [TestCase(5, 2, Result = 7)]
-        public sbyte CanConvertSmallIntsToSByte(sbyte x, sbyte y)
-        {
-            return (sbyte)(x + y);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [TestCase(Result = null)]
-        public object ExpectedResultCanBeNull()
-        {
-            return null;
-        }
-#endif
-
-        [Test]
-		public void ConversionOverflowMakesTestNonRunnable()
-		{
-			Test test = (Test)TestBuilder.MakeTestCase(
-				typeof(TestCaseAttributeFixture), "MethodCausesConversionOverflow").Tests[0];
-			Assert.AreEqual(RunState.NotRunnable, test.RunState);
-		}
-
-        [TestCase("ABCD\u0019"), Explicit("For display purposes only")]
-        public void UnicodeCharInStringArgument(string arg)
-        {
-        }
-
-        [TestCase("12-October-1942")]
-        public void CanConvertStringToDateTime(DateTime dt)
-        {
-            Assert.AreEqual(1942, dt.Year);
-        }
-
-        [TestCase(42, ExpectedException = typeof(System.Exception),
-                   ExpectedMessage = "Test Exception")]
-        public void CanSpecifyExceptionMessage(int a)
-        {
-            throw new System.Exception("Test Exception");
-        }
-
-        [TestCase(42, ExpectedException = typeof(System.Exception),
-           ExpectedMessage = "Test Exception",
-           MatchType=MessageMatch.StartsWith)]
-        public void CanSpecifyExceptionMessageAndMatchType(int a)
-        {
-            throw new System.Exception("Test Exception thrown here");
-        }
-
-
-#if CLR_2_0 || CLR_4_0
-        [TestCase(null, null)]
-        public void CanPassNullAsArgument(object a, string b)
-        {
-            Assert.IsNull(a);
-            Assert.IsNull(b);
-        }
-
-        [TestCase(null)]
-        public void CanPassNullAsSoleArgument(object a)
-        {
-            Assert.IsNull(a);
-        }
-#endif
-
-        [TestCase(new object[] { 1, "two", 3.0 })]
-        [TestCase(new object[] { "zip" })]
-        public void CanPassObjectArrayAsFirstArgument(object[] a)
-        {
-        }
-  
-        [TestCase(new object[] { "a", "b" })]
-        public void CanPassArrayAsArgument(object[] array)
-        {
-            Assert.AreEqual("a", array[0]);
-            Assert.AreEqual("b", array[1]);
-        }
-
-        [TestCase("a", "b")]
-        public void ArgumentsAreCoalescedInObjectArray(object[] array)
-        {
-            Assert.AreEqual("a", array[0]);
-            Assert.AreEqual("b", array[1]);
-        }
-
-        [TestCase(1, "b")]
-        public void ArgumentsOfDifferentTypeAreCoalescedInObjectArray(object[] array)
-        {
-            Assert.AreEqual(1, array[0]);
-            Assert.AreEqual("b", array[1]);
-        }
-
-        [TestCase("a", "b")]
-        public void HandlesParamsArrayAsSoleArgument(params 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)
-        {
-            Assert.AreEqual("a", s1);
-            Assert.AreEqual("b", s2);
-            Assert.AreEqual("c", array[0]);
-            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()
-        {
-			Test test = (Test)TestBuilder.MakeTestCase(
-				typeof(TestCaseAttributeFixture), "MethodHasDescriptionSpecified").Tests[0];
-			Assert.AreEqual("My Description", test.Description);
-		}
-
-        [Test]
-        public void CanSpecifyTestName()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodHasTestNameSpecified").Tests[0];
-            Assert.AreEqual("XYZ", test.TestName.Name);
-            Assert.AreEqual("NUnit.TestData.TestCaseAttributeFixture.XYZ", test.TestName.FullName);
-        }
-
-        [Test]
-        public void CanSpecifyCategory()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodHasSingleCategory").Tests[0];
-            Assert.AreEqual(new string[] { "XYZ" }, test.Categories);
-        }
-
-        [Test]
-        public void CanSpecifyMultipleCategories()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodHasMultipleCategories").Tests[0];
-            Assert.AreEqual(new string[] { "X", "Y", "Z" }, test.Categories);
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodThrowsExpectedException").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Success, result.ResultState);
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException_WrongException()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodThrowsWrongException").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            StringAssert.StartsWith("An unexpected exception type was thrown", result.Message);
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException_WrongMessage()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodThrowsExpectedExceptionWithWrongMessage").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            StringAssert.StartsWith("The exception message text was incorrect", result.Message);
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException_NoneThrown()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodThrowsNoException").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            Assert.AreEqual("System.ArgumentNullException was expected", result.Message);
-        }
-
-        [Test]
-        public void IgnoreTakesPrecedenceOverExpectedException()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodCallsIgnore").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Ignored, result.ResultState);
-            Assert.AreEqual("Ignore this", result.Message);
-        }
-
-        [Test]
-        public void CanIgnoreIndividualTestCases()
-        {
-            Test test = TestBuilder.MakeTestCase(
-                typeof(TestCaseAttributeFixture), "MethodWithIgnoredTestCases");
-
-            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"));
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+using System.Collections;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class TestCaseAttributeTests
+    {
+        [TestCase(12, 3, 4)]
+        [TestCase(12, 2, 6)]
+        [TestCase(12, 4, 3)]
+        [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
+        [TestCase(12, 0, 0, ExpectedExceptionName = "System.DivideByZeroException")]
+        public void IntegerDivisionWithResultPassedToTest(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [TestCase(12, 3, Result = 4)]
+        [TestCase(12, 2, Result = 6)]
+        [TestCase(12, 4, Result = 3)]
+        [TestCase(12, 0, ExpectedException = typeof(System.DivideByZeroException))]
+        [TestCase(12, 0, ExpectedExceptionName = "System.DivideByZeroException",
+            TestName = "DivisionByZeroThrowsException")]
+        public int IntegerDivisionWithResultCheckedByNUnit(int n, int d)
+        {
+            return n / d;
+        }
+
+        [TestCase(2, 2, Result=4)]
+        public double CanConvertIntToDouble(double x, double y)
+        {
+            return x + y;
+        }
+
+        [TestCase("2.2", "3.3", Result = 5.5)]
+        public decimal CanConvertStringToDecimal(decimal x, decimal y)
+        {
+            return x + y;
+        }
+
+        [TestCase(2.2, 3.3, Result = 5.5)]
+        public decimal CanConvertDoubleToDecimal(decimal x, decimal y)
+        {
+            return x + y;
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public decimal CanConvertIntToDecimal(decimal x, decimal y)
+        {
+            return x + y;
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public short CanConvertSmallIntsToShort(short x, short y)
+        {
+            return (short)(x + y);
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public byte CanConvertSmallIntsToByte(byte x, byte y)
+        {
+            return (byte)(x + y);
+        }
+
+        [TestCase(5, 2, Result = 7)]
+        public sbyte CanConvertSmallIntsToSByte(sbyte x, sbyte y)
+        {
+            return (sbyte)(x + y);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [TestCase(Result = null)]
+        public object ExpectedResultCanBeNull()
+        {
+            return null;
+        }
+#endif
+
+        [Test]
+		public void ConversionOverflowMakesTestNonRunnable()
+		{
+			Test test = (Test)TestBuilder.MakeTestCase(
+				typeof(TestCaseAttributeFixture), "MethodCausesConversionOverflow").Tests[0];
+			Assert.AreEqual(RunState.NotRunnable, test.RunState);
+		}
+
+        [TestCase("ABCD\u0019"), Explicit("For display purposes only")]
+        public void UnicodeCharInStringArgument(string arg)
+        {
+        }
+
+        [TestCase("12-October-1942")]
+        public void CanConvertStringToDateTime(DateTime dt)
+        {
+            Assert.AreEqual(1942, dt.Year);
+        }
+
+        [TestCase(42, ExpectedException = typeof(System.Exception),
+                   ExpectedMessage = "Test Exception")]
+        public void CanSpecifyExceptionMessage(int a)
+        {
+            throw new System.Exception("Test Exception");
+        }
+
+        [TestCase(42, ExpectedException = typeof(System.Exception),
+           ExpectedMessage = "Test Exception",
+           MatchType=MessageMatch.StartsWith)]
+        public void CanSpecifyExceptionMessageAndMatchType(int a)
+        {
+            throw new System.Exception("Test Exception thrown here");
+        }
+
+
+#if CLR_2_0 || CLR_4_0
+        [TestCase(null, null)]
+        public void CanPassNullAsArgument(object a, string b)
+        {
+            Assert.IsNull(a);
+            Assert.IsNull(b);
+        }
+
+        [TestCase(null)]
+        public void CanPassNullAsSoleArgument(object a)
+        {
+            Assert.IsNull(a);
+        }
+#endif
+
+        [TestCase(new object[] { 1, "two", 3.0 })]
+        [TestCase(new object[] { "zip" })]
+        public void CanPassObjectArrayAsFirstArgument(object[] a)
+        {
+        }
+  
+        [TestCase(new object[] { "a", "b" })]
+        public void CanPassArrayAsArgument(object[] array)
+        {
+            Assert.AreEqual("a", array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase("a", "b")]
+        public void ArgumentsAreCoalescedInObjectArray(object[] array)
+        {
+            Assert.AreEqual("a", array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase(1, "b")]
+        public void ArgumentsOfDifferentTypeAreCoalescedInObjectArray(object[] array)
+        {
+            Assert.AreEqual(1, array[0]);
+            Assert.AreEqual("b", array[1]);
+        }
+
+        [TestCase("a", "b")]
+        public void HandlesParamsArrayAsSoleArgument(params 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)
+        {
+            Assert.AreEqual("a", s1);
+            Assert.AreEqual("b", s2);
+            Assert.AreEqual("c", array[0]);
+            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()
+        {
+			Test test = (Test)TestBuilder.MakeTestCase(
+				typeof(TestCaseAttributeFixture), "MethodHasDescriptionSpecified").Tests[0];
+			Assert.AreEqual("My Description", test.Description);
+		}
+
+        [Test]
+        public void CanSpecifyTestName()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodHasTestNameSpecified").Tests[0];
+            Assert.AreEqual("XYZ", test.TestName.Name);
+            Assert.AreEqual("NUnit.TestData.TestCaseAttributeFixture.XYZ", test.TestName.FullName);
+        }
+
+        [Test]
+        public void CanSpecifyCategory()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodHasSingleCategory").Tests[0];
+            Assert.AreEqual(new string[] { "XYZ" }, test.Categories);
+        }
+
+        [Test]
+        public void CanSpecifyMultipleCategories()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodHasMultipleCategories").Tests[0];
+            Assert.AreEqual(new string[] { "X", "Y", "Z" }, test.Categories);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsExpectedException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Success, result.ResultState);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_WrongException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsWrongException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.StartsWith("An unexpected exception type was thrown", result.Message);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_WrongMessage()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsExpectedExceptionWithWrongMessage").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.StartsWith("The exception message text was incorrect", result.Message);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_NoneThrown()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodThrowsNoException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            Assert.AreEqual("System.ArgumentNullException was expected", result.Message);
+        }
+
+        [Test]
+        public void IgnoreTakesPrecedenceOverExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodCallsIgnore").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Ignored, result.ResultState);
+            Assert.AreEqual("Ignore this", result.Message);
+        }
+
+        [Test]
+        public void CanIgnoreIndividualTestCases()
+        {
+            Test test = TestBuilder.MakeTestCase(
+                typeof(TestCaseAttributeFixture), "MethodWithIgnoredTestCases");
+
+            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/TestCaseResultFixture.cs b/src/NUnitCore/tests/TestCaseResultFixture.cs
index 125f4e1..bb2a224 100644
--- a/src/NUnitCore/tests/TestCaseResultFixture.cs
+++ b/src/NUnitCore/tests/TestCaseResultFixture.cs
@@ -1,61 +1,61 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Core.Tests
-{
-	using System;
-	using NUnit.Framework;	
-	using NUnit.Core;
-	using NUnit.TestUtilities;
-
-	/// <summary>
-	/// Summary description for TestResultTests.
-	/// </summary>
-	[TestFixture]
-	public class TestCaseResultFixture
-	{
-		private TestResult caseResult;
-
-		[SetUp]
-		public void SetUp()
-		{
-			caseResult = new TestResult( new TestInfo(new NUnitTestMethod(Reflect.GetNamedMethod( this.GetType(), "DummyMethod" ) ) ) );
-		}
-
-		public void DummyMethod() { }
-		
-		[Test]
-		public void TestCaseDefault()
-		{
-			Assert.AreEqual( ResultState.Inconclusive, caseResult.ResultState );
-		}
-
-		[Test]
-		public void TestCaseSuccess()
-		{
-			caseResult.Success();
-			Assert.IsTrue(caseResult.IsSuccess, "result should be success");
-		}
-
-		[Test]
-		public void TestCaseNotRun()
-		{
-			caseResult.Ignore( "because" );
-			Assert.AreEqual( false, caseResult.Executed );
-			Assert.AreEqual( "because", caseResult.Message );
-		}
-
-		[Test]
-		public void TestCaseFailure()
-		{
-			caseResult.Failure("message", "stack trace");
-			Assert.IsTrue(caseResult.IsFailure);
-			Assert.IsFalse(caseResult.IsSuccess);
-			Assert.AreEqual("message",caseResult.Message);
-			Assert.AreEqual("stack trace",caseResult.StackTrace);
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Core.Tests
+{
+	using System;
+	using NUnit.Framework;	
+	using NUnit.Core;
+	using NUnit.TestUtilities;
+
+	/// <summary>
+	/// Summary description for TestResultTests.
+	/// </summary>
+	[TestFixture]
+	public class TestCaseResultFixture
+	{
+		private TestResult caseResult;
+
+		[SetUp]
+		public void SetUp()
+		{
+			caseResult = new TestResult( new TestInfo(new NUnitTestMethod(Reflect.GetNamedMethod( this.GetType(), "DummyMethod" ) ) ) );
+		}
+
+		public void DummyMethod() { }
+		
+		[Test]
+		public void TestCaseDefault()
+		{
+			Assert.AreEqual( ResultState.Inconclusive, caseResult.ResultState );
+		}
+
+		[Test]
+		public void TestCaseSuccess()
+		{
+			caseResult.Success();
+			Assert.IsTrue(caseResult.IsSuccess, "result should be success");
+		}
+
+		[Test]
+		public void TestCaseNotRun()
+		{
+			caseResult.Ignore( "because" );
+			Assert.AreEqual( false, caseResult.Executed );
+			Assert.AreEqual( "because", caseResult.Message );
+		}
+
+		[Test]
+		public void TestCaseFailure()
+		{
+			caseResult.Failure("message", "stack trace");
+			Assert.IsTrue(caseResult.IsFailure);
+			Assert.IsFalse(caseResult.IsSuccess);
+			Assert.AreEqual("message",caseResult.Message);
+			Assert.AreEqual("stack trace",caseResult.StackTrace);
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestCaseSourceTests.cs b/src/NUnitCore/tests/TestCaseSourceTests.cs
index c9fb16a..ec429e5 100644
--- a/src/NUnitCore/tests/TestCaseSourceTests.cs
+++ b/src/NUnitCore/tests/TestCaseSourceTests.cs
@@ -1,363 +1,379 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.TestData;
-using NUnit.TestUtilities;
-using System.Collections;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class TestCaseSourceTests
-    {
-        [Test, TestCaseSource("StaticProperty")]
-        public void SourceCanBeStaticProperty(string source)
-        {
-            Assert.AreEqual("StaticProperty", source);
-        }
-
-        static IEnumerable StaticProperty
-        {
-            get { return new object[] { new object[] { "StaticProperty" } }; }
-        }
-
-        [Test, TestCaseSource("InstanceProperty")]
-        public void SourceCanBeInstanceProperty(string source)
-        {
-            Assert.AreEqual("InstanceProperty", source);
-        }
-
-        IEnumerable InstanceProperty
-        {
-            get { return new object[] { new object[] { "InstanceProperty" } }; }
-        }
-
-        [Test, TestCaseSource("StaticMethod")]
-        public void SourceCanBeStaticMethod(string source)
-        {
-            Assert.AreEqual("StaticMethod", source);
-        }
-
-        static IEnumerable StaticMethod()
-        {
-            return new object[] { new object[] { "StaticMethod" } };
-        }
-
-        [Test, TestCaseSource("InstanceMethod")]
-        public void SourceCanBeInstanceMethod(string source)
-        {
-            Assert.AreEqual("InstanceMethod", source);
-        }
-
-        IEnumerable InstanceMethod()
-        {
-            return new object[] { new object[] { "InstanceMethod" } };
-        }
-
-        [Test, TestCaseSource("StaticField")]
-        public void SourceCanBeStaticField(string source)
-        {
-            Assert.AreEqual("StaticField", source);
-        }
-
-        internal static object[] StaticField =
-            { new object[] { "StaticField" } };
-
-        [Test, TestCaseSource("InstanceField")]
-        public void SourceCanBeInstanceField(string source)
-        {
-            Assert.AreEqual("InstanceField", source);
-        }
-
-        internal static object[] InstanceField =
-            { new object[] { "InstanceField" } };
-
-        [Test, TestCaseSource("CheckCurrentDirectory")]
-        public void SourceIsInvokedWithCorrectCurrentDirectory(bool isOK)
-        {
-            Assert.That(isOK);
-        }
-
-        [Test, TestCaseSource("MyData")]
-        public void SourceMayReturnArgumentsAsObjectArray(int n, int d, int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        [TestCaseSource("MyData")]
-        public void TestAttributeIsOptional(int n, int d, int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        [Test, TestCaseSource("MyIntData")]
-        public void SourceMayReturnArgumentsAsIntArray(int n, int d, int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        [Test, TestCaseSource("EvenNumbers")]
-        public void SourceMayReturnSinglePrimitiveArgumentAlone(int n)
-        {
-            Assert.AreEqual(0, n % 2);
-        }
-
-        [Test, TestCaseSource("Params")]
-        public int SourceMayReturnArgumentsAsParamSet(int n, int d)
-        {
-            return n / d;
-        }
-
-        [Test]
-        [TestCaseSource("MyData")]
-        [TestCaseSource("MoreData", Category="Extra")]
-        [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
-        public void TestMayUseMultipleSourceAttributes(int n, int d, int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        [Test, TestCaseSource("FourArgs")]
-        public void TestWithFourArguments(int n, int d, int q, int r)
-        {
-            Assert.AreEqual(q, n / d);
-            Assert.AreEqual(r, n % d);
-        }
-
-        [Test, Category("Top"), TestCaseSource(typeof(DivideDataProvider), "HereIsTheData")]
-        public void SourceMayBeInAnotherClass(int n, int d, int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        [Test, TestCaseSource(typeof(DivideDataProviderWithExpectedResult), "TestCases")]
-        public int SourceMayBeInAnotherClassWithExpectedResult(int n, int d)
-        {
-            return n / d;
-        }
-
-        [TestCaseSource("ExpectNull")]
-        public object ExpectedResultCanBeNull()
-        {
-            return null;
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseSourceAttributeFixture), "MethodThrowsExpectedException").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Success, result.ResultState);
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException_WrongException()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseSourceAttributeFixture), "MethodThrowsWrongException").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            StringAssert.StartsWith("An unexpected exception type was thrown", result.Message);
-        }
-
-        [Test]
-        public void CanSpecifyExpectedException_NoneThrown()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseSourceAttributeFixture), "MethodThrowsNoException").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Failure, result.ResultState);
-            Assert.AreEqual("System.ArgumentNullException was expected", result.Message);
-        }
-
-        [Test]
-        public void 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(
-                typeof(TestCaseSourceAttributeFixture), "MethodCallsIgnore").Tests[0];
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.Ignored, result.ResultState);
-            Assert.AreEqual("Ignore this", result.Message);
-        }
-
-        [Test]
-        public void CanIgnoreIndividualTestCases()
-        {
-            Test test = TestBuilder.MakeTestCase(
-                typeof(TestCaseSourceAttributeFixture), "MethodWithIgnoredTestCases");
-
-            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]
-        public void HandlesExceptionInTestCaseSource()
-        {
-            Test test = (Test)TestBuilder.MakeTestCase(
-                typeof(TestCaseSourceAttributeFixture), "MethodWithSourceThrowingException").Tests[0];
-            Assert.AreEqual(RunState.NotRunnable, test.RunState);
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.NotRunnable, result.ResultState);
-            Assert.AreEqual("System.Exception : my message", result.Message);
-        }
-
-        [TestCaseSource("exception_source"), Explicit]
-        public void HandlesExceptioninTestCaseSource_GuiDisplay(string lhs, string rhs)
-        {
-            Assert.AreEqual(lhs, rhs);
-        }
-
-        internal object[] testCases =
-        {
-            new TestCaseData(
-                new string[] { "A" },
-                new string[] { "B" })
-        };
-
-        [Test, TestCaseSource("testCases")]
-        public void MethodTakingTwoStringArrays(string[] a, string[] b)
-        {
-            Assert.That(a, Is.TypeOf(typeof(string[])));
-            Assert.That(b, Is.TypeOf(typeof(string[])));
-        }
-
-        #region Sources used by the tests
-        internal static object[] MyData = new object[] {
-            new object[] { 12, 3, 4 },
-            new object[] { 12, 4, 3 },
-            new object[] { 12, 6, 2 } };
-
-        internal static object[] MyIntData = new object[] {
-            new int[] { 12, 3, 4 },
-            new int[] { 12, 4, 3 },
-            new int[] { 12, 6, 2 } };
-
-        internal static object[] FourArgs = new object[] {
-            new TestCaseData( 12, 3, 4, 0 ),
-            new TestCaseData( 12, 4, 3, 0 ),
-            new TestCaseData( 12, 5, 2, 2 ) };
-
-        internal static int[] EvenNumbers = new int[] { 2, 4, 6, 8 };
-
-        internal static object[] ExpectNull = new object[] {
-            new TestCaseData().Returns(null) };
-
-        private static IEnumerable CheckCurrentDirectory
-        {
-            get
-            {
-                return new object[] { new object[] { System.IO.File.Exists("nunit.core.tests.dll") } };
-            }
-        }
-
-        internal static object[] MoreData = new object[] {
-            new object[] { 12, 1, 12 },
-            new object[] { 12, 2, 6 } };
-
-        internal static object[] Params = new object[] {
-            new TestCaseData(24, 3).Returns(8),
-            new TestCaseData(24, 2).Returns(12) };
-
-        private class DivideDataProvider
-        {
-            public static IEnumerable HereIsTheData
-            {
-                get
-                {
-#if CLR_2_0 || CLR_4_0
-                    yield return new TestCaseData(0, 0, 0)
-                        .SetName("ThisOneShouldThrow")
-                        .SetDescription("Demonstrates use of ExpectedException")
-                        .SetCategory("Junk")
-                        .SetProperty("MyProp", "zip")
-                        .Throws(typeof(System.DivideByZeroException));
-                    yield return new object[] { 100, 20, 5 };
-                    yield return new object[] { 100, 4, 25 };
-#else
-                    ArrayList list = new ArrayList();
-                    list.Add(
-                        new TestCaseData( 0, 0, 0)
-                            .SetName("ThisOneShouldThrow")
-                            .SetDescription("Demonstrates use of ExpectedException")
-							.SetCategory("Junk")
-							.SetProperty("MyProp", "zip")
-							.Throws( typeof (System.DivideByZeroException) ));
-                    list.Add(new object[] { 100, 20, 5 });
-                    list.Add(new object[] {100, 4, 25});
-                    return list;
-#endif
-                }
-            }
-        }
-
-        public class 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")
-                    };
-                }
-            }
-        }
-
-        private static IEnumerable exception_source
-        {
-            get
-            {
-#if CLR_2_0 || CLR_4_0
-                yield return new TestCaseData("a", "a");
-                yield return new TestCaseData("b", "b");
-#endif
-
-                throw new System.Exception("my message");
-            }
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+using System.Collections;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class TestCaseSourceTests
+    {
+        [Test, TestCaseSource("StaticProperty")]
+        public void SourceCanBeStaticProperty(string source)
+        {
+            Assert.AreEqual("StaticProperty", source);
+        }
+
+        static IEnumerable StaticProperty
+        {
+            get { return new object[] { new object[] { "StaticProperty" } }; }
+        }
+
+        [Test, TestCaseSource("InstanceProperty")]
+        public void SourceCanBeInstanceProperty(string source)
+        {
+            Assert.AreEqual("InstanceProperty", source);
+        }
+
+        IEnumerable InstanceProperty
+        {
+            get { return new object[] { new object[] { "InstanceProperty" } }; }
+        }
+
+        [Test, TestCaseSource("StaticMethod")]
+        public void SourceCanBeStaticMethod(string source)
+        {
+            Assert.AreEqual("StaticMethod", source);
+        }
+
+        static IEnumerable StaticMethod()
+        {
+            return new object[] { new object[] { "StaticMethod" } };
+        }
+
+        [Test, TestCaseSource("InstanceMethod")]
+        public void SourceCanBeInstanceMethod(string source)
+        {
+            Assert.AreEqual("InstanceMethod", source);
+        }
+
+        IEnumerable InstanceMethod()
+        {
+            return new object[] { new object[] { "InstanceMethod" } };
+        }
+
+        [Test, TestCaseSource("StaticField")]
+        public void SourceCanBeStaticField(string source)
+        {
+            Assert.AreEqual("StaticField", source);
+        }
+
+        internal static object[] StaticField =
+            { new object[] { "StaticField" } };
+
+        [Test, TestCaseSource("InstanceField")]
+        public void SourceCanBeInstanceField(string source)
+        {
+            Assert.AreEqual("InstanceField", source);
+        }
+
+        internal static object[] InstanceField =
+            { new object[] { "InstanceField" } };
+
+#if CLR_2_0x || CLR_4_0
+        [Test, TestCaseSource(typeof(DataSourceClass))]
+        public void SourceCanBeInstanceOfIEnumerable(string source)
+        {
+            Assert.AreEqual("DataSourceClass", source);
+        }
+
+        internal class DataSourceClass : IEnumerable
+        {
+            public IEnumerator GetEnumerator()
+            {
+                yield return "DataSourceClass";
+            }
+        }
+#endif
+
+        [Test, TestCaseSource("CheckCurrentDirectory")]
+        public void SourceIsInvokedWithCorrectCurrentDirectory(bool isOK)
+        {
+            Assert.That(isOK);
+        }
+
+        [Test, TestCaseSource("MyData")]
+        public void SourceMayReturnArgumentsAsObjectArray(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [TestCaseSource("MyData")]
+        public void TestAttributeIsOptional(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource("MyIntData")]
+        public void SourceMayReturnArgumentsAsIntArray(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource("EvenNumbers")]
+        public void SourceMayReturnSinglePrimitiveArgumentAlone(int n)
+        {
+            Assert.AreEqual(0, n % 2);
+        }
+
+        [Test, TestCaseSource("Params")]
+        public int SourceMayReturnArgumentsAsParamSet(int n, int d)
+        {
+            return n / d;
+        }
+
+        [Test]
+        [TestCaseSource("MyData")]
+        [TestCaseSource("MoreData", Category="Extra")]
+        [TestCase(12, 0, 0, ExpectedException = typeof(System.DivideByZeroException))]
+        public void TestMayUseMultipleSourceAttributes(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource("FourArgs")]
+        public void TestWithFourArguments(int n, int d, int q, int r)
+        {
+            Assert.AreEqual(q, n / d);
+            Assert.AreEqual(r, n % d);
+        }
+
+        [Test, Category("Top"), TestCaseSource(typeof(DivideDataProvider), "HereIsTheData")]
+        public void SourceMayBeInAnotherClass(int n, int d, int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        [Test, TestCaseSource(typeof(DivideDataProviderWithExpectedResult), "TestCases")]
+        public int SourceMayBeInAnotherClassWithExpectedResult(int n, int d)
+        {
+            return n / d;
+        }
+
+        [TestCaseSource("ExpectNull")]
+        public object ExpectedResultCanBeNull()
+        {
+            return null;
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsExpectedException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Success, result.ResultState);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_WrongException()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsWrongException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            StringAssert.StartsWith("An unexpected exception type was thrown", result.Message);
+        }
+
+        [Test]
+        public void CanSpecifyExpectedException_NoneThrown()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodThrowsNoException").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Failure, result.ResultState);
+            Assert.AreEqual("System.ArgumentNullException was expected", result.Message);
+        }
+
+        [Test]
+        public void 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(
+                typeof(TestCaseSourceAttributeFixture), "MethodCallsIgnore").Tests[0];
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.Ignored, result.ResultState);
+            Assert.AreEqual("Ignore this", result.Message);
+        }
+
+        [Test]
+        public void CanIgnoreIndividualTestCases()
+        {
+            Test test = TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodWithIgnoredTestCases");
+
+            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]
+        public void HandlesExceptionInTestCaseSource()
+        {
+            Test test = (Test)TestBuilder.MakeTestCase(
+                typeof(TestCaseSourceAttributeFixture), "MethodWithSourceThrowingException").Tests[0];
+            Assert.AreEqual(RunState.NotRunnable, test.RunState);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.NotRunnable, result.ResultState);
+            Assert.AreEqual("System.Exception : my message", result.Message);
+        }
+
+        [TestCaseSource("exception_source"), Explicit]
+        public void HandlesExceptioninTestCaseSource_GuiDisplay(string lhs, string rhs)
+        {
+            Assert.AreEqual(lhs, rhs);
+        }
+
+        internal object[] testCases =
+        {
+            new TestCaseData(
+                new string[] { "A" },
+                new string[] { "B" })
+        };
+
+        [Test, TestCaseSource("testCases")]
+        public void MethodTakingTwoStringArrays(string[] a, string[] b)
+        {
+            Assert.That(a, Is.TypeOf(typeof(string[])));
+            Assert.That(b, Is.TypeOf(typeof(string[])));
+        }
+
+        #region Sources used by the tests
+        internal static object[] MyData = new object[] {
+            new object[] { 12, 3, 4 },
+            new object[] { 12, 4, 3 },
+            new object[] { 12, 6, 2 } };
+
+        internal static object[] MyIntData = new object[] {
+            new int[] { 12, 3, 4 },
+            new int[] { 12, 4, 3 },
+            new int[] { 12, 6, 2 } };
+
+        internal static object[] FourArgs = new object[] {
+            new TestCaseData( 12, 3, 4, 0 ),
+            new TestCaseData( 12, 4, 3, 0 ),
+            new TestCaseData( 12, 5, 2, 2 ) };
+
+        internal static int[] EvenNumbers = new int[] { 2, 4, 6, 8 };
+
+        internal static object[] ExpectNull = new object[] {
+            new TestCaseData().Returns(null) };
+
+        private static IEnumerable CheckCurrentDirectory
+        {
+            get
+            {
+                return new object[] { new object[] { System.IO.File.Exists("nunit.core.tests.dll") } };
+            }
+        }
+
+        internal static object[] MoreData = new object[] {
+            new object[] { 12, 1, 12 },
+            new object[] { 12, 2, 6 } };
+
+        internal static object[] Params = new object[] {
+            new TestCaseData(24, 3).Returns(8),
+            new TestCaseData(24, 2).Returns(12) };
+
+        private class DivideDataProvider
+        {
+            public static IEnumerable HereIsTheData
+            {
+                get
+                {
+#if CLR_2_0 || CLR_4_0
+                    yield return new TestCaseData(0, 0, 0)
+                        .SetName("ThisOneShouldThrow")
+                        .SetDescription("Demonstrates use of ExpectedException")
+                        .SetCategory("Junk")
+                        .SetProperty("MyProp", "zip")
+                        .Throws(typeof(System.DivideByZeroException));
+                    yield return new object[] { 100, 20, 5 };
+                    yield return new object[] { 100, 4, 25 };
+#else
+                    ArrayList list = new ArrayList();
+                    list.Add(
+                        new TestCaseData( 0, 0, 0)
+                            .SetName("ThisOneShouldThrow")
+                            .SetDescription("Demonstrates use of ExpectedException")
+							.SetCategory("Junk")
+							.SetProperty("MyProp", "zip")
+							.Throws( typeof (System.DivideByZeroException) ));
+                    list.Add(new object[] { 100, 20, 5 });
+                    list.Add(new object[] {100, 4, 25});
+                    return list;
+#endif
+                }
+            }
+        }
+
+        public class 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")
+                    };
+                }
+            }
+        }
+
+        private static IEnumerable exception_source
+        {
+            get
+            {
+#if CLR_2_0 || CLR_4_0
+                yield return new TestCaseData("a", "a");
+                yield return new TestCaseData("b", "b");
+#endif
+
+                throw new System.Exception("my message");
+            }
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/tests/TestCaseTest.cs b/src/NUnitCore/tests/TestCaseTest.cs
index 2254bbf..1f29375 100644
--- a/src/NUnitCore/tests/TestCaseTest.cs
+++ b/src/NUnitCore/tests/TestCaseTest.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-using NUnit.Util;
-using NUnit.TestUtilities;
-using NUnit.TestData.TestCaseTest;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for TestCaseTest.
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class TestCaseTest
-	{
-		[Test]
-		public void CreateIgnoredTestCase()
-		{
-			Type fixtureType = typeof(MockTestFixture);
-			Test testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
-			Assert.AreEqual(1, testCase.TestCount);
-			Assert.AreEqual( RunState.Ignored, testCase.RunState );
-			Assert.AreEqual("ignoring this test method for now", testCase.IgnoreReason);
-		}
-
-		[Test]
-		public void RunIgnoredTestCase()
-		{
-			Type fixtureType = typeof(MockTestFixture);
-			Test testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
-			Assert.AreEqual(1, testCase.TestCount);
-
-            TestResult result = testCase.Run(NullListener.NULL, TestFilter.Empty);
-			ResultSummarizer summarizer = new ResultSummarizer(result);
-			Assert.AreEqual(0, summarizer.TestsRun);
-			Assert.AreEqual(1, summarizer.TestsNotRun);
-		}
-
-		[Test]
-		public void LoadMethodCategories() 
-		{
-			Type fixtureType = typeof(HasCategories);
-			Test testCase = TestBuilder.MakeTestCase( fixtureType, "ATest" );
-			Assert.IsNotNull(testCase);
-			Assert.IsNotNull(testCase.Categories);
-			Assert.AreEqual(2, testCase.Categories.Count);
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+using NUnit.Util;
+using NUnit.TestUtilities;
+using NUnit.TestData.TestCaseTest;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for TestCaseTest.
+	/// </summary>
+	/// 
+	[TestFixture]
+	public class TestCaseTest
+	{
+		[Test]
+		public void CreateIgnoredTestCase()
+		{
+			Type fixtureType = typeof(MockTestFixture);
+			Test testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
+			Assert.AreEqual(1, testCase.TestCount);
+			Assert.AreEqual( RunState.Ignored, testCase.RunState );
+			Assert.AreEqual("ignoring this test method for now", testCase.IgnoreReason);
+		}
+
+		[Test]
+		public void RunIgnoredTestCase()
+		{
+			Type fixtureType = typeof(MockTestFixture);
+			Test testCase = TestBuilder.MakeTestCase( fixtureType, "MockTest4" );
+			Assert.AreEqual(1, testCase.TestCount);
+
+            TestResult result = testCase.Run(NullListener.NULL, TestFilter.Empty);
+			ResultSummarizer summarizer = new ResultSummarizer(result);
+			Assert.AreEqual(0, summarizer.TestsRun);
+			Assert.AreEqual(1, summarizer.TestsNotRun);
+		}
+
+		[Test]
+		public void LoadMethodCategories() 
+		{
+			Type fixtureType = typeof(HasCategories);
+			Test testCase = TestBuilder.MakeTestCase( fixtureType, "ATest" );
+			Assert.IsNotNull(testCase);
+			Assert.IsNotNull(testCase.Categories);
+			Assert.AreEqual(2, testCase.Categories.Count);
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestConsole.cs b/src/NUnitCore/tests/TestConsole.cs
index 37dea1a..0f79028 100644
--- a/src/NUnitCore/tests/TestConsole.cs
+++ b/src/NUnitCore/tests/TestConsole.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// This test is designed to check that console output is being passed
-	/// correctly accross the AppDomain boundry.  Non-remotable objects should
-	/// be converted to a string before being passed accross.
-	/// </summary>
-	[TestFixture]
-	public class TestConsole
-	{
-		[Test]
-		public void ConsoleWrite()
-		{
-			Console.Write("I am a 'String' object.");
-			Console.WriteLine();
-			Console.Write(new TestSerialisable());
-			Console.WriteLine();
-			Console.Write(new TestMarshalByRefObject());
-			Console.WriteLine();
-			System.Diagnostics.Trace.WriteLine( "Output from Trace", "NUnit" );
-			Console.Write(new TestNonRemotableObject());
-			Console.WriteLine();
-			Console.Error.WriteLine( "This is from Console.Error" );
-		}
-
-		[Test]
-		public void ConsoleWriteLine()
-		{
-			Console.WriteLine("I am a 'String' object.");
-			Console.WriteLine(new TestSerialisable());
-			Console.WriteLine(new TestMarshalByRefObject());
-			Console.WriteLine(new TestNonRemotableObject());
-		}
-
-		[Serializable] 
-		public class TestSerialisable
-		{
-			override public string ToString()
-			{
-				return "I am a 'Serializable' object.";
-			}
-		}
-
-		public class TestMarshalByRefObject : MarshalByRefObject
-		{
-			override public string ToString()
-			{
-				return "I am a 'MarshalByRefObject' object.";
-			}
-		}
-
-		public class TestNonRemotableObject
-		{
-			override public string ToString()
-			{
-				return "I am a non-remotable object.";
-			}
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// This test is designed to check that console output is being passed
+	/// correctly accross the AppDomain boundry.  Non-remotable objects should
+	/// be converted to a string before being passed accross.
+	/// </summary>
+	[TestFixture]
+	public class TestConsole
+	{
+		[Test]
+		public void ConsoleWrite()
+		{
+			Console.Write("I am a 'String' object.");
+			Console.WriteLine();
+			Console.Write(new TestSerialisable());
+			Console.WriteLine();
+			Console.Write(new TestMarshalByRefObject());
+			Console.WriteLine();
+			System.Diagnostics.Trace.WriteLine( "Output from Trace", "NUnit" );
+			Console.Write(new TestNonRemotableObject());
+			Console.WriteLine();
+			Console.Error.WriteLine( "This is from Console.Error" );
+		}
+
+		[Test]
+		public void ConsoleWriteLine()
+		{
+			Console.WriteLine("I am a 'String' object.");
+			Console.WriteLine(new TestSerialisable());
+			Console.WriteLine(new TestMarshalByRefObject());
+			Console.WriteLine(new TestNonRemotableObject());
+		}
+
+		[Serializable] 
+		public class TestSerialisable
+		{
+			override public string ToString()
+			{
+				return "I am a 'Serializable' object.";
+			}
+		}
+
+		public class TestMarshalByRefObject : MarshalByRefObject
+		{
+			override public string ToString()
+			{
+				return "I am a 'MarshalByRefObject' object.";
+			}
+		}
+
+		public class TestNonRemotableObject
+		{
+			override public string ToString()
+			{
+				return "I am a non-remotable object.";
+			}
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestContextTests.cs b/src/NUnitCore/tests/TestContextTests.cs
index a8c51f6..526eca6 100644
--- a/src/NUnitCore/tests/TestContextTests.cs
+++ b/src/NUnitCore/tests/TestContextTests.cs
@@ -1,100 +1,258 @@
-// ****************************************************************
-// 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;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class TestContextTests
-    {
-        [Test]
-        public void TestCanAccessItsOwnName()
-        {
-            Assert.That(TestContext.CurrentContext.Test.Name, Is.EqualTo("TestCanAccessItsOwnName"));
-        }
-
-        [Test]
-        public void TestCanAccessItsOwnFullName()
-        {
-            Assert.That(TestContext.CurrentContext.Test.FullName,
-                Is.EqualTo("NUnit.Core.Tests.TestContextTests.TestCanAccessItsOwnFullName"));
-        }
-
-        [Test]
-        [Property("Answer", 42)]
-        public void TestCanAccessItsOwnProperties()
-        {
-            Assert.That(TestContext.CurrentContext.Test.Properties["Answer"], Is.EqualTo(42));
-        }
-
-        [Test]
-        public void TestCanAccessTestDirectory()
-        {
-            string testDirectory = TestContext.CurrentContext.TestDirectory;
-            Assert.NotNull(testDirectory);
-            Assert.That(Directory.Exists(testDirectory));
-            Assert.That(File.Exists(Path.Combine(testDirectory, "nunit.core.tests.dll")));
-        }
-
-        [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();
-            TestBuilder.RunTestFixture(fixture);
-            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>Inconclusive=>Success"));
-            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>Inconclusive=>Passed"));
-        }
-
-        [Test]
-        public void TestCanAccessTestState_FailureInSetUp()
-        {
-            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
-            fixture.setUpFailure = true;
-            TestBuilder.RunTestFixture(fixture);
-            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>=>Failure"));
-            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>=>Failed"));
-        }
-
-        [Test]
-        public void TestCanAccessTestState_FailingTest()
-        {
-            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
-            fixture.testFailure = true;
-            TestBuilder.RunTestFixture(fixture);
-            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>Inconclusive=>Failure"));
-            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>Inconclusive=>Failed"));
-        }
-
-        [Test]
-        public void TestCanAccessTestState_IgnoredInSetUp()
-        {
-            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
-            fixture.setUpIgnore = true;
-            TestBuilder.RunTestFixture(fixture);
-            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>=>Ignored"));
-            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>=>Skipped"));
-        }	
-
-	        [Test, RequiresThread]
-        public void CanAccessTestContextOnSeparateThread()
-        {
-            Assert.That(TestContext.CurrentContext.Test.Name, Is.EqualTo("CanAccessTestContextOnSeparateThread"));
-        }
-	}
-}
+// ****************************************************************
+// 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 System.Threading;
+using NUnit.Framework;
+using NUnit.TestData.TestContextData;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture][Property("Question", "Why?")]
+    public class TestContextTests
+    {
+        private TestContext fixtureContext;
+        private TestContext setupContext;
+
+        [TestFixtureSetUp]
+        public void FixtureSetUp()
+        {
+            fixtureContext = TestContext.CurrentContext;
+        }
+
+        [TestFixtureTearDown]
+        public void FixtureTearDown()
+        {
+            // TODO: We put some tests in one time teardown to verify that
+            // the context is still valid. It would be better if these tests
+            // were placed in a second-level test, invoked from this test class.
+            TestContext context = TestContext.CurrentContext;
+            Assert.That(context.Test.Name, Is.EqualTo("TestContextTests"));
+            Assert.That(context.Test.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestContextTests"));
+            Assert.That(context.Test.Properties["Question"], Is.EqualTo("Why?"));
+
+            // The following assert cannot fail, but we use it to make
+            // sure that the result can be accessed in TestFixtureTearDown.
+            Assert.NotNull(context.Result.State);
+        }
+
+        [SetUp]
+        public void SetUpMethod()
+        {
+            setupContext = TestContext.CurrentContext;
+        }
+
+        [TearDown]
+        public void TearDownMethod()
+        {
+            Assert.That(
+                TestContext.CurrentContext.Test.FullName,
+                Is.EqualTo(setupContext.Test.FullName),
+                "Context at TearDown failed to match that saved from SetUp");
+
+            // The following assert cannot fail, but we use it to make
+            // sure that the result can be accessed in TearDown.
+            Assert.NotNull(TestContext.CurrentContext.Result.State);
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessFixtureName()
+        {
+            Assert.That(fixtureContext.Test.Name, Is.EqualTo("TestContextTests"));
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessFixtureFullName()
+        {
+            Assert.That(fixtureContext.Test.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestContextTests"));
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessFixtureResultState()
+        {
+            Assert.That(fixtureContext.Result.State, Is.EqualTo(TestState.Success));
+            Assert.That(fixtureContext.Result.Status, Is.EqualTo(TestStatus.Passed));
+        }
+
+        [Test]
+        [Property("Answer", 37)]
+        public void FixtureSetUpCanAccessFixtureProperties()
+        {
+            Assert.That(fixtureContext.Test.Properties["Question"], Is.EqualTo("Why?"));
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessTestDirectory()
+        {
+            string testDirectory = fixtureContext.TestDirectory;
+            Assert.NotNull(testDirectory);
+            Assert.That(Directory.Exists(testDirectory));
+            Assert.That(File.Exists(Path.Combine(testDirectory, "nunit.core.tests.dll")));
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessWorkDirectory()
+        {
+            string workDirectory = fixtureContext.WorkDirectory;
+            Assert.NotNull(workDirectory);
+            Assert.That(Directory.Exists(workDirectory), string.Format("Directory {0} does not exist", workDirectory));
+        }
+
+        [Test]
+        public void SetUpCanAccessTestName()
+        {
+            Assert.That(setupContext.Test.Name, Is.EqualTo("SetUpCanAccessTestName"));
+        }
+
+        [Test]
+        public void SetUpCanAccessTestFullName()
+        {
+            Assert.That(setupContext.Test.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestContextTests.SetUpCanAccessTestFullName"));
+        }
+
+        [Test]
+        [Property("Answer", 99)]
+        public void SetUpCanAccessTestProperties()
+        {
+            Assert.That(setupContext.Test.Properties["Answer"], Is.EqualTo(99));
+        }
+
+        [Test]
+        public void SetUpCanAccessTestResultState()
+        {
+            Assert.That(setupContext.Result.State, Is.EqualTo(TestState.Inconclusive));
+            Assert.That(setupContext.Result.Status, Is.EqualTo(TestStatus.Inconclusive));
+        }
+
+        [Test]
+        public void SetUpCanAccessTestDirectory()
+        {
+            string testDirectory = setupContext.TestDirectory;
+            Assert.NotNull(testDirectory);
+            Assert.That(Directory.Exists(testDirectory));
+            Assert.That(File.Exists(Path.Combine(testDirectory, "nunit.core.tests.dll")));
+        }
+
+        [Test]
+        public void SetUpCanAccessWorkDirectory()
+        {
+            string workDirectory = setupContext.WorkDirectory;
+            Assert.NotNull(workDirectory);
+            Assert.That(Directory.Exists(workDirectory), string.Format("Directory {0} does not exist", workDirectory));
+        }
+
+        [Test]
+        public void TestCanAccessItsOwnName()
+        {
+            Assert.That(TestContext.CurrentContext.Test.Name, Is.EqualTo("TestCanAccessItsOwnName"));
+        }
+
+        [Test]
+        public void TestCanAccessItsOwnFullName()
+        {
+            Assert.That(TestContext.CurrentContext.Test.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestContextTests.TestCanAccessItsOwnFullName"));
+        }
+
+        [Test]
+        [Property("Answer", 42)]
+        public void TestCanAccessItsOwnProperties()
+        {
+            Assert.That(TestContext.CurrentContext.Test.Properties["Answer"], Is.EqualTo(42));
+        }
+
+        [Test]
+        public void TestCanAccessItsOwnResultState()
+        {
+            Assert.That(TestContext.CurrentContext.Result.State, Is.EqualTo(TestState.Inconclusive));
+            Assert.That(TestContext.CurrentContext.Result.Status, Is.EqualTo(TestStatus.Inconclusive));
+        }
+
+        [Test]
+        public void TestCanAccessTestDirectory()
+        {
+            string testDirectory = TestContext.CurrentContext.TestDirectory;
+            Assert.NotNull(testDirectory);
+            Assert.That(Directory.Exists(testDirectory));
+            Assert.That(File.Exists(Path.Combine(testDirectory, "nunit.core.tests.dll")));
+        }
+
+        [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();
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>Inconclusive=>Success"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>Inconclusive=>Passed"));
+        }
+
+        [Test]
+        public void TestCanAccessTestState_FailureInSetUp()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            fixture.setUpFailure = true;
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>=>Failure"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>=>Failed"));
+        }
+
+        [Test]
+        public void TestCanAccessTestState_FailingTest()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            fixture.testFailure = true;
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>Inconclusive=>Failure"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>Inconclusive=>Failed"));
+        }
+
+        [Test]
+        public void TestCanAccessTestState_IgnoredInSetUp()
+        {
+            TestStateRecordingFixture fixture = new TestStateRecordingFixture();
+            fixture.setUpIgnore = true;
+            TestBuilder.RunTestFixture(fixture);
+            Assert.That(fixture.stateList, Is.EqualTo("Inconclusive=>=>Ignored"));
+            Assert.That(fixture.statusList, Is.EqualTo("Inconclusive=>=>Skipped"));
+        }	
+
+	    [Test, RequiresThread]
+        public void CanAccessTestContextWhenRunningTestOnSeparateThread()
+        {
+			Assert.That(TestContext.CurrentContext.Test.Name, Is.EqualTo("CanAccessTestContextWhenRunningTestOnSeparateThread"));
+        }
+
+        private string TestNameFromContext;
+
+		[Test, Platform(Exclude="Net-1.0, Net-1.1, Mono-1.0")]
+		public void CanAccessTestContextFromThreadSpawnedWithinTest()
+		{
+            Thread thread = new Thread(new ThreadStart(FillTestNameFromContext));
+            thread.Start();
+			thread.Join();
+
+			Assert.That(TestNameFromContext, Is.EqualTo(TestContext.CurrentContext.Test.Name));
+		}
+
+		private void FillTestNameFromContext()
+		{
+            this.TestNameFromContext = TestContext.CurrentContext.Test.Name;
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/NUnitCore/tests/TestDelegateFixture.cs b/src/NUnitCore/tests/TestDelegateFixture.cs
index 6f3ca24..63cade3 100644
--- a/src/NUnitCore/tests/TestDelegateFixture.cs
+++ b/src/NUnitCore/tests/TestDelegateFixture.cs
@@ -1,49 +1,49 @@
-// ****************************************************************
-// 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.Threading;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for TestDelegate.
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class TestDelegateFixture
-	{
-		internal class TestDelegate 
-		{ 
-			public bool delegateCalled = false;
-			public System.IAsyncResult ar;
-
-			public delegate void CallBackFunction(); 
-
-			public TestDelegate() 
-			{ 
-				ar = new CallBackFunction 
-					(DoSomething).BeginInvoke 
-					(null,null); 
-			} 
-
-			public void DoSomething() 
-			{ 
-				delegateCalled = true;
-			} 
-		} 
-
-		[Test]
-		public void DelegateTest()
-		{
-			TestDelegate testDelegate = new TestDelegate(); 
-			testDelegate.ar.AsyncWaitHandle.WaitOne(1000, false );
-			Assert.IsTrue(testDelegate.delegateCalled);
-		}
-	}
-} 
-
+// ****************************************************************
+// 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.Threading;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for TestDelegate.
+	/// </summary>
+	/// 
+	[TestFixture]
+	public class TestDelegateFixture
+	{
+		internal class TestDelegate 
+		{ 
+			public bool delegateCalled = false;
+			public System.IAsyncResult ar;
+
+			public delegate void CallBackFunction(); 
+
+			public TestDelegate() 
+			{ 
+				ar = new CallBackFunction 
+					(DoSomething).BeginInvoke 
+					(null,null); 
+			} 
+
+			public void DoSomething() 
+			{ 
+				delegateCalled = true;
+			} 
+		} 
+
+		[Test]
+		public void DelegateTest()
+		{
+			TestDelegate testDelegate = new TestDelegate(); 
+			testDelegate.ar.AsyncWaitHandle.WaitOne(1000, false );
+			Assert.IsTrue(testDelegate.delegateCalled);
+		}
+	}
+} 
+
diff --git a/src/NUnitCore/tests/TestExecutionContextTests.cs b/src/NUnitCore/tests/TestExecutionContextTests.cs
index 08769a7..ba1192b 100644
--- a/src/NUnitCore/tests/TestExecutionContextTests.cs
+++ b/src/NUnitCore/tests/TestExecutionContextTests.cs
@@ -1,150 +1,238 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Security.Principal;
-using System.Threading;
-using System.Globalization;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-    /// Summary description for TestExecutionContextTests.
-	/// </summary>
-	[TestFixture]
-    public class TestExecutionContextTests
-	{
-		string currentDirectory;
-		CultureInfo currentCulture;
-        CultureInfo currentUICulture;
-        IPrincipal currentPrincipal;
-
-		/// <summary>
-		/// Since we are testing the mechanism that saves and
-		/// restores contexts, we save manually here
-		/// </summary>
-		[SetUp]
-		public void SaveContext()
-		{
-			currentDirectory = Environment.CurrentDirectory;
-			currentCulture = CultureInfo.CurrentCulture;
-            currentUICulture = CultureInfo.CurrentUICulture;
-            currentPrincipal = Thread.CurrentPrincipal;
-		}
-
-		[TearDown]
-		public void RestoreContext()
-		{
-			Environment.CurrentDirectory = currentDirectory;
-			Thread.CurrentThread.CurrentCulture = currentCulture;
-            Thread.CurrentThread.CurrentUICulture = currentUICulture;
-            Thread.CurrentPrincipal = currentPrincipal;
-		}
-
-		[Test]
-		public void SetAndRestoreCurrentDirectory()
-		{
-            Assert.AreEqual(currentDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in initial context");
-
-            TestExecutionContext.Save();
-
-            try
-            {
-                string otherDirectory = System.IO.Path.GetTempPath();
-                if (otherDirectory[otherDirectory.Length - 1] == System.IO.Path.DirectorySeparatorChar)
-                    otherDirectory = otherDirectory.Substring(0, otherDirectory.Length - 1);
-                TestExecutionContext.CurrentContext.CurrentDirectory = otherDirectory;
-                Assert.AreEqual(otherDirectory, Environment.CurrentDirectory, "Directory was not set");
-                Assert.AreEqual(otherDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in new context");
-            }
-            finally
-            {
-                TestExecutionContext.Restore();
-            }
-
-			Assert.AreEqual( currentDirectory, Environment.CurrentDirectory, "Directory was not restored" );
-            Assert.AreEqual(currentDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in final context");
-		}
-		
-		[Test]
-		public void SetAndRestoreCurrentCulture()
-		{
-            Assert.AreEqual(currentCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in initial context");
-
-            TestExecutionContext.Save();
-
-            try
-            {
-                CultureInfo otherCulture =
-                    new CultureInfo(currentCulture.Name == "fr-FR" ? "en-GB" : "fr-FR");
-                TestExecutionContext.CurrentContext.CurrentCulture = otherCulture;
-                Assert.AreEqual(otherCulture, CultureInfo.CurrentCulture, "Culture was not set");
-                Assert.AreEqual(otherCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in new context");
-            }
-            finally
-            {
-                TestExecutionContext.Restore();
-            }
-
-			Assert.AreEqual( currentCulture, CultureInfo.CurrentCulture, "Culture was not restored" );
-            Assert.AreEqual(currentCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in final context");
-		}
-
-        [Test]
-        public void SetAndRestoreCurrentUICulture()
-        {
-            Assert.AreEqual(currentUICulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in initial context");
-
-            TestExecutionContext.Save();
-
-            try
-            {
-                CultureInfo otherCulture =
-                    new CultureInfo(currentUICulture.Name == "fr-FR" ? "en-GB" : "fr-FR");
-                TestExecutionContext.CurrentContext.CurrentUICulture = otherCulture;
-                Assert.AreEqual(otherCulture, CultureInfo.CurrentUICulture, "UICulture was not set");
-                Assert.AreEqual(otherCulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in new context");
-            }
-            finally
-            {
-                TestExecutionContext.Restore();
-            }
-
-            Assert.AreEqual(currentUICulture, CultureInfo.CurrentUICulture, "UICulture was not restored");
-            Assert.AreEqual(currentUICulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in final context");
-        }
-
-        [Test]
-        public void SetAndRestoreCurrentPrincipal()
-        {
-            Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in initial context");
-
-            TestExecutionContext.Save();
-
-            try
-            {
-                GenericIdentity identity = new GenericIdentity("foo");
-                TestExecutionContext.CurrentContext.CurrentPrincipal = new GenericPrincipal(identity, new string[0]);
-                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name, "Principal was not set");
-                Assert.AreEqual("foo", TestExecutionContext.CurrentContext.CurrentPrincipal.Identity.Name, "Principal not in new context");
-            }
-            finally
-            {
-                TestExecutionContext.Restore();
-            }
-
-            Assert.AreEqual(currentPrincipal, Thread.CurrentPrincipal, "Principal was not restored");
-            Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in final context");
-        }
-
-        [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);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Security.Principal;
+using System.Threading;
+using System.Globalization;
+using NUnit.Framework;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+    /// Summary description for TestExecutionContextTests.
+	/// </summary>
+	[TestFixture][Property("Question", "Why?")]
+    public class TestExecutionContextTests
+	{
+        TestExecutionContext fixtureContext;
+        TestExecutionContext setupContext;
+
+		string currentDirectory;
+		CultureInfo currentCulture;
+        CultureInfo currentUICulture;
+        IPrincipal currentPrincipal;
+
+        [TestFixtureSetUp]
+        public void OneTimeSetUp()
+        {
+            fixtureContext = TestExecutionContext.CurrentContext;
+        }
+
+        [TestFixtureTearDown]
+        public void OneTimeTearDown()
+        {
+            // TODO: We put some tests in one time teardown to verify that
+            // the context is still valid. It would be better if these tests
+            // were placed in a second-level test, invoked from this test class.
+            TestExecutionContext ec = TestExecutionContext.CurrentContext;
+            Assert.That(ec.CurrentTest.TestName.Name, Is.EqualTo("TestExecutionContextTests"));
+            Assert.That(ec.CurrentTest.TestName.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestExecutionContextTests"));
+            Assert.That(ec.CurrentTest.Properties["Question"], Is.EqualTo("Why?"));
+        }
+
+        /// <summary>
+		/// Since we are testing the mechanism that saves and
+		/// restores contexts, we save manually here
+		/// </summary>
+		[SetUp]
+		public void SaveContext()
+		{
+            setupContext = TestExecutionContext.CurrentContext;
+
+			currentDirectory = Environment.CurrentDirectory;
+			currentCulture = CultureInfo.CurrentCulture;
+            currentUICulture = CultureInfo.CurrentUICulture;
+            currentPrincipal = Thread.CurrentPrincipal;
+		}
+
+		[TearDown]
+		public void RestoreContext()
+		{
+			Environment.CurrentDirectory = currentDirectory;
+			Thread.CurrentThread.CurrentCulture = currentCulture;
+            Thread.CurrentThread.CurrentUICulture = currentUICulture;
+            Thread.CurrentPrincipal = currentPrincipal;
+
+            Assert.That(
+                TestExecutionContext.CurrentContext.CurrentTest.TestName.FullName,
+                Is.EqualTo(setupContext.CurrentTest.TestName.FullName),
+                "Context at TearDown failed to match that saved from SetUp");
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessFixtureName()
+        {
+            Assert.That(fixtureContext.CurrentTest.TestName.Name, Is.EqualTo("TestExecutionContextTests"));
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessFixtureFullName()
+        {
+            Assert.That(fixtureContext.CurrentTest.TestName.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestExecutionContextTests"));
+        }
+
+        [Test]
+        public void FixtureSetUpCanAccessFixtureProperties()
+        {
+            Assert.That(fixtureContext.CurrentTest.Properties["Question"], Is.EqualTo("Why?"));
+        }
+
+        [Test]
+        public void SetUpCanAccessTestName()
+        {
+            Assert.That(setupContext.CurrentTest.TestName.Name, Is.EqualTo("SetUpCanAccessTestName"));
+        }
+
+        [Test]
+        public void SetUpCanAccessTestFullName()
+        {
+            Assert.That(setupContext.CurrentTest.TestName.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestExecutionContextTests.SetUpCanAccessTestFullName"));
+        }
+
+        [Test]
+        [Property("Answer", 42)]
+        public void SetUpCanAccessTestProperties()
+        {
+            Assert.That(setupContext.CurrentTest.Properties["Answer"], Is.EqualTo(42));
+        }
+
+        [Test]
+        public void TestCanAccessItsOwnName()
+        {
+            Assert.That(TestExecutionContext.CurrentContext.CurrentTest.TestName.Name, Is.EqualTo("TestCanAccessItsOwnName"));
+        }
+
+        [Test]
+        public void TestCanAccessItsOwnFullName()
+        {
+            Assert.That(TestExecutionContext.CurrentContext.CurrentTest.TestName.FullName,
+                Is.EqualTo("NUnit.Core.Tests.TestExecutionContextTests.TestCanAccessItsOwnFullName"));
+        }
+
+        [Test]
+        [Property("Answer", 42)]
+        public void TestCanAccessItsOwnProperties()
+        {
+            Assert.That(TestExecutionContext.CurrentContext.CurrentTest.Properties["Answer"], Is.EqualTo(42));
+        }
+
+        [Test]
+		public void SetAndRestoreCurrentDirectory()
+		{
+            Assert.AreEqual(currentDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                string otherDirectory = System.IO.Path.GetTempPath();
+                if (otherDirectory[otherDirectory.Length - 1] == System.IO.Path.DirectorySeparatorChar)
+                    otherDirectory = otherDirectory.Substring(0, otherDirectory.Length - 1);
+                TestExecutionContext.CurrentContext.CurrentDirectory = otherDirectory;
+                Assert.AreEqual(otherDirectory, Environment.CurrentDirectory, "Directory was not set");
+                Assert.AreEqual(otherDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+			Assert.AreEqual( currentDirectory, Environment.CurrentDirectory, "Directory was not restored" );
+            Assert.AreEqual(currentDirectory, TestExecutionContext.CurrentContext.CurrentDirectory, "Directory not in final context");
+		}
+		
+		[Test]
+		public void SetAndRestoreCurrentCulture()
+		{
+            Assert.AreEqual(currentCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                CultureInfo otherCulture =
+                    new CultureInfo(currentCulture.Name == "fr-FR" ? "en-GB" : "fr-FR");
+                TestExecutionContext.CurrentContext.CurrentCulture = otherCulture;
+                Assert.AreEqual(otherCulture, CultureInfo.CurrentCulture, "Culture was not set");
+                Assert.AreEqual(otherCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+			Assert.AreEqual( currentCulture, CultureInfo.CurrentCulture, "Culture was not restored" );
+            Assert.AreEqual(currentCulture, TestExecutionContext.CurrentContext.CurrentCulture, "Culture not in final context");
+		}
+
+        [Test]
+        public void SetAndRestoreCurrentUICulture()
+        {
+            Assert.AreEqual(currentUICulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                CultureInfo otherCulture =
+                    new CultureInfo(currentUICulture.Name == "fr-FR" ? "en-GB" : "fr-FR");
+                TestExecutionContext.CurrentContext.CurrentUICulture = otherCulture;
+                Assert.AreEqual(otherCulture, CultureInfo.CurrentUICulture, "UICulture was not set");
+                Assert.AreEqual(otherCulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+            Assert.AreEqual(currentUICulture, CultureInfo.CurrentUICulture, "UICulture was not restored");
+            Assert.AreEqual(currentUICulture, TestExecutionContext.CurrentContext.CurrentUICulture, "UICulture not in final context");
+        }
+
+        [Test]
+        public void SetAndRestoreCurrentPrincipal()
+        {
+            Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in initial context");
+
+            TestExecutionContext.Save();
+
+            try
+            {
+                GenericIdentity identity = new GenericIdentity("foo");
+                TestExecutionContext.CurrentContext.CurrentPrincipal = new GenericPrincipal(identity, new string[0]);
+                Assert.AreEqual("foo", Thread.CurrentPrincipal.Identity.Name, "Principal was not set");
+                Assert.AreEqual("foo", TestExecutionContext.CurrentContext.CurrentPrincipal.Identity.Name, "Principal not in new context");
+            }
+            finally
+            {
+                TestExecutionContext.Restore();
+            }
+
+            Assert.AreEqual(currentPrincipal, Thread.CurrentPrincipal, "Principal was not restored");
+            Assert.AreEqual(currentPrincipal, TestExecutionContext.CurrentContext.CurrentPrincipal, "Principal not in final context");
+        }
+
+        [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/TestFixtureBuilderTests.cs b/src/NUnitCore/tests/TestFixtureBuilderTests.cs
index da38cb8..3575a78 100644
--- a/src/NUnitCore/tests/TestFixtureBuilderTests.cs
+++ b/src/NUnitCore/tests/TestFixtureBuilderTests.cs
@@ -1,38 +1,38 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.TestUtilities;
-using NUnit.TestData.TestFixtureBuilderTests;
-
-namespace NUnit.Core.Tests
-{
-	// TODO: Figure out what this is really testing and eliminate if not needed
-	[TestFixture]
-	public class TestFixtureBuilderTests
-	{
-		[Test]
-		public void GoodSignature()
-		{
-			string methodName = "TestVoid";
-			Test fixture = TestFixtureBuilder.BuildFrom( typeof( SignatureTestFixture ) );
-			Test foundTest = TestFinder.Find( methodName, fixture, true );
-			Assert.IsNotNull( foundTest );
-			Assert.AreEqual( RunState.Runnable, foundTest.RunState );
-		}
-
-		[Test]
-		public void LoadCategories() 
-		{
-			Test fixture = TestFixtureBuilder.BuildFrom( typeof( HasCategories ) );
-			Assert.IsNotNull(fixture);
-			Assert.AreEqual(2, fixture.Categories.Count);
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.TestUtilities;
+using NUnit.TestData.TestFixtureBuilderTests;
+
+namespace NUnit.Core.Tests
+{
+	// TODO: Figure out what this is really testing and eliminate if not needed
+	[TestFixture]
+	public class TestFixtureBuilderTests
+	{
+		[Test]
+		public void GoodSignature()
+		{
+			string methodName = "TestVoid";
+			Test fixture = TestFixtureBuilder.BuildFrom( typeof( SignatureTestFixture ) );
+			Test foundTest = TestFinder.Find( methodName, fixture, true );
+			Assert.IsNotNull( foundTest );
+			Assert.AreEqual( RunState.Runnable, foundTest.RunState );
+		}
+
+		[Test]
+		public void LoadCategories() 
+		{
+			Test fixture = TestFixtureBuilder.BuildFrom( typeof( HasCategories ) );
+			Assert.IsNotNull(fixture);
+			Assert.AreEqual(2, fixture.Categories.Count);
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestFixtureExtension.cs b/src/NUnitCore/tests/TestFixtureExtension.cs
index 00fd460..7ed23e2 100644
--- a/src/NUnitCore/tests/TestFixtureExtension.cs
+++ b/src/NUnitCore/tests/TestFixtureExtension.cs
@@ -1,74 +1,74 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.TestUtilities;
-using NUnit.TestData.TestFixtureExtension;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for TestFixtureExtension.
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class TestFixtureExtension
-	{
-		private Test suite;
-
-		private void RunTestOnFixture( object fixture )
-		{
-			Test suite = TestBuilder.MakeFixture( fixture );
-            suite.Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		[SetUp] public void LoadFixture()
-		{
-            string testsDll = AssemblyHelper.GetAssemblyPath(typeof(DerivedTestFixture));
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			TestPackage package = new TestPackage( testsDll );
-			package.TestName = typeof(DerivedTestFixture).FullName;
-			suite= builder.Build( package );
-		}
-
-		[Test] 
-		public void CheckMultipleSetUp()
-		{
-			SetUpDerivedTestFixture fixture = new SetUpDerivedTestFixture();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(true, fixture.baseSetup);		}
-
-		[Test]
-		public void DerivedTest()
-		{
-			Assert.IsNotNull(suite);
-
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.IsTrue(result.IsSuccess);
-		}
-
-		[Test]
-		public void InheritSetup()
-		{
-			DerivedTestFixture fixture = new DerivedTestFixture();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(true, fixture.baseSetup);
-		}
-
-		[Test]
-		public void InheritTearDown()
-		{
-			DerivedTestFixture fixture = new DerivedTestFixture();
-			RunTestOnFixture( fixture );
-
-			Assert.AreEqual(true, fixture.baseTeardown);
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.TestUtilities;
+using NUnit.TestData.TestFixtureExtension;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for TestFixtureExtension.
+	/// </summary>
+	/// 
+	[TestFixture]
+	public class TestFixtureExtension
+	{
+		private Test suite;
+
+		private void RunTestOnFixture( object fixture )
+		{
+			Test suite = TestBuilder.MakeFixture( fixture );
+            suite.Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		[SetUp] public void LoadFixture()
+		{
+            string testsDll = AssemblyHelper.GetAssemblyPath(typeof(DerivedTestFixture));
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			TestPackage package = new TestPackage( testsDll );
+			package.TestName = typeof(DerivedTestFixture).FullName;
+			suite= builder.Build( package );
+		}
+
+		[Test] 
+		public void CheckMultipleSetUp()
+		{
+			SetUpDerivedTestFixture fixture = new SetUpDerivedTestFixture();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(true, fixture.baseSetup);		}
+
+		[Test]
+		public void DerivedTest()
+		{
+			Assert.IsNotNull(suite);
+
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.IsTrue(result.IsSuccess);
+		}
+
+		[Test]
+		public void InheritSetup()
+		{
+			DerivedTestFixture fixture = new DerivedTestFixture();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(true, fixture.baseSetup);
+		}
+
+		[Test]
+		public void InheritTearDown()
+		{
+			DerivedTestFixture fixture = new DerivedTestFixture();
+			RunTestOnFixture( fixture );
+
+			Assert.AreEqual(true, fixture.baseTeardown);
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestFixtureTests.cs b/src/NUnitCore/tests/TestFixtureTests.cs
index d57ad62..d5b0b05 100644
--- a/src/NUnitCore/tests/TestFixtureTests.cs
+++ b/src/NUnitCore/tests/TestFixtureTests.cs
@@ -1,401 +1,409 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.TestUtilities;
-using NUnit.TestData.TestFixtureData;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Tests of the NUnitTestFixture class
-	/// </summary>
-	[TestFixture]
-	public class TestFixtureTests
-	{
-		[Test]
-		public void ConstructFromType()
-		{
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( NUnit.Tests.Assemblies.MockTestFixture ) );
-			Assert.AreEqual( "MockTestFixture", fixture.TestName.Name );
-			Assert.AreEqual( "NUnit.Tests.Assemblies.MockTestFixture", fixture.TestName.FullName );
-		}
-
-		[Test]
-		public void ConstructFromTypeWithoutNamespace()
-		{
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( NoNamespaceTestFixture ) );
-			Assert.AreEqual( "NoNamespaceTestFixture", fixture.TestName.Name );
-			Assert.AreEqual( "NoNamespaceTestFixture", fixture.TestName.FullName );
-		}
-
-		[Test]
-		public void ConstructFromNestedType()
-		{
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( OuterClass.NestedTestFixture ) );
-			Assert.AreEqual( "OuterClass+NestedTestFixture", fixture.TestName.Name );
-			Assert.AreEqual( "NUnit.TestData.TestFixtureData.OuterClass+NestedTestFixture", fixture.TestName.FullName );
-		}
-
-		[Test]
-		public void ConstructFromDoublyNestedType()
-		{
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( OuterClass.NestedTestFixture.DoublyNestedTestFixture ) );
-			Assert.AreEqual( "OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.Name );
-			Assert.AreEqual( "NUnit.TestData.TestFixtureData.OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.FullName );
-		}
-
-        [Test]
-        public void ConstructFromTypeWithoutTestFixtureAttributeContainingTest()
-        {
-            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]
-        public void CannotRunConstructorWithArgsNotSupplied()
-        {
-            TestAssert.IsNotRunnable(typeof(NoDefaultCtorFixture));
-        }
-
-        [Test]
-        public void CanRunConstructorWithArgsSupplied()
-        {
-            TestAssert.IsRunnable(typeof(FixtureWithArgsSupplied));
-        }
-
-        [Test]
-		public void CannotRunBadConstructor()
-		{
-            TestAssert.IsNotRunnable(typeof(BadCtorFixture));
-		}
-
-		[Test] 
-		public void CanRunMultipleSetUp()
-		{
-            TestAssert.IsRunnable(typeof(MultipleSetUpAttributes));
-		}
-
-		[Test] 
-		public void CanRunMultipleTearDown()
-		{
-            TestAssert.IsRunnable(typeof(MultipleTearDownAttributes));
-		}
-
-		[Test]
-		public void CannotRunIgnoredFixture()
-		{
-			TestSuite suite = TestBuilder.MakeFixture( typeof( IgnoredFixture ) );
-			Assert.AreEqual( RunState.Ignored, suite.RunState );
-			Assert.AreEqual( "testing ignore a fixture", suite.IgnoreReason );
-		}
-
-        [Test]
-        public void CanRunFixtureDerivedFromAbstractFixture()
-        {
-            TestAssert.IsRunnable(typeof(DerivedFromAbstractTestFixture));
-        }
-
-        [Test]
-        public void CanRunFixtureDerivedFromAbstractDerivedTestFixture()
-        {
-            TestAssert.IsRunnable(typeof(DerivedFromAbstractDerivedTestFixture));
-        }
-
-        [Test]
-        public void FixtureInheritingTwoTestFixtureAttributesIsLoadedOnlyOnce()
-        {
-            TestSuite suite = TestBuilder.MakeFixture(typeof(DoubleDerivedClassWithTwoInheritedAttributes));
-            Assert.That(suite, Is.TypeOf(typeof(NUnitTestFixture)));
-            Assert.That(suite.Tests.Count, Is.EqualTo(0));
-        }
-
-		[Test] 
-		public void CanRunMultipleTestFixtureSetUp()
-		{
-            TestAssert.IsRunnable(typeof(MultipleFixtureSetUpAttributes));
-		}
-
-		[Test] 
-		public void CanRunMultipleTestFixtureTearDown()
-		{
-            TestAssert.IsRunnable(typeof(MultipleFixtureTearDownAttributes));
-        }
-
-#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);
-        }
-
-        [Test]
-        public void CanRunStaticFixture()
-        {
-            TestAssert.IsRunnable(typeof(StaticFixtureWithoutTestFixtureAttribute));
-        }
-
-        [Test]
-        public void CanRunGenericFixtureWithProperArgsProvided()
-        {
-            TestSuite suite = TestBuilder.MakeFixture(
-                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithProperArgsProvided`1,test-assembly"));
-            Assert.That(suite.RunState, Is.EqualTo(RunState.Runnable));
-            Assert.That(suite is ParameterizedFixtureSuite);
-            Assert.That(suite.Tests.Count, Is.EqualTo(2));
-        }
-
-        [Test]
-        public void CannotRunGenericFixtureWithNoTestFixtureAttribute()
-        {
-            TestAssert.IsNotRunnable(
-                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithNoTestFixtureAttribute`1,test-assembly"));
-        }
-
-        [Test]
-        public void CannotRunGenericFixtureWithNoArgsProvided()
-        {
-            Test suite = TestBuilder.MakeFixture(
-                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithNoArgsProvided`1,test-assembly"));
-            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
-        }
-
-        [Test]
-        public void CannotRunGenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided()
-        {
-            Test suite = TestBuilder.MakeFixture(
-                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided`1,test-assembly"));
-            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
-        }
-
-        [Test]
-        public void CanRunGenericFixtureDerivedFromAbstractFixtureWithArgsProvided()
-        {
-            Test suite = TestBuilder.MakeFixture(
-                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureDerivedFromAbstractFixtureWithArgsProvided`1,test-assembly"));
-            Assert.That(suite.RunState, Is.EqualTo(RunState.Runnable));
-            Assert.That(suite is ParameterizedFixtureSuite);
-            Assert.That(suite.Tests.Count, Is.EqualTo(2));
-        }
-#endif
-
-        #region SetUp Signature
-		[Test] 
-		public void CannotRunPrivateSetUp()
-		{
-            TestAssert.IsNotRunnable(typeof(PrivateSetUp));
-		}
-
-		[Test] 
-		public void CanRunProtectedSetUp()
-		{
-            TestAssert.IsRunnable(typeof(ProtectedSetUp));
-		}
-
-        /// <summary>
-        /// Determines whether this instance [can run static set up].
-        /// </summary>
-		[Test] 
-		public void CanRunStaticSetUp()
-		{
-            TestAssert.IsRunnable(typeof(StaticSetUp));
-		}
-
-		[Test]
-		public void CannotRunSetupWithReturnValue()
-		{
-            TestAssert.IsNotRunnable(typeof(SetUpWithReturnValue));
-		}
-
-		[Test]
-		public void CannotRunSetupWithParameters()
-		{
-            TestAssert.IsNotRunnable(typeof(SetUpWithParameters));
-		}
-		#endregion
-
-		#region TearDown Signature
-		[Test] 
-		public void CannotRunPrivateTearDown()
-		{
-            TestAssert.IsNotRunnable(typeof(PrivateTearDown));
-		}
-
-		[Test] 
-		public void CanRunProtectedTearDown()
-		{
-            TestAssert.IsRunnable(typeof(ProtectedTearDown));
-		}
-
-		[Test] 
-		public void CanRunStaticTearDown()
-		{
-            TestAssert.IsRunnable(typeof(StaticTearDown));
-		}
-
-		[Test]
-		public void CannotRunTearDownWithReturnValue()
-		{
-            TestAssert.IsNotRunnable(typeof(TearDownWithReturnValue));
-		}
-
-		[Test]
-		public void CannotRunTearDownWithParameters()
-		{
-            TestAssert.IsNotRunnable(typeof(TearDownWithParameters));
-		}
-		#endregion
-
-		#region TestFixtureSetUp Signature
-		[Test] 
-		public void CannotRunPrivateFixtureSetUp()
-		{
-            TestAssert.IsNotRunnable(typeof(PrivateFixtureSetUp));
-		}
-
-		[Test] 
-		public void CanRunProtectedFixtureSetUp()
-		{
-            TestAssert.IsRunnable(typeof(ProtectedFixtureSetUp));
-		}
-
-		[Test] 
-		public void CanRunStaticFixtureSetUp()
-		{
-            TestAssert.IsRunnable(typeof(StaticFixtureSetUp));
-		}
-
-		[Test]
-		public void CannotRunFixtureSetupWithReturnValue()
-		{
-            TestAssert.IsNotRunnable(typeof(FixtureSetUpWithReturnValue));
-		}
-
-		[Test]
-		public void CannotRunFixtureSetupWithParameters()
-		{
-            TestAssert.IsNotRunnable(typeof(FixtureSetUpWithParameters));
-		}
-		#endregion
-
-		#region TestFixtureTearDown Signature
-		[Test] 
-		public void CannotRunPrivateFixtureTearDown()
-		{
-            TestAssert.IsNotRunnable(typeof(PrivateFixtureTearDown));
-		}
-
-		[Test] 
-		public void CanRunProtectedFixtureTearDown()
-		{
-            TestAssert.IsRunnable(typeof(ProtectedFixtureTearDown));
-		}
-
-		[Test] 
-		public void CanRunStaticFixtureTearDown()
-		{
-            TestAssert.IsRunnable(typeof(StaticFixtureTearDown));
-		}
-
-//		[TestFixture]
-//			[Category("fixture category")]
-//			[Category("second")]
-//			private class HasCategories 
-//		{
-//			[Test] public void OneTest()
-//			{}
-//		}
-//
-//		[Test]
-//		public void LoadCategories() 
-//		{
-//			TestSuite fixture = LoadFixture("NUnit.Core.Tests.TestFixtureBuilderTests+HasCategories");
-//			Assert.IsNotNull(fixture);
-//			Assert.AreEqual(2, fixture.Categories.Count);
-//		}
-
-		[Test]
-		public void CannotRunFixtureTearDownWithReturnValue()
-		{
-            TestAssert.IsNotRunnable(typeof(FixtureTearDownWithReturnValue));
-		}
-
-		[Test]
-		public void CannotRunFixtureTearDownWithParameters()
-		{
-            TestAssert.IsNotRunnable(typeof(FixtureTearDownWithParameters));
-		}
-		#endregion
-
-        #region Nested Fixtures
-
-        [TestFixture]
-        private class PrivateTestFixture
-        {
-            [Test]
-            public void CanRunTestInPrivateTestFixture()
-            {
-                Assert.True(true);
-            }
-        }
-
-        [TestFixture]
-        protected class ProtectedTestFixture
-        {
-            [Test]
-            public void CanRunTestInProtectedTestFixture()
-            {
-                Assert.True(true);
-            }
-        }
-
-        [TestFixture]
-        internal class InternalTestFixture
-        {
-            [Test]
-            public void CanRunTestInInternalTestFixture()
-            {
-                Assert.True(true);
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.TestUtilities;
+using NUnit.TestData.TestFixtureData;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Tests of the NUnitTestFixture class
+	/// </summary>
+	[TestFixture]
+	public class TestFixtureTests
+	{
+		[Test]
+		public void ConstructFromType()
+		{
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( NUnit.Tests.Assemblies.MockTestFixture ) );
+			Assert.AreEqual( "MockTestFixture", fixture.TestName.Name );
+			Assert.AreEqual( "NUnit.Tests.Assemblies.MockTestFixture", fixture.TestName.FullName );
+		}
+
+		[Test]
+		public void ConstructFromTypeWithoutNamespace()
+		{
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( NoNamespaceTestFixture ) );
+			Assert.AreEqual( "NoNamespaceTestFixture", fixture.TestName.Name );
+			Assert.AreEqual( "NoNamespaceTestFixture", fixture.TestName.FullName );
+		}
+
+		[Test]
+		public void ConstructFromNestedType()
+		{
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( OuterClass.NestedTestFixture ) );
+			Assert.AreEqual( "OuterClass+NestedTestFixture", fixture.TestName.Name );
+			Assert.AreEqual( "NUnit.TestData.TestFixtureData.OuterClass+NestedTestFixture", fixture.TestName.FullName );
+		}
+
+		[Test]
+		public void ConstructFromDoublyNestedType()
+		{
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( OuterClass.NestedTestFixture.DoublyNestedTestFixture ) );
+			Assert.AreEqual( "OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.Name );
+			Assert.AreEqual( "NUnit.TestData.TestFixtureData.OuterClass+NestedTestFixture+DoublyNestedTestFixture", fixture.TestName.FullName );
+		}
+
+        [Test]
+        public void ConstructFromTypeWithoutTestFixtureAttributeContainingTest()
+        {
+            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]
+        public void CannotRunConstructorWithArgsNotSupplied()
+        {
+            TestAssert.IsNotRunnable(typeof(NoDefaultCtorFixture));
+        }
+
+        [Test]
+        public void CanRunConstructorWithArgsSupplied()
+        {
+            TestAssert.IsRunnable(typeof(FixtureWithArgsSupplied));
+        }
+
+        [Test]
+		public void CannotRunBadConstructor()
+		{
+            TestAssert.IsNotRunnable(typeof(BadCtorFixture));
+		}
+
+		[Test] 
+		public void CanRunMultipleSetUp()
+		{
+            TestAssert.IsRunnable(typeof(MultipleSetUpAttributes));
+		}
+
+		[Test] 
+		public void CanRunMultipleTearDown()
+		{
+            TestAssert.IsRunnable(typeof(MultipleTearDownAttributes));
+		}
+
+		[Test]
+		public void CannotRunIgnoredFixture()
+		{
+			TestSuite suite = TestBuilder.MakeFixture( typeof( IgnoredFixture ) );
+			Assert.AreEqual( RunState.Ignored, suite.RunState );
+			Assert.AreEqual( "testing ignore a fixture", suite.IgnoreReason );
+		}
+
+        [Test]
+        public void CanRunFixtureDerivedFromAbstractFixture()
+        {
+            TestAssert.IsRunnable(typeof(DerivedFromAbstractTestFixture));
+        }
+
+        [Test]
+        public void CanRunFixtureDerivedFromAbstractDerivedTestFixture()
+        {
+            TestAssert.IsRunnable(typeof(DerivedFromAbstractDerivedTestFixture));
+        }
+
+        [Test]
+        public void FixtureInheritingTwoTestFixtureAttributesIsLoadedOnlyOnce()
+        {
+            TestSuite suite = TestBuilder.MakeFixture(typeof(DoubleDerivedClassWithTwoInheritedAttributes));
+            Assert.That(suite, Is.TypeOf(typeof(NUnitTestFixture)));
+            Assert.That(suite.Tests.Count, Is.EqualTo(0));
+        }
+
+		[Test] 
+		public void CanRunMultipleTestFixtureSetUp()
+		{
+            TestAssert.IsRunnable(typeof(MultipleFixtureSetUpAttributes));
+		}
+
+		[Test] 
+		public void CanRunMultipleTestFixtureTearDown()
+		{
+            TestAssert.IsRunnable(typeof(MultipleFixtureTearDownAttributes));
+        }
+
+#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);
+        }
+
+        [Test]
+        public void CanRunStaticFixture()
+        {
+            TestAssert.IsRunnable(typeof(StaticFixtureWithoutTestFixtureAttribute));
+        }
+
+        [Test]
+        public void CanRunGenericFixtureWithProperArgsProvided()
+        {
+            TestSuite suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithProperArgsProvided`1,test-assembly"));
+            Assert.That(suite.RunState, Is.EqualTo(RunState.Runnable));
+            Assert.That(suite is ParameterizedFixtureSuite);
+            Assert.That(suite.Tests.Count, Is.EqualTo(2));
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureWithNoTestFixtureAttribute()
+        {
+            TestAssert.IsNotRunnable(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithNoTestFixtureAttribute`1,test-assembly"));
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureWithNoArgsProvided()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithNoArgsProvided`1,test-assembly"));
+            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided`1,test-assembly"));
+            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
+        }
+
+        [Test]
+        public void CanRunGenericFixtureDerivedFromAbstractFixtureWithArgsProvided()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureDerivedFromAbstractFixtureWithArgsProvided`1,test-assembly"));
+            Assert.That(suite.RunState, Is.EqualTo(RunState.Runnable));
+            Assert.That(suite is ParameterizedFixtureSuite);
+            Assert.That(suite.Tests.Count, Is.EqualTo(2));
+        }
+
+        [Test]
+        public void CannotRunGenericFixtureWithOpenTypeAsArgument()
+        {
+            Test suite = TestBuilder.MakeFixture(
+                Type.GetType("NUnit.TestData.TestFixtureData.GenericFixtureWithOpenTypeAsArgument`1,test-assembly"));
+            TestAssert.IsNotRunnable((Test)suite.Tests[0]);
+        }
+#endif
+
+        #region SetUp Signature
+		[Test] 
+		public void CannotRunPrivateSetUp()
+		{
+            TestAssert.IsNotRunnable(typeof(PrivateSetUp));
+		}
+
+		[Test] 
+		public void CanRunProtectedSetUp()
+		{
+            TestAssert.IsRunnable(typeof(ProtectedSetUp));
+		}
+
+        /// <summary>
+        /// Determines whether this instance [can run static set up].
+        /// </summary>
+		[Test] 
+		public void CanRunStaticSetUp()
+		{
+            TestAssert.IsRunnable(typeof(StaticSetUp));
+		}
+
+		[Test]
+		public void CannotRunSetupWithReturnValue()
+		{
+            TestAssert.IsNotRunnable(typeof(SetUpWithReturnValue));
+		}
+
+		[Test]
+		public void CannotRunSetupWithParameters()
+		{
+            TestAssert.IsNotRunnable(typeof(SetUpWithParameters));
+		}
+		#endregion
+
+		#region TearDown Signature
+		[Test] 
+		public void CannotRunPrivateTearDown()
+		{
+            TestAssert.IsNotRunnable(typeof(PrivateTearDown));
+		}
+
+		[Test] 
+		public void CanRunProtectedTearDown()
+		{
+            TestAssert.IsRunnable(typeof(ProtectedTearDown));
+		}
+
+		[Test] 
+		public void CanRunStaticTearDown()
+		{
+            TestAssert.IsRunnable(typeof(StaticTearDown));
+		}
+
+		[Test]
+		public void CannotRunTearDownWithReturnValue()
+		{
+            TestAssert.IsNotRunnable(typeof(TearDownWithReturnValue));
+		}
+
+		[Test]
+		public void CannotRunTearDownWithParameters()
+		{
+            TestAssert.IsNotRunnable(typeof(TearDownWithParameters));
+		}
+		#endregion
+
+		#region TestFixtureSetUp Signature
+		[Test] 
+		public void CannotRunPrivateFixtureSetUp()
+		{
+            TestAssert.IsNotRunnable(typeof(PrivateFixtureSetUp));
+		}
+
+		[Test] 
+		public void CanRunProtectedFixtureSetUp()
+		{
+            TestAssert.IsRunnable(typeof(ProtectedFixtureSetUp));
+		}
+
+		[Test] 
+		public void CanRunStaticFixtureSetUp()
+		{
+            TestAssert.IsRunnable(typeof(StaticFixtureSetUp));
+		}
+
+		[Test]
+		public void CannotRunFixtureSetupWithReturnValue()
+		{
+            TestAssert.IsNotRunnable(typeof(FixtureSetUpWithReturnValue));
+		}
+
+		[Test]
+		public void CannotRunFixtureSetupWithParameters()
+		{
+            TestAssert.IsNotRunnable(typeof(FixtureSetUpWithParameters));
+		}
+		#endregion
+
+		#region TestFixtureTearDown Signature
+		[Test] 
+		public void CannotRunPrivateFixtureTearDown()
+		{
+            TestAssert.IsNotRunnable(typeof(PrivateFixtureTearDown));
+		}
+
+		[Test] 
+		public void CanRunProtectedFixtureTearDown()
+		{
+            TestAssert.IsRunnable(typeof(ProtectedFixtureTearDown));
+		}
+
+		[Test] 
+		public void CanRunStaticFixtureTearDown()
+		{
+            TestAssert.IsRunnable(typeof(StaticFixtureTearDown));
+		}
+
+//		[TestFixture]
+//			[Category("fixture category")]
+//			[Category("second")]
+//			private class HasCategories 
+//		{
+//			[Test] public void OneTest()
+//			{}
+//		}
+//
+//		[Test]
+//		public void LoadCategories() 
+//		{
+//			TestSuite fixture = LoadFixture("NUnit.Core.Tests.TestFixtureBuilderTests+HasCategories");
+//			Assert.IsNotNull(fixture);
+//			Assert.AreEqual(2, fixture.Categories.Count);
+//		}
+
+		[Test]
+		public void CannotRunFixtureTearDownWithReturnValue()
+		{
+            TestAssert.IsNotRunnable(typeof(FixtureTearDownWithReturnValue));
+		}
+
+		[Test]
+		public void CannotRunFixtureTearDownWithParameters()
+		{
+            TestAssert.IsNotRunnable(typeof(FixtureTearDownWithParameters));
+		}
+		#endregion
+
+        #region Nested Fixtures
+
+        [TestFixture]
+        private class PrivateTestFixture
+        {
+            [Test]
+            public void CanRunTestInPrivateTestFixture()
+            {
+                Assert.True(true);
+            }
+        }
+
+        [TestFixture]
+        protected class ProtectedTestFixture
+        {
+            [Test]
+            public void CanRunTestInProtectedTestFixture()
+            {
+                Assert.True(true);
+            }
+        }
+
+        [TestFixture]
+        internal class InternalTestFixture
+        {
+            [Test]
+            public void CanRunTestInInternalTestFixture()
+            {
+                Assert.True(true);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitCore/tests/TestFrameworkTests.cs b/src/NUnitCore/tests/TestFrameworkTests.cs
index 77262fb..7984b12 100644
--- a/src/NUnitCore/tests/TestFrameworkTests.cs
+++ b/src/NUnitCore/tests/TestFrameworkTests.cs
@@ -1,29 +1,29 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using System.Reflection;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for TestFrameworkTests.
-	/// </summary>
-	[TestFixture]
-	public class TestFrameworkTests
-	{
-		[Test]
-		public void NUnitFrameworkIsKnownAndReferenced()
-		{
-			FrameworkRegistry frameworks = (FrameworkRegistry)CoreExtensions.Host.GetExtensionPoint("FrameworkRegistry");
-			foreach( AssemblyName assemblyName in frameworks.GetReferencedFrameworks( Assembly.GetExecutingAssembly() ) )
-				if ( assemblyName.Name == "nunit.framework" ) return;
-			Assert.Fail("Cannot find nunit.framework");
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using System.Reflection;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for TestFrameworkTests.
+	/// </summary>
+	[TestFixture]
+	public class TestFrameworkTests
+	{
+		[Test]
+		public void NUnitFrameworkIsKnownAndReferenced()
+		{
+			FrameworkRegistry frameworks = (FrameworkRegistry)CoreExtensions.Host.GetExtensionPoint("FrameworkRegistry");
+			foreach( AssemblyName assemblyName in frameworks.GetReferencedFrameworks( Assembly.GetExecutingAssembly() ) )
+				if ( assemblyName.Name == "nunit.framework" ) return;
+			Assert.Fail("Cannot find nunit.framework");
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestIDTests.cs b/src/NUnitCore/tests/TestIDTests.cs
index 2f74035..2a8ba1a 100644
--- a/src/NUnitCore/tests/TestIDTests.cs
+++ b/src/NUnitCore/tests/TestIDTests.cs
@@ -1,45 +1,45 @@
-// ****************************************************************
-// Copyright 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.Core.Tests
-{
-	[TestFixture]
-	public class TestIDTests
-	{
-		[Test]
-		public void ClonedTestIDsAreEqual()
-		{
-			TestID testID = new TestID();
-			TestID cloneID = (TestID)testID.Clone();
-			Assert.AreEqual( testID, cloneID );
-
-			Assert.IsTrue( testID == cloneID, "operator ==" );
-			Assert.IsFalse( testID != cloneID, "operator !=" );
-		}
-
-		[Test]
-		public void DifferentTestIDsAreNotEqual()
-		{
-			TestID testID1 = new TestID();
-			TestID testID2 = new TestID();
-			Assert.AreNotEqual( testID1, testID2 );
-
-			Assert.IsFalse( testID1 == testID2, "operator ==" );
-			Assert.IsTrue( testID1 != testID2, "operator !=" );
-		}
-
-		[Test]
-		public void DifferentTestIDsDisplayDifferentStrings()
-		{
-			TestID testID1 = new TestID();
-			TestID testID2 = new TestID();
-			Assert.AreNotEqual( testID1.ToString(), testID2.ToString() );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Tests
+{
+	[TestFixture]
+	public class TestIDTests
+	{
+		[Test]
+		public void ClonedTestIDsAreEqual()
+		{
+			TestID testID = new TestID();
+			TestID cloneID = (TestID)testID.Clone();
+			Assert.AreEqual( testID, cloneID );
+
+			Assert.IsTrue( testID == cloneID, "operator ==" );
+			Assert.IsFalse( testID != cloneID, "operator !=" );
+		}
+
+		[Test]
+		public void DifferentTestIDsAreNotEqual()
+		{
+			TestID testID1 = new TestID();
+			TestID testID2 = new TestID();
+			Assert.AreNotEqual( testID1, testID2 );
+
+			Assert.IsFalse( testID1 == testID2, "operator ==" );
+			Assert.IsTrue( testID1 != testID2, "operator !=" );
+		}
+
+		[Test]
+		public void DifferentTestIDsDisplayDifferentStrings()
+		{
+			TestID testID1 = new TestID();
+			TestID testID2 = new TestID();
+			Assert.AreNotEqual( testID1.ToString(), testID2.ToString() );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestInfoTests.cs b/src/NUnitCore/tests/TestInfoTests.cs
index d01c6e9..6434672 100644
--- a/src/NUnitCore/tests/TestInfoTests.cs
+++ b/src/NUnitCore/tests/TestInfoTests.cs
@@ -1,73 +1,76 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for TestInfoTests.
-	/// </summary>
-	[TestFixture]
-	public class TestInfoTests
-	{
-		TestSuite testSuite;
-		TestSuite testFixture;
-		Test testCase1;
-
-		[SetUp]
-		public void SetUp()
-		{
-			testSuite = new TestSuite("MyTestSuite");
-			testFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
-			testSuite.Add( testFixture );
-
-			testCase1 = (Test)testFixture.Tests[0];
-		}
-
-		private void CheckConstructionFromTest( ITest expected )
-		{
-			TestInfo actual = new TestInfo( expected );
-			Assert.AreEqual( expected.TestName, actual.TestName );
-			Assert.AreEqual( expected.TestType, actual.TestType );
-			Assert.AreEqual( expected.RunState, actual.RunState );
-			Assert.AreEqual( expected.IsSuite, actual.IsSuite, "IsSuite" );
-			Assert.AreEqual( expected.TestCount, actual.TestCount, "TestCount" );
-
-			if ( expected.Categories == null )
-				Assert.AreEqual( 0, actual.Categories.Count, "Categories" );
-			else
-			{
-				Assert.AreEqual( expected.Categories.Count, actual.Categories.Count, "Categories" );
-				for ( int index = 0; index < expected.Categories.Count; index++ )
-					Assert.AreEqual( expected.Categories[index], actual.Categories[index], "Category {0}", index );
-			}
-
-			Assert.AreEqual( expected.TestName, actual.TestName, "TestName" );
-		}
-
-		[Test]
-		public void ConstructFromFixture()
-		{
-			CheckConstructionFromTest( testFixture );
-		}
-
-		[Test]
-		public void ConstructFromSuite()
-		{
-			CheckConstructionFromTest( testSuite );
-		}
-
-		[Test]
-		public void ConstructFromTestCase()
-		{
-			CheckConstructionFromTest( testCase1 );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for TestInfoTests.
+	/// </summary>
+	[TestFixture]
+	public class TestInfoTests
+	{
+		TestSuite testSuite;
+		TestSuite testFixture;
+		Test testCase1;
+
+		[SetUp]
+		public void SetUp()
+		{
+			testSuite = new TestSuite("MyTestSuite");
+			testFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
+			testSuite.Add( testFixture );
+
+			testCase1 = (Test)testFixture.Tests[0];
+		}
+
+		private void CheckConstructionFromTest( ITest expected, string expectedClassName, string expectedMethodName )
+		{
+			TestInfo actual = new TestInfo( expected );
+			Assert.AreEqual( expected.TestName, actual.TestName );
+			Assert.AreEqual( expected.TestType, actual.TestType );
+			Assert.AreEqual( expected.RunState, actual.RunState );
+			Assert.AreEqual( expected.IsSuite, actual.IsSuite, "IsSuite" );
+			Assert.AreEqual( expected.TestCount, actual.TestCount, "TestCount" );
+
+            Assert.AreEqual(expectedClassName, actual.ClassName);
+            Assert.AreEqual(expectedMethodName, actual.MethodName);
+            
+            if (expected.Categories == null)
+				Assert.AreEqual( 0, actual.Categories.Count, "Categories" );
+			else
+			{
+				Assert.AreEqual( expected.Categories.Count, actual.Categories.Count, "Categories" );
+				for ( int index = 0; index < expected.Categories.Count; index++ )
+					Assert.AreEqual( expected.Categories[index], actual.Categories[index], "Category {0}", index );
+			}
+
+			Assert.AreEqual( expected.TestName, actual.TestName, "TestName" );
+		}
+
+		[Test]
+		public void ConstructFromFixture()
+		{
+			CheckConstructionFromTest( testFixture, "NUnit.Tests.Assemblies.MockTestFixture", null );
+		}
+
+		[Test]
+		public void ConstructFromSuite()
+		{
+			CheckConstructionFromTest( testSuite, null, null );
+		}
+
+		[Test]
+		public void ConstructFromTestCase()
+		{
+			CheckConstructionFromTest( testCase1, "NUnit.Tests.Assemblies.MockTestFixture", "MockTest1" );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestMethodSignatureTests.cs b/src/NUnitCore/tests/TestMethodSignatureTests.cs
index a80f4a9..3340fdc 100644
--- a/src/NUnitCore/tests/TestMethodSignatureTests.cs
+++ b/src/NUnitCore/tests/TestMethodSignatureTests.cs
@@ -1,206 +1,218 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.TestUtilities;
-using NUnit.TestData;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class TestMethodSignatureTests
-	{
-        private static Type fixtureType = typeof(TestMethodSignatureFixture);
-		private Test fixture;
-
-		[SetUp]
-		public void CreateFixture()
-		{
-			fixture = TestBuilder.MakeFixture( typeof( TestMethodSignatureFixture ) );
-		}
-
-        [Test]
-		public void InstanceTestMethodIsRunnable()
-		{
-			TestAssert.IsRunnable( fixtureType, "InstanceTestMethod" );
-		}
-
-		[Test]
-		public void StaticTestMethodIsRunnable()
-		{
-			TestAssert.IsRunnable( fixtureType, "StaticTestMethod" );
-		}
-
-		[Test]
-		public void TestMethodWithoutParametersWithArgumentsProvidedIsNotRunnable()
-		{
-			TestAssert.ChildNotRunnable(fixtureType, "TestMethodWithoutParametersWithArgumentsProvided");
-		}
-
-        [Test]
-        public void TestMethodWithArgumentsNotProvidedIsNotRunnable()
-        {
-            TestAssert.IsNotRunnable(fixtureType, "TestMethodWithArgumentsNotProvided");
-        }
-
-        [Test]
-        public void TestMethodWithArgumentsProvidedIsRunnable()
-        {
-            TestAssert.IsRunnable(fixtureType, "TestMethodWithArgumentsProvided");
-        }
-
-        [Test]
-        public void TestMethodWithWrongNumberOfArgumentsProvidedIsNotRunnable()
-        {
-            TestAssert.ChildNotRunnable(fixtureType, "TestMethodWithWrongNumberOfArgumentsProvided");
-        }
-
-        [Test]
-        public void TestMethodWithWrongArgumentTypesProvidedGivesError()
-        {
-            TestAssert.IsRunnable(fixtureType, "TestMethodWithWrongArgumentTypesProvided", ResultState.Error);
-        }
-
-        [Test]
-        public void StaticTestMethodWithArgumentsNotProvidedIsNotRunnable()
-        {
-            TestAssert.IsNotRunnable(fixtureType, "StaticTestMethodWithArgumentsNotProvided");
-        }
-
-        [Test]
-        public void StaticTestMethodWithArgumentsProvidedIsRunnable()
-        {
-            TestAssert.IsRunnable(fixtureType, "StaticTestMethodWithArgumentsProvided");
-        }
-
-        [Test]
-        public void StaticTestMethodWithWrongNumberOfArgumentsProvidedIsNotRunnable()
-        {
-            TestAssert.ChildNotRunnable(fixtureType, "StaticTestMethodWithWrongNumberOfArgumentsProvided");
-        }
-
-        [Test]
-        public void StaticTestMethodWithWrongArgumentTypesProvidedGivesError()
-        {
-            TestAssert.IsRunnable(fixtureType, "StaticTestMethodWithWrongArgumentTypesProvided", ResultState.Error);
-        }
-
-        [Test]
-        public void TestMethodWithConvertibleArgumentsIsRunnable()
-        {
-            TestAssert.IsRunnable(fixtureType, "TestMethodWithConvertibleArguments");
-        }
-
-        [Test]
-        public void TestMethodWithNonConvertibleArgumentsGivesError()
-        {
-            TestAssert.IsRunnable(fixtureType, "TestMethodWithNonConvertibleArguments", ResultState.Error);
-        }
-
-        [Test]
-		public void ProtectedTestMethodIsNotRunnable()
-		{
-			TestAssert.IsNotRunnable( fixtureType, "ProtectedTestMethod" );
-		}
-
-		[Test]
-		public void PrivateTestMethodIsNotRunnable()
-		{
-			TestAssert.IsNotRunnable( fixtureType, "PrivateTestMethod" );
-		}
-
-		[Test]
-		public void TestMethodWithReturnTypeIsNotRunnable()
-		{
-			TestAssert.IsNotRunnable( fixtureType, "TestMethodWithReturnType" );
-		}
-
-		[Test]
-		public void TestMethodWithMultipleTestCasesExecutesMultipleTimes()
-		{
-			Test test = TestFinder.Find( "TestMethodWithMultipleTestCases", fixture, false );
-			Assert.That( test.RunState, Is.EqualTo( RunState.Runnable ) );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			Assert.That( result.ResultState, Is.EqualTo(ResultState.Success) );
-            ResultSummarizer summary = new ResultSummarizer(result);
-		    Assert.That(summary.TestsRun, Is.EqualTo(3));
-		}
-
-        [Test]
-        public void TestMethodWithMultipleTestCasesUsesCorrectNames()
-        {
-            string name = "TestMethodWithMultipleTestCases";
-            string fullName = typeof (TestMethodSignatureFixture).FullName + "." + name;
-            TestSuite suite = (TestSuite)TestFinder.Find(name, fixture, false);
-            Assert.That(suite.TestCount, Is.EqualTo(3));
-
-            ArrayList names = new ArrayList();
-            ArrayList fullNames = new ArrayList();
-
-            foreach (Test test in suite.Tests)
-            {
-                names.Add(test.TestName.Name);
-                fullNames.Add(test.TestName.FullName);
-            }
-
-            Assert.That(names, Has.Member(name + "(12,3,4)"));
-            Assert.That(names, Has.Member(name + "(12,2,6)"));
-            Assert.That(names, Has.Member(name + "(12,4,3)"));
-
-            Assert.That(fullNames, Has.Member(fullName + "(12,3,4)"));
-            Assert.That(fullNames, Has.Member(fullName + "(12,2,6)"));
-            Assert.That(fullNames, Has.Member(fullName + "(12,4,3)"));
-        }
-
-        [Test]
-        public void TestMethodWithParamsArgumentIsRunnable()
-        {
-            TestAssert.IsRunnable(fixtureType, "TestMethodWithParamsArgument");
-        }
-
-        // TODO: Make this work in a later release
-        //[Test]
-        public void TestMethodWithParamsArgumentUsesCorrectName()
-        {
-            string name = "TestMethodWithParamsArgument";
-            string fullName = typeof(TestMethodSignatureFixture).FullName + "." + name;
-            TestSuite suite = (TestSuite)TestFinder.Find(name, fixture, false);
-            Test test = suite.Tests[0] as Test;
-
-            Assert.That(test.TestName.Name, Is.EqualTo(name + "(1, 2, 3)"));
-            Assert.That(test.TestName.FullName, Is.EqualTo(fullName + "(1, 2, 3)"));
-        }
-
-        [Test]
-        public void RunningTestsThroughFixtureGivesCorrectResults()
-		{
-            TestResult result = fixture.Run(NullListener.NULL, TestFilter.Empty);
-			ResultSummarizer summary = new ResultSummarizer( result );
-
-			Assert.That( 
-				summary.ResultCount, 
-				Is.EqualTo( TestMethodSignatureFixture.Tests ) );
-			Assert.That( 
-				summary.TestsRun, 
-				Is.EqualTo( TestMethodSignatureFixture.Runnable ) );
-			Assert.That( 
-				summary.NotRunnable, 
-				Is.EqualTo( TestMethodSignatureFixture.NotRunnable ) );
-            Assert.That(
-                summary.Errors,
-                Is.EqualTo(TestMethodSignatureFixture.Errors));
-            Assert.That(
-                summary.Failures,
-                Is.EqualTo(TestMethodSignatureFixture.Failures));
-            Assert.That( 
-				summary.TestsNotRun, 
-				Is.EqualTo( TestMethodSignatureFixture.NotRunnable ) );
-		}
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class TestMethodSignatureTests
+	{
+        private static Type fixtureType = typeof(TestMethodSignatureFixture);
+		private Test fixture;
+
+		[SetUp]
+		public void CreateFixture()
+		{
+			fixture = TestBuilder.MakeFixture( typeof( TestMethodSignatureFixture ) );
+		}
+
+        [Test]
+		public void InstanceTestMethodIsRunnable()
+		{
+			TestAssert.IsRunnable( fixtureType, "InstanceTestMethod" );
+		}
+
+		[Test]
+		public void StaticTestMethodIsRunnable()
+		{
+			TestAssert.IsRunnable( fixtureType, "StaticTestMethod" );
+		}
+
+		[Test]
+		public void TestMethodWithoutParametersWithArgumentsProvidedIsNotRunnable()
+		{
+			TestAssert.ChildNotRunnable(fixtureType, "TestMethodWithoutParametersWithArgumentsProvided");
+		}
+
+        [Test]
+        public void TestMethodWithArgumentsNotProvidedIsNotRunnable()
+        {
+            TestAssert.IsNotRunnable(fixtureType, "TestMethodWithArgumentsNotProvided");
+        }
+
+        [Test]
+        public void TestMethodWithArgumentsProvidedIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithArgumentsProvided");
+        }
+
+        [Test]
+        public void TestMethodWithWrongNumberOfArgumentsProvidedIsNotRunnable()
+        {
+            TestAssert.ChildNotRunnable(fixtureType, "TestMethodWithWrongNumberOfArgumentsProvided");
+        }
+
+        [Test]
+        public void TestMethodWithWrongArgumentTypesProvidedGivesError()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithWrongArgumentTypesProvided", ResultState.Error);
+        }
+
+        [Test]
+        public void StaticTestMethodWithArgumentsNotProvidedIsNotRunnable()
+        {
+            TestAssert.IsNotRunnable(fixtureType, "StaticTestMethodWithArgumentsNotProvided");
+        }
+
+        [Test]
+        public void StaticTestMethodWithArgumentsProvidedIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "StaticTestMethodWithArgumentsProvided");
+        }
+
+        [Test]
+        public void StaticTestMethodWithWrongNumberOfArgumentsProvidedIsNotRunnable()
+        {
+            TestAssert.ChildNotRunnable(fixtureType, "StaticTestMethodWithWrongNumberOfArgumentsProvided");
+        }
+
+        [Test]
+        public void StaticTestMethodWithWrongArgumentTypesProvidedGivesError()
+        {
+            TestAssert.IsRunnable(fixtureType, "StaticTestMethodWithWrongArgumentTypesProvided", ResultState.Error);
+        }
+
+        [Test]
+        public void TestMethodWithConvertibleArgumentsIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithConvertibleArguments");
+        }
+
+        [Test]
+        public void TestMethodWithNonConvertibleArgumentsGivesError()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithNonConvertibleArguments", ResultState.Error);
+        }
+
+        [Test]
+		public void ProtectedTestMethodIsNotRunnable()
+		{
+			TestAssert.IsNotRunnable( fixtureType, "ProtectedTestMethod" );
+		}
+
+		[Test]
+		public void PrivateTestMethodIsNotRunnable()
+		{
+			TestAssert.IsNotRunnable( fixtureType, "PrivateTestMethod" );
+		}
+
+		[Test]
+		public void TestMethodWithReturnTypeIsNotRunnable()
+		{
+			TestAssert.IsNotRunnable( fixtureType, "TestMethodWithReturnType" );
+		}
+
+		[Test]
+		public void TestMethodWithMultipleTestCasesExecutesMultipleTimes()
+		{
+			Test test = TestFinder.Find( "TestMethodWithMultipleTestCases", fixture, false );
+			Assert.That( test.RunState, Is.EqualTo( RunState.Runnable ) );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			Assert.That( result.ResultState, Is.EqualTo(ResultState.Success) );
+            ResultSummarizer summary = new ResultSummarizer(result);
+		    Assert.That(summary.TestsRun, Is.EqualTo(3));
+		}
+
+        [Test]
+        public void TestMethodWithMultipleTestCasesUsesCorrectNames()
+        {
+            string name = "TestMethodWithMultipleTestCases";
+            string fullName = typeof (TestMethodSignatureFixture).FullName + "." + name;
+            TestSuite suite = (TestSuite)TestFinder.Find(name, fixture, false);
+            Assert.That(suite.TestCount, Is.EqualTo(3));
+
+            ArrayList names = new ArrayList();
+            ArrayList fullNames = new ArrayList();
+
+            foreach (Test test in suite.Tests)
+            {
+                names.Add(test.TestName.Name);
+                fullNames.Add(test.TestName.FullName);
+            }
+
+            Assert.That(names, Has.Member(name + "(12,3,4)"));
+            Assert.That(names, Has.Member(name + "(12,2,6)"));
+            Assert.That(names, Has.Member(name + "(12,4,3)"));
+
+            Assert.That(fullNames, Has.Member(fullName + "(12,3,4)"));
+            Assert.That(fullNames, Has.Member(fullName + "(12,2,6)"));
+            Assert.That(fullNames, Has.Member(fullName + "(12,4,3)"));
+        }
+
+        [Test]
+        public void TestMethodWithParamsArgumentIsRunnable()
+        {
+            TestAssert.IsRunnable(fixtureType, "TestMethodWithParamsArgument");
+        }
+
+        // TODO: Make this work in a later release
+        //[Test]
+        public void TestMethodWithParamsArgumentUsesCorrectName()
+        {
+            string name = "TestMethodWithParamsArgument";
+            string fullName = typeof(TestMethodSignatureFixture).FullName + "." + name;
+            TestSuite suite = (TestSuite)TestFinder.Find(name, fixture, false);
+            Test test = suite.Tests[0] as Test;
+
+            Assert.That(test.TestName.Name, Is.EqualTo(name + "(1, 2, 3)"));
+            Assert.That(test.TestName.FullName, Is.EqualTo(fullName + "(1, 2, 3)"));
+        }
+
+#if CS_3_0
+        [TestCase()]
+#endif
+        [TestCase(@"one")]
+        [TestCase(@"one", @"two")]
+        [TestCase(@"one", @"two", @"three")]
+        [TestCase(@"one", @"two", @"three", @"four")]
+        public void TestParams(params string[] values) 
+        {
+            Assert.That(values.Length <= 4);
+        }
+
+        [Test]
+        public void RunningTestsThroughFixtureGivesCorrectResults()
+		{
+            TestResult result = fixture.Run(NullListener.NULL, TestFilter.Empty);
+			ResultSummarizer summary = new ResultSummarizer( result );
+
+			Assert.That( 
+				summary.ResultCount, 
+				Is.EqualTo( TestMethodSignatureFixture.Tests ) );
+			Assert.That( 
+				summary.TestsRun, 
+				Is.EqualTo( TestMethodSignatureFixture.Runnable ) );
+			Assert.That( 
+				summary.NotRunnable, 
+				Is.EqualTo( TestMethodSignatureFixture.NotRunnable ) );
+            Assert.That(
+                summary.Errors,
+                Is.EqualTo(TestMethodSignatureFixture.Errors));
+            Assert.That(
+                summary.Failures,
+                Is.EqualTo(TestMethodSignatureFixture.Failures));
+            Assert.That( 
+				summary.TestsNotRun, 
+				Is.EqualTo( TestMethodSignatureFixture.NotRunnable ) );
+		}
+    }
+}
diff --git a/src/NUnitCore/tests/TestNameTests.cs b/src/NUnitCore/tests/TestNameTests.cs
index 80eb1b6..6d97020 100644
--- a/src/NUnitCore/tests/TestNameTests.cs
+++ b/src/NUnitCore/tests/TestNameTests.cs
@@ -1,140 +1,140 @@
-// ****************************************************************
-// Copyright 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.Core.Tests
-{
-	[TestFixture]
-	public class TestNameTests
-	{
-		private TestName weakName1;
-		private TestName weakName2;
-		private TestName strongName1;
-		private TestName strongName2;
-
-		[SetUp]
-		public void CreateTestNames()
-		{
-			weakName1 = new TestName();
-			weakName2 = new TestName();
-			weakName1.FullName = weakName2.FullName = "Name.Of.This.Test";
-
-			strongName1 = new TestName();
-			strongName2 = new TestName();
-			strongName1.FullName = strongName2.FullName = "Name.Of.This.Test";
-			strongName1.TestID = new TestID();
-			strongName2.TestID = new TestID();
-		}
-
-		[Test]
-		public void CanCompareWeakTestNames()
-		{
-			Assert.AreEqual( weakName1, weakName2 );
-			Assert.IsTrue( weakName1 == weakName2, "operator ==");
-			Assert.IsFalse( weakName1 != weakName2, "operator !=");
-
-			weakName2.FullName = "A.Different.Name";
-			Assert.AreNotEqual( weakName1, weakName2 );
-			Assert.IsFalse( weakName1 == weakName2, "operator ==");
-			Assert.IsTrue( weakName1 != weakName2, "operator !=");
-		}
-
-		[Test]
-		public void CanCompareStrongTestNames()
-		{
-			Assert.AreNotEqual( strongName1, strongName2 );
-			Assert.IsFalse( strongName1 == strongName2, "operator ==" );
-			Assert.IsTrue( strongName1 != strongName2, "operator !=" );
-
-			strongName2.TestID = strongName1.TestID;
-			Assert.AreEqual( strongName1, strongName2 );
-			Assert.IsTrue( strongName1 == strongName2, "operator ==" );
-			Assert.IsFalse( strongName1 != strongName2, "operator !=" );
-
-			strongName2.FullName = "A.Different.Name";
-			Assert.AreNotEqual( strongName1, strongName2 );
-			Assert.IsFalse( strongName1 == strongName2, "operator ==" );
-			Assert.IsTrue( strongName1 != strongName2, "operator !=" );
-		}
-
-		[Test]
-		public void CanCompareWeakAndStrongTestNames()
-		{
-			Assert.AreNotEqual( weakName1, strongName1 );
-			Assert.IsFalse( weakName1 == strongName1, "operator ==" );
-			Assert.IsTrue( weakName1 != strongName1, "operator !=" );
-		}
-
-		[Test]
-		public void TestNamesWithDifferentRunnerIDsAreNotEqual()
-		{
-			weakName2.RunnerID = 7;
-			Assert.AreEqual( 0, weakName1.RunnerID );
-			Assert.AreNotEqual( weakName1, weakName2 );
-			Assert.IsFalse( weakName1 == weakName2, "operator ==" );
-			Assert.IsTrue( weakName1 != weakName2, "operator !=" );
-
-			strongName1.RunnerID = 3;
-			strongName2.RunnerID = 5;
-			strongName2.TestID = strongName1.TestID;
-			Assert.AreNotEqual( strongName1, strongName2 );
-			Assert.IsFalse( strongName1 == strongName2, "operator ==" );
-			Assert.IsTrue( strongName1 != strongName2, "operator !=" );
-		}
-
-		[Test]
-		public void ClonedTestNamesAreEqual()
-		{
-			TestName clonedName = (TestName)weakName1.Clone();
-			Assert.AreEqual( weakName1, clonedName );
-			Assert.IsTrue( weakName1 == clonedName, "operator ==" );
-			Assert.IsFalse( weakName1 != clonedName, "operator !=" );
-
-			clonedName = (TestName)strongName1.Clone();
-			Assert.AreEqual( strongName1, clonedName );
-			Assert.IsTrue( strongName1 == clonedName, "operator ==" );
-			Assert.IsFalse( strongName1 != clonedName, "operator !=" );
-		}
-
-		[Test]
-		public void CanDisplayUniqueNames()
-		{
-			Assert.AreEqual( "[0]Name.Of.This.Test", weakName1.UniqueName );
-			Assert.AreEqual( "[0-" + strongName1.TestID.ToString() + "]Name.Of.This.Test", strongName1.UniqueName );
-		}
-
-		[Test]
-		public void CanParseSimpleTestNames()
-		{
-			TestName tn = TestName.Parse( "Name.Of.This.Test" );
-			Assert.AreEqual( "Name.Of.This.Test", tn.FullName );
-		}
-
-		[Test]
-		public void CanParseWeakTestNames()
-		{
-			TestName testName = TestName.Parse( weakName1.UniqueName );
-			Assert.AreEqual( weakName1, testName );
-
-			weakName1.RunnerID = 7;
-			testName = TestName.Parse( weakName1.UniqueName );
-			Assert.AreEqual( weakName1, testName );
-		}
-
-		[Test]
-		public void CanParseStrongTestNames()
-		{
-			TestName testName = TestName.Parse( strongName1.UniqueName );
-			Assert.AreEqual( strongName1, testName );
-
-			strongName1.RunnerID = 7;
-			testName = TestName.Parse( strongName1.UniqueName );
-			Assert.AreEqual( strongName1, testName );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Core.Tests
+{
+	[TestFixture]
+	public class TestNameTests
+	{
+		private TestName weakName1;
+		private TestName weakName2;
+		private TestName strongName1;
+		private TestName strongName2;
+
+		[SetUp]
+		public void CreateTestNames()
+		{
+			weakName1 = new TestName();
+			weakName2 = new TestName();
+			weakName1.FullName = weakName2.FullName = "Name.Of.This.Test";
+
+			strongName1 = new TestName();
+			strongName2 = new TestName();
+			strongName1.FullName = strongName2.FullName = "Name.Of.This.Test";
+			strongName1.TestID = new TestID();
+			strongName2.TestID = new TestID();
+		}
+
+		[Test]
+		public void CanCompareWeakTestNames()
+		{
+			Assert.AreEqual( weakName1, weakName2 );
+			Assert.IsTrue( weakName1 == weakName2, "operator ==");
+			Assert.IsFalse( weakName1 != weakName2, "operator !=");
+
+			weakName2.FullName = "A.Different.Name";
+			Assert.AreNotEqual( weakName1, weakName2 );
+			Assert.IsFalse( weakName1 == weakName2, "operator ==");
+			Assert.IsTrue( weakName1 != weakName2, "operator !=");
+		}
+
+		[Test]
+		public void CanCompareStrongTestNames()
+		{
+			Assert.AreNotEqual( strongName1, strongName2 );
+			Assert.IsFalse( strongName1 == strongName2, "operator ==" );
+			Assert.IsTrue( strongName1 != strongName2, "operator !=" );
+
+			strongName2.TestID = strongName1.TestID;
+			Assert.AreEqual( strongName1, strongName2 );
+			Assert.IsTrue( strongName1 == strongName2, "operator ==" );
+			Assert.IsFalse( strongName1 != strongName2, "operator !=" );
+
+			strongName2.FullName = "A.Different.Name";
+			Assert.AreNotEqual( strongName1, strongName2 );
+			Assert.IsFalse( strongName1 == strongName2, "operator ==" );
+			Assert.IsTrue( strongName1 != strongName2, "operator !=" );
+		}
+
+		[Test]
+		public void CanCompareWeakAndStrongTestNames()
+		{
+			Assert.AreNotEqual( weakName1, strongName1 );
+			Assert.IsFalse( weakName1 == strongName1, "operator ==" );
+			Assert.IsTrue( weakName1 != strongName1, "operator !=" );
+		}
+
+		[Test]
+		public void TestNamesWithDifferentRunnerIDsAreNotEqual()
+		{
+			weakName2.RunnerID = 7;
+			Assert.AreEqual( 0, weakName1.RunnerID );
+			Assert.AreNotEqual( weakName1, weakName2 );
+			Assert.IsFalse( weakName1 == weakName2, "operator ==" );
+			Assert.IsTrue( weakName1 != weakName2, "operator !=" );
+
+			strongName1.RunnerID = 3;
+			strongName2.RunnerID = 5;
+			strongName2.TestID = strongName1.TestID;
+			Assert.AreNotEqual( strongName1, strongName2 );
+			Assert.IsFalse( strongName1 == strongName2, "operator ==" );
+			Assert.IsTrue( strongName1 != strongName2, "operator !=" );
+		}
+
+		[Test]
+		public void ClonedTestNamesAreEqual()
+		{
+			TestName clonedName = (TestName)weakName1.Clone();
+			Assert.AreEqual( weakName1, clonedName );
+			Assert.IsTrue( weakName1 == clonedName, "operator ==" );
+			Assert.IsFalse( weakName1 != clonedName, "operator !=" );
+
+			clonedName = (TestName)strongName1.Clone();
+			Assert.AreEqual( strongName1, clonedName );
+			Assert.IsTrue( strongName1 == clonedName, "operator ==" );
+			Assert.IsFalse( strongName1 != clonedName, "operator !=" );
+		}
+
+		[Test]
+		public void CanDisplayUniqueNames()
+		{
+			Assert.AreEqual( "[0]Name.Of.This.Test", weakName1.UniqueName );
+			Assert.AreEqual( "[0-" + strongName1.TestID.ToString() + "]Name.Of.This.Test", strongName1.UniqueName );
+		}
+
+		[Test]
+		public void CanParseSimpleTestNames()
+		{
+			TestName tn = TestName.Parse( "Name.Of.This.Test" );
+			Assert.AreEqual( "Name.Of.This.Test", tn.FullName );
+		}
+
+		[Test]
+		public void CanParseWeakTestNames()
+		{
+			TestName testName = TestName.Parse( weakName1.UniqueName );
+			Assert.AreEqual( weakName1, testName );
+
+			weakName1.RunnerID = 7;
+			testName = TestName.Parse( weakName1.UniqueName );
+			Assert.AreEqual( weakName1, testName );
+		}
+
+		[Test]
+		public void CanParseStrongTestNames()
+		{
+			TestName testName = TestName.Parse( strongName1.UniqueName );
+			Assert.AreEqual( strongName1, testName );
+
+			strongName1.RunnerID = 7;
+			testName = TestName.Parse( strongName1.UniqueName );
+			Assert.AreEqual( strongName1, testName );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestNodeTests.cs b/src/NUnitCore/tests/TestNodeTests.cs
index 4324a9a..9afce80 100644
--- a/src/NUnitCore/tests/TestNodeTests.cs
+++ b/src/NUnitCore/tests/TestNodeTests.cs
@@ -1,86 +1,86 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Tests.Assemblies;
-using NUnit.Core.Builders;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// TestNode construction tests. Does not repeat tests
-	/// for the TestInfo base class.
-	/// </summary>
-	[TestFixture]	
-	public class TestNodeTests
-	{
-		TestSuite testSuite;
-		TestSuite testFixture;
-		Test testCase1;
-
-		[SetUp]
-		public void SetUp()
-		{
-			testSuite = new TestSuite("MyTestSuite");
-			testFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
-			testSuite.Add( testFixture );
-
-			testCase1 = (Test)testFixture.Tests[0];
-		}
-
-		[Test]
-		public void ConstructFromSuite()
-		{
-			TestNode test = new TestNode( testSuite );
-			Assert.IsNotNull( test.Tests );
-			Assert.AreEqual( test.TestCount, CountTests( test ) );
-			Assert.AreSame( test, ((TestNode)test.Tests[0]).Parent );
-		}
-
-		private int CountTests( TestNode node )
-		{
-			if ( !node.IsSuite )
-				return 1;
-
-			int count = 0;
-			if ( node.Tests != null )
-				foreach( TestNode child in node.Tests )
-					count += CountTests( child );
-				
-			return count;
-		}
-
-		[Test]
-		public void ConstructFromTestCase()
-		{
-			TestNode test = new TestNode( testCase1 );
-			Assert.IsNull( test.Tests );
-		}
-
-		[Test]
-		public void ConstructFromMultipleTests()
-		{
-			ITest[] tests = new ITest[testFixture.Tests.Count];
-			for( int index = 0; index < tests.Length; index++ )
-				tests[index] = (ITest)testFixture.Tests[index];
-
-			TestName testName = new TestName();
-			testName.FullName = testName.Name = "Combined";
-			testName.TestID = new TestID( 1000 );
-			TestNode test = new TestNode( testName, tests );
-			Assert.AreEqual( "Combined", test.TestName.Name );
-			Assert.AreEqual( "Combined", test.TestName.FullName );
-			Assert.AreEqual( RunState.Runnable, test.RunState );
-			Assert.IsTrue( test.IsSuite, "IsSuite" );
-			Assert.AreEqual( tests.Length, test.Tests.Count );
-			Assert.AreEqual( MockTestFixture.Tests, test.TestCount );
-			Assert.AreEqual( 0, test.Categories.Count, "Categories");
-			Assert.AreNotEqual( testFixture.TestName.Name, test.TestName.Name, "TestName" );
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Tests.Assemblies;
+using NUnit.Core.Builders;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// TestNode construction tests. Does not repeat tests
+	/// for the TestInfo base class.
+	/// </summary>
+	[TestFixture]	
+	public class TestNodeTests
+	{
+		TestSuite testSuite;
+		TestSuite testFixture;
+		Test testCase1;
+
+		[SetUp]
+		public void SetUp()
+		{
+			testSuite = new TestSuite("MyTestSuite");
+			testFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
+			testSuite.Add( testFixture );
+
+			testCase1 = (Test)testFixture.Tests[0];
+		}
+
+		[Test]
+		public void ConstructFromSuite()
+		{
+			TestNode test = new TestNode( testSuite );
+			Assert.IsNotNull( test.Tests );
+			Assert.AreEqual( test.TestCount, CountTests( test ) );
+			Assert.AreSame( test, ((TestNode)test.Tests[0]).Parent );
+		}
+
+		private int CountTests( TestNode node )
+		{
+			if ( !node.IsSuite )
+				return 1;
+
+			int count = 0;
+			if ( node.Tests != null )
+				foreach( TestNode child in node.Tests )
+					count += CountTests( child );
+				
+			return count;
+		}
+
+		[Test]
+		public void ConstructFromTestCase()
+		{
+			TestNode test = new TestNode( testCase1 );
+			Assert.IsNull( test.Tests );
+		}
+
+		[Test]
+		public void ConstructFromMultipleTests()
+		{
+			ITest[] tests = new ITest[testFixture.Tests.Count];
+			for( int index = 0; index < tests.Length; index++ )
+				tests[index] = (ITest)testFixture.Tests[index];
+
+			TestName testName = new TestName();
+			testName.FullName = testName.Name = "Combined";
+			testName.TestID = new TestID( 1000 );
+			TestNode test = new TestNode( testName, tests );
+			Assert.AreEqual( "Combined", test.TestName.Name );
+			Assert.AreEqual( "Combined", test.TestName.FullName );
+			Assert.AreEqual( RunState.Runnable, test.RunState );
+			Assert.IsTrue( test.IsSuite, "IsSuite" );
+			Assert.AreEqual( tests.Length, test.Tests.Count );
+			Assert.AreEqual( MockTestFixture.Tests, test.TestCount );
+			Assert.AreEqual( 0, test.Categories.Count, "Categories");
+			Assert.AreNotEqual( testFixture.TestName.Name, test.TestName.Name, "TestName" );
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TestRunnerThreadTests.cs b/src/NUnitCore/tests/TestRunnerThreadTests.cs
index 8570324..ba74e07 100644
--- a/src/NUnitCore/tests/TestRunnerThreadTests.cs
+++ b/src/NUnitCore/tests/TestRunnerThreadTests.cs
@@ -1,65 +1,65 @@
-// ****************************************************************
-// Copyright 2007, 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.Threading;
-using NSubstitute;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Core.Filters;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
-	public class TestRunnerThreadTests
-	{
-		private TestRunner mockRunner;
-		private TestRunnerThread runnerThread;
-        private EventListener listener;
-
-		[SetUp]
-		public void CreateRunnerThread()
-		{
-            mockRunner = Substitute.For<TestRunner>();
-			runnerThread = new TestRunnerThread( mockRunner, ApartmentState.Unknown, ThreadPriority.Normal );
-            listener = NullListener.NULL;
-		}
-
-		[Test]
-		public void RunTestSuite()
-		{
-			runnerThread.StartRun(listener, TestFilter.Empty, false, LoggingThreshold.Off);
-			runnerThread.Wait();
-
-            mockRunner.Received().Run(listener, TestFilter.Empty, false, LoggingThreshold.Off);
-		}
-
-        [Test]
-        public void RunNamedTest()
-        {
-            runnerThread.StartRun(listener, new NameFilter(TestName.Parse("SomeTest")), false, LoggingThreshold.Off);
-            runnerThread.Wait();
-
-            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"));
-
-            runnerThread.StartRun(listener, filter, false, LoggingThreshold.Off);
-            runnerThread.Wait();
-
-            mockRunner.Received().Run(listener, filter, false, LoggingThreshold.Off);
-        }
-	}
-}
-#endif
+// ****************************************************************
+// Copyright 2007, 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 || NET_4_5
+using System;
+using System.Threading;
+using NSubstitute;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Core.Filters;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture, Platform("Net-3.5,Mono-3.5,Net-4.0")]
+	public class TestRunnerThreadTests
+	{
+		private TestRunner mockRunner;
+		private TestRunnerThread runnerThread;
+        private EventListener listener;
+
+		[SetUp]
+		public void CreateRunnerThread()
+		{
+            mockRunner = Substitute.For<TestRunner>();
+			runnerThread = new TestRunnerThread( mockRunner, ApartmentState.Unknown, ThreadPriority.Normal );
+            listener = NullListener.NULL;
+		}
+
+		[Test]
+		public void RunTestSuite()
+		{
+			runnerThread.StartRun(listener, TestFilter.Empty, false, LoggingThreshold.Off);
+			runnerThread.Wait();
+
+            mockRunner.Received().Run(listener, TestFilter.Empty, false, LoggingThreshold.Off);
+		}
+
+        [Test]
+        public void RunNamedTest()
+        {
+            runnerThread.StartRun(listener, new NameFilter(TestName.Parse("SomeTest")), false, LoggingThreshold.Off);
+            runnerThread.Wait();
+
+            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"));
+
+            runnerThread.StartRun(listener, filter, false, LoggingThreshold.Off);
+            runnerThread.Wait();
+
+            mockRunner.Received().Run(listener, filter, false, LoggingThreshold.Off);
+        }
+	}
+}
+#endif
diff --git a/src/NUnitCore/tests/TestSuiteTest.cs b/src/NUnitCore/tests/TestSuiteTest.cs
index 890714f..5e9dbd7 100644
--- a/src/NUnitCore/tests/TestSuiteTest.cs
+++ b/src/NUnitCore/tests/TestSuiteTest.cs
@@ -1,335 +1,335 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Core.Builders;
-using NUnit.Util;
-using NUnit.Tests.Assemblies;
-using System.Collections;
-using NUnit.Core.Filters;
-using NUnit.TestUtilities;
-using NUnit.TestData;
-
-namespace NUnit.Core.Tests
-{
-	[TestFixture]
-	public class TestSuiteTest
-	{
-		TestSuite mockTestFixture;
-		TestSuite noTestSuite;
-
-		[SetUp]
-		public void SetUp()
-		{
-			mockTestFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
-			TestSuite noTestFixture = TestBuilder.MakeFixture( typeof( EmptyFixture ) );
-
-			noTestSuite = new TestSuite("No Tests");
-			noTestSuite.Add( noTestFixture);
-		}
-
-		[Test]
-		public void RunTestsInFixture()
-		{
-            TestResult result = mockTestFixture.Run(NullListener.NULL, TestFilter.Empty);
-			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun" );
-            Assert.AreEqual( MockTestFixture.NotRunnable, summarizer.NotRunnable, "NotRunnable");
-            Assert.AreEqual(MockTestFixture.Ignored, summarizer.Ignored, "Ignored");
-            Assert.AreEqual(MockTestFixture.Errors, summarizer.Errors, "Errors");
-            Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
-
-			result = TestFinder.Find( "ExplicitlyRunTest", result, true );
-			Assert.IsNull( result, "ExplicitlyRunTest should not be in results" );
-
-			// TODO: Decide if we want to include Explicit tests that are not run in results
-			//			Assert.IsNotNull( result, "Cannot find ExplicitlyRunTest result" );
-			//			Assert.IsFalse( result.Executed, "ExplicitlyRunTest should not be executed" );
-			//			Assert.AreEqual( "Explicit selection required", result.Message );
-		}
-
-		[Test]
-		public void RunExplicitTestDirectly()
-		{
-			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture, true );
-			Assert.IsNotNull( test, "Cannot find ExplicitlyRunTest" );
-			Assert.AreEqual( RunState.Explicit, test.RunState );
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 1, summarizer.TestsRun );
-		}
-
-		[Test]
-		public void RunExplicitTestByName()
-		{
-			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture, true );
-			Assert.IsNotNull( test, "Cannot find ExplicitlyRunTest" );
-			Assert.AreEqual( RunState.Explicit, test.RunState );
-
-			NameFilter filter = new NameFilter( test.TestName );
-			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
-			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 1, summarizer.TestsRun );
-		}
-
-		[Test]
-		public void RunExplicitTestByCategory()
-		{
-			CategoryFilter filter = new CategoryFilter( "Special" );
-			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
-			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( 1, summarizer.TestsRun );
-		}
-
-		[Test]
-		public void ExcludingCategoryDoesNotRunExplicitTestCases()
-		{
-			NotFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
-            filter.TopLevel = true;
-			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
-			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( MockTestFixture.TestsRun - MockTestFixture.MockCategoryTests, summarizer.TestsRun );
-		}
-
-		[Test]
-		public void ExcludingCategoryDoesNotRunExplicitTestFixtures()
-		{
-			NotFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
-            filter.TopLevel = true;
-			TestAssemblyBuilder builder = new TestAssemblyBuilder();
-			TestSuite suite = builder.Build( MockAssembly.AssemblyPath, true );
-			TestResult result = suite.Run( NullListener.NULL, filter );
-			ResultSummarizer summarizer = new ResultSummarizer( result );
-			Assert.AreEqual( MockAssembly.TestsRun - 2, summarizer.TestsRun );
-		}
-
-		[Test]
-		public void InheritedTestCount()
-		{
-			TestSuite suite = TestBuilder.MakeFixture( typeof( InheritedTestFixture ) );
-			Assert.AreEqual(InheritedTestFixture.Tests, suite.TestCount);
-		}
-
-		[Test]
-		public void SuiteRunInitialized()
-		{
-			Assert.AreEqual( RunState.Runnable, mockTestFixture.RunState );
-		}
-
-		[Test]
-		public void SuiteWithNoTests()
-		{
-			IList tests = noTestSuite.Tests;
-			Assert.AreEqual(1, tests.Count);
-			TestSuite testSuite = (TestSuite)tests[0];
-
-            // NOTE: Beginning with NUnit 2.5.3, a suite with no tests is now runnable
-			Assert.AreEqual( RunState.Runnable, testSuite.RunState );
-			//Assert.AreEqual(testSuite.TestName.Name + " does not have any tests", testSuite.IgnoreReason);
-		}
-
-		[Test]
-		public void RunNoTestSuite()
-		{
-			Assert.AreEqual(0, noTestSuite.TestCount);
-
-            TestResult result = noTestSuite.Run(NullListener.NULL, TestFilter.Empty);
-
-			ResultSummarizer summarizer = new ResultSummarizer(result);
-			Assert.AreEqual(0, summarizer.TestsRun);
-			Assert.AreEqual(0, summarizer.TestsNotRun);
-		}
-
-		[Test]
-		public void RunTestByName() 
-		{
-			TestSuite testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add(mockTestFixture);
-
-			Assert.IsNull(testSuite.Parent);
-			Test firstTest = (Test)testSuite.Tests[0];
-			Assert.AreEqual(testSuite, firstTest.Parent);
-			Test bottom = (Test)firstTest.Tests[2];
-			
-			RecordingListener listener = new RecordingListener();
-			NameFilter filter = new NameFilter(bottom.TestName);
-			testSuite.Run(listener, filter);
-			Assert.AreEqual(1, listener.testStarted.Count);
-			Assert.AreEqual("MockTest3", (string)listener.testStarted[0]);
-		}
-
-		[Test]
-		public void RunSuiteByName() 
-		{
-			TestSuite testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add(mockTestFixture);
-			
-			RecordingListener listener = new RecordingListener();
-            testSuite.Run(listener, TestFilter.Empty);
-
-			Assert.AreEqual(MockTestFixture.ResultCount, listener.testStarted.Count);
-			Assert.AreEqual(2, listener.suiteStarted.Count);
-		}
-
-		[Test]
-		public void CountTestCasesFilteredByName() 
-		{
-			TestSuite testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add(mockTestFixture);
-			Assert.AreEqual(MockTestFixture.Tests, testSuite.TestCount);
-			
-			Test mock3 = TestFinder.Find("MockTest3", testSuite, true);
-			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
-			NameFilter filter = new NameFilter(mock3.TestName);
-			Assert.AreEqual(1, testSuite.CountTestCases(filter));
-
-			filter = new NameFilter();
-			filter.Add(mock3.TestName);
-			filter.Add(mock1.TestName);
-
-			Assert.AreEqual(2, testSuite.CountTestCases(filter));
-
-			filter = new NameFilter(testSuite.TestName);
-
-			Assert.AreEqual(MockTestFixture.ResultCount, testSuite.CountTestCases(filter));
-		}
-
-		[Test]
-		public void RunTestByCategory()
-		{
-			TestSuite testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add(mockTestFixture);
-
-			CategoryFilter filter = new CategoryFilter();
-			filter.AddCategory("MockCategory");
-			RecordingListener listener = new RecordingListener();
-			testSuite.Run(listener, filter);
-			CollectionAssert.AreEquivalent(
-				new string[] { "MockTest2", "MockTest3" },
-				listener.testStarted );
-		}
-
-		[Test]
-		public void RunTestExcludingCategory()
-		{
-			TestSuite testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add(mockTestFixture);
-
-			CategoryFilter filter = new CategoryFilter();
-			filter.AddCategory("MockCategory");
-			RecordingListener listener = new RecordingListener();
-            NotFilter notFilter = new NotFilter(filter);
-            notFilter.TopLevel = true;
-			testSuite.Run(listener, notFilter);
-			CollectionAssert.AreEquivalent( 
-				new string[] { "MockTest1", "MockTest4", "MockTest5", 
-                    "TestWithManyProperties", "NotRunnableTest", "FailingTest", 
-                    "TestWithException", "InconclusiveTest" },
-				listener.testStarted );
-		}
-
-		[Test]
-		public void RunSuiteByCategory() 
-		{
-			TestSuite testSuite = new TestSuite("Mock Test Suite");
-			testSuite.Add(mockTestFixture);
-
-			CategoryFilter filter = new CategoryFilter();
-			filter.AddCategory("FixtureCategory");
-			RecordingListener listener = new RecordingListener();
-			testSuite.Run(listener, filter);
-			Assert.AreEqual(MockTestFixture.ResultCount, listener.testStarted.Count);
-		}
-
-		[Test]
-		public void RunSingleTest()
-		{
-			TestSuite fixture = TestBuilder.MakeFixture( typeof( NUnit.Tests.Assemblies.MockTestFixture ) );
-			Test test = (Test) fixture.Tests[0];
-			RecordingListener listener = new RecordingListener();
-			test.Run(listener, null);
-			Assert.IsFalse(listener.lastResult.IsFailure);
-		}
-
-		[Test]
-		public void DefaultSortIsByName()
-		{
-			mockTestFixture.Sort();
-			Assert.AreEqual( "ExplicitlyRunTest", ((Test)mockTestFixture.Tests[0]).TestName.Name );
-		}
-
-		[Test]
-		public void CanSortUsingExternalComparer()
-		{
-			IComparer comparer = new ReverseSortComparer();
-			mockTestFixture.Sort(comparer);
-			Assert.AreEqual( "TestWithManyProperties", ((Test)mockTestFixture.Tests[0]).TestName.Name );
-		}
-
-		private class ReverseSortComparer : IComparer
-		{
-			public int Compare(object t1, object t2)
-			{
-				int result = Comparer.Default.Compare( t1, t2 );
-				return -result;
-			}
-		}
-
-	}
-
-	[Serializable]
-	public class RecordingListener : EventListener
-	{
-		public ArrayList testStarted = new ArrayList();
-		public ArrayList testFinished = new ArrayList();
-		public ArrayList suiteStarted = new ArrayList();
-		public ArrayList suiteFinished = new ArrayList();
-
-		public TestResult lastResult = null;
-
-		public void RunStarted(string name, int testCount)
-		{
-		}
-
-		public void RunFinished(NUnit.Core.TestResult result)
-		{
-		}
-
-		public void RunFinished(Exception exception)
-		{
-		}
-
-		public void TestStarted(TestName testName) 
-		{
-			testStarted.Add(testName.Name);
-		}
-			
-		public void TestFinished(TestResult result)
-		{
-			testFinished.Add(result.Name);
-			lastResult = result;
-		}
-
-		public void SuiteStarted(TestName suiteName)
-		{
-			suiteStarted.Add(suiteName.Name);
-		}
-
-		public void SuiteFinished(TestResult result)
-		{
-			suiteFinished.Add(result.Name);
-		}
-
-		public void UnhandledException(Exception exception )
-		{
-		}
-
-		public void TestOutput(TestOutput testOutput)
-		{
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Core.Builders;
+using NUnit.Util;
+using NUnit.Tests.Assemblies;
+using System.Collections;
+using NUnit.Core.Filters;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+	[TestFixture]
+	public class TestSuiteTest
+	{
+		TestSuite mockTestFixture;
+		TestSuite noTestSuite;
+
+		[SetUp]
+		public void SetUp()
+		{
+			mockTestFixture = TestBuilder.MakeFixture( typeof( MockTestFixture ) );
+			TestSuite noTestFixture = TestBuilder.MakeFixture( typeof( EmptyFixture ) );
+
+			noTestSuite = new TestSuite("No Tests");
+			noTestSuite.Add( noTestFixture);
+		}
+
+		[Test]
+		public void RunTestsInFixture()
+		{
+            TestResult result = mockTestFixture.Run(NullListener.NULL, TestFilter.Empty);
+			ResultSummarizer summarizer = new ResultSummarizer( result );
+			Assert.AreEqual( MockTestFixture.TestsRun, summarizer.TestsRun, "TestsRun" );
+            Assert.AreEqual( MockTestFixture.NotRunnable, summarizer.NotRunnable, "NotRunnable");
+            Assert.AreEqual(MockTestFixture.Ignored, summarizer.Ignored, "Ignored");
+            Assert.AreEqual(MockTestFixture.Errors, summarizer.Errors, "Errors");
+            Assert.AreEqual(MockTestFixture.Failures, summarizer.Failures, "Failures");
+
+			result = TestFinder.Find( "ExplicitlyRunTest", result, true );
+			Assert.IsNull( result, "ExplicitlyRunTest should not be in results" );
+
+			// TODO: Decide if we want to include Explicit tests that are not run in results
+			//			Assert.IsNotNull( result, "Cannot find ExplicitlyRunTest result" );
+			//			Assert.IsFalse( result.Executed, "ExplicitlyRunTest should not be executed" );
+			//			Assert.AreEqual( "Explicit selection required", result.Message );
+		}
+
+		[Test]
+		public void RunExplicitTestDirectly()
+		{
+			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture, true );
+			Assert.IsNotNull( test, "Cannot find ExplicitlyRunTest" );
+			Assert.AreEqual( RunState.Explicit, test.RunState );
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+			ResultSummarizer summarizer = new ResultSummarizer( result );
+			Assert.AreEqual( 1, summarizer.TestsRun );
+		}
+
+		[Test]
+		public void RunExplicitTestByName()
+		{
+			Test test = TestFinder.Find( "ExplicitlyRunTest", mockTestFixture, true );
+			Assert.IsNotNull( test, "Cannot find ExplicitlyRunTest" );
+			Assert.AreEqual( RunState.Explicit, test.RunState );
+
+			NameFilter filter = new NameFilter( test.TestName );
+			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
+			ResultSummarizer summarizer = new ResultSummarizer( result );
+			Assert.AreEqual( 1, summarizer.TestsRun );
+		}
+
+		[Test]
+		public void RunExplicitTestByCategory()
+		{
+			CategoryFilter filter = new CategoryFilter( "Special" );
+			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
+			ResultSummarizer summarizer = new ResultSummarizer( result );
+			Assert.AreEqual( 1, summarizer.TestsRun );
+		}
+
+		[Test]
+		public void ExcludingCategoryDoesNotRunExplicitTestCases()
+		{
+			NotFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
+            filter.TopLevel = true;
+			TestResult result = mockTestFixture.Run( NullListener.NULL, filter );
+			ResultSummarizer summarizer = new ResultSummarizer( result );
+			Assert.AreEqual( MockTestFixture.TestsRun - MockTestFixture.MockCategoryTests, summarizer.TestsRun );
+		}
+
+		[Test]
+		public void ExcludingCategoryDoesNotRunExplicitTestFixtures()
+		{
+			NotFilter filter = new NotFilter( new CategoryFilter( "MockCategory" ) );
+            filter.TopLevel = true;
+			TestAssemblyBuilder builder = new TestAssemblyBuilder();
+			TestSuite suite = builder.Build( MockAssembly.AssemblyPath, true );
+			TestResult result = suite.Run( NullListener.NULL, filter );
+			ResultSummarizer summarizer = new ResultSummarizer( result );
+			Assert.AreEqual( MockAssembly.TestsRun - 2, summarizer.TestsRun );
+		}
+
+		[Test]
+		public void InheritedTestCount()
+		{
+			TestSuite suite = TestBuilder.MakeFixture( typeof( InheritedTestFixture ) );
+			Assert.AreEqual(InheritedTestFixture.Tests, suite.TestCount);
+		}
+
+		[Test]
+		public void SuiteRunInitialized()
+		{
+			Assert.AreEqual( RunState.Runnable, mockTestFixture.RunState );
+		}
+
+		[Test]
+		public void SuiteWithNoTests()
+		{
+			IList tests = noTestSuite.Tests;
+			Assert.AreEqual(1, tests.Count);
+			TestSuite testSuite = (TestSuite)tests[0];
+
+            // NOTE: Beginning with NUnit 2.5.3, a suite with no tests is now runnable
+			Assert.AreEqual( RunState.Runnable, testSuite.RunState );
+			//Assert.AreEqual(testSuite.TestName.Name + " does not have any tests", testSuite.IgnoreReason);
+		}
+
+		[Test]
+		public void RunNoTestSuite()
+		{
+			Assert.AreEqual(0, noTestSuite.TestCount);
+
+            TestResult result = noTestSuite.Run(NullListener.NULL, TestFilter.Empty);
+
+			ResultSummarizer summarizer = new ResultSummarizer(result);
+			Assert.AreEqual(0, summarizer.TestsRun);
+			Assert.AreEqual(0, summarizer.TestsNotRun);
+		}
+
+		[Test]
+		public void RunTestByName() 
+		{
+			TestSuite testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add(mockTestFixture);
+
+			Assert.IsNull(testSuite.Parent);
+			Test firstTest = (Test)testSuite.Tests[0];
+			Assert.AreEqual(testSuite, firstTest.Parent);
+			Test bottom = (Test)firstTest.Tests[2];
+			
+			RecordingListener listener = new RecordingListener();
+			NameFilter filter = new NameFilter(bottom.TestName);
+			testSuite.Run(listener, filter);
+			Assert.AreEqual(1, listener.testStarted.Count);
+			Assert.AreEqual("MockTest3", (string)listener.testStarted[0]);
+		}
+
+		[Test]
+		public void RunSuiteByName() 
+		{
+			TestSuite testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add(mockTestFixture);
+			
+			RecordingListener listener = new RecordingListener();
+            testSuite.Run(listener, TestFilter.Empty);
+
+			Assert.AreEqual(MockTestFixture.ResultCount, listener.testStarted.Count);
+			Assert.AreEqual(2, listener.suiteStarted.Count);
+		}
+
+		[Test]
+		public void CountTestCasesFilteredByName() 
+		{
+			TestSuite testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add(mockTestFixture);
+			Assert.AreEqual(MockTestFixture.Tests, testSuite.TestCount);
+			
+			Test mock3 = TestFinder.Find("MockTest3", testSuite, true);
+			Test mock1 = TestFinder.Find("MockTest1", testSuite, true);
+			NameFilter filter = new NameFilter(mock3.TestName);
+			Assert.AreEqual(1, testSuite.CountTestCases(filter));
+
+			filter = new NameFilter();
+			filter.Add(mock3.TestName);
+			filter.Add(mock1.TestName);
+
+			Assert.AreEqual(2, testSuite.CountTestCases(filter));
+
+			filter = new NameFilter(testSuite.TestName);
+
+			Assert.AreEqual(MockTestFixture.ResultCount, testSuite.CountTestCases(filter));
+		}
+
+		[Test]
+		public void RunTestByCategory()
+		{
+			TestSuite testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add(mockTestFixture);
+
+			CategoryFilter filter = new CategoryFilter();
+			filter.AddCategory("MockCategory");
+			RecordingListener listener = new RecordingListener();
+			testSuite.Run(listener, filter);
+			CollectionAssert.AreEquivalent(
+				new string[] { "MockTest2", "MockTest3" },
+				listener.testStarted );
+		}
+
+		[Test]
+		public void RunTestExcludingCategory()
+		{
+			TestSuite testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add(mockTestFixture);
+
+			CategoryFilter filter = new CategoryFilter();
+			filter.AddCategory("MockCategory");
+			RecordingListener listener = new RecordingListener();
+            NotFilter notFilter = new NotFilter(filter);
+            notFilter.TopLevel = true;
+			testSuite.Run(listener, notFilter);
+			CollectionAssert.AreEquivalent( 
+				new string[] { "MockTest1", "MockTest4", "MockTest5", 
+                    "TestWithManyProperties", "NotRunnableTest", "FailingTest", 
+                    "TestWithException", "InconclusiveTest" },
+				listener.testStarted );
+		}
+
+		[Test]
+		public void RunSuiteByCategory() 
+		{
+			TestSuite testSuite = new TestSuite("Mock Test Suite");
+			testSuite.Add(mockTestFixture);
+
+			CategoryFilter filter = new CategoryFilter();
+			filter.AddCategory("FixtureCategory");
+			RecordingListener listener = new RecordingListener();
+			testSuite.Run(listener, filter);
+			Assert.AreEqual(MockTestFixture.ResultCount, listener.testStarted.Count);
+		}
+
+		[Test]
+		public void RunSingleTest()
+		{
+			TestSuite fixture = TestBuilder.MakeFixture( typeof( NUnit.Tests.Assemblies.MockTestFixture ) );
+			Test test = (Test) fixture.Tests[0];
+			RecordingListener listener = new RecordingListener();
+			test.Run(listener, null);
+			Assert.IsFalse(listener.lastResult.IsFailure);
+		}
+
+		[Test]
+		public void DefaultSortIsByName()
+		{
+			mockTestFixture.Sort();
+			Assert.AreEqual( "ExplicitlyRunTest", ((Test)mockTestFixture.Tests[0]).TestName.Name );
+		}
+
+		[Test]
+		public void CanSortUsingExternalComparer()
+		{
+			IComparer comparer = new ReverseSortComparer();
+			mockTestFixture.Sort(comparer);
+			Assert.AreEqual( "TestWithManyProperties", ((Test)mockTestFixture.Tests[0]).TestName.Name );
+		}
+
+		private class ReverseSortComparer : IComparer
+		{
+			public int Compare(object t1, object t2)
+			{
+				int result = Comparer.Default.Compare( t1, t2 );
+				return -result;
+			}
+		}
+
+	}
+
+	[Serializable]
+	public class RecordingListener : EventListener
+	{
+		public ArrayList testStarted = new ArrayList();
+		public ArrayList testFinished = new ArrayList();
+		public ArrayList suiteStarted = new ArrayList();
+		public ArrayList suiteFinished = new ArrayList();
+
+		public TestResult lastResult = null;
+
+		public void RunStarted(string name, int testCount)
+		{
+		}
+
+		public void RunFinished(NUnit.Core.TestResult result)
+		{
+		}
+
+		public void RunFinished(Exception exception)
+		{
+		}
+
+		public void TestStarted(TestName testName) 
+		{
+			testStarted.Add(testName.Name);
+		}
+			
+		public void TestFinished(TestResult result)
+		{
+			testFinished.Add(result.Name);
+			lastResult = result;
+		}
+
+		public void SuiteStarted(TestName suiteName)
+		{
+			suiteStarted.Add(suiteName.Name);
+		}
+
+		public void SuiteFinished(TestResult result)
+		{
+			suiteFinished.Add(result.Name);
+		}
+
+		public void UnhandledException(Exception exception )
+		{
+		}
+
+		public void TestOutput(TestOutput testOutput)
+		{
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/TheoryTests.cs b/src/NUnitCore/tests/TheoryTests.cs
index 246e31f..e6ff652 100644
--- a/src/NUnitCore/tests/TheoryTests.cs
+++ b/src/NUnitCore/tests/TheoryTests.cs
@@ -1,134 +1,134 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.TestData;
-
-namespace NUnit.Core.Tests
-{
-    public class TheoryTests
-    {
-        static Type fixtureType = typeof(TheoryFixture);
-
-        [Test]
-        public void TheoryWithNoArgumentsIsTreatedAsTest()
-        {
-            TestAssert.IsRunnable(fixtureType, "TheoryWithNoArguments");
-        }
-
-        [Test]
-        public void TheoryWithNoDatapointsIsNotRunnable()
-        {
-            TestAssert.IsNotRunnable(fixtureType, "TheoryWithArgumentsButNoDatapoints");
-        }
-
-        [Test]
-        public void BooleanArgumentsAreSuppliedAutomatically()
-        {
-            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithBooleanArguments");
-            TestAssert.IsRunnable(test);
-            Assert.That(test.TestCount, Is.EqualTo(4));
-        }
-
-        [Theory]
-        public void NullDatapointIsOK(object o)
-        {
-        }
-
-        [Datapoint]
-        internal object objData = null;
-
-        [Test]
-        public void EnumArgumentsAreSuppliedAutomatically()
-        {
-            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithEnumAsArgument");
-            TestAssert.IsRunnable(test);
-            Assert.That(test.TestCount, Is.EqualTo(3));
-        }
-
-        [Test]
-        public void TheoryWithDatapointsIsRunnable()
-        {
-            Test test = TestBuilder.MakeTestCase(fixtureType, "TheoryWithArgumentsAndDatapoints");
-            TestAssert.IsRunnable(test);
-            Assert.That(test.TestCount, Is.EqualTo(9));
-        }
-
-        [Theory]
-        public void SquareRootWithAllGoodValues(
-            [Values(12.0, 4.0, 9.0)] double d)
-        {
-            SquareRootTest(d);
-        }
-
-        [Theory]
-        public void SquareRootWithOneBadValue(
-            [Values(12.0, -4.0, 9.0)] double d)
-        {
-            SquareRootTest(d);
-        }
-
-        [Datapoints]
-        internal string[] vals = new string[] { "xyz1", "xyz2", "xyz3" };
-
-        [Theory]
-        public void ArrayWithDatapointsAttributeIsUsed(string s)
-        {
-            Assert.That(s.StartsWith("xyz"));
-        }
-
-        //[Datapoint]
-        //public double[,] Array2X2 = new double[,] { { 1, 0 }, { 0, 1 } };
-
-        //[Theory]
-        //public void TestForArbitraryArray<T>(T[,] array)
-        //{
-        //}
-
-
-        private void SquareRootTest(double d)
-        {
-            Assume.That(d > 0);
-            double root = Math.Sqrt(d);
-            Assert.That(root * root, Is.EqualTo(d).Within(0.000001));
-            Assert.That(root > 0);
-        }
-
-        [Test]
-        public void SimpleTestIgnoresDataPoints()
-        {
-            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithArguments");
-            Assert.That(test.TestCount, Is.EqualTo(2));
-        }
-
-        [Theory]
-        public void TheoryFailsIfAllTestsAreInconclusive()
-        {
-            TestResult result = TestBuilder.RunTestCase(fixtureType, "TestWithAllBadValues");
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Message, Is.EqualTo("All test cases were inconclusive"));
-        }
-
-        public class SqrtTests_DisplayResults
-        {
-            [Datapoints]
-            public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
-
-            [Theory]
-            public void SqrtTimesItselfGivesOriginal(double num)
-            {
-                Assume.That(num >= 0.0 && num < double.MaxValue);
-
-                double sqrt = Math.Sqrt(num);
-
-                Assert.That(sqrt >= 0.0);
-                Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+    public class TheoryTests
+    {
+        static Type fixtureType = typeof(TheoryFixture);
+
+        [Test]
+        public void TheoryWithNoArgumentsIsTreatedAsTest()
+        {
+            TestAssert.IsRunnable(fixtureType, "TheoryWithNoArguments");
+        }
+
+        [Test]
+        public void TheoryWithNoDatapointsIsNotRunnable()
+        {
+            TestAssert.IsNotRunnable(fixtureType, "TheoryWithArgumentsButNoDatapoints");
+        }
+
+        [Test]
+        public void BooleanArgumentsAreSuppliedAutomatically()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithBooleanArguments");
+            TestAssert.IsRunnable(test);
+            Assert.That(test.TestCount, Is.EqualTo(4));
+        }
+
+        [Theory]
+        public void NullDatapointIsOK(object o)
+        {
+        }
+
+        [Datapoint]
+        internal object objData = null;
+
+        [Test]
+        public void EnumArgumentsAreSuppliedAutomatically()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithEnumAsArgument");
+            TestAssert.IsRunnable(test);
+            Assert.That(test.TestCount, Is.EqualTo(3));
+        }
+
+        [Test]
+        public void TheoryWithDatapointsIsRunnable()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TheoryWithArgumentsAndDatapoints");
+            TestAssert.IsRunnable(test);
+            Assert.That(test.TestCount, Is.EqualTo(9));
+        }
+
+        [Theory]
+        public void SquareRootWithAllGoodValues(
+            [Values(12.0, 4.0, 9.0)] double d)
+        {
+            SquareRootTest(d);
+        }
+
+        [Theory]
+        public void SquareRootWithOneBadValue(
+            [Values(12.0, -4.0, 9.0)] double d)
+        {
+            SquareRootTest(d);
+        }
+
+        [Datapoints]
+        internal string[] vals = new string[] { "xyz1", "xyz2", "xyz3" };
+
+        [Theory]
+        public void ArrayWithDatapointsAttributeIsUsed(string s)
+        {
+            Assert.That(s.StartsWith("xyz"));
+        }
+
+        //[Datapoint]
+        //public double[,] Array2X2 = new double[,] { { 1, 0 }, { 0, 1 } };
+
+        //[Theory]
+        //public void TestForArbitraryArray<T>(T[,] array)
+        //{
+        //}
+
+
+        private void SquareRootTest(double d)
+        {
+            Assume.That(d > 0);
+            double root = Math.Sqrt(d);
+            Assert.That(root * root, Is.EqualTo(d).Within(0.000001));
+            Assert.That(root > 0);
+        }
+
+        [Test]
+        public void SimpleTestIgnoresDataPoints()
+        {
+            Test test = TestBuilder.MakeTestCase(fixtureType, "TestWithArguments");
+            Assert.That(test.TestCount, Is.EqualTo(2));
+        }
+
+        [Theory]
+        public void TheoryFailsIfAllTestsAreInconclusive()
+        {
+            TestResult result = TestBuilder.RunTestCase(fixtureType, "TestWithAllBadValues");
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            Assert.That(result.Message, Is.EqualTo("All test cases were inconclusive"));
+        }
+
+        public class SqrtTests_DisplayResults
+        {
+            [Datapoints]
+            public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+
+            [Theory]
+            public void SqrtTimesItselfGivesOriginal(double num)
+            {
+                Assume.That(num >= 0.0 && num < double.MaxValue);
+
+                double sqrt = Math.Sqrt(num);
+
+                Assert.That(sqrt >= 0.0);
+                Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/ThreadedTestRunnerTests.cs b/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
index 3f3f11d..b29b59f 100644
--- a/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
+++ b/src/NUnitCore/tests/ThreadedTestRunnerTests.cs
@@ -1,25 +1,25 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using NUnit.Framework;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for ThreadedTestRunnerTests.
-	/// </summary>
-	[TestFixture]
-	public class ThreadedTestRunnerTests : BasicRunnerTests
-	{
-		protected override TestRunner CreateRunner( int runnerID )
-		{
-			return new ThreadedTestRunner( new SimpleTestRunner( runnerID ), ApartmentState.Unknown, ThreadPriority.Normal );
-		}
-
-	}
-}
+// ****************************************************************
+// Copyright 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;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for ThreadedTestRunnerTests.
+	/// </summary>
+	[TestFixture]
+	public class ThreadedTestRunnerTests : BasicRunnerTests
+	{
+		protected override TestRunner CreateRunner( int 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 74128ba..f8bcbb9 100644
--- a/src/NUnitCore/tests/ThreadingTests.cs
+++ b/src/NUnitCore/tests/ThreadingTests.cs
@@ -1,164 +1,164 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-using NUnit.TestData;
-
-namespace NUnit.Core.Tests
-{
-    public class ThreadingTests
-    {
-        Thread parentThread;
-        ApartmentState parentThreadApartment;
-
-        Thread setupThread;
-
-        [TestFixtureSetUp]
-        public void GetParentThreadInfo()
-        {
-			this.parentThread = Thread.CurrentThread;
-			this.parentThreadApartment = parentThread.ApartmentState;
-        }
-
-        [SetUp]
-        public void GetSetUpThreadInfo()
-        {
-            this.setupThread = Thread.CurrentThread;
-        }
-
-        [Test, Timeout(50)]
-        public void TestWithTimeoutRunsOnSeparateThread()
-        {
-            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
-        }
-
-        [Test, Timeout(50)]
-        public void TestWithTimeoutRunsSetUpAndTestOnSameThread()
-        {
-            Assert.That(Thread.CurrentThread, Is.EqualTo(setupThread));
-        }
-
-        [Test]
-        public void TestWithInfiniteLoopTimesOut()
-        {
-            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]
-        public void TestWithSTAThreadRunsInSTA()
-        {
-            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
-            if (parentThreadApartment == ApartmentState.STA)
-                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
-        }
-
-        [Test, MTAThread]
-        public void TestWithMTAThreadRunsInMTA()
-        {
-            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
-            if (parentThreadApartment == ApartmentState.MTA)
-                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
-        }
-
-        [Test, RequiresSTA]
-        public void TestWithRequiresSTARunsInSTA()
-        {
-            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
-            if (parentThreadApartment == ApartmentState.STA)
-                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
-        }
-
-        [Test, RequiresMTA]
-        public void TestWithRequiresMTARunsInMTA()
-        {
-            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
-            if (parentThreadApartment == ApartmentState.MTA)
-                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
-        }
-
-        [Test, RequiresThread]
-        public void TestWithRequiresThreadRunsInSeparateThread()
-        {
-            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
-        }
-
-        [Test, RequiresThread]
-        public void TestWithRequiresThreadRunsSetUpAndTestOnSameThread()
-        {
-            Assert.That(Thread.CurrentThread, Is.EqualTo(setupThread));
-        }
-
-        [Test, RequiresThread(ApartmentState.STA)]
-        public void TestWithRequiresThreadWithSTAArgRunsOnSeparateThreadInSTA()
-        {
-            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
-            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
-        }
-
-        [Test, RequiresThread(ApartmentState.MTA)]
-        public void TestWithRequiresThreadWithMTAArgRunsOnSeparateThreadInMTA()
-        {
-            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
-            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
-        }
-		
-		[Test]
-		public void TestOnSeparateThreadReportsAssertCountCorrectly()
-		{
-			TestResult result = TestBuilder.RunTestCase(typeof(ThreadingFixture), "MethodWithThreeAsserts");
-			Assert.That(result.AssertCount, Is.EqualTo(3));
-		}
-
-        [Test]
-        public void TimeoutCanBeSetOnTestFixture()
-        {
-            TestResult result = TestBuilder.RunTestFixture(typeof(ThreadingFixtureWithTimeout));
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            result = TestFinder.Find("Test2WithInfiniteLoop", result, false);
-            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
-            Assert.That(result.Message, Text.Contains("50ms"));
-        }
-
-        [TestFixture, RequiresSTA]
-        class FixtureRequiresSTA
-        {
-            [Test]
-            public void RequiresSTACanBeSetOnTestFixture()
-            {
-                Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
-            }
-        }
-
-        [TestFixture, RequiresMTA]
-        class FixtureRequiresMTA
-        {
-            [Test]
-            public void RequiresMTACanBeSetOnTestFixture()
-            {
-                Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
-            }
-        }
-
-        [TestFixture, RequiresThread]
-        class FixtureRequiresThread
-        {
-            [Test]
-            public void RequiresThreadCanBeSetOnTestFixture()
-            {
-                Assert.That(Environment.StackTrace, Text.Contains("TestThread.RunTestProc"));
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+using NUnit.TestData;
+
+namespace NUnit.Core.Tests
+{
+    public class ThreadingTests
+    {
+        Thread parentThread;
+        ApartmentState parentThreadApartment;
+
+        Thread setupThread;
+
+        [TestFixtureSetUp]
+        public void GetParentThreadInfo()
+        {
+			this.parentThread = Thread.CurrentThread;
+			this.parentThreadApartment = parentThread.ApartmentState;
+        }
+
+        [SetUp]
+        public void GetSetUpThreadInfo()
+        {
+            this.setupThread = Thread.CurrentThread;
+        }
+
+        [Test, Timeout(50)]
+        public void TestWithTimeoutRunsOnSeparateThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+
+        [Test, Timeout(50)]
+        public void TestWithTimeoutRunsSetUpAndTestOnSameThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.EqualTo(setupThread));
+        }
+
+        [Test][Platform(Exclude="Mono")]
+        public void TestWithInfiniteLoopTimesOut()
+        {
+            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]
+        public void TestWithSTAThreadRunsInSTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            if (parentThreadApartment == ApartmentState.STA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, MTAThread]
+        public void TestWithMTAThreadRunsInMTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            if (parentThreadApartment == ApartmentState.MTA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, RequiresSTA]
+        public void TestWithRequiresSTARunsInSTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            if (parentThreadApartment == ApartmentState.STA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, RequiresMTA]
+        public void TestWithRequiresMTARunsInMTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            if (parentThreadApartment == ApartmentState.MTA)
+                Assert.That(Thread.CurrentThread, Is.EqualTo(parentThread));
+        }
+
+        [Test, RequiresThread]
+        public void TestWithRequiresThreadRunsInSeparateThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+
+        [Test, RequiresThread]
+        public void TestWithRequiresThreadRunsSetUpAndTestOnSameThread()
+        {
+            Assert.That(Thread.CurrentThread, Is.EqualTo(setupThread));
+        }
+
+        [Test, RequiresThread(ApartmentState.STA)]
+        public void TestWithRequiresThreadWithSTAArgRunsOnSeparateThreadInSTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+
+        [Test, RequiresThread(ApartmentState.MTA)]
+        public void TestWithRequiresThreadWithMTAArgRunsOnSeparateThreadInMTA()
+        {
+            Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            Assert.That(Thread.CurrentThread, Is.Not.EqualTo(parentThread));
+        }
+		
+		[Test]
+		public void TestOnSeparateThreadReportsAssertCountCorrectly()
+		{
+			TestResult result = TestBuilder.RunTestCase(typeof(ThreadingFixture), "MethodWithThreeAsserts");
+			Assert.That(result.AssertCount, Is.EqualTo(3));
+		}
+
+        [Test][Platform(Exclude="Mono")]
+        public void TimeoutCanBeSetOnTestFixture()
+        {
+            TestResult result = TestBuilder.RunTestFixture(typeof(ThreadingFixtureWithTimeout));
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            result = TestFinder.Find("Test2WithInfiniteLoop", result, false);
+            Assert.That(result.ResultState, Is.EqualTo(ResultState.Failure));
+            Assert.That(result.Message, Text.Contains("50ms"));
+        }
+
+        [TestFixture, RequiresSTA]
+        class FixtureRequiresSTA
+        {
+            [Test]
+            public void RequiresSTACanBeSetOnTestFixture()
+            {
+                Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.STA));
+            }
+        }
+
+        [TestFixture, RequiresMTA]
+        class FixtureRequiresMTA
+        {
+            [Test]
+            public void RequiresMTACanBeSetOnTestFixture()
+            {
+                Assert.That(Thread.CurrentThread.ApartmentState, Is.EqualTo(ApartmentState.MTA));
+            }
+        }
+
+        [TestFixture, RequiresThread]
+        class FixtureRequiresThread
+        {
+            [Test]
+            public void RequiresThreadCanBeSetOnTestFixture()
+            {
+                Assert.That(Environment.StackTrace, Text.Contains("TestThread.RunTestProc"));
+            }
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/TypeHelperTests.cs b/src/NUnitCore/tests/TypeHelperTests.cs
index c690236..ad4d80a 100644
--- a/src/NUnitCore/tests/TypeHelperTests.cs
+++ b/src/NUnitCore/tests/TypeHelperTests.cs
@@ -1,45 +1,45 @@
-// ****************************************************************
-// 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;
-using NUnit.TestData.TypeHelperFixture;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class TypeHelperTests
-    {
-        [TestCase(typeof(int), "Int32")]
-        [TestCase(typeof(SimpleClass), "SimpleClass")]
-        [TestCase(typeof(MyNoNamespaceClass), "MyNoNamespaceClass")]
-#if 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")]
-        [TestCase(typeof(ContainerClass.NestedClass.DoublyNestedClass), "ContainerClass+NestedClass+DoublyNestedClass")]
-        [TestCase(typeof(ContainerClass.NestedClass.DoublyNestedGeneric<int>), "ContainerClass+NestedClass+DoublyNestedGeneric<Int32>")]
-        [TestCase(typeof(ContainerClass.NestedGeneric<int>), "ContainerClass+NestedGeneric<Int32>")]
-        [TestCase(typeof(ContainerClass.NestedGeneric<int>.DoublyNestedClass), "ContainerClass+NestedGeneric+DoublyNestedClass<Int32>")]
-        [TestCase(typeof(ContainerClass.NestedGeneric<string>.DoublyNestedGeneric<int>), "ContainerClass+NestedGeneric+DoublyNestedGeneric<String,Int32>")]
-        [TestCase(typeof(GenericContainerClass<string>.NestedClass), "GenericContainerClass+NestedClass<String>")]
-        [TestCase(typeof(GenericContainerClass<string>.NestedClass.DoublyNestedClass), "GenericContainerClass+NestedClass+DoublyNestedClass<String>")]
-        [TestCase(typeof(GenericContainerClass<string>.NestedClass.DoublyNestedGeneric<bool>), "GenericContainerClass+NestedClass+DoublyNestedGeneric<String,Boolean>")]
-        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>), "GenericContainerClass+NestedGeneric<String,Int32>")]
-        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>.DoublyNestedClass), "GenericContainerClass+NestedGeneric+DoublyNestedClass<String,Int32>")]
-        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>.DoublyNestedGeneric<bool>), "GenericContainerClass+NestedGeneric+DoublyNestedGeneric<String,Int32,Boolean>")]
-        [TestCase(typeof(ListTester<List<int>>), "ListTester<List<Int32>>")]
-        [TestCase(typeof(ListTester<List<List<int>>>), "ListTester<List<List<Int32>>>")]
-#endif
-        public void GetDisplayName(Type type, string name)
-        {
-            Assert.That(TypeHelper.GetDisplayName(type), Is.EqualTo(name));
-        }
-    }
-}
+// ****************************************************************
+// 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;
+using NUnit.TestData.TypeHelperFixture;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class TypeHelperTests
+    {
+        [TestCase(typeof(int), "Int32")]
+        [TestCase(typeof(SimpleClass), "SimpleClass")]
+        [TestCase(typeof(MyNoNamespaceClass), "MyNoNamespaceClass")]
+#if 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")]
+        [TestCase(typeof(ContainerClass.NestedClass.DoublyNestedClass), "ContainerClass+NestedClass+DoublyNestedClass")]
+        [TestCase(typeof(ContainerClass.NestedClass.DoublyNestedGeneric<int>), "ContainerClass+NestedClass+DoublyNestedGeneric<Int32>")]
+        [TestCase(typeof(ContainerClass.NestedGeneric<int>), "ContainerClass+NestedGeneric<Int32>")]
+        [TestCase(typeof(ContainerClass.NestedGeneric<int>.DoublyNestedClass), "ContainerClass+NestedGeneric+DoublyNestedClass<Int32>")]
+        [TestCase(typeof(ContainerClass.NestedGeneric<string>.DoublyNestedGeneric<int>), "ContainerClass+NestedGeneric+DoublyNestedGeneric<String,Int32>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedClass), "GenericContainerClass+NestedClass<String>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedClass.DoublyNestedClass), "GenericContainerClass+NestedClass+DoublyNestedClass<String>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedClass.DoublyNestedGeneric<bool>), "GenericContainerClass+NestedClass+DoublyNestedGeneric<String,Boolean>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>), "GenericContainerClass+NestedGeneric<String,Int32>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>.DoublyNestedClass), "GenericContainerClass+NestedGeneric+DoublyNestedClass<String,Int32>")]
+        [TestCase(typeof(GenericContainerClass<string>.NestedGeneric<int>.DoublyNestedGeneric<bool>), "GenericContainerClass+NestedGeneric+DoublyNestedGeneric<String,Int32,Boolean>")]
+        [TestCase(typeof(ListTester<List<int>>), "ListTester<List<Int32>>")]
+        [TestCase(typeof(ListTester<List<List<int>>>), "ListTester<List<List<Int32>>>")]
+#endif
+        public void GetDisplayName(Type type, string name)
+        {
+            Assert.That(TypeHelper.GetDisplayName(type), Is.EqualTo(name));
+        }
+    }
+}
diff --git a/src/NUnitCore/tests/UnhandledExceptionTests.cs b/src/NUnitCore/tests/UnhandledExceptionTests.cs
index 5ff75b5..2efb5ec 100644
--- a/src/NUnitCore/tests/UnhandledExceptionTests.cs
+++ b/src/NUnitCore/tests/UnhandledExceptionTests.cs
@@ -1,76 +1,76 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Text;
-using NUnit.Framework;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture, Explicit("These tests fail by design")]
-    public class UnhandledExceptionTests
-    {
-        #region Normal
-        [NUnit.Framework.Test]
-        public void Normal()
-        {
-            testDummy("Normal", false);
-        }
-
-        private static void testDummy(string dummyName, bool shouldPass)
-        {
-            Type fixtureType = typeof(NUnit.TestData.UnhandledExceptions);
-            Test test = TestBuilder.MakeTestCase(fixtureType, dummyName);
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            if (shouldPass)
-                Assert.IsTrue(result.IsSuccess, "{0} test should have passed", dummyName);
-            else
-            {
-                Assert.IsTrue(result.IsFailure, "{0} test should have failed", dummyName);
-                Assert.AreEqual("System.ApplicationException : Test exception", result.Message);
-            }
-        }
-        #endregion Normal
-
-        #region Threaded
-        [NUnit.Framework.Test]
-        public void Threaded()
-        {
-            // TODO: Make this fail
-            testDummy("Threaded", true);
-        }
-        #endregion Threaded
-
-        #region ThreadedAndWait
-        [NUnit.Framework.Test]
-        public void ThreadedAndWait()
-        {
-            // TODO: Make this fail
-            testDummy("ThreadedAndWait", true);
-        }
-        #endregion ThreadedAndWait
-
-        #region ThreadedAndForget
-        [NUnit.Framework.Test]
-        public void ThreadedAndForget()
-        {
-            // TODO: Make this fail
-            testDummy("ThreadedAndForget", true);
-        }
-        #endregion ThreadedAndForget
-
-        #region ThreadedAssert
-        [NUnit.Framework.Test]
-        public void ThreadedAssert()
-        {
-            testDummy("ThreadedAssert", true);
-        }
-        #endregion
-    }
-
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Text;
+using NUnit.Framework;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture, Explicit("These tests fail by design")]
+    public class UnhandledExceptionTests
+    {
+        #region Normal
+        [NUnit.Framework.Test]
+        public void Normal()
+        {
+            testDummy("Normal", false);
+        }
+
+        private static void testDummy(string dummyName, bool shouldPass)
+        {
+            Type fixtureType = typeof(NUnit.TestData.UnhandledExceptions);
+            Test test = TestBuilder.MakeTestCase(fixtureType, dummyName);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            if (shouldPass)
+                Assert.IsTrue(result.IsSuccess, "{0} test should have passed", dummyName);
+            else
+            {
+                Assert.IsTrue(result.IsFailure, "{0} test should have failed", dummyName);
+                Assert.AreEqual("System.ApplicationException : Test exception", result.Message);
+            }
+        }
+        #endregion Normal
+
+        #region Threaded
+        [NUnit.Framework.Test]
+        public void Threaded()
+        {
+            // TODO: Make this fail
+            testDummy("Threaded", true);
+        }
+        #endregion Threaded
+
+        #region ThreadedAndWait
+        [NUnit.Framework.Test]
+        public void ThreadedAndWait()
+        {
+            // TODO: Make this fail
+            testDummy("ThreadedAndWait", true);
+        }
+        #endregion ThreadedAndWait
+
+        #region ThreadedAndForget
+        [NUnit.Framework.Test]
+        public void ThreadedAndForget()
+        {
+            // TODO: Make this fail
+            testDummy("ThreadedAndForget", true);
+        }
+        #endregion ThreadedAndForget
+
+        #region ThreadedAssert
+        [NUnit.Framework.Test]
+        public void ThreadedAssert()
+        {
+            testDummy("ThreadedAssert", true);
+        }
+        #endregion
+    }
+
+}
diff --git a/src/NUnitCore/tests/ValueSourceTests.cs b/src/NUnitCore/tests/ValueSourceTests.cs
index 2e133a1..f0afa91 100644
--- a/src/NUnitCore/tests/ValueSourceTests.cs
+++ b/src/NUnitCore/tests/ValueSourceTests.cs
@@ -1,161 +1,161 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using NUnit.Framework;
-using NUnit.TestData;
-using NUnit.TestUtilities;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Core.Tests
-{
-    [TestFixture]
-    public class ValueSourceTests
-    {
-        [Test]
-        public void ValueSourceCanBeStaticProperty(
-            [ValueSource("StaticProperty")] string source)
-        {
-            Assert.AreEqual("StaticProperty", source);
-        }
-
-        static IEnumerable StaticProperty
-        {
-            get
-            {
-#if CLR_2_0 || CLR_4_0
-                yield return "StaticProperty";
-#else
-                return new object[] { "StaticProperty" }; 
-#endif
-            }
-        }
-
-        [Test]
-        public void ValueSourceCanBeInstanceProperty(
-            [ValueSource("InstanceProperty")] string source)
-        {
-            Assert.AreEqual("InstanceProperty", source);
-        }
-
-        IEnumerable InstanceProperty
-        {
-            get { return new object[] { "InstanceProperty" }; }
-        }
-
-        [Test]
-        public void ValueSourceCanBeStaticMethod(
-            [ValueSource("StaticMethod")] string source)
-        {
-            Assert.AreEqual("StaticMethod", source);
-        }
-
-        static IEnumerable StaticMethod()
-        {
-            return new object[] { "StaticMethod" };
-        }
-
-        [Test]
-        public void ValueSourceCanBeInstanceMethod(
-            [ValueSource("InstanceMethod")] string source)
-        {
-            Assert.AreEqual("InstanceMethod", source);
-        }
-
-        IEnumerable InstanceMethod()
-        {
-            return new object[] { "InstanceMethod" };
-        }
-
-        [Test]
-        public void ValueSourceCanBeStaticField(
-            [ValueSource("StaticField")] string source)
-        {
-            Assert.AreEqual("StaticField", source);
-        }
-
-        internal static object[] StaticField = { "StaticField" };
-
-        [Test]
-        public void ValueSourceCanBeInstanceField(
-            [ValueSource("InstanceField")] string source)
-        {
-            Assert.AreEqual("InstanceField", source);
-        }
-
-        internal static object[] InstanceField = { "InstanceField" };
-
-        [Test]
-        public void ValueSourceIsInvokedWithCorrectCurrentDirectory(
-            [ValueSource("CheckCurrentDirectory")] bool isOK)
-        {
-            Assert.That(isOK);
-        }
-
-        private static IEnumerable CheckCurrentDirectory
-        {
-            get
-            {
-                return new object[] { System.IO.File.Exists("nunit.core.tests.dll") };
-            }
-        }
-
-        [Test, Sequential]
-        public void MultipleArguments(
-            [ValueSource("Numerators")] int n, 
-            [ValueSource("Denominators")] int d, 
-            [ValueSource("Quotients")] int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        internal static int[] Numerators = new int[] { 12, 12, 12 };
-        internal static int[] Denominators = new int[] { 3, 4, 6 };
-        internal static int[] Quotients = new int[] { 4, 3, 2 };
-
-        [Test, Sequential]
-        public void ValueSourceMayBeInAnotherClass(
-            [ValueSource(typeof(DivideDataProvider), "Numerators")] int n,
-            [ValueSource(typeof(DivideDataProvider), "Denominators")] int d,
-            [ValueSource(typeof(DivideDataProvider), "Quotients")] int q)
-        {
-            Assert.AreEqual(q, n / d);
-        }
-
-        private class DivideDataProvider
-        {
-            internal static int[] Numerators = new int[] { 12, 12, 12 };
-            internal static int[] Denominators = new int[] { 3, 4, 6 };
-            internal static int[] Quotients = new int[] { 4, 3, 2 };
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void ValueSourceMayBeGeneric(
-            [ValueSourceAttribute(typeof(ValueProvider), "IntegerProvider")] int val)
-        {
-            Assert.That(2 * val, Is.EqualTo(val + val));
-        }
-
-        public class ValueProvider
-        {
-            public IEnumerable<int> IntegerProvider()
-            {
-                List<int> dataList = new List<int>();
-
-                dataList.Add(1);
-                dataList.Add(2);
-                dataList.Add(4);
-                dataList.Add(8);
-
-                return dataList;
-            }
-        }
-#endif
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using NUnit.Framework;
+using NUnit.TestData;
+using NUnit.TestUtilities;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Core.Tests
+{
+    [TestFixture]
+    public class ValueSourceTests
+    {
+        [Test]
+        public void ValueSourceCanBeStaticProperty(
+            [ValueSource("StaticProperty")] string source)
+        {
+            Assert.AreEqual("StaticProperty", source);
+        }
+
+        static IEnumerable StaticProperty
+        {
+            get
+            {
+#if CLR_2_0 || CLR_4_0
+                yield return "StaticProperty";
+#else
+                return new object[] { "StaticProperty" }; 
+#endif
+            }
+        }
+
+        [Test]
+        public void ValueSourceCanBeInstanceProperty(
+            [ValueSource("InstanceProperty")] string source)
+        {
+            Assert.AreEqual("InstanceProperty", source);
+        }
+
+        IEnumerable InstanceProperty
+        {
+            get { return new object[] { "InstanceProperty" }; }
+        }
+
+        [Test]
+        public void ValueSourceCanBeStaticMethod(
+            [ValueSource("StaticMethod")] string source)
+        {
+            Assert.AreEqual("StaticMethod", source);
+        }
+
+        static IEnumerable StaticMethod()
+        {
+            return new object[] { "StaticMethod" };
+        }
+
+        [Test]
+        public void ValueSourceCanBeInstanceMethod(
+            [ValueSource("InstanceMethod")] string source)
+        {
+            Assert.AreEqual("InstanceMethod", source);
+        }
+
+        IEnumerable InstanceMethod()
+        {
+            return new object[] { "InstanceMethod" };
+        }
+
+        [Test]
+        public void ValueSourceCanBeStaticField(
+            [ValueSource("StaticField")] string source)
+        {
+            Assert.AreEqual("StaticField", source);
+        }
+
+        internal static object[] StaticField = { "StaticField" };
+
+        [Test]
+        public void ValueSourceCanBeInstanceField(
+            [ValueSource("InstanceField")] string source)
+        {
+            Assert.AreEqual("InstanceField", source);
+        }
+
+        internal static object[] InstanceField = { "InstanceField" };
+
+        [Test]
+        public void ValueSourceIsInvokedWithCorrectCurrentDirectory(
+            [ValueSource("CheckCurrentDirectory")] bool isOK)
+        {
+            Assert.That(isOK);
+        }
+
+        private static IEnumerable CheckCurrentDirectory
+        {
+            get
+            {
+                return new object[] { System.IO.File.Exists("nunit.core.tests.dll") };
+            }
+        }
+
+        [Test, Sequential]
+        public void MultipleArguments(
+            [ValueSource("Numerators")] int n, 
+            [ValueSource("Denominators")] int d, 
+            [ValueSource("Quotients")] int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        internal static int[] Numerators = new int[] { 12, 12, 12 };
+        internal static int[] Denominators = new int[] { 3, 4, 6 };
+        internal static int[] Quotients = new int[] { 4, 3, 2 };
+
+        [Test, Sequential]
+        public void ValueSourceMayBeInAnotherClass(
+            [ValueSource(typeof(DivideDataProvider), "Numerators")] int n,
+            [ValueSource(typeof(DivideDataProvider), "Denominators")] int d,
+            [ValueSource(typeof(DivideDataProvider), "Quotients")] int q)
+        {
+            Assert.AreEqual(q, n / d);
+        }
+
+        private class DivideDataProvider
+        {
+            internal static int[] Numerators = new int[] { 12, 12, 12 };
+            internal static int[] Denominators = new int[] { 3, 4, 6 };
+            internal static int[] Quotients = new int[] { 4, 3, 2 };
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void ValueSourceMayBeGeneric(
+            [ValueSourceAttribute(typeof(ValueProvider), "IntegerProvider")] int val)
+        {
+            Assert.That(2 * val, Is.EqualTo(val + val));
+        }
+
+        public class ValueProvider
+        {
+            public IEnumerable<int> IntegerProvider()
+            {
+                List<int> dataList = new List<int>();
+
+                dataList.Add(1);
+                dataList.Add(2);
+                dataList.Add(4);
+                dataList.Add(8);
+
+                return dataList;
+            }
+        }
+#endif
+    }
+}
diff --git a/src/NUnitCore/tests/XmlTest.cs b/src/NUnitCore/tests/XmlTest.cs
index fe5b0d6..aa410a2 100644
--- a/src/NUnitCore/tests/XmlTest.cs
+++ b/src/NUnitCore/tests/XmlTest.cs
@@ -1,200 +1,200 @@
-// ****************************************************************
-// 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.Globalization;
-using System.IO;
-using System.Text;
-using System.Threading;
-using System.Xml;
-using System.Xml.Schema;
-using NUnit.Framework;
-using NUnit.Util;
-using NUnit.TestUtilities;
-
-namespace NUnit.Core.Tests
-{
-	/// <summary>
-	/// Summary description for XmlTest.
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class XmlTest
-	{
-		public class SchemaValidator
-		{
-			private XmlValidatingReader myXmlValidatingReader;
-			private bool success;
-
-			public SchemaValidator(string xmlFile, string schemaFile)
-			{
-				XmlSchemaCollection myXmlSchemaCollection = new XmlSchemaCollection();
-				XmlTextReader xmlTextReader = new XmlTextReader(schemaFile);
-				try
-				{
-					myXmlSchemaCollection.Add(XmlSchema.Read(xmlTextReader, null));
-				}
-				finally
-				{
-					xmlTextReader.Close();
-				}
-
-				// Validate the XML file with the schema
-				XmlTextReader myXmlTextReader = new XmlTextReader (xmlFile);
-				myXmlValidatingReader = new XmlValidatingReader(myXmlTextReader);
-				myXmlValidatingReader.Schemas.Add(myXmlSchemaCollection);
-				myXmlValidatingReader.ValidationType = ValidationType.Schema;
-			}
-
-			public bool Validate()
-			{
-				success = true;
-
-				try
-				{
-					// Set the validation event handler
-					myXmlValidatingReader.ValidationEventHandler += new ValidationEventHandler (this.ValidationEventHandle);
-
-					// Read XML data
-					while (myXmlValidatingReader.Read()){}
-				}
-				catch (Exception e)
-				{
-					throw new NUnitException(e.Message, e);
-				}
-				finally
-				{
-					myXmlValidatingReader.Close();
-				}
-
-				return success;
-			}
-
-			public void ValidationEventHandle (object sender, ValidationEventArgs args)
-			{
-				success = false;
-				Console.WriteLine("\tValidation error: " + args.Message);
-
-				if (args.Severity == XmlSeverityType.Warning)
-				{
-					Console.WriteLine("No schema found to enforce validation.");
-				} 
-				else
-					if (args.Severity == XmlSeverityType.Error)
-				{
-					Console.WriteLine("validation error occurred when validating the instance document.");
-				} 
-
-				if (args.Exception != null) // XSD schema validation error
-				{
-					Console.WriteLine(args.Exception.SourceUri + "," +  args.Exception.LinePosition + "," +  args.Exception.LineNumber);
-				}
-			}
-		}
-
-		private void runSchemaValidatorTest(string reportFileName)
-		{
-            string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( testsDll ) );
-
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-
-			new XmlResultWriter(reportFileName).SaveTestResult(result);
-
-			SchemaValidator validator = new SchemaValidator(reportFileName, schemaFile.Path);
-			Assert.IsTrue(validator.Validate(), "validate failed");
-		}
-
-		private void runSchemaValidatorTest(TextWriter writer)
-		{
-            string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
-			TestSuiteBuilder builder = new TestSuiteBuilder();
-			Test suite = builder.Build( new TestPackage( testsDll ) );
-
-            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
-	
-			new XmlResultWriter(writer).SaveTestResult(result);
-		}
-
-		private string tempFile;
-		private TempResourceFile schemaFile;
-
-		[SetUp]
-		public void CreateTempFileName()
-		{
-            tempFile = Path.GetTempFileName();
-			schemaFile = new TempResourceFile( GetType(), "Results.xsd");
-		}
-
-		[TearDown]
-		public void RemoveTempFiles()
-		{
-			schemaFile.Dispose();
-
-			FileInfo info = new FileInfo(tempFile);
-			if(info.Exists) info.Delete();
-		}
-
-		[Test,SetCulture("")]
-		public void TestSchemaValidatorInvariantCulture()
-		{
-			runSchemaValidatorTest(tempFile);
-		}
-
-		[Test,SetCulture("en-US")]
-		public void TestSchemaValidatorUnitedStatesCulture()
-		{
-			runSchemaValidatorTest(tempFile);
-		}
-
-		[Test,SetCulture("en-US")]
-		public void TestStream()
-		{
-			runSchemaValidatorTest(tempFile);
-			StringBuilder builder = new StringBuilder();
-			StringWriter writer = new StringWriter(builder);
-			runSchemaValidatorTest(writer);
-			string second = builder.ToString();
-			StreamReader reader = new StreamReader(tempFile);
-			string first = reader.ReadToEnd();
-			reader.Close();
-			Assert.AreEqual(removeTimeAndAssertAttributes(first), removeTimeAndAssertAttributes(second));
-		}
-
-		[Test,SetCulture("fr-FR")]
-		public void TestSchemaValidatorFrenchCulture()
-		{
-			runSchemaValidatorTest(tempFile);
-		}
-
-		[Test]
-		public void removeTime() 
-		{
-			string input = "foo time=\"123.745774xxx\" bar asserts=\"5\" time=\"0\"";
-			string output = removeTimeAndAssertAttributes(input);
-			Assert.AreEqual("foo  bar  ", output);
-		}
-
-		private string removeTimeAndAssertAttributes(string text) 
-		{
-			int index = 0;
-			while ((index = text.IndexOf("time=\"")) != -1) 
-			{
-				int endQuote = text.IndexOf("\"", index + 7);
-				text = text.Remove(index, endQuote - index + 1);
-			}
-
-			while ((index = text.IndexOf("asserts=\"")) != -1) 
-			{
-				int endQuote = text.IndexOf("\"", index + 10);
-				text = text.Remove(index, endQuote - index + 1);
-			}
-
-			return text;
-		}
-	}
-}
+// ****************************************************************
+// 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.Globalization;
+using System.IO;
+using System.Text;
+using System.Threading;
+using System.Xml;
+using System.Xml.Schema;
+using NUnit.Framework;
+using NUnit.Util;
+using NUnit.TestUtilities;
+
+namespace NUnit.Core.Tests
+{
+	/// <summary>
+	/// Summary description for XmlTest.
+	/// </summary>
+	/// 
+	[TestFixture]
+	public class XmlTest
+	{
+		public class SchemaValidator
+		{
+			private XmlValidatingReader myXmlValidatingReader;
+			private bool success;
+
+			public SchemaValidator(string xmlFile, string schemaFile)
+			{
+				XmlSchemaCollection myXmlSchemaCollection = new XmlSchemaCollection();
+				XmlTextReader xmlTextReader = new XmlTextReader(schemaFile);
+				try
+				{
+					myXmlSchemaCollection.Add(XmlSchema.Read(xmlTextReader, null));
+				}
+				finally
+				{
+					xmlTextReader.Close();
+				}
+
+				// Validate the XML file with the schema
+				XmlTextReader myXmlTextReader = new XmlTextReader (xmlFile);
+				myXmlValidatingReader = new XmlValidatingReader(myXmlTextReader);
+				myXmlValidatingReader.Schemas.Add(myXmlSchemaCollection);
+				myXmlValidatingReader.ValidationType = ValidationType.Schema;
+			}
+
+			public bool Validate()
+			{
+				success = true;
+
+				try
+				{
+					// Set the validation event handler
+					myXmlValidatingReader.ValidationEventHandler += new ValidationEventHandler (this.ValidationEventHandle);
+
+					// Read XML data
+					while (myXmlValidatingReader.Read()){}
+				}
+				catch (Exception e)
+				{
+					throw new NUnitException(e.Message, e);
+				}
+				finally
+				{
+					myXmlValidatingReader.Close();
+				}
+
+				return success;
+			}
+
+			public void ValidationEventHandle (object sender, ValidationEventArgs args)
+			{
+				success = false;
+				Console.WriteLine("\tValidation error: " + args.Message);
+
+				if (args.Severity == XmlSeverityType.Warning)
+				{
+					Console.WriteLine("No schema found to enforce validation.");
+				} 
+				else
+					if (args.Severity == XmlSeverityType.Error)
+				{
+					Console.WriteLine("validation error occurred when validating the instance document.");
+				} 
+
+				if (args.Exception != null) // XSD schema validation error
+				{
+					Console.WriteLine(args.Exception.SourceUri + "," +  args.Exception.LinePosition + "," +  args.Exception.LineNumber);
+				}
+			}
+		}
+
+		private void runSchemaValidatorTest(string reportFileName)
+		{
+            string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( testsDll ) );
+
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+
+			new XmlResultWriter(reportFileName).SaveTestResult(result);
+
+			SchemaValidator validator = new SchemaValidator(reportFileName, schemaFile.Path);
+			Assert.IsTrue(validator.Validate(), "validate failed");
+		}
+
+		private void runSchemaValidatorTest(TextWriter writer)
+		{
+            string testsDll = NUnit.Tests.Assemblies.MockAssembly.AssemblyPath;
+			TestSuiteBuilder builder = new TestSuiteBuilder();
+			Test suite = builder.Build( new TestPackage( testsDll ) );
+
+            TestResult result = suite.Run(NullListener.NULL, TestFilter.Empty);
+	
+			new XmlResultWriter(writer).SaveTestResult(result);
+		}
+
+		private string tempFile;
+		private TempResourceFile schemaFile;
+
+		[SetUp]
+		public void CreateTempFileName()
+		{
+            tempFile = Path.GetTempFileName();
+			schemaFile = new TempResourceFile( GetType(), "Results.xsd");
+		}
+
+		[TearDown]
+		public void RemoveTempFiles()
+		{
+			schemaFile.Dispose();
+
+			FileInfo info = new FileInfo(tempFile);
+			if(info.Exists) info.Delete();
+		}
+
+		[Test,SetCulture("")]
+		public void TestSchemaValidatorInvariantCulture()
+		{
+			runSchemaValidatorTest(tempFile);
+		}
+
+		[Test,SetCulture("en-US")]
+		public void TestSchemaValidatorUnitedStatesCulture()
+		{
+			runSchemaValidatorTest(tempFile);
+		}
+
+		[Test,SetCulture("en-US")]
+		public void TestStream()
+		{
+			runSchemaValidatorTest(tempFile);
+			StringBuilder builder = new StringBuilder();
+			StringWriter writer = new StringWriter(builder);
+			runSchemaValidatorTest(writer);
+			string second = builder.ToString();
+			StreamReader reader = new StreamReader(tempFile);
+			string first = reader.ReadToEnd();
+			reader.Close();
+			Assert.AreEqual(removeTimeAndAssertAttributes(first), removeTimeAndAssertAttributes(second));
+		}
+
+		[Test,SetCulture("fr-FR")]
+		public void TestSchemaValidatorFrenchCulture()
+		{
+			runSchemaValidatorTest(tempFile);
+		}
+
+		[Test]
+		public void removeTime() 
+		{
+			string input = "foo time=\"123.745774xxx\" bar asserts=\"5\" time=\"0\"";
+			string output = removeTimeAndAssertAttributes(input);
+			Assert.AreEqual("foo  bar  ", output);
+		}
+
+		private string removeTimeAndAssertAttributes(string text) 
+		{
+			int index = 0;
+			while ((index = text.IndexOf("time=\"")) != -1) 
+			{
+				int endQuote = text.IndexOf("\"", index + 7);
+				text = text.Remove(index, endQuote - index + 1);
+			}
+
+			while ((index = text.IndexOf("asserts=\"")) != -1) 
+			{
+				int endQuote = text.IndexOf("\"", index + 10);
+				text = text.Remove(index, endQuote - index + 1);
+			}
+
+			return text;
+		}
+	}
+}
diff --git a/src/NUnitCore/tests/nunit.core.tests.build b/src/NUnitCore/tests/nunit.core.tests.build
index 8e01bc0..a5dbf5c 100644
--- a/src/NUnitCore/tests/nunit.core.tests.build
+++ b/src/NUnitCore/tests/nunit.core.tests.build
@@ -1,129 +1,130 @@
-<?xml version="1.0"?>
-<project name="NUnitCoreTests" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="Generic/DeduceTypeArgsFromArgs.cs"/>
-        <include name="Generic/SimpleGenericFixture.cs"/>
-        <include name="Generic/SimpleGenericMethods.cs"/>
-        <include name="Generic/TypeParameterUsedWithTestMethod.cs"/>
-    <include name="ActionAttributeExceptionTests.cs"/>
-    <include name="ActionAttributeTests.cs"/>
-        <include name="AllTests.cs"/>
-        <include name="AssemblyHelperTests.cs"/>
-        <include name="AssemblyReaderTests.cs"/>
-        <include name="AssemblyResolverTests.cs"/>
-        <include name="AssemblyTests.cs"/>
-        <include name="AssemblyVersionFixture.cs"/>
-        <include name="AssertPassFixture.cs"/>
-        <include name="AttributeDescriptionFixture.cs"/>
-        <include name="AttributeInheritance.cs"/>
-        <include name="BasicRunnerTests.cs"/>
-        <include name="CallContextTests.cs"/>
-        <include name="CategoryAttributeTests.cs"/>
-        <include name="CombinatorialTests.cs"/>
-        <include name="CoreExtensionsTests.cs"/>
-        <include name="CultureSettingAndDetectionTests.cs"/>
-        <include name="DatapointTests.cs"/>
-        <include name="DirectoryChangeTests.cs"/>
-        <include name="DirectorySwapperTests.cs"/>
-        <include name="EventQueueTests.cs"/>
-        <include name="EventTestFixture.cs"/>
-        <include name="ExpectExceptionTest.cs"/>
-        <include name="FailFixture.cs"/>
-        <include name="FixtureSetUpTearDownTest.cs"/>
-        <include name="IgnoreFixture.cs"/>
-        <include name="LegacySuiteTests.cs"/>
-    <include name="MaxTimeTests.cs"/>
-        <include name="MockTestRunner.cs"/>
-        <include name="NameFilterTest.cs"/>
-        <include name="NamespaceAssemblyTests.cs"/>
-        <include name="PairwiseTests.cs"/>
-        <include name="ParameterizedTestCaseTests.cs"/>
-        <include name="ParameterizedTestFixtureTests.cs"/>
-        <include name="PlatformDetectionTests.cs"/>
-        <include name="PropertyAttributeTests.cs"/>
-        <include name="ReflectTests.cs"/>
-        <include name="RemoteRunnerTests.cs"/>
-        <include name="RepeatedTestFixture.cs"/>
-        <include name="RuntimeFrameworkTests.cs"/>
-        <include name="SerializationBug.cs"/>
-        <include name="SetCultureAttributeTests.cs"/>
-        <include name="SetUpFixtureTests.cs"/>
-        <include name="SetUpTest.cs"/>
-        <include name="SimpleNameFilterTests.cs"/>
-        <include name="SimpleTestRunnerTests.cs"/>
-        <include name="StackOverflowTestFixture.cs"/>
-        <include name="SuiteBuilderTests.cs"/>
-        <include name="SuiteBuilderTests_Multiple.cs"/>
-        <include name="TestAssemblyBuilderTests.cs"/>
-        <include name="TestCaseAttributeTests.cs"/>
-        <include name="TestCaseResultFixture.cs"/>
-        <include name="TestCaseSourceTests.cs"/>
-        <include name="TestCaseTest.cs"/>
-    <include name="TestContextTests.cs"/>
-    <include name="TestConsole.cs"/>
-    <include name="TestDelegateFixture.cs"/>
-        <include name="TestExecutionContextTests.cs"/>
-        <include name="TestFixtureBuilderTests.cs"/>
-        <include name="TestFixtureExtension.cs"/>
-        <include name="TestFixtureTests.cs"/>
-        <include name="TestFrameworkTests.cs"/>
-        <include name="TestIDTests.cs"/>
-        <include name="TestInfoTests.cs"/>
-        <include name="TestMethodSignatureTests.cs"/>
-        <include name="TestNameTests.cs"/>
-        <include name="TestNodeTests.cs"/>
-        <include name="TestRunnerThreadTests.cs"/>
-        <include name="TestSuiteTest.cs"/>
-        <include name="TheoryTests.cs"/>
-        <include name="ThreadedTestRunnerTests.cs"/>
-        <include name="ThreadingTests.cs"/>
-        <include name="TypeHelperTests.cs"/>
-        <include name="UnhandledExceptionTests.cs"/>
-        <include name="ValueSourceTests.cs"/>
-        <include name="XmlTest.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-       output="${current.test.dir}/nunit.core.tests.dll"
-       debug="${build.debug}" 
-       define="${build.defines}">
-      <nowarn>
-        <warning number="618,672"/>
-      </nowarn>
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <resources prefix="NUnit.Core.Tests">
-        <include name="Results.xsd"/>
-      </resources>
-      <references>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.framework.dir}/nunit.mocks.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.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"/>
-        <include name="${current.test.dir}/nonamespace-assembly.dll"/>
-        <include name="System.Data.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitCore/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="Results.xsd"/>
-        <include name="nunit.core.tests.csproj"/>
-        <include name="nunit.core.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitCoreTests" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="Generic/DeduceTypeArgsFromArgs.cs"/>
+        <include name="Generic/SimpleGenericFixture.cs"/>
+        <include name="Generic/SimpleGenericMethods.cs"/>
+        <include name="Generic/TypeParameterUsedWithTestMethod.cs"/>
+    <include name="ActionAttributeExceptionTests.cs"/>
+    <include name="ActionAttributeTests.cs"/>
+        <include name="AllTests.cs"/>
+        <include name="AssemblyHelperTests.cs"/>
+        <include name="AssemblyReaderTests.cs"/>
+        <include name="AssemblyResolverTests.cs"/>
+        <include name="AssemblyTests.cs"/>
+        <include name="AssemblyVersionFixture.cs"/>
+        <include name="AssertPassFixture.cs"/>
+        <include name="AttributeDescriptionFixture.cs"/>
+        <include name="AttributeInheritance.cs"/>
+        <include name="BasicRunnerTests.cs"/>
+        <include name="CallContextTests.cs"/>
+        <include name="CategoryAttributeTests.cs"/>
+        <include name="CombinatorialTests.cs"/>
+        <include name="CoreExtensionsTests.cs"/>
+        <include name="CultureSettingAndDetectionTests.cs"/>
+        <include name="DatapointTests.cs"/>
+        <include name="DirectoryChangeTests.cs"/>
+        <include name="DirectorySwapperTests.cs"/>
+        <include name="EventQueueTests.cs"/>
+        <include name="EventTestFixture.cs"/>
+        <include name="ExpectExceptionTest.cs"/>
+        <include name="FailFixture.cs"/>
+        <include name="FixtureSetUpTearDownTest.cs"/>
+        <include name="IgnoreFixture.cs"/>
+        <include name="LegacySuiteTests.cs"/>
+    <include name="MaxTimeTests.cs"/>
+        <include name="MockTestRunner.cs"/>
+        <include name="NameFilterTest.cs"/>
+        <include name="NamespaceAssemblyTests.cs"/>
+        <include name="NUnitTestCaseBuilderTests.cs"/>
+        <include name="PairwiseTests.cs"/>
+        <include name="ParameterizedTestCaseTests.cs"/>
+        <include name="ParameterizedTestFixtureTests.cs"/>
+        <include name="PlatformDetectionTests.cs"/>
+        <include name="PropertyAttributeTests.cs"/>
+        <include name="ReflectTests.cs"/>
+        <include name="RemoteRunnerTests.cs"/>
+        <include name="RepeatedTestFixture.cs"/>
+        <include name="RuntimeFrameworkTests.cs"/>
+        <include name="SerializationBug.cs"/>
+        <include name="SetCultureAttributeTests.cs"/>
+        <include name="SetUpFixtureTests.cs"/>
+        <include name="SetUpTest.cs"/>
+        <include name="SimpleNameFilterTests.cs"/>
+        <include name="SimpleTestRunnerTests.cs"/>
+        <include name="StackOverflowTestFixture.cs"/>
+        <include name="SuiteBuilderTests.cs"/>
+        <include name="SuiteBuilderTests_Multiple.cs"/>
+        <include name="TestAssemblyBuilderTests.cs"/>
+        <include name="TestCaseAttributeTests.cs"/>
+        <include name="TestCaseResultFixture.cs"/>
+        <include name="TestCaseSourceTests.cs"/>
+        <include name="TestCaseTest.cs"/>
+    <include name="TestContextTests.cs"/>
+    <include name="TestConsole.cs"/>
+    <include name="TestDelegateFixture.cs"/>
+        <include name="TestExecutionContextTests.cs"/>
+        <include name="TestFixtureBuilderTests.cs"/>
+        <include name="TestFixtureExtension.cs"/>
+        <include name="TestFixtureTests.cs"/>
+        <include name="TestFrameworkTests.cs"/>
+        <include name="TestIDTests.cs"/>
+        <include name="TestInfoTests.cs"/>
+        <include name="TestMethodSignatureTests.cs"/>
+        <include name="TestNameTests.cs"/>
+        <include name="TestNodeTests.cs"/>
+        <include name="TestRunnerThreadTests.cs"/>
+        <include name="TestSuiteTest.cs"/>
+        <include name="TheoryTests.cs"/>
+        <include name="ThreadedTestRunnerTests.cs"/>
+        <include name="ThreadingTests.cs"/>
+        <include name="TypeHelperTests.cs"/>
+        <include name="UnhandledExceptionTests.cs"/>
+        <include name="ValueSourceTests.cs"/>
+        <include name="XmlTest.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+       output="${current.test.dir}/nunit.core.tests.dll"
+       debug="${build.debug}" 
+       define="${build.defines}">
+      <nowarn>
+        <warning number="618,672"/>
+      </nowarn>
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <resources prefix="NUnit.Core.Tests">
+        <include name="Results.xsd"/>
+      </resources>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.mocks.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.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"/>
+        <include name="${current.test.dir}/nonamespace-assembly.dll"/>
+        <include name="System.Data.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitCore/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="Results.xsd"/>
+        <include name="nunit.core.tests.csproj"/>
+        <include name="nunit.core.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitCore/tests/nunit.core.tests.csproj b/src/NUnitCore/tests/nunit.core.tests.csproj
index 927ed83..39424eb 100644
--- a/src/NUnitCore/tests/nunit.core.tests.csproj
+++ b/src/NUnitCore/tests/nunit.core.tests.csproj
@@ -1,242 +1,257 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.core.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Core.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <PublishUrl>http://localhost/nunit.core.tests/</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Web</InstallFrom>
-    <UpdateEnabled>true</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <IsWebBootstrapper>true</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
-      <Name>mock-assembly</Name>
-      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
-      <Name>nonamespace-assembly</Name>
-      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
-      <Name>test-assembly</Name>
-      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
-      <Name>test-utilities</Name>
-      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <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" />
-    <Compile Include="AssemblyResolverTests.cs" />
-    <Compile Include="AssemblyTests.cs" />
-    <Compile Include="AssemblyVersionFixture.cs" />
-    <Compile Include="AssertPassFixture.cs" />
-    <Compile Include="AttributeDescriptionFixture.cs" />
-    <Compile Include="AttributeInheritance.cs" />
-    <Compile Include="BasicRunnerTests.cs" />
-    <Compile Include="CallContextTests.cs" />
-    <Compile Include="CategoryAttributeTests.cs" />
-    <Compile Include="CombinatorialTests.cs" />
-    <Compile Include="CoreExtensionsTests.cs" />
-    <Compile Include="CultureSettingAndDetectionTests.cs" />
-    <Compile Include="DatapointTests.cs" />
-    <Compile Include="DirectorySwapperTests.cs" />
-    <Compile Include="EventQueueTests.cs" />
-    <Compile Include="EventTestFixture.cs" />
-    <Compile Include="ExpectExceptionTest.cs" />
-    <Compile Include="FailFixture.cs" />
-    <Compile Include="FixtureSetUpTearDownTest.cs" />
-    <Compile Include="Generic\DeduceTypeArgsFromArgs.cs" />
-    <Compile Include="Generic\SimpleGenericFixture.cs" />
-    <Compile Include="Generic\SimpleGenericMethods.cs" />
-    <Compile Include="Generic\TypeParameterUsedWithTestMethod.cs" />
-    <Compile Include="IgnoreFixture.cs" />
-    <Compile Include="LegacySuiteTests.cs" />
-    <Compile Include="MaxTimeTests.cs" />
-    <Compile Include="NameFilterTest.cs" />
-    <Compile Include="NamespaceAssemblyTests.cs" />
-    <Compile Include="PairwiseTests.cs" />
-    <Compile Include="ParameterizedTestFixtureTests.cs" />
-    <Compile Include="PlatformDetectionTests.cs" />
-    <Compile Include="PropertyAttributeTests.cs" />
-    <Compile Include="ReflectTests.cs" />
-    <Compile Include="RemoteRunnerTests.cs" />
-    <Compile Include="RepeatedTestFixture.cs" />
-    <Compile Include="RuntimeFrameworkTests.cs" />
-    <Compile Include="SerializationBug.cs" />
-    <Compile Include="SetCultureAttributeTests.cs" />
-    <Compile Include="SetUpFixtureTests.cs" />
-    <Compile Include="SetUpTest.cs" />
-    <Compile Include="SimpleNameFilterTests.cs" />
-    <Compile Include="SimpleTestRunnerTests.cs" />
-    <Compile Include="StackOverflowTestFixture.cs" />
-    <Compile Include="SuiteBuilderTests.cs" />
-    <Compile Include="SuiteBuilderTests_Multiple.cs" />
-    <Compile Include="TestAssemblyBuilderTests.cs" />
-    <Compile Include="TestCaseAttributeTests.cs" />
-    <Compile Include="TestCaseResultFixture.cs" />
-    <Compile Include="TestCaseSourceTests.cs" />
-    <Compile Include="TestCaseTest.cs" />
-    <Compile Include="TestConsole.cs" />
-    <Compile Include="TestContextTests.cs" />
-    <Compile Include="TestDelegateFixture.cs" />
-    <Compile Include="TestExecutionContextTests.cs" />
-    <Compile Include="TestFixtureBuilderTests.cs" />
-    <Compile Include="TestFixtureExtension.cs" />
-    <Compile Include="TestFixtureTests.cs" />
-    <Compile Include="TestFrameworkTests.cs" />
-    <Compile Include="TestIDTests.cs" />
-    <Compile Include="TestInfoTests.cs" />
-    <Compile Include="TestMethodSignatureTests.cs" />
-    <Compile Include="TestNameTests.cs" />
-    <Compile Include="TestNodeTests.cs" />
-    <Compile Include="TestRunnerThreadTests.cs" />
-    <Compile Include="TestSuiteTest.cs" />
-    <Compile Include="TheoryTests.cs" />
-    <Compile Include="ThreadedTestRunnerTests.cs" />
-    <Compile Include="ThreadingTests.cs" />
-    <Compile Include="TypeHelperTests.cs" />
-    <Compile Include="UnhandledExceptionTests.cs" />
-    <Compile Include="ValueSourceTests.cs" />
-    <Compile Include="XmlTest.cs" />
-    <Compile Include="DirectoryChangeTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.core.tests.build" />
-    <EmbeddedResource Include="Results.xsd" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DD758D21-E5D5-4D40-9450-5F65A32F359C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.core.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Core.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <PublishUrl>http://localhost/nunit.core.tests/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <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>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\mock-assembly\mock-assembly.csproj">
+      <Name>mock-assembly</Name>
+      <Project>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\nonamespace-assembly\nonamespace-assembly.csproj">
+      <Name>nonamespace-assembly</Name>
+      <Project>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-assembly\test-assembly.csproj">
+      <Name>test-assembly</Name>
+      <Project>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\tests\test-utilities\test-utilities.csproj">
+      <Name>test-utilities</Name>
+      <Project>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <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" />
+    <Compile Include="AssemblyResolverTests.cs" />
+    <Compile Include="AssemblyTests.cs" />
+    <Compile Include="AssemblyVersionFixture.cs" />
+    <Compile Include="AssertPassFixture.cs" />
+    <Compile Include="AttributeDescriptionFixture.cs" />
+    <Compile Include="AttributeInheritance.cs" />
+    <Compile Include="BasicRunnerTests.cs" />
+    <Compile Include="CallContextTests.cs" />
+    <Compile Include="CategoryAttributeTests.cs" />
+    <Compile Include="CombinatorialTests.cs" />
+    <Compile Include="CoreExtensionsTests.cs" />
+    <Compile Include="CultureSettingAndDetectionTests.cs" />
+    <Compile Include="DatapointTests.cs" />
+    <Compile Include="DirectorySwapperTests.cs" />
+    <Compile Include="EventQueueTests.cs" />
+    <Compile Include="EventTestFixture.cs" />
+    <Compile Include="ExpectExceptionTest.cs" />
+    <Compile Include="FailFixture.cs" />
+    <Compile Include="FixtureSetUpTearDownTest.cs" />
+    <Compile Include="Generic\DeduceTypeArgsFromArgs.cs" />
+    <Compile Include="Generic\SimpleGenericFixture.cs" />
+    <Compile Include="Generic\SimpleGenericMethods.cs" />
+    <Compile Include="Generic\TypeParameterUsedWithTestMethod.cs" />
+    <Compile Include="IgnoreFixture.cs" />
+    <Compile Include="LegacySuiteTests.cs" />
+    <Compile Include="MaxTimeTests.cs" />
+    <Compile Include="NameFilterTest.cs" />
+    <Compile Include="NamespaceAssemblyTests.cs" />
+    <Compile Include="NUnitTestCaseBuilderTests.cs" />
+    <Compile Include="PairwiseTests.cs" />
+    <Compile Include="ParameterizedTestFixtureTests.cs" />
+    <Compile Include="PlatformDetectionTests.cs" />
+    <Compile Include="PropertyAttributeTests.cs" />
+    <Compile Include="ReflectTests.cs" />
+    <Compile Include="RemoteRunnerTests.cs" />
+    <Compile Include="RepeatedTestFixture.cs" />
+    <Compile Include="RuntimeFrameworkTests.cs" />
+    <Compile Include="SerializationBug.cs" />
+    <Compile Include="SetCultureAttributeTests.cs" />
+    <Compile Include="SetUpFixtureTests.cs" />
+    <Compile Include="SetUpTest.cs" />
+    <Compile Include="SimpleNameFilterTests.cs" />
+    <Compile Include="SimpleTestRunnerTests.cs" />
+    <Compile Include="StackOverflowTestFixture.cs" />
+    <Compile Include="SuiteBuilderTests.cs" />
+    <Compile Include="SuiteBuilderTests_Multiple.cs" />
+    <Compile Include="TestAssemblyBuilderTests.cs" />
+    <Compile Include="TestCaseAttributeTests.cs" />
+    <Compile Include="TestCaseResultFixture.cs" />
+    <Compile Include="TestCaseSourceTests.cs" />
+    <Compile Include="TestCaseTest.cs" />
+    <Compile Include="TestConsole.cs" />
+    <Compile Include="TestContextTests.cs" />
+    <Compile Include="TestDelegateFixture.cs" />
+    <Compile Include="TestExecutionContextTests.cs" />
+    <Compile Include="TestFixtureBuilderTests.cs" />
+    <Compile Include="TestFixtureExtension.cs" />
+    <Compile Include="TestFixtureTests.cs" />
+    <Compile Include="TestFrameworkTests.cs" />
+    <Compile Include="TestIDTests.cs" />
+    <Compile Include="TestInfoTests.cs" />
+    <Compile Include="TestMethodSignatureTests.cs" />
+    <Compile Include="TestNameTests.cs" />
+    <Compile Include="TestNodeTests.cs" />
+    <Compile Include="TestRunnerThreadTests.cs" />
+    <Compile Include="TestSuiteTest.cs" />
+    <Compile Include="TheoryTests.cs" />
+    <Compile Include="ThreadedTestRunnerTests.cs" />
+    <Compile Include="ThreadingTests.cs" />
+    <Compile Include="TypeHelperTests.cs" />
+    <Compile Include="UnhandledExceptionTests.cs" />
+    <Compile Include="ValueSourceTests.cs" />
+    <Compile Include="XmlTest.cs" />
+    <Compile Include="DirectoryChangeTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <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>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.core.tests.build">
+      <SubType>Designer</SubType>
+    </None>
+    <EmbeddedResource Include="Results.xsd" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitCore/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitCore/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..4c17756
Binary files /dev/null and b/src/NUnitCore/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitCore/tests/obj/Debug/nunit.core.tests.csproj.FileListAbsolute.txt b/src/NUnitCore/tests/obj/Debug/nunit.core.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..751f06e
--- /dev/null
+++ b/src/NUnitCore/tests/obj/Debug/nunit.core.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.core.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.core.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitCore\tests\obj\Debug\nunit.core.tests.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitCore\tests\obj\Debug\nunit.core.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitCore\tests\obj\Debug\nunit.core.tests.pdb
diff --git a/src/NUnitCore/tests/obj/Debug/nunit.core.tests.csprojResolveAssemblyReference.cache b/src/NUnitCore/tests/obj/Debug/nunit.core.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..5b070f5
Binary files /dev/null and b/src/NUnitCore/tests/obj/Debug/nunit.core.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/NUnitCore/tests/obj/Debug/nunit.core.tests.pdb b/src/NUnitCore/tests/obj/Debug/nunit.core.tests.pdb
new file mode 100644
index 0000000..2571e23
Binary files /dev/null and b/src/NUnitCore/tests/obj/Debug/nunit.core.tests.pdb differ
diff --git a/src/NUnitFramework/framework/ActionTargets.cs b/src/NUnitFramework/framework/ActionTargets.cs
index fbf0b7d..7e166bf 100644
--- a/src/NUnitFramework/framework/ActionTargets.cs
+++ b/src/NUnitFramework/framework/ActionTargets.cs
@@ -1,34 +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
+// ****************************************************************
+// 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 e86d58b..9e7068a 100644
--- a/src/NUnitFramework/framework/AssemblyInfo.cs
+++ b/src/NUnitFramework/framework/AssemblyInfo.cs
@@ -1,16 +1,16 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using System.Security;
-
-[assembly: CLSCompliant(true)]
-[assembly: AllowPartiallyTrustedCallers]
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using System.Security;
+
+[assembly: CLSCompliant(true)]
+[assembly: AllowPartiallyTrustedCallers]
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitFramework/framework/Assert.cs b/src/NUnitFramework/framework/Assert.cs
index 2258880..5ed7e2f 100644
--- a/src/NUnitFramework/framework/Assert.cs
+++ b/src/NUnitFramework/framework/Assert.cs
@@ -1,3675 +1,3789 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.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 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.
-        /// </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="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)
-            {
-                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 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
-        /// <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 ExceptionTypeConstraint(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 ExceptionTypeConstraint(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 ExceptionTypeConstraint(expectedExceptionType), code, string.Empty, null);
-        }
-
-        #endregion
-
-        #region Throws<T>
-#if CLR_2_0 || CLR_4_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 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.
-        /// </summary>
-        /// <typeparam name="T">The expected Exception Type</typeparam>
-        /// <param name="code">A TestDelegate</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static T Catch<T>(TestDelegate code, string message, params object[] args) where T : System.Exception
-        {
-            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code, message, args);
-        }
-
-        /// <summary>
-        /// Verifies that a delegate throws an exception of a certain Type
-        /// or one derived from it when called and returns it.
-        /// </summary>
-        /// <typeparam name="T">The expected Exception Type</typeparam>
-        /// <param name="code">A TestDelegate</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        public static T Catch<T>(TestDelegate code, string message) where T : System.Exception
-        {
-            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code, message);
-        }
-
-        /// <summary>
-        /// Verifies that a delegate throws an exception of a certain Type
-        /// or one derived from it when called and returns it.
-        /// </summary>
-        /// <typeparam name="T">The expected Exception Type</typeparam>
-        /// <param name="code">A TestDelegate</param>
-        public static T Catch<T>(TestDelegate code) where T : System.Exception
-        {
-            return (T)Throws(new InstanceOfTypeConstraint(typeof(T)), code);
-        }
-#endif
-        #endregion
-
-        #region DoesNotThrow
-
-        /// <summary>
-        /// Verifies that a delegate does not throw an exception
-        /// </summary>
-        /// <param name="code">A TestSnippet delegate</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static void DoesNotThrow(TestDelegate code, string message, params object[] args)
-        {
-            try
-            {
-                code();
-            }
-            catch (Exception ex)
-            {
-                TextMessageWriter writer = new TextMessageWriter(message, args);
-                writer.WriteLine("Unexpected exception: {0}", ex.GetType());
-                Assert.Fail(writer.ToString());
-            }
-        }
-
-        /// <summary>
-        /// Verifies that a delegate does not throw an exception.
-        /// </summary>
-        /// <param name="code">A TestSnippet delegate</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        public static void DoesNotThrow(TestDelegate code, string message)
-        {
-            DoesNotThrow(code, message, null);
-        }
-
-        /// <summary>
-        /// Verifies that a delegate does not throw an exception.
-        /// </summary>
-        /// <param name="code">A TestSnippet delegate</param>
-        public static void DoesNotThrow(TestDelegate code)
-        {
-            DoesNotThrow(code, string.Empty, null);
-        }
-
-        #endregion
-
-        #endregion
-
-        #region True
-
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void True(bool condition, string message, params object[] args)
-        {
-            Assert.That(condition, Is.True, message, args);
-        }
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void True(bool condition, string message)
-        {
-            Assert.That(condition, Is.True, message, null);
-        }
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        public static void True(bool condition)
-        {
-            Assert.That(condition, Is.True, null, null);
-        }
-
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsTrue(bool condition, string message, params object[] args)
-        {
-            Assert.That(condition, Is.True, message, args);
-        }
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsTrue(bool condition, string message)
-        {
-            Assert.That(condition, Is.True, message, null);
-        }
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        public static void IsTrue(bool condition)
-        {
-            Assert.That(condition, Is.True, null, null);
-        }
-
-        #endregion
-
-        #region False
-
-        /// <summary>
-        /// Asserts that a condition is false. If the condition is true the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void False(bool condition, string message, params object[] args)
-        {
-            Assert.That(condition, Is.False, message, args);
-        }
-        /// <summary>
-        /// Asserts that a condition is false. If the condition is true the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void False(bool condition, string message)
-        {
-            Assert.That(condition, Is.False, message, null);
-        }
-        /// <summary>
-        /// Asserts that a condition is false. If the condition is true the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        public static void False(bool condition)
-        {
-            Assert.That(condition, Is.False, null, null);
-        }
-
-        /// <summary>
-        /// Asserts that a condition is false. If the condition is true the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsFalse(bool condition, string message, params object[] args)
-        {
-            Assert.That(condition, Is.False, message, args);
-        }
-        /// <summary>
-        /// Asserts that a condition is false. If the condition is true the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsFalse(bool condition, string message)
-        {
-            Assert.That(condition, Is.False, message, null);
-        }
-        /// <summary>
-        /// Asserts that a condition is false. If the condition is true the method throws
-        /// an <see cref="AssertionException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        public static void IsFalse(bool condition)
-        {
-            Assert.That(condition, Is.False, null, null);
-        }
-
-        #endregion
-
-        #region NotNull
-
-        /// <summary>
-        /// Verifies that the object that is passed in is not equal to <code>null</code>
-        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void NotNull(object anObject, string message, params object[] args)
-        {
-            Assert.That(anObject, Is.Not.Null, message, args);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is not equal to <code>null</code>
-        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void NotNull(object anObject, string message)
-        {
-            Assert.That(anObject, Is.Not.Null, message, null);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is not equal to <code>null</code>
-        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        public static void NotNull(object anObject)
-        {
-            Assert.That(anObject, Is.Not.Null, null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the object that is passed in is not equal to <code>null</code>
-        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotNull(object anObject, string message, params object[] args)
-        {
-            Assert.That(anObject, Is.Not.Null, message, args);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is not equal to <code>null</code>
-        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotNull(object anObject, string message)
-        {
-            Assert.That(anObject, Is.Not.Null, message, null);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is not equal to <code>null</code>
-        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        public static void IsNotNull(object anObject)
-        {
-            Assert.That(anObject, Is.Not.Null, null, null);
-        }
-
-        #endregion
-
-        #region Null
-
-        /// <summary>
-        /// Verifies that the object that is passed in is equal to <code>null</code>
-        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Null(object anObject, string message, params object[] args)
-        {
-            Assert.That(anObject, Is.Null, message, args);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is equal to <code>null</code>
-        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Null(object anObject, string message)
-        {
-            Assert.That(anObject, Is.Null, message, null);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is equal to <code>null</code>
-        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        public static void Null(object anObject)
-        {
-            Assert.That(anObject, Is.Null, null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the object that is passed in is equal to <code>null</code>
-        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNull(object anObject, string message, params object[] args)
-        {
-            Assert.That(anObject, Is.Null, message, args);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is equal to <code>null</code>
-        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNull(object anObject, string message)
-        {
-            Assert.That(anObject, Is.Null, message, null);
-        }
-        /// <summary>
-        /// Verifies that the object that is passed in is equal to <code>null</code>
-        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="anObject">The object that is to be tested</param>
-        public static void IsNull(object anObject)
-        {
-            Assert.That(anObject, Is.Null, null, null);
-        }
-
-        #endregion
-
-        #region IsNaN
-
-        /// <summary>
-        /// Verifies that the double that is passed in is an <code>NaN</code> value.
-        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="aDouble">The value that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNaN(double aDouble, string message, params object[] args)
-        {
-            Assert.That(aDouble, Is.NaN, message, args);
-        }
-        /// <summary>
-        /// Verifies that the double that is passed in is an <code>NaN</code> value.
-        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="aDouble">The value that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNaN(double aDouble, string message)
-        {
-            Assert.That(aDouble, Is.NaN, message, null);
-        }
-        /// <summary>
-        /// Verifies that the double that is passed in is an <code>NaN</code> value.
-        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="aDouble">The value that is to be tested</param>
-        public static void IsNaN(double aDouble)
-        {
-            Assert.That(aDouble, Is.NaN, null, null);
-        }
-
-#if 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"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="aDouble">The value that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNaN(double? aDouble, string message, params object[] args)
-        {
-            Assert.That(aDouble, Is.NaN, message, args);
-        }
-        /// <summary>
-        /// Verifies that the double that is passed in is an <code>NaN</code> value.
-        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="aDouble">The value that is to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNaN(double? aDouble, string message)
-        {
-            Assert.That(aDouble, Is.NaN, message, null);
-        }
-        /// <summary>
-        /// Verifies that the double that is passed in is an <code>NaN</code> value.
-        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
-        /// is thrown.
-        /// </summary>
-        /// <param name="aDouble">The value that is to be tested</param>
-        public static void IsNaN(double? aDouble)
-        {
-            Assert.That(aDouble, Is.NaN, null, null);
-        }
-#endif
-
-        #endregion
-
-        #region IsEmpty
-
-        /// <summary>
-        /// Assert that a string is empty - that is equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsEmpty(string aString, string message, params object[] args)
-        {
-            Assert.That(aString, new EmptyStringConstraint(), message, args);
-        }
-        /// <summary>
-        /// Assert that a string is empty - that is equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsEmpty(string aString, string message)
-        {
-            Assert.That(aString, new EmptyStringConstraint(), message, null);
-        }
-        /// <summary>
-        /// Assert that a string is empty - that is equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        public static void IsEmpty(string aString)
-        {
-            Assert.That(aString, new EmptyStringConstraint(), null, null);
-        }
-
-        #endregion
-
-        #region IsEmpty
-
-        /// <summary>
-        /// Assert that an array, list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing ICollection</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsEmpty(IEnumerable collection, string message, params object[] args)
-        {
-            Assert.That(collection, new EmptyCollectionConstraint(), message, args);
-        }
-        /// <summary>
-        /// Assert that an array, list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing ICollection</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsEmpty(IEnumerable collection, string message)
-        {
-            Assert.That(collection, new EmptyCollectionConstraint(), message, null);
-        }
-        /// <summary>
-        /// Assert that an array, list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing ICollection</param>
-        public static void IsEmpty(IEnumerable collection)
-        {
-            Assert.That(collection, new EmptyCollectionConstraint(), null, null);
-        }
-
-        #endregion
-
-        #region IsNotEmpty
-
-        /// <summary>
-        /// Assert that a string is not empty - that is not equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotEmpty(string aString, string message, params object[] args)
-        {
-            Assert.That(aString, Is.Not.Empty, message, args);
-        }
-        /// <summary>
-        /// Assert that a string is not empty - that is not equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotEmpty(string aString, string message)
-        {
-            Assert.That(aString, Is.Not.Empty, message, null);
-        }
-        /// <summary>
-        /// Assert that a string is not empty - that is not equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        public static void IsNotEmpty(string aString)
-        {
-            Assert.That(aString, Is.Not.Empty, null, null);
-        }
-
-        #endregion
-
-        #region IsNotEmpty
-
-        /// <summary>
-        /// Assert that an array, list or other collection is not empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing ICollection</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotEmpty(IEnumerable collection, string message, params object[] args)
-        {
-            Assert.That(collection, Is.Not.Empty, message, args);
-        }
-        /// <summary>
-        /// Assert that an array, list or other collection is not empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing ICollection</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotEmpty(IEnumerable collection, string message)
-        {
-            Assert.That(collection, Is.Not.Empty, message, null);
-        }
-        /// <summary>
-        /// Assert that an array, list or other collection is not empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing ICollection</param>
-        public static void IsNotEmpty(IEnumerable collection)
-        {
-            Assert.That(collection, Is.Not.Empty, null, null);
-        }
-
-        #endregion
-
-        #region IsNullOrEmpty
-
-        /// <summary>
-        /// Assert that a string is either null or equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNullOrEmpty(string aString, string message, params object[] args)
-        {
-            Assert.That(aString, new NullOrEmptyStringConstraint(), message, args);
-        }
-        /// <summary>
-        /// Assert that a string is either null or equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNullOrEmpty(string aString, string message)
-        {
-            Assert.That(aString, new NullOrEmptyStringConstraint(), message, null);
-        }
-        /// <summary>
-        /// Assert that a string is either null or equal to string.Empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        public static void IsNullOrEmpty(string aString)
-        {
-            Assert.That(aString, new NullOrEmptyStringConstraint(), null, null);
-        }
-
-        #endregion
-
-        #region IsNotNullOrEmpty
-
-        /// <summary>
-        /// Assert that a string is not null or empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotNullOrEmpty(string aString, string message, params object[] args)
-        {
-            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), message, args);
-        }
-        /// <summary>
-        /// Assert that a string is not null or empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotNullOrEmpty(string aString, string message)
-        {
-            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), message, null);
-        }
-        /// <summary>
-        /// Assert that a string is not null or empty
-        /// </summary>
-        /// <param name="aString">The string to be tested</param>
-        public static void IsNotNullOrEmpty(string aString)
-        {
-            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), null, null);
-        }
-
-        #endregion
-
-        #region IsAssignableFrom
-
-        /// <summary>
-        /// Asserts that an object may be assigned a  value of a given Type.
-        /// </summary>
-        /// <param name="expected">The expected Type.</param>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsAssignableFrom(Type expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.AssignableFrom(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object may be assigned a  value of a given Type.
-        /// </summary>
-        /// <param name="expected">The expected Type.</param>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsAssignableFrom(Type expected, object actual, string message)
-        {
-            Assert.That(actual, Is.AssignableFrom(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object may be assigned a  value of a given Type.
-        /// </summary>
-        /// <param name="expected">The expected Type.</param>
-        /// <param name="actual">The object under examination</param>
-        public static void IsAssignableFrom(Type expected, object actual)
-        {
-            Assert.That(actual, Is.AssignableFrom(expected), null, null);
-        }
-
-        #endregion
-
-        #region IsAssignableFrom<T>
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Asserts that an object may be assigned a  value of a given Type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type.</typeparam>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsAssignableFrom<T>(object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.AssignableFrom(typeof(T)), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object may be assigned a  value of a given Type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type.</typeparam>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsAssignableFrom<T>(object actual, string message)
-        {
-            Assert.That(actual, Is.AssignableFrom(typeof(T)), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object may be assigned a  value of a given Type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type.</typeparam>
-        /// <param name="actual">The object under examination</param>
-        public static void IsAssignableFrom<T>(object actual)
-        {
-            Assert.That(actual, Is.AssignableFrom(typeof(T)), null, null);
-        }
-#endif
-
-        #endregion
-
-        #region IsNotAssignableFrom
-
-        /// <summary>
-        /// Asserts that an object may not be assigned a  value of a given Type.
-        /// </summary>
-        /// <param name="expected">The expected Type.</param>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotAssignableFrom(Type expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.AssignableFrom(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object may not be assigned a  value of a given Type.
-        /// </summary>
-        /// <param name="expected">The expected Type.</param>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotAssignableFrom(Type expected, object actual, string message)
-        {
-            Assert.That(actual, Is.Not.AssignableFrom(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object may not be assigned a  value of a given Type.
-        /// </summary>
-        /// <param name="expected">The expected Type.</param>
-        /// <param name="actual">The object under examination</param>
-        public static void IsNotAssignableFrom(Type expected, object actual)
-        {
-            Assert.That(actual, Is.Not.AssignableFrom(expected), null, null);
-        }
-
-        #endregion
-
-        #region IsNotAssignableFrom<T>
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Asserts that an object may not be assigned a  value of a given Type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type.</typeparam>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotAssignableFrom<T>(object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object may not be assigned a  value of a given Type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type.</typeparam>
-        /// <param name="actual">The object under examination</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotAssignableFrom<T>(object actual, string message)
-        {
-            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object may not be assigned a  value of a given Type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type.</typeparam>
-        /// <param name="actual">The object under examination</param>
-        public static void IsNotAssignableFrom<T>(object actual)
-        {
-            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)), null, null);
-        }
-#endif
-
-        #endregion
-
-        #region IsInstanceOf
-
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsInstanceOf(Type expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.InstanceOf(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsInstanceOf(Type expected, object actual, string message)
-        {
-            Assert.That(actual, Is.InstanceOf(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        public static void IsInstanceOf(Type expected, object actual)
-        {
-            Assert.That(actual, Is.InstanceOf(expected), null, null);
-        }
-
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [Obsolete]
-        public static void IsInstanceOfType(Type expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.InstanceOf(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [Obsolete]
-        public static void IsInstanceOfType(Type expected, object actual, string message)
-        {
-            Assert.That(actual, Is.InstanceOf(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        [Obsolete]
-        public static void IsInstanceOfType(Type expected, object actual)
-        {
-            Assert.That(actual, Is.InstanceOf(expected), null, null);
-        }
-
-        #endregion
-
-        #region IsInstanceOf<T>
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type</typeparam>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsInstanceOf<T>(object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.InstanceOf(typeof(T)), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type</typeparam>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsInstanceOf<T>(object actual, string message)
-        {
-            Assert.That(actual, Is.InstanceOf(typeof(T)), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is an instance of a given type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type</typeparam>
-        /// <param name="actual">The object being examined</param>
-        public static void IsInstanceOf<T>(object actual)
-        {
-            Assert.That(actual, Is.InstanceOf(typeof(T)), null, null);
-        }
-#endif
-
-        #endregion
-
-        #region IsNotInstanceOf
-
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotInstanceOf(Type expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotInstanceOf(Type expected, object actual, string message)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        public static void IsNotInstanceOf(Type expected, object actual)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(expected), null, null);
-        }
-
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [Obsolete]
-        public static void IsNotInstanceOfType(Type expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [Obsolete]
-        public static void IsNotInstanceOfType(Type expected, object actual, string message)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <param name="expected">The expected Type</param>
-        /// <param name="actual">The object being examined</param>
-        [Obsolete]
-        public static void IsNotInstanceOfType(Type expected, object actual)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(expected), null, null);
-        }
-
-        #endregion
-
-        #region IsNotInstanceOf<T>
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type</typeparam>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void IsNotInstanceOf<T>(object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type</typeparam>
-        /// <param name="actual">The object being examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void IsNotInstanceOf<T>(object actual, string message)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is not an instance of a given type.
-        /// </summary>
-        /// <typeparam name="T">The expected Type</typeparam>
-        /// <param name="actual">The object being examined</param>
-        public static void IsNotInstanceOf<T>(object actual)
-        {
-            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), null, null);
-        }
-#endif
-
-        #endregion
-
-        #region AreEqual
-
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreEqual(int expected, int actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreEqual(int expected, int actual, string message)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreEqual(int expected, int actual)
-        {
-            Assert.That(actual, Is.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreEqual(long expected, long actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreEqual(long expected, long actual, string message)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreEqual(long expected, long actual)
-        {
-            Assert.That(actual, Is.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void AreEqual(uint expected, uint actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void AreEqual(uint expected, uint actual, string message)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        [CLSCompliant(false)]
-        public static void AreEqual(uint expected, uint actual)
-        {
-            Assert.That(actual, Is.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void AreEqual(ulong expected, ulong actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void AreEqual(ulong expected, ulong actual, string message)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        [CLSCompliant(false)]
-        public static void AreEqual(ulong expected, ulong actual)
-        {
-            Assert.That(actual, Is.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreEqual(decimal expected, decimal actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreEqual(decimal expected, decimal actual, string message)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are equal. If they are not, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreEqual(decimal expected, decimal actual)
-        {
-            Assert.That(actual, Is.EqualTo(expected), null, null);
-        }
-
-        #endregion
-
-        #region AreEqual
-
-        /// <summary>
-        /// Verifies that two doubles are equal considering a delta. If the
-        /// expected value is infinity then the delta value is ignored. If 
-        /// they are not equal then an <see cref="AssertionException"/> is
-        /// thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="delta">The maximum acceptable difference between the
-        /// the expected and the actual</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreEqual(double expected, double actual, double delta, string message, params object[] args)
-        {
-            AssertDoublesAreEqual(expected, actual, delta, message, args);
-        }
-        /// <summary>
-        /// Verifies that two doubles are equal considering a delta. If the
-        /// expected value is infinity then the delta value is ignored. If 
-        /// they are not equal then an <see cref="AssertionException"/> is
-        /// thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="delta">The maximum acceptable difference between the
-        /// the expected and the actual</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreEqual(double expected, double actual, double delta, string message)
-        {
-            AssertDoublesAreEqual(expected, actual, delta, message, null);
-        }
-        /// <summary>
-        /// Verifies that two doubles are equal considering a delta. If the
-        /// expected value is infinity then the delta value is ignored. If 
-        /// they are not equal then an <see cref="AssertionException"/> is
-        /// thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="delta">The maximum acceptable difference between the
-        /// the expected and the actual</param>
-        public static void AreEqual(double expected, double actual, double delta)
-        {
-            AssertDoublesAreEqual(expected, actual, delta, null, null);
-        }
-
-#if 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 
-        /// they are not equal then an <see cref="AssertionException"/> is
-        /// thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="delta">The maximum acceptable difference between the
-        /// the expected and the actual</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreEqual(double expected, double? actual, double delta, string message, params object[] args)
-        {
-            AssertDoublesAreEqual(expected, (double)actual, delta, message, args);
-        }
-        /// <summary>
-        /// Verifies that two doubles are equal considering a delta. If the
-        /// expected value is infinity then the delta value is ignored. If 
-        /// they are not equal then an <see cref="AssertionException"/> is
-        /// thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="delta">The maximum acceptable difference between the
-        /// the expected and the actual</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreEqual(double expected, double? actual, double delta, string message)
-        {
-            AssertDoublesAreEqual(expected, (double)actual, delta, message, null);
-        }
-        /// <summary>
-        /// Verifies that two doubles are equal considering a delta. If the
-        /// expected value is infinity then the delta value is ignored. If 
-        /// they are not equal then an <see cref="AssertionException"/> is
-        /// thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="delta">The maximum acceptable difference between the
-        /// the expected and the actual</param>
-        public static void AreEqual(double expected, double? actual, double delta)
-        {
-            AssertDoublesAreEqual(expected, (double)actual, delta, null, null);
-        }
-#endif
-
-        #endregion
-
-        #region AreEqual
-
-        /// <summary>
-        /// Verifies that two objects are equal.  Two objects are considered
-        /// equal if both are null, or if both have the same value. NUnit
-        /// has special semantics for some object types.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The value that is expected</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreEqual(object expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two objects are equal.  Two objects are considered
-        /// equal if both are null, or if both have the same value. NUnit
-        /// has special semantics for some object types.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The value that is expected</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreEqual(object expected, object actual, string message)
-        {
-            Assert.That(actual, Is.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two objects are equal.  Two objects are considered
-        /// equal if both are null, or if both have the same value. NUnit
-        /// has special semantics for some object types.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The value that is expected</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreEqual(object expected, object actual)
-        {
-            Assert.That(actual, Is.EqualTo(expected), null, null);
-        }
-
-        #endregion
-
-        #region AreNotEqual
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotEqual(int expected, int actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotEqual(int expected, int actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreNotEqual(int expected, int actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotEqual(long expected, long actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotEqual(long expected, long actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreNotEqual(long expected, long actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void AreNotEqual(uint expected, uint actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void AreNotEqual(uint expected, uint actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        [CLSCompliant(false)]
-        public static void AreNotEqual(uint expected, uint actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void AreNotEqual(ulong expected, ulong actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void AreNotEqual(ulong expected, ulong actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        [CLSCompliant(false)]
-        public static void AreNotEqual(ulong expected, ulong actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotEqual(decimal expected, decimal actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotEqual(decimal expected, decimal actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreNotEqual(decimal expected, decimal actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotEqual(float expected, float actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotEqual(float expected, float actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreNotEqual(float expected, float actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotEqual(double expected, double actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotEqual(double expected, double actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two values are not equal. If they are equal, then an 
-        /// <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreNotEqual(double expected, double actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        #endregion
-
-        #region AreNotEqual
-
-        /// <summary>
-        /// Verifies that two objects are not equal.  Two objects are considered
-        /// equal if both are null, or if both have the same value. NUnit
-        /// has special semantics for some object types.
-        /// If they are equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The value that is expected</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotEqual(object expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
-        }
-        /// <summary>
-        /// Verifies that two objects are not equal.  Two objects are considered
-        /// equal if both are null, or if both have the same value. NUnit
-        /// has special semantics for some object types.
-        /// If they are equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The value that is expected</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotEqual(object expected, object actual, string message)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
-        }
-        /// <summary>
-        /// Verifies that two objects are not equal.  Two objects are considered
-        /// equal if both are null, or if both have the same value. NUnit
-        /// has special semantics for some object types.
-        /// If they are equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The value that is expected</param>
-        /// <param name="actual">The actual value</param>
-        public static void AreNotEqual(object expected, object actual)
-        {
-            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
-        }
-
-        #endregion
-
-        #region AreSame
-
-        /// <summary>
-        /// Asserts that two objects refer to the same object. If they
-        /// are not the same an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreSame(object expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.SameAs(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that two objects refer to the same object. If they
-        /// are not the same an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreSame(object expected, object actual, string message)
-        {
-            Assert.That(actual, Is.SameAs(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that two objects refer to the same object. If they
-        /// are not the same an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        public static void AreSame(object expected, object actual)
-        {
-            Assert.That(actual, Is.SameAs(expected), null, null);
-        }
-
-        #endregion
-
-        #region AreNotSame
-
-        /// <summary>
-        /// Asserts that two objects do not refer to the same object. If they
-        /// are the same an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void AreNotSame(object expected, object actual, string message, params object[] args)
-        {
-            Assert.That(actual, Is.Not.SameAs(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that two objects do not refer to the same object. If they
-        /// are the same an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void AreNotSame(object expected, object actual, string message)
-        {
-            Assert.That(actual, Is.Not.SameAs(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that two objects do not refer to the same object. If they
-        /// are the same an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The actual object</param>
-        public static void AreNotSame(object expected, object actual)
-        {
-            Assert.That(actual, Is.Not.SameAs(expected), null, null);
-        }
-
-        #endregion
-
-        #region Greater
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Greater(int arg1, int arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Greater(int arg1, int arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void Greater(int arg1, int arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void Greater(uint arg1, uint arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void Greater(uint arg1, uint arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        [CLSCompliant(false)]
-        public static void Greater(uint arg1, uint arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Greater(long arg1, long arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Greater(long arg1, long arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void Greater(long arg1, long arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void Greater(ulong arg1, ulong arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void Greater(ulong arg1, ulong arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        [CLSCompliant(false)]
-        public static void Greater(ulong arg1, ulong arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Greater(decimal arg1, decimal arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Greater(decimal arg1, decimal arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void Greater(decimal arg1, decimal arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Greater(double arg1, double arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Greater(double arg1, double arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void Greater(double arg1, double arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Greater(float arg1, float arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Greater(float arg1, float arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void Greater(float arg1, float arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Greater(IComparable arg1, IComparable arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Greater(IComparable arg1, IComparable arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void Greater(IComparable arg1, IComparable arg2)
-        {
-            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
-        }
-
-        #endregion
-
-        #region Less
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Less(int arg1, int arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Less(int arg1, int arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void Less(int arg1, int arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void Less(uint arg1, uint arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void Less(uint arg1, uint arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        [CLSCompliant(false)]
-        public static void Less(uint arg1, uint arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Less(long arg1, long arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Less(long arg1, long arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void Less(long arg1, long arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void Less(ulong arg1, ulong arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void Less(ulong arg1, ulong arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        [CLSCompliant(false)]
-        public static void Less(ulong arg1, ulong arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Less(decimal arg1, decimal arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Less(decimal arg1, decimal arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void Less(decimal arg1, decimal arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Less(double arg1, double arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Less(double arg1, double arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void Less(double arg1, double arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Less(float arg1, float arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Less(float arg1, float arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void Less(float arg1, float arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Less(IComparable arg1, IComparable arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Less(IComparable arg1, IComparable arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void Less(IComparable arg1, IComparable arg2)
-        {
-            Assert.That(arg1, Is.LessThan(arg2), null, null);
-        }
-
-        #endregion
-
-        #region GreaterOrEqual
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void GreaterOrEqual(int arg1, int arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void GreaterOrEqual(int arg1, int arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void GreaterOrEqual(int arg1, int arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void GreaterOrEqual(uint arg1, uint arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void GreaterOrEqual(uint arg1, uint arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        [CLSCompliant(false)]
-        public static void GreaterOrEqual(uint arg1, uint arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void GreaterOrEqual(long arg1, long arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void GreaterOrEqual(long arg1, long arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void GreaterOrEqual(long arg1, long arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void GreaterOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void GreaterOrEqual(ulong arg1, ulong arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        [CLSCompliant(false)]
-        public static void GreaterOrEqual(ulong arg1, ulong arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void GreaterOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void GreaterOrEqual(decimal arg1, decimal arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void GreaterOrEqual(decimal arg1, decimal arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void GreaterOrEqual(double arg1, double arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void GreaterOrEqual(double arg1, double arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void GreaterOrEqual(double arg1, double arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void GreaterOrEqual(float arg1, float arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void GreaterOrEqual(float arg1, float arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void GreaterOrEqual(float arg1, float arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void GreaterOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void GreaterOrEqual(IComparable arg1, IComparable arg2, string message)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is greater than or equal tothe second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be greater</param>
-        /// <param name="arg2">The second value, expected to be less</param>
-        public static void GreaterOrEqual(IComparable arg1, IComparable arg2)
-        {
-            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
-        }
-
-        #endregion
-
-        #region LessOrEqual
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void LessOrEqual(int arg1, int arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void LessOrEqual(int arg1, int arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void LessOrEqual(int arg1, int arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void LessOrEqual(uint arg1, uint arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void LessOrEqual(uint arg1, uint arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        [CLSCompliant(false)]
-        public static void LessOrEqual(uint arg1, uint arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void LessOrEqual(long arg1, long arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void LessOrEqual(long arg1, long arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void LessOrEqual(long arg1, long arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        [CLSCompliant(false)]
-        public static void LessOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        [CLSCompliant(false)]
-        public static void LessOrEqual(ulong arg1, ulong arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        [CLSCompliant(false)]
-        public static void LessOrEqual(ulong arg1, ulong arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void LessOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void LessOrEqual(decimal arg1, decimal arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void LessOrEqual(decimal arg1, decimal arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void LessOrEqual(double arg1, double arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void LessOrEqual(double arg1, double arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void LessOrEqual(double arg1, double arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void LessOrEqual(float arg1, float arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void LessOrEqual(float arg1, float arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void LessOrEqual(float arg1, float arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void LessOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void LessOrEqual(IComparable arg1, IComparable arg2, string message)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
-        }
-        /// <summary>
-        /// Verifies that the first value is less than or equal to the second
-        /// value. If it is not, then an
-        /// <see cref="AssertionException"/> is thrown. 
-        /// </summary>
-        /// <param name="arg1">The first value, expected to be less</param>
-        /// <param name="arg2">The second value, expected to be greater</param>
-        public static void LessOrEqual(IComparable arg1, IComparable arg2)
-        {
-            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
-        }
-
-        #endregion
-
-        #region Contains
-
-        /// <summary>
-        /// Asserts that an object is contained in a list.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The list to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Array of objects to be used in formatting the message</param>
-        public static void Contains(object expected, ICollection actual, string message, params object[] args)
-        {
-            Assert.That(actual, new CollectionContainsConstraint(expected), message, args);
-        }
-        /// <summary>
-        /// Asserts that an object is contained in a list.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The list to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        public static void Contains(object expected, ICollection actual, string message)
-        {
-            Assert.That(actual, new CollectionContainsConstraint(expected), message, null);
-        }
-        /// <summary>
-        /// Asserts that an object is contained in a list.
-        /// </summary>
-        /// <param name="expected">The expected object</param>
-        /// <param name="actual">The list to be examined</param>
-        public static void Contains(object expected, ICollection actual)
-        {
-            Assert.That(actual, new CollectionContainsConstraint(expected), null, null);
-        }
-
-        #endregion
-
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.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 Equals and ReferenceEquals
+
+        /// <summary>
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
+        {
+            throw new InvalidOperationException("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 InvalidOperationException("Assert.ReferenceEquals should not be used for Assertions");
+        }
+
+        #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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</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="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(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            IncrementAssertCount();
+            if (!constraint.Matches(actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+        #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
+
+        #region ref Boolean
+
+#if !CLR_2_0 && !CLR_4_0
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, 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="constraint">A Constraint to be applied</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="actual">The actual value to test</param>
+        /// <param name="constraint">A Constraint to be applied</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="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)
+        {
+            Constraint constraint = expression.Resolve();
+
+            IncrementAssertCount();
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+#endif
+
+        #endregion
+
+        #region ActualValueDelegate
+
+#if CLR_2_0 || CLR_4_0
+        /// <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>
+        static public void That<T>(ActualValueDelegate<T> 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="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>
+		static public void That<T>(ActualValueDelegate<T> 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<T>(ActualValueDelegate<T> del, IResolveConstraint expr, string message, params object[] args)
+		{
+			Constraint constraint = expr.Resolve();
+
+			IncrementAssertCount();
+			if (!constraint.Matches(del))
+			{
+				MessageWriter writer = new TextMessageWriter(message, args);
+				constraint.WriteMessageTo(writer);
+				throw new AssertionException(writer.ToString());
+			}
+		}
+#else
+        /// <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>
+        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="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>
+        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();
+
+            IncrementAssertCount();
+            if (!constraint.Matches(del))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+#endif
+
+        #endregion
+
+        #region ref Object
+
+#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.
+        /// </summary>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression)
+        {
+            Assert.That(ref actual, expression, 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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</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, 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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint 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<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            IncrementAssertCount();
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new AssertionException(writer.ToString());
+            }
+        }
+#endif
+        #endregion
+
+        #region TestDelegate
+
+        /// <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
+
+        #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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</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="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 ByVal(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Assert.That(actual, expression, message, args);
+        }
+        #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 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 Throws(IResolveConstraint expression, TestDelegate code, string message, params object[] args)
+        {
+            Exception caughtException = null;
+
+#if CLR_2_0 || CLR_4_0
+			if (AsyncInvocationRegion.IsAsyncOperation(code))
+			{
+				using (AsyncInvocationRegion region = AsyncInvocationRegion.Create(code))
+				{
+					code();
+
+					try
+					{
+						region.WaitForPendingOperationsToComplete(null);
+					}
+					catch (Exception e)
+					{
+						caughtException = e;
+					}
+				}
+			}
+			else
+#endif
+            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 TestDelegate</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 TestDelegate</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 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 Throws(Type expectedExceptionType, TestDelegate code, string message, params object[] args)
+        {
+            return Throws(new ExceptionTypeConstraint(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 TestDelegate</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 ExceptionTypeConstraint(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 TestDelegate</param>
+        public static Exception Throws(Type expectedExceptionType, TestDelegate code)
+        {
+            return Throws(new ExceptionTypeConstraint(expectedExceptionType), code, string.Empty, null);
+        }
+
+        #endregion
+
+        #region Throws<T>
+#if CLR_2_0 || CLR_4_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 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 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 TestDelegate</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 TestDelegate</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 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.
+        /// </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 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 void DoesNotThrow(TestDelegate code, string message, params object[] args)
+        {
+            Assert.That(code, new ThrowsNothingConstraint(), message, args);
+        }
+
+        /// <summary>
+        /// Verifies that a delegate does not throw an exception.
+        /// </summary>
+        /// <param name="code">A TestDelegate</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 TestDelegate</param>
+        public static void DoesNotThrow(TestDelegate code)
+        {
+            DoesNotThrow(code, string.Empty, null);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region True
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void True(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.True, message, args);
+        }
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void True(bool condition, string message)
+        {
+            Assert.That(condition, Is.True, message, null);
+        }
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        public static void True(bool condition)
+        {
+            Assert.That(condition, Is.True, null, null);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsTrue(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.True, message, args);
+        }
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsTrue(bool condition, string message)
+        {
+            Assert.That(condition, Is.True, message, null);
+        }
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        public static void IsTrue(bool condition)
+        {
+            Assert.That(condition, Is.True, null, null);
+        }
+
+        #endregion
+
+        #region False
+
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void False(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.False, message, args);
+        }
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void False(bool condition, string message)
+        {
+            Assert.That(condition, Is.False, message, null);
+        }
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        public static void False(bool condition)
+        {
+            Assert.That(condition, Is.False, null, null);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsFalse(bool condition, string message, params object[] args)
+        {
+            Assert.That(condition, Is.False, message, args);
+        }
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsFalse(bool condition, string message)
+        {
+            Assert.That(condition, Is.False, message, null);
+        }
+        /// <summary>
+        /// Asserts that a condition is false. If the condition is true the method throws
+        /// an <see cref="AssertionException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        public static void IsFalse(bool condition)
+        {
+            Assert.That(condition, Is.False, null, null);
+        }
+
+        #endregion
+
+        #region NotNull
+
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void NotNull(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Not.Null, message, args);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void NotNull(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Not.Null, message, null);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void NotNull(object anObject)
+        {
+            Assert.That(anObject, Is.Not.Null, null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotNull(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Not.Null, message, args);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotNull(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Not.Null, message, null);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is not equal to <code>null</code>
+        /// If the object is <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void IsNotNull(object anObject)
+        {
+            Assert.That(anObject, Is.Not.Null, null, null);
+        }
+
+        #endregion
+
+        #region Null
+
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Null(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Null, message, args);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Null(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Null, message, null);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void Null(object anObject)
+        {
+            Assert.That(anObject, Is.Null, null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNull(object anObject, string message, params object[] args)
+        {
+            Assert.That(anObject, Is.Null, message, args);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNull(object anObject, string message)
+        {
+            Assert.That(anObject, Is.Null, message, null);
+        }
+        /// <summary>
+        /// Verifies that the object that is passed in is equal to <code>null</code>
+        /// If the object is not <code>null</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="anObject">The object that is to be tested</param>
+        public static void IsNull(object anObject)
+        {
+            Assert.That(anObject, Is.Null, null, null);
+        }
+
+        #endregion
+
+        #region AreEqual
+
+        #region Ints
+
+        /// <summary>
+        /// Verifies that two ints are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(int expected, int actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two ints are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(int expected, int actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two ints are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(int expected, int actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Longs
+
+        /// <summary>
+        /// Verifies that two longs are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(long expected, long actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two longs are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(long expected, long actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two longs are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(long expected, long actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Unsigned Ints
+
+        /// <summary>
+        /// Verifies that two unsigned ints are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(uint expected, uint actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two unsigned ints are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(uint expected, uint actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two unsigned ints are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(uint expected, uint actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Unsigned Longs
+
+        /// <summary>
+        /// Verifies that two unsigned longs are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(ulong expected, ulong actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two unsigned longs are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(ulong expected, ulong actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two unsigned longs are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreEqual(ulong expected, ulong actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Decimals
+
+        /// <summary>
+        /// Verifies that two decimals are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(decimal expected, decimal actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two decimals are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(decimal expected, decimal actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two decimals are equal. If they are not, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(decimal expected, decimal actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Doubles
+
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(double expected, double actual, double delta, string message, params object[] args)
+        {
+            AssertDoublesAreEqual(expected, actual, delta, message, args);
+        }
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(double expected, double actual, double delta, string message)
+        {
+            AssertDoublesAreEqual(expected, actual, delta, message, null);
+        }
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        public static void AreEqual(double expected, double actual, double delta)
+        {
+            AssertDoublesAreEqual(expected, actual, delta, null, null);
+        }
+
+#if 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 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(double expected, double? actual, double delta, string message, params object[] args)
+        {
+            AssertDoublesAreEqual(expected, (double)actual, delta, message, args);
+        }
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(double expected, double? actual, double delta, string message)
+        {
+            AssertDoublesAreEqual(expected, (double)actual, delta, message, null);
+        }
+        /// <summary>
+        /// Verifies that two doubles are equal considering a delta. If the
+        /// expected value is infinity then the delta value is ignored. If 
+        /// they are not equal then an <see cref="AssertionException"/> is
+        /// thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="delta">The maximum acceptable difference between the
+        /// the expected and the actual</param>
+        public static void AreEqual(double expected, double? actual, double delta)
+        {
+            AssertDoublesAreEqual(expected, (double)actual, delta, null, null);
+        }
+#endif
+
+        #endregion
+
+        #region Objects
+
+        /// <summary>
+        /// Verifies that two objects are equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreEqual(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two objects are equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreEqual(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two objects are equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreEqual(object expected, object actual)
+        {
+            Assert.That(actual, Is.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region AreNotEqual
+
+        #region Ints
+
+        /// <summary>
+        /// Verifies that two ints are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(int expected, int actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two ints are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(int expected, int actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two ints are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(int expected, int actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Longs
+
+        /// <summary>
+        /// Verifies that two longs are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(long expected, long actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two longs are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(long expected, long actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two longs are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(long expected, long actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Unsigned Ints
+
+        /// <summary>
+        /// Verifies that two unsigned ints are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(uint expected, uint actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two unsigned ints are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(uint expected, uint actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two unsigned ints are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(uint expected, uint actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Unsigned Longs
+
+        /// <summary>
+        /// Verifies that two unsigned longs are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(ulong expected, ulong actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two unsigned longs are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(ulong expected, ulong actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two unsigned longs are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        [CLSCompliant(false)]
+        public static void AreNotEqual(ulong expected, ulong actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Decimals
+
+        /// <summary>
+        /// Verifies that two decimals are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(decimal expected, decimal actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two decimals are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(decimal expected, decimal actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two decimals are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(decimal expected, decimal actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Floats
+
+        /// <summary>
+        /// Verifies that two floats are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(float expected, float actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two floats are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(float expected, float actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two floats are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(float expected, float actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Doubles
+
+        /// <summary>
+        /// Verifies that two doubles are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(double expected, double actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two doubles are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(double expected, double actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two doubles are not equal. If they are equal, then an 
+        /// <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(double expected, double actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #region Objects
+
+        /// <summary>
+        /// Verifies that two objects are not equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotEqual(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, args);
+        }
+        /// <summary>
+        /// Verifies that two objects are not equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotEqual(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), message, null);
+        }
+        /// <summary>
+        /// Verifies that two objects are not equal.  Two objects are considered
+        /// equal if both are null, or if both have the same value. NUnit
+        /// has special semantics for some object types.
+        /// If they are equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The value that is expected</param>
+        /// <param name="actual">The actual value</param>
+        public static void AreNotEqual(object expected, object actual)
+        {
+            Assert.That(actual, Is.Not.EqualTo(expected), null, null);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region AreSame
+
+        /// <summary>
+        /// Asserts that two objects refer to the same object. If they
+        /// are not the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreSame(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.SameAs(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that two objects refer to the same object. If they
+        /// are not the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreSame(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.SameAs(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that two objects refer to the same object. If they
+        /// are not the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        public static void AreSame(object expected, object actual)
+        {
+            Assert.That(actual, Is.SameAs(expected), null, null);
+        }
+
+        #endregion
+
+        #region AreNotSame
+
+        /// <summary>
+        /// Asserts that two objects do not refer to the same object. If they
+        /// are the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void AreNotSame(object expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.SameAs(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that two objects do not refer to the same object. If they
+        /// are the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void AreNotSame(object expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.SameAs(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that two objects do not refer to the same object. If they
+        /// are the same an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The actual object</param>
+        public static void AreNotSame(object expected, object actual)
+        {
+            Assert.That(actual, Is.Not.SameAs(expected), null, null);
+        }
+
+        #endregion
+
+        #region IsNaN
+
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNaN(double aDouble, string message, params object[] args)
+        {
+            Assert.That(aDouble, Is.NaN, message, args);
+        }
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNaN(double aDouble, string message)
+        {
+            Assert.That(aDouble, Is.NaN, message, null);
+        }
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        public static void IsNaN(double aDouble)
+        {
+            Assert.That(aDouble, Is.NaN, null, null);
+        }
+
+#if 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"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNaN(double? aDouble, string message, params object[] args)
+        {
+            Assert.That(aDouble, Is.NaN, message, args);
+        }
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNaN(double? aDouble, string message)
+        {
+            Assert.That(aDouble, Is.NaN, message, null);
+        }
+        /// <summary>
+        /// Verifies that the double that is passed in is an <code>NaN</code> value.
+        /// If the object is not <code>NaN</code> then an <see cref="AssertionException"/>
+        /// is thrown.
+        /// </summary>
+        /// <param name="aDouble">The value that is to be tested</param>
+        public static void IsNaN(double? aDouble)
+        {
+            Assert.That(aDouble, Is.NaN, null, null);
+        }
+#endif
+
+        #endregion
+
+        #region IsEmpty
+
+        /// <summary>
+        /// Assert that a string is empty - that is equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, new EmptyStringConstraint(), message, args);
+        }
+        /// <summary>
+        /// Assert that a string is empty - that is equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsEmpty(string aString, string message)
+        {
+            Assert.That(aString, new EmptyStringConstraint(), message, null);
+        }
+        /// <summary>
+        /// Assert that a string is empty - that is equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsEmpty(string aString)
+        {
+            Assert.That(aString, new EmptyStringConstraint(), null, null);
+        }
+
+        #endregion
+
+        #region IsEmpty
+
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsEmpty(IEnumerable collection, string message, params object[] args)
+        {
+            Assert.That(collection, new EmptyCollectionConstraint(), message, args);
+        }
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsEmpty(IEnumerable collection, string message)
+        {
+            Assert.That(collection, new EmptyCollectionConstraint(), message, null);
+        }
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        public static void IsEmpty(IEnumerable collection)
+        {
+            Assert.That(collection, new EmptyCollectionConstraint(), null, null);
+        }
+
+        #endregion
+
+        #region IsNotEmpty
+
+        /// <summary>
+        /// Assert that a string is not empty - that is not equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, Is.Not.Empty, message, args);
+        }
+        /// <summary>
+        /// Assert that a string is not empty - that is not equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotEmpty(string aString, string message)
+        {
+            Assert.That(aString, Is.Not.Empty, message, null);
+        }
+        /// <summary>
+        /// Assert that a string is not empty - that is not equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsNotEmpty(string aString)
+        {
+            Assert.That(aString, Is.Not.Empty, null, null);
+        }
+
+        #endregion
+
+        #region IsNotEmpty
+
+        /// <summary>
+        /// Assert that an array, list or other collection is not empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotEmpty(IEnumerable collection, string message, params object[] args)
+        {
+            Assert.That(collection, Is.Not.Empty, message, args);
+        }
+        /// <summary>
+        /// Assert that an array, list or other collection is not empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotEmpty(IEnumerable collection, string message)
+        {
+            Assert.That(collection, Is.Not.Empty, message, null);
+        }
+        /// <summary>
+        /// Assert that an array, list or other collection is not empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing ICollection</param>
+        public static void IsNotEmpty(IEnumerable collection)
+        {
+            Assert.That(collection, Is.Not.Empty, null, null);
+        }
+
+        #endregion
+
+        #region IsNullOrEmpty
+
+        /// <summary>
+        /// Assert that a string is either null or equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNullOrEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, new NullOrEmptyStringConstraint(), message, args);
+        }
+        /// <summary>
+        /// Assert that a string is either null or equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNullOrEmpty(string aString, string message)
+        {
+            Assert.That(aString, new NullOrEmptyStringConstraint(), message, null);
+        }
+        /// <summary>
+        /// Assert that a string is either null or equal to string.Empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsNullOrEmpty(string aString)
+        {
+            Assert.That(aString, new NullOrEmptyStringConstraint(), null, null);
+        }
+
+        #endregion
+
+        #region IsNotNullOrEmpty
+
+        /// <summary>
+        /// Assert that a string is not null or empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotNullOrEmpty(string aString, string message, params object[] args)
+        {
+            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), message, args);
+        }
+        /// <summary>
+        /// Assert that a string is not null or empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotNullOrEmpty(string aString, string message)
+        {
+            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), message, null);
+        }
+        /// <summary>
+        /// Assert that a string is not null or empty
+        /// </summary>
+        /// <param name="aString">The string to be tested</param>
+        public static void IsNotNullOrEmpty(string aString)
+        {
+            Assert.That(aString, new NotConstraint(new NullOrEmptyStringConstraint()), null, null);
+        }
+
+        #endregion
+
+        #region IsAssignableFrom
+
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsAssignableFrom(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.AssignableFrom(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsAssignableFrom(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.AssignableFrom(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        public static void IsAssignableFrom(Type expected, object actual)
+        {
+            Assert.That(actual, Is.AssignableFrom(expected), null, null);
+        }
+
+        #endregion
+
+        #region IsAssignableFrom<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsAssignableFrom<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.AssignableFrom(typeof(T)), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsAssignableFrom<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.AssignableFrom(typeof(T)), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object may be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        public static void IsAssignableFrom<T>(object actual)
+        {
+            Assert.That(actual, Is.AssignableFrom(typeof(T)), null, null);
+        }
+#endif
+
+        #endregion
+
+        #region IsNotAssignableFrom
+
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotAssignableFrom(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotAssignableFrom(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <param name="expected">The expected Type.</param>
+        /// <param name="actual">The object under examination</param>
+        public static void IsNotAssignableFrom(Type expected, object actual)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(expected), null, null);
+        }
+
+        #endregion
+
+        #region IsNotAssignableFrom<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotAssignableFrom<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotAssignableFrom<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object may not be assigned a  value of a given Type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type.</typeparam>
+        /// <param name="actual">The object under examination</param>
+        public static void IsNotAssignableFrom<T>(object actual)
+        {
+            Assert.That(actual, Is.Not.AssignableFrom(typeof(T)), null, null);
+        }
+#endif
+
+        #endregion
+
+        #region IsInstanceOf
+
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsInstanceOf(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.InstanceOf(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsInstanceOf(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.InstanceOf(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        public static void IsInstanceOf(Type expected, object actual)
+        {
+            Assert.That(actual, Is.InstanceOf(expected), null, null);
+        }
+
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [Obsolete]
+        public static void IsInstanceOfType(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.InstanceOf(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [Obsolete]
+        public static void IsInstanceOfType(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.InstanceOf(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        [Obsolete]
+        public static void IsInstanceOfType(Type expected, object actual)
+        {
+            Assert.That(actual, Is.InstanceOf(expected), null, null);
+        }
+
+        #endregion
+
+        #region IsInstanceOf<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsInstanceOf<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.InstanceOf(typeof(T)), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsInstanceOf<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.InstanceOf(typeof(T)), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        public static void IsInstanceOf<T>(object actual)
+        {
+            Assert.That(actual, Is.InstanceOf(typeof(T)), null, null);
+        }
+#endif
+
+        #endregion
+
+        #region IsNotInstanceOf
+
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotInstanceOf(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotInstanceOf(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        public static void IsNotInstanceOf(Type expected, object actual)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected), null, null);
+        }
+
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [Obsolete]
+        public static void IsNotInstanceOfType(Type expected, object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [Obsolete]
+        public static void IsNotInstanceOfType(Type expected, object actual, string message)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <param name="expected">The expected Type</param>
+        /// <param name="actual">The object being examined</param>
+        [Obsolete]
+        public static void IsNotInstanceOfType(Type expected, object actual)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(expected), null, null);
+        }
+
+        #endregion
+
+        #region IsNotInstanceOf<T>
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void IsNotInstanceOf<T>(object actual, string message, params object[] args)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void IsNotInstanceOf<T>(object actual, string message)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is not an instance of a given type.
+        /// </summary>
+        /// <typeparam name="T">The expected Type</typeparam>
+        /// <param name="actual">The object being examined</param>
+        public static void IsNotInstanceOf<T>(object actual)
+        {
+            Assert.That(actual, Is.Not.InstanceOf(typeof(T)), null, null);
+        }
+#endif
+
+        #endregion
+
+        #region Greater
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Greater(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Greater(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void Greater(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Greater(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Greater(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void Greater(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Greater(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Greater(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void Greater(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.GreaterThan(arg2), null, null);
+        }
+
+        #endregion
+
+        #region Less
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Less(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Less(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void Less(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void Less(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void Less(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void Less(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Less(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Less(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void Less(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.LessThan(arg2), null, null);
+        }
+
+        #endregion
+
+        #region GreaterOrEqual
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        [CLSCompliant(false)]
+        public static void GreaterOrEqual(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void GreaterOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void GreaterOrEqual(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is greater than or equal tothe second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be greater</param>
+        /// <param name="arg2">The second value, expected to be less</param>
+        public static void GreaterOrEqual(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.GreaterThanOrEqualTo(arg2), null, null);
+        }
+
+        #endregion
+
+        #region LessOrEqual
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(int arg1, int arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(int arg1, int arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(int arg1, int arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(uint arg1, uint arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(uint arg1, uint arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(uint arg1, uint arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(long arg1, long arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(long arg1, long arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(long arg1, long arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(ulong arg1, ulong arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(ulong arg1, ulong arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        [CLSCompliant(false)]
+        public static void LessOrEqual(ulong arg1, ulong arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(decimal arg1, decimal arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(decimal arg1, decimal arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(decimal arg1, decimal arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(double arg1, double arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(double arg1, double arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(double arg1, double arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(float arg1, float arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(float arg1, float arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(float arg1, float arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void LessOrEqual(IComparable arg1, IComparable arg2, string message, params object[] args)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, args);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void LessOrEqual(IComparable arg1, IComparable arg2, string message)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), message, null);
+        }
+        /// <summary>
+        /// Verifies that the first value is less than or equal to the second
+        /// value. If it is not, then an
+        /// <see cref="AssertionException"/> is thrown. 
+        /// </summary>
+        /// <param name="arg1">The first value, expected to be less</param>
+        /// <param name="arg2">The second value, expected to be greater</param>
+        public static void LessOrEqual(IComparable arg1, IComparable arg2)
+        {
+            Assert.That(arg1, Is.LessThanOrEqualTo(arg2), null, null);
+        }
+
+        #endregion
+
+        #region Contains
+
+        /// <summary>
+        /// Asserts that an object is contained in a list.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The list to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Array of objects to be used in formatting the message</param>
+        public static void Contains(object expected, ICollection actual, string message, params object[] args)
+        {
+            Assert.That(actual, new CollectionContainsConstraint(expected), message, args);
+        }
+        /// <summary>
+        /// Asserts that an object is contained in a list.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The list to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        public static void Contains(object expected, ICollection actual, string message)
+        {
+            Assert.That(actual, new CollectionContainsConstraint(expected), message, null);
+        }
+        /// <summary>
+        /// Asserts that an object is contained in a list.
+        /// </summary>
+        /// <param name="expected">The expected object</param>
+        /// <param name="actual">The list to be examined</param>
+        public static void Contains(object expected, ICollection actual)
+        {
+            Assert.That(actual, new CollectionContainsConstraint(expected), null, null);
+        }
+
+        #endregion
+
+        #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);
+        }
+
+        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
+    }
+}
diff --git a/src/NUnitFramework/framework/AssertionHelper.cs b/src/NUnitFramework/framework/AssertionHelper.cs
index dc78048..297bf94 100644
--- a/src/NUnitFramework/framework/AssertionHelper.cs
+++ b/src/NUnitFramework/framework/AssertionHelper.cs
@@ -1,248 +1,305 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// AssertionHelper is an optional base class for user tests,
-	/// allowing the use of shorter names for constraints and
-	/// asserts and avoiding conflict with the definition of 
-	/// <see cref="Is"/>, from which it inherits much of its
-	/// behavior, in certain mock object frameworks.
-	/// </summary>
-	public class AssertionHelper : ConstraintFactory
-    {
-        #region Assert
-        //private Assertions assert = new Assertions();
-        //public virtual Assertions Assert
-        //{
-        //    get { return assert; }
-        //}
-        #endregion
-
-        #region Expect
-
-        #region Object
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure. Works
-        /// identically to Assert.That
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        public void Expect(object actual, IResolveConstraint constraint)
-        {
-            Assert.That(actual, constraint, null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure. Works
-        /// identically to Assert.That.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        public void Expect(object actual, IResolveConstraint constraint, string message)
-        {
-            Assert.That(actual, constraint, message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure. Works
-        /// identically to Assert.That
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public void Expect(object actual, IResolveConstraint constraint, string message, params object[] args)
-        {
-            Assert.That(actual, constraint, message, args);
-        }
-        #endregion
-
-        #region ActualValueDelegate
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="expr">A Constraint expression to be applied</param>
-        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
-        public void Expect(ActualValueDelegate del, IResolveConstraint expr)
-        {
-            Assert.That(del, expr.Resolve(), null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="expr">A Constraint expression to be applied</param>
-        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        public void Expect(ActualValueDelegate del, IResolveConstraint expr, string message)
-        {
-            Assert.That(del, expr.Resolve(), message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
-        /// <param name="expr">A Constraint expression to be applied</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public void Expect(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
-        {
-            Assert.That(del, expr, message, args);
-        }
-        #endregion
-
-        #region ref Object
-#if 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.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        public void Expect<T>(ref T actual, IResolveConstraint constraint)
-        {
-            Assert.That(ref actual, constraint.Resolve(), null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        public void Expect<T>(ref T actual, IResolveConstraint constraint, string message)
-        {
-            Assert.That(ref actual, constraint.Resolve(), message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="expression">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public void Expect<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
-        {
-            Assert.That(ref actual, expression, message, args);
-        }
-#else
-        /// <summary>
-        /// Apply a constraint to a referenced boolean, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        public void Expect(ref bool actual, IResolveConstraint constraint)
-        {
-            Assert.That(ref actual, constraint.Resolve(), null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        public void Expect(ref bool actual, IResolveConstraint constraint, string message)
-        {
-            Assert.That(ref actual, constraint.Resolve(), message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an assertion exception on failure.
-        /// </summary>
-        /// <param name="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)
-        {
-            Assert.That( ref actual, expression, message, args );
-        }
-#endif
-        #endregion
-
-        #region Boolean
-        /// <summary>
-		/// Asserts that a condition is true. If the condition is false the method throws
-		/// an <see cref="AssertionException"/>. Works Identically to Assert.That.
-		/// </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>
-		public void Expect(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"/>. 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>
-		public void Expect(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"/>. Works Identically Assert.That.
-		/// </summary>
-		/// <param name="condition">The evaluated condition</param>
-		public void Expect(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>
-        public void Expect(TestDelegate code, IResolveConstraint constraint)
-        {
-            Assert.That((object)code, constraint);
-        }
-
-        #endregion
-
-        #region Map
-        /// <summary>
-		/// Returns a ListMapper based on a collection.
-		/// </summary>
-		/// <param name="original">The original collection</param>
-		/// <returns></returns>
-		public ListMapper Map( ICollection original )
-		{
-			return new ListMapper( original );
-		}
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// AssertionHelper is an optional base class for user tests,
+	/// allowing the use of shorter names for constraints and
+	/// asserts and avoiding conflict with the definition of 
+	/// <see cref="Is"/>, from which it inherits much of its
+	/// behavior, in certain mock object frameworks.
+	/// </summary>
+	public class AssertionHelper : ConstraintFactory
+    {
+        #region Assert
+        //private Assertions assert = new Assertions();
+        //public virtual Assertions Assert
+        //{
+        //    get { return assert; }
+        //}
+        #endregion
+
+        #region Expect
+
+        #region Object
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure. Works
+        /// identically to Assert.That.
+        /// </summary>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        public void Expect(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. Works
+        /// identically to Assert.That.
+        /// </summary>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="message">The message to be displayed in case of failure</param>
+        public void Expect(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. Works
+        /// identically to Assert.That.
+        /// </summary>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="message">The message to be displayed in case of failure</param>
+        /// <param name="args">Arguments to use in formatting the message</param>
+        public void Expect(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Assert.That(actual, expression, message, args);
+        }
+
+        #endregion
+
+        #region Boolean
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="AssertionException"/>. Works Identically to 
+        /// <see cref="Assert.That(bool, string, object[])"/>.
+        /// </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>
+        public void Expect(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"/>. Works Identically to
+        /// <see cref="Assert.That(bool, string)"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        public void Expect(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"/>. Works Identically to <see cref="Assert.That(bool)"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        public void Expect(bool condition)
+        {
+            Assert.That(condition, Is.True, null, null);
+        }
+
+        #endregion
+
+        #region ref Boolean
+
+#if !CLR_2_0 && !CLR_4_0
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        public void Expect(ref bool actual, IResolveConstraint constraint)
+        {
+            Assert.That(ref actual, constraint.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="constraint">A Constraint to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect(ref bool actual, IResolveConstraint constraint, string message)
+        {
+            Assert.That(ref actual, constraint.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="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)
+        {
+            Assert.That(ref actual, expression, message, args);
+        }
+#endif
+
+        #endregion
+
+        #region ActualValueDelegate
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+		/// Apply a constraint to an actual value, succeeding if the constraint
+		/// is satisfied and throwing an assertion exception on failure.
+		/// </summary>
+		/// <param name="expr">A Constraint expression to be applied</param>
+		/// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+		public void Expect<T>(ActualValueDelegate<T> del, IResolveConstraint expr)
+		{
+			Assert.That(del, expr.Resolve(), null, null);
+		}
+
+		/// <summary>
+		/// Apply a constraint to an actual value, succeeding if the constraint
+		/// is satisfied and throwing an assertion exception on failure.
+		/// </summary>
+		/// <param name="expr">A Constraint expression to be applied</param>
+		/// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public void Expect<T>(ActualValueDelegate<T> del, IResolveConstraint expr, string message)
+		{
+			Assert.That(del, expr.Resolve(), message, null);
+		}
+
+		/// <summary>
+		/// Apply a constraint to an actual value, succeeding if the constraint
+		/// is satisfied and throwing an assertion exception on failure.
+		/// </summary>
+		/// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+		/// <param name="expr">A Constraint expression to be applied</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		public void Expect<T>(ActualValueDelegate<T> del, IResolveConstraint expr, string message, params object[] args)
+		{
+			Assert.That(del, expr, message, args);
+		}
+#else
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        public void Expect(ActualValueDelegate del, IResolveConstraint expr)
+        {
+            Assert.That(del, expr.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect(ActualValueDelegate del, IResolveConstraint expr, string message)
+        {
+            Assert.That(del, expr.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an assertion exception on failure.
+        /// </summary>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public void Expect(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
+        {
+            Assert.That(del, expr, message, args);
+        }
+#endif
+
+        #endregion
+
+        #region ref Object
+
+#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.
+        /// </summary>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        public void Expect<T>(ref T actual, IResolveConstraint expression)
+        {
+            Assert.That(ref actual, expression, 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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        public void Expect<T>(ref T actual, IResolveConstraint expression, string message)
+        {
+            Assert.That(ref actual, expression, 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="actual">The actual value to test</param>
+        /// <param name="expression">A Constraint 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<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Assert.That(ref actual, expression, message, args);
+        }
+#endif
+        #endregion
+
+        #region TestDelegate
+
+        /// <summary>
+        /// Asserts that the code represented by a delegate throws an exception
+        /// that satisfies the constraint provided.
+        /// </summary>
+        /// <param name="code">A TestDelegate to be executed</param>
+        /// <param name="constraint">A ThrowsConstraint used in the test</param>
+        public void Expect(TestDelegate code, IResolveConstraint constraint)
+        {
+            Assert.That((object)code, constraint);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region Map
+        /// <summary>
+		/// Returns a ListMapper based on a collection.
+		/// </summary>
+		/// <param name="original">The original collection</param>
+		/// <returns></returns>
+		public ListMapper Map( ICollection original )
+		{
+			return new ListMapper( original );
+		}
+		#endregion
+	}
+}
diff --git a/src/NUnitFramework/framework/Assume.cs b/src/NUnitFramework/framework/Assume.cs
index cbcd02b..5c06251 100644
--- a/src/NUnitFramework/framework/Assume.cs
+++ b/src/NUnitFramework/framework/Assume.cs
@@ -1,279 +1,337 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.ComponentModel;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Provides static methods to express the assumptions
-    /// that must be met for a test to give a meaningful
-    /// result. If an assumption is not met, the test
-    /// should produce an inconclusive result.
-    /// </summary>
-    public class Assume
-    {
-        #region Equals and ReferenceEquals
-
-        /// <summary>
-        /// The Equals method throws an AssertionException. This is done 
-        /// to make sure there is no mistake by calling this function.
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public static new bool Equals(object a, object b)
-        {
-            // TODO: This should probably be InvalidOperationException
-            throw new AssertionException("Assert.Equals should not be used for Assertions");
-        }
-
-        /// <summary>
-        /// override the default ReferenceEquals to throw an AssertionException. This 
-        /// implementation makes sure there is no mistake in calling this function 
-        /// as part of Assert. 
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        public static new void ReferenceEquals(object a, object b)
-        {
-            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
-        }
-
-        #endregion
-
-        #region Assume.That
-
-        #region Object
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expression">A Constraint expression to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        static public void That(object actual, IResolveConstraint expression)
-        {
-            Assume.That(actual, expression, null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expression">A Constraint expression to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        static public void That(object actual, IResolveConstraint expression, string message)
-        {
-            Assume.That(actual, expression, message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expression">A Constraint expression to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void That(object actual, IResolveConstraint expression, string message, params object[] args)
-        {
-            Constraint constraint = expression.Resolve();
-
-            if (!constraint.Matches(actual))
-            {
-                MessageWriter writer = new TextMessageWriter(message, args);
-                constraint.WriteMessageTo(writer);
-                throw new InconclusiveException(writer.ToString());
-            }
-        }
-        #endregion
-
-        #region ActualValueDelegate
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expr">A Constraint expression to be applied</param>
-        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
-        static public void That(ActualValueDelegate del, IResolveConstraint expr)
-        {
-            Assume.That(del, expr.Resolve(), null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expr">A Constraint expression to be applied</param>
-        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message)
-        {
-            Assume.That(del, expr.Resolve(), message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to an actual value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
-        /// <param name="expr">A Constraint expression to be applied</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
-        {
-            Constraint constraint = expr.Resolve();
-
-            if (!constraint.Matches(del))
-            {
-                MessageWriter writer = new TextMessageWriter(message, args);
-                constraint.WriteMessageTo(writer);
-                throw new InconclusiveException(writer.ToString());
-            }
-        }
-        #endregion
-
-        #region ref Object
-#if 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.
-        /// </summary>
-        /// <param name="expression">A Constraint expression to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        static public void That<T>(ref T actual, IResolveConstraint expression)
-        {
-            Assume.That(ref actual, expression.Resolve(), null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expression">A Constraint expression to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        static public void That<T>(ref T actual, IResolveConstraint expression, string message)
-        {
-            Assume.That(ref actual, expression.Resolve(), message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="expression">A Constraint expression to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void That<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
-        {
-            Constraint constraint = expression.Resolve();
-
-            if (!constraint.Matches(ref actual))
-            {
-                MessageWriter writer = new TextMessageWriter(message, args);
-                constraint.WriteMessageTo(writer);
-                throw new InconclusiveException(writer.ToString());
-            }
-        }
-#else
-        /// <summary>
-        /// Apply a constraint to a referenced boolean, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        static public void That(ref bool actual, IResolveConstraint constraint)
-        {
-            Assume.That(ref actual, constraint.Resolve(), null, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="constraint">A Constraint to be applied</param>
-        /// <param name="actual">The actual value to test</param>
-        /// <param name="message">The message that will be displayed on failure</param>
-        static public void That(ref bool actual, IResolveConstraint constraint, string message)
-        {
-            Assume.That(ref actual, constraint.Resolve(), message, null);
-        }
-
-        /// <summary>
-        /// Apply a constraint to a referenced value, succeeding if the constraint
-        /// is satisfied and throwing an InconclusiveException on failure.
-        /// </summary>
-        /// <param name="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)
-        {
-            Constraint constraint = expression.Resolve();
-
-            if (!constraint.Matches(ref actual))
-            {
-                MessageWriter writer = new TextMessageWriter(message, args);
-                constraint.WriteMessageTo(writer);
-                throw new InconclusiveException(writer.ToString());
-            }
-        }
-#endif
-        #endregion
-
-        #region Boolean
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="InconclusiveException"/>.
-        /// </summary> 
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display if the condition is false</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void That(bool condition, string message, params object[] args)
-        {
-            Assume.That(condition, Is.True, message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the method throws
-        /// an <see cref="InconclusiveException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        /// <param name="message">The message to display if the condition is false</param>
-        static public void That(bool condition, string message)
-        {
-            Assume.That(condition, Is.True, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a condition is true. If the condition is false the 
-        /// method throws an <see cref="InconclusiveException"/>.
-        /// </summary>
-        /// <param name="condition">The evaluated condition</param>
-        static public void That(bool condition)
-        {
-            Assume.That(condition, Is.True, null, null);
-        }
-        #endregion
-
-        /// <summary>
-        /// Asserts that the code represented by a delegate throws an exception
-        /// that satisfies the constraint provided.
-        /// </summary>
-        /// <param name="code">A TestDelegate to be executed</param>
-        /// <param name="constraint">A ThrowsConstraint used in the test</param>
-        static public void That(TestDelegate code, IResolveConstraint constraint)
-        {
-            Assume.That((object)code, constraint);
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Provides static methods to express the assumptions
+    /// that must be met for a test to give a meaningful
+    /// result. If an assumption is not met, the test
+    /// should produce an inconclusive result.
+    /// </summary>
+    public class Assume
+    {
+        #region Equals and ReferenceEquals
+
+        /// <summary>
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
+        {
+            // TODO: This should probably be InvalidOperationException
+            throw new AssertionException("Assert.Equals should not be used for Assertions");
+        }
+
+        /// <summary>
+        /// override the default ReferenceEquals to throw an AssertionException. This 
+        /// implementation makes sure there is no mistake in calling this function 
+        /// as part of Assert. 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        public static new void ReferenceEquals(object a, object b)
+        {
+            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+        }
+
+        #endregion
+
+        #region Assume.That
+
+        #region Object
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(object actual, IResolveConstraint expression)
+        {
+            Assume.That(actual, expression, null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(object actual, IResolveConstraint expression, string message)
+        {
+            Assume.That(actual, expression, message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(object actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            if (!constraint.Matches(actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+        #endregion
+
+        #region Boolean
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="InconclusiveException"/>.
+        /// </summary> 
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(bool condition, string message, params object[] args)
+        {
+            Assume.That(condition, Is.True, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the method throws
+        /// an <see cref="InconclusiveException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        /// <param name="message">The message to display if the condition is false</param>
+        static public void That(bool condition, string message)
+        {
+            Assume.That(condition, Is.True, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a condition is true. If the condition is false the 
+        /// method throws an <see cref="InconclusiveException"/>.
+        /// </summary>
+        /// <param name="condition">The evaluated condition</param>
+        static public void That(bool condition)
+        {
+            Assume.That(condition, Is.True, null, null);
+        }
+        #endregion
+
+        #region ref Boolean
+
+#if !CLR_2_0 && !CLR_4_0
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That(ref bool actual, IResolveConstraint expression)
+        {
+            Assume.That(ref actual, expression.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ref bool actual, IResolveConstraint expression, string message)
+        {
+            Assume.That(ref actual, expression.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced boolean, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException 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)
+        {
+            Constraint constraint = expression.Resolve();
+
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+#endif
+
+        #endregion
+
+        #region ActualValueDelegate
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+		/// Apply a constraint to an actual value, succeeding if the constraint
+		/// is satisfied and throwing an InconclusiveException on failure.
+		/// </summary>
+		/// <param name="expr">A Constraint expression to be applied</param>
+		/// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+		static public void That<T>(ActualValueDelegate<T> del, IResolveConstraint expr)
+		{
+			Assume.That(del, expr.Resolve(), null, null);
+		}
+
+		/// <summary>
+		/// Apply a constraint to an actual value, succeeding if the constraint
+		/// is satisfied and throwing an InconclusiveException on failure.
+		/// </summary>
+		/// <param name="expr">A Constraint expression to be applied</param>
+		/// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		static public void That<T>(ActualValueDelegate<T> del, IResolveConstraint expr, string message)
+		{
+			Assume.That(del, expr.Resolve(), message, null);
+		}
+
+		/// <summary>
+		/// Apply a constraint to an actual value, succeeding if the constraint
+		/// is satisfied and throwing an InconclusiveException on failure.
+		/// </summary>
+		/// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+		/// <param name="expr">A Constraint expression to be applied</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void That<T>(ActualValueDelegate<T> del, IResolveConstraint expr, string message, params object[] args)
+		{
+			Constraint constraint = expr.Resolve();
+
+			if (!constraint.Matches(del))
+			{
+				MessageWriter writer = new TextMessageWriter(message, args);
+				constraint.WriteMessageTo(writer);
+				throw new InconclusiveException(writer.ToString());
+			}
+		}
+#else
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr)
+        {
+            Assume.That(del, expr.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message)
+        {
+            Assume.That(del, expr.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to an actual value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        /// <param name="expr">A Constraint expression to be applied</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That(ActualValueDelegate del, IResolveConstraint expr, string message, params object[] args)
+        {
+            Constraint constraint = expr.Resolve();
+
+            if (!constraint.Matches(del))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+#endif
+
+        #endregion
+
+        #region ref Object
+#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.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression)
+        {
+            Assume.That(ref actual, expression.Resolve(), null, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message)
+        {
+            Assume.That(ref actual, expression.Resolve(), message, null);
+        }
+
+        /// <summary>
+        /// Apply a constraint to a referenced value, succeeding if the constraint
+        /// is satisfied and throwing an InconclusiveException on failure.
+        /// </summary>
+        /// <param name="expression">A Constraint expression to be applied</param>
+        /// <param name="actual">The actual value to test</param>
+        /// <param name="message">The message that will be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void That<T>(ref T actual, IResolveConstraint expression, string message, params object[] args)
+        {
+            Constraint constraint = expression.Resolve();
+
+            if (!constraint.Matches(ref actual))
+            {
+                MessageWriter writer = new TextMessageWriter(message, args);
+                constraint.WriteMessageTo(writer);
+                throw new InconclusiveException(writer.ToString());
+            }
+        }
+#endif
+        #endregion
+
+        #region TestDelegate
+
+        /// <summary>
+        /// Asserts that the code represented by a delegate throws an exception
+        /// that satisfies the constraint provided.
+        /// </summary>
+        /// <param name="code">A TestDelegate to be executed</param>
+        /// <param name="constraint">A ThrowsConstraint used in the test</param>
+        static public void That(TestDelegate code, IResolveConstraint constraint)
+        {
+            Assume.That((object)code, constraint);
+        }
+
+        #endregion
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/AsyncInvocationRegion.cs b/src/NUnitFramework/framework/AsyncInvocationRegion.cs
new file mode 100644
index 0000000..ad995a4
--- /dev/null
+++ b/src/NUnitFramework/framework/AsyncInvocationRegion.cs
@@ -0,0 +1,137 @@
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Threading;
+
+namespace NUnit.Framework
+{
+	internal abstract class AsyncInvocationRegion : IDisposable
+	{
+		private static readonly Type AsyncStateMachineAttribute = Type.GetType("System.Runtime.CompilerServices.AsyncStateMachineAttribute");
+		private static readonly MethodInfo PreserveStackTraceMethod = typeof(Exception).GetMethod("InternalPreserveStackTrace", BindingFlags.Instance | BindingFlags.NonPublic);
+
+        private static Action<Exception> preserveStackTraceDelegate;
+        private static void PreserveStackTrace(Exception ex)
+        {
+            if (PreserveStackTraceMethod != null)
+            {
+                if (preserveStackTraceDelegate == null)
+                    preserveStackTraceDelegate = (Action<Exception>)Delegate.CreateDelegate(typeof(Action<Exception>), PreserveStackTraceMethod);
+
+                preserveStackTraceDelegate(ex);
+            }
+        }
+
+		private AsyncInvocationRegion()
+		{
+		}
+
+		public static AsyncInvocationRegion Create(Delegate @delegate)
+		{
+			return Create(@delegate.Method);
+		}
+
+		public static AsyncInvocationRegion Create(MethodInfo method)
+		{
+			if (!IsAsyncOperation(method))
+				throw new InvalidOperationException(@"Either asynchronous support is not available or an attempt 
+at wrapping a non-async method invocation in an async region was done");
+
+			if (method.ReturnType == typeof(void))
+				return new AsyncVoidInvocationRegion();
+
+			return new AsyncTaskInvocationRegion();
+		}
+
+		public static bool IsAsyncOperation(MethodInfo method)
+		{
+			return AsyncStateMachineAttribute != null && method.IsDefined(AsyncStateMachineAttribute, false);
+		}
+
+		public static bool IsAsyncOperation(Delegate @delegate)
+		{
+			return IsAsyncOperation(@delegate.Method);
+		}
+
+		/// <summary>
+		/// Waits for pending asynchronous operations to complete, if appropriate,
+		/// and returns a proper result of the invocation by unwrapping task results
+		/// </summary>
+		/// <param name="invocationResult">The raw result of the method invocation</param>
+		/// <returns>The unwrapped result, if necessary</returns>
+		public abstract object WaitForPendingOperationsToComplete(object invocationResult);
+
+		public virtual void Dispose()
+		{ }
+
+		private class AsyncVoidInvocationRegion : AsyncInvocationRegion
+		{
+			private readonly SynchronizationContext _previousContext;
+			private readonly AsyncSynchronizationContext _currentContext;
+
+			public AsyncVoidInvocationRegion()
+			{
+				_previousContext = SynchronizationContext.Current;
+				_currentContext = new AsyncSynchronizationContext();
+				SynchronizationContext.SetSynchronizationContext(_currentContext);
+			}
+
+			public override void Dispose()
+			{
+				SynchronizationContext.SetSynchronizationContext(_previousContext);
+			}
+
+			public override object WaitForPendingOperationsToComplete(object invocationResult)
+			{
+				try
+				{
+					_currentContext.WaitForPendingOperationsToComplete();
+					return invocationResult;
+				}
+				catch (Exception e)
+				{
+					PreserveStackTrace(e);
+					throw;
+				}
+			}
+		}
+
+		private class AsyncTaskInvocationRegion : AsyncInvocationRegion
+		{
+			private const string TaskWaitMethod = "Wait";
+			private const string TaskResultProperty = "Result";
+			private const string SystemAggregateException = "System.AggregateException";
+			private const string InnerExceptionsProperty = "InnerExceptions";
+			private const BindingFlags TaskResultPropertyBindingFlags = BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public;
+
+			public override object WaitForPendingOperationsToComplete(object invocationResult)
+			{
+				try
+				{
+					invocationResult.GetType().GetMethod(TaskWaitMethod, new Type[0]).Invoke(invocationResult, null);
+				}
+				catch (TargetInvocationException e)
+				{
+					IList<Exception> innerExceptions = GetAllExceptions(e.InnerException);
+
+					PreserveStackTrace(innerExceptions[0]);
+					throw innerExceptions[0];
+				}
+
+				PropertyInfo taskResultProperty = invocationResult.GetType().GetProperty(TaskResultProperty, TaskResultPropertyBindingFlags);
+
+				return taskResultProperty != null ? taskResultProperty.GetValue(invocationResult, null) : invocationResult;
+			}
+
+			private static IList<Exception> GetAllExceptions(Exception exception)
+			{
+				if (SystemAggregateException.Equals(exception.GetType().FullName))
+					return (IList<Exception>)exception.GetType().GetProperty(InnerExceptionsProperty).GetValue(exception, null);
+
+				return new Exception[] { exception };
+			}
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/AsyncSynchronizationContext.cs b/src/NUnitFramework/framework/AsyncSynchronizationContext.cs
new file mode 100644
index 0000000..bb407f2
--- /dev/null
+++ b/src/NUnitFramework/framework/AsyncSynchronizationContext.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections;
+using System.Threading;
+
+namespace NUnit.Framework
+{
+	internal class AsyncSynchronizationContext : SynchronizationContext
+    {
+        private int _operationCount;
+		private readonly AsyncOperationQueue _operations = new AsyncOperationQueue();
+
+		public override void Send(SendOrPostCallback d, object state)
+		{
+			throw new InvalidOperationException("Sending to this synchronization context is not supported");
+		}
+
+		public override void Post(SendOrPostCallback d, object state)
+		{
+			_operations.Enqueue(new AsyncOperation(d, state));
+		}
+
+		public override void OperationStarted()
+		{
+			Interlocked.Increment(ref _operationCount);
+			base.OperationStarted();
+		}
+
+		public override void OperationCompleted()
+		{
+			if (Interlocked.Decrement(ref _operationCount) == 0)
+				_operations.MarkAsComplete();
+
+			base.OperationCompleted();
+        }
+
+		public void WaitForPendingOperationsToComplete()
+		{
+			_operations.InvokeAll();
+		}
+
+		private class AsyncOperationQueue
+		{
+			private bool _run = true;
+			private readonly Queue _operations = Queue.Synchronized(new Queue());
+			private readonly AutoResetEvent _operationsAvailable = new AutoResetEvent(false);
+
+			public void Enqueue(AsyncOperation asyncOperation)
+			{
+				_operations.Enqueue(asyncOperation);
+				_operationsAvailable.Set();
+			}
+
+			public void MarkAsComplete()
+			{
+				_run = false;
+				_operationsAvailable.Set();
+			}
+
+			public void InvokeAll()
+			{
+				while (_run)
+				{
+					InvokePendingOperations();
+					_operationsAvailable.WaitOne();
+				}
+
+				InvokePendingOperations();
+			}
+
+			private void InvokePendingOperations()
+			{
+				while (_operations.Count > 0)
+				{
+					AsyncOperation operation = (AsyncOperation)_operations.Dequeue();
+					operation.Invoke();
+				}
+			}
+		}
+
+		private class AsyncOperation
+		{
+			private readonly SendOrPostCallback _action;
+			private readonly object _state;
+
+			public AsyncOperation(SendOrPostCallback action, object state)
+			{
+				_action = action;
+				_state = state;
+			}
+
+			public void Invoke()
+			{
+				_action(_state);
+			}
+		}
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs b/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs
index d4bbe6f..eebd4b3 100644
--- a/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/CategoryAttribute.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Attribute used to apply a category to a test
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
-	public class CategoryAttribute : Attribute
-	{
-		/// <summary>
-		/// The name of the category
-		/// </summary>
-		protected string categoryName;
-
-		/// <summary>
-		/// Construct attribute for a given category based on
-        /// a name. The name may not contain the characters ',',
-        /// '+', '-' or '!'. However, this is not checked in the
-        /// constructor since it would cause an error to arise at
-        /// as the test was loaded without giving a clear indication
-        /// of where the problem is located. The error is handled
-        /// in NUnitFramework.cs by marking the test as not
-        /// runnable.
-		/// </summary>
-		/// <param name="name">The name of the category</param>
-		public CategoryAttribute(string name)
-		{
-			this.categoryName = name.Trim();
-		}
-
-		/// <summary>
-		/// Protected constructor uses the Type name as the name
-		/// of the category.
-		/// </summary>
-		protected CategoryAttribute()
-		{
-			this.categoryName = this.GetType().Name;
-			if ( categoryName.EndsWith( "Attribute" ) )
-				categoryName = categoryName.Substring( 0, categoryName.Length - 9 );
-		}
-
-		/// <summary>
-		/// The name of the category
-		/// </summary>
-		public string Name 
-		{
-			get { return categoryName; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Attribute used to apply a category to a test
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
+	public class CategoryAttribute : Attribute
+	{
+		/// <summary>
+		/// The name of the category
+		/// </summary>
+		protected string categoryName;
+
+		/// <summary>
+		/// Construct attribute for a given category based on
+        /// a name. The name may not contain the characters ',',
+        /// '+', '-' or '!'. However, this is not checked in the
+        /// constructor since it would cause an error to arise at
+        /// as the test was loaded without giving a clear indication
+        /// of where the problem is located. The error is handled
+        /// in NUnitFramework.cs by marking the test as not
+        /// runnable.
+		/// </summary>
+		/// <param name="name">The name of the category</param>
+		public CategoryAttribute(string name)
+		{
+			this.categoryName = name.Trim();
+		}
+
+		/// <summary>
+		/// Protected constructor uses the Type name as the name
+		/// of the category.
+		/// </summary>
+		protected CategoryAttribute()
+		{
+			this.categoryName = this.GetType().Name;
+			if ( categoryName.EndsWith( "Attribute" ) )
+				categoryName = categoryName.Substring( 0, categoryName.Length - 9 );
+		}
+
+		/// <summary>
+		/// The name of the category
+		/// </summary>
+		public string Name 
+		{
+			get { return categoryName; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs b/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs
index 3d6ac0b..25c78e1 100644
--- a/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs
+++ b/src/NUnitFramework/framework/Attributes/DatapointAttributes.cs
@@ -1,29 +1,29 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Used to mark a field for use as a datapoint when executing a theory
-    /// within the same fixture that requires an argument of the field's Type.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
-    public class DatapointAttribute : Attribute
-    {
-    }
-
-    /// <summary>
-    /// Used to mark an array as containing a set of datapoints to be used
-    /// executing a theory within the same fixture that requires an argument 
-    /// of the Type of the array elements.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
-    public class DatapointsAttribute : Attribute
-    {
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Used to mark a field for use as a datapoint when executing a theory
+    /// within the same fixture that requires an argument of the field's Type.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
+    public class DatapointAttribute : Attribute
+    {
+    }
+
+    /// <summary>
+    /// Used to mark an array as containing a set of datapoints to be used
+    /// executing a theory within the same fixture that requires an argument 
+    /// of the Type of the array elements.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+    public class DatapointsAttribute : Attribute
+    {
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs b/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs
index 4d8c4cf..66d583b 100644
--- a/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/DescriptionAttribute.cs
@@ -1,37 +1,37 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Attribute used to provide descriptive text about a 
-	/// test case or fixture.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
-	public class DescriptionAttribute : Attribute
-	{
-		string description;
-
-		/// <summary>
-		/// Construct the attribute
-		/// </summary>
-		/// <param name="description">Text describing the test</param>
-		public DescriptionAttribute(string description)
-		{
-			this.description=description;
-		}
-
-		/// <summary>
-		/// Gets the test description
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Attribute used to provide descriptive text about a 
+	/// test case or fixture.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class DescriptionAttribute : Attribute
+	{
+		string description;
+
+		/// <summary>
+		/// Construct the attribute
+		/// </summary>
+		/// <param name="description">Text describing the test</param>
+		public DescriptionAttribute(string description)
+		{
+			this.description=description;
+		}
+
+		/// <summary>
+		/// Gets the test description
+		/// </summary>
+		public string Description
+		{
+			get { return description; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs b/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs
index c26c504..aaca9e6 100644
--- a/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/ExpectedExceptionAttribute.cs
@@ -1,123 +1,123 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Enumeration indicating how the expected message parameter is to be used
-	/// </summary>
-	public enum MessageMatch
-	{
-		/// Expect an exact match
-		Exact,	
-		/// Expect a message containing the parameter string
-		Contains,
-		/// Match the regular expression provided as a parameter
-		Regex,
-        /// Expect a message that starts with the parameter string
-        StartsWith
-	}
-
-	/// <summary>
-	/// ExpectedExceptionAttribute
-	/// </summary>
-	/// 
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
-	public class ExpectedExceptionAttribute : Attribute
-	{
-		private Type expectedException;
-		private string expectedExceptionName;
-		private string expectedMessage;
-		private MessageMatch matchType;
-		private string userMessage;
-		private string handler;
-
-		/// <summary>
-		/// Constructor for a non-specific exception
-		/// </summary>
-		public ExpectedExceptionAttribute()
-		{
-		}
-
-		/// <summary>
-		/// Constructor for a given type of exception
-		/// </summary>
-		/// <param name="exceptionType">The type of the expected exception</param>
-		public ExpectedExceptionAttribute(Type exceptionType)
-		{
-			this.expectedException = exceptionType;
-			this.expectedExceptionName = exceptionType.FullName;
-		}
-
-		/// <summary>
-		/// Constructor for a given exception name
-		/// </summary>
-		/// <param name="exceptionName">The full name of the expected exception</param>
-		public ExpectedExceptionAttribute(string exceptionName)
-		{
-			this.expectedExceptionName = exceptionName;
-		}
-
-		/// <summary>
-		/// Gets or sets the expected exception type
-		/// </summary>
-		public Type ExpectedException
-		{
-			get{ return expectedException; }
-			set
-            { 
-                expectedException = value;
-                expectedExceptionName = expectedException.FullName;
-            }
-		}
-
-		/// <summary>
-		/// Gets or sets the full Type name of the expected exception
-		/// </summary>
-		public string ExpectedExceptionName
-		{
-			get{ return expectedExceptionName; }
-			set{ expectedExceptionName = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the expected message text
-		/// </summary>
-		public string ExpectedMessage 
-		{
-			get { return expectedMessage; }
-			set { expectedMessage = value; }
-		}
-
-		/// <summary>
-		/// Gets or sets the user message displayed in case of failure
-		/// </summary>
-		public string UserMessage
-		{
-			get { return userMessage; }
-			set { userMessage = value; }
-		}
-
-		/// <summary>
-		///  Gets or sets the type of match to be performed on the expected message
-		/// </summary>
-		public MessageMatch MatchType
-		{
-			get { return matchType; }
-			set { matchType = value; }
-		}
-
-		/// <summary>
-		///  Gets the name of a method to be used as an exception handler
-		/// </summary>
-		public string Handler
-		{
-			get { return handler; }
-			set { handler = value; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Enumeration indicating how the expected message parameter is to be used
+	/// </summary>
+	public enum MessageMatch
+	{
+		/// Expect an exact match
+		Exact,	
+		/// Expect a message containing the parameter string
+		Contains,
+		/// Match the regular expression provided as a parameter
+		Regex,
+        /// Expect a message that starts with the parameter string
+        StartsWith
+	}
+
+	/// <summary>
+	/// ExpectedExceptionAttribute
+	/// </summary>
+	/// 
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
+	public class ExpectedExceptionAttribute : Attribute
+	{
+		private Type expectedException;
+		private string expectedExceptionName;
+		private string expectedMessage;
+		private MessageMatch matchType;
+		private string userMessage;
+		private string handler;
+
+		/// <summary>
+		/// Constructor for a non-specific exception
+		/// </summary>
+		public ExpectedExceptionAttribute()
+		{
+		}
+
+		/// <summary>
+		/// Constructor for a given type of exception
+		/// </summary>
+		/// <param name="exceptionType">The type of the expected exception</param>
+		public ExpectedExceptionAttribute(Type exceptionType)
+		{
+			this.expectedException = exceptionType;
+			this.expectedExceptionName = exceptionType.FullName;
+		}
+
+		/// <summary>
+		/// Constructor for a given exception name
+		/// </summary>
+		/// <param name="exceptionName">The full name of the expected exception</param>
+		public ExpectedExceptionAttribute(string exceptionName)
+		{
+			this.expectedExceptionName = exceptionName;
+		}
+
+		/// <summary>
+		/// Gets or sets the expected exception type
+		/// </summary>
+		public Type ExpectedException
+		{
+			get{ return expectedException; }
+			set
+            { 
+                expectedException = value;
+                expectedExceptionName = expectedException.FullName;
+            }
+		}
+
+		/// <summary>
+		/// Gets or sets the full Type name of the expected exception
+		/// </summary>
+		public string ExpectedExceptionName
+		{
+			get{ return expectedExceptionName; }
+			set{ expectedExceptionName = value; }
+		}
+
+		/// <summary>
+		/// Gets or sets the expected message text
+		/// </summary>
+		public string ExpectedMessage 
+		{
+			get { return expectedMessage; }
+			set { expectedMessage = value; }
+		}
+
+		/// <summary>
+		/// Gets or sets the user message displayed in case of failure
+		/// </summary>
+		public string UserMessage
+		{
+			get { return userMessage; }
+			set { userMessage = value; }
+		}
+
+		/// <summary>
+		///  Gets or sets the type of match to be performed on the expected message
+		/// </summary>
+		public MessageMatch MatchType
+		{
+			get { return matchType; }
+			set { matchType = value; }
+		}
+
+		/// <summary>
+		///  Gets the name of a method to be used as an exception handler
+		/// </summary>
+		public string Handler
+		{
+			get { return handler; }
+			set { handler = value; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs b/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs
index 56a87a5..a0f4033 100644
--- a/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/ExplicitAttribute.cs
@@ -1,47 +1,47 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// ExplicitAttribute marks a test or test fixture so that it will
-	/// only be run if explicitly executed from the gui or command line
-	/// or if it is included by use of a filter. The test will not be
-	/// run simply because an enclosing suite is run.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
-	public class ExplicitAttribute : Attribute
-	{
-        private string reason;
-
-        /// <summary>
-		/// Default constructor
-		/// </summary>
-		public ExplicitAttribute()
-		{
-            this.reason = "";
-        }
-
-        /// <summary>
-        /// Constructor with a reason
-        /// </summary>
-        /// <param name="reason">The reason test is marked explicit</param>
-        public ExplicitAttribute(string reason)
-        {
-            this.reason = reason;
-        }
-
-        /// <summary>
-        /// The reason test is marked explicit
-        /// </summary>
-        public string Reason
-        {
-            get { return reason; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// ExplicitAttribute marks a test or test fixture so that it will
+	/// only be run if explicitly executed from the gui or command line
+	/// or if it is included by use of a filter. The test will not be
+	/// run simply because an enclosing suite is run.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class ExplicitAttribute : Attribute
+	{
+        private string reason;
+
+        /// <summary>
+		/// Default constructor
+		/// </summary>
+		public ExplicitAttribute()
+		{
+            this.reason = "";
+        }
+
+        /// <summary>
+        /// Constructor with a reason
+        /// </summary>
+        /// <param name="reason">The reason test is marked explicit</param>
+        public ExplicitAttribute(string reason)
+        {
+            this.reason = reason;
+        }
+
+        /// <summary>
+        /// The reason test is marked explicit
+        /// </summary>
+        public string Reason
+        {
+            get { return reason; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs b/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs
index 7f34008..cb18d79 100644
--- a/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/IgnoreAttribute.cs
@@ -1,47 +1,47 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to mark a test that is to be ignored.
-	/// Ignored tests result in a warning message when the
-	/// tests are run.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
-	public class IgnoreAttribute : Attribute
-	{
-		private string reason;
-
-		/// <summary>
-		/// Constructs the attribute without giving a reason 
-		/// for ignoring the test.
-		/// </summary>
-		public IgnoreAttribute()
-		{
-			this.reason = "";
-		}
-
-		/// <summary>
-		/// Constructs the attribute giving a reason for ignoring the test
-		/// </summary>
-		/// <param name="reason">The reason for ignoring the test</param>
-		public IgnoreAttribute(string reason)
-		{
-			this.reason = reason;
-		}
-
-		/// <summary>
-		/// The reason for ignoring a test
-		/// </summary>
-		public string Reason
-		{
-			get { return reason; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to mark a test that is to be ignored.
+	/// Ignored tests result in a warning message when the
+	/// tests are run.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class IgnoreAttribute : Attribute
+	{
+		private string reason;
+
+		/// <summary>
+		/// Constructs the attribute without giving a reason 
+		/// for ignoring the test.
+		/// </summary>
+		public IgnoreAttribute()
+		{
+			this.reason = "";
+		}
+
+		/// <summary>
+		/// Constructs the attribute giving a reason for ignoring the test
+		/// </summary>
+		/// <param name="reason">The reason for ignoring the test</param>
+		public IgnoreAttribute(string reason)
+		{
+			this.reason = reason;
+		}
+
+		/// <summary>
+		/// The reason for ignoring a test
+		/// </summary>
+		public string Reason
+		{
+			get { return reason; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs b/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs
index 6b54a72..ea9b9bf 100644
--- a/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs
+++ b/src/NUnitFramework/framework/Attributes/IncludeExcludeAttributes.cs
@@ -1,106 +1,106 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Abstract base for Attributes that are used to include tests
-	/// in the test run based on environmental settings.
-	/// </summary>
-	public abstract class IncludeExcludeAttribute : Attribute
-	{
-		private string include;
-		private string exclude;
-		private string reason;
-
-		/// <summary>
-		/// Constructor with no included items specified, for use
-		/// with named property syntax.
-		/// </summary>
-		public IncludeExcludeAttribute() { }
-
-		/// <summary>
-		/// Constructor taking one or more included items
-		/// </summary>
-		/// <param name="include">Comma-delimited list of included items</param>
-		public IncludeExcludeAttribute( string include )
-		{
-			this.include = include;
-		}
-
-		/// <summary>
-		/// Name of the item that is needed in order for
-		/// a test to run. Multiple itemss may be given,
-		/// separated by a comma.
-		/// </summary>
-		public string Include
-		{
-			get { return this.include; }
-			set { include = value; }
-		}
-
-		/// <summary>
-		/// Name of the item to be excluded. Multiple items
-		/// may be given, separated by a comma.
-		/// </summary>
-		public string Exclude
-		{
-			get { return this.exclude; }
-			set { this.exclude = value; }
-		}
-
-		/// <summary>
-		/// The reason for including or excluding the test
-		/// </summary>
-		public string Reason
-		{
-			get { return reason; }
-			set { reason = value; }
-		}
-	}
-
-	/// <summary>
-	/// PlatformAttribute is used to mark a test fixture or an
-	/// individual method as applying to a particular platform only.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
-	public class PlatformAttribute : IncludeExcludeAttribute
-	{
-		/// <summary>
-		/// Constructor with no platforms specified, for use
-		/// with named property syntax.
-		/// </summary>
-		public PlatformAttribute() { }
-
-		/// <summary>
-		/// Constructor taking one or more platforms
-		/// </summary>
-		/// <param name="platforms">Comma-deliminted list of platforms</param>
-		public PlatformAttribute( string platforms ) : base( platforms ) { }
-	}
-
-	/// <summary>
-	/// CultureAttribute is used to mark a test fixture or an
-	/// individual method as applying to a particular Culture only.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
-	public class CultureAttribute : IncludeExcludeAttribute
-	{
-		/// <summary>
-		/// Constructor with no cultures specified, for use
-		/// with named property syntax.
-		/// </summary>
-		public CultureAttribute() { }
-
-		/// <summary>
-		/// Constructor taking one or more cultures
-		/// </summary>
-		/// <param name="cultures">Comma-deliminted list of cultures</param>
-		public CultureAttribute( string cultures ) : base( cultures ) { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Abstract base for Attributes that are used to include tests
+	/// in the test run based on environmental settings.
+	/// </summary>
+	public abstract class IncludeExcludeAttribute : Attribute
+	{
+		private string include;
+		private string exclude;
+		private string reason;
+
+		/// <summary>
+		/// Constructor with no included items specified, for use
+		/// with named property syntax.
+		/// </summary>
+		public IncludeExcludeAttribute() { }
+
+		/// <summary>
+		/// Constructor taking one or more included items
+		/// </summary>
+		/// <param name="include">Comma-delimited list of included items</param>
+		public IncludeExcludeAttribute( string include )
+		{
+			this.include = include;
+		}
+
+		/// <summary>
+		/// Name of the item that is needed in order for
+		/// a test to run. Multiple itemss may be given,
+		/// separated by a comma.
+		/// </summary>
+		public string Include
+		{
+			get { return this.include; }
+			set { include = value; }
+		}
+
+		/// <summary>
+		/// Name of the item to be excluded. Multiple items
+		/// may be given, separated by a comma.
+		/// </summary>
+		public string Exclude
+		{
+			get { return this.exclude; }
+			set { this.exclude = value; }
+		}
+
+		/// <summary>
+		/// The reason for including or excluding the test
+		/// </summary>
+		public string Reason
+		{
+			get { return reason; }
+			set { reason = value; }
+		}
+	}
+
+	/// <summary>
+	/// PlatformAttribute is used to mark a test fixture or an
+	/// individual method as applying to a particular platform only.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
+	public class PlatformAttribute : IncludeExcludeAttribute
+	{
+		/// <summary>
+		/// Constructor with no platforms specified, for use
+		/// with named property syntax.
+		/// </summary>
+		public PlatformAttribute() { }
+
+		/// <summary>
+		/// Constructor taking one or more platforms
+		/// </summary>
+		/// <param name="platforms">Comma-deliminted list of platforms</param>
+		public PlatformAttribute( string platforms ) : base( platforms ) { }
+	}
+
+	/// <summary>
+	/// CultureAttribute is used to mark a test fixture or an
+	/// individual method as applying to a particular Culture only.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=false)]
+	public class CultureAttribute : IncludeExcludeAttribute
+	{
+		/// <summary>
+		/// Constructor with no cultures specified, for use
+		/// with named property syntax.
+		/// </summary>
+		public CultureAttribute() { }
+
+		/// <summary>
+		/// Constructor taking one or more cultures
+		/// </summary>
+		/// <param name="cultures">Comma-deliminted list of cultures</param>
+		public CultureAttribute( string cultures ) : base( cultures ) { }
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs b/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs
index 0bfa343..5df0498 100644
--- a/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs
+++ b/src/NUnitFramework/framework/Attributes/JoinTypeAttributes.cs
@@ -1,58 +1,58 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Marks a test to use a combinatorial join of any argument data 
-    /// provided. NUnit will create a test case for every combination of 
-    /// the arguments provided. This can result in a large number of test
-    /// cases and so should be used judiciously. This is the default join
-    /// type, so the attribute need not be used except as documentation.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
-    public class CombinatorialAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Default constructor
-        /// </summary>
-        public CombinatorialAttribute() : base("_JOINTYPE", "Combinatorial") { }
-    }
-
-    /// <summary>
-    /// Marks a test to use pairwise join of any argument data provided. 
-    /// NUnit will attempt too excercise every pair of argument values at 
-    /// least once, using as small a number of test cases as it can. With
-    /// only two arguments, this is the same as a combinatorial join.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
-    public class PairwiseAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Default constructor
-        /// </summary>
-        public PairwiseAttribute() : base("_JOINTYPE", "Pairwise") { }
-    }
-
-    /// <summary>
-    /// Marks a test to use a sequential join of any argument data
-    /// provided. NUnit will use arguements for each parameter in
-    /// sequence, generating test cases up to the largest number
-    /// of argument values provided and using null for any arguments
-    /// for which it runs out of values. Normally, this should be
-    /// used with the same number of arguments for each parameter.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
-    public class SequentialAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Default constructor
-        /// </summary>
-        public SequentialAttribute() : base("_JOINTYPE", "Sequential") { }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Marks a test to use a combinatorial join of any argument data 
+    /// provided. NUnit will create a test case for every combination of 
+    /// the arguments provided. This can result in a large number of test
+    /// cases and so should be used judiciously. This is the default join
+    /// type, so the attribute need not be used except as documentation.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
+    public class CombinatorialAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public CombinatorialAttribute() : base("_JOINTYPE", "Combinatorial") { }
+    }
+
+    /// <summary>
+    /// Marks a test to use pairwise join of any argument data provided. 
+    /// NUnit will attempt too excercise every pair of argument values at 
+    /// least once, using as small a number of test cases as it can. With
+    /// only two arguments, this is the same as a combinatorial join.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
+    public class PairwiseAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public PairwiseAttribute() : base("_JOINTYPE", "Pairwise") { }
+    }
+
+    /// <summary>
+    /// Marks a test to use a sequential join of any argument data
+    /// provided. NUnit will use arguements for each parameter in
+    /// sequence, generating test cases up to the largest number
+    /// of argument values provided and using null for any arguments
+    /// for which it runs out of values. Normally, this should be
+    /// used with the same number of arguments for each parameter.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=false)]
+    public class SequentialAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public SequentialAttribute() : base("_JOINTYPE", "Sequential") { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs b/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs
index 4ed2a02..40e0b80 100644
--- a/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/MaxTimeAttribute.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Summary description for MaxTimeAttribute.
-	/// </summary>
-	[AttributeUsage( AttributeTargets.Method, AllowMultiple=false, Inherited=false )]
-	public sealed class MaxTimeAttribute : PropertyAttribute
-	{
-        /// <summary>
-        /// Construct a MaxTimeAttribute, given a time in milliseconds.
-        /// </summary>
-        /// <param name="milliseconds">The maximum elapsed time in milliseconds</param>
-		public MaxTimeAttribute( int milliseconds )
-            : base( milliseconds ) { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Summary description for MaxTimeAttribute.
+	/// </summary>
+	[AttributeUsage( AttributeTargets.Method, AllowMultiple=false, Inherited=false )]
+	public sealed class MaxTimeAttribute : PropertyAttribute
+	{
+        /// <summary>
+        /// Construct a MaxTimeAttribute, given a time in milliseconds.
+        /// </summary>
+        /// <param name="milliseconds">The maximum elapsed time in milliseconds</param>
+		public MaxTimeAttribute( int milliseconds )
+            : base( milliseconds ) { }
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs b/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs
index e320a27..d30f550 100644
--- a/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/PropertyAttribute.cs
@@ -1,81 +1,81 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// PropertyAttribute is used to attach information to a test as a name/value pair..
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
-	public class PropertyAttribute : Attribute
-	{
-        private IDictionary properties = new ListDictionary();
-
-        /// <summary>
-        /// Construct a PropertyAttribute with a name and string value
-        /// </summary>
-        /// <param name="propertyName">The name of the property</param>
-        /// <param name="propertyValue">The property value</param>
-        public PropertyAttribute(string propertyName, string propertyValue)
-        {
-            this.properties.Add(propertyName, propertyValue);
-        }
-
-        /// <summary>
-        /// Construct a PropertyAttribute with a name and int value
-        /// </summary>
-        /// <param name="propertyName">The name of the property</param>
-        /// <param name="propertyValue">The property value</param>
-        public PropertyAttribute(string propertyName, int propertyValue)
-        {
-            this.properties.Add(propertyName, propertyValue);
-        }
-
-        /// <summary>
-        /// Construct a PropertyAttribute with a name and double value
-        /// </summary>
-        /// <param name="propertyName">The name of the property</param>
-        /// <param name="propertyValue">The property value</param>
-        public PropertyAttribute(string propertyName, double propertyValue)
-        {
-            this.properties.Add(propertyName, propertyValue);
-        }
-
-        /// <summary>
-        /// Constructor for derived classes that set the
-        /// property dictionary directly.
-        /// </summary>
-        protected PropertyAttribute() { }
-
-        /// <summary>
-		/// Constructor for use by derived classes that use the
-		/// name of the type as the property name. Derived classes
-        /// must ensure that the Type of the property value is
-        /// a standard type supported by the BCL. Any custom
-        /// types will cause a serialization Exception when
-        /// in the client.
-		/// </summary>
-		protected PropertyAttribute( object propertyValue )
-		{
-			string propertyName = this.GetType().Name;
-			if ( propertyName.EndsWith( "Attribute" ) )
-				propertyName = propertyName.Substring( 0, propertyName.Length - 9 );
-            this.properties.Add(propertyName, propertyValue);
-		}
-
-        /// <summary>
-        /// Gets the property dictionary for this attribute
-        /// </summary>
-        public IDictionary Properties
-        {
-            get { return properties; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// PropertyAttribute is used to attach information to a test as a name/value pair..
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
+	public class PropertyAttribute : Attribute
+	{
+        private IDictionary properties = new ListDictionary();
+
+        /// <summary>
+        /// Construct a PropertyAttribute with a name and string value
+        /// </summary>
+        /// <param name="propertyName">The name of the property</param>
+        /// <param name="propertyValue">The property value</param>
+        public PropertyAttribute(string propertyName, string propertyValue)
+        {
+            this.properties.Add(propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Construct a PropertyAttribute with a name and int value
+        /// </summary>
+        /// <param name="propertyName">The name of the property</param>
+        /// <param name="propertyValue">The property value</param>
+        public PropertyAttribute(string propertyName, int propertyValue)
+        {
+            this.properties.Add(propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Construct a PropertyAttribute with a name and double value
+        /// </summary>
+        /// <param name="propertyName">The name of the property</param>
+        /// <param name="propertyValue">The property value</param>
+        public PropertyAttribute(string propertyName, double propertyValue)
+        {
+            this.properties.Add(propertyName, propertyValue);
+        }
+
+        /// <summary>
+        /// Constructor for derived classes that set the
+        /// property dictionary directly.
+        /// </summary>
+        protected PropertyAttribute() { }
+
+        /// <summary>
+		/// Constructor for use by derived classes that use the
+		/// name of the type as the property name. Derived classes
+        /// must ensure that the Type of the property value is
+        /// a standard type supported by the BCL. Any custom
+        /// types will cause a serialization Exception when
+        /// in the client.
+		/// </summary>
+		protected PropertyAttribute( object propertyValue )
+		{
+			string propertyName = this.GetType().Name;
+			if ( propertyName.EndsWith( "Attribute" ) )
+				propertyName = propertyName.Substring( 0, propertyName.Length - 9 );
+            this.properties.Add(propertyName, propertyValue);
+		}
+
+        /// <summary>
+        /// Gets the property dictionary for this attribute
+        /// </summary>
+        public IDictionary Properties
+        {
+            get { return properties; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/RandomAttribute.cs b/src/NUnitFramework/framework/Attributes/RandomAttribute.cs
index a17c741..1103d56 100644
--- a/src/NUnitFramework/framework/Attributes/RandomAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/RandomAttribute.cs
@@ -1,102 +1,102 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// RandomAttribute is used to supply a set of random values
-    /// to a single parameter of a parameterized test.
-    /// </summary>
-    public class RandomAttribute : ValuesAttribute
-    {
-        enum SampleType
-        {
-            Raw,
-            IntRange,
-            DoubleRange
-        }
-
-        SampleType sampleType;
-        private int count;
-        private int min, max;
-        private double dmin, dmax;
-
-        /// <summary>
-        /// Construct a set of doubles from 0.0 to 1.0,
-        /// specifying only the count.
-        /// </summary>
-        /// <param name="count"></param>
-        public RandomAttribute(int count)
-        {
-            this.count = count;
-            this.sampleType = SampleType.Raw;
-        }
-
-        /// <summary>
-        /// Construct a set of doubles from min to max
-        /// </summary>
-        /// <param name="min"></param>
-        /// <param name="max"></param>
-        /// <param name="count"></param>
-        public RandomAttribute(double min, double max, int count)
-        {
-            this.count = count;
-            this.dmin = min;
-            this.dmax = max;
-            this.sampleType = SampleType.DoubleRange;
-        }
-
-        /// <summary>
-        /// Construct a set of ints from min to max
-        /// </summary>
-        /// <param name="min"></param>
-        /// <param name="max"></param>
-        /// <param name="count"></param>
-        public RandomAttribute(int min, int max, int count)
-        {
-            this.count = count;
-            this.min = min;
-            this.max = max;
-            this.sampleType = SampleType.IntRange;
-        }
-
-        /// <summary>
-        /// Get the collection of values to be used as arguments
-        /// </summary>
-        public override IEnumerable GetData(ParameterInfo parameter)
-        {
-            Randomizer r = Randomizer.GetRandomizer(parameter);
-            IList values;
-
-            switch (sampleType)
-            {
-                default:
-                case SampleType.Raw:
-                    values = r.GetDoubles(count);
-                    break;
-                case SampleType.IntRange:
-                    values = r.GetInts(min, max, count);
-                    break;
-                case SampleType.DoubleRange:
-                    values = r.GetDoubles(dmin, dmax, count);
-                    break;
-            }
-
-            // Copy the random values into the data array
-            // and call the base class which may need to
-            // convert them to another type.
-            this.data = new object[values.Count];
-            for (int i = 0; i < values.Count; i++)
-                this.data[i] = values[i];
-
-            return base.GetData(parameter);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// RandomAttribute is used to supply a set of random values
+    /// to a single parameter of a parameterized test.
+    /// </summary>
+    public class RandomAttribute : ValuesAttribute
+    {
+        enum SampleType
+        {
+            Raw,
+            IntRange,
+            DoubleRange
+        }
+
+        SampleType sampleType;
+        private int count;
+        private int min, max;
+        private double dmin, dmax;
+
+        /// <summary>
+        /// Construct a set of doubles from 0.0 to 1.0,
+        /// specifying only the count.
+        /// </summary>
+        /// <param name="count"></param>
+        public RandomAttribute(int count)
+        {
+            this.count = count;
+            this.sampleType = SampleType.Raw;
+        }
+
+        /// <summary>
+        /// Construct a set of doubles from min to max
+        /// </summary>
+        /// <param name="min"></param>
+        /// <param name="max"></param>
+        /// <param name="count"></param>
+        public RandomAttribute(double min, double max, int count)
+        {
+            this.count = count;
+            this.dmin = min;
+            this.dmax = max;
+            this.sampleType = SampleType.DoubleRange;
+        }
+
+        /// <summary>
+        /// Construct a set of ints from min to max
+        /// </summary>
+        /// <param name="min"></param>
+        /// <param name="max"></param>
+        /// <param name="count"></param>
+        public RandomAttribute(int min, int max, int count)
+        {
+            this.count = count;
+            this.min = min;
+            this.max = max;
+            this.sampleType = SampleType.IntRange;
+        }
+
+        /// <summary>
+        /// Get the collection of values to be used as arguments
+        /// </summary>
+        public override IEnumerable GetData(ParameterInfo parameter)
+        {
+            Randomizer r = Randomizer.GetRandomizer(parameter);
+            IList values;
+
+            switch (sampleType)
+            {
+                default:
+                case SampleType.Raw:
+                    values = r.GetDoubles(count);
+                    break;
+                case SampleType.IntRange:
+                    values = r.GetInts(min, max, count);
+                    break;
+                case SampleType.DoubleRange:
+                    values = r.GetDoubles(dmin, dmax, count);
+                    break;
+            }
+
+            // Copy the random values into the data array
+            // and call the base class which may need to
+            // convert them to another type.
+            this.data = new object[values.Count];
+            for (int i = 0; i < values.Count; i++)
+                this.data[i] = values[i];
+
+            return base.GetData(parameter);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/RangeAttribute.cs b/src/NUnitFramework/framework/Attributes/RangeAttribute.cs
index da1c60f..b86c978 100644
--- a/src/NUnitFramework/framework/Attributes/RangeAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/RangeAttribute.cs
@@ -1,87 +1,87 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// RangeAttribute is used to supply a range of values to an
-    /// individual parameter of a parameterized test.
-    /// </summary>
-    public class RangeAttribute : ValuesAttribute
-    {
-        /// <summary>
-        /// Construct a range of ints using default step of 1
-        /// </summary>
-        /// <param name="from"></param>
-        /// <param name="to"></param>
-        public RangeAttribute(int from, int to) : this(from, to, 1) { }
-
-        /// <summary>
-        /// Construct a range of ints specifying the step size 
-        /// </summary>
-        /// <param name="from"></param>
-        /// <param name="to"></param>
-        /// <param name="step"></param>
-        public RangeAttribute(int from, int to, int step)
-        {
-            int count = (to - from) / step + 1;
-            this.data = new object[count];
-            int index = 0;
-            for (int val = from; index < count; val += step)
-                this.data[index++] = val;
-        }
-
-        /// <summary>
-        /// Construct a range of longs
-        /// </summary>
-        /// <param name="from"></param>
-        /// <param name="to"></param>
-        /// <param name="step"></param>
-        public RangeAttribute(long from, long to, long step)
-        {
-            long count = (to - from) / step + 1;
-            this.data = new object[count];
-            int index = 0;
-            for (long val = from; index < count; val += step)
-                data[index++] = val;
-        }
-
-        /// <summary>
-        /// Construct a range of doubles
-        /// </summary>
-        /// <param name="from"></param>
-        /// <param name="to"></param>
-        /// <param name="step"></param>
-        public RangeAttribute(double from, double to, double step)
-        {
-            double tol = step / 1000;
-            int count = (int)((to - from) / step + tol + 1);
-            this.data = new object[count];
-            int index = 0;
-            for (double val = from; index < count; val += step)
-                data[index++] = val;
-        }
-
-        /// <summary>
-        /// Construct a range of floats
-        /// </summary>
-        /// <param name="from"></param>
-        /// <param name="to"></param>
-        /// <param name="step"></param>
-        public RangeAttribute(float from, float to, float step)
-        {
-            float tol = step / 1000;
-            int count = (int)((to - from) / step + tol + 1);
-            this.data = new object[count];
-            int index = 0;
-            for (float val = from; index < count; val += step)
-                data[index++] = val;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// RangeAttribute is used to supply a range of values to an
+    /// individual parameter of a parameterized test.
+    /// </summary>
+    public class RangeAttribute : ValuesAttribute
+    {
+        /// <summary>
+        /// Construct a range of ints using default step of 1
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        public RangeAttribute(int from, int to) : this(from, to, 1) { }
+
+        /// <summary>
+        /// Construct a range of ints specifying the step size 
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(int from, int to, int step)
+        {
+            int count = (to - from) / step + 1;
+            this.data = new object[count];
+            int index = 0;
+            for (int val = from; index < count; val += step)
+                this.data[index++] = val;
+        }
+
+        /// <summary>
+        /// Construct a range of longs
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(long from, long to, long step)
+        {
+            long count = (to - from) / step + 1;
+            this.data = new object[count];
+            int index = 0;
+            for (long val = from; index < count; val += step)
+                data[index++] = val;
+        }
+
+        /// <summary>
+        /// Construct a range of doubles
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(double from, double to, double step)
+        {
+            double tol = step / 1000;
+            int count = (int)((to - from) / step + tol + 1);
+            this.data = new object[count];
+            int index = 0;
+            for (double val = from; index < count; val += step)
+                data[index++] = val;
+        }
+
+        /// <summary>
+        /// Construct a range of floats
+        /// </summary>
+        /// <param name="from"></param>
+        /// <param name="to"></param>
+        /// <param name="step"></param>
+        public RangeAttribute(float from, float to, float step)
+        {
+            float tol = step / 1000;
+            int count = (int)((to - from) / step + tol + 1);
+            this.data = new object[count];
+            int index = 0;
+            for (float val = from; index < count; val += step)
+                data[index++] = val;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs b/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs
index 5eb1f3c..3b4da32 100644
--- a/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/RepeatAttribute.cs
@@ -1,43 +1,43 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// RepeatAttribute may be applied to test case in order
-	/// to run it multiple times.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
-	public class RepeatAttribute : PropertyAttribute
-	{
-        /// <summary>
-        /// Construct a RepeatAttribute
-        /// </summary>
-        /// <param name="count">The number of times to run the test</param>
-        public RepeatAttribute(int count) : base(count) { }
-
-        //private int count;
-
-        ///// <summary>
-        ///// Construct a RepeatAttribute
-        ///// </summary>
-        ///// <param name="count">The number of times to run the test</param>
-        //public RepeatAttribute(int count)
-        //{
-        //    this.count = count;
-        //}
-
-        ///// <summary>
-        ///// Gets the number of times to run the test.
-        ///// </summary>
-        //public int Count
-        //{
-        //    get { return count; }
-        //}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// RepeatAttribute may be applied to test case in order
+	/// to run it multiple times.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
+	public class RepeatAttribute : PropertyAttribute
+	{
+        /// <summary>
+        /// Construct a RepeatAttribute
+        /// </summary>
+        /// <param name="count">The number of times to run the test</param>
+        public RepeatAttribute(int count) : base(count) { }
+
+        //private int count;
+
+        ///// <summary>
+        ///// Construct a RepeatAttribute
+        ///// </summary>
+        ///// <param name="count">The number of times to run the test</param>
+        //public RepeatAttribute(int count)
+        //{
+        //    this.count = count;
+        //}
+
+        ///// <summary>
+        ///// Gets the number of times to run the test.
+        ///// </summary>
+        //public int Count
+        //{
+        //    get { return count; }
+        //}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs b/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs
index 7f7e427..30d3417 100644
--- a/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/RequiredAddinAttribute.cs
@@ -1,40 +1,40 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// RequiredAddinAttribute may be used to indicate the names of any addins
-    /// that must be present in order to run some or all of the tests in an
-    /// assembly. If the addin is not loaded, the entire assembly is marked
-    /// as NotRunnable.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true, Inherited=false)]
-    public class RequiredAddinAttribute : Attribute
-    {
-        private string requiredAddin;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:RequiredAddinAttribute"/> class.
-        /// </summary>
-        /// <param name="requiredAddin">The required addin.</param>
-        public RequiredAddinAttribute(string requiredAddin)
-        {
-            this.requiredAddin = requiredAddin;
-        }
-
-        /// <summary>
-        /// Gets the name of required addin.
-        /// </summary>
-        /// <value>The required addin name.</value>
-        public string RequiredAddin
-        {
-            get { return requiredAddin; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// RequiredAddinAttribute may be used to indicate the names of any addins
+    /// that must be present in order to run some or all of the tests in an
+    /// assembly. If the addin is not loaded, the entire assembly is marked
+    /// as NotRunnable.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true, Inherited=false)]
+    public class RequiredAddinAttribute : Attribute
+    {
+        private string requiredAddin;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:RequiredAddinAttribute"/> class.
+        /// </summary>
+        /// <param name="requiredAddin">The required addin.</param>
+        public RequiredAddinAttribute(string requiredAddin)
+        {
+            this.requiredAddin = requiredAddin;
+        }
+
+        /// <summary>
+        /// Gets the name of required addin.
+        /// </summary>
+        /// <value>The required addin name.</value>
+        public string RequiredAddin
+        {
+            get { return requiredAddin; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs b/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs
index 5e80470..f14c279 100644
--- a/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/SetCultureAttribute.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Summary description for SetCultureAttribute.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=true, Inherited=true)]
-	public class SetCultureAttribute : PropertyAttribute
-	{
-		/// <summary>
-		/// Construct given the name of a culture
-		/// </summary>
-		/// <param name="culture"></param>
-		public SetCultureAttribute( string culture ) : base( "_SETCULTURE", culture ) { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Summary description for SetCultureAttribute.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Assembly, AllowMultiple=false, Inherited=true)]
+	public class SetCultureAttribute : PropertyAttribute
+	{
+		/// <summary>
+		/// Construct given the name of a culture
+		/// </summary>
+		/// <param name="culture"></param>
+		public SetCultureAttribute( string culture ) : base( "_SETCULTURE", culture ) { }
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs b/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs
index 696b7d6..59638cd 100644
--- a/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/SetUICultureAttribute.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Summary description for SetUICultureAttribute.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Assembly, AllowMultiple = true, Inherited=true)]
-    public class SetUICultureAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Construct given the name of a culture
-        /// </summary>
-        /// <param name="culture"></param>
-        public SetUICultureAttribute(string culture) : base("_SETUICULTURE", culture) { }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Summary description for SetUICultureAttribute.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Assembly, AllowMultiple = false, Inherited=true)]
+    public class SetUICultureAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct given the name of a culture
+        /// </summary>
+        /// <param name="culture"></param>
+        public SetUICultureAttribute(string culture) : base("_SETUICULTURE", culture) { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs b/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs
index b1f167d..b734a4a 100644
--- a/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/SetUpAttribute.cs
@@ -1,19 +1,20 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to mark a class that contains one-time SetUp 
-	/// and/or TearDown methods that apply to all the tests in a
-	/// namespace or an assembly.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
-	public class SetUpAttribute : Attribute
-	{}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+    /// <summary>
+    /// SetUpAttribute is used in a TestFixture to identify a method
+    /// that is called immediately before each test is run. It is 
+    /// also used in a SetUpFixture to identify the method that is
+    /// called once, before any of the subordinate tests are run.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+	public class SetUpAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs b/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs
index c83674e..2550fc9 100644
--- a/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/SetUpFixtureAttribute.cs
@@ -1,18 +1,20 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// SetUpFixtureAttribute is used to identify a SetUpFixture
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
-	public class SetUpFixtureAttribute : Attribute
-	{
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Attribute used to mark a class that contains one-time SetUp 
+    /// and/or TearDown methods that apply to all the tests in a
+    /// namespace or an assembly.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
+	public class SetUpFixtureAttribute : Attribute
+	{
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs b/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs
index 6724c67..88eeec6 100644
--- a/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/SuiteAttribute.cs
@@ -1,18 +1,18 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to mark a static (shared in VB) property
-	/// that returns a list of tests.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
-	public class SuiteAttribute : Attribute
-	{}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to mark a static (shared in VB) property
+	/// that returns a list of tests.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
+	public class SuiteAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs b/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs
index 8b578f6..37daf49 100644
--- a/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TearDownAttribute.cs
@@ -1,19 +1,21 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to identify a method that is called 
-	/// immediately after each test is run. The method is 
-	/// guaranteed to be called, even if an exception is thrown.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
-	public class TearDownAttribute : Attribute
-	{}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used in a TestFixture to identify a method that is 
+    /// called immediately after each test is run. It is also used
+    /// in a SetUpFixture to identify the method that is called once,
+    /// after all subordinate tests have run. In either case, the method 
+    /// is guaranteed to be called, even if an exception is thrown.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TearDownAttribute : Attribute
+	{}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs b/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs
index f791fdf..07d71a3 100644
--- a/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestActionAttribute.cs
@@ -1,29 +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; }
-        }
-    }
-}
+// ****************************************************************
+// 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/TestAttribute.cs b/src/NUnitFramework/framework/Attributes/TestAttribute.cs
index 428fbd5..656fa26 100644
--- a/src/NUnitFramework/framework/Attributes/TestAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestAttribute.cs
@@ -1,46 +1,46 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
-	/// class makes the method callable from the NUnit test runner. There is a property 
-	/// called Description which is optional which you can provide a more detailed test
-	/// description. This class cannot be inherited.
-	/// </summary>
-	/// 
-	/// <example>
-	/// [TestFixture]
-	/// public class Fixture
-	/// {
-	///   [Test]
-	///   public void MethodToTest()
-	///   {}
-	///   
-	///   [Test(Description = "more detailed description")]
-	///   publc void TestDescriptionMethod()
-	///   {}
-	/// }
-	/// </example>
-	/// 
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
-	public class TestAttribute : Attribute
-	{
-		private string description;
-
-		/// <summary>
-		/// Descriptive text for this test
-		/// </summary>
-		public string Description
-		{
-			get { return description; }
-			set { description = value; }
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
+	/// class makes the method callable from the NUnit test runner. There is a property 
+	/// called Description which is optional which you can provide a more detailed test
+	/// description. This class cannot be inherited.
+	/// </summary>
+	/// 
+	/// <example>
+	/// [TestFixture]
+	/// public class Fixture
+	/// {
+	///   [Test]
+	///   public void MethodToTest()
+	///   {}
+	///   
+	///   [Test(Description = "more detailed description")]
+	///   publc void TestDescriptionMethod()
+	///   {}
+	/// }
+	/// </example>
+	/// 
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TestAttribute : Attribute
+	{
+		private string description;
+
+		/// <summary>
+		/// Descriptive text for this test
+		/// </summary>
+		public string Description
+		{
+			get { return description; }
+			set { description = value; }
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs b/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
index cfdfeb3..ad0b87e 100644
--- a/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestCaseAttribute.cs
@@ -1,265 +1,267 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// TestCaseAttribute is used to mark parameterized test cases
-    /// and provide them with their arguments.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited=false)]
-    public class TestCaseAttribute : Attribute, ITestCaseData
-    {
-        #region Instance Variables
-
-        private object[] arguments;
-        private object expectedResult;
-        private bool hasExpectedResult;
-        private Type expectedExceptionType;
-        private string expectedExceptionName;
-        private string expectedMessage;
-        private MessageMatch matchType;
-        private string description;
-        private string testName;
-        private bool isIgnored;
-        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
-        /// </summary>
-        /// <param name="arguments"></param>
-        public TestCaseAttribute(params object[] arguments)
-        {
-         	if (arguments == null)
-         		this.arguments = new object[] { null };
-         	else
- 	        	this.arguments = arguments;
-        }
-
-        /// <summary>
-        /// Construct a TestCaseAttribute with a single argument
-        /// </summary>
-        /// <param name="arg"></param>
-        public TestCaseAttribute(object arg)
-        {
-            this.arguments = new object[] { arg };
-        }
-
-        /// <summary>
-        /// Construct a TestCaseAttribute with a two arguments
-        /// </summary>
-        /// <param name="arg1"></param>
-        /// <param name="arg2"></param>
-        public TestCaseAttribute(object arg1, object arg2)
-        {
-            this.arguments = new object[] { arg1, arg2 };
-        }
-
-        /// <summary>
-        /// Construct a TestCaseAttribute with a three arguments
-        /// </summary>
-        /// <param name="arg1"></param>
-        /// <param name="arg2"></param>
-        /// <param name="arg3"></param>
-        public TestCaseAttribute(object arg1, object arg2, object arg3)
-        {
-            this.arguments = new object[] { arg1, arg2, arg3 };
-        }
-
-        #endregion
-
-        #region Properties
-
-        /// <summary>
-        /// Gets the list of arguments to a test case
-        /// </summary>
-        public object[] Arguments
-        {
-            get { return arguments; }
-        }
-
-        /// <summary>
-        /// Gets or sets the expected result.
-        /// </summary>
-        /// <value>The result.</value>
-        public object Result
-        {
-            get { return 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>
-        /// Gets a list of categories associated with this test;
-        /// </summary>
-        public IList Categories
-        {
-            get { return category == null ? null : category.Split(','); }
-        }
-
-        /// <summary>
-        /// Gets or sets the category associated with this test.
-        /// May be a single category or a comma-separated list.
-        /// </summary>
-        public string Category
-        {
-            get { return category; }
-            set { category = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the expected exception.
-        /// </summary>
-        /// <value>The expected exception.</value>
-        public Type ExpectedException
-        {
-            get { return expectedExceptionType;  }
-            set
-            {
-                expectedExceptionType = value;
-                expectedExceptionName = expectedExceptionType.FullName;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the name the expected exception.
-        /// </summary>
-        /// <value>The expected name of the exception.</value>
-        public string ExpectedExceptionName
-        {
-            get { return expectedExceptionName; }
-            set
-            {
-                expectedExceptionName = value;
-                expectedExceptionType = null;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets the expected message of the expected exception
-        /// </summary>
-        /// <value>The expected message of the exception.</value>
-        public string ExpectedMessage
-        {
-            get { return expectedMessage; }
-         	set { expectedMessage = value; }
-        }
-
-        /// <summary>
-        ///  Gets or sets the type of match to be performed on the expected message
-        /// </summary>
-        public MessageMatch MatchType
-        {
-            get { return matchType; }
-            set { matchType = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the description.
-        /// </summary>
-        /// <value>The description.</value>
-        public string Description
-        {
-            get { return description; }
-            set { description = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the name of the test.
-        /// </summary>
-        /// <value>The name of the test.</value>
-        public string TestName
-        {
-            get { return testName; }
-            set { testName = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the ignored status of the test
-        /// </summary>
-        public bool Ignore
-        {
-            get { return isIgnored; }
-            set { isIgnored = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the ignored status of the test
-        /// </summary>
-        public bool Ignored
-        {
-            get { return isIgnored; }
-            set { isIgnored = value; }
-        }
-
-        /// <summary>
-        /// Gets 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 reason; }
-            set 
-            { 
-                reason = value;
-                isIgnored = reason != null && reason != string.Empty;
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// TestCaseAttribute is used to mark parameterized test cases
+    /// and provide them with their arguments.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited=false)]
+    public class TestCaseAttribute : Attribute, ITestCaseData
+    {
+        #region Instance Variables
+
+        private object[] arguments;
+        private object expectedResult;
+        private bool hasExpectedResult;
+        private Type expectedExceptionType;
+        private string expectedExceptionName;
+        private string expectedMessage;
+        private MessageMatch matchType;
+        private string description;
+        private string testName;
+        private bool isIgnored;
+        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
+        /// </summary>
+        /// <param name="arguments"></param>
+        public TestCaseAttribute(params object[] arguments)
+        {
+         	if (arguments == null)
+         		this.arguments = new object[] { null };
+         	else
+ 	        	this.arguments = arguments;
+        }
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a single argument
+        /// </summary>
+        /// <param name="arg"></param>
+        public TestCaseAttribute(object arg)
+        {
+            this.arguments = new object[] { arg };
+        }
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a two arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        public TestCaseAttribute(object arg1, object arg2)
+        {
+            this.arguments = new object[] { arg1, arg2 };
+        }
+
+        /// <summary>
+        /// Construct a TestCaseAttribute with a three arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        /// <param name="arg3"></param>
+        public TestCaseAttribute(object arg1, object arg2, object arg3)
+        {
+            this.arguments = new object[] { arg1, arg2, arg3 };
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Gets the list of arguments to a test case
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected result. Use
+        /// ExpectedResult by preference.
+        /// </summary>
+        /// <value>The result.</value>
+        public object Result
+        {
+            get { return ExpectedResult; }
+            set { ExpectedResult = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected result.
+        /// </summary>
+        /// <value>The result.</value>
+        public object ExpectedResult
+        {
+            get { return expectedResult; }
+            set
+            {
+                expectedResult = value;
+                hasExpectedResult = true;
+            }
+        }
+
+        /// <summary>
+        /// Gets a flag indicating whether an expected
+        /// result has been set.
+        /// </summary>
+        public bool HasExpectedResult
+        {
+            get { return hasExpectedResult; }
+        }
+
+        /// <summary>
+        /// Gets a list of categories associated with this test;
+        /// </summary>
+        public IList Categories
+        {
+            get { return category == null ? null : category.Split(','); }
+        }
+
+        /// <summary>
+        /// Gets or sets the category associated with this test.
+        /// May be a single category or a comma-separated list.
+        /// </summary>
+        public string Category
+        {
+            get { return category; }
+            set { category = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected exception.
+        /// </summary>
+        /// <value>The expected exception.</value>
+        public Type ExpectedException
+        {
+            get { return expectedExceptionType;  }
+            set
+            {
+                expectedExceptionType = value;
+                expectedExceptionName = expectedExceptionType.FullName;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the name the expected exception.
+        /// </summary>
+        /// <value>The expected name of the exception.</value>
+        public string ExpectedExceptionName
+        {
+            get { return expectedExceptionName; }
+            set
+            {
+                expectedExceptionName = value;
+                expectedExceptionType = null;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the expected message of the expected exception
+        /// </summary>
+        /// <value>The expected message of the exception.</value>
+        public string ExpectedMessage
+        {
+            get { return expectedMessage; }
+         	set { expectedMessage = value; }
+        }
+
+        /// <summary>
+        ///  Gets or sets the type of match to be performed on the expected message
+        /// </summary>
+        public MessageMatch MatchType
+        {
+            get { return matchType; }
+            set { matchType = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the description.
+        /// </summary>
+        /// <value>The description.</value>
+        public string Description
+        {
+            get { return description; }
+            set { description = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the name of the test.
+        /// </summary>
+        /// <value>The name of the test.</value>
+        public string TestName
+        {
+            get { return testName; }
+            set { testName = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignored status of the test
+        /// </summary>
+        public bool Ignore
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignored status of the test
+        /// </summary>
+        public bool Ignored
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets 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 reason; }
+            set 
+            { 
+                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 33d14b9..90d1927 100644
--- a/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestCaseSourceAttribute.cs
@@ -1,70 +1,79 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// FactoryAttribute indicates the source to be used to
-    /// provide test cases for a test method.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
-    public class TestCaseSourceAttribute : Attribute
-    {
-        private readonly string sourceName;
-        private readonly Type sourceType;
-        private string category;
-
-        /// <summary>
-        /// Construct with the name of the factory - for use with languages
-        /// that don't support params arrays.
-        /// </summary>
-        /// <param name="sourceName">An array of the names of the factories that will provide data</param>
-        public TestCaseSourceAttribute(string sourceName)
-        {
-            this.sourceName = sourceName;
-        }
-
-        /// <summary>
-        /// Construct with a Type and name - for use with languages
-        /// that don't support params arrays.
-        /// </summary>
-        /// <param name="sourceType">The Type that will provide data</param>
-        /// <param name="sourceName">The name of the method, property or field that will provide data</param>
-        public TestCaseSourceAttribute(Type sourceType, string sourceName)
-        {
-            this.sourceType = sourceType;
-            this.sourceName = sourceName;
-        }
-
-        /// <summary>
-        /// The name of a the method, property or fiend to be used as a source
-        /// </summary>
-        public string SourceName
-        {
-            get { return sourceName; }   
-        }
-
-        /// <summary>
-        /// A Type to be used as a source
-        /// </summary>
-        public Type SourceType
-        {
-            get { return sourceType;  }
-        }
-
-        /// <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; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// FactoryAttribute indicates the source to be used to
+    /// provide test cases for a test method.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
+    public class TestCaseSourceAttribute : Attribute
+    {
+        private readonly string sourceName;
+        private readonly Type sourceType;
+        private string category;
+
+        /// <summary>
+        /// Construct with the name of the data source, which must
+        /// be a property, field or method of the test class itself.
+        /// </summary>
+        /// <param name="sourceName">An array of the names of the factories that will provide data</param>
+        public TestCaseSourceAttribute(string sourceName)
+        {
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// Construct with a Type, which must implement IEnumerable
+        /// </summary>
+        /// <param name="sourceType">The Type that will provide data</param>
+        public TestCaseSourceAttribute(Type sourceType)
+        {
+            this.sourceType = sourceType;
+        }
+
+        /// <summary>
+        /// Construct with a Type and name.
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceType">The Type that will provide data</param>
+        /// <param name="sourceName">The name of the method, property or field that will provide data</param>
+        public TestCaseSourceAttribute(Type sourceType, string sourceName)
+        {
+            this.sourceType = sourceType;
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// The name of a the method, property or fiend to be used as a source
+        /// </summary>
+        public string SourceName
+        {
+            get { return sourceName; }   
+        }
+
+        /// <summary>
+        /// A Type to be used as a source
+        /// </summary>
+        public Type SourceType
+        {
+            get { return sourceType;  }
+        }
+
+        /// <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 2c9b5e5..4fd3154 100644
--- a/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureAttribute.cs
@@ -1,171 +1,125 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-    using System.Collections;
-
-	/// <example>
-	/// [TestFixture]
-	/// public class ExampleClass 
-	/// {}
-	/// </example>
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true, Inherited=true)]
-	public class TestFixtureAttribute : Attribute
-	{
-		private string description;
-
-        private object[] arguments;
-        private bool isIgnored;
-        private string ignoreReason;
-        private string category;
-
-#if CLR_2_0 || CLR_4_0
-        private Type[] typeArgs;
-        private bool argsSeparated;
-#endif
-
-        /// <summary>
-        /// Default constructor
-        /// </summary>
-        public TestFixtureAttribute() : this( null ) { }
-        
-        /// <summary>
-        /// Construct with a object[] representing a set of arguments. 
-        /// In .NET 2.0, the arguments may later be separated into
-        /// type arguments and constructor arguments.
-        /// </summary>
-        /// <param name="arguments"></param>
-        public TestFixtureAttribute(params object[] arguments)
-        {
-            this.arguments = arguments == null
-                ? new object[0]
-                : arguments;
-
-            for (int i = 0; i < this.arguments.Length; i++)
-                if (arguments[i] is SpecialValue && (SpecialValue)arguments[i] == SpecialValue.Null)
-                    arguments[i] = null;
-        }
-
-        /// <summary>
-        /// Descriptive text for this fixture
-        /// </summary>
-        public string Description
-		{
-			get { return description; }
-			set { description = value; }
-		}
-
-        /// <summary>
-        /// Gets and sets the category for this fixture.
-        /// May be a comma-separated list of categories.
-        /// </summary>
-        public string Category
-        {
-            get { return category; }
-            set { category = value; }
-        }
-
-        /// <summary>
-        /// Gets a list of categories for this fixture
-        /// </summary>
-        public IList Categories
-        {
-            get { return category == null ? null : category.Split(','); }
-        }
-
-        /// <summary>
-        /// The arguments originally provided to the attribute
-        /// </summary>
-        public object[] Arguments
-        {
-            get
-            {
-#if CLR_2_0 || CLR_4_0
-                if (!argsSeparated)
-                    SeparateArgs();
-#endif
-                return arguments; 
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether this <see cref="TestFixtureAttribute"/> should be ignored.
-        /// </summary>
-        /// <value><c>true</c> if ignore; otherwise, <c>false</c>.</value>
-        public bool Ignore
-        {
-            get { return isIgnored; }
-            set { isIgnored = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the ignore reason. May set Ignored as a side effect.
-        /// </summary>
-        /// <value>The ignore reason.</value>
-        public string IgnoreReason
-        {
-            get { return ignoreReason; }
-            set
-            {
-                ignoreReason = value;
-                isIgnored = ignoreReason != null && ignoreReason != string.Empty;
-            }
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Get or set the type arguments. If not set
-        /// explicitly, any leading arguments that are
-        /// Types are taken as type arguments.
-        /// </summary>
-        public Type[] TypeArgs
-        {
-            get
-            {
-                if (!argsSeparated)
-                    SeparateArgs();
-
-                return typeArgs;
-            }
-            set 
-            { 
-                typeArgs = value;
-                argsSeparated = true;
-            }
-        }
-
-        private void SeparateArgs()
-        {
-            int cnt = 0;
-            if (arguments != null)
-            {
-                foreach (object o in arguments)
-                    if (o is Type) cnt++;
-                    else break;
-
-                typeArgs = new Type[cnt];
-                for (int i = 0; i < cnt; i++)
-                    typeArgs[i] = (Type)arguments[i];
-
-                if (cnt > 0)
-                {
-                    object[] args = new object[arguments.Length - cnt];
-                    for (int i = 0; i < args.Length; i++)
-                        args[i] = arguments[cnt + i];
-
-                    arguments = args;
-                }
-            }
-            else
-                typeArgs = new Type[0];
-
-            argsSeparated = true;
-        }
-#endif
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+    using System.Collections;
+
+	/// <example>
+	/// [TestFixture]
+	/// public class ExampleClass 
+	/// {}
+	/// </example>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true, Inherited=true)]
+	public class TestFixtureAttribute : Attribute
+	{
+		private string description;
+
+        private object[] arguments;
+        private bool isIgnored;
+        private string ignoreReason;
+        private string category;
+
+#if CLR_2_0 || CLR_4_0
+        private Type[] typeArgs;
+#endif
+
+        /// <summary>
+        /// Default constructor
+        /// </summary>
+        public TestFixtureAttribute() : this( null ) { }
+        
+        /// <summary>
+        /// Construct with a object[] representing a set of arguments. 
+        /// In .NET 2.0, the arguments may later be separated into
+        /// type arguments and constructor arguments.
+        /// </summary>
+        /// <param name="arguments"></param>
+        public TestFixtureAttribute(params object[] arguments)
+        {
+            this.arguments = arguments == null
+                ? new object[0]
+                : arguments;
+
+            for (int i = 0; i < this.arguments.Length; i++)
+                if (arguments[i] is SpecialValue && (SpecialValue)arguments[i] == SpecialValue.Null)
+                    arguments[i] = null;
+        }
+
+        /// <summary>
+        /// Descriptive text for this fixture
+        /// </summary>
+        public string Description
+		{
+			get { return description; }
+			set { description = value; }
+		}
+
+        /// <summary>
+        /// Gets and sets the category for this fixture.
+        /// May be a comma-separated list of categories.
+        /// </summary>
+        public string Category
+        {
+            get { return category; }
+            set { category = value; }
+        }
+
+        /// <summary>
+        /// Gets a list of categories for this fixture
+        /// </summary>
+        public IList Categories
+        {
+            get { return category == null ? null : category.Split(','); }
+        }
+
+        /// <summary>
+        /// The arguments originally provided to the attribute
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether this <see cref="TestFixtureAttribute"/> should be ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignore; otherwise, <c>false</c>.</value>
+        public bool Ignore
+        {
+            get { return isIgnored; }
+            set { isIgnored = value; }
+        }
+
+        /// <summary>
+        /// Gets or sets the ignore reason. May set Ignored as a side effect.
+        /// </summary>
+        /// <value>The ignore reason.</value>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+            set
+            {
+                ignoreReason = value;
+                isIgnored = ignoreReason != null && ignoreReason != string.Empty;
+            }
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Get or set the type arguments. If not set
+        /// explicitly, any leading arguments that are
+        /// Types are taken as type arguments.
+        /// </summary>
+        public Type[] TypeArgs
+        {
+            get { return typeArgs; }
+            set { typeArgs = value; }
+        }
+#endif
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs b/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs
index a88a434..0df35ec 100644
--- a/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureSetUpAttribute.cs
@@ -1,19 +1,19 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to identify a method that is 
-	/// called before any tests in a fixture are run.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
-	public class TestFixtureSetUpAttribute : Attribute
-	{
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to identify a method that is 
+	/// called before any tests in a fixture are run.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TestFixtureSetUpAttribute : Attribute
+	{
+	}
+}
diff --git a/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs b/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs
index 0de7357..6ef354f 100644
--- a/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TestFixtureTearDownAttribute.cs
@@ -1,21 +1,21 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-	using System;
-
-	/// <summary>
-	/// Attribute used to identify a method that is called after
-	/// all the tests in a fixture have run. The method is 
-	/// guaranteed to be called, even if an exception is thrown.
-	/// </summary>
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
-	public class TestFixtureTearDownAttribute : Attribute
-	{
-	}
-}
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+	using System;
+
+	/// <summary>
+	/// Attribute used to identify a method that is called after
+	/// all the tests in a fixture have run. The method is 
+	/// guaranteed to be called, even if an exception is thrown.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
+	public class TestFixtureTearDownAttribute : Attribute
+	{
+	}
+}
+
diff --git a/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs b/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs
index c0467ae..734cd8a 100644
--- a/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/TheoryAttribute.cs
@@ -1,46 +1,46 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-    using System;
-
-    /// <summary>
-    /// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
-    /// class makes the method callable from the NUnit test runner. There is a property 
-    /// called Description which is optional which you can provide a more detailed test
-    /// description. This class cannot be inherited.
-    /// </summary>
-    /// 
-    /// <example>
-    /// [TestFixture]
-    /// public class Fixture
-    /// {
-    ///   [Test]
-    ///   public void MethodToTest()
-    ///   {}
-    ///   
-    ///   [Test(Description = "more detailed description")]
-    ///   publc void TestDescriptionMethod()
-    ///   {}
-    /// }
-    /// </example>
-    /// 
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=true)]
-    public class TheoryAttribute : Attribute
-    {
-        //private string description;
-
-        ///// <summary>
-        ///// Descriptive text for this test
-        ///// </summary>
-        //public string Description
-        //{
-        //    get { return description; }
-        //    set { description = value; }
-        //}
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+    using System;
+
+    /// <summary>
+    /// Adding this attribute to a method within a <seealso cref="TestFixtureAttribute"/> 
+    /// class makes the method callable from the NUnit test runner. There is a property 
+    /// called Description which is optional which you can provide a more detailed test
+    /// description. This class cannot be inherited.
+    /// </summary>
+    /// 
+    /// <example>
+    /// [TestFixture]
+    /// public class Fixture
+    /// {
+    ///   [Test]
+    ///   public void MethodToTest()
+    ///   {}
+    ///   
+    ///   [Test(Description = "more detailed description")]
+    ///   publc void TestDescriptionMethod()
+    ///   {}
+    /// }
+    /// </example>
+    /// 
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited=true)]
+    public class TheoryAttribute : Attribute
+    {
+        //private string description;
+
+        ///// <summary>
+        ///// Descriptive text for this test
+        ///// </summary>
+        //public string Description
+        //{
+        //    get { return description; }
+        //    set { description = value; }
+        //}
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs b/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
index 3643183..9058377 100644
--- a/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
+++ b/src/NUnitFramework/framework/Attributes/ThreadingAttributes.cs
@@ -1,88 +1,88 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// 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.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
-    public class TimeoutAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Construct a TimeoutAttribute given a time in milliseconds
-        /// </summary>
-        /// <param name="timeout">The timeout value in milliseconds</param>
-        public TimeoutAttribute(int timeout)
-            : base(timeout) { }
-    }
-
-    /// <summary>
-    /// Marks a test that must run in the STA, causing it
-    /// to run in a separate thread if necessary.
-    /// 
-    /// On methods, you may also use STAThreadAttribute
-    /// to serve the same purpose.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
-    public class RequiresSTAAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Construct a RequiresSTAAttribute
-        /// </summary>
-        public RequiresSTAAttribute()
-        {
-            this.Properties.Add("APARTMENT_STATE", ApartmentState.STA);
-        }
-    }
-
-    /// <summary>
-    /// Marks a test that must run in the MTA, causing it
-    /// to run in a separate thread if necessary.
-    /// 
-    /// On methods, you may also use MTAThreadAttribute
-    /// to serve the same purpose.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
-    public class RequiresMTAAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Construct a RequiresMTAAttribute
-        /// </summary>
-        public RequiresMTAAttribute()
-        {
-            this.Properties.Add("APARTMENT_STATE", ApartmentState.MTA);
-        }
-    }
-
-    /// <summary>
-    /// Marks a test that must run on a separate thread.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
-    public class RequiresThreadAttribute : PropertyAttribute
-    {
-        /// <summary>
-        /// Construct a RequiresThreadAttribute
-        /// </summary>
-        public RequiresThreadAttribute()
-            : base(true) { }
-
-        /// <summary>
-        /// Construct a RequiresThreadAttribute, specifying the apartment
-        /// </summary>
-        public RequiresThreadAttribute(ApartmentState apartment)
-            : base(true)
-        {
-            this.Properties.Add("APARTMENT_STATE", apartment);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// 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.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class TimeoutAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a TimeoutAttribute given a time in milliseconds
+        /// </summary>
+        /// <param name="timeout">The timeout value in milliseconds</param>
+        public TimeoutAttribute(int timeout)
+            : base(timeout) { }
+    }
+
+    /// <summary>
+    /// Marks a test that must run in the STA, causing it
+    /// to run in a separate thread if necessary.
+    /// 
+    /// On methods, you may also use STAThreadAttribute
+    /// to serve the same purpose.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class RequiresSTAAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a RequiresSTAAttribute
+        /// </summary>
+        public RequiresSTAAttribute()
+        {
+            this.Properties.Add("APARTMENT_STATE", ApartmentState.STA);
+        }
+    }
+
+    /// <summary>
+    /// Marks a test that must run in the MTA, causing it
+    /// to run in a separate thread if necessary.
+    /// 
+    /// On methods, you may also use MTAThreadAttribute
+    /// to serve the same purpose.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class RequiresMTAAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a RequiresMTAAttribute
+        /// </summary>
+        public RequiresMTAAttribute()
+        {
+            this.Properties.Add("APARTMENT_STATE", ApartmentState.MTA);
+        }
+    }
+
+    /// <summary>
+    /// Marks a test that must run on a separate thread.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = false, Inherited=false)]
+    public class RequiresThreadAttribute : PropertyAttribute
+    {
+        /// <summary>
+        /// Construct a RequiresThreadAttribute
+        /// </summary>
+        public RequiresThreadAttribute()
+            : base(true) { }
+
+        /// <summary>
+        /// Construct a RequiresThreadAttribute, specifying the apartment
+        /// </summary>
+        public RequiresThreadAttribute(ApartmentState apartment)
+            : base(true)
+        {
+            this.Properties.Add("APARTMENT_STATE", apartment);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs b/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs
index 2ca55ec..ee449d9 100644
--- a/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/ValueSourceAttribute.cs
@@ -1,59 +1,59 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// ValueSourceAttribute indicates the source to be used to
-    /// provide data for one parameter of a test method.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true, Inherited = false)]
-    public class ValueSourceAttribute : Attribute
-    {
-        private readonly string sourceName;
-        private readonly Type sourceType;
-
-        /// <summary>
-        /// Construct with the name of the factory - for use with languages
-        /// that don't support params arrays.
-        /// </summary>
-        /// <param name="sourceName">The name of the data source to be used</param>
-        public ValueSourceAttribute(string sourceName)
-        {
-            this.sourceName = sourceName;
-        }
-
-        /// <summary>
-        /// Construct with a Type and name - for use with languages
-        /// that don't support params arrays.
-        /// </summary>
-        /// <param name="sourceType">The Type that will provide data</param>
-        /// <param name="sourceName">The name of the method, property or field that will provide data</param>
-        public ValueSourceAttribute(Type sourceType, string sourceName)
-        {
-            this.sourceType = sourceType;
-            this.sourceName = sourceName;
-        }
-
-        /// <summary>
-        /// The name of a the method, property or fiend to be used as a source
-        /// </summary>
-        public string SourceName
-        {
-            get { return sourceName; }
-        }
-
-        /// <summary>
-        /// A Type to be used as a source
-        /// </summary>
-        public Type SourceType
-        {
-            get { return sourceType; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// ValueSourceAttribute indicates the source to be used to
+    /// provide data for one parameter of a test method.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true, Inherited = false)]
+    public class ValueSourceAttribute : Attribute
+    {
+        private readonly string sourceName;
+        private readonly Type sourceType;
+
+        /// <summary>
+        /// Construct with the name of the factory - for use with languages
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceName">The name of the data source to be used</param>
+        public ValueSourceAttribute(string sourceName)
+        {
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// Construct with a Type and name - for use with languages
+        /// that don't support params arrays.
+        /// </summary>
+        /// <param name="sourceType">The Type that will provide data</param>
+        /// <param name="sourceName">The name of the method, property or field that will provide data</param>
+        public ValueSourceAttribute(Type sourceType, string sourceName)
+        {
+            this.sourceType = sourceType;
+            this.sourceName = sourceName;
+        }
+
+        /// <summary>
+        /// The name of a the method, property or fiend to be used as a source
+        /// </summary>
+        public string SourceName
+        {
+            get { return sourceName; }
+        }
+
+        /// <summary>
+        /// A Type to be used as a source
+        /// </summary>
+        public Type SourceType
+        {
+            get { return sourceType; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs b/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs
index 25ad5e9..abd354f 100644
--- a/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs
+++ b/src/NUnitFramework/framework/Attributes/ValuesAttribute.cs
@@ -1,130 +1,130 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Abstract base class for attributes that apply to parameters 
-    /// and supply data for the parameter.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
-    public abstract class ParameterDataAttribute : Attribute
-    {
-        /// <summary>
-        /// Gets the data to be provided to the specified parameter
-        /// </summary>
-        public abstract IEnumerable GetData(ParameterInfo parameter);
-    }
-
-    /// <summary>
-    /// ValuesAttribute is used to provide literal arguments for
-    /// an individual parameter of a test.
-    /// </summary>
-    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
-    public class ValuesAttribute : ParameterDataAttribute
-    {
-        /// <summary>
-        /// The collection of data to be returned. Must
-        /// be set by any derived attribute classes.
-        /// We use an object[] so that the individual
-        /// elements may have their type changed in GetData
-        /// if necessary.
-        /// </summary>
-        // TODO: This causes a lot of boxing so we should eliminate it.
-        protected object[] data;
-
-        /// <summary>
-        /// Construct with one argument
-        /// </summary>
-        /// <param name="arg1"></param>
-        public ValuesAttribute(object arg1)
-        {
-            data = new object[] { arg1 };
-        }
-
-        /// <summary>
-        /// Construct with two arguments
-        /// </summary>
-        /// <param name="arg1"></param>
-        /// <param name="arg2"></param>
-        public ValuesAttribute(object arg1, object arg2)
-        {
-            data = new object[] { arg1, arg2 };
-        }
-
-        /// <summary>
-        /// Construct with three arguments
-        /// </summary>
-        /// <param name="arg1"></param>
-        /// <param name="arg2"></param>
-        /// <param name="arg3"></param>
-        public ValuesAttribute(object arg1, object arg2, object arg3)
-        {
-            data = new object[] { arg1, arg2, arg3 };
-        }
-
-        /// <summary>
-        /// Construct with an array of arguments
-        /// </summary>
-        /// <param name="args"></param>
-        public ValuesAttribute(params object[] args)
-        {
-            data = args;
-        }
-
-        /// <summary>
-        /// Get the collection of values to be used as arguments
-        /// </summary>
-        public override IEnumerable GetData(ParameterInfo parameter)
-        {
-            Type targetType = parameter.ParameterType;
-
-            for (int i = 0; i < data.Length; i++)
-            {
-                object arg = data[i];
-
-                if (arg == null) 
-                    continue;
-
-                if (arg.GetType().FullName == "NUnit.Framework.SpecialValue" &&
-                    arg.ToString() == "Null")
-                {
-                    data[i] = null;
-                    continue;
-                }
-
-                if (targetType.IsAssignableFrom(arg.GetType()))
-                    continue;
-
-                if (arg is DBNull)
-                {
-                    data[i] = null;
-                    continue;
-                }
-
-                bool convert = false;
-
-                if (targetType == typeof(short) || targetType == typeof(byte) || targetType == typeof(sbyte))
-                    convert = arg is int;
-                else
-                    if (targetType == typeof(decimal))
-                        convert = arg is double || arg is string || arg is int;
-                    else
-                        if (targetType == typeof(DateTime) || targetType == typeof(TimeSpan))
-                            convert = arg is string;
-
-                if (convert)
-                    data[i] = Convert.ChangeType(arg, targetType, System.Globalization.CultureInfo.InvariantCulture);
-            }
-
-			return data;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Abstract base class for attributes that apply to parameters 
+    /// and supply data for the parameter.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+    public abstract class ParameterDataAttribute : Attribute
+    {
+        /// <summary>
+        /// Gets the data to be provided to the specified parameter
+        /// </summary>
+        public abstract IEnumerable GetData(ParameterInfo parameter);
+    }
+
+    /// <summary>
+    /// ValuesAttribute is used to provide literal arguments for
+    /// an individual parameter of a test.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+    public class ValuesAttribute : ParameterDataAttribute
+    {
+        /// <summary>
+        /// The collection of data to be returned. Must
+        /// be set by any derived attribute classes.
+        /// We use an object[] so that the individual
+        /// elements may have their type changed in GetData
+        /// if necessary.
+        /// </summary>
+        // TODO: This causes a lot of boxing so we should eliminate it.
+        protected object[] data;
+
+        /// <summary>
+        /// Construct with one argument
+        /// </summary>
+        /// <param name="arg1"></param>
+        public ValuesAttribute(object arg1)
+        {
+            data = new object[] { arg1 };
+        }
+
+        /// <summary>
+        /// Construct with two arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        public ValuesAttribute(object arg1, object arg2)
+        {
+            data = new object[] { arg1, arg2 };
+        }
+
+        /// <summary>
+        /// Construct with three arguments
+        /// </summary>
+        /// <param name="arg1"></param>
+        /// <param name="arg2"></param>
+        /// <param name="arg3"></param>
+        public ValuesAttribute(object arg1, object arg2, object arg3)
+        {
+            data = new object[] { arg1, arg2, arg3 };
+        }
+
+        /// <summary>
+        /// Construct with an array of arguments
+        /// </summary>
+        /// <param name="args"></param>
+        public ValuesAttribute(params object[] args)
+        {
+            data = args;
+        }
+
+        /// <summary>
+        /// Get the collection of values to be used as arguments
+        /// </summary>
+        public override IEnumerable GetData(ParameterInfo parameter)
+        {
+            Type targetType = parameter.ParameterType;
+
+            for (int i = 0; i < data.Length; i++)
+            {
+                object arg = data[i];
+
+                if (arg == null) 
+                    continue;
+
+                if (arg.GetType().FullName == "NUnit.Framework.SpecialValue" &&
+                    arg.ToString() == "Null")
+                {
+                    data[i] = null;
+                    continue;
+                }
+
+                if (targetType.IsAssignableFrom(arg.GetType()))
+                    continue;
+
+                if (arg is DBNull)
+                {
+                    data[i] = null;
+                    continue;
+                }
+
+                bool convert = false;
+
+                if (targetType == typeof(short) || targetType == typeof(byte) || targetType == typeof(sbyte))
+                    convert = arg is int;
+                else
+                    if (targetType == typeof(decimal))
+                        convert = arg is double || arg is string || arg is int;
+                    else
+                        if (targetType == typeof(DateTime) || targetType == typeof(TimeSpan))
+                            convert = arg is string;
+
+                if (convert)
+                    data[i] = Convert.ChangeType(arg, targetType, System.Globalization.CultureInfo.InvariantCulture);
+            }
+
+			return data;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/CollectionAssert.cs b/src/NUnitFramework/framework/CollectionAssert.cs
index 308ae38..b6fe4b9 100644
--- a/src/NUnitFramework/framework/CollectionAssert.cs
+++ b/src/NUnitFramework/framework/CollectionAssert.cs
@@ -1,658 +1,658 @@
-// ****************************************************************
-// 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.ComponentModel;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// A set of Assert methods operationg on one or more collections
-	/// </summary>
-	public class CollectionAssert
-	{
-		#region Equals and ReferenceEquals
-
-		/// <summary>
-		/// The Equals method throws an AssertionException. This is done 
-		/// to make sure there is no mistake by calling this function.
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		[EditorBrowsable(EditorBrowsableState.Never)]
-		public static new bool Equals(object a, object b)
-		{
-			throw new AssertionException("Assert.Equals should not be used for Assertions");
-		}
-
-		/// <summary>
-		/// override the default ReferenceEquals to throw an AssertionException. This 
-		/// implementation makes sure there is no mistake in calling this function 
-		/// as part of Assert. 
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		public static new void ReferenceEquals(object a, object b)
-		{
-			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
-		}
-
-		#endregion
-				
-		#region AllItemsAreInstancesOfType
-		/// <summary>
-		/// Asserts that all items contained in collection are of the type specified by expectedType.
-		/// </summary>
-		/// <param name="collection">IEnumerable containing objects to be considered</param>
-		/// <param name="expectedType">System.Type that all objects in collection must be instances of</param>
-		public static void AllItemsAreInstancesOfType (IEnumerable collection, Type expectedType)
-		{
-			AllItemsAreInstancesOfType(collection, expectedType, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that all items contained in collection are of the type specified by expectedType.
-		/// </summary>
-		/// <param name="collection">IEnumerable containing objects to be considered</param>
-		/// <param name="expectedType">System.Type that all objects in collection must be instances of</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AllItemsAreInstancesOfType (IEnumerable collection, Type expectedType, string message)
-		{
-			AllItemsAreInstancesOfType(collection, expectedType, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that all items contained in collection are of the type specified by expectedType.
-		/// </summary>
-		/// <param name="collection">IEnumerable containing objects to be considered</param>
-		/// <param name="expectedType">System.Type that all objects in collection must be instances of</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 AllItemsAreInstancesOfType (IEnumerable collection, Type expectedType, string message, params object[] args)
-		{
-            Assert.That(collection, new AllItemsConstraint(new InstanceOfTypeConstraint(expectedType)), message, args);
-		}
-		#endregion
-
-		#region AllItemsAreNotNull
-
-		/// <summary>
-		/// Asserts that all items contained in collection are not equal to null.
-		/// </summary>
-		/// <param name="collection">IEnumerable containing objects to be considered</param>
-		public static void AllItemsAreNotNull (IEnumerable collection) 
-		{
-			AllItemsAreNotNull(collection, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that all items contained in collection are not equal to null.
-		/// </summary>
-		/// <param name="collection">IEnumerable containing objects to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AllItemsAreNotNull (IEnumerable collection, string message) 
-		{
-			AllItemsAreNotNull(collection, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that all items contained in collection are not equal to null.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</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 AllItemsAreNotNull (IEnumerable collection, string message, params object[] args) 
-		{
-            Assert.That(collection, new AllItemsConstraint(new NotConstraint(new EqualConstraint(null))), message, args);
-		}
-		#endregion
-
-		#region AllItemsAreUnique
-
-		/// <summary>
-		/// Ensures that every object contained in collection exists within the collection
-		/// once and only once.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		public static void AllItemsAreUnique (IEnumerable collection) 
-		{
-			AllItemsAreUnique(collection, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Ensures that every object contained in collection exists within the collection
-		/// once and only once.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AllItemsAreUnique (IEnumerable collection, string message) 
-		{
-			AllItemsAreUnique(collection, message, null);
-		}
-		
-		/// <summary>
-		/// Ensures that every object contained in collection exists within the collection
-		/// once and only once.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</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 AllItemsAreUnique (IEnumerable collection, string message, params object[] args) 
-		{
-            Assert.That(collection, new UniqueItemsConstraint(), message, args);
-		}
-		#endregion
-
-		#region AreEqual
-
-		/// <summary>
-		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
-		/// and contain the exact same objects in the same order.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		public static void AreEqual (IEnumerable expected, IEnumerable actual) 
-		{
-			//AreEqual(expected, actual, null, string.Empty, null);
-            Assert.That(actual, new EqualConstraint(expected));
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
-		/// and contain the exact same objects in the same order.
-		/// If comparer is not null then it will be used to compare the objects.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
-		public static void AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer) 
-		{
-			AreEqual(expected, actual, comparer, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
-		/// and contain the exact same objects in the same order.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AreEqual (IEnumerable expected, IEnumerable actual, string message) 
-		{
-			//AreEqual(expected, actual, null, message, null);
-            Assert.That(actual, new EqualConstraint(expected), message);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
-		/// and contain the exact same objects in the same order.
-		/// If comparer is not null then it will be used to compare the objects.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message) 
-		{
-			AreEqual(expected, actual, comparer, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
-		/// and contain the exact same objects in the same order.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreEqual (IEnumerable expected, IEnumerable actual, string message, params object[] args) 
-		{
-			//AreEqual(expected, actual, null, message, args);
-            Assert.That(actual, new EqualConstraint(expected), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
-		/// and contain the exact same objects in the same order.
-		/// If comparer is not null then it will be used to compare the objects.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</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 AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message, params object[] args) 
-		{
-            Assert.That(actual, new EqualConstraint(expected).Using(comparer), message, args);
-		}
-		#endregion
-
-		#region AreEquivalent
-
-		/// <summary>
-		/// Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		public static void AreEquivalent (IEnumerable expected, IEnumerable actual) 
-		{
-			AreEquivalent(expected, actual, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AreEquivalent (IEnumerable expected, IEnumerable actual, string message) 
-		{
-			AreEquivalent(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreEquivalent (IEnumerable expected, IEnumerable actual, string message, params object[] args) 
-		{
-            Assert.That(actual, new CollectionEquivalentConstraint(expected), message, args);
-		}
-		#endregion
-
-		#region AreNotEqual
-
-		/// <summary>
-		/// Asserts that expected and actual are not exactly equal.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		public static void AreNotEqual (IEnumerable expected, IEnumerable actual)
-		{
-            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)));
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not exactly equal.
-		/// If comparer is not null then it will be used to compare the objects.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
-		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer)
-		{
-			AreNotEqual(expected, actual, comparer, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not exactly equal.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, string message)
-		{
-            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not exactly equal.
-		/// If comparer is not null then it will be used to compare the objects.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message)
-		{
-			AreNotEqual(expected, actual, comparer, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not exactly equal.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreNotEqual (IEnumerable expected, IEnumerable actual, string message, params object[] args) 
-		{
-			//AreNotEqual(expected, actual, null, message, args);
-			//Assert.AreNotEqual( expected, actual, message, args );
-            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message, args);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not exactly equal.
-		/// If comparer is not null then it will be used to compare the objects.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</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 AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message, params object[] args)
-		{
-			Assert.That(actual, new NotConstraint(new EqualConstraint(expected).Using(comparer)), message, args);
-		}
-		#endregion
-
-		#region AreNotEquivalent
-
-		/// <summary>
-		/// Asserts that expected and actual are not equivalent.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		public static void AreNotEquivalent (IEnumerable expected, IEnumerable actual)
-		{
-			AreNotEquivalent(expected, actual, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not equivalent.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void AreNotEquivalent (IEnumerable expected, IEnumerable actual, string message)
-		{
-			AreNotEquivalent(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that expected and actual are not equivalent.
-		/// </summary>
-		/// <param name="expected">The first IEnumerable of objects to be considered</param>
-		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreNotEquivalent (IEnumerable expected, IEnumerable actual, string message, params object[] args)
-		{
-            Assert.That(actual, new NotConstraint(new CollectionEquivalentConstraint(expected)), message, args);
-		}
-		#endregion
-
-		#region Contains
-		/// <summary>
-		/// Asserts that collection contains actual as an item.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="actual">Object to be found within collection</param>
-		public static void Contains (IEnumerable collection, Object actual)
-		{
-			Contains(collection, actual, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that collection contains actual as an item.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="actual">Object to be found within collection</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void Contains (IEnumerable collection, Object actual, string message)
-		{
-			Contains(collection, actual, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that collection contains actual as an item.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="actual">Object to be found within collection</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 Contains (IEnumerable collection, Object actual, string message, params object[] args)
-		{
-            Assert.That(collection, new CollectionContainsConstraint(actual), message, args);
-		}
-		#endregion
-
-		#region DoesNotContain
-
-		/// <summary>
-		/// Asserts that collection does not contain actual as an item.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="actual">Object that cannot exist within collection</param>
-		public static void DoesNotContain (IEnumerable collection, Object actual)
-		{
-			DoesNotContain(collection, actual, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that collection does not contain actual as an item.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="actual">Object that cannot exist within collection</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void DoesNotContain (IEnumerable collection, Object actual, string message)
-		{
-			DoesNotContain(collection, actual, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that collection does not contain actual as an item.
-		/// </summary>
-		/// <param name="collection">IEnumerable of objects to be considered</param>
-		/// <param name="actual">Object that cannot exist within collection</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 DoesNotContain (IEnumerable collection, Object actual, string message, params object[] args)
-		{
-            Assert.That(collection, new NotConstraint( new CollectionContainsConstraint( actual ) ), message, args);
-		}
-		#endregion
-
-		#region IsNotSubsetOf
-
-		/// <summary>
-		/// Asserts that superset is not a subject of subset.
-		/// </summary>
-		/// <param name="subset">The IEnumerable superset to be considered</param>
-		/// <param name="superset">The IEnumerable subset to be considered</param>
-		public static void IsNotSubsetOf (IEnumerable subset, IEnumerable superset)
-		{
-			IsNotSubsetOf(subset, superset, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that superset is not a subject of subset.
-		/// </summary>
-		/// <param name="subset">The IEnumerable superset to be considered</param>
-		/// <param name="superset">The IEnumerable subset to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void IsNotSubsetOf (IEnumerable subset, IEnumerable superset, string message)
-		{
-			IsNotSubsetOf(subset, superset, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that superset is not a subject of subset.
-		/// </summary>
-		/// <param name="subset">The IEnumerable superset to be considered</param>
-		/// <param name="superset">The IEnumerable subset to be considered</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 IsNotSubsetOf (IEnumerable subset, IEnumerable superset, string message, params object[] args)
-		{
-            Assert.That(subset, new NotConstraint(new CollectionSubsetConstraint(superset)), message, args);
-		}
-		#endregion
-
-		#region IsSubsetOf
-
-		/// <summary>
-		/// Asserts that superset is a subset of subset.
-		/// </summary>
-		/// <param name="subset">The IEnumerable superset to be considered</param>
-		/// <param name="superset">The IEnumerable subset to be considered</param>
-		public static void IsSubsetOf (IEnumerable subset, IEnumerable superset)
-		{
-			IsSubsetOf(subset, superset, string.Empty, null);
-		}
-
-		/// <summary>
-		/// Asserts that superset is a subset of subset.
-		/// </summary>
-		/// <param name="subset">The IEnumerable superset to be considered</param>
-		/// <param name="superset">The IEnumerable subset to be considered</param>
-		/// <param name="message">The message that will be displayed on failure</param>
-		public static void IsSubsetOf (IEnumerable subset, IEnumerable superset, string message)
-		{
-			IsSubsetOf(subset, superset, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that superset is a subset of subset.
-		/// </summary>
-		/// <param name="subset">The IEnumerable superset to be considered</param>
-		/// <param name="superset">The IEnumerable subset to be considered</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 IsSubsetOf (IEnumerable subset, IEnumerable superset, string message, params object[] args)
-		{
-            Assert.That(subset, new CollectionSubsetConstraint(superset), message, args);
-		}
-		#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 IEnumerable</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static void IsEmpty(IEnumerable collection, string message, params object[] args)
-        {
-            Assert.That(collection, new EmptyConstraint(), message, args);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        public static void IsEmpty(IEnumerable collection, string message)
-        {
-            IsEmpty(collection, message, null);
-        }
-
-        /// <summary>
-        /// Assert that an array,list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        public static void IsEmpty(IEnumerable collection)
-        {
-            IsEmpty(collection, string.Empty, null);
-        }
-        #endregion
-
-        #region IsNotEmpty
-        /// <summary>
-        /// Assert that an array, list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static void IsNotEmpty(IEnumerable collection, string message, params object[] args)
-        {
-            Assert.That(collection, new NotConstraint(new EmptyConstraint()), message, args);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        public static void IsNotEmpty(IEnumerable collection, string message)
-        {
-            IsNotEmpty(collection, message, null);
-        }
-
-        /// <summary>
-        /// Assert that an array,list or other collection is empty
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        public static void IsNotEmpty(IEnumerable collection)
-        {
-            IsNotEmpty(collection, string.Empty, null);
-        }
-        #endregion
- 
-        #region IsOrdered
-        /// <summary>
-        /// Assert that an array, list or other collection is ordered
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static void IsOrdered(IEnumerable collection, string message, params object[] args)
-        {
-            Assert.That(collection, new CollectionOrderedConstraint(), message, args);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is ordered
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        public static void IsOrdered(IEnumerable collection, string message)
-        {
-            IsOrdered(collection, message, null);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is ordered
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        public static void IsOrdered(IEnumerable collection)
-        {
-            IsOrdered(collection, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is ordered
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="comparer">A custom comparer to perform the comparisons</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static void IsOrdered(IEnumerable collection, IComparer comparer, string message, params object[] args)
-        {
-            Assert.That(collection, new CollectionOrderedConstraint().Using(comparer), message, args);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is ordered
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="comparer">A custom comparer to perform the comparisons</param>
-        /// <param name="message">The message to be displayed on failure</param>
-        public static void IsOrdered(IEnumerable collection, IComparer comparer, string message)
-        {
-            IsOrdered(collection, comparer, message, null);
-        }
-
-        /// <summary>
-        /// Assert that an array, list or other collection is ordered
-        /// </summary>
-        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
-        /// <param name="comparer">A custom comparer to perform the comparisons</param>
-        public static void IsOrdered(IEnumerable collection, IComparer comparer)
-        {
-            IsOrdered(collection, comparer, string.Empty, null);
-        }
-        #endregion
-    }
-}
-
-
+// ****************************************************************
+// 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.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// A set of Assert methods operationg on one or more collections
+	/// </summary>
+	public class CollectionAssert
+	{
+		#region Equals and ReferenceEquals
+
+		/// <summary>
+		/// The Equals method throws an AssertionException. This is done 
+		/// to make sure there is no mistake by calling this function.
+		/// </summary>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		[EditorBrowsable(EditorBrowsableState.Never)]
+		public static new bool Equals(object a, object b)
+		{
+			throw new AssertionException("Assert.Equals should not be used for Assertions");
+		}
+
+		/// <summary>
+		/// override the default ReferenceEquals to throw an AssertionException. This 
+		/// implementation makes sure there is no mistake in calling this function 
+		/// as part of Assert. 
+		/// </summary>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		public static new void ReferenceEquals(object a, object b)
+		{
+			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+		}
+
+		#endregion
+				
+		#region AllItemsAreInstancesOfType
+		/// <summary>
+		/// Asserts that all items contained in collection are of the type specified by expectedType.
+		/// </summary>
+		/// <param name="collection">IEnumerable containing objects to be considered</param>
+		/// <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+		public static void AllItemsAreInstancesOfType (IEnumerable collection, Type expectedType)
+		{
+			AllItemsAreInstancesOfType(collection, expectedType, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that all items contained in collection are of the type specified by expectedType.
+		/// </summary>
+		/// <param name="collection">IEnumerable containing objects to be considered</param>
+		/// <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AllItemsAreInstancesOfType (IEnumerable collection, Type expectedType, string message)
+		{
+			AllItemsAreInstancesOfType(collection, expectedType, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that all items contained in collection are of the type specified by expectedType.
+		/// </summary>
+		/// <param name="collection">IEnumerable containing objects to be considered</param>
+		/// <param name="expectedType">System.Type that all objects in collection must be instances of</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 AllItemsAreInstancesOfType (IEnumerable collection, Type expectedType, string message, params object[] args)
+		{
+            Assert.That(collection, new AllItemsConstraint(new InstanceOfTypeConstraint(expectedType)), message, args);
+		}
+		#endregion
+
+		#region AllItemsAreNotNull
+
+		/// <summary>
+		/// Asserts that all items contained in collection are not equal to null.
+		/// </summary>
+		/// <param name="collection">IEnumerable containing objects to be considered</param>
+		public static void AllItemsAreNotNull (IEnumerable collection) 
+		{
+			AllItemsAreNotNull(collection, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that all items contained in collection are not equal to null.
+		/// </summary>
+		/// <param name="collection">IEnumerable containing objects to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AllItemsAreNotNull (IEnumerable collection, string message) 
+		{
+			AllItemsAreNotNull(collection, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that all items contained in collection are not equal to null.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</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 AllItemsAreNotNull (IEnumerable collection, string message, params object[] args) 
+		{
+            Assert.That(collection, new AllItemsConstraint(new NotConstraint(new EqualConstraint(null))), message, args);
+		}
+		#endregion
+
+		#region AllItemsAreUnique
+
+		/// <summary>
+		/// Ensures that every object contained in collection exists within the collection
+		/// once and only once.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		public static void AllItemsAreUnique (IEnumerable collection) 
+		{
+			AllItemsAreUnique(collection, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Ensures that every object contained in collection exists within the collection
+		/// once and only once.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AllItemsAreUnique (IEnumerable collection, string message) 
+		{
+			AllItemsAreUnique(collection, message, null);
+		}
+		
+		/// <summary>
+		/// Ensures that every object contained in collection exists within the collection
+		/// once and only once.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</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 AllItemsAreUnique (IEnumerable collection, string message, params object[] args) 
+		{
+            Assert.That(collection, new UniqueItemsConstraint(), message, args);
+		}
+		#endregion
+
+		#region AreEqual
+
+		/// <summary>
+		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+		/// and contain the exact same objects in the same order.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		public static void AreEqual (IEnumerable expected, IEnumerable actual) 
+		{
+			//AreEqual(expected, actual, null, string.Empty, null);
+            Assert.That(actual, new EqualConstraint(expected));
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+		/// and contain the exact same objects in the same order.
+		/// If comparer is not null then it will be used to compare the objects.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+		public static void AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer) 
+		{
+			AreEqual(expected, actual, comparer, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+		/// and contain the exact same objects in the same order.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AreEqual (IEnumerable expected, IEnumerable actual, string message) 
+		{
+			//AreEqual(expected, actual, null, message, null);
+            Assert.That(actual, new EqualConstraint(expected), message);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+		/// and contain the exact same objects in the same order.
+		/// If comparer is not null then it will be used to compare the objects.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message) 
+		{
+			AreEqual(expected, actual, comparer, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+		/// and contain the exact same objects in the same order.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreEqual (IEnumerable expected, IEnumerable actual, string message, params object[] args) 
+		{
+			//AreEqual(expected, actual, null, message, args);
+            Assert.That(actual, new EqualConstraint(expected), message, args);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+		/// and contain the exact same objects in the same order.
+		/// If comparer is not null then it will be used to compare the objects.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</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 AreEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message, params object[] args) 
+		{
+            Assert.That(actual, new EqualConstraint(expected).Using(comparer), message, args);
+		}
+		#endregion
+
+		#region AreEquivalent
+
+		/// <summary>
+		/// Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		public static void AreEquivalent (IEnumerable expected, IEnumerable actual) 
+		{
+			AreEquivalent(expected, actual, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AreEquivalent (IEnumerable expected, IEnumerable actual, string message) 
+		{
+			AreEquivalent(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreEquivalent (IEnumerable expected, IEnumerable actual, string message, params object[] args) 
+		{
+            Assert.That(actual, new CollectionEquivalentConstraint(expected), message, args);
+		}
+		#endregion
+
+		#region AreNotEqual
+
+		/// <summary>
+		/// Asserts that expected and actual are not exactly equal.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		public static void AreNotEqual (IEnumerable expected, IEnumerable actual)
+		{
+            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)));
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not exactly equal.
+		/// If comparer is not null then it will be used to compare the objects.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer)
+		{
+			AreNotEqual(expected, actual, comparer, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not exactly equal.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, string message)
+		{
+            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not exactly equal.
+		/// If comparer is not null then it will be used to compare the objects.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message)
+		{
+			AreNotEqual(expected, actual, comparer, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not exactly equal.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreNotEqual (IEnumerable expected, IEnumerable actual, string message, params object[] args) 
+		{
+			//AreNotEqual(expected, actual, null, message, args);
+			//Assert.AreNotEqual( expected, actual, message, args );
+            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message, args);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not exactly equal.
+		/// If comparer is not null then it will be used to compare the objects.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</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 AreNotEqual (IEnumerable expected, IEnumerable actual, IComparer comparer, string message, params object[] args)
+		{
+			Assert.That(actual, new NotConstraint(new EqualConstraint(expected).Using(comparer)), message, args);
+		}
+		#endregion
+
+		#region AreNotEquivalent
+
+		/// <summary>
+		/// Asserts that expected and actual are not equivalent.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		public static void AreNotEquivalent (IEnumerable expected, IEnumerable actual)
+		{
+			AreNotEquivalent(expected, actual, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not equivalent.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void AreNotEquivalent (IEnumerable expected, IEnumerable actual, string message)
+		{
+			AreNotEquivalent(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that expected and actual are not equivalent.
+		/// </summary>
+		/// <param name="expected">The first IEnumerable of objects to be considered</param>
+		/// <param name="actual">The second IEnumerable of objects to be considered</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 AreNotEquivalent (IEnumerable expected, IEnumerable actual, string message, params object[] args)
+		{
+            Assert.That(actual, new NotConstraint(new CollectionEquivalentConstraint(expected)), message, args);
+		}
+		#endregion
+
+		#region Contains
+		/// <summary>
+		/// Asserts that collection contains actual as an item.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="actual">Object to be found within collection</param>
+		public static void Contains (IEnumerable collection, Object actual)
+		{
+			Contains(collection, actual, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that collection contains actual as an item.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="actual">Object to be found within collection</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void Contains (IEnumerable collection, Object actual, string message)
+		{
+			Contains(collection, actual, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that collection contains actual as an item.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="actual">Object to be found within collection</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 Contains (IEnumerable collection, Object actual, string message, params object[] args)
+		{
+            Assert.That(collection, new CollectionContainsConstraint(actual), message, args);
+		}
+		#endregion
+
+		#region DoesNotContain
+
+		/// <summary>
+		/// Asserts that collection does not contain actual as an item.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="actual">Object that cannot exist within collection</param>
+		public static void DoesNotContain (IEnumerable collection, Object actual)
+		{
+			DoesNotContain(collection, actual, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that collection does not contain actual as an item.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="actual">Object that cannot exist within collection</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void DoesNotContain (IEnumerable collection, Object actual, string message)
+		{
+			DoesNotContain(collection, actual, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that collection does not contain actual as an item.
+		/// </summary>
+		/// <param name="collection">IEnumerable of objects to be considered</param>
+		/// <param name="actual">Object that cannot exist within collection</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 DoesNotContain (IEnumerable collection, Object actual, string message, params object[] args)
+		{
+            Assert.That(collection, new NotConstraint( new CollectionContainsConstraint( actual ) ), message, args);
+		}
+		#endregion
+
+		#region IsNotSubsetOf
+
+		/// <summary>
+		/// Asserts that superset is not a subject of subset.
+		/// </summary>
+		/// <param name="subset">The IEnumerable superset to be considered</param>
+		/// <param name="superset">The IEnumerable subset to be considered</param>
+		public static void IsNotSubsetOf (IEnumerable subset, IEnumerable superset)
+		{
+			IsNotSubsetOf(subset, superset, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that superset is not a subject of subset.
+		/// </summary>
+		/// <param name="subset">The IEnumerable superset to be considered</param>
+		/// <param name="superset">The IEnumerable subset to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void IsNotSubsetOf (IEnumerable subset, IEnumerable superset, string message)
+		{
+			IsNotSubsetOf(subset, superset, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that superset is not a subject of subset.
+		/// </summary>
+		/// <param name="subset">The IEnumerable superset to be considered</param>
+		/// <param name="superset">The IEnumerable subset to be considered</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 IsNotSubsetOf (IEnumerable subset, IEnumerable superset, string message, params object[] args)
+		{
+            Assert.That(subset, new NotConstraint(new CollectionSubsetConstraint(superset)), message, args);
+		}
+		#endregion
+
+		#region IsSubsetOf
+
+		/// <summary>
+		/// Asserts that superset is a subset of subset.
+		/// </summary>
+		/// <param name="subset">The IEnumerable superset to be considered</param>
+		/// <param name="superset">The IEnumerable subset to be considered</param>
+		public static void IsSubsetOf (IEnumerable subset, IEnumerable superset)
+		{
+			IsSubsetOf(subset, superset, string.Empty, null);
+		}
+
+		/// <summary>
+		/// Asserts that superset is a subset of subset.
+		/// </summary>
+		/// <param name="subset">The IEnumerable superset to be considered</param>
+		/// <param name="superset">The IEnumerable subset to be considered</param>
+		/// <param name="message">The message that will be displayed on failure</param>
+		public static void IsSubsetOf (IEnumerable subset, IEnumerable superset, string message)
+		{
+			IsSubsetOf(subset, superset, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that superset is a subset of subset.
+		/// </summary>
+		/// <param name="subset">The IEnumerable superset to be considered</param>
+		/// <param name="superset">The IEnumerable subset to be considered</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 IsSubsetOf (IEnumerable subset, IEnumerable superset, string message, params object[] args)
+		{
+            Assert.That(subset, new CollectionSubsetConstraint(superset), message, args);
+		}
+		#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 IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsEmpty(IEnumerable collection, string message, params object[] args)
+        {
+            Assert.That(collection, new EmptyConstraint(), message, args);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        public static void IsEmpty(IEnumerable collection, string message)
+        {
+            IsEmpty(collection, message, null);
+        }
+
+        /// <summary>
+        /// Assert that an array,list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        public static void IsEmpty(IEnumerable collection)
+        {
+            IsEmpty(collection, string.Empty, null);
+        }
+        #endregion
+
+        #region IsNotEmpty
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsNotEmpty(IEnumerable collection, string message, params object[] args)
+        {
+            Assert.That(collection, new NotConstraint(new EmptyConstraint()), message, args);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        public static void IsNotEmpty(IEnumerable collection, string message)
+        {
+            IsNotEmpty(collection, message, null);
+        }
+
+        /// <summary>
+        /// Assert that an array,list or other collection is empty
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        public static void IsNotEmpty(IEnumerable collection)
+        {
+            IsNotEmpty(collection, string.Empty, null);
+        }
+        #endregion
+ 
+        #region IsOrdered
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsOrdered(IEnumerable collection, string message, params object[] args)
+        {
+            Assert.That(collection, new CollectionOrderedConstraint(), message, args);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        public static void IsOrdered(IEnumerable collection, string message)
+        {
+            IsOrdered(collection, message, null);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        public static void IsOrdered(IEnumerable collection)
+        {
+            IsOrdered(collection, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="comparer">A custom comparer to perform the comparisons</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsOrdered(IEnumerable collection, IComparer comparer, string message, params object[] args)
+        {
+            Assert.That(collection, new CollectionOrderedConstraint().Using(comparer), message, args);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="comparer">A custom comparer to perform the comparisons</param>
+        /// <param name="message">The message to be displayed on failure</param>
+        public static void IsOrdered(IEnumerable collection, IComparer comparer, string message)
+        {
+            IsOrdered(collection, comparer, message, null);
+        }
+
+        /// <summary>
+        /// Assert that an array, list or other collection is ordered
+        /// </summary>
+        /// <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        /// <param name="comparer">A custom comparer to perform the comparisons</param>
+        public static void IsOrdered(IEnumerable collection, IComparer comparer)
+        {
+            IsOrdered(collection, comparer, string.Empty, null);
+        }
+        #endregion
+    }
+}
+
+
diff --git a/src/NUnitFramework/framework/Constraints/AllItemsConstraint.cs b/src/NUnitFramework/framework/Constraints/AllItemsConstraint.cs
new file mode 100644
index 0000000..65cc074
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AllItemsConstraint.cs
@@ -0,0 +1,58 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AllItemsConstraint applies another constraint to each
+    /// item in a collection, succeeding if they all succeed.
+    /// </summary>
+    public class AllItemsConstraint : PrefixConstraint
+    {
+        /// <summary>
+        /// Construct an AllItemsConstraint on top of an existing constraint
+        /// </summary>
+        /// <param name="itemConstraint"></param>
+        public AllItemsConstraint(Constraint itemConstraint)
+            : base(itemConstraint)
+        {
+            this.DisplayName = "all";
+        }
+
+        /// <summary>
+        /// Apply the item constraint to each item in the collection,
+        /// failing if any item fails.
+        /// </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");
+
+            foreach (object item in (IEnumerable)actual)
+                if (!baseConstraint.Matches(item))
+                    return false;
+
+            return true;
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("all items");
+            baseConstraint.WriteDescriptionTo(writer);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/AndConstraint.cs b/src/NUnitFramework/framework/Constraints/AndConstraint.cs
new file mode 100644
index 0000000..e4d6ff9
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AndConstraint.cs
@@ -0,0 +1,83 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AndConstraint succeeds only if both members succeed.
+    /// </summary>
+    public class AndConstraint : BinaryConstraint
+    {
+        private enum FailurePoint
+        {
+            None,
+            Left,
+            Right
+        };
+
+        private FailurePoint failurePoint;
+
+        /// <summary>
+        /// Create an AndConstraint from two other constraints
+        /// </summary>
+        /// <param name="left">The first constraint</param>
+        /// <param name="right">The second constraint</param>
+        public AndConstraint(Constraint left, Constraint right) : base(left, right) { }
+
+        /// <summary>
+        /// Apply both member constraints to an actual value, succeeding 
+        /// succeeding only if both of them succeed.
+        /// </summary>
+        /// <param name="actual">The actual value</param>
+        /// <returns>True if the constraints both succeeded</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            failurePoint = left.Matches(actual)
+                ? right.Matches(actual)
+                    ? FailurePoint.None
+                    : FailurePoint.Right
+                : FailurePoint.Left;
+
+            return failurePoint == FailurePoint.None;
+        }
+
+        /// <summary>
+        /// Write a description for this contraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to receive the description</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            left.WriteDescriptionTo(writer);
+            writer.WriteConnector("and");
+            right.WriteDescriptionTo(writer);
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            switch (failurePoint)
+            {
+                case FailurePoint.Left:
+                    left.WriteActualValueTo(writer);
+                    break;
+                case FailurePoint.Right:
+                    right.WriteActualValueTo(writer);
+                    break;
+                default:
+                    base.WriteActualValueTo(writer);
+                    break;
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/AssignableFromConstraint.cs b/src/NUnitFramework/framework/Constraints/AssignableFromConstraint.cs
new file mode 100644
index 0000000..2bd9146
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AssignableFromConstraint.cs
@@ -0,0 +1,44 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AssignableFromConstraint is used to test that an object
+    /// can be assigned from a given Type.
+    /// </summary>
+    public class AssignableFromConstraint : TypeConstraint
+    {
+        /// <summary>
+        /// Construct an AssignableFromConstraint for the type provided
+        /// </summary>
+        /// <param name="type"></param>
+        public AssignableFromConstraint(Type type) : base(type) { }
+
+        /// <summary>
+        /// Test whether an object can be assigned from the specified type
+        /// </summary>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return actual != null && actual.GetType().IsAssignableFrom(expectedType);
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to use</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("assignable from");
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/AssignableToConstraint.cs b/src/NUnitFramework/framework/Constraints/AssignableToConstraint.cs
new file mode 100644
index 0000000..4a937dc
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AssignableToConstraint.cs
@@ -0,0 +1,44 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AssignableToConstraint is used to test that an object
+    /// can be assigned to a given Type.
+    /// </summary>
+    public class AssignableToConstraint : TypeConstraint
+    {
+        /// <summary>
+        /// Construct an AssignableToConstraint for the type provided
+        /// </summary>
+        /// <param name="type"></param>
+        public AssignableToConstraint(Type type) : base(type) { }
+
+        /// <summary>
+        /// Test whether an object can be assigned to the specified type
+        /// </summary>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return actual != null && expectedType.IsAssignableFrom(actual.GetType());
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to use</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("assignable to");
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/AttributeConstraint.cs b/src/NUnitFramework/framework/Constraints/AttributeConstraint.cs
new file mode 100644
index 0000000..e39290f
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AttributeConstraint.cs
@@ -0,0 +1,89 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AttributeConstraint tests that a specified attribute is present
+    /// on a Type or other provider and that the value of the attribute
+    /// satisfies some other constraint.
+    /// </summary>
+    public class AttributeConstraint : PrefixConstraint
+    {
+        private readonly Type expectedType;
+        private Attribute attrFound;
+
+        /// <summary>
+        /// Constructs an AttributeConstraint for a specified attriute
+        /// Type and base constraint.
+        /// </summary>
+        /// <param name="type"></param>
+        /// <param name="baseConstraint"></param>
+        public AttributeConstraint(Type type, Constraint baseConstraint)
+            : base( baseConstraint )
+        {
+            this.expectedType = type;
+
+            if (!typeof(Attribute).IsAssignableFrom(expectedType))
+                throw new ArgumentException(string.Format(
+                    "Type {0} is not an attribute", expectedType), "type");
+        }
+
+        /// <summary>
+        /// Determines whether the Type or other provider has the 
+        /// expected attribute and if its value matches the
+        /// additional constraint specified.
+        /// </summary>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            System.Reflection.ICustomAttributeProvider attrProvider =
+                actual as System.Reflection.ICustomAttributeProvider;
+
+            if (attrProvider == null)
+                throw new ArgumentException(string.Format("Actual value {0} does not implement ICustomAttributeProvider", actual), "actual");
+
+            Attribute[] attrs = (Attribute[])attrProvider.GetCustomAttributes(expectedType, true);
+            if (attrs.Length == 0)
+                throw new ArgumentException(string.Format("Attribute {0} was not found", expectedType), "actual");
+
+            attrFound = attrs[0];
+            return baseConstraint.Matches(attrFound);
+        }
+
+        /// <summary>
+        /// Writes a description of the attribute to the specified writer.
+        /// </summary>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("attribute " + expectedType.FullName);
+            if (baseConstraint != null)
+            {
+                if (baseConstraint is EqualConstraint)
+                    writer.WritePredicate("equal to");
+                baseConstraint.WriteDescriptionTo(writer);
+            }
+        }
+
+        /// <summary>
+        /// Writes the actual value supplied to the specified writer.
+        /// </summary>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.WriteActualValue(attrFound);
+        }
+
+        /// <summary>
+        /// Returns a string representation of the constraint.
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<attribute {0} {1}>", expectedType, baseConstraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/AttributeConstraints.cs b/src/NUnitFramework/framework/Constraints/AttributeConstraints.cs
deleted file mode 100644
index f248aa1..0000000
--- a/src/NUnitFramework/framework/Constraints/AttributeConstraints.cs
+++ /dev/null
@@ -1,138 +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;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// AttributeExistsConstraint tests for the presence of a
-    /// specified attribute on  a Type.
-    /// </summary>
-    public class AttributeExistsConstraint : Constraint
-    {
-        private Type expectedType;
-
-        /// <summary>
-        /// Constructs an AttributeExistsConstraint for a specific attribute Type
-        /// </summary>
-        /// <param name="type"></param>
-        public AttributeExistsConstraint(Type type)
-            : base(type)
-        {
-            this.expectedType = type;
-
-            if (!typeof(Attribute).IsAssignableFrom(expectedType))
-                throw new ArgumentException(string.Format(
-                    "Type {0} is not an attribute", expectedType), "type");
-        }
-
-        /// <summary>
-        /// Tests whether the object provides the expected attribute.
-        /// </summary>
-        /// <param name="actual">A Type, MethodInfo, or other ICustomAttributeProvider</param>
-        /// <returns>True if the expected attribute is present, otherwise false</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            System.Reflection.ICustomAttributeProvider attrProvider =
-                actual as System.Reflection.ICustomAttributeProvider;
-
-            if (attrProvider == null)
-                throw new ArgumentException(string.Format("Actual value {0} does not implement ICustomAttributeProvider", actual), "actual");
-
-            return attrProvider.GetCustomAttributes(expectedType, true).Length > 0;
-        }
-
-        /// <summary>
-        /// Writes the description of the constraint to the specified writer
-        /// </summary>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("type with attribute");
-            writer.WriteExpectedValue(expectedType);
-        }
-    }
-
-    /// <summary>
-    /// AttributeConstraint tests that a specified attribute is present
-    /// on a Type or other provider and that the value of the attribute
-    /// satisfies some other constraint.
-    /// </summary>
-    public class AttributeConstraint : PrefixConstraint
-    {
-        private Type expectedType;
-        private Attribute attrFound;
-
-        /// <summary>
-        /// Constructs an AttributeConstraint for a specified attriute
-        /// Type and base constraint.
-        /// </summary>
-        /// <param name="type"></param>
-        /// <param name="baseConstraint"></param>
-        public AttributeConstraint(Type type, Constraint baseConstraint)
-            : base( baseConstraint )
-        {
-            this.expectedType = type;
-
-            if (!typeof(Attribute).IsAssignableFrom(expectedType))
-                throw new ArgumentException(string.Format(
-                    "Type {0} is not an attribute", expectedType), "type");
-        }
-
-        /// <summary>
-        /// Determines whether the Type or other provider has the 
-        /// expected attribute and if its value matches the
-        /// additional constraint specified.
-        /// </summary>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            System.Reflection.ICustomAttributeProvider attrProvider =
-                actual as System.Reflection.ICustomAttributeProvider;
-
-            if (attrProvider == null)
-                throw new ArgumentException(string.Format("Actual value {0} does not implement ICustomAttributeProvider", actual), "actual");
-
-            Attribute[] attrs = (Attribute[])attrProvider.GetCustomAttributes(expectedType, true);
-            if (attrs.Length == 0)
-                throw new ArgumentException(string.Format("Attribute {0} was not found", expectedType), "actual");
-
-            this.attrFound = attrs[0];
-            return baseConstraint.Matches(attrFound);
-        }
-
-        /// <summary>
-        /// Writes a description of the attribute to the specified writer.
-        /// </summary>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("attribute " + expectedType.FullName);
-            if (baseConstraint != null)
-            {
-                if (baseConstraint is EqualConstraint)
-                    writer.WritePredicate("equal to");
-                baseConstraint.WriteDescriptionTo(writer);
-            }
-        }
-
-        /// <summary>
-        /// Writes the actual value supplied to the specified writer.
-        /// </summary>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            writer.WriteActualValue(attrFound);
-        }
-
-        /// <summary>
-        /// Returns a string representation of the constraint.
-        /// </summary>
-        protected override string GetStringRepresentation()
-        {
-            return string.Format("<attribute {0} {1}>", expectedType, baseConstraint);
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/Constraints/AttributeExistsConstraint.cs b/src/NUnitFramework/framework/Constraints/AttributeExistsConstraint.cs
new file mode 100644
index 0000000..44d1316
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/AttributeExistsConstraint.cs
@@ -0,0 +1,59 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// AttributeExistsConstraint tests for the presence of a
+    /// specified attribute on  a Type.
+    /// </summary>
+    public class AttributeExistsConstraint : Constraint
+    {
+        private Type expectedType;
+
+        /// <summary>
+        /// Constructs an AttributeExistsConstraint for a specific attribute Type
+        /// </summary>
+        /// <param name="type"></param>
+        public AttributeExistsConstraint(Type type)
+            : base(type)
+        {
+            this.expectedType = type;
+
+            if (!typeof(Attribute).IsAssignableFrom(expectedType))
+                throw new ArgumentException(string.Format(
+                    "Type {0} is not an attribute", expectedType), "type");
+        }
+
+        /// <summary>
+        /// Tests whether the object provides the expected attribute.
+        /// </summary>
+        /// <param name="actual">A Type, MethodInfo, or other ICustomAttributeProvider</param>
+        /// <returns>True if the expected attribute is present, otherwise false</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            System.Reflection.ICustomAttributeProvider attrProvider =
+                actual as System.Reflection.ICustomAttributeProvider;
+
+            if (attrProvider == null)
+                throw new ArgumentException(string.Format("Actual value {0} does not implement ICustomAttributeProvider", actual), "actual");
+
+            return attrProvider.GetCustomAttributes(expectedType, true).Length > 0;
+        }
+
+        /// <summary>
+        /// Writes the description of the constraint to the specified writer
+        /// </summary>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("type with attribute");
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/BasicConstraint.cs b/src/NUnitFramework/framework/Constraints/BasicConstraint.cs
new file mode 100644
index 0000000..8a74c9c
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/BasicConstraint.cs
@@ -0,0 +1,56 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// BasicConstraint is the abstract base for constraints that
+    /// perform a simple comparison to a constant value.
+    /// </summary>
+    public abstract class BasicConstraint : Constraint
+    {
+        private readonly object expected;
+        private readonly string description;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:BasicConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected.</param>
+        /// <param name="description">The description.</param>
+        protected BasicConstraint(object expected, string description)
+        {
+            this.expected = expected;
+            this.description = description;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (actual == null && expected == null)
+                return true;
+
+            if (actual == null || expected == null)
+                return false;
+            
+            return expected.Equals(actual);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write(description);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/BasicConstraints.cs b/src/NUnitFramework/framework/Constraints/BasicConstraints.cs
deleted file mode 100644
index d5a6146..0000000
--- a/src/NUnitFramework/framework/Constraints/BasicConstraints.cs
+++ /dev/null
@@ -1,118 +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;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// BasicConstraint is the abstract base for constraints that
-    /// perform a simple comparison to a constant value.
-    /// </summary>
-    public abstract class BasicConstraint : Constraint
-    {
-        private object expected;
-        private string description;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:BasicConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected.</param>
-        /// <param name="description">The description.</param>
-        public BasicConstraint(object expected, string description)
-        {
-            this.expected = expected;
-            this.description = description;
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (actual == null && expected == null)
-                return true;
-
-            if (actual == null || expected == null)
-                return false;
-            
-            return expected.Equals(actual);
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write(description);
-        }
-    }
-
-    /// <summary>
-    /// NullConstraint tests that the actual value is null
-    /// </summary>
-    public class NullConstraint : BasicConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:NullConstraint"/> class.
-        /// </summary>
-        public NullConstraint() : base(null, "null") { }
-    }
-
-    /// <summary>
-    /// TrueConstraint tests that the actual value is true
-    /// </summary>
-    public class TrueConstraint : BasicConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:TrueConstraint"/> class.
-        /// </summary>
-        public TrueConstraint() : base(true, "True") { }
-    }
-
-    /// <summary>
-    /// FalseConstraint tests that the actual value is false
-    /// </summary>
-    public class FalseConstraint : BasicConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:FalseConstraint"/> class.
-        /// </summary>
-        public FalseConstraint() : base(false, "False") { }
-    }
-
-    /// <summary>
-    /// NaNConstraint tests that the actual value is a double or float NaN
-    /// </summary>
-    public class NaNConstraint : Constraint
-    {
-        /// <summary>
-        /// Test that the actual value is an NaN
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            return actual is double && double.IsNaN((double)actual)
-                || actual is float && float.IsNaN((float)actual);
-        }
-
-        /// <summary>
-        /// Write the constraint description to a specified writer
-        /// </summary>
-        /// <param name="writer"></param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("NaN");
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/Constraints/BinaryConstraint.cs b/src/NUnitFramework/framework/Constraints/BinaryConstraint.cs
new file mode 100644
index 0000000..e5a14b2
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/BinaryConstraint.cs
@@ -0,0 +1,36 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// BinaryConstraint is the abstract base of all constraints
+	/// that combine two other constraints in some fashion.
+	/// </summary>
+    public abstract class BinaryConstraint : Constraint
+    {
+		/// <summary>
+		/// The first constraint being combined
+		/// </summary>
+		protected Constraint left;
+		/// <summary>
+		/// The second constraint being combined
+		/// </summary>
+		protected Constraint right;
+
+		/// <summary>
+		/// Construct a BinaryConstraint from two other constraints
+		/// </summary>
+		/// <param name="left">The first constraint</param>
+		/// <param name="right">The second constraint</param>
+        protected BinaryConstraint(Constraint left, Constraint right)
+            : base(left, right)
+        {
+            this.left = left;
+            this.right = right;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/BinaryOperations.cs b/src/NUnitFramework/framework/Constraints/BinaryOperations.cs
deleted file mode 100644
index 2c2c27a..0000000
--- a/src/NUnitFramework/framework/Constraints/BinaryOperations.cs
+++ /dev/null
@@ -1,148 +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.Framework.Constraints
-{
-	/// <summary>
-	/// BinaryConstraint is the abstract base of all constraints
-	/// that combine two other constraints in some fashion.
-	/// </summary>
-    public abstract class BinaryConstraint : Constraint
-    {
-		/// <summary>
-		/// The first constraint being combined
-		/// </summary>
-		protected Constraint left;
-		/// <summary>
-		/// The second constraint being combined
-		/// </summary>
-		protected Constraint right;
-
-		/// <summary>
-		/// Construct a BinaryConstraint from two other constraints
-		/// </summary>
-		/// <param name="left">The first constraint</param>
-		/// <param name="right">The second constraint</param>
-        public BinaryConstraint(Constraint left, Constraint right) : base(left, right)
-        {
-            this.left = left;
-            this.right = right;
-        }
-    }
-
-    /// <summary>
-    /// AndConstraint succeeds only if both members succeed.
-    /// </summary>
-	public class AndConstraint : BinaryConstraint
-    {
-        private enum FailurePoint
-        {
-            None,
-            Left,
-            Right
-        };
-
-        private FailurePoint failurePoint;
-
-		/// <summary>
-		/// Create an AndConstraint from two other constraints
-		/// </summary>
-		/// <param name="left">The first constraint</param>
-		/// <param name="right">The second constraint</param>
-		public AndConstraint(Constraint left, Constraint right) : base(left, right) { }
-
-		/// <summary>
-		/// Apply both member constraints to an actual value, succeeding 
-		/// succeeding only if both of them succeed.
-		/// </summary>
-		/// <param name="actual">The actual value</param>
-		/// <returns>True if the constraints both succeeded</returns>
-		public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            failurePoint = left.Matches(actual)
-                ? right.Matches(actual)
-                    ? FailurePoint.None
-                    : FailurePoint.Right
-                : FailurePoint.Left;
-
-            return failurePoint == FailurePoint.None;
-        }
-
-		/// <summary>
-		/// Write a description for this contraint to a MessageWriter
-		/// </summary>
-		/// <param name="writer">The MessageWriter to receive the description</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            left.WriteDescriptionTo(writer);
-            writer.WriteConnector("and");
-            right.WriteDescriptionTo(writer);
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. The default implementation simply writes
-        /// the raw value of actual, leaving it to the writer to
-        /// perform any formatting.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            switch (failurePoint)
-            {
-                case FailurePoint.Left:
-                    left.WriteActualValueTo(writer);
-                    break;
-                case FailurePoint.Right:
-                    right.WriteActualValueTo(writer);
-                    break;
-                default:
-                    base.WriteActualValueTo(writer);
-                    break;
-            }
-        }
-    }
-
-	/// <summary>
-	/// OrConstraint succeeds if either member succeeds
-	/// </summary>
-    public class OrConstraint : BinaryConstraint
-    {
-		/// <summary>
-		/// Create an OrConstraint from two other constraints
-		/// </summary>
-		/// <param name="left">The first constraint</param>
-		/// <param name="right">The second constraint</param>
-		public OrConstraint(Constraint left, Constraint right) : base(left, right) { }
-
-		/// <summary>
-		/// Apply the member constraints to an actual value, succeeding 
-		/// succeeding as soon as one of them succeeds.
-		/// </summary>
-		/// <param name="actual">The actual value</param>
-		/// <returns>True if either constraint succeeded</returns>
-		public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            return left.Matches(actual) || right.Matches(actual);
-        }
-
-		/// <summary>
-		/// Write a description for this contraint to a MessageWriter
-		/// </summary>
-		/// <param name="writer">The MessageWriter to receive the description</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            left.WriteDescriptionTo(writer);
-            writer.WriteConnector("or");
-            right.WriteDescriptionTo(writer);
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/Constraints/BinarySerializableConstraint.cs b/src/NUnitFramework/framework/Constraints/BinarySerializableConstraint.cs
new file mode 100644
index 0000000..424c039
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/BinarySerializableConstraint.cs
@@ -0,0 +1,81 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// BinarySerializableConstraint tests whether 
+    /// an object is serializable in binary format.
+    /// </summary>
+    public class BinarySerializableConstraint : Constraint
+    {
+        readonly BinaryFormatter serializer = new BinaryFormatter();
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if(actual == null)
+                throw new ArgumentException();
+
+            MemoryStream stream = new MemoryStream();
+
+            try
+            {
+                serializer.Serialize(stream, actual);
+
+                stream.Seek(0, SeekOrigin.Begin);
+
+                object value = serializer.Deserialize(stream);
+
+                return value != null;
+            }
+            catch (SerializationException)
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("binary serializable");
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.Write("<{0}>", actual.GetType().Name);
+        }
+
+        /// <summary>
+        /// Returns the string representation
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return "<binaryserializable>";
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionConstraint.cs b/src/NUnitFramework/framework/Constraints/CollectionConstraint.cs
new file mode 100644
index 0000000..75e0831
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionConstraint.cs
@@ -0,0 +1,72 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionConstraint is the abstract base class for
+    /// constraints that operate on collections.
+    /// </summary>
+    public abstract class CollectionConstraint : Constraint
+    {
+        /// <summary>
+        /// Construct an empty CollectionConstraint
+        /// </summary>
+        protected CollectionConstraint() { }
+
+        /// <summary>
+        /// Construct a CollectionConstraint
+        /// </summary>
+        /// <param name="arg"></param>
+        protected CollectionConstraint(object arg) : base(arg) { }
+
+        /// <summary>
+        /// Determines whether the specified enumerable is empty.
+        /// </summary>
+        /// <param name="enumerable">The enumerable.</param>
+        /// <returns>
+        /// 	<c>true</c> if the specified enumerable is empty; otherwise, <c>false</c>.
+        /// </returns>
+		protected static bool IsEmpty( IEnumerable enumerable )
+		{
+			ICollection collection = enumerable as ICollection;
+			if ( collection != null )
+				return collection.Count == 0;
+
+            // NOTE: Ignore unsuppressed warning about o in .NET 1.1 build
+            foreach (object o in enumerable)
+                return false;
+
+            return true;
+        }
+
+		/// <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;
+
+			IEnumerable enumerable = actual as IEnumerable;
+			if ( enumerable == null )
+				throw new ArgumentException( "The actual value must be an IEnumerable", "actual" );
+		
+			return doMatch( enumerable );
+		}
+
+		/// <summary>
+		/// Protected method to be implemented by derived classes
+		/// </summary>
+		/// <param name="collection"></param>
+		/// <returns></returns>
+		protected abstract bool doMatch(IEnumerable collection);
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs b/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
deleted file mode 100644
index 655a1f6..0000000
--- a/src/NUnitFramework/framework/Constraints/CollectionConstraints.cs
+++ /dev/null
@@ -1,547 +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.Collections;
-using System.Reflection;
-using System.Text;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    #region CollectionConstraint
-    /// <summary>
-    /// CollectionConstraint is the abstract base class for
-    /// constraints that operate on collections.
-    /// </summary>
-    public abstract class CollectionConstraint : Constraint
-    {
-        /// <summary>
-        /// Construct an empty CollectionConstraint
-        /// </summary>
-        public CollectionConstraint() { }
-
-        /// <summary>
-        /// Construct a CollectionConstraint
-        /// </summary>
-        /// <param name="arg"></param>
-        public CollectionConstraint(object arg) : base(arg) { }
-
-        /// <summary>
-        /// Determines whether the specified enumerable is empty.
-        /// </summary>
-        /// <param name="enumerable">The enumerable.</param>
-        /// <returns>
-        /// 	<c>true</c> if the specified enumerable is empty; otherwise, <c>false</c>.
-        /// </returns>
-		protected static bool IsEmpty( IEnumerable enumerable )
-		{
-			ICollection collection = enumerable as ICollection;
-			if ( collection != null )
-				return collection.Count == 0;
-
-            foreach (object o in enumerable)
-                return false;
-
-            return true;
-        }
-
-		/// <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;
-
-			IEnumerable enumerable = actual as IEnumerable;
-			if ( enumerable == null )
-				throw new ArgumentException( "The actual value must be an IEnumerable", "actual" );
-		
-			return doMatch( enumerable );
-		}
-
-		/// <summary>
-		/// Protected method to be implemented by derived classes
-		/// </summary>
-		/// <param name="collection"></param>
-		/// <returns></returns>
-		protected abstract bool doMatch(IEnumerable collection);
-    }
-    #endregion
-
-    #region CollectionItemsEqualConstraint
-    /// <summary>
-    /// CollectionItemsEqualConstraint is the abstract base class for all
-    /// collection constraints that apply some notion of item equality
-    /// as a part of their operation.
-    /// </summary>
-    public abstract class CollectionItemsEqualConstraint : CollectionConstraint
-    {
-		// This is internal so that ContainsConstraint can set it
-		// TODO: Figure out a way to avoid this indirection
-        internal NUnitEqualityComparer comparer = NUnitEqualityComparer.Default;
-
-        /// <summary>
-        /// Construct an empty CollectionConstraint
-        /// </summary>
-        public CollectionItemsEqualConstraint() { }
-
-        /// <summary>
-        /// Construct a CollectionConstraint
-        /// </summary>
-        /// <param name="arg"></param>
-        public CollectionItemsEqualConstraint(object arg) : base(arg) { }
-
-        #region Modifiers
-        /// <summary>
-        /// Flag the constraint to ignore case and return self.
-        /// </summary>
-        public CollectionItemsEqualConstraint IgnoreCase
-        {
-            get
-            {
-                comparer.IgnoreCase = true;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public CollectionItemsEqualConstraint Using(IComparer comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public CollectionItemsEqualConstraint Using<T>(IComparer<T> comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied Comparison object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public CollectionItemsEqualConstraint Using<T>(Comparison<T> comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IEqualityComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public CollectionItemsEqualConstraint Using(IEqualityComparer comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IEqualityComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public CollectionItemsEqualConstraint Using<T>(IEqualityComparer<T> comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-#endif
-        #endregion
-
-        /// <summary>
-        /// Compares two collection members for equality
-        /// </summary>
-        protected bool ItemsEqual(object x, object y)
-        {
-            Tolerance tolerance = Tolerance.Zero;
-            return comparer.AreEqual(x, y, ref tolerance);
-        }
-
-        /// <summary>
-        /// Return a new CollectionTally for use in making tests
-        /// </summary>
-        /// <param name="c">The collection to be included in the tally</param>
-        protected CollectionTally Tally(IEnumerable c)
-        {
-            return new CollectionTally(comparer, c);
-        }
-    }
-    #endregion
-
-    #region EmptyCollectionConstraint
-    /// <summary>
-    /// EmptyCollectionConstraint tests whether a collection is empty. 
-    /// </summary>
-    public class EmptyCollectionConstraint : CollectionConstraint
-	{
-		/// <summary>
-		/// Check that the collection is empty
-		/// </summary>
-		/// <param name="collection"></param>
-		/// <returns></returns>
-		protected override bool doMatch(IEnumerable collection)
-		{
-			return IsEmpty( collection );
-		}
-	
-		/// <summary>
-		/// Write the constraint description to a MessageWriter
-		/// </summary>
-		/// <param name="writer"></param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.Write( "<empty>" );
-		}
-	}
-	#endregion
-
-	#region UniqueItemsConstraint
-    /// <summary>
-    /// UniqueItemsConstraint tests whether all the items in a 
-    /// collection are unique.
-    /// </summary>
-    public class UniqueItemsConstraint : CollectionItemsEqualConstraint
-    {
-        /// <summary>
-        /// Check that all items are unique.
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        protected override bool doMatch(IEnumerable actual)
-        {
-            ArrayList list = new ArrayList();
-
-            foreach (object o1 in actual)
-            {
-                foreach( object o2 in list )
-                    if ( ItemsEqual(o1, o2) )
-                        return false;
-                list.Add(o1);
-            }
-
-            return true;
-        }
-
-        /// <summary>
-        /// Write a description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer"></param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("all items unique");
-        }
-    }
-    #endregion
-
-    #region CollectionContainsConstraint
-    /// <summary>
-    /// CollectionContainsConstraint is used to test whether a collection
-    /// contains an expected object as a member.
-    /// </summary>
-    public class CollectionContainsConstraint : CollectionItemsEqualConstraint
-    {
-        private object expected;
-
-        /// <summary>
-        /// Construct a CollectionContainsConstraint
-        /// </summary>
-        /// <param name="expected"></param>
-        public CollectionContainsConstraint(object expected)
-            : base(expected)
-        {
-            this.expected = expected;
-            this.DisplayName = "contains";
-        }
-
-        /// <summary>
-        /// Test whether the expected item is contained in the collection
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        protected override bool doMatch(IEnumerable actual)
-        {
-            foreach (object obj in actual)
-                if (ItemsEqual(obj, expected))
-                    return true;
-
-            return false;
-        }
-
-        /// <summary>
-        /// Write a descripton of the constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer"></param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("collection containing");
-            writer.WriteExpectedValue(expected);
-        }
-    }
-    #endregion
-
-    #region CollectionEquivalentConstraint
-    /// <summary>
-    /// CollectionEquivalentCOnstraint is used to determine whether two
-    /// collections are equivalent.
-    /// </summary>
-    public class CollectionEquivalentConstraint : CollectionItemsEqualConstraint
-    {
-        private IEnumerable expected;
-
-        /// <summary>
-        /// Construct a CollectionEquivalentConstraint
-        /// </summary>
-        /// <param name="expected"></param>
-        public CollectionEquivalentConstraint(IEnumerable expected) : base(expected)
-        {
-            this.expected = expected;
-            this.DisplayName = "equivalent";
-        }
-
-        /// <summary>
-        /// Test whether two collections are equivalent
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        protected override bool doMatch(IEnumerable actual)
-        {
-			// This is just an optimization
-			if( expected is ICollection && actual is ICollection )
-				if( ((ICollection)actual).Count != ((ICollection)expected).Count )
-					return false;
-
-            CollectionTally tally = Tally(expected);
-            return tally.TryRemove(actual) && tally.Count == 0;
-        }
-
-        /// <summary>
-        /// Write a description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer"></param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("equivalent to");
-            writer.WriteExpectedValue(expected);
-        }
-    }
-    #endregion
-
-    #region CollectionSubsetConstraint
-    /// <summary>
-    /// CollectionSubsetConstraint is used to determine whether
-    /// one collection is a subset of another
-    /// </summary>
-    public class CollectionSubsetConstraint : CollectionItemsEqualConstraint
-    {
-        private IEnumerable expected;
-
-        /// <summary>
-        /// Construct a CollectionSubsetConstraint
-        /// </summary>
-        /// <param name="expected">The collection that the actual value is expected to be a subset of</param>
-        public CollectionSubsetConstraint(IEnumerable expected) : base(expected)
-        {
-            this.expected = expected;
-            this.DisplayName = "subsetof";
-        }
-
-        /// <summary>
-        /// Test whether the actual collection is a subset of 
-        /// the expected collection provided.
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        protected override bool doMatch(IEnumerable actual)
-        {
-            return Tally(expected).TryRemove( actual );
-        }
-        
-        /// <summary>
-        /// Write a description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer"></param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate( "subset of" );
-            writer.WriteExpectedValue(expected);
-        }
-    }
-    #endregion
-
-    #region CollectionOrderedConstraint
-
-    /// <summary>
-    /// CollectionOrderedConstraint is used to test whether a collection is ordered.
-    /// </summary>
-    public class CollectionOrderedConstraint : CollectionConstraint
-    {
-        private ComparisonAdapter comparer = ComparisonAdapter.Default;
-        private string comparerName;
-        private string propertyName;
-        private bool descending;
-
-        /// <summary>
-        /// Construct a CollectionOrderedConstraint
-        /// </summary>
-        public CollectionOrderedConstraint() 
-        {
-            this.DisplayName = "ordered";
-        }
-
-        ///<summary>
-        /// If used performs a reverse comparison
-        ///</summary>
-        public CollectionOrderedConstraint Descending
-        {
-            get
-            {
-                descending = true;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Modifies the constraint to use an IComparer and returns self.
-        /// </summary>
-        public CollectionOrderedConstraint Using(IComparer comparer)
-        {
-            this.comparer = ComparisonAdapter.For( comparer );
-            this.comparerName = comparer.GetType().FullName;
-            return this;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Modifies the constraint to use an IComparer<T> and returns self.
-        /// </summary>
-        public CollectionOrderedConstraint Using<T>(IComparer<T> comparer)
-        {
-            this.comparer = ComparisonAdapter.For(comparer);
-            this.comparerName = comparer.GetType().FullName;
-            return this;
-        }
-
-        /// <summary>
-        /// Modifies the constraint to use a Comparison<T> and returns self.
-        /// </summary>
-        public CollectionOrderedConstraint Using<T>(Comparison<T> comparer)
-        {
-            this.comparer = ComparisonAdapter.For(comparer);
-            this.comparerName = comparer.GetType().FullName;
-            return this;
-        }
-#endif
-
-        /// <summary>
-        /// Modifies the constraint to test ordering by the value of
-        /// a specified property and returns self.
-        /// </summary>
-        public CollectionOrderedConstraint By(string propertyName)
-		{
-			this.propertyName = propertyName;
-			return this;
-		}
-
-        /// <summary>
-        /// Test whether the collection is ordered
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        protected override bool doMatch(IEnumerable actual)
-        {
-            object previous = null;
-            int index = 0;
-            foreach(object obj in actual)
-            {
-                object objToCompare = obj;
-                if (obj == null)
-                    throw new ArgumentNullException("actual", "Null value at index " + index.ToString());
-
-                if (this.propertyName != null)
-                {
-                    PropertyInfo prop = obj.GetType().GetProperty(propertyName);
-                    objToCompare = prop.GetValue(obj, null);
-                    if (objToCompare == null)
-                        throw new ArgumentNullException("actual", "Null property value at index " + index.ToString());
-                }
-
-                if (previous != null)
-                {
-                    //int comparisonResult = comparer.Compare(al[i], al[i + 1]);
-                    int comparisonResult = comparer.Compare(previous, objToCompare);
-
-                    if (descending && comparisonResult < 0)
-                        return false;
-                    if (!descending && comparisonResult > 0)
-                        return false;
-                }
-
-                previous = objToCompare;
-                index++;
-            }
-
-            return true;
-        }
-
-        /// <summary>
-        /// Write a description of the constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer"></param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            if (propertyName == null)
-                writer.Write("collection ordered");
-            else
-            {
-                writer.WritePredicate("collection ordered by");
-                writer.WriteExpectedValue(propertyName);
-            }
-
-            if (descending)
-                writer.WriteModifier("descending");
-        }
-
-        /// <summary>
-        /// Returns the string representation of the constraint.
-        /// </summary>
-        /// <returns></returns>
-        protected override string GetStringRepresentation()
-        {
-            StringBuilder sb = new StringBuilder("<ordered");
-
-            if (propertyName != null)
-                sb.Append("by " + propertyName);
-            if (descending)
-                sb.Append(" descending");
-            if (comparerName != null)
-                sb.Append(" " + comparerName);
-
-            sb.Append(">");
-
-            return sb.ToString();
-        }
-    }
-    #endregion
-}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionContainsConstraint.cs b/src/NUnitFramework/framework/Constraints/CollectionContainsConstraint.cs
new file mode 100644
index 0000000..261aa98
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionContainsConstraint.cs
@@ -0,0 +1,54 @@
+// ****************************************************************
+// Copyright 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.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionContainsConstraint is used to test whether a collection
+    /// contains an expected object as a member.
+    /// </summary>
+    public class CollectionContainsConstraint : CollectionItemsEqualConstraint
+    {
+        private readonly object expected;
+
+        /// <summary>
+        /// Construct a CollectionContainsConstraint
+        /// </summary>
+        /// <param name="expected"></param>
+        public CollectionContainsConstraint(object expected)
+            : base(expected)
+        {
+            this.expected = expected;
+            this.DisplayName = "contains";
+        }
+
+        /// <summary>
+        /// Test whether the expected item is contained in the collection
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable actual)
+        {
+            foreach (object obj in actual)
+                if (ItemsEqual(obj, expected))
+                    return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// Write a descripton of the constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("collection containing");
+            writer.WriteExpectedValue(expected);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionEquivalentConstraint.cs b/src/NUnitFramework/framework/Constraints/CollectionEquivalentConstraint.cs
new file mode 100644
index 0000000..7538c75
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionEquivalentConstraint.cs
@@ -0,0 +1,56 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionEquivalentCOnstraint is used to determine whether two
+    /// collections are equivalent.
+    /// </summary>
+    public class CollectionEquivalentConstraint : CollectionItemsEqualConstraint
+    {
+        private readonly IEnumerable expected;
+
+        /// <summary>
+        /// Construct a CollectionEquivalentConstraint
+        /// </summary>
+        /// <param name="expected"></param>
+        public CollectionEquivalentConstraint(IEnumerable expected)
+            : base(expected)
+        {
+            this.expected = expected;
+            this.DisplayName = "equivalent";
+        }
+
+        /// <summary>
+        /// Test whether two collections are equivalent
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable actual)
+        {
+            // This is just an optimization
+            if (expected is ICollection && actual is ICollection)
+                if (((ICollection)actual).Count != ((ICollection)expected).Count)
+                    return false;
+
+            CollectionTally tally = Tally(expected);
+            return tally.TryRemove(actual) && tally.Count == 0;
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("equivalent to");
+            writer.WriteExpectedValue(expected);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionItemsEqualConstraint.cs b/src/NUnitFramework/framework/Constraints/CollectionItemsEqualConstraint.cs
new file mode 100644
index 0000000..3306a10
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionItemsEqualConstraint.cs
@@ -0,0 +1,131 @@
+// ****************************************************************
+// Copyright 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
+{
+    /// <summary>
+    /// CollectionItemsEqualConstraint is the abstract base class for all
+    /// collection constraints that apply some notion of item equality
+    /// as a part of their operation.
+    /// </summary>
+    public abstract class CollectionItemsEqualConstraint : CollectionConstraint
+    {
+        private readonly NUnitEqualityComparer comparer = NUnitEqualityComparer.Default;
+
+        /// <summary>
+        /// Construct an empty CollectionConstraint
+        /// </summary>
+        protected CollectionItemsEqualConstraint() { }
+
+        /// <summary>
+        /// Construct a CollectionConstraint
+        /// </summary>
+        /// <param name="arg"></param>
+        protected CollectionItemsEqualConstraint(object arg) : base(arg) { }
+
+        #region Modifiers
+        /// <summary>
+        /// Flag the constraint to ignore case and return self.
+        /// </summary>
+        public CollectionItemsEqualConstraint IgnoreCase
+        {
+            get
+            {
+                comparer.IgnoreCase = true;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied EqualityAdapter.
+        /// NOTE: For internal use only.
+        /// </summary>
+        /// <param name="adapter">The EqualityAdapter to use.</param>
+        /// <returns>Self.</returns>
+        internal CollectionItemsEqualConstraint Using(EqualityAdapter adapter)
+        {
+            this.comparer.ExternalComparers.Add(adapter);
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using(IComparer comparer)
+        {
+            return Using(EqualityAdapter.For(comparer));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using<T>(IComparer<T> comparer)
+        {
+            return Using(EqualityAdapter.For(comparer));
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied Comparison object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using<T>(Comparison<T> comparer)
+        {
+            return Using(EqualityAdapter.For(comparer));
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using(IEqualityComparer comparer)
+        {
+            return Using(EqualityAdapter.For(comparer));
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public CollectionItemsEqualConstraint Using<T>(IEqualityComparer<T> comparer)
+        {
+            return Using(EqualityAdapter.For(comparer));
+        }
+#endif
+        #endregion
+
+        /// <summary>
+        /// Compares two collection members for equality
+        /// </summary>
+        protected bool ItemsEqual(object x, object y)
+        {
+            Tolerance tolerance = Tolerance.Zero;
+            return comparer.AreEqual(x, y, ref tolerance);
+        }
+
+        /// <summary>
+        /// Return a new CollectionTally for use in making tests
+        /// </summary>
+        /// <param name="c">The collection to be included in the tally</param>
+        protected CollectionTally Tally(IEnumerable c)
+        {
+            return new CollectionTally(comparer, c);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionOrderedConstraint.cs b/src/NUnitFramework/framework/Constraints/CollectionOrderedConstraint.cs
new file mode 100644
index 0000000..90585e2
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionOrderedConstraint.cs
@@ -0,0 +1,168 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Text;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionOrderedConstraint is used to test whether a collection is ordered.
+    /// </summary>
+    public class CollectionOrderedConstraint : CollectionConstraint
+    {
+        private ComparisonAdapter comparer = ComparisonAdapter.Default;
+        private string comparerName;
+        private string propertyName;
+        private bool descending;
+
+        /// <summary>
+        /// Construct a CollectionOrderedConstraint
+        /// </summary>
+        public CollectionOrderedConstraint()
+        {
+            this.DisplayName = "ordered";
+        }
+
+        ///<summary>
+        /// If used performs a reverse comparison
+        ///</summary>
+        public CollectionOrderedConstraint Descending
+        {
+            get
+            {
+                descending = true;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use an IComparer and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint Using(IComparer comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            this.comparerName = comparer.GetType().FullName;
+            return this;
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Modifies the constraint to use an IComparer<T> and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            this.comparerName = comparer.GetType().FullName;
+            return this;
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use a Comparison<T> and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            this.comparerName = comparer.GetType().FullName;
+            return this;
+        }
+#endif
+
+        /// <summary>
+        /// Modifies the constraint to test ordering by the value of
+        /// a specified property and returns self.
+        /// </summary>
+        public CollectionOrderedConstraint By(string propertyName)
+        {
+            this.propertyName = propertyName;
+            return this;
+        }
+
+        /// <summary>
+        /// Test whether the collection is ordered
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable actual)
+        {
+            object previous = null;
+            int index = 0;
+            foreach (object obj in actual)
+            {
+                object objToCompare = obj;
+                if (obj == null)
+                    throw new ArgumentNullException("actual", "Null value at index " + index.ToString());
+
+                if (this.propertyName != null)
+                {
+                    PropertyInfo prop = obj.GetType().GetProperty(propertyName);
+                    objToCompare = prop.GetValue(obj, null);
+                    if (objToCompare == null)
+                        throw new ArgumentNullException("actual", "Null property value at index " + index.ToString());
+                }
+
+                if (previous != null)
+                {
+                    //int comparisonResult = comparer.Compare(al[i], al[i + 1]);
+                    int comparisonResult = comparer.Compare(previous, objToCompare);
+
+                    if (descending && comparisonResult < 0)
+                        return false;
+                    if (!descending && comparisonResult > 0)
+                        return false;
+                }
+
+                previous = objToCompare;
+                index++;
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// Write a description of the constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            if (propertyName == null)
+                writer.Write("collection ordered");
+            else
+            {
+                writer.WritePredicate("collection ordered by");
+                writer.WriteExpectedValue(propertyName);
+            }
+
+            if (descending)
+                writer.WriteModifier("descending");
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns></returns>
+        protected override string GetStringRepresentation()
+        {
+            StringBuilder sb = new StringBuilder("<ordered");
+
+            if (propertyName != null)
+                sb.Append("by " + propertyName);
+            if (descending)
+                sb.Append(" descending");
+            if (comparerName != null)
+                sb.Append(" " + comparerName);
+
+            sb.Append(">");
+
+            return sb.ToString();
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionSubsetConstraint.cs b/src/NUnitFramework/framework/Constraints/CollectionSubsetConstraint.cs
new file mode 100644
index 0000000..fc525e1
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/CollectionSubsetConstraint.cs
@@ -0,0 +1,50 @@
+// ****************************************************************
+// Copyright 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.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionSubsetConstraint is used to determine whether
+    /// one collection is a subset of another
+    /// </summary>
+    public class CollectionSubsetConstraint : CollectionItemsEqualConstraint
+    {
+        private IEnumerable expected;
+
+        /// <summary>
+        /// Construct a CollectionSubsetConstraint
+        /// </summary>
+        /// <param name="expected">The collection that the actual value is expected to be a subset of</param>
+        public CollectionSubsetConstraint(IEnumerable expected) : base(expected)
+        {
+            this.expected = expected;
+            this.DisplayName = "subsetof";
+        }
+
+        /// <summary>
+        /// Test whether the actual collection is a subset of 
+        /// the expected collection provided.
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable actual)
+        {
+            return Tally(expected).TryRemove(actual);
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("subset of");
+            writer.WriteExpectedValue(expected);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/CollectionTally.cs b/src/NUnitFramework/framework/Constraints/CollectionTally.cs
index 0e4f76a..44e3336 100644
--- a/src/NUnitFramework/framework/Constraints/CollectionTally.cs
+++ b/src/NUnitFramework/framework/Constraints/CollectionTally.cs
@@ -1,79 +1,78 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// CollectionTally counts (tallies) the number of
-    /// occurences of each object in one or more enumerations.
-    /// </summary>
-    public class CollectionTally
-    {
-        // Internal list used to track occurences
-        private ArrayList list = new ArrayList();
-
-        private NUnitEqualityComparer comparer;
-
-        /// <summary>
-        /// Construct a CollectionTally object from a comparer and a collection
-        /// </summary>
-        public CollectionTally(NUnitEqualityComparer comparer, IEnumerable c)
-        {
-            this.comparer = comparer;
-
-            foreach (object o in c)
-                list.Add(o);
-        }
-
-        /// <summary>
-        /// The number of objects remaining in the tally
-        /// </summary>
-        public int Count
-        {
-            get { return list.Count; }
-        }
-
-        private bool ItemsEqual(object expected, object actual)
-        {
-            Tolerance tolerance = Tolerance.Zero;
-            return comparer.AreEqual(expected, actual, ref tolerance);
-        }
-
-        /// <summary>
-        /// Try to remove an object from the tally
-        /// </summary>
-        /// <param name="o">The object to remove</param>
-        /// <returns>True if successful, false if the object was not found</returns>
-        public bool TryRemove(object o)
-        {
-            for (int index = 0; index < list.Count; index++)
-                if (ItemsEqual(list[index], o))
-                {
-                    list.RemoveAt(index);
-                    return true;
-                }
-
-            return false;
-        }
-
-        /// <summary>
-        /// Try to remove a set of objects from the tally
-        /// </summary>
-        /// <param name="c">The objects to remove</param>
-        /// <returns>True if successful, false if any object was not found</returns>
-        public bool TryRemove(IEnumerable c)
-        {
-            foreach (object o in c)
-                if (!TryRemove(o))
-                    return false;
-
-            return true;
-        }
-    }
-}
+// ****************************************************************
+// 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.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// CollectionTally counts (tallies) the number of
+    /// occurences of each object in one or more enumerations.
+    /// </summary>
+    public class CollectionTally
+    {
+        // Internal list used to track occurences
+        private ArrayList list = new ArrayList();
+
+        private readonly NUnitEqualityComparer comparer;
+
+        /// <summary>
+        /// Construct a CollectionTally object from a comparer and a collection
+        /// </summary>
+        public CollectionTally(NUnitEqualityComparer comparer, IEnumerable c)
+        {
+            this.comparer = comparer;
+
+            foreach (object o in c)
+                list.Add(o);
+        }
+
+        /// <summary>
+        /// The number of objects remaining in the tally
+        /// </summary>
+        public int Count
+        {
+            get { return list.Count; }
+        }
+
+        private bool ItemsEqual(object expected, object actual)
+        {
+            Tolerance tolerance = Tolerance.Zero;
+            return comparer.AreEqual(expected, actual, ref tolerance);
+        }
+
+        /// <summary>
+        /// Try to remove an object from the tally
+        /// </summary>
+        /// <param name="o">The object to remove</param>
+        /// <returns>True if successful, false if the object was not found</returns>
+        public bool TryRemove(object o)
+        {
+            for (int index = 0; index < list.Count; index++)
+                if (ItemsEqual(list[index], o))
+                {
+                    list.RemoveAt(index);
+                    return true;
+                }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Try to remove a set of objects from the tally
+        /// </summary>
+        /// <param name="c">The objects to remove</param>
+        /// <returns>True if successful, false if any object was not found</returns>
+        public bool TryRemove(IEnumerable c)
+        {
+            foreach (object o in c)
+                if (!TryRemove(o))
+                    return false;
+
+            return true;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs b/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
index 11e2441..9471bf7 100644
--- a/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
+++ b/src/NUnitFramework/framework/Constraints/ComparisonAdapter.cs
@@ -1,156 +1,155 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// ComparisonAdapter class centralizes all comparisons of
-    /// values in NUnit, adapting to the use of any provided
-    /// IComparer, IComparer<T> or Comparison<T>
-    /// </summary>
-    public abstract class ComparisonAdapter
-    {
-        /// <summary>
-        /// Gets the default ComparisonAdapter, which wraps an
-        /// NUnitComparer object.
-        /// </summary>
-        public static ComparisonAdapter Default
-        {
-            get { return new DefaultComparisonAdapter(); }
-        }
-
-        /// <summary>
-        /// Returns a ComparisonAdapter that wraps an IComparer
-        /// </summary>
-        public static ComparisonAdapter For(IComparer comparer)
-        {
-            return new ComparerAdapter(comparer);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Returns a ComparisonAdapter that wraps an IComparer<T>
-        /// </summary>
-        public static ComparisonAdapter For<T>(IComparer<T> comparer)
-        {
-            return new ComparerAdapter<T>(comparer);
-        }
-
-        /// <summary>
-        /// Returns a ComparisonAdapter that wraps a Comparison<T>
-        /// </summary>
-        public static ComparisonAdapter For<T>(Comparison<T> comparer)
-        {
-            return new ComparisonAdapterForComparison<T>(comparer);
-        }
-#endif
-
-        /// <summary>
-        /// Compares two objects
-        /// </summary>
-        public abstract int Compare(object expected, object actual);
-
-        class DefaultComparisonAdapter : ComparerAdapter
-        {
-            /// <summary>
-            /// Construct a default ComparisonAdapter
-            /// </summary>
-            public DefaultComparisonAdapter() : base( NUnitComparer.Default ) { }
-        }
-
-        class ComparerAdapter : ComparisonAdapter
-        {
-            private IComparer comparer;
-
-            /// <summary>
-            /// Construct a ComparisonAdapter for an IComparer
-            /// </summary>
-            public ComparerAdapter(IComparer comparer)
-            {
-                this.comparer = comparer;
-            }
-
-            /// <summary>
-            /// Compares two objects
-            /// </summary>
-            /// <param name="expected"></param>
-            /// <param name="actual"></param>
-            /// <returns></returns>
-            public override int Compare(object expected, object actual)
-            {
-                return comparer.Compare(expected, actual);
-            }
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// ComparisonAdapter<T> extends ComparisonAdapter and
-        /// allows use of an IComparer<T> or Comparison<T>
-        /// to actually perform the comparison.
-        /// </summary>
-        class ComparerAdapter<T> : ComparisonAdapter
-        {
-            private IComparer<T> comparer;
-
-            /// <summary>
-            /// Construct a ComparisonAdapter for an IComparer<T>
-            /// </summary>
-            public ComparerAdapter(IComparer<T> comparer)
-            {
-                this.comparer = comparer;
-            }
-
-            /// <summary>
-            /// Compare a Type T to an object
-            /// </summary>
-            public override int Compare(object expected, object actual)
-            {
-                if (!typeof(T).IsAssignableFrom(expected.GetType()))
-                    throw new ArgumentException("Cannot compare " + expected.ToString());
-
-                if (!typeof(T).IsAssignableFrom(actual.GetType()))
-                    throw new ArgumentException("Cannot compare to " + actual.ToString());
-
-                return comparer.Compare((T)expected, (T)actual);
-            }
-        }
-
-        class ComparisonAdapterForComparison<T> : ComparisonAdapter
-        {
-            private Comparison<T> comparison;
-
-            /// <summary>
-            /// Construct a ComparisonAdapter for a Comparison<T>
-            /// </summary>
-            public ComparisonAdapterForComparison(Comparison<T> comparer)
-            {
-                this.comparison = comparer;
-            }
-
-            /// <summary>
-            /// Compare a Type T to an object
-            /// </summary>
-            public override int Compare(object expected, object actual)
-            {
-                if (!typeof(T).IsAssignableFrom(expected.GetType()))
-                    throw new ArgumentException("Cannot compare " + expected.ToString());
-
-                if (!typeof(T).IsAssignableFrom(actual.GetType()))
-                    throw new ArgumentException("Cannot compare to " + actual.ToString());
-
-                return comparison.Invoke((T)expected, (T)actual);
-            }
-        }
-#endif
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ComparisonAdapter class centralizes all comparisons of
+    /// values in NUnit, adapting to the use of any provided
+    /// IComparer, IComparer<T> or Comparison<T>
+    /// </summary>
+    public abstract class ComparisonAdapter
+    {
+        /// <summary>
+        /// Gets the default ComparisonAdapter, which wraps an
+        /// NUnitComparer object.
+        /// </summary>
+        public static ComparisonAdapter Default
+        {
+            get { return new DefaultComparisonAdapter(); }
+        }
+
+        /// <summary>
+        /// Returns a ComparisonAdapter that wraps an IComparer
+        /// </summary>
+        public static ComparisonAdapter For(IComparer comparer)
+        {
+            return new ComparerAdapter(comparer);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a ComparisonAdapter that wraps an IComparer<T>
+        /// </summary>
+        public static ComparisonAdapter For<T>(IComparer<T> comparer)
+        {
+            return new ComparerAdapter<T>(comparer);
+        }
+
+        /// <summary>
+        /// Returns a ComparisonAdapter that wraps a Comparison<T>
+        /// </summary>
+        public static ComparisonAdapter For<T>(Comparison<T> comparer)
+        {
+            return new ComparisonAdapterForComparison<T>(comparer);
+        }
+#endif
+
+        /// <summary>
+        /// Compares two objects
+        /// </summary>
+        public abstract int Compare(object expected, object actual);
+
+        class DefaultComparisonAdapter : ComparerAdapter
+        {
+            /// <summary>
+            /// Construct a default ComparisonAdapter
+            /// </summary>
+            public DefaultComparisonAdapter() : base( NUnitComparer.Default ) { }
+        }
+
+        class ComparerAdapter : ComparisonAdapter
+        {
+            private readonly IComparer comparer;
+
+            /// <summary>
+            /// Construct a ComparisonAdapter for an IComparer
+            /// </summary>
+            public ComparerAdapter(IComparer comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            /// <summary>
+            /// Compares two objects
+            /// </summary>
+            /// <param name="expected"></param>
+            /// <param name="actual"></param>
+            /// <returns></returns>
+            public override int Compare(object expected, object actual)
+            {
+                return comparer.Compare(expected, actual);
+            }
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// ComparisonAdapter<T> extends ComparisonAdapter and
+        /// allows use of an IComparer<T> or Comparison<T>
+        /// to actually perform the comparison.
+        /// </summary>
+        class ComparerAdapter<T> : ComparisonAdapter
+        {
+            private readonly IComparer<T> comparer;
+
+            /// <summary>
+            /// Construct a ComparisonAdapter for an IComparer<T>
+            /// </summary>
+            public ComparerAdapter(IComparer<T> comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            /// <summary>
+            /// Compare a Type T to an object
+            /// </summary>
+            public override int Compare(object expected, object actual)
+            {
+                if (!typeof(T).IsAssignableFrom(expected.GetType()))
+                    throw new ArgumentException("Cannot compare " + expected.ToString());
+
+                if (!typeof(T).IsAssignableFrom(actual.GetType()))
+                    throw new ArgumentException("Cannot compare to " + actual.ToString());
+
+                return comparer.Compare((T)expected, (T)actual);
+            }
+        }
+
+        class ComparisonAdapterForComparison<T> : ComparisonAdapter
+        {
+            private readonly Comparison<T> comparison;
+
+            /// <summary>
+            /// Construct a ComparisonAdapter for a Comparison<T>
+            /// </summary>
+            public ComparisonAdapterForComparison(Comparison<T> comparer)
+            {
+                this.comparison = comparer;
+            }
+
+            /// <summary>
+            /// Compare a Type T to an object
+            /// </summary>
+            public override int Compare(object expected, object actual)
+            {
+                if (!typeof(T).IsAssignableFrom(expected.GetType()))
+                    throw new ArgumentException("Cannot compare " + expected.ToString());
+
+                if (!typeof(T).IsAssignableFrom(actual.GetType()))
+                    throw new ArgumentException("Cannot compare to " + actual.ToString());
+
+                return comparison.Invoke((T)expected, (T)actual);
+            }
+        }
+#endif
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonConstraint.cs b/src/NUnitFramework/framework/Constraints/ComparisonConstraint.cs
new file mode 100644
index 0000000..11804db
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ComparisonConstraint.cs
@@ -0,0 +1,66 @@
+// ****************************************************************
+// 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 CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+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. This class supplies the Using modifiers.
+    /// </summary>
+    public abstract class ComparisonConstraint : Constraint
+    {
+        /// <summary>
+        /// ComparisonAdapter to be used in making the comparison
+        /// </summary>
+        protected ComparisonAdapter comparer = ComparisonAdapter.Default;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
+        /// </summary>
+        public ComparisonConstraint(object arg) : base(arg) { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
+        /// </summary>
+        public ComparisonConstraint(object arg1, object arg2) : base(arg1, arg2) { }
+
+        /// <summary>
+        /// Modifies the constraint to use an IComparer and returns self
+        /// </summary>
+        public ComparisonConstraint Using(IComparer comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Modifies the constraint to use an IComparer<T> and returns self
+        /// </summary>
+        public ComparisonConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+
+        /// <summary>
+        /// Modifies the constraint to use a Comparison<T> and returns self
+        /// </summary>
+        public ComparisonConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer = ComparisonAdapter.For(comparer);
+            return this;
+        }
+#endif
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs b/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
deleted file mode 100644
index 8f349c7..0000000
--- a/src/NUnitFramework/framework/Constraints/ComparisonConstraints.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-// ****************************************************************
-// 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 CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-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. This class supplies the Using modifiers.
-    /// </summary>
-    public abstract class ComparisonConstraint : Constraint
-    {
-        /// <summary>
-        /// ComparisonAdapter to be used in making the comparison
-        /// </summary>
-        protected ComparisonAdapter comparer = ComparisonAdapter.Default;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
-        /// </summary>
-        public ComparisonConstraint(object arg) : base(arg) { }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
-        /// </summary>
-        public ComparisonConstraint(object arg1, object arg2) : base(arg1, arg2) { }
-
-        /// <summary>
-        /// Modifies the constraint to use an IComparer and returns self
-        /// </summary>
-        public ComparisonConstraint Using(IComparer comparer)
-        {
-            this.comparer = ComparisonAdapter.For(comparer);
-            return this;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Modifies the constraint to use an IComparer<T> and returns self
-        /// </summary>
-        public ComparisonConstraint Using<T>(IComparer<T> comparer)
-        {
-            this.comparer = ComparisonAdapter.For(comparer);
-            return this;
-        }
-
-        /// <summary>
-        /// Modifies the constraint to use a Comparison<T> and returns self
-        /// </summary>
-        public ComparisonConstraint Using<T>(Comparison<T> comparer)
-        {
-            this.comparer = ComparisonAdapter.For(comparer);
-            return this;
-        }
-#endif
-    }
-}
diff --git a/src/NUnitFramework/framework/Constraints/Constraint.cs b/src/NUnitFramework/framework/Constraints/Constraint.cs
index 738b47e..bcf94ed 100644
--- a/src/NUnitFramework/framework/Constraints/Constraint.cs
+++ b/src/NUnitFramework/framework/Constraints/Constraint.cs
@@ -1,379 +1,392 @@
-// ****************************************************************
-// Copyright 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.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// Delegate used to delay evaluation of the actual value
-    /// to be used in evaluating a constraint
-    /// </summary>
-    public delegate object ActualValueDelegate();
-    
-    /// <summary>
-    /// The Constraint class is the base of all built-in constraints
-    /// within NUnit. It provides the operator overloads used to combine 
-    /// constraints.
-    /// </summary>
-    public abstract class Constraint : IResolveConstraint
-    {
-        #region UnsetObject Class
-        /// <summary>
-        /// Class used to detect any derived constraints
-        /// that fail to set the actual value in their
-        /// Matches override.
-        /// </summary>
-        private class UnsetObject
-        {
-            public override string ToString()
-            {
-                return "UNSET";
-            }
-        }
-        #endregion
-
-		#region Static and Instance Fields
-        /// <summary>
-        /// Static UnsetObject used to detect derived constraints
-        /// failing to set the actual value.
-        /// </summary>
-        protected static object UNSET = new UnsetObject();
-
-		/// <summary>
-        /// The actual value being tested against a constraint
-        /// </summary>
-        protected object actual = UNSET;
-
-        /// <summary>
-        /// The display name of this Constraint for use by ToString()
-        /// </summary>
-        private string displayName;
-
-        /// <summary>
-        /// Argument fields used by ToString();
-        /// </summary>
-        private readonly int argcnt;
-        private readonly object arg1;
-        private readonly object arg2;
-
-        /// <summary>
-        /// The builder holding this constraint
-        /// </summary>
-        private ConstraintBuilder builder;
-        #endregion
-
-        #region Constructors
-        /// <summary>
-        /// Construct a constraint with no arguments
-        /// </summary>
-        public Constraint()
-        {
-            argcnt = 0;
-        }
-
-        /// <summary>
-        /// Construct a constraint with one argument
-        /// </summary>
-        public Constraint(object arg)
-        {
-            argcnt = 1;
-            this.arg1 = arg;
-        }
-
-        /// <summary>
-        /// Construct a constraint with two arguments
-        /// </summary>
-        public Constraint(object arg1, object arg2)
-        {
-            argcnt = 2;
-            this.arg1 = arg1;
-            this.arg2 = arg2;
-        }
-        #endregion
-
-        #region Set Containing ConstraintBuilder
-        /// <summary>
-        /// Sets the ConstraintBuilder holding this constraint
-        /// </summary>
-        internal void SetBuilder(ConstraintBuilder builder)
-        {
-            this.builder = builder;
-        }
-        #endregion
-
-        #region Properties
-        /// <summary>
-        /// The display name of this Constraint for use by ToString().
-        /// The default value is the name of the constraint with
-        /// trailing "Constraint" removed. Derived classes may set
-        /// this to another name in their constructors.
-        /// </summary>
-        public string DisplayName
-        {
-            get
-            {
-                if (displayName == null)
-                {
-                    displayName = this.GetType().Name.ToLower();
-                    if (displayName.EndsWith("`1") || displayName.EndsWith("`2"))
-                        displayName = displayName.Substring(0, displayName.Length - 2);
-                    if (displayName.EndsWith("constraint"))
-                        displayName = displayName.Substring(0, displayName.Length - 10);
-                }
-
-                return displayName;
-            }
-
-            set { displayName = value; }
-        }
-		#endregion
-
-		#region Abstract and Virtual Methods
-        /// <summary>
-        /// Write the failure message to the MessageWriter provided
-        /// as an argument. The default implementation simply passes
-        /// the constraint and the actual value to the writer, which
-        /// then displays the constraint description and the value.
-        /// 
-        /// Constraints that need to provide additional details,
-        /// such as where the error occured can override this.
-        /// </summary>
-        /// <param name="writer">The MessageWriter on which to display the message</param>
-        public virtual void WriteMessageTo(MessageWriter writer)
-        {
-            writer.DisplayDifferences(this);
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public abstract bool Matches(object actual);
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by an
-        /// ActualValueDelegate that returns the value to be tested.
-        /// The default implementation simply evaluates the delegate
-        /// but derived classes may override it to provide for delayed 
-        /// processing.
-        /// </summary>
-        /// <param name="del">An ActualValueDelegate</param>
-        /// <returns>True for success, false for failure</returns>
-        public virtual bool Matches(ActualValueDelegate del)
-        {
-            return Matches(del());
-        }
-
-#if 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
-        /// derived classes may override it to provide for delayed processing.
-        /// </summary>
-        /// <param name="actual">A reference to the value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public virtual bool Matches<T>(ref T actual)
-        {
-            return Matches(actual);
-        }
-#else
-		/// <summary>
-		/// Test whether the constraint is satisfied by a given bool reference.
-		/// The default implementation simply dereferences the value but
-		/// derived classes may override it to provide for delayed processing.
-		/// </summary>
-		/// <param name="actual">A reference to the value to be tested</param>
-		/// <returns>True for success, false for failure</returns>
-		public virtual bool Matches(ref bool actual)
-		{
-			return Matches(actual);
-		}
-#endif
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public abstract void WriteDescriptionTo(MessageWriter writer);
-
-        /// <summary>
-		/// Write the actual value for a failing constraint test to a
-		/// MessageWriter. The default implementation simply writes
-		/// the raw value of actual, leaving it to the writer to
-		/// perform any formatting.
-		/// </summary>
-		/// <param name="writer">The writer on which the actual value is displayed</param>
-		public virtual void WriteActualValueTo(MessageWriter writer)
-		{
-			writer.WriteActualValue( actual );
-		}
-		#endregion
-
-        #region ToString Override
-        /// <summary>
-        /// Default override of ToString returns the constraint DisplayName
-        /// followed by any arguments within angle brackets.
-        /// </summary>
-        /// <returns></returns>
-        public override string ToString()
-        {
-            string rep = GetStringRepresentation();
-
-            return this.builder == null ? rep : string.Format("<unresolved {0}>", rep);
-        }
-
-        /// <summary>
-        /// Returns the string representation of this constraint
-        /// </summary>
-        protected virtual string GetStringRepresentation()
-        {
-            switch (argcnt)
-            {
-                default:
-                case 0:
-                    return string.Format("<{0}>", DisplayName);
-                case 1:
-                    return string.Format("<{0} {1}>", DisplayName, _displayable(arg1));
-                case 2:
-                    return string.Format("<{0} {1} {2}>", DisplayName, _displayable(arg1), _displayable(arg2));
-            }
-        }
-
-        private string _displayable(object o)
-        {
-            if (o == null) return "null";
-
-            string fmt = o is string ? "\"{0}\"" : "{0}";
-            return string.Format(System.Globalization.CultureInfo.InvariantCulture, fmt, o);
-        }
-        #endregion
-
-        #region Operator Overloads
-        /// <summary>
-        /// This operator creates a constraint that is satisfied only if both 
-        /// argument constraints are satisfied.
-        /// </summary>
-        public static Constraint operator &(Constraint left, Constraint right)
-        {
-            IResolveConstraint l = (IResolveConstraint)left;
-            IResolveConstraint r = (IResolveConstraint)right;
-            return new AndConstraint(l.Resolve(), r.Resolve());
-        }
-
-        /// <summary>
-        /// This operator creates a constraint that is satisfied if either 
-        /// of the argument constraints is satisfied.
-        /// </summary>
-        public static Constraint operator |(Constraint left, Constraint right)
-        {
-            IResolveConstraint l = (IResolveConstraint)left;
-            IResolveConstraint r = (IResolveConstraint)right;
-            return new OrConstraint(l.Resolve(), r.Resolve());
-        }
-
-        /// <summary>
-        /// This operator creates a constraint that is satisfied if the 
-        /// argument constraint is not satisfied.
-        /// </summary>
-        public static Constraint operator !(Constraint constraint)
-        {
-            IResolveConstraint r = constraint as IResolveConstraint;
-            return new NotConstraint(r == null ? new NullConstraint() : r.Resolve());
-        }
-        #endregion
-
-        #region Binary Operators
-        /// <summary>
-        /// Returns a ConstraintExpression by appending And
-        /// to the current constraint.
-        /// </summary>
-        public ConstraintExpression And
-        {
-            get
-            {
-                ConstraintBuilder builder = this.builder;
-                if (builder == null)
-                {
-                    builder = new ConstraintBuilder();
-                    builder.Append(this);
-                }
-
-                builder.Append(new AndOperator());
-
-                return new ConstraintExpression(builder);
-            }
-        }
-
-        /// <summary>
-        /// Returns a ConstraintExpression by appending And
-        /// to the current constraint.
-        /// </summary>
-        public ConstraintExpression With
-        {
-            get { return this.And; }
-        }
-
-        /// <summary>
-        /// Returns a ConstraintExpression by appending Or
-        /// to the current constraint.
-        /// </summary>
-        public ConstraintExpression Or
-        {
-            get
-            {
-                ConstraintBuilder builder = this.builder;
-                if (builder == null)
-                {
-                    builder = new ConstraintBuilder();
-                    builder.Append(this);
-                }
-
-                builder.Append(new OrOperator());
-
-                return new ConstraintExpression(builder);
-            }
-        }
-        #endregion
-
-        #region After Modifier
-        /// <summary>
-        /// Returns a DelayedConstraint with the specified delay time.
-        /// </summary>
-        /// <param name="delayInMilliseconds">The delay in milliseconds.</param>
-        /// <returns></returns>
-        public DelayedConstraint After(int delayInMilliseconds)
-        {
-            return new DelayedConstraint(
-                builder == null ? this : builder.Resolve(),
-                delayInMilliseconds);
-        }
-
-        /// <summary>
-        /// Returns a DelayedConstraint with the specified delay time
-        /// and polling interval.
-        /// </summary>
-        /// <param name="delayInMilliseconds">The delay in milliseconds.</param>
-        /// <param name="pollingInterval">The interval at which to test the constraint.</param>
-        /// <returns></returns>
-        public DelayedConstraint After(int delayInMilliseconds, int pollingInterval)
-        {
-            return new DelayedConstraint(
-                builder == null ? this : builder.Resolve(),
-                delayInMilliseconds,
-                pollingInterval);
-        }
-        #endregion
-
-        #region IResolveConstraint Members
-        Constraint IResolveConstraint.Resolve()
-        {
-            return builder == null ? this : builder.Resolve();
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+
+    /// <summary>
+    /// Delegate used to delay evaluation of the actual value
+    /// to be used in evaluating a constraint
+    /// </summary>
+#if CLR_2_0 || CLR_4_0
+    public delegate T ActualValueDelegate<T>();
+#else
+	public delegate object ActualValueDelegate();
+#endif
+	
+	/// <summary>
+    /// The Constraint class is the base of all built-in constraints
+    /// within NUnit. It provides the operator overloads used to combine 
+    /// constraints.
+    /// </summary>
+    public abstract class Constraint : IResolveConstraint
+    {
+        #region UnsetObject Class
+        /// <summary>
+        /// Class used to detect any derived constraints
+        /// that fail to set the actual value in their
+        /// Matches override.
+        /// </summary>
+        private class UnsetObject
+        {
+            public override string ToString()
+            {
+                return "UNSET";
+            }
+        }
+        #endregion
+
+		#region Static and Instance Fields
+        /// <summary>
+        /// Static UnsetObject used to detect derived constraints
+        /// failing to set the actual value.
+        /// </summary>
+        protected static object UNSET = new UnsetObject();
+
+		/// <summary>
+        /// The actual value being tested against a constraint
+        /// </summary>
+        protected object actual = UNSET;
+
+        /// <summary>
+        /// The display name of this Constraint for use by ToString()
+        /// </summary>
+        private string displayName;
+
+        /// <summary>
+        /// Argument fields used by ToString();
+        /// </summary>
+        private readonly int argcnt;
+        private readonly object arg1;
+        private readonly object arg2;
+
+        /// <summary>
+        /// The builder holding this constraint
+        /// </summary>
+        private ConstraintBuilder builder;
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Construct a constraint with no arguments
+        /// </summary>
+        protected Constraint()
+        {
+            argcnt = 0;
+        }
+
+        /// <summary>
+        /// Construct a constraint with one argument
+        /// </summary>
+        protected Constraint(object arg)
+        {
+            argcnt = 1;
+            this.arg1 = arg;
+        }
+
+        /// <summary>
+        /// Construct a constraint with two arguments
+        /// </summary>
+        protected Constraint(object arg1, object arg2)
+        {
+            argcnt = 2;
+            this.arg1 = arg1;
+            this.arg2 = arg2;
+        }
+        #endregion
+
+        #region Set Containing ConstraintBuilder
+        /// <summary>
+        /// Sets the ConstraintBuilder holding this constraint
+        /// </summary>
+        internal void SetBuilder(ConstraintBuilder builder)
+        {
+            this.builder = builder;
+        }
+        #endregion
+
+        #region Properties
+        /// <summary>
+        /// The display name of this Constraint for use by ToString().
+        /// The default value is the name of the constraint with
+        /// trailing "Constraint" removed. Derived classes may set
+        /// this to another name in their constructors.
+        /// </summary>
+        protected string DisplayName
+        {
+            get
+            {
+                if (displayName == null)
+                {
+                    displayName = this.GetType().Name.ToLower();
+                    if (displayName.EndsWith("`1") || displayName.EndsWith("`2"))
+                        displayName = displayName.Substring(0, displayName.Length - 2);
+                    if (displayName.EndsWith("constraint"))
+                        displayName = displayName.Substring(0, displayName.Length - 10);
+                }
+
+                return displayName;
+            }
+
+            set { displayName = value; }
+        }
+		#endregion
+
+		#region Abstract and Virtual Methods
+        /// <summary>
+        /// Write the failure message to the MessageWriter provided
+        /// as an argument. The default implementation simply passes
+        /// the constraint and the actual value to the writer, which
+        /// then displays the constraint description and the value.
+        /// 
+        /// Constraints that need to provide additional details,
+        /// such as where the error occured can override this.
+        /// </summary>
+        /// <param name="writer">The MessageWriter on which to display the message</param>
+        public virtual void WriteMessageTo(MessageWriter writer)
+        {
+            writer.DisplayDifferences(this);
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public abstract bool Matches(object actual);
+
+#if CLR_2_0 || CLR_4_0
+		/// <summary>
+        /// Test whether the constraint is satisfied by an
+        /// ActualValueDelegate that returns the value to be tested.
+        /// The default implementation simply evaluates the delegate
+        /// but derived classes may override it to provide for delayed 
+        /// processing.
+        /// </summary>
+        /// <param name="del">An <see cref="ActualValueDelegate{T}"/></param>
+        /// <returns>True for success, false for failure</returns>
+        public virtual bool Matches<T>(ActualValueDelegate<T> del)
+		{
+			if(AsyncInvocationRegion.IsAsyncOperation(del))
+				using (var region = AsyncInvocationRegion.Create(del))
+					return Matches(region.WaitForPendingOperationsToComplete(del()));
+
+			return Matches(del());
+		}
+#else
+        /// <summary>
+        /// Test whether the constraint is satisfied by an
+        /// ActualValueDelegate that returns the value to be tested.
+        /// The default implementation simply evaluates the delegate
+        /// but derived classes may override it to provide for delayed 
+        /// processing.
+        /// </summary>
+        /// <param name="del">An <see cref="ActualValueDelegate" /></param>
+        /// <returns>True for success, false for failure</returns>
+        public virtual bool Matches(ActualValueDelegate del)
+        {
+            return Matches(del());
+        }
+#endif
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given reference.
+        /// The default implementation simply dereferences the value but
+        /// derived classes may override it to provide for delayed processing.
+        /// </summary>
+        /// <param name="actual">A reference to the value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+#if CLR_2_0 || CLR_4_0
+        public virtual bool Matches<T>(ref T actual)
+#else
+		public virtual bool Matches(ref bool actual)
+#endif
+        {
+            return Matches(actual);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public abstract void WriteDescriptionTo(MessageWriter writer);
+
+        /// <summary>
+		/// Write the actual value for a failing constraint test to a
+		/// MessageWriter. The default implementation simply writes
+		/// the raw value of actual, leaving it to the writer to
+		/// perform any formatting.
+		/// </summary>
+		/// <param name="writer">The writer on which the actual value is displayed</param>
+		public virtual void WriteActualValueTo(MessageWriter writer)
+		{
+			writer.WriteActualValue( actual );
+		}
+		#endregion
+
+        #region ToString Override
+        /// <summary>
+        /// Default override of ToString returns the constraint DisplayName
+        /// followed by any arguments within angle brackets.
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            string rep = GetStringRepresentation();
+
+            return this.builder == null ? rep : string.Format("<unresolved {0}>", rep);
+        }
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected virtual string GetStringRepresentation()
+        {
+            switch (argcnt)
+            {
+                default:
+                case 0:
+                    return string.Format("<{0}>", DisplayName);
+                case 1:
+                    return string.Format("<{0} {1}>", DisplayName, _displayable(arg1));
+                case 2:
+                    return string.Format("<{0} {1} {2}>", DisplayName, _displayable(arg1), _displayable(arg2));
+            }
+        }
+
+        private static string _displayable(object o)
+        {
+            if (o == null) return "null";
+
+            string fmt = o is string ? "\"{0}\"" : "{0}";
+            return string.Format(System.Globalization.CultureInfo.InvariantCulture, fmt, o);
+        }
+        #endregion
+
+        #region Operator Overloads
+        /// <summary>
+        /// This operator creates a constraint that is satisfied only if both 
+        /// argument constraints are satisfied.
+        /// </summary>
+        public static Constraint operator &(Constraint left, Constraint right)
+        {
+            IResolveConstraint l = (IResolveConstraint)left;
+            IResolveConstraint r = (IResolveConstraint)right;
+            return new AndConstraint(l.Resolve(), r.Resolve());
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied if either 
+        /// of the argument constraints is satisfied.
+        /// </summary>
+        public static Constraint operator |(Constraint left, Constraint right)
+        {
+            IResolveConstraint l = (IResolveConstraint)left;
+            IResolveConstraint r = (IResolveConstraint)right;
+            return new OrConstraint(l.Resolve(), r.Resolve());
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied if the 
+        /// argument constraint is not satisfied.
+        /// </summary>
+        public static Constraint operator !(Constraint constraint)
+        {
+            IResolveConstraint r = constraint as IResolveConstraint;
+            return new NotConstraint(r == null ? new NullConstraint() : r.Resolve());
+        }
+        #endregion
+
+        #region Binary Operators
+        /// <summary>
+        /// Returns a ConstraintExpression by appending And
+        /// to the current constraint.
+        /// </summary>
+        public ConstraintExpression And
+        {
+            get
+            {
+                ConstraintBuilder builder = this.builder;
+                if (builder == null)
+                {
+                    builder = new ConstraintBuilder();
+                    builder.Append(this);
+                }
+
+                builder.Append(new AndOperator());
+
+                return new ConstraintExpression(builder);
+            }
+        }
+
+        /// <summary>
+        /// Returns a ConstraintExpression by appending And
+        /// to the current constraint.
+        /// </summary>
+        public ConstraintExpression With
+        {
+            get { return this.And; }
+        }
+
+        /// <summary>
+        /// Returns a ConstraintExpression by appending Or
+        /// to the current constraint.
+        /// </summary>
+        public ConstraintExpression Or
+        {
+            get
+            {
+                ConstraintBuilder builder = this.builder;
+                if (builder == null)
+                {
+                    builder = new ConstraintBuilder();
+                    builder.Append(this);
+                }
+
+                builder.Append(new OrOperator());
+
+                return new ConstraintExpression(builder);
+            }
+        }
+        #endregion
+
+        #region After Modifier
+        /// <summary>
+        /// Returns a DelayedConstraint with the specified delay time.
+        /// </summary>
+        /// <param name="delayInMilliseconds">The delay in milliseconds.</param>
+        /// <returns></returns>
+        public DelayedConstraint After(int delayInMilliseconds)
+        {
+            return new DelayedConstraint(
+                builder == null ? this : builder.Resolve(),
+                delayInMilliseconds);
+        }
+
+        /// <summary>
+        /// Returns a DelayedConstraint with the specified delay time
+        /// and polling interval.
+        /// </summary>
+        /// <param name="delayInMilliseconds">The delay in milliseconds.</param>
+        /// <param name="pollingInterval">The interval at which to test the constraint.</param>
+        /// <returns></returns>
+        public DelayedConstraint After(int delayInMilliseconds, int pollingInterval)
+        {
+            return new DelayedConstraint(
+                builder == null ? this : builder.Resolve(),
+                delayInMilliseconds,
+                pollingInterval);
+        }
+        #endregion
+
+        #region IResolveConstraint Members
+        Constraint IResolveConstraint.Resolve()
+        {
+            return builder == null ? this : builder.Resolve();
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs b/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
index 2ba49d8..f5b0c6b 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintBuilder.cs
@@ -1,269 +1,269 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// ConstraintBuilder maintains the stacks that are used in
-    /// processing a ConstraintExpression. An OperatorStack
-    /// is used to hold operators that are waiting for their
-    /// operands to be reognized. a ConstraintStack holds 
-    /// input constraints as well as the results of each
-    /// operator applied.
-    /// </summary>
-    public class ConstraintBuilder
-    {
-        #region Nested Operator Stack Class
-        /// <summary>
-        /// OperatorStack is a type-safe stack for holding ConstraintOperators
-        /// </summary>
-        public class OperatorStack
-        {
-#if CLR_2_0 || CLR_4_0
-            private Stack<ConstraintOperator> stack = new Stack<ConstraintOperator>();
-#else
-		    private Stack stack = new Stack();
-#endif
-            /// <summary>
-            /// Initializes a new instance of the <see cref="T:OperatorStack"/> class.
-            /// </summary>
-            /// <param name="builder">The builder.</param>
-            public OperatorStack(ConstraintBuilder builder)
-            {
-            }
-
-            /// <summary>
-            /// Gets a value indicating whether this <see cref="T:OpStack"/> is empty.
-            /// </summary>
-            /// <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
-            public bool Empty
-            {
-                get { return stack.Count == 0; }
-            }
-
-            /// <summary>
-            /// Gets the topmost operator without modifying the stack.
-            /// </summary>
-            /// <value>The top.</value>
-            public ConstraintOperator Top
-            {
-                get { return (ConstraintOperator)stack.Peek(); }
-            }
-
-            /// <summary>
-            /// Pushes the specified operator onto the stack.
-            /// </summary>
-            /// <param name="op">The op.</param>
-            public void Push(ConstraintOperator op)
-            {
-                stack.Push(op);
-            }
-
-            /// <summary>
-            /// Pops the topmost operator from the stack.
-            /// </summary>
-            /// <returns></returns>
-            public ConstraintOperator Pop()
-            {
-                return (ConstraintOperator)stack.Pop();
-            }
-        }
-        #endregion
-
-        #region Nested Constraint Stack Class
-        /// <summary>
-        /// ConstraintStack is a type-safe stack for holding Constraints
-        /// </summary>
-        public class ConstraintStack
-        {
-#if CLR_2_0 || CLR_4_0
-            private Stack<Constraint> stack = new Stack<Constraint>();
-#else
-		    private Stack stack = new Stack();
-#endif
-            private ConstraintBuilder builder;
-
-            /// <summary>
-            /// Initializes a new instance of the <see cref="T:ConstraintStack"/> class.
-            /// </summary>
-            /// <param name="builder">The builder.</param>
-            public ConstraintStack(ConstraintBuilder builder)
-            {
-                this.builder = builder;
-            }
-
-            /// <summary>
-            /// Gets a value indicating whether this <see cref="T:ConstraintStack"/> is empty.
-            /// </summary>
-            /// <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
-            public bool Empty
-            {
-                get { return stack.Count == 0; }
-            }
-
-            /// <summary>
-            /// Gets the topmost constraint without modifying the stack.
-            /// </summary>
-            /// <value>The topmost constraint</value>
-            public Constraint Top
-            {
-                get { return (Constraint)stack.Peek(); }
-            }
-
-            /// <summary>
-            /// Pushes the specified constraint. As a side effect,
-            /// the constraint's builder field is set to the 
-            /// ConstraintBuilder owning this stack.
-            /// </summary>
-            /// <param name="constraint">The constraint.</param>
-            public void Push(Constraint constraint)
-            {
-                stack.Push(constraint);
-                constraint.SetBuilder( this.builder );
-            }
-
-            /// <summary>
-            /// Pops this topmost constrait from the stack.
-            /// As a side effect, the constraint's builder
-            /// field is set to null.
-            /// </summary>
-            /// <returns></returns>
-            public Constraint Pop()
-            {
-                Constraint constraint = (Constraint)stack.Pop();
-                constraint.SetBuilder( null );
-                return constraint;
-            }
-        }
-        #endregion
-
-        #region Instance Fields
-        private OperatorStack ops;
-
-        private ConstraintStack constraints;
-
-        private object lastPushed;
-        #endregion
-
-        #region Constructor
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ConstraintBuilder"/> class.
-        /// </summary>
-        public ConstraintBuilder()
-        {
-            this.ops = new OperatorStack(this);
-            this.constraints = new ConstraintStack(this);
-        }
-        #endregion
-
-        #region Properties
-        /// <summary>
-        /// Gets a value indicating whether this instance is resolvable.
-        /// </summary>
-        /// <value>
-        /// 	<c>true</c> if this instance is resolvable; otherwise, <c>false</c>.
-        /// </value>
-        public bool IsResolvable
-        {
-            get { return lastPushed is Constraint || lastPushed is SelfResolvingOperator; }
-        }
-        #endregion
-
-        #region Public Methods
-        /// <summary>
-        /// Appends the specified operator to the expression by first
-        /// reducing the operator stack and then pushing the new
-        /// operator on the stack.
-        /// </summary>
-        /// <param name="op">The operator to push.</param>
-        public void Append(ConstraintOperator op)
-        {
-            op.LeftContext = lastPushed;
-            if (lastPushed is ConstraintOperator)
-                SetTopOperatorRightContext(op);
-
-            // Reduce any lower precedence operators
-            ReduceOperatorStack(op.LeftPrecedence);
-            
-            ops.Push(op);
-            lastPushed = op;
-        }
-
-        /// <summary>
-        /// Appends the specified constraint to the expresson by pushing
-        /// it on the constraint stack.
-        /// </summary>
-        /// <param name="constraint">The constraint to push.</param>
-        public void Append(Constraint constraint)
-        {
-            if (lastPushed is ConstraintOperator)
-                SetTopOperatorRightContext(constraint);
-
-            constraints.Push(constraint);
-            lastPushed = constraint;
-            constraint.SetBuilder( this );
-        }
-
-        /// <summary>
-        /// Sets the top operator right context.
-        /// </summary>
-        /// <param name="rightContext">The right context.</param>
-        private void SetTopOperatorRightContext(object rightContext)
-        {
-            // Some operators change their precedence based on
-            // the right context - save current precedence.
-            int oldPrecedence = ops.Top.LeftPrecedence;
-
-            ops.Top.RightContext = rightContext;
-
-            // If the precedence increased, we may be able to
-            // reduce the region of the stack below the operator
-            if (ops.Top.LeftPrecedence > oldPrecedence)
-            {
-                ConstraintOperator changedOp = ops.Pop();
-                ReduceOperatorStack(changedOp.LeftPrecedence);
-                ops.Push(changedOp);
-            }
-        }
-
-        /// <summary>
-        /// Reduces the operator stack until the topmost item
-        /// precedence is greater than or equal to the target precedence.
-        /// </summary>
-        /// <param name="targetPrecedence">The target precedence.</param>
-        private void ReduceOperatorStack(int targetPrecedence)
-        {
-            while (!ops.Empty && ops.Top.RightPrecedence < targetPrecedence)
-                ops.Pop().Reduce(constraints);
-        }
-
-        /// <summary>
-        /// Resolves this instance, returning a Constraint. If the builder
-        /// is not currently in a resolvable state, an exception is thrown.
-        /// </summary>
-        /// <returns>The resolved constraint</returns>
-        public Constraint Resolve()
-        {
-            if (!IsResolvable)
-                throw new InvalidOperationException("A partial expression may not be resolved");
-
-            while (!ops.Empty)
-            {
-                ConstraintOperator op = ops.Pop();
-                op.Reduce(constraints);
-            }
-
-            return constraints.Pop();
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 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
+{
+    /// <summary>
+    /// ConstraintBuilder maintains the stacks that are used in
+    /// processing a ConstraintExpression. An OperatorStack
+    /// is used to hold operators that are waiting for their
+    /// operands to be reognized. a ConstraintStack holds 
+    /// input constraints as well as the results of each
+    /// operator applied.
+    /// </summary>
+    public class ConstraintBuilder
+    {
+        #region Nested Operator Stack Class
+        /// <summary>
+        /// OperatorStack is a type-safe stack for holding ConstraintOperators
+        /// </summary>
+        public class OperatorStack
+        {
+#if CLR_2_0 || CLR_4_0
+            private Stack<ConstraintOperator> stack = new Stack<ConstraintOperator>();
+#else
+		    private Stack stack = new Stack();
+#endif
+            /// <summary>
+            /// Initializes a new instance of the <see cref="T:OperatorStack"/> class.
+            /// </summary>
+            /// <param name="builder">The builder.</param>
+            public OperatorStack(ConstraintBuilder builder)
+            {
+            }
+
+            /// <summary>
+            /// Gets a value indicating whether this <see cref="T:OpStack"/> is empty.
+            /// </summary>
+            /// <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+            public bool Empty
+            {
+                get { return stack.Count == 0; }
+            }
+
+            /// <summary>
+            /// Gets the topmost operator without modifying the stack.
+            /// </summary>
+            /// <value>The top.</value>
+            public ConstraintOperator Top
+            {
+                get { return (ConstraintOperator)stack.Peek(); }
+            }
+
+            /// <summary>
+            /// Pushes the specified operator onto the stack.
+            /// </summary>
+            /// <param name="op">The op.</param>
+            public void Push(ConstraintOperator op)
+            {
+                stack.Push(op);
+            }
+
+            /// <summary>
+            /// Pops the topmost operator from the stack.
+            /// </summary>
+            /// <returns></returns>
+            public ConstraintOperator Pop()
+            {
+                return (ConstraintOperator)stack.Pop();
+            }
+        }
+        #endregion
+
+        #region Nested Constraint Stack Class
+        /// <summary>
+        /// ConstraintStack is a type-safe stack for holding Constraints
+        /// </summary>
+        public class ConstraintStack
+        {
+#if CLR_2_0 || CLR_4_0
+            private Stack<Constraint> stack = new Stack<Constraint>();
+#else
+		    private Stack stack = new Stack();
+#endif
+            private ConstraintBuilder builder;
+
+            /// <summary>
+            /// Initializes a new instance of the <see cref="T:ConstraintStack"/> class.
+            /// </summary>
+            /// <param name="builder">The builder.</param>
+            public ConstraintStack(ConstraintBuilder builder)
+            {
+                this.builder = builder;
+            }
+
+            /// <summary>
+            /// Gets a value indicating whether this <see cref="T:ConstraintStack"/> is empty.
+            /// </summary>
+            /// <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+            public bool Empty
+            {
+                get { return stack.Count == 0; }
+            }
+
+            /// <summary>
+            /// Gets the topmost constraint without modifying the stack.
+            /// </summary>
+            /// <value>The topmost constraint</value>
+            public Constraint Top
+            {
+                get { return (Constraint)stack.Peek(); }
+            }
+
+            /// <summary>
+            /// Pushes the specified constraint. As a side effect,
+            /// the constraint's builder field is set to the 
+            /// ConstraintBuilder owning this stack.
+            /// </summary>
+            /// <param name="constraint">The constraint.</param>
+            public void Push(Constraint constraint)
+            {
+                stack.Push(constraint);
+                constraint.SetBuilder( this.builder );
+            }
+
+            /// <summary>
+            /// Pops this topmost constrait from the stack.
+            /// As a side effect, the constraint's builder
+            /// field is set to null.
+            /// </summary>
+            /// <returns></returns>
+            public Constraint Pop()
+            {
+                Constraint constraint = (Constraint)stack.Pop();
+                constraint.SetBuilder( null );
+                return constraint;
+            }
+        }
+        #endregion
+
+        #region Instance Fields
+        private readonly OperatorStack ops;
+
+        private readonly ConstraintStack constraints;
+
+        private object lastPushed;
+        #endregion
+
+        #region Constructor
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintBuilder"/> class.
+        /// </summary>
+        public ConstraintBuilder()
+        {
+            this.ops = new OperatorStack(this);
+            this.constraints = new ConstraintStack(this);
+        }
+        #endregion
+
+        #region Properties
+        /// <summary>
+        /// Gets a value indicating whether this instance is resolvable.
+        /// </summary>
+        /// <value>
+        /// 	<c>true</c> if this instance is resolvable; otherwise, <c>false</c>.
+        /// </value>
+        public bool IsResolvable
+        {
+            get { return lastPushed is Constraint || lastPushed is SelfResolvingOperator; }
+        }
+        #endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Appends the specified operator to the expression by first
+        /// reducing the operator stack and then pushing the new
+        /// operator on the stack.
+        /// </summary>
+        /// <param name="op">The operator to push.</param>
+        public void Append(ConstraintOperator op)
+        {
+            op.LeftContext = lastPushed;
+            if (lastPushed is ConstraintOperator)
+                SetTopOperatorRightContext(op);
+
+            // Reduce any lower precedence operators
+            ReduceOperatorStack(op.LeftPrecedence);
+            
+            ops.Push(op);
+            lastPushed = op;
+        }
+
+        /// <summary>
+        /// Appends the specified constraint to the expresson by pushing
+        /// it on the constraint stack.
+        /// </summary>
+        /// <param name="constraint">The constraint to push.</param>
+        public void Append(Constraint constraint)
+        {
+            if (lastPushed is ConstraintOperator)
+                SetTopOperatorRightContext(constraint);
+
+            constraints.Push(constraint);
+            lastPushed = constraint;
+            constraint.SetBuilder( this );
+        }
+
+        /// <summary>
+        /// Sets the top operator right context.
+        /// </summary>
+        /// <param name="rightContext">The right context.</param>
+        private void SetTopOperatorRightContext(object rightContext)
+        {
+            // Some operators change their precedence based on
+            // the right context - save current precedence.
+            int oldPrecedence = ops.Top.LeftPrecedence;
+
+            ops.Top.RightContext = rightContext;
+
+            // If the precedence increased, we may be able to
+            // reduce the region of the stack below the operator
+            if (ops.Top.LeftPrecedence > oldPrecedence)
+            {
+                ConstraintOperator changedOp = ops.Pop();
+                ReduceOperatorStack(changedOp.LeftPrecedence);
+                ops.Push(changedOp);
+            }
+        }
+
+        /// <summary>
+        /// Reduces the operator stack until the topmost item
+        /// precedence is greater than or equal to the target precedence.
+        /// </summary>
+        /// <param name="targetPrecedence">The target precedence.</param>
+        private void ReduceOperatorStack(int targetPrecedence)
+        {
+            while (!ops.Empty && ops.Top.RightPrecedence < targetPrecedence)
+                ops.Pop().Reduce(constraints);
+        }
+
+        /// <summary>
+        /// Resolves this instance, returning a Constraint. If the builder
+        /// is not currently in a resolvable state, an exception is thrown.
+        /// </summary>
+        /// <returns>The resolved constraint</returns>
+        public Constraint Resolve()
+        {
+            if (!IsResolvable)
+                throw new InvalidOperationException("A partial expression may not be resolved");
+
+            while (!ops.Empty)
+            {
+                ConstraintOperator op = ops.Pop();
+                op.Reduce(constraints);
+            }
+
+            return constraints.Pop();
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
index 82611af..84dfade 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs
@@ -1,808 +1,802 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// ConstraintExpression represents a compound constraint in the 
-    /// process of being constructed from a series of syntactic elements.
-    /// 
-    /// Individual elements are appended to the expression as they are
-    /// reognized. Once an actual Constraint is appended, the expression
-    /// returns a resolvable Constraint.
-    /// </summary>
-    public class ConstraintExpression : ConstraintExpressionBase
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> class.
-        /// </summary>
-        public ConstraintExpression() { }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> 
-        /// class passing in a ConstraintBuilder, which may be pre-populated.
-        /// </summary>
-        /// <param name="builder">The builder.</param>
-        public ConstraintExpression(ConstraintBuilder builder)
-            : base( builder ) { }
-
-        #region Not
-
-        /// <summary>
-        /// Returns a ConstraintExpression that negates any
-        /// following constraint.
-        /// </summary>
-        public ConstraintExpression Not
-        {
-            get { return this.Append(new NotOperator()); }
-        }
-
-        /// <summary>
-        /// Returns a ConstraintExpression that negates any
-        /// following constraint.
-        /// </summary>
-        public ConstraintExpression No
-        {
-            get { return this.Append(new NotOperator()); }
-        }
-
-        #endregion
-
-        #region All
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them succeed.
-        /// </summary>
-        public ConstraintExpression All
-        {
-            get { return this.Append(new AllOperator()); }
-        }
-
-        #endregion
-
-        #region Some
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if at least one of them succeeds.
-        /// </summary>
-        public ConstraintExpression Some
-        {
-            get { return this.Append(new SomeOperator()); }
-        }
-
-        #endregion
-
-        #region None
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them fail.
-        /// </summary>
-        public ConstraintExpression None
-        {
-            get { return this.Append(new NoneOperator()); }
-        }
-
-        #endregion
-
-        #region 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
-        /// being tested or apply any following constraint to that property.
-        /// </summary>
-        public ResolvableConstraintExpression Property(string name)
-        {
-            return this.Append(new PropOperator(name));
-        }
-
-        #endregion
-
-        #region Length
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Length property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression Length
-        {
-            get { return Property("Length"); }
-        }
-
-        #endregion
-
-        #region Count
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Count property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression Count
-        {
-            get { return Property("Count"); }
-        }
-
-        #endregion
-
-        #region Message
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Message property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression Message
-        {
-            get { return Property("Message"); }
-        }
-
-        #endregion
-
-        #region InnerException
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the InnerException property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression InnerException
-        {
-            get { return Property("InnerException"); }
-        }
-
-        #endregion
-
-        #region Attribute
-
-        /// <summary>
-        /// Returns a new AttributeConstraint checking for the
-        /// presence of a particular attribute on an object.
-        /// </summary>
-        public ResolvableConstraintExpression Attribute(Type expectedType)
-        {
-            return this.Append(new AttributeOperator(expectedType));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Returns a new AttributeConstraint checking for the
-        /// presence of a particular attribute on an object.
-        /// </summary>
-        public ResolvableConstraintExpression Attribute<T>()
-        {
-            return Attribute(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region With
-
-        /// <summary>
-        /// With is currently a NOP - reserved for future use.
-        /// </summary>
-        public ConstraintExpression With
-        {
-            get { return this.Append(new WithOperator()); }
-        }
-
-        #endregion
-
-        #region Matches
-
-        /// <summary>
-        /// Returns the constraint provided as an argument - used to allow custom
-        /// custom constraints to easily participate in the syntax.
-        /// </summary>
-        public Constraint Matches(Constraint constraint)
-        {
-            return this.Append(constraint);
-        }
-
-#if 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.
-        /// </summary>
-        public Constraint Matches<T>(Predicate<T> predicate)
-        {
-            return this.Append(new PredicateConstraint<T>(predicate));
-        }
-#endif
-
-        #endregion
-
-        #region Null
-
-        /// <summary>
-        /// Returns a constraint that tests for null
-        /// </summary>
-        public NullConstraint Null
-        {
-            get { return (NullConstraint)this.Append(new NullConstraint()); }
-        }
-
-        #endregion
-
-        #region True
-
-        /// <summary>
-        /// Returns a constraint that tests for True
-        /// </summary>
-        public TrueConstraint True
-        {
-            get { return (TrueConstraint)this.Append(new TrueConstraint()); }
-        }
-
-        #endregion
-
-        #region False
-
-        /// <summary>
-        /// Returns a constraint that tests for False
-        /// </summary>
-        public FalseConstraint False
-        {
-            get { return (FalseConstraint)this.Append(new FalseConstraint()); }
-        }
-
-        #endregion
-
-        #region 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>
-        public NaNConstraint NaN
-        {
-            get { return (NaNConstraint)this.Append(new NaNConstraint()); }
-        }
-
-        #endregion
-
-        #region Empty
-
-        /// <summary>
-        /// Returns a constraint that tests for empty
-        /// </summary>
-        public EmptyConstraint Empty
-        {
-            get { return (EmptyConstraint)this.Append(new EmptyConstraint()); }
-        }
-
-        #endregion
-
-        #region Unique
-
-        /// <summary>
-        /// Returns a constraint that tests whether a collection 
-        /// contains all unique items.
-        /// </summary>
-        public UniqueItemsConstraint Unique
-        {
-            get { return (UniqueItemsConstraint)this.Append(new UniqueItemsConstraint()); }
-        }
-
-        #endregion
-
-        #region BinarySerializable
-
-        /// <summary>
-        /// Returns a constraint that tests whether an object graph is serializable in binary format.
-        /// </summary>
-        public BinarySerializableConstraint BinarySerializable
-        {
-            get { return (BinarySerializableConstraint)this.Append(new BinarySerializableConstraint()); }
-        }
-
-        #endregion
-
-        #region XmlSerializable
-
-        /// <summary>
-        /// Returns a constraint that tests whether an object graph is serializable in xml format.
-        /// </summary>
-        public XmlSerializableConstraint XmlSerializable
-        {
-            get { return (XmlSerializableConstraint)this.Append(new XmlSerializableConstraint()); }
-        }
-
-        #endregion
-
-        #region EqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests two items for equality
-        /// </summary>
-        public EqualConstraint EqualTo(object expected)
-        {
-            return (EqualConstraint)this.Append(new EqualConstraint(expected));
-        }
-
-        #endregion
-
-        #region SameAs
-
-        /// <summary>
-        /// Returns a constraint that tests that two references are the same object
-        /// </summary>
-        public SameAsConstraint SameAs(object expected)
-        {
-            return (SameAsConstraint)this.Append(new SameAsConstraint(expected));
-        }
-
-        #endregion
-
-        #region GreaterThan
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than the suppled argument
-        /// </summary>
-        public GreaterThanConstraint GreaterThan(object expected)
-        {
-            return (GreaterThanConstraint)this.Append(new GreaterThanConstraint(expected));
-        }
-
-        #endregion
-
-        #region GreaterThanOrEqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than or equal to the suppled argument
-        /// </summary>
-        public GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
-        {
-            return (GreaterThanOrEqualConstraint)this.Append(new GreaterThanOrEqualConstraint(expected));
-        }
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than or equal to the suppled argument
-        /// </summary>
-        public GreaterThanOrEqualConstraint AtLeast(object expected)
-        {
-            return (GreaterThanOrEqualConstraint)this.Append(new GreaterThanOrEqualConstraint(expected));
-        }
-
-        #endregion
-
-        #region LessThan
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than the suppled argument
-        /// </summary>
-        public LessThanConstraint LessThan(object expected)
-        {
-            return (LessThanConstraint)this.Append(new LessThanConstraint(expected));
-        }
-
-        #endregion
-
-        #region LessThanOrEqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than or equal to the suppled argument
-        /// </summary>
-        public LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
-        {
-            return (LessThanOrEqualConstraint)this.Append(new LessThanOrEqualConstraint(expected));
-        }
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than or equal to the suppled argument
-        /// </summary>
-        public LessThanOrEqualConstraint AtMost(object expected)
-        {
-            return (LessThanOrEqualConstraint)this.Append(new LessThanOrEqualConstraint(expected));
-        }
-
-        #endregion
-
-        #region TypeOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual
-        /// value is of the exact type supplied as an argument.
-        /// </summary>
-        public ExactTypeConstraint TypeOf(Type expectedType)
-        {
-            return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(expectedType));
-        }
-
-#if 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.
-        /// </summary>
-        public ExactTypeConstraint TypeOf<T>()
-        {
-            return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(typeof(T)));
-        }
-#endif
-
-        #endregion
-
-        #region InstanceOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is of the type supplied as an argument or a derived type.
-        /// </summary>
-        public InstanceOfTypeConstraint InstanceOf(Type expectedType)
-        {
-            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
-        }
-
-#if 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.
-        /// </summary>
-        public InstanceOfTypeConstraint InstanceOf<T>()
-        {
-            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(typeof(T)));
-        }
-#endif
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is of the type supplied as an argument or a derived type.
-        /// </summary>
-        [Obsolete("Use InstanceOf(expectedType)")]
-        public InstanceOfTypeConstraint InstanceOfType(Type expectedType)
-        {
-            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
-        }
-
-#if 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.
-        /// </summary>
-        [Obsolete("Use InstanceOf<T>()")]
-        public InstanceOfTypeConstraint InstanceOfType<T>()
-        {
-            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(typeof(T)));
-        }
-#endif
-
-        #endregion
-
-        #region AssignableFrom
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is assignable from the type supplied as an argument.
-        /// </summary>
-        public AssignableFromConstraint AssignableFrom(Type expectedType)
-        {
-            return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(expectedType));
-        }
-
-#if 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.
-        /// </summary>
-        public AssignableFromConstraint AssignableFrom<T>()
-        {
-            return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(typeof(T)));
-        }
-#endif
-
-        #endregion
-
-        #region AssignableTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is assignable from the type supplied as an argument.
-        /// </summary>
-        public AssignableToConstraint AssignableTo(Type expectedType)
-        {
-            return (AssignableToConstraint)this.Append(new AssignableToConstraint(expectedType));
-        }
-
-#if 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.
-        /// </summary>
-        public AssignableToConstraint AssignableTo<T>()
-        {
-            return (AssignableToConstraint)this.Append(new AssignableToConstraint(typeof(T)));
-        }
-#endif
-
-        #endregion
-
-        #region EquivalentTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is a collection containing the same elements as the 
-        /// collection supplied as an argument.
-        /// </summary>
-        public CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
-        {
-            return (CollectionEquivalentConstraint)this.Append(new CollectionEquivalentConstraint(expected));
-        }
-
-        #endregion
-
-        #region SubsetOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is a subset of the collection supplied as an argument.
-        /// </summary>
-        public CollectionSubsetConstraint SubsetOf(IEnumerable expected)
-        {
-            return (CollectionSubsetConstraint)this.Append(new CollectionSubsetConstraint(expected));
-        }
-
-        #endregion
-
-        #region Ordered
-
-        /// <summary>
-        /// Returns a constraint that tests whether a collection is ordered
-        /// </summary>
-        public CollectionOrderedConstraint Ordered
-        {
-            get { return (CollectionOrderedConstraint)this.Append(new CollectionOrderedConstraint()); }
-        }
-
-        #endregion
-
-        #region Member
-
-        /// <summary>
-        /// Returns a new CollectionContainsConstraint checking for the
-        /// presence of a particular object in the collection.
-        /// </summary>
-        public CollectionContainsConstraint Member(object expected)
-        {
-            return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
-        }
-
-        /// <summary>
-        /// Returns a new CollectionContainsConstraint checking for the
-        /// presence of a particular object in the collection.
-        /// </summary>
-        public CollectionContainsConstraint Contains(object expected)
-        {
-            return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
-        }
-
-        #endregion
-
-        #region Contains
-
-        /// <summary>
-        /// Returns a new ContainsConstraint. This constraint
-        /// will, in turn, make use of the appropriate second-level
-        /// constraint, depending on the type of the actual argument. 
-        /// This overload is only used if the item sought is a string,
-        /// since any other type implies that we are looking for a 
-        /// collection member.
-        /// </summary>
-        public ContainsConstraint Contains(string expected)
-        {
-            return (ContainsConstraint)this.Append(new ContainsConstraint(expected));
-        }
-
-        #endregion
-
-        #region StringContaining
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        public SubstringConstraint StringContaining(string expected)
-        {
-            return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        public SubstringConstraint ContainsSubstring(string expected)
-        {
-            return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
-        }
-
-        #endregion
-
-        #region StartsWith
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public StartsWithConstraint StartsWith(string expected)
-        {
-            return (StartsWithConstraint)this.Append(new StartsWithConstraint(expected));
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public StartsWithConstraint StringStarting(string expected)
-        {
-            return (StartsWithConstraint)this.Append(new StartsWithConstraint(expected));
-        }
-
-        #endregion
-
-        #region EndsWith
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public EndsWithConstraint EndsWith(string expected)
-        {
-            return (EndsWithConstraint)this.Append(new EndsWithConstraint(expected));
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public EndsWithConstraint StringEnding(string expected)
-        {
-            return (EndsWithConstraint)this.Append(new EndsWithConstraint(expected));
-        }
-
-        #endregion
-
-        #region Matches
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value matches the Regex pattern supplied as an argument.
-        /// </summary>
-        public RegexConstraint Matches(string pattern)
-        {
-            return (RegexConstraint)this.Append(new RegexConstraint(pattern));
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value matches the Regex pattern supplied as an argument.
-        /// </summary>
-        public RegexConstraint StringMatching(string pattern)
-        {
-            return (RegexConstraint)this.Append(new RegexConstraint(pattern));
-        }
-
-        #endregion
-
-        #region SamePath
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same as an expected path after canonicalization.
-        /// </summary>
-        public SamePathConstraint SamePath(string expected)
-        {
-            return (SamePathConstraint)this.Append(new SamePathConstraint(expected));
-        }
-
-        #endregion
-
-        #region SubPath
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same path or under an expected path after canonicalization.
-        /// </summary>
-        public SubPathConstraint SubPath(string expected)
-        {
-            return (SubPathConstraint)this.Append(new SubPathConstraint(expected));
-        }
-
-        #endregion
-
-        #region SamePathOrUnder
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same path or under an expected path after canonicalization.
-        /// </summary>
-        public SamePathOrUnderConstraint SamePathOrUnder(string expected)
-        {
-            return (SamePathOrUnderConstraint)this.Append(new SamePathOrUnderConstraint(expected));
-        }
-
-        #endregion
-
-        #region InRange
-
-#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 InRange(IComparable from, IComparable to)
-        {
-            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
-
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ConstraintExpression represents a compound constraint in the 
+    /// process of being constructed from a series of syntactic elements.
+    /// 
+    /// Individual elements are appended to the expression as they are
+    /// reognized. Once an actual Constraint is appended, the expression
+    /// returns a resolvable Constraint.
+    /// </summary>
+    public class ConstraintExpression : ConstraintExpressionBase
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> class.
+        /// </summary>
+        public ConstraintExpression() { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpression"/> 
+        /// class passing in a ConstraintBuilder, which may be pre-populated.
+        /// </summary>
+        /// <param name="builder">The builder.</param>
+        public ConstraintExpression(ConstraintBuilder builder)
+            : base( builder ) { }
+
+        #region Not
+
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression Not
+        {
+            get { return this.Append(new NotOperator()); }
+        }
+
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression No
+        {
+            get { return this.Append(new NotOperator()); }
+        }
+
+        #endregion
+
+        #region All
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public ConstraintExpression All
+        {
+            get { return this.Append(new AllOperator()); }
+        }
+
+        #endregion
+
+        #region Some
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if at least one of them succeeds.
+        /// </summary>
+        public ConstraintExpression Some
+        {
+            get { return this.Append(new SomeOperator()); }
+        }
+
+        #endregion
+
+        #region None
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them fail.
+        /// </summary>
+        public ConstraintExpression None
+        {
+            get { return this.Append(new NoneOperator()); }
+        }
+
+        #endregion
+
+        #region 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
+        /// being tested or apply any following constraint to that property.
+        /// </summary>
+        public ResolvableConstraintExpression Property(string name)
+        {
+            return this.Append(new PropOperator(name));
+        }
+
+        #endregion
+
+        #region Length
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Length property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Length
+        {
+            get { return Property("Length"); }
+        }
+
+        #endregion
+
+        #region Count
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Count property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Count
+        {
+            get { return Property("Count"); }
+        }
+
+        #endregion
+
+        #region Message
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Message property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Message
+        {
+            get { return Property("Message"); }
+        }
+
+        #endregion
+
+        #region InnerException
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the InnerException property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression InnerException
+        {
+            get { return Property("InnerException"); }
+        }
+
+        #endregion
+
+        #region Attribute
+
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute(Type expectedType)
+        {
+            return this.Append(new AttributeOperator(expectedType));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute<T>()
+        {
+            return Attribute(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region With
+
+        /// <summary>
+        /// With is currently a NOP - reserved for future use.
+        /// </summary>
+        public ConstraintExpression With
+        {
+            get { return this.Append(new WithOperator()); }
+        }
+
+        #endregion
+
+        #region Matches
+
+        /// <summary>
+        /// Returns the constraint provided as an argument - used to allow custom
+        /// custom constraints to easily participate in the syntax.
+        /// </summary>
+        public Constraint Matches(Constraint constraint)
+        {
+            return this.Append(constraint);
+        }
+
+#if 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.
+        /// </summary>
+        public Constraint Matches<T>(Predicate<T> predicate)
+        {
+            return this.Append(new PredicateConstraint<T>(predicate));
+        }
+#endif
+
+        #endregion
+
+        #region Null
+
+        /// <summary>
+        /// Returns a constraint that tests for null
+        /// </summary>
+        public NullConstraint Null
+        {
+            get { return (NullConstraint)this.Append(new NullConstraint()); }
+        }
+
+        #endregion
+
+        #region True
+
+        /// <summary>
+        /// Returns a constraint that tests for True
+        /// </summary>
+        public TrueConstraint True
+        {
+            get { return (TrueConstraint)this.Append(new TrueConstraint()); }
+        }
+
+        #endregion
+
+        #region False
+
+        /// <summary>
+        /// Returns a constraint that tests for False
+        /// </summary>
+        public FalseConstraint False
+        {
+            get { return (FalseConstraint)this.Append(new FalseConstraint()); }
+        }
+
+        #endregion
+
+        #region 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>
+        public NaNConstraint NaN
+        {
+            get { return (NaNConstraint)this.Append(new NaNConstraint()); }
+        }
+
+        #endregion
+
+        #region Empty
+
+        /// <summary>
+        /// Returns a constraint that tests for empty
+        /// </summary>
+        public EmptyConstraint Empty
+        {
+            get { return (EmptyConstraint)this.Append(new EmptyConstraint()); }
+        }
+
+        #endregion
+
+        #region Unique
+
+        /// <summary>
+        /// Returns a constraint that tests whether a collection 
+        /// contains all unique items.
+        /// </summary>
+        public UniqueItemsConstraint Unique
+        {
+            get { return (UniqueItemsConstraint)this.Append(new UniqueItemsConstraint()); }
+        }
+
+        #endregion
+
+        #region BinarySerializable
+
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in binary format.
+        /// </summary>
+        public BinarySerializableConstraint BinarySerializable
+        {
+            get { return (BinarySerializableConstraint)this.Append(new BinarySerializableConstraint()); }
+        }
+
+        #endregion
+
+        #region XmlSerializable
+
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in xml format.
+        /// </summary>
+        public XmlSerializableConstraint XmlSerializable
+        {
+            get { return (XmlSerializableConstraint)this.Append(new XmlSerializableConstraint()); }
+        }
+
+        #endregion
+
+        #region EqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests two items for equality
+        /// </summary>
+        public EqualConstraint EqualTo(object expected)
+        {
+            return (EqualConstraint)this.Append(new EqualConstraint(expected));
+        }
+
+        #endregion
+
+        #region SameAs
+
+        /// <summary>
+        /// Returns a constraint that tests that two references are the same object
+        /// </summary>
+        public SameAsConstraint SameAs(object expected)
+        {
+            return (SameAsConstraint)this.Append(new SameAsConstraint(expected));
+        }
+
+        #endregion
+
+        #region GreaterThan
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than the suppled argument
+        /// </summary>
+        public GreaterThanConstraint GreaterThan(object expected)
+        {
+            return (GreaterThanConstraint)this.Append(new GreaterThanConstraint(expected));
+        }
+
+        #endregion
+
+        #region GreaterThanOrEqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
+        {
+            return (GreaterThanOrEqualConstraint)this.Append(new GreaterThanOrEqualConstraint(expected));
+        }
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint AtLeast(object expected)
+        {
+            return (GreaterThanOrEqualConstraint)this.Append(new GreaterThanOrEqualConstraint(expected));
+        }
+
+        #endregion
+
+        #region LessThan
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than the suppled argument
+        /// </summary>
+        public LessThanConstraint LessThan(object expected)
+        {
+            return (LessThanConstraint)this.Append(new LessThanConstraint(expected));
+        }
+
+        #endregion
+
+        #region LessThanOrEqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
+        {
+            return (LessThanOrEqualConstraint)this.Append(new LessThanOrEqualConstraint(expected));
+        }
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint AtMost(object expected)
+        {
+            return (LessThanOrEqualConstraint)this.Append(new LessThanOrEqualConstraint(expected));
+        }
+
+        #endregion
+
+        #region TypeOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(expectedType));
+        }
+
+#if 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.
+        /// </summary>
+        public ExactTypeConstraint TypeOf<T>()
+        {
+            return (ExactTypeConstraint)this.Append(new ExactTypeConstraint(typeof(T)));
+        }
+#endif
+
+        #endregion
+
+        #region InstanceOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
+        }
+
+#if 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.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(typeof(T)));
+        }
+#endif
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf(expectedType)")]
+        public InstanceOfTypeConstraint InstanceOfType(Type expectedType)
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(expectedType));
+        }
+
+#if 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.
+        /// </summary>
+        [Obsolete("Use InstanceOf<T>()")]
+        public InstanceOfTypeConstraint InstanceOfType<T>()
+        {
+            return (InstanceOfTypeConstraint)this.Append(new InstanceOfTypeConstraint(typeof(T)));
+        }
+#endif
+
+        #endregion
+
+        #region AssignableFrom
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom(Type expectedType)
+        {
+            return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(expectedType));
+        }
+
+#if 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.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom<T>()
+        {
+            return (AssignableFromConstraint)this.Append(new AssignableFromConstraint(typeof(T)));
+        }
+#endif
+
+        #endregion
+
+        #region AssignableTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableToConstraint AssignableTo(Type expectedType)
+        {
+            return (AssignableToConstraint)this.Append(new AssignableToConstraint(expectedType));
+        }
+
+#if 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.
+        /// </summary>
+        public AssignableToConstraint AssignableTo<T>()
+        {
+            return (AssignableToConstraint)this.Append(new AssignableToConstraint(typeof(T)));
+        }
+#endif
+
+        #endregion
+
+        #region EquivalentTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a collection containing the same elements as the 
+        /// collection supplied as an argument.
+        /// </summary>
+        public CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
+        {
+            return (CollectionEquivalentConstraint)this.Append(new CollectionEquivalentConstraint(expected));
+        }
+
+        #endregion
+
+        #region SubsetOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a subset of the collection supplied as an argument.
+        /// </summary>
+        public CollectionSubsetConstraint SubsetOf(IEnumerable expected)
+        {
+            return (CollectionSubsetConstraint)this.Append(new CollectionSubsetConstraint(expected));
+        }
+
+        #endregion
+
+        #region Ordered
+
+        /// <summary>
+        /// Returns a constraint that tests whether a collection is ordered
+        /// </summary>
+        public CollectionOrderedConstraint Ordered
+        {
+            get { return (CollectionOrderedConstraint)this.Append(new CollectionOrderedConstraint()); }
+        }
+
+        #endregion
+
+        #region Member
+
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Member(object expected)
+        {
+            return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
+        }
+
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Contains(object expected)
+        {
+            return (CollectionContainsConstraint)this.Append(new CollectionContainsConstraint(expected));
+        }
+
+        #endregion
+
+        #region Contains
+
+        /// <summary>
+        /// Returns a new ContainsConstraint. This constraint
+        /// will, in turn, make use of the appropriate second-level
+        /// constraint, depending on the type of the actual argument. 
+        /// This overload is only used if the item sought is a string,
+        /// since any other type implies that we are looking for a 
+        /// collection member.
+        /// </summary>
+        public ContainsConstraint Contains(string expected)
+        {
+            return (ContainsConstraint)this.Append(new ContainsConstraint(expected));
+        }
+
+        #endregion
+
+        #region StringContaining
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint StringContaining(string expected)
+        {
+            return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint ContainsSubstring(string expected)
+        {
+            return (SubstringConstraint)this.Append(new SubstringConstraint(expected));
+        }
+
+        #endregion
+
+        #region StartsWith
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StartsWith(string expected)
+        {
+            return (StartsWithConstraint)this.Append(new StartsWithConstraint(expected));
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StringStarting(string expected)
+        {
+            return (StartsWithConstraint)this.Append(new StartsWithConstraint(expected));
+        }
+
+        #endregion
+
+        #region EndsWith
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint EndsWith(string expected)
+        {
+            return (EndsWithConstraint)this.Append(new EndsWithConstraint(expected));
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint StringEnding(string expected)
+        {
+            return (EndsWithConstraint)this.Append(new EndsWithConstraint(expected));
+        }
+
+        #endregion
+
+        #region Matches
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the regular expression supplied as an argument.
+        /// </summary>
+        public RegexConstraint Matches(string pattern)
+        {
+            return (RegexConstraint)this.Append(new RegexConstraint(pattern));
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the regular expression supplied as an argument.
+        /// </summary>
+        public RegexConstraint StringMatching(string pattern)
+        {
+            return (RegexConstraint)this.Append(new RegexConstraint(pattern));
+        }
+
+        #endregion
+
+        #region SamePath
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same as an expected path after canonicalization.
+        /// </summary>
+        public SamePathConstraint SamePath(string expected)
+        {
+            return (SamePathConstraint)this.Append(new SamePathConstraint(expected));
+        }
+
+        #endregion
+
+        #region SubPath
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SubPathConstraint SubPath(string expected)
+        {
+            return (SubPathConstraint)this.Append(new SubPathConstraint(expected));
+        }
+
+        #endregion
+
+        #region SamePathOrUnder
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SamePathOrUnderConstraint SamePathOrUnder(string expected)
+        {
+            return (SamePathOrUnderConstraint)this.Append(new SamePathOrUnderConstraint(expected));
+        }
+
+        #endregion
+
+        #region InRange
+
+#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));
+        }
+#else
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public RangeConstraint InRange(IComparable from, IComparable to)
+        {
+            return (RangeConstraint)this.Append(new RangeConstraint(from, to));
+        }
+#endif
+
+        #endregion
+
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
index 10f3af0..b500045 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintExpressionBase.cs
@@ -1,98 +1,98 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// ConstraintExpressionBase is the abstract base class for the 
-    /// ConstraintExpression class, which represents a 
-    /// compound constraint in the process of being constructed 
-    /// from a series of syntactic elements.
-    /// 
-    /// 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
-    {
-        #region Instance Fields
-        /// <summary>
-        /// The ConstraintBuilder holding the elements recognized so far
-        /// </summary>
-        protected ConstraintBuilder builder;
-        #endregion
-
-        #region Constructors
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> class.
-        /// </summary>
-        public ConstraintExpressionBase()
-        {
-            this.builder = new ConstraintBuilder();
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> 
-        /// class passing in a ConstraintBuilder, which may be pre-populated.
-        /// </summary>
-        /// <param name="builder">The builder.</param>
-        public ConstraintExpressionBase(ConstraintBuilder builder)
-        {
-            this.builder = builder;
-        }
-        #endregion
-
-        #region ToString()
-        /// <summary>
-        /// Returns a string representation of the expression as it
-        /// currently stands. This should only be used for testing,
-        /// since it has the side-effect of resolving the expression.
-        /// </summary>
-        /// <returns></returns>
-        public override string ToString()
-        {
-            return builder.Resolve().ToString();
-        }
-        #endregion
-
-        #region Append Methods
-        /// <summary>
-        /// Appends an operator to the expression and returns the
-        /// resulting expression itself.
-        /// </summary>
-        public ConstraintExpression Append(ConstraintOperator op)
-        {
-            builder.Append(op);
-            return (ConstraintExpression)this;
-        }
-
-        /// <summary>
-        /// Appends a self-resolving operator to the expression and
-        /// returns a new ResolvableConstraintExpression.
-        /// </summary>
-        public ResolvableConstraintExpression Append(SelfResolvingOperator op)
-        {
-            builder.Append(op);
-            return new ResolvableConstraintExpression(builder);
-        }
-
-        /// <summary>
-        /// Appends a constraint to the expression and returns that
-        /// constraint, which is associated with the current state
-        /// of the expression being built.
-        /// </summary>
-        public Constraint Append(Constraint constraint)
-        {
-            builder.Append(constraint);
-            return constraint;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ConstraintExpressionBase is the abstract base class for the 
+    /// ConstraintExpression class, which represents a 
+    /// compound constraint in the process of being constructed 
+    /// from a series of syntactic elements.
+    /// 
+    /// 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
+    {
+        #region Instance Fields
+        /// <summary>
+        /// The ConstraintBuilder holding the elements recognized so far
+        /// </summary>
+        protected ConstraintBuilder builder;
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> class.
+        /// </summary>
+        public ConstraintExpressionBase()
+        {
+            this.builder = new ConstraintBuilder();
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> 
+        /// class passing in a ConstraintBuilder, which may be pre-populated.
+        /// </summary>
+        /// <param name="builder">The builder.</param>
+        public ConstraintExpressionBase(ConstraintBuilder builder)
+        {
+            this.builder = builder;
+        }
+        #endregion
+
+        #region ToString()
+        /// <summary>
+        /// Returns a string representation of the expression as it
+        /// currently stands. This should only be used for testing,
+        /// since it has the side-effect of resolving the expression.
+        /// </summary>
+        /// <returns></returns>
+        public override string ToString()
+        {
+            return builder.Resolve().ToString();
+        }
+        #endregion
+
+        #region Append Methods
+        /// <summary>
+        /// Appends an operator to the expression and returns the
+        /// resulting expression itself.
+        /// </summary>
+        public ConstraintExpression Append(ConstraintOperator op)
+        {
+            builder.Append(op);
+            return (ConstraintExpression)this;
+        }
+
+        /// <summary>
+        /// Appends a self-resolving operator to the expression and
+        /// returns a new ResolvableConstraintExpression.
+        /// </summary>
+        public ResolvableConstraintExpression Append(SelfResolvingOperator op)
+        {
+            builder.Append(op);
+            return new ResolvableConstraintExpression(builder);
+        }
+
+        /// <summary>
+        /// Appends a constraint to the expression and returns that
+        /// constraint, which is associated with the current state
+        /// of the expression being built.
+        /// </summary>
+        public Constraint Append(Constraint constraint)
+        {
+            builder.Append(constraint);
+            return constraint;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs b/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
index 5182ee4..d4316a0 100644
--- a/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
+++ b/src/NUnitFramework/framework/Constraints/ConstraintFactory.cs
@@ -1,807 +1,800 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// Helper class with properties and methods that supply
-    /// a number of constraints used in Asserts.
-    /// </summary>
-    public class ConstraintFactory
-    {
-        #region Not
-
-        /// <summary>
-        /// Returns a ConstraintExpression that negates any
-        /// following constraint.
-        /// </summary>
-        public ConstraintExpression Not
-        {
-            get { return Is.Not; }
-        }
-
-        /// <summary>
-        /// Returns a ConstraintExpression that negates any
-        /// following constraint.
-        /// </summary>
-        public ConstraintExpression No
-        {
-            get { return Has.No; }
-        }
-
-        #endregion
-
-        #region All
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them succeed.
-        /// </summary>
-        public ConstraintExpression All
-        {
-            get { return Is.All; }
-        }
-
-        #endregion
-
-        #region Some
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if at least one of them succeeds.
-        /// </summary>
-        public ConstraintExpression Some
-        {
-            get { return Has.Some; }
-        }
-
-        #endregion
-
-        #region None
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them fail.
-        /// </summary>
-        public ConstraintExpression None
-        {
-            get { return Has.None; }
-        }
-
-        #endregion
-
-        #region 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
-        /// being tested or apply any following constraint to that property.
-        /// </summary>
-        public ResolvableConstraintExpression Property(string name)
-        {
-            return Has.Property(name);
-        }
-
-        #endregion
-
-        #region Length
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Length property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression Length
-        {
-            get { return Has.Length; }
-        }
-
-        #endregion
-
-        #region Count
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Count property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression Count
-        {
-            get { return Has.Count; }
-        }
-
-        #endregion
-
-        #region Message
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Message property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression Message
-        {
-            get { return Has.Message; }
-        }
-
-        #endregion
-
-        #region InnerException
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the InnerException property of the object being tested.
-        /// </summary>
-        public ResolvableConstraintExpression InnerException
-        {
-            get { return Has.InnerException; }
-        }
-
-        #endregion
-
-        #region Attribute
-
-        /// <summary>
-        /// Returns a new AttributeConstraint checking for the
-        /// presence of a particular attribute on an object.
-        /// </summary>
-        public ResolvableConstraintExpression Attribute(Type expectedType)
-        {
-            return Has.Attribute(expectedType);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Returns a new AttributeConstraint checking for the
-        /// presence of a particular attribute on an object.
-        /// </summary>
-        public ResolvableConstraintExpression Attribute<T>()
-        {
-            return Attribute(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region Null
-
-        /// <summary>
-        /// Returns a constraint that tests for null
-        /// </summary>
-        public NullConstraint Null
-        {
-            get { return new NullConstraint(); }
-        }
-
-        #endregion
-
-        #region True
-
-        /// <summary>
-        /// Returns a constraint that tests for True
-        /// </summary>
-        public TrueConstraint True
-        {
-            get { return new TrueConstraint(); }
-        }
-
-        #endregion
-
-        #region False
-
-        /// <summary>
-        /// Returns a constraint that tests for False
-        /// </summary>
-        public FalseConstraint False
-        {
-            get { return new FalseConstraint(); }
-        }
-
-        #endregion
-
-        #region 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>
-        public NaNConstraint NaN
-        {
-            get { return new NaNConstraint(); }
-        }
-
-        #endregion
-
-        #region Empty
-
-        /// <summary>
-        /// Returns a constraint that tests for empty
-        /// </summary>
-        public EmptyConstraint Empty
-        {
-            get { return new EmptyConstraint(); }
-        }
-
-        #endregion
-
-        #region Unique
-
-        /// <summary>
-        /// Returns a constraint that tests whether a collection 
-        /// contains all unique items.
-        /// </summary>
-        public UniqueItemsConstraint Unique
-        {
-            get { return new UniqueItemsConstraint(); }
-        }
-
-        #endregion
-
-        #region BinarySerializable
-
-        /// <summary>
-        /// Returns a constraint that tests whether an object graph is serializable in binary format.
-        /// </summary>
-        public BinarySerializableConstraint BinarySerializable
-        {
-            get { return new BinarySerializableConstraint(); }
-        }
-
-        #endregion
-
-        #region XmlSerializable
-
-        /// <summary>
-        /// Returns a constraint that tests whether an object graph is serializable in xml format.
-        /// </summary>
-        public XmlSerializableConstraint XmlSerializable
-        {
-            get { return new XmlSerializableConstraint(); }
-        }
-
-        #endregion
-
-        #region EqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests two items for equality
-        /// </summary>
-        public EqualConstraint EqualTo(object expected)
-        {
-            return new EqualConstraint(expected);
-        }
-
-        #endregion
-
-        #region SameAs
-
-        /// <summary>
-        /// Returns a constraint that tests that two references are the same object
-        /// </summary>
-        public SameAsConstraint SameAs(object expected)
-        {
-            return new SameAsConstraint(expected);
-        }
-
-        #endregion
-
-        #region GreaterThan
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than the suppled argument
-        /// </summary>
-        public GreaterThanConstraint GreaterThan(object expected)
-        {
-            return new GreaterThanConstraint(expected);
-        }
-
-        #endregion
-
-        #region GreaterThanOrEqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than or equal to the suppled argument
-        /// </summary>
-        public GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
-        {
-            return new GreaterThanOrEqualConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than or equal to the suppled argument
-        /// </summary>
-        public GreaterThanOrEqualConstraint AtLeast(object expected)
-        {
-            return new GreaterThanOrEqualConstraint(expected);
-        }
-
-        #endregion
-
-        #region LessThan
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than the suppled argument
-        /// </summary>
-        public LessThanConstraint LessThan(object expected)
-        {
-            return new LessThanConstraint(expected);
-        }
-
-        #endregion
-
-        #region LessThanOrEqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than or equal to the suppled argument
-        /// </summary>
-        public LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
-        {
-            return new LessThanOrEqualConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than or equal to the suppled argument
-        /// </summary>
-        public LessThanOrEqualConstraint AtMost(object expected)
-        {
-            return new LessThanOrEqualConstraint(expected);
-        }
-
-        #endregion
-
-        #region TypeOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual
-        /// value is of the exact type supplied as an argument.
-        /// </summary>
-        public ExactTypeConstraint TypeOf(Type expectedType)
-        {
-            return new ExactTypeConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public ExactTypeConstraint TypeOf<T>()
-        {
-            return new ExactTypeConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region InstanceOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is of the type supplied as an argument or a derived type.
-        /// </summary>
-        public InstanceOfTypeConstraint InstanceOf(Type expectedType)
-        {
-            return new InstanceOfTypeConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public InstanceOfTypeConstraint InstanceOf<T>()
-        {
-            return new InstanceOfTypeConstraint(typeof(T));
-        }
-#endif
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is of the type supplied as an argument or a derived type.
-        /// </summary>
-        [Obsolete("Use InstanceOf(expectedType)")]
-        public InstanceOfTypeConstraint InstanceOfType(Type expectedType)
-        {
-            return new InstanceOfTypeConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        [Obsolete("Use InstanceOf<T>()")]
-        public InstanceOfTypeConstraint InstanceOfType<T>()
-        {
-            return new InstanceOfTypeConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region AssignableFrom
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is assignable from the type supplied as an argument.
-        /// </summary>
-        public AssignableFromConstraint AssignableFrom(Type expectedType)
-        {
-            return new AssignableFromConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public AssignableFromConstraint AssignableFrom<T>()
-        {
-            return new AssignableFromConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region AssignableTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is assignable from the type supplied as an argument.
-        /// </summary>
-        public AssignableToConstraint AssignableTo(Type expectedType)
-        {
-            return new AssignableToConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public AssignableToConstraint AssignableTo<T>()
-        {
-            return new AssignableToConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region EquivalentTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is a collection containing the same elements as the 
-        /// collection supplied as an argument.
-        /// </summary>
-        public CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
-        {
-            return new CollectionEquivalentConstraint(expected);
-        }
-
-        #endregion
-
-        #region SubsetOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is a subset of the collection supplied as an argument.
-        /// </summary>
-        public CollectionSubsetConstraint SubsetOf(IEnumerable expected)
-        {
-            return new CollectionSubsetConstraint(expected);
-        }
-
-        #endregion
-
-        #region Ordered
-
-        /// <summary>
-        /// Returns a constraint that tests whether a collection is ordered
-        /// </summary>
-        public CollectionOrderedConstraint Ordered
-        {
-            get { return new CollectionOrderedConstraint(); }
-        }
-
-        #endregion
-
-        #region Member
-
-        /// <summary>
-        /// Returns a new CollectionContainsConstraint checking for the
-        /// presence of a particular object in the collection.
-        /// </summary>
-        public CollectionContainsConstraint Member(object expected)
-        {
-            return new CollectionContainsConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a new CollectionContainsConstraint checking for the
-        /// presence of a particular object in the collection.
-        /// </summary>
-        public CollectionContainsConstraint Contains(object expected)
-        {
-            return new CollectionContainsConstraint(expected);
-        }
-
-        #endregion
-
-        #region Contains
-
-        /// <summary>
-        /// Returns a new ContainsConstraint. This constraint
-        /// will, in turn, make use of the appropriate second-level
-        /// constraint, depending on the type of the actual argument. 
-        /// This overload is only used if the item sought is a string,
-        /// since any other type implies that we are looking for a 
-        /// collection member.
-        /// </summary>
-        public ContainsConstraint Contains(string expected)
-        {
-            return new ContainsConstraint(expected);
-        }
-
-        #endregion
-
-        #region StringContaining
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        public SubstringConstraint StringContaining(string expected)
-        {
-            return new SubstringConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        public SubstringConstraint ContainsSubstring(string expected)
-        {
-            return new SubstringConstraint(expected);
-        }
-
-        #endregion
-
-        #region DoesNotContain
-
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        public SubstringConstraint DoesNotContain(string expected)
-        {
-            return new ConstraintExpression().Not.ContainsSubstring(expected);
-        }
-
-        #endregion
-
-        #region StartsWith
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public StartsWithConstraint StartsWith(string expected)
-        {
-            return new StartsWithConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public StartsWithConstraint StringStarting(string expected)
-        {
-            return new StartsWithConstraint(expected);
-        }
-
-        #endregion
-
-        #region DoesNotStartWith
-
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public StartsWithConstraint DoesNotStartWith(string expected)
-        {
-            return new ConstraintExpression().Not.StartsWith(expected);
-        }
-
-        #endregion
-
-        #region EndsWith
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public EndsWithConstraint EndsWith(string expected)
-        {
-            return new EndsWithConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public EndsWithConstraint StringEnding(string expected)
-        {
-            return new EndsWithConstraint(expected);
-        }
-
-        #endregion
-
-        #region DoesNotEndWith
-
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public EndsWithConstraint DoesNotEndWith(string expected)
-        {
-            return new ConstraintExpression().Not.EndsWith(expected);
-        }
-
-        #endregion
-
-        #region Matches
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value matches the Regex pattern supplied as an argument.
-        /// </summary>
-        public RegexConstraint Matches(string pattern)
-        {
-            return new RegexConstraint(pattern);
-        }
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value matches the Regex pattern supplied as an argument.
-        /// </summary>
-        public RegexConstraint StringMatching(string pattern)
-        {
-            return new RegexConstraint(pattern);
-        }
-
-        #endregion
-
-        #region DoesNotMatch
-
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value matches the pattern supplied as an argument.
-        /// </summary>
-        public RegexConstraint DoesNotMatch(string pattern)
-        {
-            return new ConstraintExpression().Not.Matches(pattern);
-        }
-
-        #endregion
-
-        #region SamePath
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same as an expected path after canonicalization.
-        /// </summary>
-        public SamePathConstraint SamePath(string expected)
-        {
-            return new SamePathConstraint(expected);
-        }
-
-        #endregion
-
-        #region SubPath
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same path or under an expected path after canonicalization.
-        /// </summary>
-        public SubPathConstraint SubPath(string expected)
-        {
-            return new SubPathConstraint(expected);
-        }
-
-        #endregion
-
-        #region SamePathOrUnder
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same path or under an expected path after canonicalization.
-        /// </summary>
-        public SamePathOrUnderConstraint SamePathOrUnder(string expected)
-        {
-            return new SamePathOrUnderConstraint(expected);
-        }
-
-        #endregion
-
-        #region InRange
-
-#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 InRange(IComparable from, IComparable to)
-        {
-            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
-
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class ConstraintFactory
+    {
+        #region Not
+
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression Not
+        {
+            get { return Is.Not; }
+        }
+
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public ConstraintExpression No
+        {
+            get { return Has.No; }
+        }
+
+        #endregion
+
+        #region All
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public ConstraintExpression All
+        {
+            get { return Is.All; }
+        }
+
+        #endregion
+
+        #region Some
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if at least one of them succeeds.
+        /// </summary>
+        public ConstraintExpression Some
+        {
+            get { return Has.Some; }
+        }
+
+        #endregion
+
+        #region None
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them fail.
+        /// </summary>
+        public ConstraintExpression None
+        {
+            get { return Has.None; }
+        }
+
+        #endregion
+
+        #region 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
+        /// being tested or apply any following constraint to that property.
+        /// </summary>
+        public ResolvableConstraintExpression Property(string name)
+        {
+            return Has.Property(name);
+        }
+
+        #endregion
+
+        #region Length
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Length property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Length
+        {
+            get { return Has.Length; }
+        }
+
+        #endregion
+
+        #region Count
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Count property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Count
+        {
+            get { return Has.Count; }
+        }
+
+        #endregion
+
+        #region Message
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Message property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression Message
+        {
+            get { return Has.Message; }
+        }
+
+        #endregion
+
+        #region InnerException
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the InnerException property of the object being tested.
+        /// </summary>
+        public ResolvableConstraintExpression InnerException
+        {
+            get { return Has.InnerException; }
+        }
+
+        #endregion
+
+        #region Attribute
+
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute(Type expectedType)
+        {
+            return Has.Attribute(expectedType);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public ResolvableConstraintExpression Attribute<T>()
+        {
+            return Attribute(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region Null
+
+        /// <summary>
+        /// Returns a constraint that tests for null
+        /// </summary>
+        public NullConstraint Null
+        {
+            get { return new NullConstraint(); }
+        }
+
+        #endregion
+
+        #region True
+
+        /// <summary>
+        /// Returns a constraint that tests for True
+        /// </summary>
+        public TrueConstraint True
+        {
+            get { return new TrueConstraint(); }
+        }
+
+        #endregion
+
+        #region False
+
+        /// <summary>
+        /// Returns a constraint that tests for False
+        /// </summary>
+        public FalseConstraint False
+        {
+            get { return new FalseConstraint(); }
+        }
+
+        #endregion
+
+        #region 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>
+        public NaNConstraint NaN
+        {
+            get { return new NaNConstraint(); }
+        }
+
+        #endregion
+
+        #region Empty
+
+        /// <summary>
+        /// Returns a constraint that tests for empty
+        /// </summary>
+        public EmptyConstraint Empty
+        {
+            get { return new EmptyConstraint(); }
+        }
+
+        #endregion
+
+        #region Unique
+
+        /// <summary>
+        /// Returns a constraint that tests whether a collection 
+        /// contains all unique items.
+        /// </summary>
+        public UniqueItemsConstraint Unique
+        {
+            get { return new UniqueItemsConstraint(); }
+        }
+
+        #endregion
+
+        #region BinarySerializable
+
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in binary format.
+        /// </summary>
+        public BinarySerializableConstraint BinarySerializable
+        {
+            get { return new BinarySerializableConstraint(); }
+        }
+
+        #endregion
+
+        #region XmlSerializable
+
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in xml format.
+        /// </summary>
+        public XmlSerializableConstraint XmlSerializable
+        {
+            get { return new XmlSerializableConstraint(); }
+        }
+
+        #endregion
+
+        #region EqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests two items for equality
+        /// </summary>
+        public EqualConstraint EqualTo(object expected)
+        {
+            return new EqualConstraint(expected);
+        }
+
+        #endregion
+
+        #region SameAs
+
+        /// <summary>
+        /// Returns a constraint that tests that two references are the same object
+        /// </summary>
+        public SameAsConstraint SameAs(object expected)
+        {
+            return new SameAsConstraint(expected);
+        }
+
+        #endregion
+
+        #region GreaterThan
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than the suppled argument
+        /// </summary>
+        public GreaterThanConstraint GreaterThan(object expected)
+        {
+            return new GreaterThanConstraint(expected);
+        }
+
+        #endregion
+
+        #region GreaterThanOrEqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public GreaterThanOrEqualConstraint AtLeast(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+
+        #endregion
+
+        #region LessThan
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than the suppled argument
+        /// </summary>
+        public LessThanConstraint LessThan(object expected)
+        {
+            return new LessThanConstraint(expected);
+        }
+
+        #endregion
+
+        #region LessThanOrEqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public LessThanOrEqualConstraint AtMost(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+
+        #endregion
+
+        #region TypeOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return new ExactTypeConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public ExactTypeConstraint TypeOf<T>()
+        {
+            return new ExactTypeConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region InstanceOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+#endif
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf(expectedType)")]
+        public InstanceOfTypeConstraint InstanceOfType(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        [Obsolete("Use InstanceOf<T>()")]
+        public InstanceOfTypeConstraint InstanceOfType<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region AssignableFrom
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom(Type expectedType)
+        {
+            return new AssignableFromConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public AssignableFromConstraint AssignableFrom<T>()
+        {
+            return new AssignableFromConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region AssignableTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public AssignableToConstraint AssignableTo(Type expectedType)
+        {
+            return new AssignableToConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public AssignableToConstraint AssignableTo<T>()
+        {
+            return new AssignableToConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region EquivalentTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a collection containing the same elements as the 
+        /// collection supplied as an argument.
+        /// </summary>
+        public CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
+        {
+            return new CollectionEquivalentConstraint(expected);
+        }
+
+        #endregion
+
+        #region SubsetOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a subset of the collection supplied as an argument.
+        /// </summary>
+        public CollectionSubsetConstraint SubsetOf(IEnumerable expected)
+        {
+            return new CollectionSubsetConstraint(expected);
+        }
+
+        #endregion
+
+        #region Ordered
+
+        /// <summary>
+        /// Returns a constraint that tests whether a collection is ordered
+        /// </summary>
+        public CollectionOrderedConstraint Ordered
+        {
+            get { return new CollectionOrderedConstraint(); }
+        }
+
+        #endregion
+
+        #region Member
+
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Member(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public CollectionContainsConstraint Contains(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+
+        #endregion
+
+        #region Contains
+
+        /// <summary>
+        /// Returns a new ContainsConstraint. This constraint
+        /// will, in turn, make use of the appropriate second-level
+        /// constraint, depending on the type of the actual argument. 
+        /// This overload is only used if the item sought is a string,
+        /// since any other type implies that we are looking for a 
+        /// collection member.
+        /// </summary>
+        public ContainsConstraint Contains(string expected)
+        {
+            return new ContainsConstraint(expected);
+        }
+
+        #endregion
+
+        #region StringContaining
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint StringContaining(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint ContainsSubstring(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+
+        #endregion
+
+        #region DoesNotContain
+
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public SubstringConstraint DoesNotContain(string expected)
+        {
+            return new ConstraintExpression().Not.ContainsSubstring(expected);
+        }
+
+        #endregion
+
+        #region StartsWith
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StartsWith(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint StringStarting(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+
+        #endregion
+
+        #region DoesNotStartWith
+
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public StartsWithConstraint DoesNotStartWith(string expected)
+        {
+            return new ConstraintExpression().Not.StartsWith(expected);
+        }
+
+        #endregion
+
+        #region EndsWith
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint EndsWith(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint StringEnding(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+
+        #endregion
+
+        #region DoesNotEndWith
+
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public EndsWithConstraint DoesNotEndWith(string expected)
+        {
+            return new ConstraintExpression().Not.EndsWith(expected);
+        }
+
+        #endregion
+
+        #region Matches
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the regular expression supplied as an argument.
+        /// </summary>
+        public RegexConstraint Matches(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the regular expression supplied as an argument.
+        /// </summary>
+        public RegexConstraint StringMatching(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+
+        #endregion
+
+        #region DoesNotMatch
+
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value matches the pattern supplied as an argument.
+        /// </summary>
+        public RegexConstraint DoesNotMatch(string pattern)
+        {
+            return new ConstraintExpression().Not.Matches(pattern);
+        }
+
+        #endregion
+
+        #region SamePath
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same as an expected path after canonicalization.
+        /// </summary>
+        public SamePathConstraint SamePath(string expected)
+        {
+            return new SamePathConstraint(expected);
+        }
+
+        #endregion
+
+        #region SubPath
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SubPathConstraint SubPath(string expected)
+        {
+            return new SubPathConstraint(expected);
+        }
+
+        #endregion
+
+        #region SamePathOrUnder
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public SamePathOrUnderConstraint SamePathOrUnder(string expected)
+        {
+            return new SamePathOrUnderConstraint(expected);
+        }
+
+        #endregion
+
+        #region InRange
+
+#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);
+        }
+#else
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public RangeConstraint InRange(IComparable from, IComparable to)
+        {
+            return new RangeConstraint(from, to);
+        }
+#endif
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs b/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
deleted file mode 100644
index 86f2695..0000000
--- a/src/NUnitFramework/framework/Constraints/ConstraintOperators.cs
+++ /dev/null
@@ -1,508 +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 System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    #region ConstraintOperator Base Class
-    /// <summary>
-    /// The ConstraintOperator class is used internally by a
-    /// ConstraintBuilder to represent an operator that 
-    /// modifies or combines constraints. 
-    /// 
-    /// Constraint operators use left and right precedence
-    /// values to determine whether the top operator on the
-    /// stack should be reduced before pushing a new operator.
-    /// </summary>
-    public abstract class ConstraintOperator
-    {
-        private object leftContext;
-        private object rightContext;
-
-		/// <summary>
-		/// The precedence value used when the operator
-		/// is about to be pushed to the stack.
-		/// </summary>
-		protected int left_precedence;
-        
-		/// <summary>
-		/// The precedence value used when the operator
-		/// is on the top of the stack.
-		/// </summary>
-		protected int right_precedence;
-
-		/// <summary>
-		/// The syntax element preceding this operator
-		/// </summary>
-        public object LeftContext
-        {
-            get { return leftContext; }
-            set { leftContext = value; }
-        }
-
-		/// <summary>
-		/// The syntax element folowing this operator
-		/// </summary>
-        public object RightContext
-        {
-            get { return rightContext; }
-            set { rightContext = value; }
-        }
-
-		/// <summary>
-		/// The precedence value used when the operator
-		/// is about to be pushed to the stack.
-		/// </summary>
-		public virtual int LeftPrecedence
-        {
-            get { return left_precedence; }
-        }
-
-		/// <summary>
-		/// The precedence value used when the operator
-		/// is on the top of the stack.
-		/// </summary>
-		public virtual int RightPrecedence
-        {
-            get { return right_precedence; }
-        }
-
-		/// <summary>
-		/// Reduce produces a constraint from the operator and 
-		/// any arguments. It takes the arguments from the constraint 
-		/// stack and pushes the resulting constraint on it.
-		/// </summary>
-		/// <param name="stack"></param>
-		public abstract void Reduce(ConstraintBuilder.ConstraintStack stack);
-    }
-    #endregion
-
-    #region Prefix Operators
-
-    #region PrefixOperator
-    /// <summary>
-	/// PrefixOperator takes a single constraint and modifies
-	/// it's action in some way.
-	/// </summary>
-    public abstract class PrefixOperator : ConstraintOperator
-    {
-		/// <summary>
-		/// Reduce produces a constraint from the operator and 
-		/// any arguments. It takes the arguments from the constraint 
-		/// stack and pushes the resulting constraint on it.
-		/// </summary>
-		/// <param name="stack"></param>
-		public override void Reduce(ConstraintBuilder.ConstraintStack stack)
-        {
-            stack.Push(ApplyPrefix(stack.Pop()));
-        }
-
-        /// <summary>
-        /// Returns the constraint created by applying this
-        /// prefix to another constraint.
-        /// </summary>
-        /// <param name="constraint"></param>
-        /// <returns></returns>
-        public abstract Constraint ApplyPrefix(Constraint constraint);
-    }
-    #endregion
-
-    #region NotOperator
-    /// <summary>
-    /// Negates the test of the constraint it wraps.
-    /// </summary>
-    public class NotOperator : PrefixOperator
-    {
-        /// <summary>
-        /// Constructs a new NotOperator
-        /// </summary>
-        public NotOperator()
-        {
-            // Not stacks on anything and only allows other
-            // prefix ops to stack on top of it.
-            this.left_precedence = this.right_precedence = 1;
-        }
-
-        /// <summary>
-        /// Returns a NotConstraint applied to its argument.
-        /// </summary>
-        public override Constraint ApplyPrefix(Constraint constraint)
-        {
-            return new NotConstraint(constraint);
-        }
-    }
-    #endregion
-
-    #region Collection Operators
-    /// <summary>
-    /// Abstract base for operators that indicate how to
-    /// apply a constraint to items in a collection.
-    /// </summary>
-    public abstract class CollectionOperator : PrefixOperator
-    {
-        /// <summary>
-        /// Constructs a CollectionOperator
-        /// </summary>
-        public CollectionOperator()
-        {
-            // Collection Operators stack on everything
-            // and allow all other ops to stack on them
-            this.left_precedence = 1;
-            this.right_precedence = 10;
-        }
-    }
-
-    /// <summary>
-    /// Represents a constraint that succeeds if all the 
-    /// members of a collection match a base constraint.
-    /// </summary>
-    public class AllOperator : CollectionOperator
-    {
-        /// <summary>
-        /// Returns a constraint that will apply the argument
-        /// to the members of a collection, succeeding if
-        /// they all succeed.
-        /// </summary>
-        public override Constraint ApplyPrefix(Constraint constraint)
-        {
-            return new AllItemsConstraint(constraint);
-        }
-    }
-
-    /// <summary>
-    /// Represents a constraint that succeeds if any of the 
-    /// members of a collection match a base constraint.
-    /// </summary>
-    public class SomeOperator : CollectionOperator
-    {
-        /// <summary>
-        /// Returns a constraint that will apply the argument
-        /// to the members of a collection, succeeding if
-        /// any of them succeed.
-        /// </summary>
-        public override Constraint ApplyPrefix(Constraint constraint)
-        {
-            return new SomeItemsConstraint(constraint);
-        }
-    }
-
-    /// <summary>
-    /// Represents a constraint that succeeds if none of the 
-    /// members of a collection match a base constraint.
-    /// </summary>
-    public class NoneOperator : CollectionOperator
-    {
-        /// <summary>
-        /// Returns a constraint that will apply the argument
-        /// to the members of a collection, succeeding if
-        /// none of them succeed.
-        /// </summary>
-        public override Constraint ApplyPrefix(Constraint constraint)
-        {
-            return new NoItemConstraint(constraint);
-        }
-    }
-
-    /// <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
-    /// <summary>
-    /// Represents a constraint that simply wraps the
-    /// constraint provided as an argument, without any
-    /// further functionality, but which modifes the
-    /// order of evaluation because of its precedence.
-    /// </summary>
-    public class WithOperator : PrefixOperator
-    {
-        /// <summary>
-        /// Constructor for the WithOperator
-        /// </summary>
-        public WithOperator()
-        {
-            this.left_precedence = 1;
-            this.right_precedence = 4;
-        }
-
-        /// <summary>
-        /// Returns a constraint that wraps its argument
-        /// </summary>
-        public override Constraint ApplyPrefix(Constraint constraint)
-        {
-            return constraint;
-        }
-    }
-    #endregion
-
-    #region SelfResolving Operators
-
-    #region SelfResolvingOperator
-    /// <summary>
-    /// Abstract base class for operators that are able to reduce to a 
-    /// constraint whether or not another syntactic element follows.
-    /// </summary>
-    public abstract class SelfResolvingOperator : ConstraintOperator
-    {
-    }
-    #endregion
-
-    #region PropOperator
-    /// <summary>
-    /// Operator used to test for the presence of a named Property
-    /// on an object and optionally apply further tests to the
-    /// value of that property.
-    /// </summary>
-    public class PropOperator : SelfResolvingOperator
-    {
-        private string name;
-
-        /// <summary>
-        /// Gets the name of the property to which the operator applies
-        /// </summary>
-        public string Name
-        {
-            get { return name; }
-        }
-
-        /// <summary>
-        /// Constructs a PropOperator for a particular named property
-        /// </summary>
-        public PropOperator(string name)
-        {
-            this.name = name;
-
-            // Prop stacks on anything and allows only 
-            // prefix operators to stack on it.
-            this.left_precedence = this.right_precedence = 1;
-        }
-
-        /// <summary>
-        /// Reduce produces a constraint from the operator and 
-        /// any arguments. It takes the arguments from the constraint 
-        /// stack and pushes the resulting constraint on it.
-        /// </summary>
-        /// <param name="stack"></param>
-        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
-        {
-            if (RightContext == null || RightContext is BinaryOperator)
-                stack.Push(new PropertyExistsConstraint(name));
-            else
-                stack.Push(new PropertyConstraint(name, stack.Pop()));
-        }
-    }
-    #endregion
-
-    #region AttributeOperator
-    /// <summary>
-    /// Operator that tests for the presence of a particular attribute
-    /// on a type and optionally applies further tests to the attribute.
-    /// </summary>
-    public class AttributeOperator : SelfResolvingOperator
-    {
-        private Type type;
-
-        /// <summary>
-        /// Construct an AttributeOperator for a particular Type
-        /// </summary>
-        /// <param name="type">The Type of attribute tested</param>
-        public AttributeOperator(Type type)
-        {
-            this.type = type;
-
-            // Attribute stacks on anything and allows only 
-            // prefix operators to stack on it.
-            this.left_precedence = this.right_precedence = 1;
-        }
-
-        /// <summary>
-        /// Reduce produces a constraint from the operator and 
-        /// any arguments. It takes the arguments from the constraint 
-        /// stack and pushes the resulting constraint on it.
-        /// </summary>
-        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
-        {
-            if (RightContext == null || RightContext is BinaryOperator)
-                stack.Push(new AttributeExistsConstraint(type));
-            else
-                stack.Push(new AttributeConstraint(type, stack.Pop()));
-        }
-    }
-    #endregion
-
-    #region ThrowsOperator
-    /// <summary>
-    /// Operator that tests that an exception is thrown and
-    /// optionally applies further tests to the exception.
-    /// </summary>
-    public class ThrowsOperator : SelfResolvingOperator
-    {
-        /// <summary>
-        /// Construct a ThrowsOperator
-        /// </summary>
-        public ThrowsOperator()
-        {
-            // ThrowsOperator stacks on everything but
-            // it's always the first item on the stack
-            // anyway. It is evaluated last of all ops.
-            this.left_precedence = 1;
-            this.right_precedence = 100;
-        }
-
-        /// <summary>
-        /// Reduce produces a constraint from the operator and 
-        /// any arguments. It takes the arguments from the constraint 
-        /// stack and pushes the resulting constraint on it.
-        /// </summary>
-        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
-        {
-            if (RightContext == null || RightContext is BinaryOperator)
-                stack.Push(new ThrowsConstraint(null));
-            else
-                stack.Push(new ThrowsConstraint(stack.Pop()));
-        }
-    }
-    #endregion
-
-    #endregion
-
-    #endregion
-
-    #region Binary Operators
-
-    #region BinaryOperator
-    /// <summary>
-    /// Abstract base class for all binary operators
-    /// </summary>
-    public abstract class BinaryOperator : ConstraintOperator
-    {
-        /// <summary>
-        /// Reduce produces a constraint from the operator and 
-        /// any arguments. It takes the arguments from the constraint 
-        /// stack and pushes the resulting constraint on it.
-        /// </summary>
-        /// <param name="stack"></param>
-        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
-        {
-            Constraint right = stack.Pop();
-            Constraint left = stack.Pop();
-            stack.Push(ApplyOperator(left, right));
-        }
-
-        /// <summary>
-        /// Gets the left precedence of the operator
-        /// </summary>
-        public override int LeftPrecedence
-        {
-            get
-            {
-                return RightContext is CollectionOperator
-                    ? base.LeftPrecedence + 10
-                    : base.LeftPrecedence;
-            }
-        }
-
-        /// <summary>
-        /// Gets the right precedence of the operator
-        /// </summary>
-        public override int RightPrecedence
-        {
-            get
-            {
-                return RightContext is CollectionOperator
-                    ? base.RightPrecedence + 10
-                    : base.RightPrecedence;
-            }
-        }
-
-        /// <summary>
-        /// Abstract method that produces a constraint by applying
-        /// the operator to its left and right constraint arguments.
-        /// </summary>
-        public abstract Constraint ApplyOperator(Constraint left, Constraint right);
-    }
-    #endregion
-
-    #region AndOperator
-    /// <summary>
-    /// Operator that requires both it's arguments to succeed
-    /// </summary>
-    public class AndOperator : BinaryOperator
-    {
-        /// <summary>
-        /// Construct an AndOperator
-        /// </summary>
-        public AndOperator()
-        {
-            this.left_precedence = this.right_precedence = 2;
-        }
-
-        /// <summary>
-        /// Apply the operator to produce an AndConstraint
-        /// </summary>
-        public override Constraint ApplyOperator(Constraint left, Constraint right)
-        {
-            return new AndConstraint(left, right);
-        }
-    }
-    #endregion
-
-    #region OrOperator
-    /// <summary>
-    /// Operator that requires at least one of it's arguments to succeed
-    /// </summary>
-    public class OrOperator : BinaryOperator
-    {
-        /// <summary>
-        /// Construct an OrOperator
-        /// </summary>
-        public OrOperator()
-        {
-            this.left_precedence = this.right_precedence = 3;
-        }
-
-        /// <summary>
-        /// Apply the operator to produce an OrConstraint
-        /// </summary>
-        public override Constraint ApplyOperator(Constraint left, Constraint right)
-        {
-            return new OrConstraint(left, right);
-        }
-    }
-    #endregion
-
-    #endregion
-}
diff --git a/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs b/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
index 5f2fec3..bf8fb61 100644
--- a/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ContainsConstraint.cs
@@ -1,158 +1,166 @@
-// ****************************************************************
-// Copyright 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
-{
-	// TODO Needs tests
-	/// <summary>
-	/// ContainsConstraint tests a whether a string contains a substring
-	/// or a collection contains an object. It postpones the decision of
-	/// which test to use until the type of the actual argument is known.
-	/// This allows testing whether a string is contained in a collection
-	/// or as a substring of another string using the same syntax.
-	/// </summary>
-	public class ContainsConstraint : Constraint
-	{
-		object expected;
-		Constraint realConstraint;
-        bool ignoreCase;
-
-        private EqualityAdapter adapter = null;
-
-		private Constraint RealConstraint
-		{
-			get 
-			{
-				if ( realConstraint == null )
-				{
-                    if (actual is string)
-                    {
-                        StringConstraint constraint = new SubstringConstraint((string)expected);
-                        if (this.ignoreCase)
-                            constraint = constraint.IgnoreCase;
-                        this.realConstraint = constraint;
-                    }
-                    else
-					{
-                        CollectionContainsConstraint constraint = new CollectionContainsConstraint(expected);
-						
-						if (this.adapter != null)
-							constraint.comparer.ExternalComparers.Add(adapter);
-							
-						this.realConstraint = constraint;
-					}
-				}
-				
-				return realConstraint;
-			}
-			set 
-			{ 
-				realConstraint = value; 
-			}
-		}
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ContainsConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected.</param>
-		public ContainsConstraint( object expected )
-			: base(expected)
-		{
-			this.expected = expected;
-		}
-
-        /// <summary>
-        /// Flag the constraint to ignore case and return self.
-        /// </summary>
-        public ContainsConstraint IgnoreCase
-        {
-            get { this.ignoreCase = true; return this; }
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-		public override bool Matches(object actual)
-		{
-            this.actual = actual;
-			return this.RealConstraint.Matches( actual );
-		}
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			this.RealConstraint.WriteDescriptionTo(writer);
-		}
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public ContainsConstraint Using(IComparer comparer)
-        {
-            this.adapter = EqualityAdapter.For(comparer);
-            return this;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public ContainsConstraint Using<T>(IComparer<T> comparer)
-        {
-            this.adapter = EqualityAdapter.For(comparer);
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied Comparison object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public ContainsConstraint Using<T>(Comparison<T> comparer)
-        {
-            this.adapter = EqualityAdapter.For(comparer);
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IEqualityComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public ContainsConstraint Using(IEqualityComparer comparer)
-        {
-            this.adapter = EqualityAdapter.For(comparer);
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IEqualityComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public ContainsConstraint Using<T>(IEqualityComparer<T> comparer)
-        {
-            this.adapter = EqualityAdapter.For(comparer);
-            return this;
-        }
-#endif
-	}
-}
+// ****************************************************************
+// Copyright 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
+{
+	// TODO Needs tests
+	/// <summary>
+	/// ContainsConstraint tests a whether a string contains a substring
+	/// or a collection contains an object. It postpones the decision of
+	/// which test to use until the type of the actual argument is known.
+	/// This allows testing whether a string is contained in a collection
+	/// or as a substring of another string using the same syntax.
+	/// </summary>
+	public class ContainsConstraint : Constraint
+	{
+		readonly object expected;
+		Constraint realConstraint;
+        bool ignoreCase;
+
+#if CLR_2_0 || CLR_4_0
+        private List<EqualityAdapter> equalityAdapters = new List<EqualityAdapter>();
+#else
+        private ArrayList equalityAdapters = new ArrayList();
+#endif
+
+        private Constraint RealConstraint
+		{
+			get 
+			{
+				if ( realConstraint == null )
+				{
+                    if (actual is string)
+                    {
+                        StringConstraint constraint = new SubstringConstraint((string)expected);
+                        if (this.ignoreCase)
+                            constraint = constraint.IgnoreCase;
+                        this.realConstraint = constraint;
+                    }
+                    else
+					{
+                        CollectionItemsEqualConstraint constraint = new CollectionContainsConstraint(expected);
+						
+						foreach (EqualityAdapter adapter in equalityAdapters)
+							constraint = constraint.Using(adapter);
+							
+						this.realConstraint = constraint;
+					}
+				}
+				
+				return realConstraint;
+			}
+			set 
+			{ 
+				realConstraint = value; 
+			}
+		}
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ContainsConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected.</param>
+		public ContainsConstraint( object expected ) : base(expected)
+		{
+			this.expected = expected;
+		}
+
+        /// <summary>
+        /// Flag the constraint to ignore case and return self.
+        /// </summary>
+        public ContainsConstraint IgnoreCase
+        {
+            get { this.ignoreCase = true; return this; }
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+		public override bool Matches(object actual)
+		{
+            this.actual = actual;
+			return this.RealConstraint.Matches( actual );
+		}
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+		public override void WriteDescriptionTo(MessageWriter writer)
+		{
+			this.RealConstraint.WriteDescriptionTo(writer);
+		}
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using(IComparer comparer)
+        {
+            return AddAdapter(EqualityAdapter.For(comparer));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using<T>(IComparer<T> comparer)
+        {
+            return AddAdapter(EqualityAdapter.For(comparer));
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied Comparison object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using<T>(Comparison<T> comparer)
+        {
+            return AddAdapter(EqualityAdapter.For(comparer));
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using(IEqualityComparer comparer)
+        {
+            return AddAdapter(EqualityAdapter.For(comparer));
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public ContainsConstraint Using<T>(IEqualityComparer<T> comparer)
+        {
+            return AddAdapter(EqualityAdapter.For(comparer));
+        }
+#endif
+
+        #region Helper Methods
+
+        private ContainsConstraint AddAdapter(EqualityAdapter adapter)
+        {
+            this.equalityAdapters.Add(adapter);
+            return this;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs b/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
index 40ee24e..aec8325 100644
--- a/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/DelayedConstraint.cs
@@ -1,188 +1,209 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Threading;
-
-namespace NUnit.Framework.Constraints
-{
-    ///<summary>
-    /// Applies a delay to the match so that a match can be evaluated in the future.
-    ///</summary>
-    public class DelayedConstraint : PrefixConstraint
-    {
-        private readonly int delayInMilliseconds;
-        private readonly int pollingInterval;
-
-        ///<summary>
-        /// Creates a new DelayedConstraint
-        ///</summary>
-        ///<param name="baseConstraint">The inner constraint two decorate</param>
-        ///<param name="delayInMilliseconds">The time interval after which the match is performed</param>
-        ///<exception cref="InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
-        public DelayedConstraint(Constraint baseConstraint, int delayInMilliseconds)
-            : this(baseConstraint, delayInMilliseconds, 0) { }
-
-        ///<summary>
-        /// Creates a new DelayedConstraint
-        ///</summary>
-        ///<param name="baseConstraint">The inner constraint two decorate</param>
-        ///<param name="delayInMilliseconds">The time interval after which the match is performed</param>
-        ///<param name="pollingInterval">The time interval used for polling</param>
-        ///<exception cref="InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
-        public DelayedConstraint(Constraint baseConstraint, int delayInMilliseconds, int pollingInterval)
-            : base(baseConstraint)
-        {
-            if (delayInMilliseconds < 0)
-                throw new ArgumentException("Cannot check a condition in the past", "delayInMilliseconds");
-
-            this.delayInMilliseconds = delayInMilliseconds;
-            this.pollingInterval = pollingInterval;
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
-        public override bool Matches(object actual)
-        {
-            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);
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a delegate
-        /// </summary>
-        /// <param name="del">The delegate whose value is to be tested</param>
-        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
-        public override bool Matches(ActualValueDelegate del)
-        {
-			int remainingDelay = delayInMilliseconds;
-
-			while (pollingInterval > 0 && pollingInterval < remainingDelay)
-			{
-				remainingDelay -= pollingInterval;
-				Thread.Sleep(pollingInterval);
-				this.actual = del();
-                try
-                {
-                    if (baseConstraint.Matches(actual))
-                        return true;
-                }
-                catch (Exception)
-                {
-                    // Ignore any exceptions when polling
-                }
-			}
-
-			if ( remainingDelay > 0 )
-				Thread.Sleep(remainingDelay);
-			this.actual = del();
-			return baseConstraint.Matches(actual);
-        }
-
-#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
-        /// calling the base constraint with the dereferenced value.
-        /// </summary>
-        /// <param name="actual">A reference to the value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches<T>(ref T actual)
-        {
-            int remainingDelay = delayInMilliseconds;
-
-            while (pollingInterval > 0 && pollingInterval < remainingDelay)
-            {
-                remainingDelay -= pollingInterval;
-                Thread.Sleep(pollingInterval);
-                this.actual = actual;
-                try
-                {
-                    if (baseConstraint.Matches(actual))
-                        return true;
-                }
-                catch (Exception)
-                {
-                    // Ignore any exceptions when polling
-                }
-            }
-
-            if ( remainingDelay > 0 )
-                Thread.Sleep(remainingDelay);
-            this.actual = actual;
-            return baseConstraint.Matches(actual);
-        }
-#else
-		/// <summary>
-		/// Test whether the constraint is satisfied by a given boolean reference.
-		/// Overridden to wait for the specified delay period before
-		/// calling the base constraint with the dereferenced value.
-		/// </summary>
-		/// <param name="actual">A reference to the value to be tested</param>
-		/// <returns>True for success, false for failure</returns>
-		public override bool Matches(ref bool actual)
-		{
-			int remainingDelay = delayInMilliseconds;
-
-			while (pollingInterval > 0 && pollingInterval < remainingDelay)
-			{
-				remainingDelay -= pollingInterval;
-				Thread.Sleep(pollingInterval);
-				this.actual = actual;
-				if (baseConstraint.Matches(actual))
-					return true;
-			}
-
-			if ( remainingDelay > 0 )
-				Thread.Sleep(remainingDelay);
-			this.actual = actual;
-			return baseConstraint.Matches(actual);
-		}
-#endif
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            baseConstraint.WriteDescriptionTo(writer);
-            writer.Write(string.Format(" after {0} millisecond delay", delayInMilliseconds));
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a MessageWriter.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            baseConstraint.WriteActualValueTo(writer);
-        }
-
-        /// <summary>
-        /// Returns the string representation of the constraint.
-        /// </summary>
-        protected override string GetStringRepresentation()
-        {
-            return string.Format("<after {0} {1}>", delayInMilliseconds, baseConstraint);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Threading;
+
+namespace NUnit.Framework.Constraints
+{
+    ///<summary>
+    /// Applies a delay to the match so that a match can be evaluated in the future.
+    ///</summary>
+    public class DelayedConstraint : PrefixConstraint
+    {
+        private readonly int delayInMilliseconds;
+        private readonly int pollingInterval;
+
+        ///<summary>
+        /// Creates a new DelayedConstraint
+        ///</summary>
+        ///<param name="baseConstraint">The inner constraint two decorate</param>
+        ///<param name="delayInMilliseconds">The time interval after which the match is performed</param>
+        ///<exception cref="InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        public DelayedConstraint(Constraint baseConstraint, int delayInMilliseconds)
+            : this(baseConstraint, delayInMilliseconds, 0) { }
+
+        ///<summary>
+        /// Creates a new DelayedConstraint
+        ///</summary>
+        ///<param name="baseConstraint">The inner constraint two decorate</param>
+        ///<param name="delayInMilliseconds">The time interval after which the match is performed</param>
+        ///<param name="pollingInterval">The time interval used for polling</param>
+        ///<exception cref="InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        public DelayedConstraint(Constraint baseConstraint, int delayInMilliseconds, int pollingInterval)
+            : base(baseConstraint)
+        {
+            if (delayInMilliseconds < 0)
+                throw new ArgumentException("Cannot check a condition in the past", "delayInMilliseconds");
+
+            this.delayInMilliseconds = delayInMilliseconds;
+            this.pollingInterval = pollingInterval;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
+        public override bool Matches(object actual)
+        {
+            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);
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a delegate
+        /// </summary>
+        /// <param name="del">The delegate whose value is to be tested</param>
+        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
+#if CLR_2_0 || CLR_4_0
+        public override bool Matches<T>(ActualValueDelegate<T> del)
+#else
+        public override bool Matches(ActualValueDelegate del)
+#endif
+        {
+			int remainingDelay = delayInMilliseconds;
+
+			while (pollingInterval > 0 && pollingInterval < remainingDelay)
+			{
+				remainingDelay -= pollingInterval;
+				Thread.Sleep(pollingInterval);
+				this.actual = InvokeDelegate(del);
+                try
+                {
+                    if (baseConstraint.Matches(actual))
+                        return true;
+                }
+                catch
+                {
+                    // Ignore any exceptions when polling
+                }
+			}
+
+			if (remainingDelay > 0)
+				Thread.Sleep(remainingDelay);
+
+	        this.actual = InvokeDelegate(del);
+			return baseConstraint.Matches(actual);
+        }
+
+#if CLR_2_0 || CLR_4_0
+	    private static object InvokeDelegate<T>(ActualValueDelegate<T> del)
+	    {
+			if(AsyncInvocationRegion.IsAsyncOperation(del))
+				using (AsyncInvocationRegion region = AsyncInvocationRegion.Create(del))
+					return region.WaitForPendingOperationsToComplete(del());
+
+		    return del();
+	    }
+#else
+		private static object InvokeDelegate(ActualValueDelegate del)
+	    {
+		    return del();
+	    }
+#endif
+
+#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
+        /// calling the base constraint with the dereferenced value.
+        /// </summary>
+        /// <param name="actual">A reference to the value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches<T>(ref T actual)
+        {
+            int remainingDelay = delayInMilliseconds;
+
+            while (pollingInterval > 0 && pollingInterval < remainingDelay)
+            {
+                remainingDelay -= pollingInterval;
+                Thread.Sleep(pollingInterval);
+                this.actual = actual;
+                try
+                {
+                    if (baseConstraint.Matches(actual))
+                        return true;
+                }
+                catch (Exception)
+                {
+                    // Ignore any exceptions when polling
+                }
+            }
+
+            if ( remainingDelay > 0 )
+                Thread.Sleep(remainingDelay);
+            this.actual = actual;
+            return baseConstraint.Matches(actual);
+        }
+#else
+		/// <summary>
+		/// Test whether the constraint is satisfied by a given boolean reference.
+		/// Overridden to wait for the specified delay period before
+		/// calling the base constraint with the dereferenced value.
+		/// </summary>
+		/// <param name="actual">A reference to the value to be tested</param>
+		/// <returns>True for success, false for failure</returns>
+		public override bool Matches(ref bool actual)
+		{
+			int remainingDelay = delayInMilliseconds;
+
+			while (pollingInterval > 0 && pollingInterval < remainingDelay)
+			{
+				remainingDelay -= pollingInterval;
+				Thread.Sleep(pollingInterval);
+				this.actual = actual;
+				if (baseConstraint.Matches(actual))
+					return true;
+			}
+
+			if ( remainingDelay > 0 )
+				Thread.Sleep(remainingDelay);
+			this.actual = actual;
+			return baseConstraint.Matches(actual);
+		}
+#endif
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            baseConstraint.WriteDescriptionTo(writer);
+            writer.Write(string.Format(" after {0} millisecond delay", delayInMilliseconds));
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a MessageWriter.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            baseConstraint.WriteActualValueTo(writer);
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<after {0} {1}>", delayInMilliseconds, baseConstraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/DirectoryConstraints.cs b/src/NUnitFramework/framework/Constraints/DirectoryConstraints.cs
deleted file mode 100644
index 95dd845..0000000
--- a/src/NUnitFramework/framework/Constraints/DirectoryConstraints.cs
+++ /dev/null
@@ -1,68 +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 System.Collections;
-using System.IO;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// EmptyDirectoryConstraint is used to test that a directory is empty
-    /// </summary>
-    public class EmptyDirectoryContraint : Constraint
-    {
-        private int files = 0;
-        private int subdirs = 0;
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            DirectoryInfo dirInfo = actual as DirectoryInfo;
-            if (dirInfo == null)
-                throw new ArgumentException("The actual value must be a DirectoryInfo", "actual");
-
-            files = dirInfo.GetFiles().Length;
-            subdirs = dirInfo.GetDirectories().Length;
-
-            return files == 0 && subdirs == 0;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write( "An empty directory" );
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. The default implementation simply writes
-        /// the raw value of actual, leaving it to the writer to
-        /// perform any formatting.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            DirectoryInfo dir = actual as DirectoryInfo;
-            if (dir == null)
-                base.WriteActualValueTo(writer);
-            else
-            {
-                writer.WriteActualValue(dir);
-                writer.Write(" with {0} files and {1} directories", files, subdirs);
-            }
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/Constraints/EmptyCollectionConstraint.cs b/src/NUnitFramework/framework/Constraints/EmptyCollectionConstraint.cs
new file mode 100644
index 0000000..d3a5639
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/EmptyCollectionConstraint.cs
@@ -0,0 +1,35 @@
+// ****************************************************************
+// Copyright 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.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EmptyCollectionConstraint tests whether a collection is empty. 
+    /// </summary>
+    public class EmptyCollectionConstraint : CollectionConstraint
+    {
+        /// <summary>
+        /// Check that the collection is empty
+        /// </summary>
+        /// <param name="collection"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable collection)
+        {
+            return IsEmpty(collection);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("<empty>");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs b/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
index 9a35fcb..b4c7404 100644
--- a/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/EmptyConstraint.cs
@@ -1,56 +1,55 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-	/// <summary>
-	/// EmptyConstraint tests a whether a string or collection is empty,
-	/// postponing the decision about which test is applied until the
-	/// type of the actual argument is known.
-	/// </summary>
-	public class EmptyConstraint : Constraint
-	{
-		private Constraint RealConstraint
-		{
-			get 
-			{
-                if (actual is string)
-                    return new EmptyStringConstraint();
-                else if (actual is System.IO.DirectoryInfo)
-                    return new EmptyDirectoryContraint();
-                else
-					return new EmptyCollectionConstraint();
-			}
-		}
-		
-		/// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-		public override bool Matches(object actual)
-		{
-			this.actual = actual;
-
-            if (actual == null)
-                throw new ArgumentException("The actual value must be a non-null string, IEnumerable or DirectoryInfo", "actual");
-
-			return this.RealConstraint.Matches( actual );
-		}
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			this.RealConstraint.WriteDescriptionTo( writer );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// EmptyConstraint tests a whether a string or collection is empty,
+	/// postponing the decision about which test is applied until the
+	/// type of the actual argument is known.
+	/// </summary>
+	public class EmptyConstraint : Constraint
+	{
+		private Constraint RealConstraint
+		{
+			get 
+			{
+                if (actual is string)
+                    return new EmptyStringConstraint();
+                else if (actual is System.IO.DirectoryInfo)
+                    return new EmptyDirectoryConstraint();
+                else
+					return new EmptyCollectionConstraint();
+			}
+		}
+		
+		/// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+		public override bool Matches(object actual)
+		{
+			this.actual = actual;
+
+            if (actual == null)
+                throw new ArgumentException("The actual value must be a non-null string, IEnumerable or DirectoryInfo", "actual");
+
+			return this.RealConstraint.Matches( actual );
+		}
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+		public override void WriteDescriptionTo(MessageWriter writer)
+		{
+			this.RealConstraint.WriteDescriptionTo( writer );
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Constraints/EmptyDirectoryConstraint.cs b/src/NUnitFramework/framework/Constraints/EmptyDirectoryConstraint.cs
new file mode 100644
index 0000000..009359c
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/EmptyDirectoryConstraint.cs
@@ -0,0 +1,68 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.IO;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EmptyDirectoryConstraint is used to test that a directory is empty
+    /// </summary>
+    public class EmptyDirectoryConstraint : Constraint
+    {
+        private int files = 0;
+        private int subdirs = 0;
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            DirectoryInfo dirInfo = actual as DirectoryInfo;
+            if (dirInfo == null)
+                throw new ArgumentException("The actual value must be a DirectoryInfo", "actual");
+
+            files = dirInfo.GetFiles().Length;
+            subdirs = dirInfo.GetDirectories().Length;
+
+            return files == 0 && subdirs == 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write( "An empty directory" );
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            DirectoryInfo dir = actual as DirectoryInfo;
+            if (dir == null)
+                base.WriteActualValueTo(writer);
+            else
+            {
+                writer.WriteActualValue(dir);
+                writer.Write(" with {0} files and {1} directories", files, subdirs);
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/EmptyStringConstraint.cs b/src/NUnitFramework/framework/Constraints/EmptyStringConstraint.cs
new file mode 100644
index 0000000..ffdda43
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/EmptyStringConstraint.cs
@@ -0,0 +1,35 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EmptyStringConstraint tests whether a string is empty.
+    /// </summary>
+    public class EmptyStringConstraint : Constraint
+    {
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            return actual as string == string.Empty;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("<empty>");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/EndsWithConstraint.cs b/src/NUnitFramework/framework/Constraints/EndsWithConstraint.cs
new file mode 100644
index 0000000..6dcde32
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/EndsWithConstraint.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EndsWithConstraint can test whether a string ends
+    /// with an expected substring.
+    /// </summary>
+    public class EndsWithConstraint : StringConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:EndsWithConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        public EndsWithConstraint(string expected) : base(expected) { }
+
+        /// <summary>
+        /// Test whether the constraint is matched by the actual value.
+        /// This is a template method, which calls the IsMatch method
+        /// of the derived class.
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool Matches(string actual)
+        {
+            if (this.caseInsensitive)
+                return actual.ToLower().EndsWith(expected.ToLower());
+            else
+                return actual.EndsWith(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("String ending with");
+            writer.WriteExpectedValue(expected);
+            if (this.caseInsensitive)
+                writer.WriteModifier("ignoring case");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/EqualConstraint.cs b/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
index 61b4cc6..e25ac43 100644
--- a/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/EqualConstraint.cs
@@ -1,556 +1,557 @@
-// ****************************************************************
-// Copyright 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.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// EqualConstraint is able to compare an actual value with the
-    /// expected value provided in its constructor. Two objects are 
-    /// considered equal if both are null, or if both have the same 
-    /// value. NUnit has special semantics for some object types.
-    /// </summary>
-    public class EqualConstraint : Constraint
-    {
-        #region Static and Instance Fields
-
-		private readonly object expected;
-
-        private Tolerance tolerance = Tolerance.Empty;
-
-        /// <summary>
-        /// If true, strings in error messages will be clipped
-        /// </summary>
-        private bool clipStrings = true;
-
-        /// <summary>
-        /// NUnitEqualityComparer used to test equality.
-        /// </summary>
-        private NUnitEqualityComparer comparer = new NUnitEqualityComparer();
-
-        #region Message Strings
-        private static readonly string StringsDiffer_1 =
-			"String lengths are both {0}. Strings differ at index {1}.";
-		private static readonly string StringsDiffer_2 =
-			"Expected string length {0} but was {1}. Strings differ at index {2}.";
-		private static readonly string StreamsDiffer_1 =
-			"Stream lengths are both {0}. Streams differ at offset {1}.";
-		private static readonly string StreamsDiffer_2 =
-			"Expected Stream length {0} but was {1}.";// Streams differ at offset {2}.";
-		private static readonly string CollectionType_1 =
-			"Expected and actual are both {0}";
-		private static readonly string CollectionType_2 =
-			"Expected is {0}, actual is {1}";
-		private static readonly string ValuesDiffer_1 =
-			"Values differ at index {0}";
-		private static readonly string ValuesDiffer_2 =
-			"Values differ at expected index {0}, actual index {1}";
-		
-        #endregion
-
-        #endregion
-
-        #region Constructor
-        /// <summary>
-        /// Initializes a new instance of the <see cref="EqualConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected value.</param>
-        public EqualConstraint(object expected) : base(expected)
-        {
-            this.expected = expected;
-        }
-        #endregion
-
-        #region Constraint Modifiers
-        /// <summary>
-        /// Flag the constraint to ignore case and return self.
-        /// </summary>
-        public EqualConstraint IgnoreCase
-        {
-            get
-            {
-                comparer.IgnoreCase = true;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Flag the constraint to suppress string clipping 
-        /// and return self.
-        /// </summary>
-        public EqualConstraint NoClip
-        {
-            get
-            {
-                clipStrings = false;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Flag the constraint to compare arrays as collections
-        /// and return self.
-        /// </summary>
-        public EqualConstraint AsCollection
-        {
-            get
-            {
-                comparer.CompareAsCollection = true;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Flag the constraint to use a tolerance when determining equality.
-        /// </summary>
-        /// <param name="amount">Tolerance value to be used</param>
-        /// <returns>Self.</returns>
-        public EqualConstraint Within(object amount)
-        {
-            if (!tolerance.IsEmpty)
-                throw new InvalidOperationException("Within modifier may appear only once in a constraint expression");
-
-            tolerance = new Tolerance(amount);
-            return this;
-        }
-
-        /// <summary>
-        /// Switches the .Within() modifier to interpret its tolerance as
-        /// a distance in representable values (see remarks).
-        /// </summary>
-        /// <returns>Self.</returns>
-        /// <remarks>
-        /// Ulp stands for "unit in the last place" and describes the minimum
-        /// amount a given value can change. For any integers, an ulp is 1 whole
-        /// digit. For floating point values, the accuracy of which is better
-        /// for smaller numbers and worse for larger numbers, an ulp depends
-        /// on the size of the number. Using ulps for comparison of floating
-        /// point results instead of fixed tolerances is safer because it will
-        /// automatically compensate for the added inaccuracy of larger numbers.
-        /// </remarks>
-        public EqualConstraint Ulps
-        {
-            get
-            {
-                tolerance = tolerance.Ulps;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Switches the .Within() modifier to interpret its tolerance as
-        /// a percentage that the actual values is allowed to deviate from
-        /// the expected value.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Percent
-        {
-            get
-            {
-                tolerance = tolerance.Percent;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Causes the tolerance to be interpreted as a TimeSpan in days.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Days
-        {
-            get
-            {
-                tolerance = tolerance.Days;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Causes the tolerance to be interpreted as a TimeSpan in hours.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Hours
-        {
-            get
-            {
-                tolerance = tolerance.Hours;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Causes the tolerance to be interpreted as a TimeSpan in minutes.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Minutes
-        {
-            get
-            {
-                tolerance = tolerance.Minutes;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Causes the tolerance to be interpreted as a TimeSpan in seconds.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Seconds
-        {
-            get
-            {
-                tolerance = tolerance.Seconds;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Causes the tolerance to be interpreted as a TimeSpan in milliseconds.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Milliseconds
-        {
-            get
-            {
-                tolerance = tolerance.Milliseconds;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Causes the tolerance to be interpreted as a TimeSpan in clock ticks.
-        /// </summary>
-        /// <returns>Self</returns>
-        public EqualConstraint Ticks
-        {
-            get
-            {
-                tolerance = tolerance.Ticks;
-                return this;
-            }
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        [Obsolete("Replace with 'Using'")]
-        public EqualConstraint Comparer(IComparer comparer)
-        {
-            return Using(comparer);
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public EqualConstraint Using(IComparer comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Flag the constraint to use the supplied IComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public EqualConstraint Using<T>(IComparer<T> comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For( comparer ));
-            return this;
-        }
-
-                /// <summary>
-        /// Flag the constraint to use the supplied Comparison object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public EqualConstraint Using<T>(Comparison<T> comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For( comparer ));
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IEqualityComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public EqualConstraint Using(IEqualityComparer comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-
-        /// <summary>
-        /// Flag the constraint to use the supplied IEqualityComparer object.
-        /// </summary>
-        /// <param name="comparer">The IComparer object to use.</param>
-        /// <returns>Self.</returns>
-        public EqualConstraint Using<T>(IEqualityComparer<T> comparer)
-        {
-            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
-            return this;
-        }
-#endif
-        #endregion
-
-        #region Public Methods
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            return comparer.AreEqual(expected, actual, ref tolerance);
-        }
-
-        /// <summary>
-        /// Write a failure message. Overridden to provide custom 
-        /// failure messages for EqualConstraint.
-        /// </summary>
-        /// <param name="writer">The MessageWriter to write to</param>
-        public override void WriteMessageTo(MessageWriter writer)
-        {
-            DisplayDifferences(writer, expected, actual, 0);
-        }
-
-
-        /// <summary>
-        /// Write description of this constraint
-        /// </summary>
-        /// <param name="writer">The MessageWriter to write to</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-			writer.WriteExpectedValue( expected );
-
-            if (tolerance != null && !tolerance.IsEmpty)
-			{
-				writer.WriteConnector("+/-");
-                writer.WriteExpectedValue(tolerance.Value);
-                if (tolerance.Mode != ToleranceMode.Linear)
-                    writer.Write(" {0}", tolerance.Mode);
-			}
-
-			if ( comparer.IgnoreCase )
-				writer.WriteModifier("ignoring case");
-        }
-
-        private void DisplayDifferences(MessageWriter writer, object expected, object actual, int depth)
-        {
-            if (expected is string && actual is string)
-                DisplayStringDifferences(writer, (string)expected, (string)actual);
-            else if (expected is ICollection && actual is ICollection)
-                DisplayCollectionDifferences(writer, (ICollection)expected, (ICollection)actual, depth);
-            else if (expected is 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 (tolerance != null)
-                writer.DisplayDifferences(expected, actual, tolerance);
-            else
-                writer.DisplayDifferences(expected, actual);
-        }
-        #endregion
-
-        #region DisplayStringDifferences
-        private void DisplayStringDifferences(MessageWriter writer, string expected, string actual)
-        {
-            int mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, comparer.IgnoreCase);
-
-            if (expected.Length == actual.Length)
-				writer.WriteMessageLine(StringsDiffer_1, expected.Length, mismatch);
-			else
-				writer.WriteMessageLine(StringsDiffer_2, expected.Length, actual.Length, mismatch);
-
-            writer.DisplayStringDifferences(expected, actual, mismatch, comparer.IgnoreCase, clipStrings);
-        }
-        #endregion
-
-		#region DisplayStreamDifferences
-		private void DisplayStreamDifferences(MessageWriter writer, Stream expected, Stream actual, int depth)
-		{
-			if ( expected.Length == actual.Length )
-			{
-				long offset = (long)comparer.FailurePoints[depth];
-				writer.WriteMessageLine(StreamsDiffer_1, expected.Length, offset);
-			}
-			else
-				writer.WriteMessageLine(StreamsDiffer_2, expected.Length, actual.Length);
-		}
-		#endregion
-
-        #region DisplayCollectionDifferences
-        /// <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="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)
-        {
-            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);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Displays a single line showing the types and sizes of the expected
-        /// 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="actual">The actual collection or array</param>
-        /// <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 ICollection && !(expected is Array))
-                sExpected += string.Format(" with {0} elements", ((ICollection)expected).Count);
-
-            string sActual = MsgUtils.GetTypeRepresentation(actual);
-            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);
-            else
-                writer.WriteMessageLine(indent, CollectionType_2, sExpected, sActual);
-        }
-
-        /// <summary>
-        /// Displays a single line showing the point in the expected and actual
-        /// 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="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, IEnumerable expected, IEnumerable actual, NUnitEqualityComparer.FailurePoint failurePoint, int indent)
-        {
-            Array expectedArray = expected as Array;
-            Array actualArray = actual as Array;
-
-            int expectedRank = expectedArray != null ? expectedArray.Rank : 1;
-            int actualRank = actualArray != null ? actualArray.Rank : 1;
-
-            bool useOneIndex = expectedRank == actualRank;
-
-            if (expectedArray != null && actualArray != null)
-                for (int r = 1; r < expectedRank && useOneIndex; r++)
-                    if (expectedArray.GetLength(r) != actualArray.GetLength(r))
-                        useOneIndex = false;
-
-            int[] expectedIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(expected, failurePoint.Position);
-            if (useOneIndex)
-            {
-                writer.WriteMessageLine(indent, ValuesDiffer_1, MsgUtils.GetArrayIndicesAsString(expectedIndices));
-            }
-            else
-            {
-                int[] actualIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(actual, failurePoint.Position);
-                writer.WriteMessageLine(indent, ValuesDiffer_2,
-                    MsgUtils.GetArrayIndicesAsString(expectedIndices), MsgUtils.GetArrayIndicesAsString(actualIndices));
-            }
-        }
-
-        private static object GetValueFromCollection(ICollection collection, int index)
-        {
-            Array array = collection as Array;
-
-            if (array != null && array.Rank > 1)
-                return array.GetValue(MsgUtils.GetArrayIndicesFromCollectionIndex(array, index));
-
-            if (collection is IList)
-                return ((IList)collection)[index];
-
-            foreach (object obj in collection)
-                if (--index < 0)
-                    return obj;
-
-            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
-    }
-}
+// ****************************************************************
+// Copyright 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.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EqualConstraint is able to compare an actual value with the
+    /// expected value provided in its constructor. Two objects are 
+    /// considered equal if both are null, or if both have the same 
+    /// value. NUnit has special semantics for some object types.
+    /// </summary>
+    public class EqualConstraint : Constraint
+    {
+        #region Static and Instance Fields
+
+		private readonly object expected;
+
+        private Tolerance tolerance = Tolerance.Empty;
+
+        /// <summary>
+        /// If true, strings in error messages will be clipped
+        /// </summary>
+        private bool clipStrings = true;
+
+        /// <summary>
+        /// NUnitEqualityComparer used to test equality.
+        /// </summary>
+        private NUnitEqualityComparer comparer = new NUnitEqualityComparer();
+
+        #region Message Strings
+        private static readonly string StringsDiffer_1 =
+			"String lengths are both {0}. Strings differ at index {1}.";
+		private static readonly string StringsDiffer_2 =
+			"Expected string length {0} but was {1}. Strings differ at index {2}.";
+		private static readonly string StreamsDiffer_1 =
+			"Stream lengths are both {0}. Streams differ at offset {1}.";
+		private static readonly string StreamsDiffer_2 =
+			"Expected Stream length {0} but was {1}.";// Streams differ at offset {2}.";
+		private static readonly string CollectionType_1 =
+			"Expected and actual are both {0}";
+		private static readonly string CollectionType_2 =
+			"Expected is {0}, actual is {1}";
+		private static readonly string ValuesDiffer_1 =
+			"Values differ at index {0}";
+		private static readonly string ValuesDiffer_2 =
+			"Values differ at expected index {0}, actual index {1}";
+		
+        #endregion
+
+        #endregion
+
+        #region Constructor
+        /// <summary>
+        /// Initializes a new instance of the <see cref="EqualConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected value.</param>
+        public EqualConstraint(object expected) : base(expected)
+        {
+            this.expected = expected;
+        }
+        #endregion
+
+        #region Constraint Modifiers
+        /// <summary>
+        /// Flag the constraint to ignore case and return self.
+        /// </summary>
+        public EqualConstraint IgnoreCase
+        {
+            get
+            {
+                comparer.IgnoreCase = true;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Flag the constraint to suppress string clipping 
+        /// and return self.
+        /// </summary>
+        public EqualConstraint NoClip
+        {
+            get
+            {
+                clipStrings = false;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Flag the constraint to compare arrays as collections
+        /// and return self.
+        /// </summary>
+        public EqualConstraint AsCollection
+        {
+            get
+            {
+                comparer.CompareAsCollection = true;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Flag the constraint to use a tolerance when determining equality.
+        /// </summary>
+        /// <param name="amount">Tolerance value to be used</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Within(object amount)
+        {
+            if (!tolerance.IsEmpty)
+                throw new InvalidOperationException("Within modifier may appear only once in a constraint expression");
+
+            tolerance = new Tolerance(amount);
+            return this;
+        }
+
+        /// <summary>
+        /// Switches the .Within() modifier to interpret its tolerance as
+        /// a distance in representable values (see remarks).
+        /// </summary>
+        /// <returns>Self.</returns>
+        /// <remarks>
+        /// Ulp stands for "unit in the last place" and describes the minimum
+        /// amount a given value can change. For any integers, an ulp is 1 whole
+        /// digit. For floating point values, the accuracy of which is better
+        /// for smaller numbers and worse for larger numbers, an ulp depends
+        /// on the size of the number. Using ulps for comparison of floating
+        /// point results instead of fixed tolerances is safer because it will
+        /// automatically compensate for the added inaccuracy of larger numbers.
+        /// </remarks>
+        public EqualConstraint Ulps
+        {
+            get
+            {
+                tolerance = tolerance.Ulps;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Switches the .Within() modifier to interpret its tolerance as
+        /// a percentage that the actual values is allowed to deviate from
+        /// the expected value.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Percent
+        {
+            get
+            {
+                tolerance = tolerance.Percent;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in days.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Days
+        {
+            get
+            {
+                tolerance = tolerance.Days;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in hours.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Hours
+        {
+            get
+            {
+                tolerance = tolerance.Hours;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in minutes.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Minutes
+        {
+            get
+            {
+                tolerance = tolerance.Minutes;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in seconds.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Seconds
+        {
+            get
+            {
+                tolerance = tolerance.Seconds;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in milliseconds.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Milliseconds
+        {
+            get
+            {
+                tolerance = tolerance.Milliseconds;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Causes the tolerance to be interpreted as a TimeSpan in clock ticks.
+        /// </summary>
+        /// <returns>Self</returns>
+        public EqualConstraint Ticks
+        {
+            get
+            {
+                tolerance = tolerance.Ticks;
+                return this;
+            }
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        [Obsolete("Replace with 'Using'")]
+        public EqualConstraint Comparer(IComparer comparer)
+        {
+            return Using(comparer);
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using(IComparer comparer)
+        {
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
+            return this;
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Flag the constraint to use the supplied IComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using<T>(IComparer<T> comparer)
+        {
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For( comparer ));
+            return this;
+        }
+
+                /// <summary>
+        /// Flag the constraint to use the supplied Comparison object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using<T>(Comparison<T> comparer)
+        {
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For( comparer ));
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using(IEqualityComparer comparer)
+        {
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
+            return this;
+        }
+
+        /// <summary>
+        /// Flag the constraint to use the supplied IEqualityComparer object.
+        /// </summary>
+        /// <param name="comparer">The IComparer object to use.</param>
+        /// <returns>Self.</returns>
+        public EqualConstraint Using<T>(IEqualityComparer<T> comparer)
+        {
+            this.comparer.ExternalComparers.Add(EqualityAdapter.For(comparer));
+            return this;
+        }
+#endif
+        #endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            return comparer.AreEqual(expected, actual, ref tolerance);
+        }
+
+        /// <summary>
+        /// Write a failure message. Overridden to provide custom 
+        /// failure messages for EqualConstraint.
+        /// </summary>
+        /// <param name="writer">The MessageWriter to write to</param>
+        public override void WriteMessageTo(MessageWriter writer)
+        {
+            DisplayDifferences(writer, expected, actual, 0);
+        }
+
+
+        /// <summary>
+        /// Write description of this constraint
+        /// </summary>
+        /// <param name="writer">The MessageWriter to write to</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+			writer.WriteExpectedValue( expected );
+
+            if (tolerance != null && !tolerance.IsEmpty)
+			{
+				writer.WriteConnector("+/-");
+                writer.WriteExpectedValue(tolerance.Value);
+                if (tolerance.Mode != ToleranceMode.Linear)
+                    writer.Write(" {0}", tolerance.Mode);
+			}
+
+			if ( comparer.IgnoreCase )
+				writer.WriteModifier("ignoring case");
+        }
+
+        private void DisplayDifferences(MessageWriter writer, object expected, object actual, int depth)
+        {
+            if (expected is string && actual is string)
+                DisplayStringDifferences(writer, (string)expected, (string)actual);
+            else if (expected is ICollection && actual is ICollection)
+                DisplayCollectionDifferences(writer, (ICollection)expected, (ICollection)actual, depth);
+            else if (expected is 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 (tolerance != null)
+                writer.DisplayDifferences(expected, actual, tolerance);
+            else
+                writer.DisplayDifferences(expected, actual);
+        }
+        #endregion
+
+        #region DisplayStringDifferences
+        private void DisplayStringDifferences(MessageWriter writer, string expected, string actual)
+        {
+            int mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, comparer.IgnoreCase);
+
+            if (expected.Length == actual.Length)
+				writer.WriteMessageLine(StringsDiffer_1, expected.Length, mismatch);
+			else
+				writer.WriteMessageLine(StringsDiffer_2, expected.Length, actual.Length, mismatch);
+
+            writer.DisplayStringDifferences(expected, actual, mismatch, comparer.IgnoreCase, clipStrings);
+        }
+        #endregion
+
+		#region DisplayStreamDifferences
+		private void DisplayStreamDifferences(MessageWriter writer, Stream expected, Stream actual, int depth)
+		{
+			if ( expected.Length == actual.Length )
+			{
+				FailurePoint fp = (FailurePoint)comparer.FailurePoints[depth];
+                long offset = fp.Position;
+				writer.WriteMessageLine(StreamsDiffer_1, expected.Length, offset);
+			}
+			else
+				writer.WriteMessageLine(StreamsDiffer_2, expected.Length, actual.Length);
+		}
+		#endregion
+
+        #region DisplayCollectionDifferences
+        /// <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="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)
+        {
+            DisplayTypesAndSizes(writer, expected, actual, depth);
+
+            if (comparer.FailurePoints.Count > depth)
+            {
+                FailurePoint failurePoint = (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);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Displays a single line showing the types and sizes of the expected
+        /// 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="actual">The actual collection or array</param>
+        /// <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 ICollection && !(expected is Array))
+                sExpected += string.Format(" with {0} elements", ((ICollection)expected).Count);
+
+            string sActual = MsgUtils.GetTypeRepresentation(actual);
+            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);
+            else
+                writer.WriteMessageLine(indent, CollectionType_2, sExpected, sActual);
+        }
+
+        /// <summary>
+        /// Displays a single line showing the point in the expected and actual
+        /// 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="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, IEnumerable expected, IEnumerable actual, FailurePoint failurePoint, int indent)
+        {
+            Array expectedArray = expected as Array;
+            Array actualArray = actual as Array;
+
+            int expectedRank = expectedArray != null ? expectedArray.Rank : 1;
+            int actualRank = actualArray != null ? actualArray.Rank : 1;
+
+            bool useOneIndex = expectedRank == actualRank;
+
+            if (expectedArray != null && actualArray != null)
+                for (int r = 1; r < expectedRank && useOneIndex; r++)
+                    if (expectedArray.GetLength(r) != actualArray.GetLength(r))
+                        useOneIndex = false;
+
+            int[] expectedIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(expected, failurePoint.Position);
+            if (useOneIndex)
+            {
+                writer.WriteMessageLine(indent, ValuesDiffer_1, MsgUtils.GetArrayIndicesAsString(expectedIndices));
+            }
+            else
+            {
+                int[] actualIndices = MsgUtils.GetArrayIndicesFromCollectionIndex(actual, failurePoint.Position);
+                writer.WriteMessageLine(indent, ValuesDiffer_2,
+                    MsgUtils.GetArrayIndicesAsString(expectedIndices), MsgUtils.GetArrayIndicesAsString(actualIndices));
+            }
+        }
+
+        private static object GetValueFromCollection(ICollection collection, int index)
+        {
+            Array array = collection as Array;
+
+            if (array != null && array.Rank > 1)
+                return array.GetValue(MsgUtils.GetArrayIndicesFromCollectionIndex(array, index));
+
+            if (collection is IList)
+                return ((IList)collection)[index];
+
+            foreach (object obj in collection)
+                if (--index < 0)
+                    return obj;
+
+            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)
+            {
+                FailurePoint failurePoint = (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 c0bb9dd..fa9c6bc 100644
--- a/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
+++ b/src/NUnitFramework/framework/Constraints/EqualityAdapter.cs
@@ -1,231 +1,225 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// EqualityAdapter class handles all equality comparisons
-    /// that use an IEqualityComparer, IEqualityComparer<T>
-    /// or a ComparisonAdapter.
-    /// </summary>
-    public abstract class EqualityAdapter
-    {
-        /// <summary>
-        /// Compares two objects, returning true if they are equal
-        /// </summary>
-        public abstract bool AreEqual(object x, object y);
-
-        /// <summary>
-        /// Returns true if the two objects can be compared by this adapter.
-        /// The base adapter cannot handle IEnumerables except for strings.
-        /// </summary>
-        public virtual bool CanCompare(object x, object y)
-        {
-            if (x is string && y is string)
-                return true;
-
-            if (x is IEnumerable || y is IEnumerable)
-                return false;
-
-            return true;
-        }
-
-        #region Nested IComparer Adapter
-
-        /// <summary>
-        /// Returns an EqualityAdapter that wraps an IComparer.
-        /// </summary>
-        public static EqualityAdapter For(IComparer comparer)
-        {
-            return new ComparerAdapter(comparer);
-        }
-
-        /// <summary>
-        /// EqualityAdapter that wraps an IComparer.
-        /// </summary>
-        class ComparerAdapter : EqualityAdapter
-        {
-            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 an IEqualityComparer.
-        /// </summary>
-        public static EqualityAdapter For(IEqualityComparer comparer)
-        {
-            return new EqualityComparerAdapter(comparer);
-        }
-
-        class EqualityComparerAdapter : EqualityAdapter
-        {
-            private IEqualityComparer comparer;
-
-            public EqualityComparerAdapter(IEqualityComparer comparer)
-            {
-                this.comparer = comparer;
-            }
-
-            public override bool AreEqual(object x, object y)
-            {
-                return comparer.Equals(x, y);
-            }
-        }
-
-        #endregion
-
-        #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)
-            {
-                return typeof(T).IsAssignableFrom(x.GetType())
-                    && typeof(T).IsAssignableFrom(y.GetType());
-            }
-
-            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 " + 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);
-            }
-        }
-
-        #endregion
-
-        #region Nested IComparer<T> Adapter
-
-        /// <summary>
-        /// Returns an EqualityAdapter that wraps an IComparer<T>.
-        /// </summary>
-        public static EqualityAdapter For<T>(IComparer<T> comparer)
-        {
-            return new ComparerAdapter<T>(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 AreEqual(object x, object y)
-            {
-                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
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// EqualityAdapter class handles all equality comparisons
+    /// that use an IEqualityComparer, IEqualityComparer<T>
+    /// or a ComparisonAdapter.
+    /// </summary>
+    public abstract class EqualityAdapter
+    {
+        /// <summary>
+        /// Compares two objects, returning true if they are equal
+        /// </summary>
+        public abstract bool AreEqual(object x, object y);
+
+        /// <summary>
+        /// Returns true if the two objects can be compared by this adapter.
+        /// The base adapter cannot handle IEnumerables except for strings.
+        /// </summary>
+        public virtual bool CanCompare(object x, object y)
+        {
+            if (x is string && y is string)
+                return true;
+
+            if (x is IEnumerable || y is IEnumerable)
+                return false;
+
+            return true;
+        }
+
+        #region Nested IComparer Adapter
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IComparer.
+        /// </summary>
+        public static EqualityAdapter For(IComparer comparer)
+        {
+            return new ComparerAdapter(comparer);
+        }
+
+        /// <summary>
+        /// EqualityAdapter that wraps an IComparer.
+        /// </summary>
+        class ComparerAdapter : EqualityAdapter
+        {
+            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 an IEqualityComparer.
+        /// </summary>
+        public static EqualityAdapter For(IEqualityComparer comparer)
+        {
+            return new EqualityComparerAdapter(comparer);
+        }
+
+        class EqualityComparerAdapter : EqualityAdapter
+        {
+            private IEqualityComparer comparer;
+
+            public EqualityComparerAdapter(IEqualityComparer comparer)
+            {
+                this.comparer = comparer;
+            }
+
+            public override bool AreEqual(object x, object y)
+            {
+                return comparer.Equals(x, y);
+            }
+        }
+
+        #endregion
+
+        #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)
+            {
+                return typeof(T).IsAssignableFrom(x.GetType())
+                    && typeof(T).IsAssignableFrom(y.GetType());
+            }
+
+            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 " + 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);
+            }
+        }
+
+        #endregion
+
+        #region Nested IComparer<T> Adapter
+
+        /// <summary>
+        /// Returns an EqualityAdapter that wraps an IComparer<T>.
+        /// </summary>
+        public static EqualityAdapter For<T>(IComparer<T> comparer)
+        {
+            return new ComparerAdapter<T>(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 AreEqual(object x, object y)
+            {
+                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
+    }
+
+    /// <summary>
+    /// EqualityAdapterList represents a list of EqualityAdapters
+    /// in a common class across platforms.
+    /// </summary>
+#if CLR_2_0 || CLR_4_0
+    class EqualityAdapterList : System.Collections.Generic.List<EqualityAdapter> { }
+#else
+    class EqualityAdapterList : ArrayList { }
+#endif
+}
diff --git a/src/NUnitFramework/framework/Constraints/ExactCountConstraint.cs b/src/NUnitFramework/framework/Constraints/ExactCountConstraint.cs
new file mode 100644
index 0000000..612fc7a
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ExactCountConstraint.cs
@@ -0,0 +1,76 @@
+// ****************************************************************
+// 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.Framework.Constraints
+{
+    /// <summary>
+    /// ExactCountConstraint 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);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ExactTypeConstraint.cs b/src/NUnitFramework/framework/Constraints/ExactTypeConstraint.cs
new file mode 100644
index 0000000..de2f828
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ExactTypeConstraint.cs
@@ -0,0 +1,47 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ExactTypeConstraint is used to test that an object
+    /// is of the exact type provided in the constructor
+    /// </summary>
+    public class ExactTypeConstraint : TypeConstraint
+    {
+        /// <summary>
+        /// Construct an ExactTypeConstraint for a given Type
+        /// </summary>
+        /// <param name="type">The expected Type.</param>
+        public ExactTypeConstraint(Type type)
+            : base(type)
+        {
+            this.DisplayName = "typeof";
+        }
+
+        /// <summary>
+        /// Test that an object is of the exact type specified
+        /// </summary>
+        /// <param name="actual">The actual value.</param>
+        /// <returns>True if the tested object is of the exact type provided, otherwise false.</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return actual != null && actual.GetType() == this.expectedType;
+        }
+
+        /// <summary>
+        /// Write the description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to use</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ExceptionTypeConstraint.cs b/src/NUnitFramework/framework/Constraints/ExceptionTypeConstraint.cs
new file mode 100644
index 0000000..620040c
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ExceptionTypeConstraint.cs
@@ -0,0 +1,41 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.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);
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/FailurePoint.cs b/src/NUnitFramework/framework/Constraints/FailurePoint.cs
new file mode 100644
index 0000000..f49cf24
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/FailurePoint.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Text;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <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;
+    }
+
+    /// <summary>
+    /// FailurePointList represents a set of FailurePoints
+    /// in a cross-platform way.
+    /// </summary>
+#if CLR_2_0 || CLR_4_0
+    class FailurePointList : System.Collections.Generic.List<FailurePoint> { }
+#else
+    class FailurePointList : System.Collections.ArrayList { }
+#endif
+
+}
diff --git a/src/NUnitFramework/framework/Constraints/FalseConstraint.cs b/src/NUnitFramework/framework/Constraints/FalseConstraint.cs
new file mode 100644
index 0000000..d6dc33b
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/FalseConstraint.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// FalseConstraint tests that the actual value is false
+    /// </summary>
+    public class FalseConstraint : BasicConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:FalseConstraint"/> class.
+        /// </summary>
+        public FalseConstraint() : base(false, "False") { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs b/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs
index dc173d5..8e59737 100644
--- a/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs
+++ b/src/NUnitFramework/framework/Constraints/FloatingPointNumerics.cs
@@ -1,238 +1,238 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-#if !NETCF_1_0
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace NUnit.Framework.Constraints
-{
-
-    /// <summary>Helper routines for working with floating point numbers</summary>
-    /// <remarks>
-    ///   <para>
-    ///     The floating point comparison code is based on this excellent article:
-    ///     http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
-    ///   </para>
-    ///   <para>
-    ///     "ULP" means Unit in the Last Place and in the context of this library refers to
-    ///     the distance between two adjacent floating point numbers. IEEE floating point
-    ///     numbers can only represent a finite subset of natural numbers, with greater
-    ///     accuracy for smaller numbers and lower accuracy for very large numbers.
-    ///   </para>
-    ///   <para>
-    ///     If a comparison is allowed "2 ulps" of deviation, that means the values are
-    ///     allowed to deviate by up to 2 adjacent floating point values, which might be
-    ///     as low as 0.0000001 for small numbers or as high as 10.0 for large numbers.
-    ///   </para>
-    /// </remarks>
-    public class FloatingPointNumerics
-    {
-
-        #region struct FloatIntUnion
-
-        /// <summary>Union of a floating point variable and an integer</summary>
-        [StructLayout(LayoutKind.Explicit)]
-        private struct FloatIntUnion
-        {
-            /// <summary>The union's value as a floating point variable</summary>
-            [FieldOffset(0)]
-            public float Float;
-
-            /// <summary>The union's value as an integer</summary>
-            [FieldOffset(0)]
-            public int Int;
-
-            /// <summary>The union's value as an unsigned integer</summary>
-            [FieldOffset(0)]
-            public uint UInt;
-        }
-
-        #endregion // struct FloatIntUnion
-
-        #region struct DoubleLongUnion
-
-        /// <summary>Union of a double precision floating point variable and a long</summary>
-        [StructLayout(LayoutKind.Explicit)]
-        private struct DoubleLongUnion
-        {
-            /// <summary>The union's value as a double precision floating point variable</summary>
-            [FieldOffset(0)]
-            public double Double;
-
-            /// <summary>The union's value as a long</summary>
-            [FieldOffset(0)]
-            public long Long;
-
-            /// <summary>The union's value as an unsigned long</summary>
-            [FieldOffset(0)]
-            public ulong ULong;
-        }
-
-        #endregion // struct DoubleLongUnion
-
-        /// <summary>Compares two floating point values for equality</summary>
-        /// <param name="left">First floating point value to be compared</param>
-        /// <param name="right">Second floating point value t be compared</param>
-        /// <param name="maxUlps">
-        ///   Maximum number of representable floating point values that are allowed to
-        ///   be between the left and the right floating point values
-        /// </param>
-        /// <returns>True if both numbers are equal or close to being equal</returns>
-        /// <remarks>
-        ///   <para>
-        ///     Floating point values can only represent a finite subset of natural numbers.
-        ///     For example, the values 2.00000000 and 2.00000024 can be stored in a float,
-        ///     but nothing inbetween them.
-        ///   </para>
-        ///   <para>
-        ///     This comparison will count how many possible floating point values are between
-        ///     the left and the right number. If the number of possible values between both
-        ///     numbers is less than or equal to maxUlps, then the numbers are considered as
-        ///     being equal.
-        ///   </para>
-        ///   <para>
-        ///     Implementation partially follows the code outlined here:
-        ///     http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
-        ///   </para>
-        /// </remarks>
-        public static bool AreAlmostEqualUlps(float left, float right, int maxUlps)
-        {
-            FloatIntUnion leftUnion = new FloatIntUnion();
-            FloatIntUnion rightUnion = new FloatIntUnion();
-
-            leftUnion.Float = left;
-            rightUnion.Float = right;
-
-            uint leftSignMask = (leftUnion.UInt >> 31);
-            uint rightSignMask = (rightUnion.UInt >> 31);
-
-            uint leftTemp = ((0x80000000 - leftUnion.UInt) & leftSignMask);
-            leftUnion.UInt = leftTemp | (leftUnion.UInt & ~leftSignMask);
-
-            uint rightTemp = ((0x80000000 - rightUnion.UInt) & rightSignMask);
-            rightUnion.UInt = rightTemp | (rightUnion.UInt & ~rightSignMask);
-
-            return (Math.Abs(leftUnion.Int - rightUnion.Int) <= maxUlps);
-        }
-
-        /// <summary>Compares two double precision floating point values for equality</summary>
-        /// <param name="left">First double precision floating point value to be compared</param>
-        /// <param name="right">Second double precision floating point value t be compared</param>
-        /// <param name="maxUlps">
-        ///   Maximum number of representable double precision floating point values that are
-        ///   allowed to be between the left and the right double precision floating point values
-        /// </param>
-        /// <returns>True if both numbers are equal or close to being equal</returns>
-        /// <remarks>
-        ///   <para>
-        ///     Double precision floating point values can only represent a limited series of
-        ///     natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004
-        ///     can be stored in a double, but nothing inbetween them.
-        ///   </para>
-        ///   <para>
-        ///     This comparison will count how many possible double precision floating point
-        ///     values are between the left and the right number. If the number of possible
-        ///     values between both numbers is less than or equal to maxUlps, then the numbers
-        ///     are considered as being equal.
-        ///   </para>
-        ///   <para>
-        ///     Implementation partially follows the code outlined here:
-        ///     http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
-        ///   </para>
-        /// </remarks>
-        public static bool AreAlmostEqualUlps(double left, double right, long maxUlps)
-        {
-            DoubleLongUnion leftUnion = new DoubleLongUnion();
-            DoubleLongUnion rightUnion = new DoubleLongUnion();
-
-            leftUnion.Double = left;
-            rightUnion.Double = right;
-
-            ulong leftSignMask = (leftUnion.ULong >> 63);
-            ulong rightSignMask = (rightUnion.ULong >> 63);
-
-            ulong leftTemp = ((0x8000000000000000 - leftUnion.ULong) & leftSignMask);
-            leftUnion.ULong = leftTemp | (leftUnion.ULong & ~leftSignMask);
-
-            ulong rightTemp = ((0x8000000000000000 - rightUnion.ULong) & rightSignMask);
-            rightUnion.ULong = rightTemp | (rightUnion.ULong & ~rightSignMask);
-
-            return (Math.Abs(leftUnion.Long - rightUnion.Long) <= maxUlps);
-        }
-
-        /// <summary>
-        ///   Reinterprets the memory contents of a floating point value as an integer value
-        /// </summary>
-        /// <param name="value">
-        ///   Floating point value whose memory contents to reinterpret
-        /// </param>
-        /// <returns>
-        ///   The memory contents of the floating point value interpreted as an integer
-        /// </returns>
-        public static int ReinterpretAsInt(float value)
-        {
-            FloatIntUnion union = new FloatIntUnion();
-            union.Float = value;
-            return union.Int;
-        }
-
-        /// <summary>
-        ///   Reinterprets the memory contents of a double precision floating point
-        ///   value as an integer value
-        /// </summary>
-        /// <param name="value">
-        ///   Double precision floating point value whose memory contents to reinterpret
-        /// </param>
-        /// <returns>
-        ///   The memory contents of the double precision floating point value
-        ///   interpreted as an integer
-        /// </returns>
-        public static long ReinterpretAsLong(double value)
-        {
-            DoubleLongUnion union = new DoubleLongUnion();
-            union.Double = value;
-            return union.Long;
-        }
-
-        /// <summary>
-        ///   Reinterprets the memory contents of an integer as a floating point value
-        /// </summary>
-        /// <param name="value">Integer value whose memory contents to reinterpret</param>
-        /// <returns>
-        ///   The memory contents of the integer value interpreted as a floating point value
-        /// </returns>
-        public static float ReinterpretAsFloat(int value)
-        {
-            FloatIntUnion union = new FloatIntUnion();
-            union.Int = value;
-            return union.Float;
-        }
-
-        /// <summary>
-        ///   Reinterprets the memory contents of an integer value as a double precision
-        ///   floating point value
-        /// </summary>
-        /// <param name="value">Integer whose memory contents to reinterpret</param>
-        /// <returns>
-        ///   The memory contents of the integer interpreted as a double precision
-        ///   floating point value
-        /// </returns>
-        public static double ReinterpretAsDouble(long value)
-        {
-            DoubleLongUnion union = new DoubleLongUnion();
-            union.Long = value;
-            return union.Double;
-        }
-
-		private FloatingPointNumerics()
-		{
-		}
-    }
-}
-
-#endif
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if !NETCF_1_0
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace NUnit.Framework.Constraints
+{
+
+    /// <summary>Helper routines for working with floating point numbers</summary>
+    /// <remarks>
+    ///   <para>
+    ///     The floating point comparison code is based on this excellent article:
+    ///     http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
+    ///   </para>
+    ///   <para>
+    ///     "ULP" means Unit in the Last Place and in the context of this library refers to
+    ///     the distance between two adjacent floating point numbers. IEEE floating point
+    ///     numbers can only represent a finite subset of natural numbers, with greater
+    ///     accuracy for smaller numbers and lower accuracy for very large numbers.
+    ///   </para>
+    ///   <para>
+    ///     If a comparison is allowed "2 ulps" of deviation, that means the values are
+    ///     allowed to deviate by up to 2 adjacent floating point values, which might be
+    ///     as low as 0.0000001 for small numbers or as high as 10.0 for large numbers.
+    ///   </para>
+    /// </remarks>
+    public class FloatingPointNumerics
+    {
+
+        #region struct FloatIntUnion
+
+        /// <summary>Union of a floating point variable and an integer</summary>
+        [StructLayout(LayoutKind.Explicit)]
+        private struct FloatIntUnion
+        {
+            /// <summary>The union's value as a floating point variable</summary>
+            [FieldOffset(0)]
+            public float Float;
+
+            /// <summary>The union's value as an integer</summary>
+            [FieldOffset(0)]
+            public int Int;
+
+            /// <summary>The union's value as an unsigned integer</summary>
+            [FieldOffset(0)]
+            public uint UInt;
+        }
+
+        #endregion // struct FloatIntUnion
+
+        #region struct DoubleLongUnion
+
+        /// <summary>Union of a double precision floating point variable and a long</summary>
+        [StructLayout(LayoutKind.Explicit)]
+        private struct DoubleLongUnion
+        {
+            /// <summary>The union's value as a double precision floating point variable</summary>
+            [FieldOffset(0)]
+            public double Double;
+
+            /// <summary>The union's value as a long</summary>
+            [FieldOffset(0)]
+            public long Long;
+
+            /// <summary>The union's value as an unsigned long</summary>
+            [FieldOffset(0)]
+            public ulong ULong;
+        }
+
+        #endregion // struct DoubleLongUnion
+
+        /// <summary>Compares two floating point values for equality</summary>
+        /// <param name="left">First floating point value to be compared</param>
+        /// <param name="right">Second floating point value t be compared</param>
+        /// <param name="maxUlps">
+        ///   Maximum number of representable floating point values that are allowed to
+        ///   be between the left and the right floating point values
+        /// </param>
+        /// <returns>True if both numbers are equal or close to being equal</returns>
+        /// <remarks>
+        ///   <para>
+        ///     Floating point values can only represent a finite subset of natural numbers.
+        ///     For example, the values 2.00000000 and 2.00000024 can be stored in a float,
+        ///     but nothing inbetween them.
+        ///   </para>
+        ///   <para>
+        ///     This comparison will count how many possible floating point values are between
+        ///     the left and the right number. If the number of possible values between both
+        ///     numbers is less than or equal to maxUlps, then the numbers are considered as
+        ///     being equal.
+        ///   </para>
+        ///   <para>
+        ///     Implementation partially follows the code outlined here:
+        ///     http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+        ///   </para>
+        /// </remarks>
+        public static bool AreAlmostEqualUlps(float left, float right, int maxUlps)
+        {
+            FloatIntUnion leftUnion = new FloatIntUnion();
+            FloatIntUnion rightUnion = new FloatIntUnion();
+
+            leftUnion.Float = left;
+            rightUnion.Float = right;
+
+            uint leftSignMask = (leftUnion.UInt >> 31);
+            uint rightSignMask = (rightUnion.UInt >> 31);
+
+            uint leftTemp = ((0x80000000 - leftUnion.UInt) & leftSignMask);
+            leftUnion.UInt = leftTemp | (leftUnion.UInt & ~leftSignMask);
+
+            uint rightTemp = ((0x80000000 - rightUnion.UInt) & rightSignMask);
+            rightUnion.UInt = rightTemp | (rightUnion.UInt & ~rightSignMask);
+
+            return (Math.Abs(leftUnion.Int - rightUnion.Int) <= maxUlps);
+        }
+
+        /// <summary>Compares two double precision floating point values for equality</summary>
+        /// <param name="left">First double precision floating point value to be compared</param>
+        /// <param name="right">Second double precision floating point value t be compared</param>
+        /// <param name="maxUlps">
+        ///   Maximum number of representable double precision floating point values that are
+        ///   allowed to be between the left and the right double precision floating point values
+        /// </param>
+        /// <returns>True if both numbers are equal or close to being equal</returns>
+        /// <remarks>
+        ///   <para>
+        ///     Double precision floating point values can only represent a limited series of
+        ///     natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004
+        ///     can be stored in a double, but nothing inbetween them.
+        ///   </para>
+        ///   <para>
+        ///     This comparison will count how many possible double precision floating point
+        ///     values are between the left and the right number. If the number of possible
+        ///     values between both numbers is less than or equal to maxUlps, then the numbers
+        ///     are considered as being equal.
+        ///   </para>
+        ///   <para>
+        ///     Implementation partially follows the code outlined here:
+        ///     http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+        ///   </para>
+        /// </remarks>
+        public static bool AreAlmostEqualUlps(double left, double right, long maxUlps)
+        {
+            DoubleLongUnion leftUnion = new DoubleLongUnion();
+            DoubleLongUnion rightUnion = new DoubleLongUnion();
+
+            leftUnion.Double = left;
+            rightUnion.Double = right;
+
+            ulong leftSignMask = (leftUnion.ULong >> 63);
+            ulong rightSignMask = (rightUnion.ULong >> 63);
+
+            ulong leftTemp = ((0x8000000000000000 - leftUnion.ULong) & leftSignMask);
+            leftUnion.ULong = leftTemp | (leftUnion.ULong & ~leftSignMask);
+
+            ulong rightTemp = ((0x8000000000000000 - rightUnion.ULong) & rightSignMask);
+            rightUnion.ULong = rightTemp | (rightUnion.ULong & ~rightSignMask);
+
+            return (Math.Abs(leftUnion.Long - rightUnion.Long) <= maxUlps);
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of a floating point value as an integer value
+        /// </summary>
+        /// <param name="value">
+        ///   Floating point value whose memory contents to reinterpret
+        /// </param>
+        /// <returns>
+        ///   The memory contents of the floating point value interpreted as an integer
+        /// </returns>
+        public static int ReinterpretAsInt(float value)
+        {
+            FloatIntUnion union = new FloatIntUnion();
+            union.Float = value;
+            return union.Int;
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of a double precision floating point
+        ///   value as an integer value
+        /// </summary>
+        /// <param name="value">
+        ///   Double precision floating point value whose memory contents to reinterpret
+        /// </param>
+        /// <returns>
+        ///   The memory contents of the double precision floating point value
+        ///   interpreted as an integer
+        /// </returns>
+        public static long ReinterpretAsLong(double value)
+        {
+            DoubleLongUnion union = new DoubleLongUnion();
+            union.Double = value;
+            return union.Long;
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of an integer as a floating point value
+        /// </summary>
+        /// <param name="value">Integer value whose memory contents to reinterpret</param>
+        /// <returns>
+        ///   The memory contents of the integer value interpreted as a floating point value
+        /// </returns>
+        public static float ReinterpretAsFloat(int value)
+        {
+            FloatIntUnion union = new FloatIntUnion();
+            union.Int = value;
+            return union.Float;
+        }
+
+        /// <summary>
+        ///   Reinterprets the memory contents of an integer value as a double precision
+        ///   floating point value
+        /// </summary>
+        /// <param name="value">Integer whose memory contents to reinterpret</param>
+        /// <returns>
+        ///   The memory contents of the integer interpreted as a double precision
+        ///   floating point value
+        /// </returns>
+        public static double ReinterpretAsDouble(long value)
+        {
+            DoubleLongUnion union = new DoubleLongUnion();
+            union.Long = value;
+            return union.Double;
+        }
+
+		private FloatingPointNumerics()
+		{
+		}
+    }
+}
+
+#endif
diff --git a/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs b/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs
index 29e8c2b..190297e 100644
--- a/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/GreaterThanConstraint.cs
@@ -1,55 +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;
-        }
-    }
-}
+// ****************************************************************
+// 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
index f843452..a6c1f82 100644
--- a/src/NUnitFramework/framework/Constraints/GreaterThanOrEqualConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/GreaterThanOrEqualConstraint.cs
@@ -1,55 +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;
-        }
-    }
-}
+// ****************************************************************
+// 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/IResolveConstraint.cs b/src/NUnitFramework/framework/Constraints/IResolveConstraint.cs
index 7e14b33..76cc01d 100644
--- a/src/NUnitFramework/framework/Constraints/IResolveConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/IResolveConstraint.cs
@@ -1,21 +1,21 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// The IConstraintExpression interface is implemented by all
-    /// complete and resolvable constraints and expressions.
-    /// </summary>
-    public interface IResolveConstraint
-    {
-        /// <summary>
-        /// Return the top-level constraint for this expression
-        /// </summary>
-        /// <returns></returns>
-        Constraint Resolve();
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// The IConstraintExpression interface is implemented by all
+    /// complete and resolvable constraints and expressions.
+    /// </summary>
+    public interface IResolveConstraint
+    {
+        /// <summary>
+        /// Return the top-level constraint for this expression
+        /// </summary>
+        /// <returns></returns>
+        Constraint Resolve();
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/InstanceOfTypeConstraint.cs b/src/NUnitFramework/framework/Constraints/InstanceOfTypeConstraint.cs
new file mode 100644
index 0000000..7b3f524
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/InstanceOfTypeConstraint.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// InstanceOfTypeConstraint is used to test that an object
+    /// is of the same type provided or derived from it.
+    /// </summary>
+    public class InstanceOfTypeConstraint : TypeConstraint
+    {
+        /// <summary>
+        /// Construct an InstanceOfTypeConstraint for the type provided
+        /// </summary>
+        /// <param name="type">The expected Type</param>
+        public InstanceOfTypeConstraint(Type type)
+            : base(type)
+        {
+            this.DisplayName = "instanceof";
+        }
+
+        /// <summary>
+        /// Test whether an object is of the specified type or a derived type
+        /// </summary>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True if the object is of the provided type or derives from it, otherwise false.</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return actual != null && expectedType.IsInstanceOfType(actual);
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to use</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("instance of");
+            writer.WriteExpectedValue(expectedType);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs b/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs
index da84d6a..176274c 100644
--- a/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/LessThanConstraint.cs
@@ -1,55 +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;
-        }
-    }
-}
+// ****************************************************************
+// 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
index abacb6f..0c8de93 100644
--- a/src/NUnitFramework/framework/Constraints/LessThanOrEqualConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/LessThanOrEqualConstraint.cs
@@ -1,55 +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;
-        }
-    }
-}
+// ****************************************************************
+// 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 abcc9c2..60f0a24 100644
--- a/src/NUnitFramework/framework/Constraints/MessageWriter.cs
+++ b/src/NUnitFramework/framework/Constraints/MessageWriter.cs
@@ -1,137 +1,137 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System.IO;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-	/// <summary>
-	/// MessageWriter is the abstract base for classes that write
-	/// constraint descriptions and messages in some form. The
-	/// class has separate methods for writing various components
-	/// of a message, allowing implementations to tailor the
-	/// presentation as needed.
-	/// </summary>
-    public abstract class MessageWriter : StringWriter
-    {
-
-		/// <summary>
-		/// Construct a MessageWriter given a culture
-		/// </summary>
-        public MessageWriter() : base( System.Globalization.CultureInfo.InvariantCulture ) { }
-
-        /// <summary>
-        /// Abstract method to get the max line length
-        /// </summary>
-        public abstract int MaxLineLength { get; set; }
-
-		/// <summary>
-		/// Method to write single line  message with optional args, usually
-		/// written to precede the general failure message.
-		/// </summary>
-		/// <param name="message">The message to be written</param>
-		/// <param name="args">Any arguments used in formatting the message</param>
-		public void WriteMessageLine(string message, params object[] args)
-        {
-            WriteMessageLine(0, message, args);
-        }
-
-        /// <summary>
-        /// Method to write single line  message with optional args, usually
-        /// written to precede the general failure message, at a givel 
-        /// indentation level.
-        /// </summary>
-        /// <param name="level">The indentation level of the message</param>
-        /// <param name="message">The message to be written</param>
-        /// <param name="args">Any arguments used in formatting the message</param>
-        public abstract void WriteMessageLine(int level, string message, params object[] args);
-
-        /// <summary>
-        /// Display Expected and Actual lines for a constraint. This
-        /// is called by MessageWriter's default implementation of 
-        /// WriteMessageTo and provides the generic two-line display. 
-        /// </summary>
-        /// <param name="constraint">The constraint that failed</param>
-        public abstract void DisplayDifferences(Constraint constraint);
-
-		/// <summary>
-		/// Display Expected and Actual lines for given values. This
-		/// method may be called by constraints that need more control over
-		/// the display of actual and expected values than is provided
-		/// by the default implementation.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value causing the failure</param>
-		public abstract void DisplayDifferences(object expected, object actual);
-
-		/// <summary>
-		/// Display Expected and Actual lines for given values, including
-		/// a tolerance value on the Expected line.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value causing the failure</param>
-		/// <param name="tolerance">The tolerance within which the test was made</param>
-		public abstract void DisplayDifferences(object expected, object actual, Tolerance tolerance);
-
-		/// <summary>
-        /// Display the expected and actual string values on separate lines.
-        /// If the mismatch parameter is >=0, an additional line is displayed
-        /// line containing a caret that points to the mismatch point.
-        /// </summary>
-        /// <param name="expected">The expected string value</param>
-        /// <param name="actual">The actual string value</param>
-        /// <param name="mismatch">The point at which the strings don't match or -1</param>
-        /// <param name="ignoreCase">If true, case is ignored in locating the point where the strings differ</param>
-        /// <param name="clipping">If true, the strings should be clipped to fit the line</param>
-        public abstract void DisplayStringDifferences(string expected, string actual, int mismatch, bool ignoreCase, bool clipping);
-
-        /// <summary>
-        /// Writes the text for a connector.
-        /// </summary>
-        /// <param name="connector">The connector.</param>
-        public abstract void WriteConnector(string connector);
-
-        /// <summary>
-        /// Writes the text for a predicate.
-        /// </summary>
-        /// <param name="predicate">The predicate.</param>
-        public abstract void WritePredicate(string predicate);
-
-		/// <summary>
-		/// Writes the text for an expected value.
-		/// </summary>
-		/// <param name="expected">The expected value.</param>
-		public abstract void WriteExpectedValue(object expected);
-
-		/// <summary>
-		/// Writes the text for a modifier
-		/// </summary>
-		/// <param name="modifier">The modifier.</param>
-		public abstract void WriteModifier(string modifier);
-
-		/// <summary>
-		/// Writes the text for an actual value.
-		/// </summary>
-		/// <param name="actual">The actual value.</param>
-		public abstract void WriteActualValue(object actual);
-
-		/// <summary>
-		/// Writes the text for a generalized value.
-		/// </summary>
-		/// <param name="val">The value.</param>
-		public abstract void WriteValue(object val);
-    
-		/// <summary>
-		/// Writes the text for a collection value,
-		/// starting at a particular point, to a max length
-		/// </summary>
-		/// <param name="collection">The collection containing elements to write.</param>
-        /// <param name="start">The starting point of the elements to write</param>
-        /// <param name="max">The maximum number of elements to write</param>
-		public abstract void WriteCollectionElements(IEnumerable collection, int start, int max);
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System.IO;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// MessageWriter is the abstract base for classes that write
+	/// constraint descriptions and messages in some form. The
+	/// class has separate methods for writing various components
+	/// of a message, allowing implementations to tailor the
+	/// presentation as needed.
+	/// </summary>
+    public abstract class MessageWriter : StringWriter
+    {
+
+		/// <summary>
+		/// Construct a MessageWriter given a culture
+		/// </summary>
+        protected MessageWriter() : base( System.Globalization.CultureInfo.InvariantCulture ) { }
+
+        /// <summary>
+        /// Abstract method to get the max line length
+        /// </summary>
+        public abstract int MaxLineLength { get; set; }
+
+		/// <summary>
+		/// Method to write single line  message with optional args, usually
+		/// written to precede the general failure message.
+		/// </summary>
+		/// <param name="message">The message to be written</param>
+		/// <param name="args">Any arguments used in formatting the message</param>
+		public void WriteMessageLine(string message, params object[] args)
+        {
+            WriteMessageLine(0, message, args);
+        }
+
+        /// <summary>
+        /// Method to write single line  message with optional args, usually
+        /// written to precede the general failure message, at a givel 
+        /// indentation level.
+        /// </summary>
+        /// <param name="level">The indentation level of the message</param>
+        /// <param name="message">The message to be written</param>
+        /// <param name="args">Any arguments used in formatting the message</param>
+        public abstract void WriteMessageLine(int level, string message, params object[] args);
+
+        /// <summary>
+        /// Display Expected and Actual lines for a constraint. This
+        /// is called by MessageWriter's default implementation of 
+        /// WriteMessageTo and provides the generic two-line display. 
+        /// </summary>
+        /// <param name="constraint">The constraint that failed</param>
+        public abstract void DisplayDifferences(Constraint constraint);
+
+		/// <summary>
+		/// Display Expected and Actual lines for given values. This
+		/// method may be called by constraints that need more control over
+		/// the display of actual and expected values than is provided
+		/// by the default implementation.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="actual">The actual value causing the failure</param>
+		public abstract void DisplayDifferences(object expected, object actual);
+
+		/// <summary>
+		/// Display Expected and Actual lines for given values, including
+		/// a tolerance value on the Expected line.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="actual">The actual value causing the failure</param>
+		/// <param name="tolerance">The tolerance within which the test was made</param>
+		public abstract void DisplayDifferences(object expected, object actual, Tolerance tolerance);
+
+		/// <summary>
+        /// Display the expected and actual string values on separate lines.
+        /// If the mismatch parameter is >=0, an additional line is displayed
+        /// line containing a caret that points to the mismatch point.
+        /// </summary>
+        /// <param name="expected">The expected string value</param>
+        /// <param name="actual">The actual string value</param>
+        /// <param name="mismatch">The point at which the strings don't match or -1</param>
+        /// <param name="ignoreCase">If true, case is ignored in locating the point where the strings differ</param>
+        /// <param name="clipping">If true, the strings should be clipped to fit the line</param>
+        public abstract void DisplayStringDifferences(string expected, string actual, int mismatch, bool ignoreCase, bool clipping);
+
+        /// <summary>
+        /// Writes the text for a connector.
+        /// </summary>
+        /// <param name="connector">The connector.</param>
+        public abstract void WriteConnector(string connector);
+
+        /// <summary>
+        /// Writes the text for a predicate.
+        /// </summary>
+        /// <param name="predicate">The predicate.</param>
+        public abstract void WritePredicate(string predicate);
+
+		/// <summary>
+		/// Writes the text for an expected value.
+		/// </summary>
+		/// <param name="expected">The expected value.</param>
+		public abstract void WriteExpectedValue(object expected);
+
+		/// <summary>
+		/// Writes the text for a modifier
+		/// </summary>
+		/// <param name="modifier">The modifier.</param>
+		public abstract void WriteModifier(string modifier);
+
+		/// <summary>
+		/// Writes the text for an actual value.
+		/// </summary>
+		/// <param name="actual">The actual value.</param>
+		public abstract void WriteActualValue(object actual);
+
+		/// <summary>
+		/// Writes the text for a generalized value.
+		/// </summary>
+		/// <param name="val">The value.</param>
+		public abstract void WriteValue(object val);
+    
+		/// <summary>
+		/// Writes the text for a collection value,
+		/// starting at a particular point, to a max length
+		/// </summary>
+		/// <param name="collection">The collection containing elements to write.</param>
+        /// <param name="start">The starting point of the elements to write</param>
+        /// <param name="max">The maximum number of elements to write</param>
+		public abstract void WriteCollectionElements(IEnumerable collection, int start, int max);
+	}
+}
diff --git a/src/NUnitFramework/framework/Constraints/MsgUtils.cs b/src/NUnitFramework/framework/Constraints/MsgUtils.cs
index e714f1d..6d1ac74 100644
--- a/src/NUnitFramework/framework/Constraints/MsgUtils.cs
+++ b/src/NUnitFramework/framework/Constraints/MsgUtils.cs
@@ -1,267 +1,265 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Text;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// Static methods used in creating messages
-    /// </summary>
-    public class MsgUtils
-    {
-        /// <summary>
-        /// Static string used when strings are clipped
-        /// </summary>
-        private static readonly string ELLIPSIS = "...";
-
-        /// <summary>
-        /// Returns the representation of a type as used in NUnitLite.
-        /// This is the same as Type.ToString() except for arrays,
-        /// which are displayed with their declared sizes.
-        /// </summary>
-        /// <param name="obj"></param>
-        /// <returns></returns>
-        public static string GetTypeRepresentation(object obj)
-        {
-            Array array = obj as Array;
-            if ( array == null )
-                return string.Format( "<{0}>", obj.GetType() );
-
-            StringBuilder sb = new StringBuilder();
-            Type elementType = array.GetType();
-            int nest = 0;
-            while (elementType.IsArray)
-            {
-                elementType = elementType.GetElementType();
-                ++nest;
-            }
-            sb.Append(elementType.ToString());
-            sb.Append('[');
-            for (int r = 0; r < array.Rank; r++)
-            {
-                if (r > 0) sb.Append(',');
-                sb.Append(array.GetLength(r));
-            }
-            sb.Append(']');
-
-            while (--nest > 0)
-                sb.Append("[]");
-
-            return string.Format( "<{0}>", sb.ToString() );
-        }
-        /// <summary>
-        /// Converts any control characters in a string 
-        /// to their escaped representation.
-        /// </summary>
-        /// <param name="s">The string to be converted</param>
-        /// <returns>The converted string</returns>
-        public static string EscapeControlChars(string s)
-        {
-            if (s != null)
-            {
-                StringBuilder sb = new StringBuilder();
-
-                for (int i = 0; i < s.Length; i++)
-                {
-                    char c = s[i];
-
-                    switch (c)
-                    {
-                        //case '\'':
-                        //    sb.Append("\\\'");
-                        //    break;
-                        //case '\"':
-                        //    sb.Append("\\\"");
-                        //    break;
-                        case '\\':
-                            sb.Append("\\\\");
-                            break;
-                        case '\0':
-                            sb.Append("\\0");
-                            break;
-                        case '\a':
-                            sb.Append("\\a");
-                            break;
-                        case '\b':
-                            sb.Append("\\b");
-                            break;
-                        case '\f':
-                            sb.Append("\\f");
-                            break;
-                        case '\n':
-                            sb.Append("\\n");
-                            break;
-                        case '\r':
-                            sb.Append("\\r");
-                            break;
-                        case '\t':
-                            sb.Append("\\t");
-                            break;
-                        case '\v':
-                            sb.Append("\\v");
-                            break;
-
-                        case '\x0085':
-                        case '\x2028':
-                        case '\x2029':
-                            sb.AppendFormat("\\x{0:X4}", (int)c);
-                            break;
-
-                        default:
-                            sb.Append(c);
-                            break;
-                    }
-                }
-
-                s = sb.ToString();
-            }
-
-			return s;
-        }
-
-        /// <summary>
-        /// Return the a string representation for a set of indices into an array
-        /// </summary>
-        /// <param name="indices">Array of indices for which a string is needed</param>
-        public static string GetArrayIndicesAsString(int[] indices)
-        {
-            StringBuilder sb = new StringBuilder();
-            sb.Append('[');
-            for (int r = 0; r < indices.Length; r++)
-            {
-                if (r > 0) sb.Append(',');
-                sb.Append(indices[r].ToString());
-            }
-            sb.Append(']');
-            return sb.ToString();
-        }
-
-        /// <summary>
-        /// Get an array of indices representing the point in a 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(IEnumerable collection, int index)
-        {
-            Array array = collection as Array;
-
-            int rank = array == null ? 1 : array.Rank;
-            int[] result = new int[rank];
-
-            for (int r = rank; --r > 0; )
-            {
-                int l = array.GetLength(r);
-                result[r] = index % l;
-                index /= l;
-            }
-
-            result[0] = index;
-            return result;
-        }
-
-        /// <summary>
-        /// Clip a string to a given length, starting at a particular offset, returning the clipped
-        /// string with ellipses representing the removed parts
-        /// </summary>
-        /// <param name="s">The string to be clipped</param>
-        /// <param name="maxStringLength">The maximum permitted length of the result string</param>
-        /// <param name="clipStart">The point at which to start clipping</param>
-        /// <returns>The clipped string</returns>
-        public static string ClipString(string s, int maxStringLength, int clipStart)
-        {
-            int clipLength = maxStringLength;
-            StringBuilder sb = new StringBuilder();
-
-            if (clipStart > 0)
-            {
-                clipLength -= ELLIPSIS.Length;
-                sb.Append( ELLIPSIS );
-            }
-
-            if (s.Length - clipStart > clipLength)
-            {
-                clipLength -= ELLIPSIS.Length;
-                sb.Append( s.Substring( clipStart, clipLength ));
-                sb.Append(ELLIPSIS);
-            }
-            else if (clipStart > 0)
-                sb.Append( s.Substring(clipStart));
-            else
-                sb.Append( s );
- 
-            return sb.ToString();
-        }
-
-        /// <summary>
-        /// Clip the expected and actual strings in a coordinated fashion, 
-        /// so that they may be displayed together.
-        /// </summary>
-        /// <param name="expected"></param>
-        /// <param name="actual"></param>
-        /// <param name="maxDisplayLength"></param>
-        /// <param name="mismatch"></param>
-        public static void ClipExpectedAndActual(ref string expected, ref string actual, int maxDisplayLength, int mismatch)
-        {
-            // Case 1: Both strings fit on line
-            int maxStringLength = Math.Max(expected.Length, actual.Length);
-            if (maxStringLength <= maxDisplayLength)
-                return;
-
-            // Case 2: Assume that the tail of each string fits on line
-            int clipLength = maxDisplayLength - ELLIPSIS.Length;
-            int clipStart = maxStringLength - clipLength;
-
-            // Case 3: If it doesn't, center the mismatch position
-            if ( clipStart > mismatch )
-                clipStart = Math.Max( 0, mismatch - clipLength / 2 );
-
-            expected = ClipString(expected, maxDisplayLength, clipStart);
-            actual = ClipString(actual, maxDisplayLength, clipStart);
-        }
-
-        /// <summary>
-        /// Shows the position two strings start to differ.  Comparison 
-        /// starts at the start index.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="istart">The index in the strings at which comparison should start</param>
-        /// <param name="ignoreCase">Boolean indicating whether case should be ignored</param>
-        /// <returns>-1 if no mismatch found, or the index where mismatch found</returns>
-        static public int FindMismatchPosition(string expected, string actual, int istart, bool ignoreCase)
-        {
-            int length = Math.Min(expected.Length, actual.Length);
-
-            string s1 = ignoreCase ? expected.ToLower() : expected;
-            string s2 = ignoreCase ? actual.ToLower() : actual;
-
-            for (int i = istart; i < length; i++)
-            {
-                if (s1[i] != s2[i])
-                    return i;
-            }
-
-            //
-            // Strings have same content up to the length of the shorter string.
-            // Mismatch occurs because string lengths are different, so show
-            // that they start differing where the shortest string ends
-            //
-            if (expected.Length != actual.Length)
-                return length;
-
-            //
-            // Same strings : We shouldn't get here
-            //
-            return -1;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Text;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Static methods used in creating messages
+    /// </summary>
+    public class MsgUtils
+    {
+        /// <summary>
+        /// Static string used when strings are clipped
+        /// </summary>
+        private const string ELLIPSIS = "...";
+
+        /// <summary>
+        /// Returns the representation of a type as used in NUnitLite.
+        /// This is the same as Type.ToString() except for arrays,
+        /// which are displayed with their declared sizes.
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        public static string GetTypeRepresentation(object obj)
+        {
+            Array array = obj as Array;
+            if ( array == null )
+                return string.Format( "<{0}>", obj.GetType() );
+
+            StringBuilder sb = new StringBuilder();
+            Type elementType = array.GetType();
+            int nest = 0;
+            while (elementType.IsArray)
+            {
+                elementType = elementType.GetElementType();
+                ++nest;
+            }
+            sb.Append(elementType.ToString());
+            sb.Append('[');
+            for (int r = 0; r < array.Rank; r++)
+            {
+                if (r > 0) sb.Append(',');
+                sb.Append(array.GetLength(r));
+            }
+            sb.Append(']');
+
+            while (--nest > 0)
+                sb.Append("[]");
+
+            return string.Format( "<{0}>", sb.ToString() );
+        }
+        /// <summary>
+        /// Converts any control characters in a string 
+        /// to their escaped representation.
+        /// </summary>
+        /// <param name="s">The string to be converted</param>
+        /// <returns>The converted string</returns>
+        public static string EscapeControlChars(string s)
+        {
+            if (s != null)
+            {
+                StringBuilder sb = new StringBuilder();
+
+                foreach (char c in s)
+                {
+                    switch (c)
+                    {
+                        //case '\'':
+                        //    sb.Append("\\\'");
+                        //    break;
+                        //case '\"':
+                        //    sb.Append("\\\"");
+                        //    break;
+                        case '\\':
+                            sb.Append("\\\\");
+                            break;
+                        case '\0':
+                            sb.Append("\\0");
+                            break;
+                        case '\a':
+                            sb.Append("\\a");
+                            break;
+                        case '\b':
+                            sb.Append("\\b");
+                            break;
+                        case '\f':
+                            sb.Append("\\f");
+                            break;
+                        case '\n':
+                            sb.Append("\\n");
+                            break;
+                        case '\r':
+                            sb.Append("\\r");
+                            break;
+                        case '\t':
+                            sb.Append("\\t");
+                            break;
+                        case '\v':
+                            sb.Append("\\v");
+                            break;
+
+                        case '\x0085':
+                        case '\x2028':
+                        case '\x2029':
+                            sb.Append(string.Format("\\x{0:X4}", (int)c));
+                            break;
+
+                        default:
+                            sb.Append(c);
+                            break;
+                    }
+                }
+
+                s = sb.ToString();
+            }
+
+			return s;
+        }
+
+        /// <summary>
+        /// Return the a string representation for a set of indices into an array
+        /// </summary>
+        /// <param name="indices">Array of indices for which a string is needed</param>
+        public static string GetArrayIndicesAsString(int[] indices)
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.Append('[');
+            for (int r = 0; r < indices.Length; r++)
+            {
+                if (r > 0) sb.Append(',');
+                sb.Append(indices[r].ToString());
+            }
+            sb.Append(']');
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// Get an array of indices representing the point in a 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(IEnumerable collection, int index)
+        {
+            Array array = collection as Array;
+
+            int rank = array == null ? 1 : array.Rank;
+            int[] result = new int[rank];
+
+            for (int r = rank; --r > 0; )
+            {
+                int l = array.GetLength(r);
+                result[r] = index % l;
+                index /= l;
+            }
+
+            result[0] = index;
+            return result;
+        }
+
+        /// <summary>
+        /// Clip a string to a given length, starting at a particular offset, returning the clipped
+        /// string with ellipses representing the removed parts
+        /// </summary>
+        /// <param name="s">The string to be clipped</param>
+        /// <param name="maxStringLength">The maximum permitted length of the result string</param>
+        /// <param name="clipStart">The point at which to start clipping</param>
+        /// <returns>The clipped string</returns>
+        public static string ClipString(string s, int maxStringLength, int clipStart)
+        {
+            int clipLength = maxStringLength;
+            StringBuilder sb = new StringBuilder();
+
+            if (clipStart > 0)
+            {
+                clipLength -= ELLIPSIS.Length;
+                sb.Append( ELLIPSIS );
+            }
+
+            if (s.Length - clipStart > clipLength)
+            {
+                clipLength -= ELLIPSIS.Length;
+                sb.Append( s.Substring( clipStart, clipLength ));
+                sb.Append(ELLIPSIS);
+            }
+            else if (clipStart > 0)
+                sb.Append( s.Substring(clipStart));
+            else
+                sb.Append( s );
+ 
+            return sb.ToString();
+        }
+
+        /// <summary>
+        /// Clip the expected and actual strings in a coordinated fashion, 
+        /// so that they may be displayed together.
+        /// </summary>
+        /// <param name="expected"></param>
+        /// <param name="actual"></param>
+        /// <param name="maxDisplayLength"></param>
+        /// <param name="mismatch"></param>
+        public static void ClipExpectedAndActual(ref string expected, ref string actual, int maxDisplayLength, int mismatch)
+        {
+            // Case 1: Both strings fit on line
+            int maxStringLength = Math.Max(expected.Length, actual.Length);
+            if (maxStringLength <= maxDisplayLength)
+                return;
+
+            // Case 2: Assume that the tail of each string fits on line
+            int clipLength = maxDisplayLength - ELLIPSIS.Length;
+            int clipStart = maxStringLength - clipLength;
+
+            // Case 3: If it doesn't, center the mismatch position
+            if ( clipStart > mismatch )
+                clipStart = Math.Max( 0, mismatch - clipLength / 2 );
+
+            expected = ClipString(expected, maxDisplayLength, clipStart);
+            actual = ClipString(actual, maxDisplayLength, clipStart);
+        }
+
+        /// <summary>
+        /// Shows the position two strings start to differ.  Comparison 
+        /// starts at the start index.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="istart">The index in the strings at which comparison should start</param>
+        /// <param name="ignoreCase">Boolean indicating whether case should be ignored</param>
+        /// <returns>-1 if no mismatch found, or the index where mismatch found</returns>
+        static public int FindMismatchPosition(string expected, string actual, int istart, bool ignoreCase)
+        {
+            int length = Math.Min(expected.Length, actual.Length);
+
+            string s1 = ignoreCase ? expected.ToLower() : expected;
+            string s2 = ignoreCase ? actual.ToLower() : actual;
+
+            for (int i = istart; i < length; i++)
+            {
+                if (s1[i] != s2[i])
+                    return i;
+            }
+
+            //
+            // Strings have same content up to the length of the shorter string.
+            // Mismatch occurs because string lengths are different, so show
+            // that they start differing where the shortest string ends
+            //
+            if (expected.Length != actual.Length)
+                return length;
+
+            //
+            // Same strings : We shouldn't get here
+            //
+            return -1;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NUnitComparer.cs b/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
index ece5975..eec6017 100644
--- a/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
+++ b/src/NUnitFramework/framework/Constraints/NUnitComparer.cs
@@ -1,98 +1,97 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// NUnitComparer encapsulates NUnit's default behavior
-    /// in comparing two objects.
-    /// </summary>
-    public class NUnitComparer : IComparer
-    {
-        /// <summary>
-        /// Returns the default NUnitComparer.
-        /// </summary>
-        public static NUnitComparer Default
-        {
-            get { return new NUnitComparer(); }
-        }
-
-        /// <summary>
-        /// Compares two objects
-        /// </summary>
-        /// <param name="x"></param>
-        /// <param name="y"></param>
-        /// <returns></returns>
-        public int Compare(object x, object y)
-        {
-            if (x == null)
-                return y == null ? 0 : -1;
-            else if (y == null)
-                return +1;
-
-            if (Numerics.IsNumericType(x) && Numerics.IsNumericType(y))
-                return Numerics.Compare(x, y);
-
-            if (x is IComparable)
-                return ((IComparable)x).CompareTo(y);
-
-            if (y is IComparable)
-                return -((IComparable)y).CompareTo(x);
-
-            Type xType = x.GetType();
-            Type yType = y.GetType();
-
-            MethodInfo method = xType.GetMethod("CompareTo", new Type[] { yType });
-            if (method != null)
-                return (int)method.Invoke(x, new object[] { y });
-
-            method = yType.GetMethod("CompareTo", new Type[] { xType });
-            if (method != null)
-                return -(int)method.Invoke(y, new object[] { x });
-
-            throw new ArgumentException("Neither value implements IComparable or IComparable<T>");
-        }
-    }
-
-#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
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NUnitComparer encapsulates NUnit's default behavior
+    /// in comparing two objects.
+    /// </summary>
+    public class NUnitComparer : IComparer
+    {
+        /// <summary>
+        /// Returns the default NUnitComparer.
+        /// </summary>
+        public static NUnitComparer Default
+        {
+            get { return new NUnitComparer(); }
+        }
+
+        /// <summary>
+        /// Compares two objects
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        public int Compare(object x, object y)
+        {
+            if (x == null)
+                return y == null ? 0 : -1;
+            else if (y == null)
+                return +1;
+
+            if (Numerics.IsNumericType(x) && Numerics.IsNumericType(y))
+                return Numerics.Compare(x, y);
+
+            if (x is IComparable)
+                return ((IComparable)x).CompareTo(y);
+
+            if (y is IComparable)
+                return -((IComparable)y).CompareTo(x);
+
+            Type xType = x.GetType();
+            Type yType = y.GetType();
+
+            MethodInfo method = xType.GetMethod("CompareTo", new Type[] { yType });
+            if (method != null)
+                return (int)method.Invoke(x, new object[] { y });
+
+            method = yType.GetMethod("CompareTo", new Type[] { xType });
+            if (method != null)
+                return -(int)method.Invoke(y, new object[] { x });
+
+            throw new ArgumentException("Neither value implements IComparable or IComparable<T>");
+        }
+    }
+
+#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 5eea93c..3f52d20 100644
--- a/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
+++ b/src/NUnitFramework/framework/Constraints/NUnitEqualityComparer.cs
@@ -1,425 +1,466 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-using System.Reflection;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// NUnitEqualityComparer encapsulates NUnit's handling of
-    /// equality tests between objects.
-    /// </summary>
-    public class NUnitEqualityComparer : INUnitEqualityComparer
-    {
-        #region Static and Instance Fields
-        /// <summary>
-        /// If true, all string comparisons will ignore case
-        /// </summary>
-        private bool caseInsensitive;
-
-        /// <summary>
-        /// If true, arrays will be treated as collections, allowing
-        /// those of different dimensions to be compared
-        /// </summary>
-        private bool compareAsCollection;
-
-        /// <summary>
-        /// Comparison objects used in comparisons for some constraints.
-        /// </summary>
-        private ArrayList externalComparers = new ArrayList();
-
-        private ArrayList failurePoints;
-
-        private static readonly int BUFFER_SIZE = 4096;
-        #endregion
-
-        #region Properties
-
-        /// <summary>
-        /// Returns the default NUnitEqualityComparer
-        /// </summary>
-        public static NUnitEqualityComparer Default
-        {
-            get { return new NUnitEqualityComparer(); }
-        }
-        /// <summary>
-        /// Gets and sets a flag indicating whether case should
-        /// be ignored in determining equality.
-        /// </summary>
-        public bool IgnoreCase
-        {
-            get { return caseInsensitive; }
-            set { caseInsensitive = value; }
-        }
-
-        /// <summary>
-        /// Gets and sets a flag indicating that arrays should be
-        /// compared as collections, without regard to their shape.
-        /// </summary>
-        public bool CompareAsCollection
-        {
-            get { return compareAsCollection; }
-            set { compareAsCollection = value; }
-        }
-
-        /// <summary>
-        /// Gets and sets an external comparer to be used to
-        /// test for equality. It is applied to members of
-        /// collections, in place of NUnit's own logic.
-        /// </summary>
-        public IList ExternalComparers
-        {
-            get { return externalComparers; }
-        }
-
-        /// <summary>
-        /// Gets the list of failure points for the last Match performed.
-        /// </summary>
-        public IList FailurePoints
-        {
-            get { return failurePoints; }
-        }
-
-        #endregion
-
-        #region Public Methods
-
-        /// <summary>
-        /// Compares two objects for equality within a tolerance.
-        /// </summary>
-        public bool AreEqual(object x, object y, ref Tolerance tolerance)
-        {
-            this.failurePoints = new ArrayList();
-
-            if (x == null && y == null)
-                return true;
-
-            if (x == null || y == null)
-                return false;
-			
-			if (object.ReferenceEquals(x, y))
-				return true;
-
-            Type xType = x.GetType();
-            Type yType = y.GetType();
-
-            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, ref tolerance);
-
-            if (x is IDictionary && y is IDictionary)
-                return DictionariesEqual((IDictionary)x, (IDictionary)y, ref tolerance);
-
-            //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, ref tolerance);
-
-            if (x is string && y is string)
-                return StringsEqual((string)x, (string)y);
-
-            if (x is Stream && y is Stream)
-                return StreamsEqual((Stream)x, (Stream)y);
-
-            if (x is DirectoryInfo && y is DirectoryInfo)
-                return DirectoriesEqual((DirectoryInfo)x, (DirectoryInfo)y);
-
-            if (Numerics.IsNumericType(x) && Numerics.IsNumericType(y))
-                return Numerics.AreEqual(x, y, ref tolerance);
-
-            if (tolerance != null && tolerance.Value is TimeSpan)
-            {
-                TimeSpan amount = (TimeSpan)tolerance.Value;
-
-                if (x is DateTime && y is DateTime)
-                    return ((DateTime)x - (DateTime)y).Duration() <= amount;
-
-                if (x is TimeSpan && y is TimeSpan)
-                    return ((TimeSpan)x - (TimeSpan)y).Duration() <= amount;
-            }
-
-#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);
-        }
-
-#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, ref Tolerance tolerance)
-        {
-            int rank = x.Rank;
-
-            if (rank != y.Rank)
-                return false;
-
-            for (int r = 1; r < rank; r++)
-                if (x.GetLength(r) != y.GetLength(r))
-                    return false;
-
-            return EnumerablesEqual((IEnumerable)x, (IEnumerable)y, ref tolerance);
-        }
-
-        private bool DictionariesEqual(IDictionary x, IDictionary y, ref Tolerance tolerance)
-        {
-            if (x.Count != y.Count)
-                return false;
-
-            CollectionTally tally = new CollectionTally(this, x.Keys);
-            if (!tally.TryRemove(y.Keys) || tally.Count > 0)
-                return false;
-
-            foreach (object key in x.Keys)
-                if (!AreEqual(x[key], y[key], ref tolerance))
-                    return false;
-
-            return true;
-        }
-
-        private bool CollectionsEqual(ICollection x, ICollection y, ref Tolerance tolerance)
-        {
-            IEnumerator expectedEnum = x.GetEnumerator();
-            IEnumerator actualEnum = y.GetEnumerator();
-
-            int count;
-            for (count = 0; ; count++)
-            {
-                bool expectedHasData = expectedEnum.MoveNext();
-                bool actualHasData = actualEnum.MoveNext();
-
-                if (!expectedHasData && !actualHasData)
-                    return true;
-
-                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)
-        {
-            string s1 = caseInsensitive ? x.ToLower() : x;
-            string s2 = caseInsensitive ? y.ToLower() : y;
-
-            return s1.Equals(s2);
-        }
-
-        private bool EnumerablesEqual(IEnumerable x, IEnumerable y, ref Tolerance tolerance)
-        {
-            IEnumerator expectedEnum = x.GetEnumerator();
-            IEnumerator actualEnum = y.GetEnumerator();
-
-            int count;
-            for (count = 0; ; count++)
-            {
-                bool expectedHasData = expectedEnum.MoveNext();
-                bool actualHasData = actualEnum.MoveNext();
-
-                if (!expectedHasData && !actualHasData)
-                    return true;
-
-                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;
-                }
-            }
-        }
-
-        /// <summary>
-        /// Method to compare two DirectoryInfo objects
-        /// </summary>
-        /// <param name="x">first directory to compare</param>
-        /// <param name="y">second directory to compare</param>
-        /// <returns>true if equivalent, false if not</returns>
-        private bool DirectoriesEqual(DirectoryInfo x, DirectoryInfo y)
-        {
-            // Do quick compares first
-            if (x.Attributes != y.Attributes ||
-                x.CreationTime != y.CreationTime ||
-                x.LastAccessTime != y.LastAccessTime)
-            {
-                return false;
-            }
-
-            // TODO: Find a cleaner way to do this
-            return new SamePathConstraint(x.FullName).Matches(y.FullName);
-        }
-
-        private bool StreamsEqual(Stream x, Stream y)
-        {
-            if (x == y) return true;
-
-            if (!x.CanRead)
-                throw new ArgumentException("Stream is not readable", "expected");
-            if (!y.CanRead)
-                throw new ArgumentException("Stream is not readable", "actual");
-            if (!x.CanSeek)
-                throw new ArgumentException("Stream is not seekable", "expected");
-            if (!y.CanSeek)
-                throw new ArgumentException("Stream is not seekable", "actual");
-
-            if (x.Length != y.Length) return false;
-
-            byte[] bufferExpected = new byte[BUFFER_SIZE];
-            byte[] bufferActual = new byte[BUFFER_SIZE];
-
-            BinaryReader binaryReaderExpected = new BinaryReader(x);
-            BinaryReader binaryReaderActual = new BinaryReader(y);
-
-            long expectedPosition = x.Position;
-            long actualPosition = y.Position;
-
-            try
-            {
-                binaryReaderExpected.BaseStream.Seek(0, SeekOrigin.Begin);
-                binaryReaderActual.BaseStream.Seek(0, SeekOrigin.Begin);
-
-                for (long readByte = 0; readByte < x.Length; readByte += BUFFER_SIZE)
-                {
-                    binaryReaderExpected.Read(bufferExpected, 0, BUFFER_SIZE);
-                    binaryReaderActual.Read(bufferActual, 0, BUFFER_SIZE);
-
-                    for (int count = 0; count < BUFFER_SIZE; ++count)
-                    {
-                        if (bufferExpected[count] != bufferActual[count])
-                        {
-                            failurePoints.Insert(0, readByte + count);
-                            //FailureMessage.WriteLine("\tIndex : {0}", readByte + count);
-                            return false;
-                        }
-                    }
-                }
-            }
-            finally
-            {
-                x.Position = expectedPosition;
-                y.Position = actualPosition;
-            }
-
-            return true;
-        }
-        #endregion
-
-        #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
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Reflection;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NUnitEqualityComparer encapsulates NUnit's handling of
+    /// equality tests between objects.
+    /// </summary>
+    public class NUnitEqualityComparer : INUnitEqualityComparer
+    {
+        #region Static and Instance Fields
+
+        /// <summary>
+        /// If true, all string comparisons will ignore case
+        /// </summary>
+        private bool caseInsensitive;
+
+        /// <summary>
+        /// If true, arrays will be treated as collections, allowing
+        /// those of different dimensions to be compared
+        /// </summary>
+        private bool compareAsCollection;
+
+        /// <summary>
+        /// Comparison objects used in comparisons for some constraints.
+        /// </summary>
+        private EqualityAdapterList externalComparers = new EqualityAdapterList();
+
+        /// <summary>
+        /// List of points at which a failure occured.
+        /// </summary>
+        private FailurePointList failurePoints;
+
+        /// <summary>
+        /// RecursionDetector used to check for recursion when
+        /// evaluating self-referencing enumerables.
+        /// </summary>
+        private RecursionDetector recursionDetector;
+
+        private static readonly int BUFFER_SIZE = 4096;
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Returns the default NUnitEqualityComparer
+        /// </summary>
+        public static NUnitEqualityComparer Default
+        {
+            get { return new NUnitEqualityComparer(); }
+        }
+        /// <summary>
+        /// Gets and sets a flag indicating whether case should
+        /// be ignored in determining equality.
+        /// </summary>
+        public bool IgnoreCase
+        {
+            get { return caseInsensitive; }
+            set { caseInsensitive = value; }
+        }
+
+        /// <summary>
+        /// Gets and sets a flag indicating that arrays should be
+        /// compared as collections, without regard to their shape.
+        /// </summary>
+        public bool CompareAsCollection
+        {
+            get { return compareAsCollection; }
+            set { compareAsCollection = value; }
+        }
+
+        /// <summary>
+        /// Gets the list of external comparers to be used to
+        /// test for equality. They are applied to members of
+        /// collections, in place of NUnit's own logic.
+        /// </summary>
+#if CLR_2_0 || CLR_4_0
+        public IList<EqualityAdapter> ExternalComparers
+#else
+        public IList ExternalComparers
+#endif
+        {
+            get { return externalComparers; }
+        }
+
+        /// <summary>
+        /// Gets the list of failure points for the last Match performed.
+        /// The list consists of objects to be interpreted by the caller.
+        /// This generally means that the caller may only make use of
+        /// objects it has placed on the list at a particular depthy.
+        /// </summary>
+#if CLR_2_0 || CLR_4_0
+        public IList<FailurePoint> FailurePoints
+#else
+        public IList FailurePoints
+#endif
+        {
+            get { return failurePoints; }
+        }
+
+        #endregion
+
+        #region Public Methods
+
+        /// <summary>
+        /// Compares two objects for equality within a tolerance, setting
+        /// the tolerance to the actual tolerance used if an empty
+        /// tolerance is supplied.
+        /// </summary>
+        public bool AreEqual(object expected, object actual, ref Tolerance tolerance)
+        {
+            this.failurePoints = new FailurePointList();
+            this.recursionDetector = new RecursionDetector();
+
+            return ObjectsEqual(expected, actual, ref tolerance);
+        }
+
+        #endregion
+
+        #region Helper Methods
+
+        private bool ObjectsEqual(object expected, object actual, ref Tolerance tolerance)
+        {
+            if (expected == null && actual == null)
+                return true;
+
+            if (expected == null || actual == null)
+                return false;
+
+            if (object.ReferenceEquals(expected, actual))
+                return true;
+
+            Type xType = expected.GetType();
+            Type yType = actual.GetType();
+
+            EqualityAdapter externalComparer = GetExternalComparer(expected, actual);
+            if (externalComparer != null)
+                return externalComparer.AreEqual(expected, actual);
+
+            if (xType.IsArray && yType.IsArray && !compareAsCollection)
+                return ArraysEqual((Array) expected, (Array) actual, ref tolerance);
+
+            if (expected is IDictionary && actual is IDictionary)
+                return DictionariesEqual((IDictionary) expected, (IDictionary) actual, ref tolerance);
+
+            if (expected is IEnumerable && actual is IEnumerable && !(expected is string && actual is string))
+                return EnumerablesEqual((IEnumerable) expected, (IEnumerable) actual, ref tolerance);
+
+            if (expected is string && actual is string)
+                return StringsEqual((string) expected, (string) actual);
+
+            if (expected is Stream && actual is Stream)
+                return StreamsEqual((Stream) expected, (Stream) actual);
+
+            if (expected is DirectoryInfo && actual is DirectoryInfo)
+                return DirectoriesEqual((DirectoryInfo) expected, (DirectoryInfo) actual);
+
+            if (Numerics.IsNumericType(expected) && Numerics.IsNumericType(actual))
+                return Numerics.AreEqual(expected, actual, ref tolerance);
+
+            if (tolerance != null && tolerance.Value is TimeSpan)
+            {
+                TimeSpan amount = (TimeSpan) tolerance.Value;
+
+                if (expected is DateTime && actual is DateTime)
+                    return ((DateTime) expected - (DateTime) actual).Duration() <= amount;
+
+                if (expected is TimeSpan && actual is TimeSpan)
+                    return ((TimeSpan) expected - (TimeSpan) actual).Duration() <= amount;
+            }
+
+#if CLR_2_0 || CLR_4_0
+            if (FirstImplementsIEquatableOfSecond(xType, yType))
+                return InvokeFirstIEquatableEqualsSecond(expected, actual);
+            else if (FirstImplementsIEquatableOfSecond(yType, xType))
+                return InvokeFirstIEquatableEqualsSecond(actual, expected);
+#endif
+
+            return expected.Equals(actual);
+        }
+
+#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)
+    	{
+            foreach (Type @interface in type.GetInterfaces())
+                if (@interface.IsGenericType && @interface.GetGenericTypeDefinition().Equals(typeof(IEquatable<>)))
+                    return @interface.GetGenericArguments();
+
+            return new Type[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
+
+        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 expected, Array actual, ref Tolerance tolerance)
+        {
+            int rank = expected.Rank;
+
+            if (rank != actual.Rank)
+                return false;
+
+            for (int r = 1; r < rank; r++)
+                if (expected.GetLength(r) != actual.GetLength(r))
+                    return false;
+
+            return EnumerablesEqual((IEnumerable)expected, (IEnumerable)actual, ref tolerance);
+        }
+
+        private bool DictionariesEqual(IDictionary expected, IDictionary actual, ref Tolerance tolerance)
+        {
+            if (expected.Count != actual.Count)
+                return false;
+
+            CollectionTally tally = new CollectionTally(this, expected.Keys);
+            if (!tally.TryRemove(actual.Keys) || tally.Count > 0)
+                return false;
+
+            foreach (object key in expected.Keys)
+                if (!ObjectsEqual(expected[key], actual[key], ref tolerance))
+                    return false;
+
+            return true;
+        }
+
+        private bool StringsEqual(string expected, string actual)
+        {
+            string s1 = caseInsensitive ? expected.ToLower() : expected;
+            string s2 = caseInsensitive ? actual.ToLower() : actual;
+
+            return s1.Equals(s2);
+        }
+        
+        private bool EnumerablesEqual(IEnumerable expected, IEnumerable actual, ref Tolerance tolerance)
+        {
+            if (recursionDetector.CheckRecursion(expected, actual))
+                return false;
+
+            IEnumerator expectedEnum = expected.GetEnumerator();
+            IEnumerator actualEnum = actual.GetEnumerator();
+
+            int count;
+            for (count = 0; ; count++)
+            {
+                bool expectedHasData = expectedEnum.MoveNext();
+                bool actualHasData = actualEnum.MoveNext();
+
+                if (!expectedHasData && !actualHasData)
+                    return true;
+
+                if (expectedHasData != actualHasData ||
+                    !ObjectsEqual(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;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Method to compare two DirectoryInfo objects
+        /// </summary>
+        /// <param name="expected">first directory to compare</param>
+        /// <param name="actual">second directory to compare</param>
+        /// <returns>true if equivalent, false if not</returns>
+        private static bool DirectoriesEqual(DirectoryInfo expected, DirectoryInfo actual)
+        {
+            // Do quick compares first
+            if (expected.Attributes != actual.Attributes ||
+                expected.CreationTime != actual.CreationTime ||
+                expected.LastAccessTime != actual.LastAccessTime)
+            {
+                return false;
+            }
+
+            // TODO: Find a cleaner way to do this
+            return new SamePathConstraint(expected.FullName).Matches(actual.FullName);
+        }
+
+        private bool StreamsEqual(Stream expected, Stream actual)
+        {
+            if (expected == actual) return true;
+
+            if (!expected.CanRead)
+                throw new ArgumentException("Stream is not readable", "expected");
+            if (!actual.CanRead)
+                throw new ArgumentException("Stream is not readable", "actual");
+            if (!expected.CanSeek)
+                throw new ArgumentException("Stream is not seekable", "expected");
+            if (!actual.CanSeek)
+                throw new ArgumentException("Stream is not seekable", "actual");
+
+            if (expected.Length != actual.Length) return false;
+
+            byte[] bufferExpected = new byte[BUFFER_SIZE];
+            byte[] bufferActual = new byte[BUFFER_SIZE];
+
+            BinaryReader binaryReaderExpected = new BinaryReader(expected);
+            BinaryReader binaryReaderActual = new BinaryReader(actual);
+
+            long expectedPosition = expected.Position;
+            long actualPosition = actual.Position;
+
+            try
+            {
+                binaryReaderExpected.BaseStream.Seek(0, SeekOrigin.Begin);
+                binaryReaderActual.BaseStream.Seek(0, SeekOrigin.Begin);
+
+                for (long readByte = 0; readByte < expected.Length; readByte += BUFFER_SIZE)
+                {
+                    binaryReaderExpected.Read(bufferExpected, 0, BUFFER_SIZE);
+                    binaryReaderActual.Read(bufferActual, 0, BUFFER_SIZE);
+
+                    for (int count = 0; count < BUFFER_SIZE; ++count)
+                    {
+                        if (bufferExpected[count] != bufferActual[count])
+                        {
+                            FailurePoint fp = new FailurePoint();
+                            fp.Position = (int)readByte + count;
+                            failurePoints.Insert(0, fp);
+                            return false;
+                        }
+                    }
+                }
+            }
+            finally
+            {
+                expected.Position = expectedPosition;
+                actual.Position = actualPosition;
+            }
+
+            return true;
+        }
+        #endregion
+
+        #region Nested RecursionDetector class
+
+        /// <summary>
+        /// RecursionDetector detects when a comparison
+        /// between two enumerables has reached a point
+        /// where the same objects that were previously
+        /// compared are again being compared. This allows
+        /// the caller to stop the comparison if desired.
+        /// </summary>
+        class RecursionDetector
+        {
+#if CLR_2_0 || CLR_4_0
+            readonly Dictionary<UnorderedReferencePair, object> table = new Dictionary<UnorderedReferencePair, object>();
+#else
+            readonly Hashtable table = new Hashtable();
+#endif
+
+            /// <summary>
+            /// Check whether two objects have previously
+            /// been compared, returning true if they have.
+            /// The two objects are remembered, so that a
+            /// second call will always return true.
+            /// </summary>
+            public bool CheckRecursion(IEnumerable expected, IEnumerable actual)
+            {
+                UnorderedReferencePair pair = new UnorderedReferencePair(expected, actual);
+
+                if (ContainsPair(pair))
+                    return true;
+
+                table.Add(pair, null);
+                return false;
+            }
+
+            private bool ContainsPair(UnorderedReferencePair pair)
+            {
+#if CLR_2_0 || CLR_4_0
+                return table.ContainsKey(pair);
+#else
+                return table.Contains(pair);
+#endif
+            }
+
+#if CLR_2_0 || CLR_4_0
+            class UnorderedReferencePair : IEquatable<UnorderedReferencePair>
+#else
+            class UnorderedReferencePair
+#endif
+            {
+                private readonly object first;
+                private readonly object second;
+
+                public UnorderedReferencePair(object first, object second)
+                {
+                    this.first = first;
+                    this.second = second;
+                }
+
+                public bool Equals(UnorderedReferencePair other)
+                {
+                    return (ReferenceEquals(first, other.first) && ReferenceEquals(second, other.second)) || 
+                           (ReferenceEquals(first, other.second) && ReferenceEquals(second, other.first));
+                }
+
+                public override bool Equals(object obj)
+                {
+                    if (ReferenceEquals(null, obj)) return false;
+                    return obj is UnorderedReferencePair && Equals((UnorderedReferencePair) obj);
+                }
+
+                public override int GetHashCode()
+                {
+                    unchecked
+                    {
+                        return ((first != null ? first.GetHashCode() : 0)*397) ^ ((second != null ? second.GetHashCode() : 0)*397);
+                    }
+                }
+            }
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Constraints/NaNConstraint.cs b/src/NUnitFramework/framework/Constraints/NaNConstraint.cs
new file mode 100644
index 0000000..7264dbb
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NaNConstraint.cs
@@ -0,0 +1,36 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NaNConstraint tests that the actual value is a double or float NaN
+    /// </summary>
+    public class NaNConstraint : Constraint
+    {
+        /// <summary>
+        /// Test that the actual value is an NaN
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            return actual is double && double.IsNaN((double)actual)
+                || actual is float && float.IsNaN((float)actual);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a specified writer
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("NaN");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NoItemConstraint.cs b/src/NUnitFramework/framework/Constraints/NoItemConstraint.cs
new file mode 100644
index 0000000..8827970
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NoItemConstraint.cs
@@ -0,0 +1,58 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NoItemConstraint applies another constraint to each
+    /// item in a collection, failing if any of them succeeds.
+    /// </summary>
+    public class NoItemConstraint : PrefixConstraint
+    {
+        /// <summary>
+        /// Construct a NoItemConstraint on top of an existing constraint
+        /// </summary>
+        /// <param name="itemConstraint"></param>
+        public NoItemConstraint(Constraint itemConstraint)
+            : base(itemConstraint)
+        {
+            this.DisplayName = "none";
+        }
+
+        /// <summary>
+        /// Apply the item constraint to each item in the collection,
+        /// failing if any item fails.
+        /// </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");
+
+            foreach (object item in (IEnumerable)actual)
+                if (baseConstraint.Matches(item))
+                    return false;
+
+            return true;
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("no item");
+            baseConstraint.WriteDescriptionTo(writer);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NotConstraint.cs b/src/NUnitFramework/framework/Constraints/NotConstraint.cs
new file mode 100644
index 0000000..068b203
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NotConstraint.cs
@@ -0,0 +1,51 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NotConstraint negates the effect of some other constraint
+    /// </summary>
+    public class NotConstraint : PrefixConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="NotConstraint"/> class.
+        /// </summary>
+        /// <param name="baseConstraint">The base constraint to be negated.</param>
+        public NotConstraint(Constraint baseConstraint)
+            : base(baseConstraint) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for if the base constraint fails, false if it succeeds</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return !baseConstraint.Matches(actual);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("not");
+            baseConstraint.WriteDescriptionTo(writer);
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a MessageWriter.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            baseConstraint.WriteActualValueTo(writer);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NullConstraint.cs b/src/NUnitFramework/framework/Constraints/NullConstraint.cs
new file mode 100644
index 0000000..371001f
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NullConstraint.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NullConstraint tests that the actual value is null
+    /// </summary>
+    public class NullConstraint : BasicConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:NullConstraint"/> class.
+        /// </summary>
+        public NullConstraint() : base(null, "null") { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/NullOrEmptyStringConstraint.cs b/src/NUnitFramework/framework/Constraints/NullOrEmptyStringConstraint.cs
new file mode 100644
index 0000000..4c7b9ba
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/NullOrEmptyStringConstraint.cs
@@ -0,0 +1,55 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// NullEmptyStringConstraint tests whether a string is either null or empty.
+    /// </summary>
+    public class NullOrEmptyStringConstraint : Constraint
+    {
+        /// <summary>
+        /// Constructs a new NullOrEmptyStringConstraint
+        /// </summary>
+        public NullOrEmptyStringConstraint()
+        {
+            this.DisplayName = "nullorempty";
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            // NOTE: Do not change this to use string.IsNullOrEmpty
+            // since that won't work in earlier versions of .NET
+
+            this.actual = actual;
+
+            if (actual == null) return true;
+
+            string actualAsString = actual as string;
+
+            if (actualAsString == null)
+                throw new ArgumentException("Actual value must be a string", "actual");
+
+            return actualAsString == string.Empty;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("null or empty string");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Numerics.cs b/src/NUnitFramework/framework/Constraints/Numerics.cs
index 6a9ee45..a290b8e 100644
--- a/src/NUnitFramework/framework/Constraints/Numerics.cs
+++ b/src/NUnitFramework/framework/Constraints/Numerics.cs
@@ -1,363 +1,363 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-	/// <summary>
-	/// The Numerics class contains common operations on numeric values.
-	/// </summary>
-	public class Numerics
-	{
-		#region Numeric Type Recognition
-		/// <summary>
-		/// Checks the type of the object, returning true if
-		/// the object is a numeric type.
-		/// </summary>
-		/// <param name="obj">The object to check</param>
-		/// <returns>true if the object is a numeric type</returns>
-		public static bool IsNumericType(Object obj)
-		{
-			return IsFloatingPointNumeric( obj ) || IsFixedPointNumeric( obj );
-		}
-
-		/// <summary>
-		/// Checks the type of the object, returning true if
-		/// the object is a floating point numeric type.
-		/// </summary>
-		/// <param name="obj">The object to check</param>
-		/// <returns>true if the object is a floating point numeric type</returns>
-		public static bool IsFloatingPointNumeric(Object obj)
-		{
-			if (null != obj)
-			{
-				if (obj is System.Double) return true;
-				if (obj is System.Single) return true;
-			}
-			return false;
-		}
-		/// <summary>
-		/// Checks the type of the object, returning true if
-		/// the object is a fixed point numeric type.
-		/// </summary>
-		/// <param name="obj">The object to check</param>
-		/// <returns>true if the object is a fixed point numeric type</returns>
-		public static bool IsFixedPointNumeric(Object obj)
-		{
-			if (null != obj)
-			{
-				if (obj is System.Byte) return true;
-				if (obj is System.SByte) return true;
-				if (obj is System.Decimal) return true;
-				if (obj is System.Int32) return true;
-				if (obj is System.UInt32) return true;
-				if (obj is System.Int64) return true;
-				if (obj is System.UInt64) return true;
-				if (obj is System.Int16) return true;
-				if (obj is System.UInt16) return true;
-			}
-			return false;
-		}
-		#endregion
-
-		#region Numeric Equality
-        /// <summary>
-        /// Test two numeric values for equality, performing the usual numeric 
-        /// conversions and using a provided or default tolerance. If the tolerance 
-        /// provided is Empty, this method may set it to a default tolerance.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <param name="tolerance">A reference to the tolerance in effect</param>
-        /// <returns>True if the values are equal</returns>
-		public static bool AreEqual( object expected, object actual, ref Tolerance tolerance )
-		{
-            if ( expected is double || actual is double )
-                return AreEqual( Convert.ToDouble(expected), Convert.ToDouble(actual), ref tolerance );
-
-            if ( expected is float || actual is float )
-                return AreEqual( Convert.ToSingle(expected), Convert.ToSingle(actual), ref tolerance );
-
-            if (tolerance.Mode == ToleranceMode.Ulps)
-                throw new InvalidOperationException("Ulps may only be specified for floating point arguments");
-
-			if ( expected is decimal || actual is decimal )
-				return AreEqual( Convert.ToDecimal(expected), Convert.ToDecimal(actual), tolerance );
-
-            if (expected is ulong || actual is ulong)
-                return AreEqual(Convert.ToUInt64(expected), Convert.ToUInt64(actual), tolerance );
-		
-			if ( expected is long || actual is long )
-				return AreEqual( Convert.ToInt64(expected), Convert.ToInt64(actual), tolerance );
-			
-			if ( expected is uint || actual is uint )
-				return AreEqual( Convert.ToUInt32(expected), Convert.ToUInt32(actual), tolerance );
-
-			return AreEqual( Convert.ToInt32(expected), Convert.ToInt32(actual), tolerance );
-		}
-
-        private static bool AreEqual( double expected, double actual, ref Tolerance tolerance )
-		{
-            if (double.IsNaN(expected) && double.IsNaN(actual))
-                return true;
-
-            // Handle infinity specially since subtracting two infinite values gives 
-            // NaN and the following test fails. mono also needs NaN to be handled
-            // specially although ms.net could use either method. Also, handle
-            // situation where no tolerance is used.
-            if (double.IsInfinity(expected) || double.IsNaN(expected) || double.IsNaN(actual))
-            {
-                return expected.Equals(actual);
-            }
-
-            if (tolerance.IsEmpty && GlobalSettings.DefaultFloatingPointTolerance > 0.0d)
-                tolerance = new Tolerance(GlobalSettings.DefaultFloatingPointTolerance);
-
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance.Value);
-
-                case ToleranceMode.Percent:
-                    if (expected == 0.0)
-                        return expected.Equals(actual);
-                    
-                    double relativeError = Math.Abs((expected - actual) / expected);
-                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
-#if !NETCF_1_0
-                case ToleranceMode.Ulps:
-                    return FloatingPointNumerics.AreAlmostEqualUlps(
-                        expected, actual, Convert.ToInt64(tolerance.Value));
-#endif
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-        }
-
-        private static bool AreEqual( float expected, float actual, ref Tolerance tolerance )
-		{
-            if ( float.IsNaN(expected) && float.IsNaN(actual) )
-                return true;
-
-            // handle infinity specially since subtracting two infinite values gives 
-            // NaN and the following test fails. mono also needs NaN to be handled
-            // specially although ms.net could use either method.
-            if (float.IsInfinity(expected) || float.IsNaN(expected) || float.IsNaN(actual))
-            {
-                return expected.Equals(actual);
-            }
-
-            if (tolerance.IsEmpty && GlobalSettings.DefaultFloatingPointTolerance > 0.0d)
-                tolerance = new Tolerance(GlobalSettings.DefaultFloatingPointTolerance);
-
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance.Value);
-
-                case ToleranceMode.Percent:
-                    if (expected == 0.0f)
-                        return expected.Equals(actual);
-                    float relativeError = Math.Abs((expected - actual) / expected);
-                    return (relativeError <= Convert.ToSingle(tolerance.Value) / 100.0f);
-#if !NETCF_1_0
-                case ToleranceMode.Ulps:
-                    return FloatingPointNumerics.AreAlmostEqualUlps(
-                        expected, actual, Convert.ToInt32(tolerance.Value));
-#endif
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-		}
-
-
-        private static bool AreEqual( decimal expected, decimal actual, Tolerance tolerance )
-        {
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    decimal decimalTolerance = Convert.ToDecimal(tolerance.Value);
-                    if(decimalTolerance > 0m)
-                      return Math.Abs(expected - actual) <= decimalTolerance;
-				
-			        return expected.Equals( actual );
-
-                case ToleranceMode.Percent:
-                    if(expected == 0m)
-                        return expected.Equals(actual);
-
-                    double relativeError = Math.Abs(
-                        (double)(expected - actual) / (double)expected);
-                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
-
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-        }
-
-		private static bool AreEqual( ulong expected, ulong actual, Tolerance tolerance )
-		{
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    ulong ulongTolerance = Convert.ToUInt64(tolerance.Value);
-                    if(ulongTolerance > 0ul)
-			        {
-				        ulong diff = expected >= actual ? expected - actual : actual - expected;
-                        return diff <= ulongTolerance;
-			        }
-
-			        return expected.Equals( actual );
-
-                case ToleranceMode.Percent:
-                    if (expected == 0ul)
-                        return expected.Equals(actual);
-
-                    // Can't do a simple Math.Abs() here since it's unsigned
-                    ulong difference = Math.Max(expected, actual) - Math.Min(expected, actual);
-                    double relativeError = Math.Abs( (double)difference / (double)expected );
-                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
-
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-		}
-
-		private static bool AreEqual( long expected, long actual, Tolerance tolerance )
-		{
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    long longTolerance = Convert.ToInt64(tolerance.Value);
-                    if(longTolerance > 0L)
-				        return Math.Abs(expected - actual) <= longTolerance;
-
-			        return expected.Equals( actual );
-
-                case ToleranceMode.Percent:
-                    if(expected == 0L)
-                        return expected.Equals(actual);
-
-                    double relativeError = Math.Abs(
-                        (double)(expected - actual) / (double)expected);
-                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
-
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-		}
-
-		private static bool AreEqual( uint expected, uint actual, Tolerance tolerance )
-		{
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    uint uintTolerance = Convert.ToUInt32(tolerance.Value);
-                    if(uintTolerance > 0)
-			        {
-				        uint diff = expected >= actual ? expected - actual : actual - expected;
-                        return diff <= uintTolerance;
-			        }
-				
-			        return expected.Equals( actual );
-
-                case ToleranceMode.Percent:
-                    if(expected == 0u)
-                        return expected.Equals(actual);
-
-                    // Can't do a simple Math.Abs() here since it's unsigned
-                    uint difference = Math.Max(expected, actual) - Math.Min(expected, actual);
-                    double relativeError = Math.Abs((double)difference / (double)expected );
-                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
-
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-		}
-
-		private static bool AreEqual( int expected, int actual, Tolerance tolerance )
-		{
-            switch (tolerance.Mode)
-            {
-                case ToleranceMode.None:
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Linear:
-                    int intTolerance = Convert.ToInt32(tolerance.Value);
-                    if (intTolerance > 0)
-                        return Math.Abs(expected - actual) <= intTolerance;
-
-                    return expected.Equals(actual);
-
-                case ToleranceMode.Percent:
-                    if (expected == 0)
-                        return expected.Equals(actual);
-
-                    double relativeError = Math.Abs(
-                        (double)(expected - actual) / (double)expected);
-                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
-
-                default:
-                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
-            }
-		}
-		#endregion
-
-		#region Numeric Comparisons 
-        /// <summary>
-        /// Compare two numeric values, performing the usual numeric conversions.
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        /// <param name="actual">The actual value</param>
-        /// <returns>The relationship of the values to each other</returns>
-		public static int Compare( object expected, object actual )
-		{
-			if( !IsNumericType( expected ) || !IsNumericType( actual ) )
-				throw new ArgumentException( "Both arguments must be numeric");
-
-			if ( IsFloatingPointNumeric(expected) || IsFloatingPointNumeric(actual) )
-				return Convert.ToDouble(expected).CompareTo(Convert.ToDouble(actual));
-
-			if ( expected is decimal || actual is decimal )
-				return Convert.ToDecimal(expected).CompareTo(Convert.ToDecimal(actual));
-		
-			if ( expected is ulong || actual is ulong )
-				return Convert.ToUInt64(expected).CompareTo(Convert.ToUInt64(actual));
-	
-			if ( expected is long || actual is long )
-				return Convert.ToInt64(expected).CompareTo(Convert.ToInt64(actual));
-		
-			if ( expected is uint || actual is uint )
-				return Convert.ToUInt32(expected).CompareTo(Convert.ToUInt32(actual));
-
-			return Convert.ToInt32(expected).CompareTo(Convert.ToInt32(actual));
-        }
-		#endregion
-
-		private Numerics()
-		{
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// The Numerics class contains common operations on numeric values.
+	/// </summary>
+	public class Numerics
+	{
+		#region Numeric Type Recognition
+		/// <summary>
+		/// Checks the type of the object, returning true if
+		/// the object is a numeric type.
+		/// </summary>
+		/// <param name="obj">The object to check</param>
+		/// <returns>true if the object is a numeric type</returns>
+		public static bool IsNumericType(Object obj)
+		{
+			return IsFloatingPointNumeric( obj ) || IsFixedPointNumeric( obj );
+		}
+
+		/// <summary>
+		/// Checks the type of the object, returning true if
+		/// the object is a floating point numeric type.
+		/// </summary>
+		/// <param name="obj">The object to check</param>
+		/// <returns>true if the object is a floating point numeric type</returns>
+		public static bool IsFloatingPointNumeric(Object obj)
+		{
+			if (null != obj)
+			{
+				if (obj is System.Double) return true;
+				if (obj is System.Single) return true;
+			}
+			return false;
+		}
+		/// <summary>
+		/// Checks the type of the object, returning true if
+		/// the object is a fixed point numeric type.
+		/// </summary>
+		/// <param name="obj">The object to check</param>
+		/// <returns>true if the object is a fixed point numeric type</returns>
+		public static bool IsFixedPointNumeric(Object obj)
+		{
+			if (null != obj)
+			{
+				if (obj is System.Byte) return true;
+				if (obj is System.SByte) return true;
+				if (obj is System.Decimal) return true;
+				if (obj is System.Int32) return true;
+				if (obj is System.UInt32) return true;
+				if (obj is System.Int64) return true;
+				if (obj is System.UInt64) return true;
+				if (obj is System.Int16) return true;
+				if (obj is System.UInt16) return true;
+			}
+			return false;
+		}
+		#endregion
+
+		#region Numeric Equality
+        /// <summary>
+        /// Test two numeric values for equality, performing the usual numeric 
+        /// conversions and using a provided or default tolerance. If the tolerance 
+        /// provided is Empty, this method may set it to a default tolerance.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <param name="tolerance">A reference to the tolerance in effect</param>
+        /// <returns>True if the values are equal</returns>
+		public static bool AreEqual( object expected, object actual, ref Tolerance tolerance )
+		{
+            if ( expected is double || actual is double )
+                return AreEqual( Convert.ToDouble(expected), Convert.ToDouble(actual), ref tolerance );
+
+            if ( expected is float || actual is float )
+                return AreEqual( Convert.ToSingle(expected), Convert.ToSingle(actual), ref tolerance );
+
+            if (tolerance.Mode == ToleranceMode.Ulps)
+                throw new InvalidOperationException("Ulps may only be specified for floating point arguments");
+
+			if ( expected is decimal || actual is decimal )
+				return AreEqual( Convert.ToDecimal(expected), Convert.ToDecimal(actual), tolerance );
+
+            if (expected is ulong || actual is ulong)
+                return AreEqual(Convert.ToUInt64(expected), Convert.ToUInt64(actual), tolerance );
+		
+			if ( expected is long || actual is long )
+				return AreEqual( Convert.ToInt64(expected), Convert.ToInt64(actual), tolerance );
+			
+			if ( expected is uint || actual is uint )
+				return AreEqual( Convert.ToUInt32(expected), Convert.ToUInt32(actual), tolerance );
+
+			return AreEqual( Convert.ToInt32(expected), Convert.ToInt32(actual), tolerance );
+		}
+
+        private static bool AreEqual( double expected, double actual, ref Tolerance tolerance )
+		{
+            if (double.IsNaN(expected) && double.IsNaN(actual))
+                return true;
+
+            // Handle infinity specially since subtracting two infinite values gives 
+            // NaN and the following test fails. mono also needs NaN to be handled
+            // specially although ms.net could use either method. Also, handle
+            // situation where no tolerance is used.
+            if (double.IsInfinity(expected) || double.IsNaN(expected) || double.IsNaN(actual))
+            {
+                return expected.Equals(actual);
+            }
+
+            if (tolerance.IsEmpty && GlobalSettings.DefaultFloatingPointTolerance > 0.0d)
+                tolerance = new Tolerance(GlobalSettings.DefaultFloatingPointTolerance);
+
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance.Value);
+
+                case ToleranceMode.Percent:
+                    if (expected == 0.0)
+                        return expected.Equals(actual);
+                    
+                    double relativeError = Math.Abs((expected - actual) / expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+#if !NETCF_1_0
+                case ToleranceMode.Ulps:
+                    return FloatingPointNumerics.AreAlmostEqualUlps(
+                        expected, actual, Convert.ToInt64(tolerance.Value));
+#endif
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+        }
+
+        private static bool AreEqual( float expected, float actual, ref Tolerance tolerance )
+		{
+            if ( float.IsNaN(expected) && float.IsNaN(actual) )
+                return true;
+
+            // handle infinity specially since subtracting two infinite values gives 
+            // NaN and the following test fails. mono also needs NaN to be handled
+            // specially although ms.net could use either method.
+            if (float.IsInfinity(expected) || float.IsNaN(expected) || float.IsNaN(actual))
+            {
+                return expected.Equals(actual);
+            }
+
+            if (tolerance.IsEmpty && GlobalSettings.DefaultFloatingPointTolerance > 0.0d)
+                tolerance = new Tolerance(GlobalSettings.DefaultFloatingPointTolerance);
+
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    return Math.Abs(expected - actual) <= Convert.ToDouble(tolerance.Value);
+
+                case ToleranceMode.Percent:
+                    if (expected == 0.0f)
+                        return expected.Equals(actual);
+                    float relativeError = Math.Abs((expected - actual) / expected);
+                    return (relativeError <= Convert.ToSingle(tolerance.Value) / 100.0f);
+#if !NETCF_1_0
+                case ToleranceMode.Ulps:
+                    return FloatingPointNumerics.AreAlmostEqualUlps(
+                        expected, actual, Convert.ToInt32(tolerance.Value));
+#endif
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+		}
+
+
+        private static bool AreEqual( decimal expected, decimal actual, Tolerance tolerance )
+        {
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    decimal decimalTolerance = Convert.ToDecimal(tolerance.Value);
+                    if(decimalTolerance > 0m)
+                      return Math.Abs(expected - actual) <= decimalTolerance;
+				
+			        return expected.Equals( actual );
+
+                case ToleranceMode.Percent:
+                    if(expected == 0m)
+                        return expected.Equals(actual);
+
+                    double relativeError = Math.Abs(
+                        (double)(expected - actual) / (double)expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+        }
+
+		private static bool AreEqual( ulong expected, ulong actual, Tolerance tolerance )
+		{
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    ulong ulongTolerance = Convert.ToUInt64(tolerance.Value);
+                    if(ulongTolerance > 0ul)
+			        {
+				        ulong diff = expected >= actual ? expected - actual : actual - expected;
+                        return diff <= ulongTolerance;
+			        }
+
+			        return expected.Equals( actual );
+
+                case ToleranceMode.Percent:
+                    if (expected == 0ul)
+                        return expected.Equals(actual);
+
+                    // Can't do a simple Math.Abs() here since it's unsigned
+                    ulong difference = Math.Max(expected, actual) - Math.Min(expected, actual);
+                    double relativeError = Math.Abs( (double)difference / (double)expected );
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+		}
+
+		private static bool AreEqual( long expected, long actual, Tolerance tolerance )
+		{
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    long longTolerance = Convert.ToInt64(tolerance.Value);
+                    if(longTolerance > 0L)
+				        return Math.Abs(expected - actual) <= longTolerance;
+
+			        return expected.Equals( actual );
+
+                case ToleranceMode.Percent:
+                    if(expected == 0L)
+                        return expected.Equals(actual);
+
+                    double relativeError = Math.Abs(
+                        (double)(expected - actual) / (double)expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+		}
+
+		private static bool AreEqual( uint expected, uint actual, Tolerance tolerance )
+		{
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    uint uintTolerance = Convert.ToUInt32(tolerance.Value);
+                    if(uintTolerance > 0)
+			        {
+				        uint diff = expected >= actual ? expected - actual : actual - expected;
+                        return diff <= uintTolerance;
+			        }
+				
+			        return expected.Equals( actual );
+
+                case ToleranceMode.Percent:
+                    if(expected == 0u)
+                        return expected.Equals(actual);
+
+                    // Can't do a simple Math.Abs() here since it's unsigned
+                    uint difference = Math.Max(expected, actual) - Math.Min(expected, actual);
+                    double relativeError = Math.Abs((double)difference / (double)expected );
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+		}
+
+		private static bool AreEqual( int expected, int actual, Tolerance tolerance )
+		{
+            switch (tolerance.Mode)
+            {
+                case ToleranceMode.None:
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Linear:
+                    int intTolerance = Convert.ToInt32(tolerance.Value);
+                    if (intTolerance > 0)
+                        return Math.Abs(expected - actual) <= intTolerance;
+
+                    return expected.Equals(actual);
+
+                case ToleranceMode.Percent:
+                    if (expected == 0)
+                        return expected.Equals(actual);
+
+                    double relativeError = Math.Abs(
+                        (double)(expected - actual) / (double)expected);
+                    return (relativeError <= Convert.ToDouble(tolerance.Value) / 100.0);
+
+                default:
+                    throw new ArgumentException("Unknown tolerance mode specified", "mode");
+            }
+		}
+		#endregion
+
+		#region Numeric Comparisons 
+        /// <summary>
+        /// Compare two numeric values, performing the usual numeric conversions.
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        /// <param name="actual">The actual value</param>
+        /// <returns>The relationship of the values to each other</returns>
+		public static int Compare( object expected, object actual )
+		{
+			if( !IsNumericType( expected ) || !IsNumericType( actual ) )
+				throw new ArgumentException( "Both arguments must be numeric");
+
+			if ( IsFloatingPointNumeric(expected) || IsFloatingPointNumeric(actual) )
+				return Convert.ToDouble(expected).CompareTo(Convert.ToDouble(actual));
+
+			if ( expected is decimal || actual is decimal )
+				return Convert.ToDecimal(expected).CompareTo(Convert.ToDecimal(actual));
+		
+			if ( expected is ulong || actual is ulong )
+				return Convert.ToUInt64(expected).CompareTo(Convert.ToUInt64(actual));
+	
+			if ( expected is long || actual is long )
+				return Convert.ToInt64(expected).CompareTo(Convert.ToInt64(actual));
+		
+			if ( expected is uint || actual is uint )
+				return Convert.ToUInt32(expected).CompareTo(Convert.ToUInt32(actual));
+
+			return Convert.ToInt32(expected).CompareTo(Convert.ToInt32(actual));
+        }
+		#endregion
+
+		private Numerics()
+		{
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/AllOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/AllOperator.cs
new file mode 100644
index 0000000..8d2f9ad
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/AllOperator.cs
@@ -0,0 +1,25 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Represents a constraint that succeeds if all the 
+    /// members of a collection match a base constraint.
+    /// </summary>
+    public class AllOperator : CollectionOperator
+    {
+        /// <summary>
+        /// Returns a constraint that will apply the argument
+        /// to the members of a collection, succeeding if
+        /// they all succeed.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new AllItemsConstraint(constraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/AndOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/AndOperator.cs
new file mode 100644
index 0000000..3d1fc48
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/AndOperator.cs
@@ -0,0 +1,30 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Operator that requires both it's arguments to succeed
+    /// </summary>
+    public class AndOperator : BinaryOperator
+    {
+        /// <summary>
+        /// Construct an AndOperator
+        /// </summary>
+        public AndOperator()
+        {
+            this.left_precedence = this.right_precedence = 2;
+        }
+
+        /// <summary>
+        /// Apply the operator to produce an AndConstraint
+        /// </summary>
+        public override Constraint ApplyOperator(Constraint left, Constraint right)
+        {
+            return new AndConstraint(left, right);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/AttributeOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/AttributeOperator.cs
new file mode 100644
index 0000000..68d294a
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/AttributeOperator.cs
@@ -0,0 +1,45 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Operator that tests for the presence of a particular attribute
+    /// on a type and optionally applies further tests to the attribute.
+    /// </summary>
+    public class AttributeOperator : SelfResolvingOperator
+    {
+        private readonly Type type;
+
+        /// <summary>
+        /// Construct an AttributeOperator for a particular Type
+        /// </summary>
+        /// <param name="type">The Type of attribute tested</param>
+        public AttributeOperator(Type type)
+        {
+            this.type = type;
+
+            // Attribute stacks on anything and allows only 
+            // prefix operators to stack on it.
+            this.left_precedence = this.right_precedence = 1;
+        }
+
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            if (RightContext == null || RightContext is BinaryOperator)
+                stack.Push(new AttributeExistsConstraint(type));
+            else
+                stack.Push(new AttributeConstraint(type, stack.Pop()));
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/BinaryOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/BinaryOperator.cs
new file mode 100644
index 0000000..c6f7b40
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/BinaryOperator.cs
@@ -0,0 +1,59 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Abstract base class for all binary operators
+    /// </summary>
+    public abstract class BinaryOperator : ConstraintOperator
+    {
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        /// <param name="stack"></param>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            Constraint right = stack.Pop();
+            Constraint left = stack.Pop();
+            stack.Push(ApplyOperator(left, right));
+        }
+
+        /// <summary>
+        /// Gets the left precedence of the operator
+        /// </summary>
+        public override int LeftPrecedence
+        {
+            get
+            {
+                return RightContext is CollectionOperator
+                    ? base.LeftPrecedence + 10
+                    : base.LeftPrecedence;
+            }
+        }
+
+        /// <summary>
+        /// Gets the right precedence of the operator
+        /// </summary>
+        public override int RightPrecedence
+        {
+            get
+            {
+                return RightContext is CollectionOperator
+                    ? base.RightPrecedence + 10
+                    : base.RightPrecedence;
+            }
+        }
+
+        /// <summary>
+        /// Abstract method that produces a constraint by applying
+        /// the operator to its left and right constraint arguments.
+        /// </summary>
+        public abstract Constraint ApplyOperator(Constraint left, Constraint right);
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/CollectionOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/CollectionOperator.cs
new file mode 100644
index 0000000..d2e9fc0
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/CollectionOperator.cs
@@ -0,0 +1,26 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Abstract base for operators that indicate how to
+    /// apply a constraint to items in a collection.
+    /// </summary>
+    public abstract class CollectionOperator : PrefixOperator
+    {
+        /// <summary>
+        /// Constructs a CollectionOperator
+        /// </summary>
+        protected CollectionOperator()
+        {
+            // Collection Operators stack on everything
+            // and allow all other ops to stack on them
+            this.left_precedence = 1;
+            this.right_precedence = 10;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/ConstraintOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/ConstraintOperator.cs
new file mode 100644
index 0000000..f13d8fb
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/ConstraintOperator.cs
@@ -0,0 +1,79 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// The ConstraintOperator class is used internally by a
+    /// ConstraintBuilder to represent an operator that 
+    /// modifies or combines constraints. 
+    /// 
+    /// Constraint operators use left and right precedence
+    /// values to determine whether the top operator on the
+    /// stack should be reduced before pushing a new operator.
+    /// </summary>
+    public abstract class ConstraintOperator
+    {
+        private object leftContext;
+        private object rightContext;
+
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is about to be pushed to the stack.
+		/// </summary>
+		protected int left_precedence;
+        
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is on the top of the stack.
+		/// </summary>
+		protected int right_precedence;
+
+		/// <summary>
+		/// The syntax element preceding this operator
+		/// </summary>
+        public object LeftContext
+        {
+            get { return leftContext; }
+            set { leftContext = value; }
+        }
+
+		/// <summary>
+		/// The syntax element folowing this operator
+		/// </summary>
+        public object RightContext
+        {
+            get { return rightContext; }
+            set { rightContext = value; }
+        }
+
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is about to be pushed to the stack.
+		/// </summary>
+		public virtual int LeftPrecedence
+        {
+            get { return left_precedence; }
+        }
+
+		/// <summary>
+		/// The precedence value used when the operator
+		/// is on the top of the stack.
+		/// </summary>
+		public virtual int RightPrecedence
+        {
+            get { return right_precedence; }
+        }
+
+		/// <summary>
+		/// Reduce produces a constraint from the operator and 
+		/// any arguments. It takes the arguments from the constraint 
+		/// stack and pushes the resulting constraint on it.
+		/// </summary>
+		/// <param name="stack"></param>
+		public abstract void Reduce(ConstraintBuilder.ConstraintStack stack);
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/ExactCountOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/ExactCountOperator.cs
new file mode 100644
index 0000000..d2c1e2b
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/ExactCountOperator.cs
@@ -0,0 +1,36 @@
+// ****************************************************************
+// 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
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <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);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/NoneOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/NoneOperator.cs
new file mode 100644
index 0000000..7efd613
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/NoneOperator.cs
@@ -0,0 +1,25 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Represents a constraint that succeeds if none of the 
+    /// members of a collection match a base constraint.
+    /// </summary>
+    public class NoneOperator : CollectionOperator
+    {
+        /// <summary>
+        /// Returns a constraint that will apply the argument
+        /// to the members of a collection, succeeding if
+        /// none of them succeed.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new NoItemConstraint(constraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/NotOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/NotOperator.cs
new file mode 100644
index 0000000..a3abae1
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/NotOperator.cs
@@ -0,0 +1,32 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Negates the test of the constraint it wraps.
+    /// </summary>
+    public class NotOperator : PrefixOperator
+    {
+        /// <summary>
+        /// Constructs a new NotOperator
+        /// </summary>
+        public NotOperator()
+        {
+            // Not stacks on anything and only allows other
+            // prefix ops to stack on top of it.
+            this.left_precedence = this.right_precedence = 1;
+        }
+
+        /// <summary>
+        /// Returns a NotConstraint applied to its argument.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new NotConstraint(constraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/OrOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/OrOperator.cs
new file mode 100644
index 0000000..099eedd
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/OrOperator.cs
@@ -0,0 +1,30 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Operator that requires at least one of it's arguments to succeed
+    /// </summary>
+    public class OrOperator : BinaryOperator
+    {
+        /// <summary>
+        /// Construct an OrOperator
+        /// </summary>
+        public OrOperator()
+        {
+            this.left_precedence = this.right_precedence = 3;
+        }
+
+        /// <summary>
+        /// Apply the operator to produce an OrConstraint
+        /// </summary>
+        public override Constraint ApplyOperator(Constraint left, Constraint right)
+        {
+            return new OrConstraint(left, right);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/PrefixOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/PrefixOperator.cs
new file mode 100644
index 0000000..1b079a5
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/PrefixOperator.cs
@@ -0,0 +1,34 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// PrefixOperator takes a single constraint and modifies
+    /// it's action in some way.
+    /// </summary>
+    public abstract class PrefixOperator : ConstraintOperator
+    {
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        /// <param name="stack"></param>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            stack.Push(ApplyPrefix(stack.Pop()));
+        }
+
+        /// <summary>
+        /// Returns the constraint created by applying this
+        /// prefix to another constraint.
+        /// </summary>
+        /// <param name="constraint"></param>
+        /// <returns></returns>
+        public abstract Constraint ApplyPrefix(Constraint constraint);
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/PropOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/PropOperator.cs
new file mode 100644
index 0000000..6e28dc0
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/PropOperator.cs
@@ -0,0 +1,52 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Operator used to test for the presence of a named Property
+    /// on an object and optionally apply further tests to the
+    /// value of that property.
+    /// </summary>
+    public class PropOperator : SelfResolvingOperator
+    {
+        private readonly string name;
+
+        /// <summary>
+        /// Gets the name of the property to which the operator applies
+        /// </summary>
+        public string Name
+        {
+            get { return name; }
+        }
+
+        /// <summary>
+        /// Constructs a PropOperator for a particular named property
+        /// </summary>
+        public PropOperator(string name)
+        {
+            this.name = name;
+
+            // Prop stacks on anything and allows only 
+            // prefix operators to stack on it.
+            this.left_precedence = this.right_precedence = 1;
+        }
+
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        /// <param name="stack"></param>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            if (RightContext == null || RightContext is BinaryOperator)
+                stack.Push(new PropertyExistsConstraint(name));
+            else
+                stack.Push(new PropertyConstraint(name, stack.Pop()));
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/SelfResolvingOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/SelfResolvingOperator.cs
new file mode 100644
index 0000000..063b6e4
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/SelfResolvingOperator.cs
@@ -0,0 +1,16 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Abstract base class for operators that are able to reduce to a 
+    /// constraint whether or not another syntactic element follows.
+    /// </summary>
+    public abstract class SelfResolvingOperator : ConstraintOperator
+    {
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/SomeOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/SomeOperator.cs
new file mode 100644
index 0000000..3f88f80
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/SomeOperator.cs
@@ -0,0 +1,25 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Represents a constraint that succeeds if any of the 
+    /// members of a collection match a base constraint.
+    /// </summary>
+    public class SomeOperator : CollectionOperator
+    {
+        /// <summary>
+        /// Returns a constraint that will apply the argument
+        /// to the members of a collection, succeeding if
+        /// any of them succeed.
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return new SomeItemsConstraint(constraint);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/ThrowsOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/ThrowsOperator.cs
new file mode 100644
index 0000000..f68357d
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/ThrowsOperator.cs
@@ -0,0 +1,40 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Operator that tests that an exception is thrown and
+    /// optionally applies further tests to the exception.
+    /// </summary>
+    public class ThrowsOperator : SelfResolvingOperator
+    {
+        /// <summary>
+        /// Construct a ThrowsOperator
+        /// </summary>
+        public ThrowsOperator()
+        {
+            // ThrowsOperator stacks on everything but
+            // it's always the first item on the stack
+            // anyway. It is evaluated last of all ops.
+            this.left_precedence = 1;
+            this.right_precedence = 100;
+        }
+
+        /// <summary>
+        /// Reduce produces a constraint from the operator and 
+        /// any arguments. It takes the arguments from the constraint 
+        /// stack and pushes the resulting constraint on it.
+        /// </summary>
+        public override void Reduce(ConstraintBuilder.ConstraintStack stack)
+        {
+            if (RightContext == null || RightContext is BinaryOperator)
+                stack.Push(new ThrowsConstraint(null));
+            else
+                stack.Push(new ThrowsConstraint(stack.Pop()));
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/Operators/WithOperator.cs b/src/NUnitFramework/framework/Constraints/Operators/WithOperator.cs
new file mode 100644
index 0000000..36df3b5
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/Operators/WithOperator.cs
@@ -0,0 +1,34 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Represents a constraint that simply wraps the
+    /// constraint provided as an argument, without any
+    /// further functionality, but which modifes the
+    /// order of evaluation because of its precedence.
+    /// </summary>
+    public class WithOperator : PrefixOperator
+    {
+        /// <summary>
+        /// Constructor for the WithOperator
+        /// </summary>
+        public WithOperator()
+        {
+            this.left_precedence = 1;
+            this.right_precedence = 4;
+        }
+
+        /// <summary>
+        /// Returns a constraint that wraps its argument
+        /// </summary>
+        public override Constraint ApplyPrefix(Constraint constraint)
+        {
+            return constraint;
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/OrConstraint.cs b/src/NUnitFramework/framework/Constraints/OrConstraint.cs
new file mode 100644
index 0000000..2ce97c2
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/OrConstraint.cs
@@ -0,0 +1,44 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// OrConstraint succeeds if either member succeeds
+    /// </summary>
+    public class OrConstraint : BinaryConstraint
+    {
+        /// <summary>
+        /// Create an OrConstraint from two other constraints
+        /// </summary>
+        /// <param name="left">The first constraint</param>
+        /// <param name="right">The second constraint</param>
+        public OrConstraint(Constraint left, Constraint right) : base(left, right) { }
+
+        /// <summary>
+        /// Apply the member constraints to an actual value, succeeding 
+        /// succeeding as soon as one of them succeeds.
+        /// </summary>
+        /// <param name="actual">The actual value</param>
+        /// <returns>True if either constraint succeeded</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            return left.Matches(actual) || right.Matches(actual);
+        }
+
+        /// <summary>
+        /// Write a description for this contraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The MessageWriter to receive the description</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            left.WriteDescriptionTo(writer);
+            writer.WriteConnector("or");
+            right.WriteDescriptionTo(writer);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/PathConstraint.cs b/src/NUnitFramework/framework/Constraints/PathConstraint.cs
new file mode 100644
index 0000000..85ff7cd
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/PathConstraint.cs
@@ -0,0 +1,163 @@
+// ***************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+	/// PathConstraint serves as the abstract base of constraints
+	/// that operate on paths and provides several helper methods.
+	/// </summary>
+	public abstract class PathConstraint : Constraint
+	{
+        private static readonly char[] DirectorySeparatorChars = new char[] { '\\', '/' };
+
+		/// <summary>
+		/// The expected path used in the constraint
+		/// </summary>
+		protected string expectedPath;
+		
+        /// <summary>
+        /// Flag indicating whether a caseInsensitive comparison should be made
+        /// </summary>
+        protected bool caseInsensitive = Path.DirectorySeparatorChar == '\\';
+
+        /// <summary>
+		/// Construct a PathConstraint for a give expected path
+		/// </summary>
+		/// <param name="expectedPath">The expected path</param>
+		protected PathConstraint( string expectedPath ) : base(expectedPath)
+		{
+			this.expectedPath = expectedPath;
+        }
+
+        /// <summary>
+        /// Modifies the current instance to be case-insensitve
+        /// and returns it.
+        /// </summary>
+        public PathConstraint IgnoreCase
+        {
+            get { caseInsensitive = true; return this; }
+        }
+
+        /// <summary>
+        /// Modifies the current instance to be case-sensitve
+        /// and returns it.
+        /// </summary>
+        public PathConstraint RespectCase
+        {
+            get { caseInsensitive = false; return this; }
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+            string actualPath = actual as string;
+
+            return actualPath != null && IsMatch(expectedPath, actualPath);
+        }
+
+        /// <summary>
+        /// Returns true if the expected path and actual path match
+        /// </summary>
+        protected abstract bool IsMatch(string expectedPath, string actualPath);
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format( "<{0} \"{1}\" {2}>", DisplayName, expectedPath, caseInsensitive ? "ignorecase" : "respectcase" );
+        }
+
+        #region Static Helper Methods
+
+        /// <summary>
+        /// Transform the provided path to its canonical form so that it 
+        /// may be more easily be compared with other paths.
+        /// </summary>
+        /// <param name="path">The original path</param>
+        /// <returns>The path in canonical form</returns>
+        protected static string Canonicalize(string path)
+        {
+            if (Path.DirectorySeparatorChar != Path.AltDirectorySeparatorChar)
+                path = path.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
+            string leadingSeparators = "";
+            foreach (char c in path)
+            {
+                if (c == Path.DirectorySeparatorChar)
+                    leadingSeparators += c;
+                else break;
+            }
+
+#if (CLR_2_0x || CLR_4_0) && !NETCF
+            string[] parts = path.Split(DirectorySeparatorChars, StringSplitOptions.RemoveEmptyEntries);
+#else
+            string[] parts = path.Split(DirectorySeparatorChars);
+#endif
+            int count = 0;
+            bool shifting = false;
+            foreach (string part in parts)
+            {
+                switch (part)
+                {
+                    case "":
+                    case ".":
+                        shifting = true;
+                        break;
+
+                    case "..":
+                        shifting = true;
+                        if (count > 0)
+                            --count;
+                        break;
+
+                    default:
+                        if (shifting)
+                            parts[count] = part;
+                        ++count;
+                        break;
+                }
+            }
+
+            return leadingSeparators + String.Join(Path.DirectorySeparatorChar.ToString(), parts, 0, count);
+        }
+
+        /// <summary>
+        /// Test whether one path in canonical form is under another.
+        /// </summary>
+        /// <param name="path1">The first path - supposed to be the parent path</param>
+        /// <param name="path2">The second path - supposed to be the child path</param>
+        /// <param name="ignoreCase">Indicates whether case should be ignored</param>
+        /// <returns></returns>
+        protected static bool IsSubPath(string path1, string path2, bool ignoreCase)
+		{
+            int length1 = path1.Length;
+			int length2 = path2.Length;
+
+			// if path1 is longer or equal, then path2 can't be under it
+			if ( length1 >= length2 )
+				return false;
+
+			// path 2 is longer than path 1: see if initial parts match
+			if ( string.Compare( path1, path2.Substring( 0, length1 ), ignoreCase ) != 0 )
+				return false;
+			
+			// must match through or up to a directory separator boundary
+			return	path2[length1-1] == Path.DirectorySeparatorChar ||
+				length2 > length1 && path2[length1] == Path.DirectorySeparatorChar;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/PathConstraints.cs b/src/NUnitFramework/framework/Constraints/PathConstraints.cs
deleted file mode 100644
index 38a768b..0000000
--- a/src/NUnitFramework/framework/Constraints/PathConstraints.cs
+++ /dev/null
@@ -1,321 +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 System.IO;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    #region PathConstraint
-    /// <summary>
-	/// PathConstraint serves as the abstract base of constraints
-	/// that operate on paths and provides several helper methods.
-	/// </summary>
-	public abstract class PathConstraint : Constraint
-	{
-        private static readonly char[] DirectorySeparatorChars = new char[] { '\\', '/' };
-
-		/// <summary>
-		/// The expected path used in the constraint
-		/// </summary>
-		protected string expectedPath;
-		
-		/// <summary>
-		/// The actual path being tested
-		/// </summary>
-		protected string actualPath;
-
-        /// <summary>
-        /// Flag indicating whether a caseInsensitive comparison should be made
-        /// </summary>
-        protected bool caseInsensitive = Path.DirectorySeparatorChar == '\\';
-
-        /// <summary>
-		/// Construct a PathConstraint for a give expected path
-		/// </summary>
-		/// <param name="expected">The expected path</param>
-		protected PathConstraint( string expected ) : base(expected)
-		{
-			this.expectedPath = expected;
-        }
-
-        /// <summary>
-        /// Modifies the current instance to be case-insensitve
-        /// and returns it.
-        /// </summary>
-        public PathConstraint IgnoreCase
-        {
-            get { caseInsensitive = true; return this; }
-        }
-
-        /// <summary>
-        /// Modifies the current instance to be case-sensitve
-        /// and returns it.
-        /// </summary>
-        public PathConstraint RespectCase
-        {
-            get { caseInsensitive = false; return this; }
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-		public override bool Matches (object actual)
-		{
-			this.actual = actual;
-			this.actualPath = actual as string;
-
-			if (actualPath == null)
-                return false;
-			
-			return IsMatch(expectedPath, actualPath);
-		}
-		
-        /// <summary>
-        /// Returns true if the expected path and actual path match
-        /// </summary>
-		protected abstract bool IsMatch(string expectedPath, string actualPath);
-		
-        /// <summary>
-        /// Returns the string representation of this constraint
-        /// </summary>
-        protected override string GetStringRepresentation()
-        {
-            return string.Format( "<{0} \"{1}\" {2}>", DisplayName, expectedPath, caseInsensitive ? "ignorecase" : "respectcase" );
-        }
-
-        #region Helper Methods
-        /// <summary>
-		/// Canonicalize the provided path
-		/// </summary>
-		/// <param name="path"></param>
-		/// <returns>The path in standardized form</returns>
-		protected static string Canonicalize( string path )
-		{
-			bool initialSeparator = false;
-			
-			if (path.Length > 0)
-				foreach(char c in DirectorySeparatorChars)
-					if (path[0] == c)
-						initialSeparator = true;
-			
-			ArrayList parts = new ArrayList( path.Split( DirectorySeparatorChars ) );
-
-			for( int index = 0; index < parts.Count; )
-			{
-				string part = (string)parts[index];
-		
-				switch( part )
-				{
-					case ".":
-						parts.RemoveAt( index );
-						break;
-				
-					case "..":
-						parts.RemoveAt( index );
-						if ( index > 0 )
-							parts.RemoveAt( --index );
-						break;
-					default:
-						index++;
-						break;
-				}
-			}
-
-            // Trailing separator removal
-            if ((string)parts[parts.Count - 1] == "")
-                parts.RemoveAt(parts.Count - 1);
-
-            string result = String.Join(Path.DirectorySeparatorChar.ToString(), 
-				(string[])parts.ToArray( typeof( string ) ) );
-			
-			if (initialSeparator)
-				result = Path.DirectorySeparatorChar.ToString() + result;
-			
-			return result;
-		}
-
-		/// <summary>
-		/// Test whether two paths are the same
-		/// </summary>
-		/// <param name="path1">The first path</param>
-		/// <param name="path2">The second path</param>
-        /// <param name="ignoreCase">Indicates whether case should be ignored</param>
-		/// <returns></returns>
-		protected static bool IsSamePath( string path1, string path2, bool ignoreCase )
-		{
-			return string.Compare( path1, path2, ignoreCase ) == 0;
-		}
-
-		/// <summary>
-		/// Test whether one path is under another path
-		/// </summary>
-		/// <param name="path1">The first path - supposed to be the parent path</param>
-		/// <param name="path2">The second path - supposed to be the child path</param>
-        /// <param name="ignoreCase">Indicates whether case should be ignored</param>
-		/// <returns></returns>
-		protected static bool IsSubPath( string path1, string path2, bool ignoreCase )
-		{
-			int length1 = path1.Length;
-			int length2 = path2.Length;
-
-			// if path1 is longer or equal, then path2 can't be under it
-			if ( length1 >= length2 )
-				return false;
-
-			// path 2 is longer than path 1: see if initial parts match
-			if ( string.Compare( path1, path2.Substring( 0, length1 ), ignoreCase ) != 0 )
-				return false;
-			
-			// must match through or up to a directory separator boundary
-			return	path2[length1-1] == Path.DirectorySeparatorChar ||
-				length2 > length1 && path2[length1] == Path.DirectorySeparatorChar;
-        }
-
-		/// <summary>
-		/// Test whether one path is the same as or under another path
-		/// </summary>
-		/// <param name="path1">The first path - supposed to be the parent path</param>
-		/// <param name="path2">The second path - supposed to be the child path</param>
-		/// <returns></returns>
-		protected bool IsSamePathOrUnder( string path1, string path2 )
-		{
-			int length1 = path1.Length;
-			int length2 = path2.Length;
-
-			// if path1 is longer, then path2 can't be under it
-			if ( length1 > length2 )
-				return false;
-
-			// if lengths are the same, check for equality
-			if ( length1 == length2 )
-				return string.Compare( path1, path2, caseInsensitive ) == 0;
-
-			// path 2 is longer than path 1: see if initial parts match
-			if ( string.Compare( path1, path2.Substring( 0, length1 ), caseInsensitive ) != 0 )
-				return false;
-			
-			// must match through or up to a directory separator boundary
-			return	path2[length1-1] == Path.DirectorySeparatorChar ||
-				path2[length1] == Path.DirectorySeparatorChar;
-        }
-#endregion
-    }
-    #endregion
-
-    #region SamePathConstraint
-    /// <summary>
-	/// Summary description for SamePathConstraint.
-	/// </summary>
-	public class SamePathConstraint : PathConstraint
-	{
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:SamePathConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected path</param>
-		public SamePathConstraint( string expected ) : base( expected ) { }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="expectedPath">The expected path</param>
-        /// <param name="actualPath">The actual path</param>
-        /// <returns>True for success, false for failure</returns>
-		protected override bool IsMatch(string expectedPath, string actualPath)
-		{
-			return IsSamePath( Canonicalize(expectedPath), Canonicalize(actualPath), caseInsensitive );
-		}
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.WritePredicate( "Path matching" );
-			writer.WriteExpectedValue( expectedPath );
-		}
-    }
-    #endregion
-	
-	#region SubPathConstraint
-    /// <summary>
-    /// SubPathConstraint tests that the actual path is under the expected path
-    /// </summary>
-	public class SubPathConstraint : PathConstraint
-	{
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:SubPathConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected path</param>
-		public SubPathConstraint( string expected ) : base( expected ) { }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="expectedPath">The expected path</param>
-        /// <param name="actualPath">The actual path</param>
-        /// <returns>True for success, false for failure</returns>
-		protected override bool IsMatch(string expectedPath, string actualPath)
-		{
-			if (actualPath == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-			return IsSubPath( Canonicalize(expectedPath), Canonicalize(actualPath), caseInsensitive );
-		}
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.WritePredicate( "Path under" );
-			writer.WriteExpectedValue( expectedPath );
-		}
-    }
-	#endregion
-
-    #region SamePathOrUnderConstraint
-    /// <summary>
-    /// SamePathOrUnderConstraint tests that one path is under another
-    /// </summary>
-	public class SamePathOrUnderConstraint : PathConstraint
-	{
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:SamePathOrUnderConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected path</param>
-		public SamePathOrUnderConstraint( string expected ) : base( expected ) { }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="expectedPath">The expected path</param>
-        /// <param name="actualPath">The actual path</param>
-        /// <returns>True for success, false for failure</returns>
-		protected override bool IsMatch(string expectedPath, string actualPath)
-		{
-			string path1 = Canonicalize(expectedPath);
-			string path2 = Canonicalize(actualPath);
-			return IsSamePath(path1, path2, caseInsensitive) || IsSubPath(path1, path2, caseInsensitive);
-		}
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.WritePredicate( "Path under or matching" );
-			writer.WriteExpectedValue( expectedPath );
-		}
-    }
-    #endregion
-}
diff --git a/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs b/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
index 4058932..276cd79 100644
--- a/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/PredicateConstraint.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-#if CLR_2_0 || CLR_4_0
-using System;
-using System.Collections.Generic;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// Predicate constraint wraps a Predicate in a constraint,
-    /// returning success if the predicate is true.
-    /// </summary>
-    public class PredicateConstraint<T> : Constraint
-    {
-        Predicate<T> predicate;
-
-        /// <summary>
-        /// Construct a PredicateConstraint from a predicate
-        /// </summary>
-        public PredicateConstraint(Predicate<T> predicate)
-        {
-            this.predicate = predicate;
-        }
-
-        /// <summary>
-        /// Determines whether the predicate succeeds when applied
-        /// to the actual value.
-        /// </summary>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (!(actual is T))
-                throw new ArgumentException("The actual value is not of type " + typeof(T).Name, "actual");
-
-            return predicate((T)actual);
-        }
-
-        /// <summary>
-        /// Writes the description to a MessageWriter
-        /// </summary>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("value matching");
-            writer.Write(predicate.Method.Name.StartsWith("<")
-                ? "lambda expression"
-                : predicate.Method.Name);
-        }
-    }
-}
-#endif
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if CLR_2_0 || CLR_4_0
+using System;
+using System.Collections.Generic;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Predicate constraint wraps a Predicate in a constraint,
+    /// returning success if the predicate is true.
+    /// </summary>
+    public class PredicateConstraint<T> : Constraint
+    {
+        readonly Predicate<T> predicate;
+
+        /// <summary>
+        /// Construct a PredicateConstraint from a predicate
+        /// </summary>
+        public PredicateConstraint(Predicate<T> predicate)
+        {
+            this.predicate = predicate;
+        }
+
+        /// <summary>
+        /// Determines whether the predicate succeeds when applied
+        /// to the actual value.
+        /// </summary>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (!(actual is T))
+                throw new ArgumentException("The actual value is not of type " + typeof(T).Name, "actual");
+
+            return predicate((T)actual);
+        }
+
+        /// <summary>
+        /// Writes the description to a MessageWriter
+        /// </summary>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("value matching");
+            writer.Write(predicate.Method.Name.StartsWith("<")
+                ? "lambda expression"
+                : predicate.Method.Name);
+        }
+    }
+}
+#endif
diff --git a/src/NUnitFramework/framework/Constraints/PrefixConstraint.cs b/src/NUnitFramework/framework/Constraints/PrefixConstraint.cs
new file mode 100644
index 0000000..41c7029
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/PrefixConstraint.cs
@@ -0,0 +1,29 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// Abstract base class used for prefixes
+	/// </summary>
+    public abstract class PrefixConstraint : Constraint
+    {
+        /// <summary>
+        /// The base constraint
+        /// </summary>
+        protected Constraint baseConstraint;
+
+        /// <summary>
+        /// Construct given a base constraint
+        /// </summary>
+        /// <param name="resolvable"></param>
+        protected PrefixConstraint(IResolveConstraint resolvable) : base(resolvable)
+        {
+            if ( resolvable != null )
+                this.baseConstraint = resolvable.Resolve();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs b/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
deleted file mode 100644
index 54387d0..0000000
--- a/src/NUnitFramework/framework/Constraints/PrefixConstraints.cs
+++ /dev/null
@@ -1,293 +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.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-	#region PrefixConstraint
-	/// <summary>
-	/// Abstract base class used for prefixes
-	/// </summary>
-    public abstract class PrefixConstraint : Constraint
-    {
-        /// <summary>
-        /// The base constraint
-        /// </summary>
-        protected Constraint baseConstraint;
-
-        /// <summary>
-        /// Construct given a base constraint
-        /// </summary>
-        /// <param name="resolvable"></param>
-        protected PrefixConstraint(IResolveConstraint resolvable) : base(resolvable)
-        {
-            if ( resolvable != null )
-                this.baseConstraint = resolvable.Resolve();
-        }
-    }
-	#endregion
-
-	#region NotConstraint
-    /// <summary>
-	/// NotConstraint negates the effect of some other constraint
-	/// </summary>
-	public class NotConstraint : PrefixConstraint
-	{
-		/// <summary>
-		/// Initializes a new instance of the <see cref="T:NotConstraint"/> class.
-		/// </summary>
-		/// <param name="baseConstraint">The base constraint to be negated.</param>
-		public NotConstraint(Constraint baseConstraint)
-			: base( baseConstraint ) { }
-
-		/// <summary>
-		/// Test whether the constraint is satisfied by a given value
-		/// </summary>
-		/// <param name="actual">The value to be tested</param>
-		/// <returns>True for if the base constraint fails, false if it succeeds</returns>
-		public override bool Matches(object actual)
-		{
-			this.actual = actual;
-			return !baseConstraint.Matches(actual);
-		}
-
-		/// <summary>
-		/// Write the constraint description to a MessageWriter
-		/// </summary>
-		/// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo( MessageWriter writer )
-		{
-			writer.WritePredicate( "not" );
-			baseConstraint.WriteDescriptionTo( writer );
-		}
-
-		/// <summary>
-		/// Write the actual value for a failing constraint test to a MessageWriter.
-		/// </summary>
-		/// <param name="writer">The writer on which the actual value is displayed</param>
-		public override void WriteActualValueTo(MessageWriter writer)
-		{
-			baseConstraint.WriteActualValueTo (writer);
-		}
-	}
-	#endregion
-
-	#region AllItemsConstraint
-	/// <summary>
-	/// AllItemsConstraint applies another constraint to each
-	/// item in a collection, succeeding if they all succeed.
-	/// </summary>
-	public class AllItemsConstraint : PrefixConstraint
-	{
-		/// <summary>
-		/// Construct an AllItemsConstraint on top of an existing constraint
-		/// </summary>
-		/// <param name="itemConstraint"></param>
-		public AllItemsConstraint(Constraint itemConstraint)
-			: base( itemConstraint )
-        {
-            this.DisplayName = "all";
-        }
-
-		/// <summary>
-		/// Apply the item constraint to each item in the collection,
-		/// failing if any item fails.
-		/// </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" );
-
-			foreach(object item in (IEnumerable)actual)
-				if (!baseConstraint.Matches(item))
-					return false;
-
-			return true;
-		}
-
-		/// <summary>
-		/// Write a description of this constraint to a MessageWriter
-		/// </summary>
-		/// <param name="writer"></param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.WritePredicate("all items");
-			baseConstraint.WriteDescriptionTo(writer);
-		}
-	}
-	#endregion
-
-	#region SomeItemsConstraint
-	/// <summary>
-	/// SomeItemsConstraint applies another constraint to each
-	/// item in a collection, succeeding if any of them succeeds.
-	/// </summary>
-	public class SomeItemsConstraint : PrefixConstraint
-	{
-		/// <summary>
-		/// Construct a SomeItemsConstraint on top of an existing constraint
-		/// </summary>
-		/// <param name="itemConstraint"></param>
-		public SomeItemsConstraint(Constraint itemConstraint)
-			: base( itemConstraint ) 
-        {
-            this.DisplayName = "some";
-        }
-
-		/// <summary>
-		/// Apply the item constraint to each item in the collection,
-		/// succeeding if any item succeeds.
-		/// </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" );
-
-			foreach(object item in (IEnumerable)actual)
-				if (baseConstraint.Matches(item))
-					return true;
-
-			return false;
-		}
-
-		/// <summary>
-		/// Write a description of this constraint to a MessageWriter
-		/// </summary>
-		/// <param name="writer"></param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.WritePredicate("some item");
-			baseConstraint.WriteDescriptionTo(writer);
-		}
-	}
-	#endregion
-
-	#region NoItemConstraint
-    /// <summary>
-    /// NoItemConstraint applies another constraint to each
-    /// item in a collection, failing if any of them succeeds.
-    /// </summary>
-    public class NoItemConstraint : PrefixConstraint
-	{
-		/// <summary>
-		/// Construct a SomeItemsConstraint on top of an existing constraint
-		/// </summary>
-		/// <param name="itemConstraint"></param>
-		public NoItemConstraint(Constraint itemConstraint)
-			: base( itemConstraint ) 
-        {
-            this.DisplayName = "none";
-        }
-
-		/// <summary>
-		/// Apply the item constraint to each item in the collection,
-		/// failing if any item fails.
-		/// </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" );
-
-			foreach(object item in (IEnumerable)actual)
-				if (baseConstraint.Matches(item))
-					return false;
-
-			return true;
-		}
-
-		/// <summary>
-		/// Write a description of this constraint to a MessageWriter
-		/// </summary>
-		/// <param name="writer"></param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.WritePredicate("no item");
-			baseConstraint.WriteDescriptionTo(writer);
-		}
-	}
-	#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/PropertyConstraint.cs b/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs
index 32fccf9..b108e22 100644
--- a/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/PropertyConstraint.cs
@@ -1,168 +1,92 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// PropertyExistsConstraint tests that a named property
-    /// exists on the object provided through Match.
-    /// 
-    /// Originally, PropertyConstraint provided this feature
-    /// in addition to making optional tests on the vaue
-    /// of the property. The two constraints are now separate.
-    /// </summary>
-    public class PropertyExistsConstraint : Constraint
-    {
-        private string name;
-
-        Type actualType;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:PropertyExistConstraint"/> class.
-        /// </summary>
-        /// <param name="name">The name of the property.</param>
-        public PropertyExistsConstraint(string name) : base(name)
-        {
-            this.name = name;
-        }
-
-        /// <summary>
-        /// Test whether the property exists for a given object
-        /// </summary>
-        /// <param name="actual">The object to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            
-            if (actual == null)
-                throw new ArgumentNullException("actual");
-
-            this.actualType = actual as Type;
-            if (actualType == null)
-                actualType = actual.GetType();
-
-            PropertyInfo property = actualType.GetProperty(name,
-                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
-
-            return property != null;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("property " + name);
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            writer.WriteActualValue(actualType);
-        }
-
-        /// <summary>
-        /// Returns the string representation of the constraint.
-        /// </summary>
-        /// <returns></returns>
-        protected override string GetStringRepresentation()
-        {
-            return string.Format("<propertyexists {0}>", name);
-        }
-    }
-
-	/// <summary>
-	/// PropertyConstraint extracts a named property and uses
-    /// its value as the actual value for a chained constraint.
-	/// </summary>
-	public class PropertyConstraint : PrefixConstraint
-	{
-		private string name;
-		private object propValue;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:PropertyConstraint"/> class.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="baseConstraint">The constraint to apply to the property.</param>
-        public PropertyConstraint(string name, Constraint baseConstraint)
-			: base( baseConstraint ) 
-		{ 
-			this.name = name;
-		}
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-		{
-            this.actual = actual;
-            if (actual == null) 
-                throw new ArgumentNullException("actual");
-
-            Type actualType = actual as Type;
-            if ( actualType == null )
-                actualType = actual.GetType();
-
-            PropertyInfo property = actualType.GetProperty(name,
-                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
-
-            if (property == null)
-                throw new ArgumentException(string.Format("Property {0} was not found",name), "name");
-
-			propValue = property.GetValue( actual, null );
-			return baseConstraint.Matches( propValue );
-		}
-
-		/// <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( "property " + name );
-            if (baseConstraint != null)
-            {
-                if (baseConstraint is EqualConstraint)
-                    writer.WritePredicate("equal to");
-                baseConstraint.WriteDescriptionTo(writer);
-            }
-        }
-
-		/// <summary>
-		/// Write the actual value for a failing constraint test to a
-		/// MessageWriter. The default implementation simply writes
-		/// the raw value of actual, leaving it to the writer to
-		/// perform any formatting.
-		/// </summary>
-		/// <param name="writer">The writer on which the actual value is displayed</param>
-		public override void WriteActualValueTo(MessageWriter writer)
-		{
-            writer.WriteActualValue(propValue);
-		}
-
-        /// <summary>
-        /// Returns the string representation of the constraint.
-        /// </summary>
-        /// <returns></returns>
-        protected override string GetStringRepresentation()
-        {
-            return string.Format("<property {0} {1}>", name, baseConstraint);
-        }
-	}
-}
+// ****************************************************************
+// Copyright 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.Framework.Constraints
+{
+	/// <summary>
+	/// PropertyConstraint extracts a named property and uses
+    /// its value as the actual value for a chained constraint.
+	/// </summary>
+	public class PropertyConstraint : PrefixConstraint
+	{
+		private readonly string name;
+		private object propValue;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:PropertyConstraint"/> class.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <param name="baseConstraint">The constraint to apply to the property.</param>
+        public PropertyConstraint(string name, Constraint baseConstraint)
+			: base( baseConstraint ) 
+		{ 
+			this.name = name;
+		}
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+		{
+            this.actual = actual;
+            Guard.ArgumentNotNull(actual, "actual");
+
+            Type actualType = actual as Type;
+            if ( actualType == null )
+                actualType = actual.GetType();
+
+            PropertyInfo property = actualType.GetProperty(name,
+                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
+
+            if (property == null)
+                throw new ArgumentException(string.Format("Property {0} was not found",name), "name");
+
+			propValue = property.GetValue( actual, null );
+			return baseConstraint.Matches( propValue );
+		}
+
+		/// <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( "property " + name );
+            if (baseConstraint != null)
+            {
+                if (baseConstraint is EqualConstraint)
+                    writer.WritePredicate("equal to");
+                baseConstraint.WriteDescriptionTo(writer);
+            }
+        }
+
+		/// <summary>
+		/// Write the actual value for a failing constraint test to a
+		/// MessageWriter. The default implementation simply writes
+		/// the raw value of actual, leaving it to the writer to
+		/// perform any formatting.
+		/// </summary>
+		/// <param name="writer">The writer on which the actual value is displayed</param>
+		public override void WriteActualValueTo(MessageWriter writer)
+		{
+            writer.WriteActualValue(propValue);
+		}
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns></returns>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<property {0} {1}>", name, baseConstraint);
+        }
+	}
+}
diff --git a/src/NUnitFramework/framework/Constraints/PropertyExistsConstraint.cs b/src/NUnitFramework/framework/Constraints/PropertyExistsConstraint.cs
new file mode 100644
index 0000000..bd5a0e1
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/PropertyExistsConstraint.cs
@@ -0,0 +1,85 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// PropertyExistsConstraint tests that a named property
+    /// exists on the object provided through Match.
+    /// 
+    /// Originally, PropertyConstraint provided this feature
+    /// in addition to making optional tests on the vaue
+    /// of the property. The two constraints are now separate.
+    /// </summary>
+    public class PropertyExistsConstraint : Constraint
+    {
+        private readonly string name;
+
+        Type actualType;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:PropertyExistConstraint"/> class.
+        /// </summary>
+        /// <param name="name">The name of the property.</param>
+        public PropertyExistsConstraint(string name)
+            : base(name)
+        {
+            this.name = name;
+        }
+
+        /// <summary>
+        /// Test whether the property exists for a given object
+        /// </summary>
+        /// <param name="actual">The object to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            Guard.ArgumentNotNull(actual, "actual");
+
+            this.actualType = actual as Type;
+            if (actualType == null)
+                actualType = actual.GetType();
+
+            PropertyInfo property = actualType.GetProperty(name,
+                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);
+
+            return property != null;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("property " + name);
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.WriteActualValue(actualType);
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns></returns>
+        protected override string GetStringRepresentation()
+        {
+            return string.Format("<propertyexists {0}>", name);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/RangeConstraint.cs b/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
index 6443486..eedd0fa 100644
--- a/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/RangeConstraint.cs
@@ -1,108 +1,107 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// RangeConstraint tests whethe two values are within a 
-    /// specified range.
-    /// </summary>
-#if CLR_2_0 || CLR_4_0
-    public class RangeConstraint<T> : ComparisonConstraint where T : IComparable<T>
-    {
-        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(T from, T to)
-            : base(from, to)
-        {
-            this.from = from;
-            this.to = to;
-            this.comparer = ComparisonAdapter.For(new NUnitComparer<T>());
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (from == null || to == null || actual == null)
-                throw new ArgumentException("Cannot compare using a null reference", "expected");
-
-            return comparer.Compare(from, actual) <= 0 &&
-                   comparer.Compare(to, actual) >= 0;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-
-            writer.Write("in range ({0},{1})", from, to);
-        }
-    }
-#else
-    public class RangeConstraint : ComparisonConstraint
-    {
-        private IComparable from;
-        private IComparable 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 )
-        {
-            this.from = from;
-            this.to = to;
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if ( from == null || to == null || actual == null)
-                throw new ArgumentException( "Cannot compare using a null reference", "expected" );
-
-            return comparer.Compare(from, actual) <= 0 &&
-                   comparer.Compare(to, actual) >= 0;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-
-            writer.Write("in range ({0},{1})", from, to);
-        }
-    }
-#endif
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// RangeConstraint tests whether two values are within a 
+    /// specified range.
+    /// </summary>
+#if CLR_2_0 || CLR_4_0
+    public class RangeConstraint<T> : ComparisonConstraint where T : IComparable<T>
+    {
+        private readonly T from;
+        private readonly 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(T from, T to)
+            : base(from, to)
+        {
+            this.from = from;
+            this.to = to;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (from == null || to == null || actual == null)
+                throw new ArgumentException("Cannot compare using a null reference", "actual");
+
+            return comparer.Compare(from, actual) <= 0 &&
+                   comparer.Compare(to, actual) >= 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+
+            writer.Write("in range ({0},{1})", from, to);
+        }
+    }
+#else
+    public class RangeConstraint : ComparisonConstraint
+    {
+        private readonly IComparable from;
+        private readonly IComparable 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 )
+        {
+            this.from = from;
+            this.to = to;
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if ( from == null || to == null || actual == null)
+                throw new ArgumentException( "Cannot compare using a null reference", "actual" );
+
+            return comparer.Compare(from, actual) <= 0 &&
+                   comparer.Compare(to, actual) >= 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+
+            writer.Write("in range ({0},{1})", from, to);
+        }
+    }
+#endif
+}
diff --git a/src/NUnitFramework/framework/Constraints/RegexConstraint.cs b/src/NUnitFramework/framework/Constraints/RegexConstraint.cs
new file mode 100644
index 0000000..2d2063e
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/RegexConstraint.cs
@@ -0,0 +1,50 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+#if !NETCF
+using System.Text.RegularExpressions;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// RegexConstraint can test whether a string matches
+    /// the pattern provided.
+    /// </summary>
+    public class RegexConstraint : StringConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:RegexConstraint"/> class.
+        /// </summary>
+        /// <param name="pattern">The pattern.</param>
+        public RegexConstraint(string pattern) : base(pattern) { }
+
+        /// <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>
+        protected override bool Matches(string actual)
+        {
+            return Regex.IsMatch(
+                    actual,
+                    this.expected,
+                    this.caseInsensitive ? RegexOptions.IgnoreCase : RegexOptions.None);
+        }
+
+        /// <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("String matching");
+            writer.WriteExpectedValue(this.expected);
+            if (this.caseInsensitive)
+                writer.WriteModifier("ignoring case");
+        }
+    }
+}
+#endif
diff --git a/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs b/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs
index 59373bb..6dc9871 100644
--- a/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs
+++ b/src/NUnitFramework/framework/Constraints/ResolvableConstraintExpression.cs
@@ -1,62 +1,138 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// ResolvableConstraintExpression is used to represent a compound
-    /// constraint being constructed at a point where the last operator
-    /// may either terminate the expression or may have additional 
-    /// qualifying constraints added to it. 
-    /// 
-    /// It is used, for example, for a Property element or for
-    /// an Exception element, either of which may be optionally
-    /// followed by constraints that apply to the property or 
-    /// exception.
-    /// </summary>
-    public class ResolvableConstraintExpression : ConstraintExpression, IResolveConstraint
-    {
-        /// <summary>
-        /// Create a new instance of ResolvableConstraintExpression
-        /// </summary>
-        public ResolvableConstraintExpression() { }
-
-        /// <summary>
-        /// Create a new instance of ResolvableConstraintExpression,
-        /// passing in a pre-populated ConstraintBuilder.
-        /// </summary>
-        public ResolvableConstraintExpression(ConstraintBuilder builder)
-            : base(builder) { }
-
-        /// <summary>
-        /// Appends an And Operator to the expression
-        /// </summary>
-        public ConstraintExpression And
-        {
-            get { return this.Append(new AndOperator()); }
-        }
-
-        /// <summary>
-        /// Appends an Or operator to the expression.
-        /// </summary>
-        public ConstraintExpression Or
-        {
-            get { return this.Append(new OrOperator()); }
-        }
-
-        #region IResolveConstraint Members
-        /// <summary>
-        /// Resolve the current expression to a Constraint
-        /// </summary>
-        Constraint IResolveConstraint.Resolve()
-        {
-            return builder.Resolve();
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ResolvableConstraintExpression is used to represent a compound
+    /// constraint being constructed at a point where the last operator
+    /// may either terminate the expression or may have additional 
+    /// qualifying constraints added to it. 
+    /// 
+    /// It is used, for example, for a Property element or for
+    /// an Exception element, either of which may be optionally
+    /// followed by constraints that apply to the property or 
+    /// exception.
+    /// </summary>
+    public class ResolvableConstraintExpression : ConstraintExpression, IResolveConstraint
+    {
+        /// <summary>
+        /// Create a new instance of ResolvableConstraintExpression
+        /// </summary>
+        public ResolvableConstraintExpression() { }
+
+        /// <summary>
+        /// Create a new instance of ResolvableConstraintExpression,
+        /// passing in a pre-populated ConstraintBuilder.
+        /// </summary>
+        public ResolvableConstraintExpression(ConstraintBuilder builder)
+            : base(builder) { }
+
+        /// <summary>
+        /// Appends an And Operator to the expression
+        /// </summary>
+        public ConstraintExpression And
+        {
+            get { return this.Append(new AndOperator()); }
+        }
+
+        /// <summary>
+        /// Appends an Or operator to the expression.
+        /// </summary>
+        public ConstraintExpression Or
+        {
+            get { return this.Append(new OrOperator()); }
+        }
+
+        #region IResolveConstraint Members
+        /// <summary>
+        /// Resolve the current expression to a Constraint
+        /// </summary>
+        Constraint IResolveConstraint.Resolve()
+        {
+            return builder.Resolve();
+        }
+        #endregion
+
+        #region Operator Overloads
+        /// <summary>
+        /// This operator creates a constraint that is satisfied only if both 
+        /// argument constraints are satisfied.
+        /// </summary>
+        public static Constraint operator &(ResolvableConstraintExpression left, ResolvableConstraintExpression right)
+        {
+            return OperatorAndImplementation(left, right);
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied only if both 
+        /// argument constraints are satisfied.
+        /// </summary>
+        public static Constraint operator &(Constraint left, ResolvableConstraintExpression right)
+        {
+            return OperatorAndImplementation(left, right);
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied only if both 
+        /// argument constraints are satisfied.
+        /// </summary>
+        public static Constraint operator &(ResolvableConstraintExpression left, Constraint right)
+        {
+            return OperatorAndImplementation(left, right);
+        }
+
+        private static Constraint OperatorAndImplementation(IResolveConstraint left, IResolveConstraint right)
+        {
+            return new AndConstraint(left.Resolve(), right.Resolve());
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied if either 
+        /// of the argument constraints is satisfied.
+        /// </summary>
+        public static Constraint operator |(ResolvableConstraintExpression left, ResolvableConstraintExpression right)
+        {
+            return OperatorOrImplementation(left, right);
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied if either 
+        /// of the argument constraints is satisfied.
+        /// </summary>
+        public static Constraint operator |(ResolvableConstraintExpression left, Constraint right)
+        {
+            return OperatorOrImplementation(left, right);
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied if either 
+        /// of the argument constraints is satisfied.
+        /// </summary>
+        public static Constraint operator |(Constraint left, ResolvableConstraintExpression right)
+        {
+            return OperatorOrImplementation(left, right);
+        }
+
+        private static Constraint OperatorOrImplementation(IResolveConstraint left, IResolveConstraint right)
+        {
+            return new OrConstraint(left.Resolve(), right.Resolve());
+        }
+
+        /// <summary>
+        /// This operator creates a constraint that is satisfied if the 
+        /// argument constraint is not satisfied.
+        /// </summary>
+        public static Constraint operator !(ResolvableConstraintExpression constraint)
+        {
+            IResolveConstraint r = constraint as IResolveConstraint;
+            return new NotConstraint(r == null ? new NullConstraint() : r.Resolve());
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs b/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
index 388db08..b2df210 100644
--- a/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ReusableConstraint.cs
@@ -1,61 +1,61 @@
-// ****************************************************************
-// 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
-{
-    /// <summary>
-    /// ReusableConstraint wraps a resolved constraint so that it
-    /// may be saved and reused as needed.
-    /// </summary>
-    public class ReusableConstraint : IResolveConstraint
-    {
-        private Constraint constraint;
-
-        /// <summary>
-        /// Construct a ReusableConstraint
-        /// </summary>
-        /// <param name="c">The constraint or expression to be reused</param>
-        public ReusableConstraint(IResolveConstraint c)
-        {
-            this.constraint = c.Resolve();
-        }
-
-        /// <summary>
-        /// Conversion operator from a normal constraint to a ReusableConstraint.
-        /// </summary>
-        /// <param name="c">The original constraint to be wrapped as a ReusableConstraint</param>
-        /// <returns></returns>
-        public static implicit operator ReusableConstraint(Constraint c)
-        {
-            return new ReusableConstraint(c);
-        }
-
-        /// <summary>
-        /// Returns the string representation of the constraint.
-        /// </summary>
-        /// <returns>A string representing the constraint</returns>
-        public override string ToString()
-        {
-            return constraint.ToString();
-        }
-
-        #region IResolveConstraint Members
-
-        /// <summary>
-        /// Resolves the ReusableConstraint by returning the constraint
-        /// that it originally wrapped.
-        /// </summary>
-        /// <returns>A resolved constraint</returns>
-        public Constraint Resolve()
-        {
-            return constraint;
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// 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
+{
+    /// <summary>
+    /// ReusableConstraint wraps a constraint expression after 
+    /// resolving it so that it can be reused consistently.
+    /// </summary>
+    public class ReusableConstraint : IResolveConstraint
+    {
+        private readonly Constraint constraint;
+
+        /// <summary>
+        /// Construct a ReusableConstraint from a constraint expression
+        /// </summary>
+        /// <param name="c">The expression to be resolved and reused</param>
+        public ReusableConstraint(IResolveConstraint c)
+        {
+            this.constraint = c.Resolve();
+        }
+
+        /// <summary>
+        /// Converts a constraint to a ReusableConstraint
+        /// </summary>
+        /// <param name="c">The constraint to be converted</param>
+        /// <returns>A ReusableConstraint</returns>
+        public static implicit operator ReusableConstraint(Constraint c)
+        {
+            return new ReusableConstraint(c);
+        }
+
+        /// <summary>
+        /// Returns the string representation of the constraint.
+        /// </summary>
+        /// <returns>A string representing the constraint</returns>
+        public override string ToString()
+        {
+            return constraint.ToString();
+        }
+
+        #region IResolveConstraint Members
+
+        /// <summary>
+        /// Resolves the ReusableConstraint by returning the constraint
+        /// that it originally wrapped.
+        /// </summary>
+        /// <returns>A resolved constraint</returns>
+        public Constraint Resolve()
+        {
+            return constraint;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs b/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs
index 4b8230b..f5997e7 100644
--- a/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/SameAsConstraint.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// SameAsConstraint tests whether an object is identical to
-    /// the object passed to its constructor
-    /// </summary>
-    public class SameAsConstraint : Constraint
-    {
-        private object expected;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:SameAsConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected object.</param>
-        public SameAsConstraint(object expected) : base(expected)
-        {
-            this.expected = 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 NETCF_1_0
-            // TODO: THis makes it compile, now make it work.
-            return expected.Equals(actual);
-#else
-            return Object.ReferenceEquals(expected, actual);
-#endif
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("same as");
-            writer.WriteExpectedValue(expected);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// SameAsConstraint tests whether an object is identical to
+    /// the object passed to its constructor
+    /// </summary>
+    public class SameAsConstraint : Constraint
+    {
+        private readonly object expected;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SameAsConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected object.</param>
+        public SameAsConstraint(object expected) : base(expected)
+        {
+            this.expected = 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 NETCF_1_0
+            // TODO: THis makes it compile, now make it work.
+            return expected.Equals(actual);
+#else
+            return ReferenceEquals(expected, actual);
+#endif
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("same as");
+            writer.WriteExpectedValue(expected);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/SamePathConstraint.cs b/src/NUnitFramework/framework/Constraints/SamePathConstraint.cs
new file mode 100644
index 0000000..89b673a
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/SamePathConstraint.cs
@@ -0,0 +1,41 @@
+// ***************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Summary description for SamePathConstraint.
+    /// </summary>
+    public class SamePathConstraint : PathConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SamePathConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected path</param>
+        public SamePathConstraint(string expected) : base(expected) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="expectedPath">The expected path</param>
+        /// <param name="actualPath">The actual path</param>
+        /// <returns>True for success, false for failure</returns>
+        protected override bool IsMatch(string expectedPath, string actualPath)
+        {
+            return string.Compare(Canonicalize(expectedPath), Canonicalize(actualPath), caseInsensitive) == 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("Path matching");
+            writer.WriteExpectedValue(expectedPath);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/SamePathOrUnderConstraint.cs b/src/NUnitFramework/framework/Constraints/SamePathOrUnderConstraint.cs
new file mode 100644
index 0000000..4ea8aa5
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/SamePathOrUnderConstraint.cs
@@ -0,0 +1,43 @@
+// ***************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// SamePathOrUnderConstraint tests that one path is under another
+    /// </summary>
+    public class SamePathOrUnderConstraint : PathConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SamePathOrUnderConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected path</param>
+        public SamePathOrUnderConstraint(string expected) : base(expected) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="expectedPath">The expected path</param>
+        /// <param name="actualPath">The actual path</param>
+        /// <returns>True for success, false for failure</returns>
+        protected override bool IsMatch(string expectedPath, string actualPath)
+        {
+            string path1 = Canonicalize(expectedPath);
+            string path2 = Canonicalize(actualPath);
+            return string.Compare(path1, path2, caseInsensitive) == 0 || IsSubPath(path1, path2, caseInsensitive);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("Path under or matching");
+            writer.WriteExpectedValue(expectedPath);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/SerializableConstraints.cs b/src/NUnitFramework/framework/Constraints/SerializableConstraints.cs
deleted file mode 100644
index 503042e..0000000
--- a/src/NUnitFramework/framework/Constraints/SerializableConstraints.cs
+++ /dev/null
@@ -1,170 +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 System.IO;
-#if !NETCF
-using System.Runtime.Serialization;
-using System.Runtime.Serialization.Formatters.Binary;
-#endif
-using System.Xml.Serialization;
-
-namespace NUnit.Framework.Constraints
-{
-#if !NETCF
-    #region BinarySerializableConstraint
-
-    /// <summary>
-    /// BinarySerializableConstraint tests whether 
-    /// an object is serializable in binary format.
-    /// </summary>
-    public class BinarySerializableConstraint : Constraint
-    {
-        readonly BinaryFormatter serializer = new BinaryFormatter();
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if(actual == null)
-                throw new ArgumentException();
-
-            MemoryStream stream = new MemoryStream();
-
-            try
-            {
-                serializer.Serialize(stream, actual);
-
-                stream.Seek(0, SeekOrigin.Begin);
-
-                object value = serializer.Deserialize(stream);
-
-                return value != null;
-            }
-            catch (SerializationException)
-            {
-                return false;
-            }
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("binary serializable");
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. The default implementation simply writes
-        /// the raw value of actual, leaving it to the writer to
-        /// perform any formatting.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            writer.Write("<{0}>", actual.GetType().Name);
-        }
-
-        /// <summary>
-        /// Returns the string representation
-        /// </summary>
-        protected override string GetStringRepresentation()
-        {
-            return "<binaryserializable>";
-        }
-    }
-
-    #endregion
-#endif
-
-#if !NETCF_1_0
-    #region XmlSerializableConstraint
-
-    /// <summary>
-    /// BinarySerializableConstraint tests whether 
-    /// an object is serializable in binary format.
-    /// </summary>
-    public class XmlSerializableConstraint : Constraint
-    {
-        private XmlSerializer serializer;
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if(actual == null)
-                throw new ArgumentException();
-
-            MemoryStream stream = new MemoryStream();
-
-            try
-            {
-                serializer = new XmlSerializer(actual.GetType());
-
-                serializer.Serialize(stream, actual);
-
-                stream.Seek(0, SeekOrigin.Begin);
-
-                object value = serializer.Deserialize(stream);
-
-                return value != null;
-            }
-            catch (NotSupportedException)
-            {
-                return false;
-            }
-            catch (InvalidOperationException)
-            {
-                return false;
-            }
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("xml serializable");
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. The default implementation simply writes
-        /// the raw value of actual, leaving it to the writer to
-        /// perform any formatting.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            writer.Write("<{0}>", actual.GetType().Name);
-        }
-
-        /// <summary>
-        /// Returns the string representation of this constraint
-        /// </summary>
-        protected override string GetStringRepresentation()
-        {
-            return "<xmlserializable>";
-        }
-    }
-
-    #endregion
-#endif
-}
diff --git a/src/NUnitFramework/framework/Constraints/SomeItemsConstraint.cs b/src/NUnitFramework/framework/Constraints/SomeItemsConstraint.cs
new file mode 100644
index 0000000..01ce399
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/SomeItemsConstraint.cs
@@ -0,0 +1,58 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// SomeItemsConstraint applies another constraint to each
+    /// item in a collection, succeeding if any of them succeeds.
+    /// </summary>
+    public class SomeItemsConstraint : PrefixConstraint
+    {
+        /// <summary>
+        /// Construct a SomeItemsConstraint on top of an existing constraint
+        /// </summary>
+        /// <param name="itemConstraint"></param>
+        public SomeItemsConstraint(Constraint itemConstraint)
+            : base(itemConstraint)
+        {
+            this.DisplayName = "some";
+        }
+
+        /// <summary>
+        /// Apply the item constraint to each item in the collection,
+        /// succeeding if any item succeeds.
+        /// </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");
+
+            foreach (object item in (IEnumerable)actual)
+                if (baseConstraint.Matches(item))
+                    return true;
+
+            return false;
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("some item");
+            baseConstraint.WriteDescriptionTo(writer);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/StartsWithConstraint.cs b/src/NUnitFramework/framework/Constraints/StartsWithConstraint.cs
new file mode 100644
index 0000000..c8483f1
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/StartsWithConstraint.cs
@@ -0,0 +1,48 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// StartsWithConstraint can test whether a string starts
+    /// with an expected substring.
+    /// </summary>
+    public class StartsWithConstraint : StringConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:StartsWithConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        public StartsWithConstraint(string expected) : base(expected) { }
+
+        /// <summary>
+        /// Test whether the constraint is matched by the actual value.
+        /// This is a template method, which calls the IsMatch method
+        /// of the derived class.
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool Matches(string actual)
+        {
+            if (this.caseInsensitive)
+                return actual.ToLower().StartsWith(expected.ToLower());
+            else
+                return actual.StartsWith(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("String starting with");
+            writer.WriteExpectedValue(MsgUtils.ClipString(expected, writer.MaxLineLength - 40, 0));
+            if (this.caseInsensitive)
+                writer.WriteModifier("ignoring case");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/StringConstraint.cs b/src/NUnitFramework/framework/Constraints/StringConstraint.cs
new file mode 100644
index 0000000..22bbe89
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/StringConstraint.cs
@@ -0,0 +1,64 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// StringConstraint is the abstract base for constraints
+    /// that operate on strings. It supports the IgnoreCase
+    /// modifier for string operations.
+    /// </summary>
+    public abstract class StringConstraint : Constraint
+    {
+        /// <summary>
+        /// The expected value
+        /// </summary>
+        protected readonly string expected;
+
+        /// <summary>
+        /// Indicates whether tests should be case-insensitive
+        /// </summary>
+        protected bool caseInsensitive;
+
+        /// <summary>
+        /// Constructs a StringConstraint given an expected value
+        /// </summary>
+        /// <param name="expected">The expected value</param>
+        protected StringConstraint(string expected)
+            : base(expected)
+        {
+            this.expected = expected;
+        }
+
+        /// <summary>
+        /// Modify the constraint to ignore case in matching.
+        /// </summary>
+        public StringConstraint IgnoreCase
+        {
+            get { caseInsensitive = true; return this; }
+        }
+
+        /// <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;
+
+            string actualAsString = actual as string;
+            return actualAsString != null && Matches(actualAsString);
+        }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given string
+        /// </summary>
+        /// <param name="actual">The string to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        protected abstract bool Matches(string actual);
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/StringConstraints.cs b/src/NUnitFramework/framework/Constraints/StringConstraints.cs
deleted file mode 100644
index 88c2450..0000000
--- a/src/NUnitFramework/framework/Constraints/StringConstraints.cs
+++ /dev/null
@@ -1,310 +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;
-#if !NETCF
-using System.Text.RegularExpressions;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    #region StringConstraint
-    /// <summary>
-    /// StringConstraint is the abstract base for constraints
-    /// that operate on strings. It supports the IgnoreCase
-    /// modifier for string operations.
-    /// </summary>
-    public abstract class StringConstraint : Constraint
-    {
-        /// <summary>
-        /// The expected value
-        /// </summary>
-        protected string expected;
-
-        /// <summary>
-        /// Indicates whether tests should be case-insensitive
-        /// </summary>
-        protected bool caseInsensitive;
-
-        /// <summary>
-        /// Constructs a StringConstraint given an expected value
-        /// </summary>
-        /// <param name="expected">The expected value</param>
-        public StringConstraint(string expected)
-            : base(expected)
-        {
-            this.expected = expected;
-        }
-
-        /// <summary>
-        /// Modify the constraint to ignore case in matching.
-        /// </summary>
-        public StringConstraint IgnoreCase
-        {
-            get { caseInsensitive = true; return this; }
-        }
-    }
-    #endregion
-
-    #region EmptyStringConstraint
-    /// <summary>
-    /// EmptyStringConstraint tests whether a string is empty.
-    /// </summary>
-    public class EmptyStringConstraint : Constraint
-    {
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (!(actual is string))
-                return false;
-
-            return (string)actual == string.Empty;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("<empty>");
-        }
-    }
-    #endregion
-
-    #region NullOrEmptyStringConstraint
-    /// <summary>
-    /// NullEmptyStringConstraint tests whether a string is either null or empty.
-    /// </summary>
-    public class NullOrEmptyStringConstraint : Constraint
-    {
-        /// <summary>
-        /// Constructs a new NullOrEmptyStringConstraint
-        /// </summary>
-        public NullOrEmptyStringConstraint()
-        {
-            this.DisplayName = "nullorempty";
-        }
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True for success, false for failure</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (actual == null)
-                return true;
-
-            if (!(actual is string))
-                throw new ArgumentException("Actual value must be a string", "actual");
-
-            return (string)actual == string.Empty;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.Write("null or empty string");
-        }
-    }
-    #endregion
-
-    #region Substring Constraint
-    /// <summary>
-	/// SubstringConstraint can test whether a string contains
-	/// the expected substring.
-	/// </summary>
-    public class SubstringConstraint : StringConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:SubstringConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected.</param>
-        public SubstringConstraint(string expected) : base(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 ( !(actual is string) )
-                return false;
-
-            if (this.caseInsensitive)
-                return ((string)actual).ToLower().IndexOf(expected.ToLower()) >= 0;
-            else
-                return ((string)actual).IndexOf(expected) >= 0;
-        }
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("String containing");
-            writer.WriteExpectedValue(expected);
-			if ( this.caseInsensitive )
-				writer.WriteModifier( "ignoring case" );
-		}
-    }
-    #endregion
-
-    #region StartsWithConstraint
-    /// <summary>
-	/// StartsWithConstraint can test whether a string starts
-	/// with an expected substring.
-	/// </summary>
-    public class StartsWithConstraint : StringConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:StartsWithConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        public StartsWithConstraint(string expected) : base(expected) { }
-
-        /// <summary>
-        /// Test whether the constraint is matched by the actual value.
-        /// This is a template method, which calls the IsMatch method
-        /// of the derived class.
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (!(actual is string))
-                return false;
-
-            if ( this.caseInsensitive )
-                return ((string)actual).ToLower().StartsWith(expected.ToLower());
-            else
-                return ((string)actual).StartsWith(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("String starting with");
-            writer.WriteExpectedValue( MsgUtils.ClipString(expected, writer.MaxLineLength - 40, 0) );
-			if ( this.caseInsensitive )
-				writer.WriteModifier( "ignoring case" );
-		}
-    }
-    #endregion
-
-    #region EndsWithConstraint
-    /// <summary>
-    /// EndsWithConstraint can test whether a string ends
-    /// with an expected substring.
-    /// </summary>
-    public class EndsWithConstraint : StringConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:EndsWithConstraint"/> class.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        public EndsWithConstraint(string expected) : base(expected) { }
-
-        /// <summary>
-        /// Test whether the constraint is matched by the actual value.
-        /// This is a template method, which calls the IsMatch method
-        /// of the derived class.
-        /// </summary>
-        /// <param name="actual"></param>
-        /// <returns></returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-
-            if (!(actual is string))
-                return false;
-
-            if ( this.caseInsensitive )
-                return ((string)actual).ToLower().EndsWith(expected.ToLower());
-            else
-                return ((string)actual).EndsWith(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("String ending with");
-            writer.WriteExpectedValue(expected);
-			if ( this.caseInsensitive )
-				writer.WriteModifier( "ignoring case" );
-		}
-    }
-    #endregion
-
-    #region RegexConstraint
-#if !NETCF
-    /// <summary>
-    /// RegexConstraint can test whether a string matches
-    /// the pattern provided.
-    /// </summary>
-    public class RegexConstraint : StringConstraint
-    {
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:RegexConstraint"/> class.
-        /// </summary>
-        /// <param name="pattern">The pattern.</param>
-        public RegexConstraint(string pattern) : base(pattern) { }
-
-        /// <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;
-
-            return actual is string && 
-                Regex.IsMatch( 
-                    (string)actual, 
-                    this.expected,
-                    this.caseInsensitive ? RegexOptions.IgnoreCase : RegexOptions.None );
-        }
-
-        /// <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("String matching");
-            writer.WriteExpectedValue(this.expected);
-			if ( this.caseInsensitive )
-				writer.WriteModifier( "ignoring case" );
-		}
-    }
-#endif
-    #endregion
-}
diff --git a/src/NUnitFramework/framework/Constraints/SubPathConstraint.cs b/src/NUnitFramework/framework/Constraints/SubPathConstraint.cs
new file mode 100644
index 0000000..b810474
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/SubPathConstraint.cs
@@ -0,0 +1,43 @@
+// ***************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// SubPathConstraint tests that the actual path is under the expected path
+    /// </summary>
+    public class SubPathConstraint : PathConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SubPathConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected path</param>
+        public SubPathConstraint(string expected) : base(expected) { }
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="expectedPath">The expected path</param>
+        /// <param name="actualPath">The actual path</param>
+        /// <returns>True for success, false for failure</returns>
+        protected override bool IsMatch(string expectedPath, string actualPath)
+        {
+            return IsSubPath(Canonicalize(expectedPath), Canonicalize(actualPath), caseInsensitive);
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("Path under");
+            writer.WriteExpectedValue(expectedPath);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/SubstringConstraint.cs b/src/NUnitFramework/framework/Constraints/SubstringConstraint.cs
new file mode 100644
index 0000000..8c0248b
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/SubstringConstraint.cs
@@ -0,0 +1,46 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// SubstringConstraint can test whether a string contains
+    /// the expected substring.
+    /// </summary>
+    public class SubstringConstraint : StringConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:SubstringConstraint"/> class.
+        /// </summary>
+        /// <param name="expected">The expected.</param>
+        public SubstringConstraint(string expected) : base(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>
+        protected override bool Matches(string actual)
+        {
+            if (this.caseInsensitive)
+                return actual.ToLower().IndexOf(expected.ToLower()) >= 0;
+            else
+                return actual.IndexOf(expected) >= 0;
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.WritePredicate("String containing");
+            writer.WriteExpectedValue(expected);
+            if (this.caseInsensitive)
+                writer.WriteModifier("ignoring case");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs b/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
index a4d2cdb..7fc1f9d 100644
--- a/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
+++ b/src/NUnitFramework/framework/Constraints/ThrowsConstraint.cs
@@ -1,195 +1,248 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    #region ThrowsConstraint
-    /// <summary>
-    /// ThrowsConstraint is used to test the exception thrown by 
-    /// a delegate by applying a constraint to it.
-    /// </summary>
-    public class ThrowsConstraint : PrefixConstraint
-    {
-        private Exception caughtException;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:ThrowsConstraint"/> class,
-        /// using a constraint to be applied to the exception.
-        /// </summary>
-        /// <param name="baseConstraint">A constraint to apply to the caught exception.</param>
-        public ThrowsConstraint(Constraint baseConstraint)
-            : base(baseConstraint) { }
-
-        /// <summary>
-        /// Get the actual exception thrown - used by Assert.Throws.
-        /// </summary>
-        public Exception ActualException
-        {
-            get { return caughtException; }
-        }
-
-        #region Constraint Overrides
-        /// <summary>
-        /// Executes the code of the delegate and captures any exception.
-        /// If a non-null base constraint was provided, it applies that
-        /// constraint to the exception.
-        /// </summary>
-        /// <param name="actual">A delegate representing the code to be tested</param>
-        /// <returns>True if an exception is thrown and the constraint succeeds, otherwise false</returns>
-        public override bool Matches(object actual)
-        {
-            TestDelegate code = actual as TestDelegate;
-            if (code == null)
-                throw new ArgumentException(
-                    string.Format("The actual value must be a TestDelegate but was {0}",actual.GetType().Name), "actual");
-
-            this.caughtException = null;
-
-            try
-            {
-                code();
-            }
-            catch (Exception ex)
-            {
-                this.caughtException = ex;
-            }
-
-            if (this.caughtException == null)
-                return false;
-
-            return baseConstraint == null || baseConstraint.Matches(caughtException);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Converts an ActualValueDelegate to a TestDelegate
-        /// before calling the primary overload.
-        /// </summary>
-        /// <param name="del"></param>
-        /// <returns></returns>
-        public override bool Matches(ActualValueDelegate del)
-        {
-            TestDelegate testDelegate = new TestDelegate(delegate { del(); });
-            return Matches((object)testDelegate);
-        }
-#endif
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            if (baseConstraint == null)
-                writer.WritePredicate("an exception");
-            else
-                baseConstraint.WriteDescriptionTo(writer);
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. The default implementation simply writes
-        /// the raw value of actual, leaving it to the writer to
-        /// perform any formatting.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-        public override void WriteActualValueTo(MessageWriter writer)
-        {
-            if (caughtException == null)
-                writer.Write("no exception thrown");
-            else if (baseConstraint != null)
-                baseConstraint.WriteActualValueTo(writer);
-            else
-                writer.WriteActualValue(caughtException);
-        }
-        #endregion
-
-        /// <summary>
-        /// Returns the string representation of this constraint
-        /// </summary>
-        protected override string GetStringRepresentation()
-        {
-            if (baseConstraint == null)
-                return "<throws>";
-            
-            return base.GetStringRepresentation();
-        }
-    }
-    #endregion
-
-    #region ThrowsNothingConstraint
-    /// <summary>
-    /// ThrowsNothingConstraint tests that a delegate does not
-    /// throw an exception.
-    /// </summary>
-	public class ThrowsNothingConstraint : Constraint
-	{
-		private Exception caughtException;
-
-        /// <summary>
-        /// Test whether the constraint is satisfied by a given value
-        /// </summary>
-        /// <param name="actual">The value to be tested</param>
-        /// <returns>True if no exception is thrown, otherwise false</returns>
-		public override bool Matches(object actual)
-		{
-			TestDelegate code = actual as TestDelegate;
-			if (code == null)
-				throw new ArgumentException("The actual value must be a TestDelegate", "actual");
-
-            this.caughtException = null;
-
-            try
-            {
-                code();
-            }
-            catch (Exception ex)
-            {
-                this.caughtException = ex;
-            }
-
-			return this.caughtException == null;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Converts an ActualValueDelegate to a TestDelegate
-        /// before calling the primary overload.
-        /// </summary>
-        /// <param name="del"></param>
-        /// <returns></returns>
-        public override bool Matches(ActualValueDelegate del)
-        {
-            TestDelegate testDelegate = new TestDelegate(delegate { del(); });
-            return Matches((object)testDelegate);
-        }
-#endif
-
-        /// <summary>
-        /// Write the constraint description to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The writer on which the description is displayed</param>
-		public override void WriteDescriptionTo(MessageWriter writer)
-		{
-			writer.Write(string.Format("No Exception to be thrown"));
-		}
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. The default implementation simply writes
-        /// the raw value of actual, leaving it to the writer to
-        /// perform any formatting.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-		public override void WriteActualValueTo(MessageWriter writer)
-		{
-			writer.WriteActualValue( this.caughtException.GetType() );
-		}
-    }
-    #endregion
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ThrowsConstraint is used to test the exception thrown by 
+    /// a delegate by applying a constraint to it.
+    /// </summary>
+    public class ThrowsConstraint : PrefixConstraint
+    {
+        private Exception caughtException;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ThrowsConstraint"/> class,
+        /// using a constraint to be applied to the exception.
+        /// </summary>
+        /// <param name="baseConstraint">A constraint to apply to the caught exception.</param>
+        public ThrowsConstraint(Constraint baseConstraint)
+            : base(baseConstraint) { }
+
+        /// <summary>
+        /// Get the actual exception thrown - used by Assert.Throws.
+        /// </summary>
+        public Exception ActualException
+        {
+            get { return caughtException; }
+        }
+
+        #region Constraint Overrides
+        /// <summary>
+        /// Executes the code of the delegate and captures any exception.
+        /// If a non-null base constraint was provided, it applies that
+        /// constraint to the exception.
+        /// </summary>
+        /// <param name="actual">A delegate representing the code to be tested</param>
+        /// <returns>True if an exception is thrown and the constraint succeeds, otherwise false</returns>
+        public override bool Matches(object actual)
+        {
+	        caughtException = ExceptionInterceptor.Intercept(actual);
+
+			if (caughtException == null)
+                return false;
+
+            return baseConstraint == null || baseConstraint.Matches(caughtException);
+        }
+
+        /// <summary>
+        /// Converts an ActualValueDelegate to a TestDelegate
+        /// before calling the primary overload.
+        /// </summary>
+#if CLR_2_0 || CLR_4_0
+        public override bool Matches<T>(ActualValueDelegate<T> del)
+		{
+            return Matches(new GenericInvocationDescriptor<T>(del));
+        }
+#else
+        public override bool Matches(ActualValueDelegate del)
+        {
+            return Matches(new ObjectInvocationDescriptor(del));
+        }
+#endif
+
+		/// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            if (baseConstraint == null)
+                writer.WritePredicate("an exception");
+            else
+                baseConstraint.WriteDescriptionTo(writer);
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            if (caughtException == null)
+                writer.Write("no exception thrown");
+            else if (baseConstraint != null)
+                baseConstraint.WriteActualValueTo(writer);
+            else
+                writer.WriteActualValue(caughtException);
+        }
+        #endregion
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            if (baseConstraint == null)
+                return "<throws>";
+            
+            return base.GetStringRepresentation();
+        }
+    }
+
+	#region ExceptionInterceptor
+
+	internal class ExceptionInterceptor
+	{
+		private ExceptionInterceptor(){}
+
+		internal static Exception Intercept(object invocation)
+		{
+			IInvocationDescriptor invocationDescriptor = GetInvocationDescriptor(invocation);
+
+#if CLR_2_0 || CLR_4_0
+			if (AsyncInvocationRegion.IsAsyncOperation(invocationDescriptor.Delegate))
+			{
+				using (AsyncInvocationRegion region = AsyncInvocationRegion.Create(invocationDescriptor.Delegate))
+				{
+					object result = invocationDescriptor.Invoke();
+
+					try
+					{
+						region.WaitForPendingOperationsToComplete(result);
+						return null;
+					}
+					catch (Exception ex)
+					{
+						return ex;
+					}
+				}
+			}
+			else
+#endif
+			{
+				try
+				{
+					invocationDescriptor.Invoke();
+					return null;
+				}
+				catch (Exception ex)
+				{
+					return ex;
+				}
+			}
+		}
+
+		private static IInvocationDescriptor GetInvocationDescriptor(object actual)
+		{
+			IInvocationDescriptor invocationDescriptor = actual as IInvocationDescriptor;
+
+			if (invocationDescriptor == null)
+			{
+				TestDelegate testDelegate = actual as TestDelegate;
+
+				if (testDelegate == null)
+					throw new ArgumentException(
+						String.Format("The actual value must be a TestDelegate or ActualValueDelegate but was {0}", actual.GetType().Name),
+						"actual");
+
+				invocationDescriptor = new VoidInvocationDescriptor(testDelegate);
+			}
+
+			return invocationDescriptor;
+		}
+	}
+
+	#endregion
+
+	#region InvocationDescriptor
+
+	internal class VoidInvocationDescriptor : IInvocationDescriptor
+	{
+		private readonly TestDelegate _del;
+
+		public VoidInvocationDescriptor(TestDelegate del)
+		{
+			_del = del;
+		}
+
+		public object Invoke()
+		{
+			_del();
+			return null;
+		}
+
+		public Delegate Delegate
+		{
+			get { return _del; }
+		}
+	}
+
+#if CLR_2_0 || CLR_4_0
+	internal class GenericInvocationDescriptor<T> : IInvocationDescriptor
+	{
+		private readonly ActualValueDelegate<T> _del;
+
+		public GenericInvocationDescriptor(ActualValueDelegate<T> del)
+		{
+			_del = del;
+		}
+
+		public object Invoke()
+		{
+			return _del();
+		}
+
+		public Delegate Delegate
+		{
+			get { return _del; }
+		}
+	}
+#else
+	internal class ObjectInvocationDescriptor : IInvocationDescriptor
+	{
+		private readonly ActualValueDelegate _del;
+
+		public ObjectInvocationDescriptor(ActualValueDelegate del)
+		{
+			_del = del;
+		}
+
+		public object Invoke()
+		{
+			return _del();
+		}
+
+		public Delegate Delegate
+		{
+			get { return _del; }
+		}
+	}
+#endif
+
+	internal interface IInvocationDescriptor
+	{
+		object Invoke();
+		Delegate Delegate { get; }
+	}
+
+	#endregion
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Constraints/ThrowsNothingConstraint.cs b/src/NUnitFramework/framework/Constraints/ThrowsNothingConstraint.cs
new file mode 100644
index 0000000..8992890
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ThrowsNothingConstraint.cs
@@ -0,0 +1,64 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// ThrowsNothingConstraint tests that a delegate does not
+    /// throw an exception.
+    /// </summary>
+    public class ThrowsNothingConstraint : Constraint
+    {
+        private Exception caughtException;
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True if no exception is thrown, otherwise false</returns>
+        public override bool Matches(object actual)
+        {
+            caughtException = ExceptionInterceptor.Intercept(actual);
+
+            return caughtException == null;
+        }
+
+#if CLR_2_0 || CLR_4_0
+        public override bool Matches<T>(ActualValueDelegate<T> del)
+        {
+            return Matches(new GenericInvocationDescriptor<T>(del));
+        }
+#else
+        public override bool Matches(ActualValueDelegate del)
+        {
+            return Matches(new ObjectInvocationDescriptor(del));
+        }
+#endif
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write(string.Format("No Exception to be thrown"));
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. Overridden in ThrowsNothingConstraint to write 
+        /// information about the exception that was actually caught.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.WriteLine(" ({0})", caughtException.Message);
+            writer.Write(caughtException.StackTrace);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Constraints/Tolerance.cs b/src/NUnitFramework/framework/Constraints/Tolerance.cs
index 9f72a58..ffdceec 100644
--- a/src/NUnitFramework/framework/Constraints/Tolerance.cs
+++ b/src/NUnitFramework/framework/Constraints/Tolerance.cs
@@ -1,236 +1,203 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org/
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// Modes in which the tolerance value for a comparison can
-    /// be interpreted.
-    /// </summary>
-    public enum ToleranceMode
-    {
-        /// <summary>
-        /// The tolerance was created with a value, without specifying 
-        /// how the value would be used. This is used to prevent setting
-        /// the mode more than once and is generally changed to Linear
-        /// upon execution of the test.
-        /// </summary>
-        None,
-        /// <summary>
-        /// The tolerance is used as a numeric range within which
-        /// two compared values are considered to be equal.
-        /// </summary>
-        Linear,
-        /// <summary>
-        /// Interprets the tolerance as the percentage by which
-        /// the two compared values my deviate from each other.
-        /// </summary>
-        Percent,
-        /// <summary>
-        /// Compares two values based in their distance in
-        /// representable numbers.
-        /// </summary>
-        Ulps
-    }
-
-    /// <summary>
-    /// The Tolerance class generalizes the notion of a tolerance
-    /// within which an equality test succeeds. Normally, it is
-    /// used with numeric types, but it can be used with any
-    /// type that supports taking a difference between two 
-    /// objects and comparing that difference to a value.
-    /// </summary>
-    public class Tolerance
-    {
-        private ToleranceMode mode;
-        private object amount;
-
-        private static readonly string ModeMustFollowTolerance =
-            "Tolerance amount must be specified before setting mode";
-        private static readonly string MultipleToleranceModes =
-            "Tried to use multiple tolerance modes at the same time";
-        private static readonly string NumericToleranceRequired =
-            "A numeric tolerance is required";
-
-        /// <summary>
-        /// Returns an empty Tolerance object, equivalent to
-        /// specifying 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
-        {
-            get { return new Tolerance(0, ToleranceMode.None); }
-        }
-
-        /// <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) { }
-
-        /// <summary>
-        /// Constructs a tolerance given an amount and ToleranceMode
-        /// </summary>
-        public Tolerance(object amount, ToleranceMode mode)
-        {
-            this.amount = amount;
-            this.mode = mode;
-        }
-
-        /// <summary>
-        /// Gets the ToleranceMode for the current Tolerance
-        /// </summary>
-        public ToleranceMode Mode
-        {
-            get { return this.mode; }
-        }
-        
-
-        /// <summary>
-        /// Tests that the current Tolerance is linear with a 
-        /// numeric value, throwing an exception if it is not.
-        /// </summary>
-        private void CheckLinearAndNumeric()
-        {
-            if (mode != ToleranceMode.Linear)
-                throw new InvalidOperationException(mode == ToleranceMode.None
-                    ? ModeMustFollowTolerance
-                    : MultipleToleranceModes);
-
-            if (!Numerics.IsNumericType(amount))
-                throw new InvalidOperationException(NumericToleranceRequired);
-        }
-
-        /// <summary>
-        /// Gets the value of the current Tolerance instance.
-        /// </summary>
-        public object Value
-        {
-            get { return this.amount; }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance, using the current amount as a percentage.
-        /// </summary>
-        public Tolerance Percent
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(this.amount, ToleranceMode.Percent);
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance, using the current amount in Ulps.
-        /// </summary>
-        public Tolerance Ulps
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(this.amount, ToleranceMode.Ulps);
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance with a TimeSpan as the amount, using 
-        /// the current amount as a number of days.
-        /// </summary>
-        public Tolerance Days
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(TimeSpan.FromDays(Convert.ToDouble(amount)));
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance with a TimeSpan as the amount, using 
-        /// the current amount as a number of hours.
-        /// </summary>
-        public Tolerance Hours
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(TimeSpan.FromHours(Convert.ToDouble(amount)));
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance with a TimeSpan as the amount, using 
-        /// the current amount as a number of minutes.
-        /// </summary>
-        public Tolerance Minutes
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(TimeSpan.FromMinutes(Convert.ToDouble(amount)));
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance with a TimeSpan as the amount, using 
-        /// the current amount as a number of seconds.
-        /// </summary>
-        public Tolerance Seconds
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(TimeSpan.FromSeconds(Convert.ToDouble(amount)));
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance with a TimeSpan as the amount, using 
-        /// the current amount as a number of milliseconds.
-        /// </summary>
-        public Tolerance Milliseconds
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(TimeSpan.FromMilliseconds(Convert.ToDouble(amount)));
-            }
-        }
-
-        /// <summary>
-        /// Returns a new tolerance with a TimeSpan as the amount, using 
-        /// the current amount as a number of clock ticks.
-        /// </summary>
-        public Tolerance Ticks
-        {
-            get
-            {
-                CheckLinearAndNumeric();
-                return new Tolerance(TimeSpan.FromTicks(Convert.ToInt64(amount)));
-            }
-        }
-
-        /// <summary>
-        /// Returns true if the current tolerance is empty.
-        /// </summary>
-        public bool IsEmpty
-        {
-            get { return mode == ToleranceMode.None; }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org/
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// The Tolerance class generalizes the notion of a tolerance
+    /// within which an equality test succeeds. Normally, it is
+    /// used with numeric types, but it can be used with any
+    /// type that supports taking a difference between two 
+    /// objects and comparing that difference to a value.
+    /// </summary>
+    public class Tolerance
+    {
+        private readonly ToleranceMode mode;
+        private readonly object amount;
+
+        private const string ModeMustFollowTolerance = "Tolerance amount must be specified before setting mode";
+        private const string MultipleToleranceModes = "Tried to use multiple tolerance modes at the same time";
+        private const string NumericToleranceRequired = "A numeric tolerance is required";
+
+        /// <summary>
+        /// 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
+        {
+            get { return new Tolerance(0, ToleranceMode.None); }
+        }
+
+        /// <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) { }
+
+        /// <summary>
+        /// Constructs a tolerance given an amount and ToleranceMode
+        /// </summary>
+        private Tolerance(object amount, ToleranceMode mode)
+        {
+            this.amount = amount;
+            this.mode = mode;
+        }
+
+        /// <summary>
+        /// Gets the ToleranceMode for the current Tolerance
+        /// </summary>
+        public ToleranceMode Mode
+        {
+            get { return this.mode; }
+        }
+        
+
+        /// <summary>
+        /// Tests that the current Tolerance is linear with a 
+        /// numeric value, throwing an exception if it is not.
+        /// </summary>
+        private void CheckLinearAndNumeric()
+        {
+            if (mode != ToleranceMode.Linear)
+                throw new InvalidOperationException(mode == ToleranceMode.None
+                    ? ModeMustFollowTolerance
+                    : MultipleToleranceModes);
+
+            if (!Numerics.IsNumericType(amount))
+                throw new InvalidOperationException(NumericToleranceRequired);
+        }
+
+        /// <summary>
+        /// Gets the value of the current Tolerance instance.
+        /// </summary>
+        public object Value
+        {
+            get { return this.amount; }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance, using the current amount as a percentage.
+        /// </summary>
+        public Tolerance Percent
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(this.amount, ToleranceMode.Percent);
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance, using the current amount in Ulps.
+        /// </summary>
+        public Tolerance Ulps
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(this.amount, ToleranceMode.Ulps);
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of days.
+        /// </summary>
+        public Tolerance Days
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromDays(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of hours.
+        /// </summary>
+        public Tolerance Hours
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromHours(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of minutes.
+        /// </summary>
+        public Tolerance Minutes
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromMinutes(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of seconds.
+        /// </summary>
+        public Tolerance Seconds
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromSeconds(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of milliseconds.
+        /// </summary>
+        public Tolerance Milliseconds
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromMilliseconds(Convert.ToDouble(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns a new tolerance with a TimeSpan as the amount, using 
+        /// the current amount as a number of clock ticks.
+        /// </summary>
+        public Tolerance Ticks
+        {
+            get
+            {
+                CheckLinearAndNumeric();
+                return new Tolerance(TimeSpan.FromTicks(Convert.ToInt64(amount)));
+            }
+        }
+
+        /// <summary>
+        /// Returns true if the current tolerance is empty.
+        /// </summary>
+        public bool IsEmpty
+        {
+            get { return mode == ToleranceMode.None; }
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/ToleranceMode.cs b/src/NUnitFramework/framework/Constraints/ToleranceMode.cs
new file mode 100644
index 0000000..4f9f5f5
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/ToleranceMode.cs
@@ -0,0 +1,37 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org/
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Modes in which the tolerance value for a comparison can be interpreted.
+    /// </summary>
+    public enum ToleranceMode
+    {
+        /// <summary>
+        /// The tolerance was created with a value, without specifying 
+        /// how the value would be used. This is used to prevent setting
+        /// the mode more than once and is generally changed to Linear
+        /// upon execution of the test.
+        /// </summary>
+        None,
+        /// <summary>
+        /// The tolerance is used as a numeric range within which
+        /// two compared values are considered to be equal.
+        /// </summary>
+        Linear,
+        /// <summary>
+        /// Interprets the tolerance as the percentage by which
+        /// the two compared values my deviate from each other.
+        /// </summary>
+        Percent,
+        /// <summary>
+        /// Compares two values based in their distance in
+        /// representable numbers.
+        /// </summary>
+        Ulps
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/TrueConstraint.cs b/src/NUnitFramework/framework/Constraints/TrueConstraint.cs
new file mode 100644
index 0000000..6d99bc1
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/TrueConstraint.cs
@@ -0,0 +1,19 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// TrueConstraint tests that the actual value is true
+    /// </summary>
+    public class TrueConstraint : BasicConstraint
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:TrueConstraint"/> class.
+        /// </summary>
+        public TrueConstraint() : base(true, "True") { }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/TypeConstraint.cs b/src/NUnitFramework/framework/Constraints/TypeConstraint.cs
new file mode 100644
index 0000000..6fb67bb
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/TypeConstraint.cs
@@ -0,0 +1,42 @@
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// TypeConstraint is the abstract base for constraints
+    /// that take a Type as their expected value.
+    /// </summary>
+    public abstract class TypeConstraint : Constraint
+    {
+        /// <summary>
+        /// The expected Type used by the constraint
+        /// </summary>
+        protected readonly Type expectedType;
+
+        /// <summary>
+        /// Construct a TypeConstraint for a given Type
+        /// </summary>
+        /// <param name="type"></param>
+        protected TypeConstraint(Type type) : base(type)
+        {
+            this.expectedType = type;
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. TypeConstraints override this method to write
+        /// the name of the type.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+		public override void WriteActualValueTo(MessageWriter writer)
+		{
+			writer.WriteActualValue( actual == null ? null : actual.GetType() ); 
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Constraints/TypeConstraints.cs b/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
deleted file mode 100644
index a43bf05..0000000
--- a/src/NUnitFramework/framework/Constraints/TypeConstraints.cs
+++ /dev/null
@@ -1,214 +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.Framework.Constraints
-{
-    /// <summary>
-    /// TypeConstraint is the abstract base for constraints
-    /// that take a Type as their expected value.
-    /// </summary>
-    public abstract class TypeConstraint : Constraint
-    {
-        /// <summary>
-        /// The expected Type used by the constraint
-        /// </summary>
-        protected Type expectedType;
-
-        /// <summary>
-        /// Construct a TypeConstraint for a given Type
-        /// </summary>
-        /// <param name="type"></param>
-        public TypeConstraint(Type type) : base(type)
-        {
-            this.expectedType = type;
-        }
-
-        /// <summary>
-        /// Write the actual value for a failing constraint test to a
-        /// MessageWriter. TypeConstraints override this method to write
-        /// the name of the type.
-        /// </summary>
-        /// <param name="writer">The writer on which the actual value is displayed</param>
-		public override void WriteActualValueTo(MessageWriter writer)
-		{
-			writer.WriteActualValue( actual == null ? null : actual.GetType() ); 
-		}
-	}
-
-    /// <summary>
-    /// ExactTypeConstraint is used to test that an object
-    /// is of the exact type provided in the constructor
-    /// </summary>
-    public class ExactTypeConstraint : TypeConstraint
-    {
-        /// <summary>
-        /// Construct an ExactTypeConstraint for a given Type
-        /// </summary>
-        /// <param name="type">The expected Type.</param>
-        public ExactTypeConstraint(Type type) : base( type ) 
-        {
-            this.DisplayName = "typeof";
-        }
-
-        /// <summary>
-        /// Test that an object is of the exact type specified
-        /// </summary>
-        /// <param name="actual">The actual value.</param>
-        /// <returns>True if the tested object is of the exact type provided, otherwise false.</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            return actual != null && actual.GetType() == this.expectedType;
-        }
-
-        /// <summary>
-        /// Write the description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The MessageWriter to use</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WriteExpectedValue(expectedType);
-        }
-    }
-
-    /// <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>
-    public class InstanceOfTypeConstraint : TypeConstraint
-    {
-        /// <summary>
-        /// Construct an InstanceOfTypeConstraint for the type provided
-        /// </summary>
-        /// <param name="type">The expected Type</param>
-        public InstanceOfTypeConstraint(Type type) : base(type) 
-        {
-            this.DisplayName = "instanceof";
-        }
-
-        /// <summary>
-        /// Test whether an object is of the specified type or a derived type
-        /// </summary>
-        /// <param name="actual">The object to be tested</param>
-        /// <returns>True if the object is of the provided type or derives from it, otherwise false.</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            return actual != null && expectedType.IsInstanceOfType(actual);
-        }
-
-        /// <summary>
-        /// Write a description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The MessageWriter to use</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("instance of");
-            writer.WriteExpectedValue(expectedType);
-        }
-	}
-
-    /// <summary>
-    /// AssignableFromConstraint is used to test that an object
-    /// can be assigned from a given Type.
-    /// </summary>
-    public class AssignableFromConstraint : TypeConstraint
-    {
-        /// <summary>
-        /// Construct an AssignableFromConstraint for the type provided
-        /// </summary>
-        /// <param name="type"></param>
-        public AssignableFromConstraint(Type type) : base(type) { }
-
-        /// <summary>
-        /// Test whether an object can be assigned from the specified type
-        /// </summary>
-        /// <param name="actual">The object to be tested</param>
-        /// <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            return actual != null && actual.GetType().IsAssignableFrom(expectedType);
-        }
-
-        /// <summary>
-        /// Write a description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The MessageWriter to use</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("assignable from");
-            writer.WriteExpectedValue(expectedType);
-        }
-    }
-
-    /// <summary>
-    /// AssignableToConstraint is used to test that an object
-    /// can be assigned to a given Type.
-    /// </summary>
-    public class AssignableToConstraint : TypeConstraint
-    {
-        /// <summary>
-        /// Construct an AssignableToConstraint for the type provided
-        /// </summary>
-        /// <param name="type"></param>
-        public AssignableToConstraint(Type type) : base(type) { }
-
-        /// <summary>
-        /// Test whether an object can be assigned to the specified type
-        /// </summary>
-        /// <param name="actual">The object to be tested</param>
-        /// <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
-        public override bool Matches(object actual)
-        {
-            this.actual = actual;
-            return actual != null && expectedType.IsAssignableFrom(actual.GetType());
-        }
-
-        /// <summary>
-        /// Write a description of this constraint to a MessageWriter
-        /// </summary>
-        /// <param name="writer">The MessageWriter to use</param>
-        public override void WriteDescriptionTo(MessageWriter writer)
-        {
-            writer.WritePredicate("assignable to");
-            writer.WriteExpectedValue(expectedType);
-        }
-    }
-}
diff --git a/src/NUnitFramework/framework/Constraints/UniqueItemsConstraint.cs b/src/NUnitFramework/framework/Constraints/UniqueItemsConstraint.cs
new file mode 100644
index 0000000..15fd413
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/UniqueItemsConstraint.cs
@@ -0,0 +1,46 @@
+// ****************************************************************
+// Copyright 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.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// UniqueItemsConstraint tests whether all the items in a 
+    /// collection are unique.
+    /// </summary>
+    public class UniqueItemsConstraint : CollectionItemsEqualConstraint
+    {
+        /// <summary>
+        /// Check that all items are unique.
+        /// </summary>
+        /// <param name="actual"></param>
+        /// <returns></returns>
+        protected override bool doMatch(IEnumerable actual)
+        {
+            ArrayList list = new ArrayList();
+
+            foreach (object o1 in actual)
+            {
+                foreach (object o2 in list)
+                    if (ItemsEqual(o1, o2))
+                        return false;
+                list.Add(o1);
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// Write a description of this constraint to a MessageWriter
+        /// </summary>
+        /// <param name="writer"></param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("all items unique");
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Constraints/XmlSerializableConstraint.cs b/src/NUnitFramework/framework/Constraints/XmlSerializableConstraint.cs
new file mode 100644
index 0000000..b1b8a46
--- /dev/null
+++ b/src/NUnitFramework/framework/Constraints/XmlSerializableConstraint.cs
@@ -0,0 +1,86 @@
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Xml.Serialization;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// XmlSerializableConstraint tests whether 
+    /// an object is serializable in XML format.
+    /// </summary>
+    public class XmlSerializableConstraint : Constraint
+    {
+        private XmlSerializer serializer;
+
+        /// <summary>
+        /// Test whether the constraint is satisfied by a given value
+        /// </summary>
+        /// <param name="actual">The value to be tested</param>
+        /// <returns>True for success, false for failure</returns>
+        public override bool Matches(object actual)
+        {
+            this.actual = actual;
+
+            if (actual == null)
+                throw new ArgumentException();
+
+            MemoryStream stream = new MemoryStream();
+
+            try
+            {
+                serializer = new XmlSerializer(actual.GetType());
+
+                serializer.Serialize(stream, actual);
+
+                stream.Seek(0, SeekOrigin.Begin);
+
+                object value = serializer.Deserialize(stream);
+
+                return value != null;
+            }
+            catch (NotSupportedException)
+            {
+                return false;
+            }
+            catch (InvalidOperationException)
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// Write the constraint description to a MessageWriter
+        /// </summary>
+        /// <param name="writer">The writer on which the description is displayed</param>
+        public override void WriteDescriptionTo(MessageWriter writer)
+        {
+            writer.Write("xml serializable");
+        }
+
+        /// <summary>
+        /// Write the actual value for a failing constraint test to a
+        /// MessageWriter. The default implementation simply writes
+        /// the raw value of actual, leaving it to the writer to
+        /// perform any formatting.
+        /// </summary>
+        /// <param name="writer">The writer on which the actual value is displayed</param>
+        public override void WriteActualValueTo(MessageWriter writer)
+        {
+            writer.Write("<{0}>", actual.GetType().Name);
+        }
+
+        /// <summary>
+        /// Returns the string representation of this constraint
+        /// </summary>
+        protected override string GetStringRepresentation()
+        {
+            return "<xmlserializable>";
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Contains.cs b/src/NUnitFramework/framework/Contains.cs
index 02456db..f32341f 100644
--- a/src/NUnitFramework/framework/Contains.cs
+++ b/src/NUnitFramework/framework/Contains.cs
@@ -1,38 +1,45 @@
-// ****************************************************************
-// 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 NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Static helper class used in the constraint-based syntax
-    /// </summary>
-    public class Contains
-    {
-        /// <summary>
-        /// Creates a new SubstringConstraint
-        /// </summary>
-        /// <param name="substring">The value of the substring</param>
-        /// <returns>A SubstringConstraint</returns>
-        public static SubstringConstraint Substring(string substring)
-        {
-            return new SubstringConstraint(substring);
-        }
-
-        /// <summary>
-        /// Creates a new CollectionContainsConstraint.
-        /// </summary>
-        /// <param name="item">The item that should be found.</param>
-        /// <returns>A new CollectionContainsConstraint</returns>
-        public static CollectionContainsConstraint Item(object item)
-        {
-            return new CollectionContainsConstraint(item);
-        }
-    }
-}
+// ****************************************************************
+// 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 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 Contains
+    {
+        #region Item
+
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public static CollectionContainsConstraint Item(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+
+        #endregion
+
+        #region Substring
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public static SubstringConstraint Substring(string expected)
+        {
+            return new SubstringConstraint(expected); ;
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/DirectoryAssert.cs b/src/NUnitFramework/framework/DirectoryAssert.cs
index dbe9386..67dc8a7 100644
--- a/src/NUnitFramework/framework/DirectoryAssert.cs
+++ b/src/NUnitFramework/framework/DirectoryAssert.cs
@@ -1,553 +1,553 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.IO;
-using System.ComponentModel;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Summary description for DirectoryAssert
-    /// </summary>
-    [Obsolete("Use Assert with constraint-based syntax")]
-    public class DirectoryAssert
-    {
-        #region Equals and ReferenceEquals
-
-        /// <summary>
-        /// The Equals method throws an AssertionException. This is done 
-        /// to make sure there is no mistake by calling this function.
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public static new bool Equals(object a, object b)
-        {
-            throw new AssertionException("Assert.Equals should not be used for Assertions");
-        }
-
-        /// <summary>
-        /// override the default ReferenceEquals to throw an AssertionException. This 
-        /// implementation makes sure there is no mistake in calling this function 
-        /// as part of Assert. 
-        /// </summary>
-        /// <param name="a"></param>
-        /// <param name="b"></param>
-        public static new void ReferenceEquals(object a, object b)
-        {
-            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
-        }
-
-        #endregion
-
-        #region Constructor
-
-        /// <summary>
-        /// We don't actually want any instances of this object, but some people
-        /// like to inherit from it to add other static methods. Hence, the
-        /// protected constructor disallows any instances of this object. 
-        /// </summary>
-        protected DirectoryAssert() { }
-
-        #endregion
-
-        #region AreEqual
-
-        /// <summary>
-        /// Verifies that two directories are equal.  Two directories are considered
-        /// equal if both are null, or if both have the same value byte for byte.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory containing the value that is expected</param>
-        /// <param name="actual">A directory containing the actual value</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual, string message, params object[] args)
-        {
-            Assert.That(actual, new EqualConstraint(expected), message, args);
-        }
-
-        /// <summary>
-        /// Verifies that two directories are equal.  Two directories are considered
-        /// equal if both are null, or if both have the same value byte for byte.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory containing the value that is expected</param>
-        /// <param name="actual">A directory containing the actual value</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual, string message)
-        {
-            AreEqual(actual, expected, message, null);
-        }
-
-        /// <summary>
-        /// Verifies that two directories are equal.  Two directories are considered
-        /// equal if both are null, or if both have the same value byte for byte.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory containing the value that is expected</param>
-        /// <param name="actual">A directory containing the actual value</param>
-        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual)
-        {
-            AreEqual(actual, expected, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Verifies that two directories are equal.  Two directories are considered
-        /// equal if both are null, or if both have the same value byte for byte.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory path string containing the value that is expected</param>
-        /// <param name="actual">A directory path string containing the actual value</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreEqual(string expected, string actual, string message, params object[] args)
-        {
-            // create a directory info object for the expected path
-            DirectoryInfo diExpected = new DirectoryInfo(expected);
-
-            // create a directory info object for the actual path
-            DirectoryInfo diActual = new DirectoryInfo(actual);
-
-            AreEqual(diExpected, diActual, message, args);
-        }
-
-        /// <summary>
-        /// Verifies that two directories are equal.  Two directories are considered
-        /// equal if both are null, or if both have the same value byte for byte.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory path string containing the value that is expected</param>
-        /// <param name="actual">A directory path string containing the actual value</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void AreEqual(string expected, string actual, string message)
-        {
-            AreEqual(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Verifies that two directories are equal.  Two directories are considered
-        /// equal if both are null, or if both have the same value byte for byte.
-        /// If they are not equal an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory path string containing the value that is expected</param>
-        /// <param name="actual">A directory path string containing the actual value</param>
-        static public void AreEqual(string expected, string actual)
-        {
-            AreEqual(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region AreNotEqual
-
-        /// <summary>
-        /// Asserts that two directories are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory containing the value that is expected</param>
-        /// <param name="actual">A directory containing the actual value</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual, string message, params object[] args)
-        {
-            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that two directories are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory containing the value that is expected</param>
-        /// <param name="actual">A directory containing the actual value</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual, string message)
-        {
-            AreNotEqual(actual, expected, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that two directories are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory containing the value that is expected</param>
-        /// <param name="actual">A directory containing the actual value</param>
-        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual)
-        {
-            AreNotEqual(actual, expected, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Asserts that two directories are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory path string containing the value that is expected</param>
-        /// <param name="actual">A directory path string containing the actual value</param>
-        /// <param name="message">The message to display if directories are equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void AreNotEqual(string expected, string actual, string message, params object[] args)
-        {
-            // create a directory info object for the expected path
-            DirectoryInfo diExpected = new DirectoryInfo(expected);
-
-            // create a directory info object for the actual path
-            DirectoryInfo diActual = new DirectoryInfo(actual);
-
-            AreNotEqual(diExpected, diActual, message, args);
-        }
-
-        /// <summary>
-        /// Asserts that two directories are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory path string containing the value that is expected</param>
-        /// <param name="actual">A directory path string containing the actual value</param>
-        /// <param name="message">The message to display if directories are equal</param>
-        static public void AreNotEqual(string expected, string actual, string message)
-        {
-            AreNotEqual(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that two directories are not equal. If they are equal
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="expected">A directory path string containing the value that is expected</param>
-        /// <param name="actual">A directory path string containing the actual value</param>
-        static public void AreNotEqual(string expected, string actual)
-        {
-            AreNotEqual(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region IsEmpty
-
-        /// <summary>
-        /// Asserts that the directory is empty. If it is not empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsEmpty(DirectoryInfo directory, string message, params object[] args)
-        {
-            Assert.That( directory, new EmptyDirectoryContraint(), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is empty. If it is not empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void IsEmpty(DirectoryInfo directory, string message)
-        {
-            IsEmpty(directory, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is empty. If it is not empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        static public void IsEmpty(DirectoryInfo directory)
-        {
-            IsEmpty(directory, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is empty. If it is not empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsEmpty(string directory, string message, params object[] args)
-        {
-            IsEmpty(new DirectoryInfo(directory), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is empty. If it is not empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void IsEmpty(string directory, string message)
-        {
-            IsEmpty(directory, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is empty. If it is not empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        static public void IsEmpty(string directory)
-        {
-            IsEmpty(directory, string.Empty, null);
-        }
-
-        #endregion
-
-        #region IsNotEmpty
-
-        /// <summary>
-        /// Asserts that the directory is not empty. If it is empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsNotEmpty(DirectoryInfo directory, string message, params object[] args)
-        {
-            Assert.That( directory, new NotConstraint(new EmptyDirectoryContraint()), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is not empty. If it is empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void IsNotEmpty(DirectoryInfo directory, string message)
-        {
-            IsNotEmpty(directory, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is not empty. If it is empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        static public void IsNotEmpty(DirectoryInfo directory)
-        {
-            IsNotEmpty(directory, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is not empty. If it is empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsNotEmpty(string directory, string message, params object[] args)
-        {
-            DirectoryInfo diActual = new DirectoryInfo(directory);
-            IsNotEmpty(diActual, message, args);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is not empty. If it is empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="message">The message to display if directories are not equal</param>
-        static public void IsNotEmpty(string directory, string message)
-        {
-            IsNotEmpty(directory, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that the directory is not empty. If it is empty
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        static public void IsNotEmpty(string directory)
-        {
-            IsNotEmpty(directory, string.Empty, null);
-        }
-
-        #endregion
-
-        #region IsWithin
-
-        /// <summary>
-        /// Asserts that path contains actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        public static void IsWithin(DirectoryInfo directory, DirectoryInfo actual, string message, params object[] args)
-        {
-			if (directory == null)
-                throw new ArgumentException("The directory may not be null", "directory");
-			if (directory == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-			IsWithin(directory.FullName, actual.FullName, message, args);
-        }
-
-        /// <summary>
-        /// Asserts that path contains actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        static public void IsWithin(DirectoryInfo directory, DirectoryInfo actual, string message)
-        {
-			if (directory == null)
-                throw new ArgumentException("The directory may not be null", "directory");
-			if (directory == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-            IsWithin(directory.FullName, actual.FullName, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that path contains actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        static public void IsWithin(DirectoryInfo directory, DirectoryInfo actual)
-        {
-			if (directory == null)
-                throw new ArgumentException("The directory may not be null", "directory");
-			if (directory == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-            IsWithin(directory.FullName, actual.FullName, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Asserts that path contains actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsWithin(string directory, string actual, string message, params object[] args)
-        {
-			Assert.That(actual, new SubPathConstraint(directory), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that path contains actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        static public void IsWithin(string directory, string actual, string message)
-        {
-            IsWithin(directory, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that path contains actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        static public void IsWithin(string directory, string actual)
-        {
-            IsWithin(directory, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region IsNotWithin
-
-        /// <summary>
-        /// Asserts that path does not contain actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual, string message, params object[] args)
-        {
-			if (directory == null)
-                throw new ArgumentException("The directory may not be null", "directory");
-			if (directory == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-			IsNotWithin(directory.FullName, actual.FullName, message, args);
-        }
-
-        /// <summary>
-        /// Asserts that path does not contain actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual, string message)
-        {
-			if (directory == null)
-                throw new ArgumentException("The directory may not be null", "directory");
-			if (directory == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-            IsNotWithin(directory.FullName, actual.FullName, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that path does not contain actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual)
-        {
-			if (directory == null)
-                throw new ArgumentException("The directory may not be null", "directory");
-			if (directory == null)
-                throw new ArgumentException("The actual value may not be null", "actual");
-
-            IsNotWithin(directory.FullName, actual.FullName, string.Empty, null);
-        }
-
-        /// <summary>
-        /// Asserts that path does not contain actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        /// <param name="args">Arguments to be used in formatting the message</param>
-        static public void IsNotWithin(string directory, string actual, string message, params object[] args)
-        {
-			Assert.That(actual, new NotConstraint(new SubPathConstraint(directory)), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that path does not contain actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        /// <param name="message">The message to display if directory is not within the path</param>
-        static public void IsNotWithin(string directory, string actual, string message)
-        {
-            IsNotWithin(directory, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that path does not contain actual as a subdirectory or
-        /// an <see cref="AssertionException"/> is thrown.
-        /// </summary>
-        /// <param name="directory">A directory to search</param>
-        /// <param name="actual">sub-directory asserted to exist under directory</param>
-        static public void IsNotWithin(string directory, string actual)
-        {
-            IsNotWithin(directory, actual, string.Empty, null);
-        }
-
-        #endregion
-    }
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.IO;
+using System.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Summary description for DirectoryAssert
+    /// </summary>
+    [Obsolete("Use Assert with constraint-based syntax")]
+    public class DirectoryAssert
+    {
+        #region Equals and ReferenceEquals
+
+        /// <summary>
+        /// The Equals method throws an AssertionException. This is done 
+        /// to make sure there is no mistake by calling this function.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static new bool Equals(object a, object b)
+        {
+            throw new AssertionException("Assert.Equals should not be used for Assertions");
+        }
+
+        /// <summary>
+        /// override the default ReferenceEquals to throw an AssertionException. This 
+        /// implementation makes sure there is no mistake in calling this function 
+        /// as part of Assert. 
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        public static new void ReferenceEquals(object a, object b)
+        {
+            throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+        }
+
+        #endregion
+
+        #region Constructor
+
+        /// <summary>
+        /// We don't actually want any instances of this object, but some people
+        /// like to inherit from it to add other static methods. Hence, the
+        /// protected constructor disallows any instances of this object. 
+        /// </summary>
+        protected DirectoryAssert() { }
+
+        #endregion
+
+        #region AreEqual
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual, string message, params object[] args)
+        {
+            Assert.That(actual, new EqualConstraint(expected), message, args);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual, string message)
+        {
+            AreEqual(actual, expected, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        static public void AreEqual(DirectoryInfo expected, DirectoryInfo actual)
+        {
+            AreEqual(actual, expected, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreEqual(string expected, string actual, string message, params object[] args)
+        {
+            // create a directory info object for the expected path
+            DirectoryInfo diExpected = new DirectoryInfo(expected);
+
+            // create a directory info object for the actual path
+            DirectoryInfo diActual = new DirectoryInfo(actual);
+
+            AreEqual(diExpected, diActual, message, args);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void AreEqual(string expected, string actual, string message)
+        {
+            AreEqual(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Verifies that two directories are equal.  Two directories are considered
+        /// equal if both are null, or if both have the same value byte for byte.
+        /// If they are not equal an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        static public void AreEqual(string expected, string actual)
+        {
+            AreEqual(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region AreNotEqual
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint(new EqualConstraint(expected)), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual, string message)
+        {
+            AreNotEqual(actual, expected, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory containing the value that is expected</param>
+        /// <param name="actual">A directory containing the actual value</param>
+        static public void AreNotEqual(DirectoryInfo expected, DirectoryInfo actual)
+        {
+            AreNotEqual(actual, expected, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void AreNotEqual(string expected, string actual, string message, params object[] args)
+        {
+            // create a directory info object for the expected path
+            DirectoryInfo diExpected = new DirectoryInfo(expected);
+
+            // create a directory info object for the actual path
+            DirectoryInfo diActual = new DirectoryInfo(actual);
+
+            AreNotEqual(diExpected, diActual, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        /// <param name="message">The message to display if directories are equal</param>
+        static public void AreNotEqual(string expected, string actual, string message)
+        {
+            AreNotEqual(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that two directories are not equal. If they are equal
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="expected">A directory path string containing the value that is expected</param>
+        /// <param name="actual">A directory path string containing the actual value</param>
+        static public void AreNotEqual(string expected, string actual)
+        {
+            AreNotEqual(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsEmpty
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsEmpty(DirectoryInfo directory, string message, params object[] args)
+        {
+            Assert.That( directory, new EmptyDirectoryConstraint(), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsEmpty(DirectoryInfo directory, string message)
+        {
+            IsEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsEmpty(DirectoryInfo directory)
+        {
+            IsEmpty(directory, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsEmpty(string directory, string message, params object[] args)
+        {
+            IsEmpty(new DirectoryInfo(directory), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsEmpty(string directory, string message)
+        {
+            IsEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is empty. If it is not empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsEmpty(string directory)
+        {
+            IsEmpty(directory, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsNotEmpty
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotEmpty(DirectoryInfo directory, string message, params object[] args)
+        {
+            Assert.That( directory, new NotConstraint(new EmptyDirectoryConstraint()), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsNotEmpty(DirectoryInfo directory, string message)
+        {
+            IsNotEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsNotEmpty(DirectoryInfo directory)
+        {
+            IsNotEmpty(directory, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotEmpty(string directory, string message, params object[] args)
+        {
+            DirectoryInfo diActual = new DirectoryInfo(directory);
+            IsNotEmpty(diActual, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="message">The message to display if directories are not equal</param>
+        static public void IsNotEmpty(string directory, string message)
+        {
+            IsNotEmpty(directory, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that the directory is not empty. If it is empty
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        static public void IsNotEmpty(string directory)
+        {
+            IsNotEmpty(directory, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsWithin
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        public static void IsWithin(DirectoryInfo directory, DirectoryInfo actual, string message, params object[] args)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+			IsWithin(directory.FullName, actual.FullName, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsWithin(DirectoryInfo directory, DirectoryInfo actual, string message)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsWithin(directory.FullName, actual.FullName, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsWithin(DirectoryInfo directory, DirectoryInfo actual)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsWithin(directory.FullName, actual.FullName, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsWithin(string directory, string actual, string message, params object[] args)
+        {
+			Assert.That(actual, new SubPathConstraint(directory), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsWithin(string directory, string actual, string message)
+        {
+            IsWithin(directory, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path contains actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsWithin(string directory, string actual)
+        {
+            IsWithin(directory, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region IsNotWithin
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual, string message, params object[] args)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+			IsNotWithin(directory.FullName, actual.FullName, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual, string message)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsNotWithin(directory.FullName, actual.FullName, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsNotWithin(DirectoryInfo directory, DirectoryInfo actual)
+        {
+			if (directory == null)
+                throw new ArgumentException("The directory may not be null", "directory");
+			if (directory == null)
+                throw new ArgumentException("The actual value may not be null", "actual");
+
+            IsNotWithin(directory.FullName, actual.FullName, string.Empty, null);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        /// <param name="args">Arguments to be used in formatting the message</param>
+        static public void IsNotWithin(string directory, string actual, string message, params object[] args)
+        {
+			Assert.That(actual, new NotConstraint(new SubPathConstraint(directory)), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        /// <param name="message">The message to display if directory is not within the path</param>
+        static public void IsNotWithin(string directory, string actual, string message)
+        {
+            IsNotWithin(directory, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that path does not contain actual as a subdirectory or
+        /// an <see cref="AssertionException"/> is thrown.
+        /// </summary>
+        /// <param name="directory">A directory to search</param>
+        /// <param name="actual">sub-directory asserted to exist under directory</param>
+        static public void IsNotWithin(string directory, string actual)
+        {
+            IsNotWithin(directory, actual, string.Empty, null);
+        }
+
+        #endregion
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/Exceptions/AssertionException.cs b/src/NUnitFramework/framework/Exceptions/AssertionException.cs
index 0c0c6e3..8f00e81 100644
--- a/src/NUnitFramework/framework/Exceptions/AssertionException.cs
+++ b/src/NUnitFramework/framework/Exceptions/AssertionException.cs
@@ -1,40 +1,38 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework 
-{
-	using System;
-	using System.Runtime.Serialization;
-	
-	/// <summary>
-	/// Thrown when an assertion failed.
-	/// </summary>
-	/// 
-	[Serializable]
-	public class AssertionException : System.Exception
-	{
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		public AssertionException (string message) : base(message) 
-		{}
-
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		/// <param name="inner">The exception that caused the 
-		/// current exception</param>
-		public AssertionException(string message, Exception inner) :
-			base(message, inner) 
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected AssertionException(SerializationInfo info, 
-			StreamingContext context) : base(info,context)
-		{}
-
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework 
+{
+	using System;
+	
+	/// <summary>
+	/// Thrown when an assertion failed.
+	/// </summary>
+	[Serializable]
+	public class AssertionException : System.Exception
+	{
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		public AssertionException (string message) : base(message) 
+		{}
+
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		/// <param name="inner">The exception that caused the 
+		/// current exception</param>
+		public AssertionException(string message, Exception inner) :
+			base(message, inner) 
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+		protected AssertionException(System.Runtime.Serialization.SerializationInfo info, 
+			System.Runtime.Serialization.StreamingContext context) : base(info,context)
+		{}
+
+	}
+}
diff --git a/src/NUnitFramework/framework/Exceptions/IgnoreException.cs b/src/NUnitFramework/framework/Exceptions/IgnoreException.cs
index 956733e..33adb15 100644
--- a/src/NUnitFramework/framework/Exceptions/IgnoreException.cs
+++ b/src/NUnitFramework/framework/Exceptions/IgnoreException.cs
@@ -1,38 +1,37 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework 
-{
-	using System;
-	using System.Runtime.Serialization;
-	
-	/// <summary>
-	/// Thrown when an assertion failed.
-	/// </summary>
-	[Serializable]
-	public class IgnoreException : System.Exception
-	{
-		/// <param name="message"></param>
-		public IgnoreException (string message) : base(message) 
-		{}
-
-		/// <param name="message">The error message that explains 
-		/// the reason for the exception</param>
-		/// <param name="inner">The exception that caused the 
-		/// current exception</param>
-		public IgnoreException(string message, Exception inner) :
-			base(message, inner) 
-		{}
-
-		/// <summary>
-		/// Serialization Constructor
-		/// </summary>
-		protected IgnoreException(SerializationInfo info, 
-			StreamingContext context) : base(info,context)
-		{}
-
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework 
+{
+	using System;
+	
+	/// <summary>
+	/// Thrown when an assertion failed.
+	/// </summary>
+	[Serializable]
+	public class IgnoreException : System.Exception
+	{
+		/// <param name="message"></param>
+		public IgnoreException (string message) : base(message) 
+		{}
+
+		/// <param name="message">The error message that explains 
+		/// the reason for the exception</param>
+		/// <param name="inner">The exception that caused the 
+		/// current exception</param>
+		public IgnoreException(string message, Exception inner) :
+			base(message, inner) 
+		{}
+
+		/// <summary>
+		/// Serialization Constructor
+		/// </summary>
+        protected IgnoreException(System.Runtime.Serialization.SerializationInfo info,
+            System.Runtime.Serialization.StreamingContext context) : base(info, context)
+		{}
+
+	}
+}
diff --git a/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs b/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs
index 0c108e5..ff0b1aa 100644
--- a/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs
+++ b/src/NUnitFramework/framework/Exceptions/InconclusiveException.cs
@@ -1,43 +1,40 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-    using System;
-    using System.Runtime.Serialization;
-
-    /// <summary>
-    /// Thrown when a test executes inconclusively.
-    /// </summary>
-    /// 
-    [Serializable]
-    public class InconclusiveException : System.Exception
-    {
-        /// <param name="message">The error message that explains 
-        /// the reason for the exception</param>
-        public InconclusiveException(string message)
-            : base(message)
-        { }
-
-        /// <param name="message">The error message that explains 
-        /// the reason for the exception</param>
-        /// <param name="inner">The exception that caused the 
-        /// current exception</param>
-        public InconclusiveException(string message, Exception inner)
-            :
-            base(message, inner)
-        { }
-
-        /// <summary>
-        /// Serialization Constructor
-        /// </summary>
-        protected InconclusiveException(SerializationInfo info,
-            StreamingContext context)
-            : base(info, context)
-        { }
-
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+    using System;
+
+    /// <summary>
+    /// Thrown when a test executes inconclusively.
+    /// </summary>
+    [Serializable]
+    public class InconclusiveException : System.Exception
+    {
+        /// <param name="message">The error message that explains 
+        /// the reason for the exception</param>
+        public InconclusiveException(string message)
+            : base(message)
+        { }
+
+        /// <param name="message">The error message that explains 
+        /// the reason for the exception</param>
+        /// <param name="inner">The exception that caused the 
+        /// current exception</param>
+        public InconclusiveException(string message, Exception inner)
+            :
+            base(message, inner)
+        { }
+
+        /// <summary>
+        /// Serialization Constructor
+        /// </summary>
+        protected InconclusiveException(System.Runtime.Serialization.SerializationInfo info,
+            System.Runtime.Serialization.StreamingContext context) : base(info, context)
+        { }
+
+    }
+}
diff --git a/src/NUnitFramework/framework/Exceptions/SuccessException.cs b/src/NUnitFramework/framework/Exceptions/SuccessException.cs
index ee3397b..7cad3f9 100644
--- a/src/NUnitFramework/framework/Exceptions/SuccessException.cs
+++ b/src/NUnitFramework/framework/Exceptions/SuccessException.cs
@@ -1,41 +1,39 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework
-{
-    using System;
-    using System.Runtime.Serialization;
-
-    /// <summary>
-    /// Thrown when an assertion failed.
-    /// </summary>
-    [Serializable]
-    public class SuccessException : System.Exception
-    {
-        /// <param name="message"></param>
-        public SuccessException(string message)
-            : base(message)
-        { }
-
-        /// <param name="message">The error message that explains 
-        /// the reason for the exception</param>
-        /// <param name="inner">The exception that caused the 
-        /// current exception</param>
-        public SuccessException(string message, Exception inner)
-            :
-            base(message, inner)
-        { }
-
-        /// <summary>
-        /// Serialization Constructor
-        /// </summary>
-        protected SuccessException(SerializationInfo info,
-            StreamingContext context)
-            : base(info, context)
-        { }
-
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework
+{
+    using System;
+
+    /// <summary>
+    /// Thrown when an assertion failed.
+    /// </summary>
+    [Serializable]
+    public class SuccessException : System.Exception
+    {
+        /// <param name="message"></param>
+        public SuccessException(string message)
+            : base(message)
+        { }
+
+        /// <param name="message">The error message that explains 
+        /// the reason for the exception</param>
+        /// <param name="inner">The exception that caused the 
+        /// current exception</param>
+        public SuccessException(string message, Exception inner)
+            :
+            base(message, inner)
+        { }
+
+        /// <summary>
+        /// Serialization Constructor
+        /// </summary>
+        protected SuccessException(System.Runtime.Serialization.SerializationInfo info,
+            System.Runtime.Serialization.StreamingContext context) : base(info, context)
+        { }
+
+    }
+}
diff --git a/src/NUnitFramework/framework/FileAssert.cs b/src/NUnitFramework/framework/FileAssert.cs
index 42e9bf2..35e1bfc 100644
--- a/src/NUnitFramework/framework/FileAssert.cs
+++ b/src/NUnitFramework/framework/FileAssert.cs
@@ -1,333 +1,333 @@
-// ****************************************************************
-// 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.ComponentModel;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Summary description for FileAssert.
-	/// </summary>
-	public class FileAssert
-	{
-		#region Equals and ReferenceEquals
-
-		/// <summary>
-		/// The Equals method throws an AssertionException. This is done 
-		/// to make sure there is no mistake by calling this function.
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		[EditorBrowsable(EditorBrowsableState.Never)]
-		public static new bool Equals(object a, object b)
-		{
-			throw new AssertionException("Assert.Equals should not be used for Assertions");
-		}
-
-		/// <summary>
-		/// override the default ReferenceEquals to throw an AssertionException. This 
-		/// implementation makes sure there is no mistake in calling this function 
-		/// as part of Assert. 
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		public static new void ReferenceEquals(object a, object b)
-		{
-			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
-		}
-
-		#endregion
-				
-		#region Constructor
-
-		/// <summary>
-		/// We don't actually want any instances of this object, but some people
-		/// like to inherit from it to add other static methods. Hence, the
-		/// protected constructor disallows any instances of this object. 
-		/// </summary>
-		protected FileAssert() {}
-
-		#endregion
-
-		#region AreEqual
-
-		#region Streams
-		
-		/// <summary>
-		/// Verifies that two Streams are equal.  Two Streams are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected Stream</param>
-		/// <param name="actual">The actual Stream</param>
-		/// <param name="message">The message to display if Streams are not equal</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(Stream expected, Stream actual, string message, params object[] args)
-		{
-			Assert.That( actual, new EqualConstraint( expected ), message, args );
-		}
-
-		/// <summary>
-		/// Verifies that two Streams are equal.  Two Streams are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected Stream</param>
-		/// <param name="actual">The actual Stream</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		static public void AreEqual(Stream expected, Stream actual, string message) 
-		{
-			AreEqual(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that two Streams are equal.  Two Streams are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected Stream</param>
-		/// <param name="actual">The actual Stream</param>
-		static public void AreEqual(Stream expected, Stream actual) 
-		{
-			AreEqual(expected, actual, string.Empty, null);
-		}
-
-		#endregion
-
-		#region FileInfo
-		/// <summary>
-		/// Verifies that two files are equal.  Two files are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">A file containing the value that is expected</param>
-		/// <param name="actual">A file containing the actual value</param>
-		/// <param name="message">The message to display if Streams are not equal</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(FileInfo expected, FileInfo actual, string message, params object[] args)
-		{
-			using (FileStream exStream = expected.OpenRead())
-			{
-				using (FileStream acStream = actual.OpenRead())
-				{
-					AreEqual(exStream,acStream,message,args);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Verifies that two files are equal.  Two files are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">A file containing the value that is expected</param>
-		/// <param name="actual">A file containing the actual value</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		static public void AreEqual(FileInfo expected, FileInfo actual, string message) 
-		{
-			AreEqual(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that two files are equal.  Two files are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">A file containing the value that is expected</param>
-		/// <param name="actual">A file containing the actual value</param>
-		static public void AreEqual(FileInfo expected, FileInfo actual) 
-		{
-			AreEqual(expected, actual, string.Empty, null);
-		}
-
-		#endregion
-
-		#region String
-		/// <summary>
-		/// Verifies that two files are equal.  Two files are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The path to a file containing the value that is expected</param>
-		/// <param name="actual">The path to a file containing the actual value</param>
-		/// <param name="message">The message to display if Streams are not equal</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreEqual(string expected, string actual, string message, params object[] args)
-		{
-			using (FileStream exStream = File.OpenRead(expected))
-			{
-				using (FileStream acStream = File.OpenRead(actual))
-				{
-					AreEqual(exStream,acStream,message,args);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Verifies that two files are equal.  Two files are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The path to a file containing the value that is expected</param>
-		/// <param name="actual">The path to a file containing the actual value</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		static public void AreEqual(string expected, string actual, string message) 
-		{
-			AreEqual(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Verifies that two files are equal.  Two files are considered
-		/// equal if both are null, or if both have the same value byte for byte.
-		/// If they are not equal an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The path to a file containing the value that is expected</param>
-		/// <param name="actual">The path to a file containing the actual value</param>
-		static public void AreEqual(string expected, string actual) 
-		{
-			AreEqual(expected, actual, string.Empty, null);
-		}
-
-		#endregion
-
-		#endregion
-
-		#region AreNotEqual
-
-		#region Streams
-		/// <summary>
-		/// Asserts that two Streams are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected Stream</param>
-		/// <param name="actual">The actual Stream</param>
-		/// <param name="message">The message to be displayed when the two Stream are the same.</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual( Stream expected, Stream actual, string message, params object[] args)
-		{
-			Assert.That( actual, new NotConstraint( new EqualConstraint( expected ) ), message, args );
-		}
-
-		/// <summary>
-		/// Asserts that two Streams are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected Stream</param>
-		/// <param name="actual">The actual Stream</param>
-		/// <param name="message">The message to be displayed when the Streams are the same.</param>
-		static public void AreNotEqual(Stream expected, Stream actual, string message) 
-		{
-			AreNotEqual(expected, actual, message, null);
-		}
-   
-		/// <summary>
-		/// Asserts that two Streams are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The expected Stream</param>
-		/// <param name="actual">The actual Stream</param>
-		static public void AreNotEqual(Stream expected, Stream actual) 
-		{
-			AreNotEqual(expected, actual, string.Empty, null);
-		}
-		#endregion
-		
-		#region FileInfo
-		/// <summary>
-		/// Asserts that two files are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">A file containing the value that is expected</param>
-		/// <param name="actual">A file containing the actual value</param>
-		/// <param name="message">The message to display if Streams are not equal</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual(FileInfo expected, FileInfo actual, string message, params object[] args)
-		{
-			using (FileStream exStream = expected.OpenRead())
-			{
-				using (FileStream acStream = actual.OpenRead())
-				{
-					AreNotEqual(exStream,acStream,message,args);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Asserts that two files are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">A file containing the value that is expected</param>
-		/// <param name="actual">A file containing the actual value</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		static public void AreNotEqual(FileInfo expected, FileInfo actual, string message) 
-		{
-			AreNotEqual(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that two files are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">A file containing the value that is expected</param>
-		/// <param name="actual">A file containing the actual value</param>
-		static public void AreNotEqual(FileInfo expected, FileInfo actual) 
-		{
-			AreNotEqual(expected, actual, string.Empty, null);
-		}
-
-		#endregion
-		
-		#region String
-		/// <summary>
-		/// Asserts that two files are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The path to a file containing the value that is expected</param>
-		/// <param name="actual">The path to a file containing the actual value</param>
-		/// <param name="message">The message to display if Streams are not equal</param>
-		/// <param name="args">Arguments to be used in formatting the message</param>
-		static public void AreNotEqual(string expected, string actual, string message, params object[] args)
-		{
-			using (FileStream exStream = File.OpenRead(expected))
-			{
-				using (FileStream acStream = File.OpenRead(actual))
-				{
-					AreNotEqual(exStream,acStream,message,args);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Asserts that two files are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The path to a file containing the value that is expected</param>
-		/// <param name="actual">The path to a file containing the actual value</param>
-		/// <param name="message">The message to display if objects are not equal</param>
-		static public void AreNotEqual(string expected, string actual, string message) 
-		{
-			AreNotEqual(expected, actual, message, null);
-		}
-
-		/// <summary>
-		/// Asserts that two files are not equal. If they are equal
-		/// an <see cref="AssertionException"/> is thrown.
-		/// </summary>
-		/// <param name="expected">The path to a file containing the value that is expected</param>
-		/// <param name="actual">The path to a file containing the actual value</param>
-		static public void AreNotEqual(string expected, string actual) 
-		{
-			AreNotEqual(expected, actual, string.Empty, null);
-		}
-
-		#endregion
-
-		#endregion
-	}
-}
+// ****************************************************************
+// 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.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Summary description for FileAssert.
+	/// </summary>
+	public class FileAssert
+	{
+		#region Equals and ReferenceEquals
+
+		/// <summary>
+		/// The Equals method throws an AssertionException. This is done 
+		/// to make sure there is no mistake by calling this function.
+		/// </summary>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		[EditorBrowsable(EditorBrowsableState.Never)]
+		public static new bool Equals(object a, object b)
+		{
+			throw new AssertionException("Assert.Equals should not be used for Assertions");
+		}
+
+		/// <summary>
+		/// override the default ReferenceEquals to throw an AssertionException. This 
+		/// implementation makes sure there is no mistake in calling this function 
+		/// as part of Assert. 
+		/// </summary>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		public static new void ReferenceEquals(object a, object b)
+		{
+			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+		}
+
+		#endregion
+				
+		#region Constructor
+
+		/// <summary>
+		/// We don't actually want any instances of this object, but some people
+		/// like to inherit from it to add other static methods. Hence, the
+		/// protected constructor disallows any instances of this object. 
+		/// </summary>
+		protected FileAssert() {}
+
+		#endregion
+
+		#region AreEqual
+
+		#region Streams
+		
+		/// <summary>
+		/// Verifies that two Streams are equal.  Two Streams are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The expected Stream</param>
+		/// <param name="actual">The actual Stream</param>
+		/// <param name="message">The message to display if Streams are not equal</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void AreEqual(Stream expected, Stream actual, string message, params object[] args)
+		{
+			Assert.That( actual, new EqualConstraint( expected ), message, args );
+		}
+
+		/// <summary>
+		/// Verifies that two Streams are equal.  Two Streams are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The expected Stream</param>
+		/// <param name="actual">The actual Stream</param>
+		/// <param name="message">The message to display if objects are not equal</param>
+		static public void AreEqual(Stream expected, Stream actual, string message) 
+		{
+			AreEqual(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Verifies that two Streams are equal.  Two Streams are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The expected Stream</param>
+		/// <param name="actual">The actual Stream</param>
+		static public void AreEqual(Stream expected, Stream actual) 
+		{
+			AreEqual(expected, actual, string.Empty, null);
+		}
+
+		#endregion
+
+		#region FileInfo
+		/// <summary>
+		/// Verifies that two files are equal.  Two files are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">A file containing the value that is expected</param>
+		/// <param name="actual">A file containing the actual value</param>
+		/// <param name="message">The message to display if Streams are not equal</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void AreEqual(FileInfo expected, FileInfo actual, string message, params object[] args)
+		{
+			using (FileStream exStream = expected.OpenRead())
+			{
+				using (FileStream acStream = actual.OpenRead())
+				{
+					AreEqual(exStream,acStream,message,args);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Verifies that two files are equal.  Two files are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">A file containing the value that is expected</param>
+		/// <param name="actual">A file containing the actual value</param>
+		/// <param name="message">The message to display if objects are not equal</param>
+		static public void AreEqual(FileInfo expected, FileInfo actual, string message) 
+		{
+			AreEqual(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Verifies that two files are equal.  Two files are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">A file containing the value that is expected</param>
+		/// <param name="actual">A file containing the actual value</param>
+		static public void AreEqual(FileInfo expected, FileInfo actual) 
+		{
+			AreEqual(expected, actual, string.Empty, null);
+		}
+
+		#endregion
+
+		#region String
+		/// <summary>
+		/// Verifies that two files are equal.  Two files are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The path to a file containing the value that is expected</param>
+		/// <param name="actual">The path to a file containing the actual value</param>
+		/// <param name="message">The message to display if Streams are not equal</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void AreEqual(string expected, string actual, string message, params object[] args)
+		{
+			using (FileStream exStream = File.OpenRead(expected))
+			{
+				using (FileStream acStream = File.OpenRead(actual))
+				{
+					AreEqual(exStream,acStream,message,args);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Verifies that two files are equal.  Two files are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The path to a file containing the value that is expected</param>
+		/// <param name="actual">The path to a file containing the actual value</param>
+		/// <param name="message">The message to display if objects are not equal</param>
+		static public void AreEqual(string expected, string actual, string message) 
+		{
+			AreEqual(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Verifies that two files are equal.  Two files are considered
+		/// equal if both are null, or if both have the same value byte for byte.
+		/// If they are not equal an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The path to a file containing the value that is expected</param>
+		/// <param name="actual">The path to a file containing the actual value</param>
+		static public void AreEqual(string expected, string actual) 
+		{
+			AreEqual(expected, actual, string.Empty, null);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region AreNotEqual
+
+		#region Streams
+		/// <summary>
+		/// Asserts that two Streams are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The expected Stream</param>
+		/// <param name="actual">The actual Stream</param>
+		/// <param name="message">The message to be displayed when the two Stream are the same.</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void AreNotEqual( Stream expected, Stream actual, string message, params object[] args)
+		{
+			Assert.That( actual, new NotConstraint( new EqualConstraint( expected ) ), message, args );
+		}
+
+		/// <summary>
+		/// Asserts that two Streams are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The expected Stream</param>
+		/// <param name="actual">The actual Stream</param>
+		/// <param name="message">The message to be displayed when the Streams are the same.</param>
+		static public void AreNotEqual(Stream expected, Stream actual, string message) 
+		{
+			AreNotEqual(expected, actual, message, null);
+		}
+   
+		/// <summary>
+		/// Asserts that two Streams are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The expected Stream</param>
+		/// <param name="actual">The actual Stream</param>
+		static public void AreNotEqual(Stream expected, Stream actual) 
+		{
+			AreNotEqual(expected, actual, string.Empty, null);
+		}
+		#endregion
+		
+		#region FileInfo
+		/// <summary>
+		/// Asserts that two files are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">A file containing the value that is expected</param>
+		/// <param name="actual">A file containing the actual value</param>
+		/// <param name="message">The message to display if Streams are not equal</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void AreNotEqual(FileInfo expected, FileInfo actual, string message, params object[] args)
+		{
+			using (FileStream exStream = expected.OpenRead())
+			{
+				using (FileStream acStream = actual.OpenRead())
+				{
+					AreNotEqual(exStream,acStream,message,args);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Asserts that two files are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">A file containing the value that is expected</param>
+		/// <param name="actual">A file containing the actual value</param>
+		/// <param name="message">The message to display if objects are not equal</param>
+		static public void AreNotEqual(FileInfo expected, FileInfo actual, string message) 
+		{
+			AreNotEqual(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that two files are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">A file containing the value that is expected</param>
+		/// <param name="actual">A file containing the actual value</param>
+		static public void AreNotEqual(FileInfo expected, FileInfo actual) 
+		{
+			AreNotEqual(expected, actual, string.Empty, null);
+		}
+
+		#endregion
+		
+		#region String
+		/// <summary>
+		/// Asserts that two files are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The path to a file containing the value that is expected</param>
+		/// <param name="actual">The path to a file containing the actual value</param>
+		/// <param name="message">The message to display if Streams are not equal</param>
+		/// <param name="args">Arguments to be used in formatting the message</param>
+		static public void AreNotEqual(string expected, string actual, string message, params object[] args)
+		{
+			using (FileStream exStream = File.OpenRead(expected))
+			{
+				using (FileStream acStream = File.OpenRead(actual))
+				{
+					AreNotEqual(exStream,acStream,message,args);
+				}
+			}
+		}
+
+		/// <summary>
+		/// Asserts that two files are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The path to a file containing the value that is expected</param>
+		/// <param name="actual">The path to a file containing the actual value</param>
+		/// <param name="message">The message to display if objects are not equal</param>
+		static public void AreNotEqual(string expected, string actual, string message) 
+		{
+			AreNotEqual(expected, actual, message, null);
+		}
+
+		/// <summary>
+		/// Asserts that two files are not equal. If they are equal
+		/// an <see cref="AssertionException"/> is thrown.
+		/// </summary>
+		/// <param name="expected">The path to a file containing the value that is expected</param>
+		/// <param name="actual">The path to a file containing the actual value</param>
+		static public void AreNotEqual(string expected, string actual) 
+		{
+			AreNotEqual(expected, actual, string.Empty, null);
+		}
+
+		#endregion
+
+		#endregion
+	}
+}
diff --git a/src/NUnitFramework/framework/GlobalSettings.cs b/src/NUnitFramework/framework/GlobalSettings.cs
index 17a040d..56bf05b 100644
--- a/src/NUnitFramework/framework/GlobalSettings.cs
+++ b/src/NUnitFramework/framework/GlobalSettings.cs
@@ -1,22 +1,22 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// GlobalSettings is a place for setting default values used
-	/// by the framework in performing asserts.
-	/// </summary>
-	public class GlobalSettings
-	{
-		/// <summary>
-		/// Default tolerance for floating point equality
-		/// </summary>
-		public static double DefaultFloatingPointTolerance = 0.0d;
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// GlobalSettings is a place for setting default values used
+	/// by the framework in performing asserts.
+	/// </summary>
+	public class GlobalSettings
+	{
+		/// <summary>
+		/// Default tolerance for floating point equality
+		/// </summary>
+		public static double DefaultFloatingPointTolerance = 0.0d;
+	}
+}
diff --git a/src/NUnitFramework/framework/Guard.cs b/src/NUnitFramework/framework/Guard.cs
new file mode 100644
index 0000000..2528583
--- /dev/null
+++ b/src/NUnitFramework/framework/Guard.cs
@@ -0,0 +1,35 @@
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Class used to guard against unexpected argument values
+    /// by throwing an appropriate exception.
+    /// </summary>
+    public class Guard
+    {
+        /// <summary>
+        /// Throws an exception if an argument is null
+        /// </summary>
+        /// <param name="value">The value to be tested</param>
+        /// <param name="name">The name of the argument</param>
+        public static void ArgumentNotNull(object value, string name)
+        {
+            if (value == null)
+                throw new ArgumentNullException("Argument " + name + " must not be null", name);
+        }
+
+        /// <summary>
+        /// Throws an exception if a string argument is null or empty
+        /// </summary>
+        /// <param name="value">The value to be tested</param>
+        /// <param name="name">The name of the argument</param>
+        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);
+        }
+    }
+}
diff --git a/src/NUnitFramework/framework/Has.cs b/src/NUnitFramework/framework/Has.cs
index 650835d..8d55745 100644
--- a/src/NUnitFramework/framework/Has.cs
+++ b/src/NUnitFramework/framework/Has.cs
@@ -1,192 +1,192 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Helper class with properties and methods that supply
-    /// a number of constraints used in Asserts.
-    /// </summary>
-    public class Has
-    {
-        #region No
-
-        /// <summary>
-        /// Returns a ConstraintExpression that negates any
-        /// following constraint.
-        /// </summary>
-        public static ConstraintExpression No
-        {
-            get { return new ConstraintExpression().Not; }
-        }
-
-        #endregion
-
-        #region All
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them succeed.
-        /// </summary>
-        public static ConstraintExpression All
-        {
-            get { return new ConstraintExpression().All; }
-        }
-
-        #endregion
-
-        #region Some
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if at least one of them succeeds.
-        /// </summary>
-        public static ConstraintExpression Some
-        {
-            get { return new ConstraintExpression().Some; }
-        }
-
-        #endregion
-
-        #region None
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them fail.
-        /// </summary>
-        public static ConstraintExpression None
-        {
-            get { return new ConstraintExpression().None; }
-        }
-
-        #endregion
-
-        #region 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
-        /// being tested or apply any following constraint to that property.
-        /// </summary>
-        public static ResolvableConstraintExpression Property(string name)
-        {
-            return new ConstraintExpression().Property(name);
-        }
-
-        #endregion
-
-        #region Length
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Length property of the object being tested.
-        /// </summary>
-        public static ResolvableConstraintExpression Length
-        {
-            get { return Property("Length"); }
-        }
-
-        #endregion
-
-        #region Count
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Count property of the object being tested.
-        /// </summary>
-        public static ResolvableConstraintExpression Count
-        {
-            get { return Property("Count"); }
-        }
-
-        #endregion
-
-        #region Message
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the Message property of the object being tested.
-        /// </summary>
-        public static ResolvableConstraintExpression Message
-        {
-            get { return Property("Message"); }
-        }
-
-        #endregion
-
-        #region InnerException
-
-        /// <summary>
-        /// Returns a new ConstraintExpression, which will apply the following
-        /// constraint to the InnerException property of the object being tested.
-        /// </summary>
-        public static ResolvableConstraintExpression InnerException
-        {
-            get { return Property("InnerException"); }
-        }
-
-        #endregion
-
-        #region Attribute
-
-        /// <summary>
-        /// Returns a new AttributeConstraint checking for the
-        /// presence of a particular attribute on an object.
-        /// </summary>
-        public static ResolvableConstraintExpression Attribute(Type expectedType)
-        {
-            return new ConstraintExpression().Attribute(expectedType);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Returns a new AttributeConstraint checking for the
-        /// presence of a particular attribute on an object.
-        /// </summary>
-        public static ResolvableConstraintExpression Attribute<T>()
-        {
-            return Attribute(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region Member
-
-        /// <summary>
-        /// Returns a new CollectionContainsConstraint checking for the
-        /// presence of a particular object in the collection.
-        /// </summary>
-        public static CollectionContainsConstraint Member(object expected)
-        {
-            return new CollectionContainsConstraint(expected);
-        }
-
-        #endregion
-
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class Has
+    {
+        #region No
+
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public static ConstraintExpression No
+        {
+            get { return new ConstraintExpression().Not; }
+        }
+
+        #endregion
+
+        #region All
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public static ConstraintExpression All
+        {
+            get { return new ConstraintExpression().All; }
+        }
+
+        #endregion
+
+        #region Some
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if at least one of them succeeds.
+        /// </summary>
+        public static ConstraintExpression Some
+        {
+            get { return new ConstraintExpression().Some; }
+        }
+
+        #endregion
+
+        #region None
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them fail.
+        /// </summary>
+        public static ConstraintExpression None
+        {
+            get { return new ConstraintExpression().None; }
+        }
+
+        #endregion
+
+        #region 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
+        /// being tested or apply any following constraint to that property.
+        /// </summary>
+        public static ResolvableConstraintExpression Property(string name)
+        {
+            return new ConstraintExpression().Property(name);
+        }
+
+        #endregion
+
+        #region Length
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Length property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression Length
+        {
+            get { return Property("Length"); }
+        }
+
+        #endregion
+
+        #region Count
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Count property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression Count
+        {
+            get { return Property("Count"); }
+        }
+
+        #endregion
+
+        #region Message
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the Message property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression Message
+        {
+            get { return Property("Message"); }
+        }
+
+        #endregion
+
+        #region InnerException
+
+        /// <summary>
+        /// Returns a new ConstraintExpression, which will apply the following
+        /// constraint to the InnerException property of the object being tested.
+        /// </summary>
+        public static ResolvableConstraintExpression InnerException
+        {
+            get { return Property("InnerException"); }
+        }
+
+        #endregion
+
+        #region Attribute
+
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public static ResolvableConstraintExpression Attribute(Type expectedType)
+        {
+            return new ConstraintExpression().Attribute(expectedType);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Returns a new AttributeConstraint checking for the
+        /// presence of a particular attribute on an object.
+        /// </summary>
+        public static ResolvableConstraintExpression Attribute<T>()
+        {
+            return Attribute(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region Member
+
+        /// <summary>
+        /// Returns a new CollectionContainsConstraint checking for the
+        /// presence of a particular object in the collection.
+        /// </summary>
+        public static CollectionContainsConstraint Member(object expected)
+        {
+            return new CollectionContainsConstraint(expected);
+        }
+
+        #endregion
+
+    }
+}
diff --git a/src/NUnitFramework/framework/IExpectException.cs b/src/NUnitFramework/framework/IExpectException.cs
index 2bb4f23..bb4cb41 100644
--- a/src/NUnitFramework/framework/IExpectException.cs
+++ b/src/NUnitFramework/framework/IExpectException.cs
@@ -1,25 +1,25 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Interface implemented by a user fixture in order to
-    /// validate any expected exceptions. It is only called
-    /// for test methods marked with the ExpectedException
-    /// attribute.
-    /// </summary>
-	public interface IExpectException
-    {
-		/// <summary>
-		/// Method to handle an expected exception
-		/// </summary>
-		/// <param name="ex">The exception to be handled</param>
-        void HandleException(Exception ex);
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Interface implemented by a user fixture in order to
+    /// validate any expected exceptions. It is only called
+    /// for test methods marked with the ExpectedException
+    /// attribute.
+    /// </summary>
+	public interface IExpectException
+    {
+		/// <summary>
+		/// Method to handle an expected exception
+		/// </summary>
+		/// <param name="ex">The exception to be handled</param>
+        void HandleException(Exception ex);
+    }
+}
diff --git a/src/NUnitFramework/framework/ITestCaseData.cs b/src/NUnitFramework/framework/ITestCaseData.cs
index a642167..f60f837 100644
--- a/src/NUnitFramework/framework/ITestCaseData.cs
+++ b/src/NUnitFramework/framework/ITestCaseData.cs
@@ -1,80 +1,80 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// The ITestCaseData interface is implemented by a class
-    /// that is able to return complete testcases for use by
-    /// a parameterized test method.
-    /// 
-    /// NOTE: This interface is used in both the framework
-    /// and the core, even though that results in two different
-    /// types. However, sharing the source code guarantees that
-    /// the various implementations will be compatible and that
-    /// the core is able to reflect successfully over the
-    /// framework implementations of ITestCaseData.
-    /// </summary>
-    public interface ITestCaseData
-    {
-        /// <summary>
-        /// Gets the argument list to be provided to the test
-        /// </summary>
-        object[] Arguments { get; }
-
-        /// <summary>
-        /// Gets the expected result
-        /// </summary>
-        object Result { get; }
-
-        /// <summary>
-        /// 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; }
-
-        /// <summary>
-        /// Gets the FullName of the expected exception
-        /// </summary>
-        string ExpectedExceptionName { get; }
-
-        /// <summary>
-        /// Gets the name to be used for the test
-        /// </summary>
-        string TestName { get; }
-
-        /// <summary>
-        /// Gets the description of the test
-        /// </summary>
-        string Description { get; }
-
-        /// <summary>
-        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is ignored.
-        /// </summary>
-        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
-        bool Ignored { get; }
-
-        /// <summary>
-        /// Gets 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>
-        string IgnoreReason { get; }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The ITestCaseData interface is implemented by a class
+    /// that is able to return complete testcases for use by
+    /// a parameterized test method.
+    /// 
+    /// NOTE: This interface is used in both the framework
+    /// and the core, even though that results in two different
+    /// types. However, sharing the source code guarantees that
+    /// the various implementations will be compatible and that
+    /// the core is able to reflect successfully over the
+    /// framework implementations of ITestCaseData.
+    /// </summary>
+    public interface ITestCaseData
+    {
+        /// <summary>
+        /// Gets the argument list to be provided to the test
+        /// </summary>
+        object[] Arguments { get; }
+
+        /// <summary>
+        /// Gets the expected result
+        /// </summary>
+        object Result { get; }
+
+        /// <summary>
+        /// 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; }
+
+        /// <summary>
+        /// Gets the FullName of the expected exception
+        /// </summary>
+        string ExpectedExceptionName { get; }
+
+        /// <summary>
+        /// Gets the name to be used for the test
+        /// </summary>
+        string TestName { get; }
+
+        /// <summary>
+        /// Gets the description of the test
+        /// </summary>
+        string Description { get; }
+
+        /// <summary>
+        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        bool Ignored { get; }
+
+        /// <summary>
+        /// Gets 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>
+        string IgnoreReason { get; }
+    }
+}
diff --git a/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs b/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs
index 8df7996..2ccb4e0 100644
--- a/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs
+++ b/src/NUnitFramework/framework/Interfaces/INUnitEqualityComparer.cs
@@ -1,43 +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
-}
+// ****************************************************************
+// 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
index c6e3d0c..39d4a71 100644
--- a/src/NUnitFramework/framework/Interfaces/ITestAction.cs
+++ b/src/NUnitFramework/framework/Interfaces/ITestAction.cs
@@ -1,38 +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
+// ****************************************************************
+// 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 aabb33e..2cff6af 100644
--- a/src/NUnitFramework/framework/Is.cs
+++ b/src/NUnitFramework/framework/Is.cs
@@ -1,540 +1,533 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Helper class with properties and methods that supply
-    /// a number of constraints used in Asserts.
-    /// </summary>
-    public class Is
-    {
-        #region Not
-
-        /// <summary>
-        /// Returns a ConstraintExpression that negates any
-        /// following constraint.
-        /// </summary>
-        public static ConstraintExpression Not
-        {
-            get { return new ConstraintExpression().Not; }
-        }
-
-        #endregion
-
-        #region All
-
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them succeed.
-        /// </summary>
-        public static ConstraintExpression All
-        {
-            get { return new ConstraintExpression().All; }
-        }
-
-        #endregion
-
-        #region Null
-
-        /// <summary>
-        /// Returns a constraint that tests for null
-        /// </summary>
-        public static NullConstraint Null
-        {
-            get { return new NullConstraint(); }
-        }
-
-        #endregion
-
-        #region True
-
-        /// <summary>
-        /// Returns a constraint that tests for True
-        /// </summary>
-        public static TrueConstraint True
-        {
-            get { return new TrueConstraint(); }
-        }
-
-        #endregion
-
-        #region False
-
-        /// <summary>
-        /// Returns a constraint that tests for False
-        /// </summary>
-        public static FalseConstraint False
-        {
-            get { return new FalseConstraint(); }
-        }
-
-        #endregion
-
-        #region 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>
-        public static NaNConstraint NaN
-        {
-            get { return new NaNConstraint(); }
-        }
-
-        #endregion
-
-        #region Empty
-
-        /// <summary>
-        /// Returns a constraint that tests for empty
-        /// </summary>
-        public static EmptyConstraint Empty
-        {
-            get { return new EmptyConstraint(); }
-        }
-
-        #endregion
-
-        #region Unique
-
-        /// <summary>
-        /// Returns a constraint that tests whether a collection 
-        /// contains all unique items.
-        /// </summary>
-        public static UniqueItemsConstraint Unique
-        {
-            get { return new UniqueItemsConstraint(); }
-        }
-
-        #endregion
-
-        #region BinarySerializable
-
-        /// <summary>
-        /// Returns a constraint that tests whether an object graph is serializable in binary format.
-        /// </summary>
-        public static BinarySerializableConstraint BinarySerializable
-        {
-            get { return new BinarySerializableConstraint(); }
-        }
-
-        #endregion
-
-        #region XmlSerializable
-
-        /// <summary>
-        /// Returns a constraint that tests whether an object graph is serializable in xml format.
-        /// </summary>
-        public static XmlSerializableConstraint XmlSerializable
-        {
-            get { return new XmlSerializableConstraint(); }
-        }
-
-        #endregion
-
-        #region EqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests two items for equality
-        /// </summary>
-        public static EqualConstraint EqualTo(object expected)
-        {
-            return new EqualConstraint(expected);
-        }
-
-        #endregion
-
-        #region SameAs
-
-        /// <summary>
-        /// Returns a constraint that tests that two references are the same object
-        /// </summary>
-        public static SameAsConstraint SameAs(object expected)
-        {
-            return new SameAsConstraint(expected);
-        }
-
-        #endregion
-
-        #region GreaterThan
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than the suppled argument
-        /// </summary>
-        public static GreaterThanConstraint GreaterThan(object expected)
-        {
-            return new GreaterThanConstraint(expected);
-        }
-
-        #endregion
-
-        #region GreaterThanOrEqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than or equal to the suppled argument
-        /// </summary>
-        public static GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
-        {
-            return new GreaterThanOrEqualConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is greater than or equal to the suppled argument
-        /// </summary>
-        public static GreaterThanOrEqualConstraint AtLeast(object expected)
-        {
-            return new GreaterThanOrEqualConstraint(expected);
-        }
-
-        #endregion
-
-        #region LessThan
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than the suppled argument
-        /// </summary>
-        public static LessThanConstraint LessThan(object expected)
-        {
-            return new LessThanConstraint(expected);
-        }
-
-        #endregion
-
-        #region LessThanOrEqualTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than or equal to the suppled argument
-        /// </summary>
-        public static LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
-        {
-            return new LessThanOrEqualConstraint(expected);
-        }
-
-        /// <summary>
-        /// Returns a constraint that tests whether the
-        /// actual value is less than or equal to the suppled argument
-        /// </summary>
-        public static LessThanOrEqualConstraint AtMost(object expected)
-        {
-            return new LessThanOrEqualConstraint(expected);
-        }
-
-        #endregion
-
-        #region TypeOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual
-        /// value is of the exact type supplied as an argument.
-        /// </summary>
-        public static ExactTypeConstraint TypeOf(Type expectedType)
-        {
-            return new ExactTypeConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public static ExactTypeConstraint TypeOf<T>()
-        {
-            return new ExactTypeConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region InstanceOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is of the type supplied as an argument or a derived type.
-        /// </summary>
-        public static InstanceOfTypeConstraint InstanceOf(Type expectedType)
-        {
-            return new InstanceOfTypeConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public static InstanceOfTypeConstraint InstanceOf<T>()
-        {
-            return new InstanceOfTypeConstraint(typeof(T));
-        }
-#endif
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is of the type supplied as an argument or a derived type.
-        /// </summary>
-        [Obsolete("Use InstanceOf(expectedType)")]
-        public static InstanceOfTypeConstraint InstanceOfType(Type expectedType)
-        {
-            return new InstanceOfTypeConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        [Obsolete("Use InstanceOf<T>()")]
-        public static InstanceOfTypeConstraint InstanceOfType<T>()
-        {
-            return new InstanceOfTypeConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region AssignableFrom
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is assignable from the type supplied as an argument.
-        /// </summary>
-        public static AssignableFromConstraint AssignableFrom(Type expectedType)
-        {
-            return new AssignableFromConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public static AssignableFromConstraint AssignableFrom<T>()
-        {
-            return new AssignableFromConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region AssignableTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is assignable from the type supplied as an argument.
-        /// </summary>
-        public static AssignableToConstraint AssignableTo(Type expectedType)
-        {
-            return new AssignableToConstraint(expectedType);
-        }
-
-#if 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.
-        /// </summary>
-        public static AssignableToConstraint AssignableTo<T>()
-        {
-            return new AssignableToConstraint(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region EquivalentTo
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is a collection containing the same elements as the 
-        /// collection supplied as an argument.
-        /// </summary>
-        public static CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
-        {
-            return new CollectionEquivalentConstraint(expected);
-        }
-
-        #endregion
-
-        #region SubsetOf
-
-        /// <summary>
-        /// Returns a constraint that tests whether the actual value
-        /// is a subset of the collection supplied as an argument.
-        /// </summary>
-        public static CollectionSubsetConstraint SubsetOf(IEnumerable expected)
-        {
-            return new CollectionSubsetConstraint(expected);
-        }
-
-        #endregion
-
-        #region Ordered
-
-        /// <summary>
-        /// Returns a constraint that tests whether a collection is ordered
-        /// </summary>
-        public static CollectionOrderedConstraint Ordered
-        {
-            get { return new CollectionOrderedConstraint(); }
-        }
-
-        #endregion
-
-        #region StringContaining
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        public static SubstringConstraint StringContaining(string expected)
-        {
-            return new SubstringConstraint(expected);
-        }
-
-        #endregion
-
-        #region StringStarting
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public static StartsWithConstraint StringStarting(string expected)
-        {
-            return new StartsWithConstraint(expected);
-        }
-
-        #endregion
-
-        #region StringEnding
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public static EndsWithConstraint StringEnding(string expected)
-        {
-            return new EndsWithConstraint(expected);
-        }
-
-        #endregion
-
-        #region StringMatching
-
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value matches the Regex pattern supplied as an argument.
-        /// </summary>
-        public static RegexConstraint StringMatching(string pattern)
-        {
-            return new RegexConstraint(pattern);
-        }
-
-        #endregion
-
-        #region SamePath
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same as an expected path after canonicalization.
-        /// </summary>
-        public static SamePathConstraint SamePath(string expected)
-        {
-            return new SamePathConstraint(expected);
-        }
-
-        #endregion
-
-        #region SubPath
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same path or under an expected path after canonicalization.
-        /// </summary>
-        public static SubPathConstraint SubPath(string expected)
-        {
-            return new SubPathConstraint(expected);
-        }
-
-        #endregion
-
-        #region SamePathOrUnder
-
-        /// <summary>
-        /// Returns a constraint that tests whether the path provided 
-        /// is the same path or under an expected path after canonicalization.
-        /// </summary>
-        public static SamePathOrUnderConstraint SamePathOrUnder(string expected)
-        {
-            return new SamePathOrUnderConstraint(expected);
-        }
-
-        #endregion
-
-        #region InRange
-
-#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 InRange(IComparable from, IComparable to)
-        {
-            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
-
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// a number of constraints used in Asserts.
+    /// </summary>
+    public class Is
+    {
+        #region Not
+
+        /// <summary>
+        /// Returns a ConstraintExpression that negates any
+        /// following constraint.
+        /// </summary>
+        public static ConstraintExpression Not
+        {
+            get { return new ConstraintExpression().Not; }
+        }
+
+        #endregion
+
+        #region All
+
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        public static ConstraintExpression All
+        {
+            get { return new ConstraintExpression().All; }
+        }
+
+        #endregion
+
+        #region Null
+
+        /// <summary>
+        /// Returns a constraint that tests for null
+        /// </summary>
+        public static NullConstraint Null
+        {
+            get { return new NullConstraint(); }
+        }
+
+        #endregion
+
+        #region True
+
+        /// <summary>
+        /// Returns a constraint that tests for True
+        /// </summary>
+        public static TrueConstraint True
+        {
+            get { return new TrueConstraint(); }
+        }
+
+        #endregion
+
+        #region False
+
+        /// <summary>
+        /// Returns a constraint that tests for False
+        /// </summary>
+        public static FalseConstraint False
+        {
+            get { return new FalseConstraint(); }
+        }
+
+        #endregion
+
+        #region 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>
+        public static NaNConstraint NaN
+        {
+            get { return new NaNConstraint(); }
+        }
+
+        #endregion
+
+        #region Empty
+
+        /// <summary>
+        /// Returns a constraint that tests for empty
+        /// </summary>
+        public static EmptyConstraint Empty
+        {
+            get { return new EmptyConstraint(); }
+        }
+
+        #endregion
+
+        #region Unique
+
+        /// <summary>
+        /// Returns a constraint that tests whether a collection 
+        /// contains all unique items.
+        /// </summary>
+        public static UniqueItemsConstraint Unique
+        {
+            get { return new UniqueItemsConstraint(); }
+        }
+
+        #endregion
+
+        #region BinarySerializable
+
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in binary format.
+        /// </summary>
+        public static BinarySerializableConstraint BinarySerializable
+        {
+            get { return new BinarySerializableConstraint(); }
+        }
+
+        #endregion
+
+        #region XmlSerializable
+
+        /// <summary>
+        /// Returns a constraint that tests whether an object graph is serializable in xml format.
+        /// </summary>
+        public static XmlSerializableConstraint XmlSerializable
+        {
+            get { return new XmlSerializableConstraint(); }
+        }
+
+        #endregion
+
+        #region EqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests two items for equality
+        /// </summary>
+        public static EqualConstraint EqualTo(object expected)
+        {
+            return new EqualConstraint(expected);
+        }
+
+        #endregion
+
+        #region SameAs
+
+        /// <summary>
+        /// Returns a constraint that tests that two references are the same object
+        /// </summary>
+        public static SameAsConstraint SameAs(object expected)
+        {
+            return new SameAsConstraint(expected);
+        }
+
+        #endregion
+
+        #region GreaterThan
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than the suppled argument
+        /// </summary>
+        public static GreaterThanConstraint GreaterThan(object expected)
+        {
+            return new GreaterThanConstraint(expected);
+        }
+
+        #endregion
+
+        #region GreaterThanOrEqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public static GreaterThanOrEqualConstraint GreaterThanOrEqualTo(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is greater than or equal to the suppled argument
+        /// </summary>
+        public static GreaterThanOrEqualConstraint AtLeast(object expected)
+        {
+            return new GreaterThanOrEqualConstraint(expected);
+        }
+
+        #endregion
+
+        #region LessThan
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than the suppled argument
+        /// </summary>
+        public static LessThanConstraint LessThan(object expected)
+        {
+            return new LessThanConstraint(expected);
+        }
+
+        #endregion
+
+        #region LessThanOrEqualTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public static LessThanOrEqualConstraint LessThanOrEqualTo(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+
+        /// <summary>
+        /// Returns a constraint that tests whether the
+        /// actual value is less than or equal to the suppled argument
+        /// </summary>
+        public static LessThanOrEqualConstraint AtMost(object expected)
+        {
+            return new LessThanOrEqualConstraint(expected);
+        }
+
+        #endregion
+
+        #region TypeOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual
+        /// value is of the exact type supplied as an argument.
+        /// </summary>
+        public static ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return new ExactTypeConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public static ExactTypeConstraint TypeOf<T>()
+        {
+            return new ExactTypeConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region InstanceOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+#endif
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is of the type supplied as an argument or a derived type.
+        /// </summary>
+        [Obsolete("Use InstanceOf(expectedType)")]
+        public static InstanceOfTypeConstraint InstanceOfType(Type expectedType)
+        {
+            return new InstanceOfTypeConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        [Obsolete("Use InstanceOf<T>()")]
+        public static InstanceOfTypeConstraint InstanceOfType<T>()
+        {
+            return new InstanceOfTypeConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region AssignableFrom
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public static AssignableFromConstraint AssignableFrom(Type expectedType)
+        {
+            return new AssignableFromConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public static AssignableFromConstraint AssignableFrom<T>()
+        {
+            return new AssignableFromConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region AssignableTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is assignable from the type supplied as an argument.
+        /// </summary>
+        public static AssignableToConstraint AssignableTo(Type expectedType)
+        {
+            return new AssignableToConstraint(expectedType);
+        }
+
+#if 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.
+        /// </summary>
+        public static AssignableToConstraint AssignableTo<T>()
+        {
+            return new AssignableToConstraint(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region EquivalentTo
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a collection containing the same elements as the 
+        /// collection supplied as an argument.
+        /// </summary>
+        public static CollectionEquivalentConstraint EquivalentTo(IEnumerable expected)
+        {
+            return new CollectionEquivalentConstraint(expected);
+        }
+
+        #endregion
+
+        #region SubsetOf
+
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value
+        /// is a subset of the collection supplied as an argument.
+        /// </summary>
+        public static CollectionSubsetConstraint SubsetOf(IEnumerable expected)
+        {
+            return new CollectionSubsetConstraint(expected);
+        }
+
+        #endregion
+
+        #region Ordered
+
+        /// <summary>
+        /// Returns a constraint that tests whether a collection is ordered
+        /// </summary>
+        public static CollectionOrderedConstraint Ordered
+        {
+            get { return new CollectionOrderedConstraint(); }
+        }
+
+        #endregion
+
+        #region StringContaining
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        public static SubstringConstraint StringContaining(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+
+        #endregion
+
+        #region StringStarting
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public static StartsWithConstraint StringStarting(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+
+        #endregion
+
+        #region StringEnding
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public static EndsWithConstraint StringEnding(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+
+        #endregion
+
+        #region StringMatching
+
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the regular expression supplied as an argument.
+        /// </summary>
+        public static RegexConstraint StringMatching(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+
+        #endregion
+
+        #region SamePath
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same as an expected path after canonicalization.
+        /// </summary>
+        public static SamePathConstraint SamePath(string expected)
+        {
+            return new SamePathConstraint(expected);
+        }
+
+        #endregion
+
+        #region SubPath
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is under an expected path after canonicalization.
+        /// </summary>
+        public static SubPathConstraint SubPath(string expected)
+        {
+            return new SubPathConstraint(expected);
+        }
+
+        #endregion
+
+        #region SamePathOrUnder
+
+        /// <summary>
+        /// Returns a constraint that tests whether the path provided 
+        /// is the same path or under an expected path after canonicalization.
+        /// </summary>
+        public static SamePathOrUnderConstraint SamePathOrUnder(string expected)
+        {
+            return new SamePathOrUnderConstraint(expected);
+        }
+
+        #endregion
+
+        #region InRange
+
+#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);
+        }
+#else
+        /// <summary>
+        /// Returns a constraint that tests whether the actual value falls 
+        /// within a specified range.
+        /// </summary>
+        public static RangeConstraint InRange(IComparable from, IComparable to)
+        {
+            return new RangeConstraint(from, to);
+        }
+#endif
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Iz.cs b/src/NUnitFramework/framework/Iz.cs
index 8769d95..b44fa61 100644
--- a/src/NUnitFramework/framework/Iz.cs
+++ b/src/NUnitFramework/framework/Iz.cs
@@ -1,17 +1,17 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// The Iz class is a synonym for Is intended for use in VB,
-    /// which regards Is as a keyword.
-    /// </summary>
-    public class Iz : Is
-    {
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The Iz class is a synonym for Is intended for use in VB,
+    /// which regards Is as a keyword.
+    /// </summary>
+    public class Iz : Is
+    {
+    }
+}
diff --git a/src/NUnitFramework/framework/List.cs b/src/NUnitFramework/framework/List.cs
index 360794f..d4d32f2 100644
--- a/src/NUnitFramework/framework/List.cs
+++ b/src/NUnitFramework/framework/List.cs
@@ -1,30 +1,30 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// The List class is a helper class with properties and methods
-	/// that supply a number of constraints used with lists and collections.
-	/// </summary>
-	public class List
-	{
-		/// <summary>
-		/// List.Map returns a ListMapper, which can be used to map
-		/// the original collection to another collection.
-		/// </summary>
-		/// <param name="actual"></param>
-		/// <returns></returns>
-		public static ListMapper Map( ICollection actual )
-		{
-			return new ListMapper( actual );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// The List class is a helper class with properties and methods
+	/// that supply a number of constraints used with lists and collections.
+	/// </summary>
+	public class List
+	{
+		/// <summary>
+		/// List.Map returns a ListMapper, which can be used to map
+		/// the original collection to another collection.
+		/// </summary>
+		/// <param name="actual"></param>
+		/// <returns></returns>
+		public static ListMapper Map( ICollection actual )
+		{
+			return new ListMapper( actual );
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/ListMapper.cs b/src/NUnitFramework/framework/ListMapper.cs
index 65708aa..9145623 100644
--- a/src/NUnitFramework/framework/ListMapper.cs
+++ b/src/NUnitFramework/framework/ListMapper.cs
@@ -1,52 +1,52 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// ListMapper is used to transform a collection used as an actual argument
-	/// producing another collection to be used in the assertion.
-	/// </summary>
-	public class ListMapper
-	{
-		ICollection original;
-
-		/// <summary>
-		/// Construct a ListMapper based on a collection
-		/// </summary>
-		/// <param name="original">The collection to be transformed</param>
- 		public ListMapper( ICollection original )
-		{
-			this.original = original;
-		}
-
-		/// <summary>
-		/// Produces a collection containing all the values of a property
-		/// </summary>
-		/// <param name="name">The collection of property values</param>
-		/// <returns></returns>
-		public ICollection Property( string name )
-		{
-			ArrayList propList = new ArrayList();
-			foreach( object item in original )
-			{
-				PropertyInfo property = item.GetType().GetProperty( name, 
-					BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
-				if ( property == null )
-					throw new ArgumentException( string.Format(
-						"{0} does not have a {1} property", item, name ) );
-
-				propList.Add( property.GetValue( item, null ) );
-			}
-
-			return propList;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// ListMapper is used to transform a collection used as an actual argument
+	/// producing another collection to be used in the assertion.
+	/// </summary>
+	public class ListMapper
+	{
+		ICollection original;
+
+		/// <summary>
+		/// Construct a ListMapper based on a collection
+		/// </summary>
+		/// <param name="original">The collection to be transformed</param>
+ 		public ListMapper( ICollection original )
+		{
+			this.original = original;
+		}
+
+		/// <summary>
+		/// Produces a collection containing all the values of a property
+		/// </summary>
+		/// <param name="name">The collection of property values</param>
+		/// <returns></returns>
+		public ICollection Property( string name )
+		{
+			ArrayList propList = new ArrayList();
+			foreach( object item in original )
+			{
+				PropertyInfo property = item.GetType().GetProperty( name, 
+					BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
+				if ( property == null )
+					throw new ArgumentException( string.Format(
+						"{0} does not have a {1} property", item, name ) );
+
+				propList.Add( property.GetValue( item, null ) );
+			}
+
+			return propList;
+		}
+	}
+}
diff --git a/src/NUnitFramework/framework/Randomizer.cs b/src/NUnitFramework/framework/Randomizer.cs
index 1dc3253..4633107 100644
--- a/src/NUnitFramework/framework/Randomizer.cs
+++ b/src/NUnitFramework/framework/Randomizer.cs
@@ -1,117 +1,117 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Reflection;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Randomizer returns a set of random values in a repeatable
-    /// way, to allow re-running of tests if necessary.
-    /// </summary>
-    public class Randomizer : Random
-    {
-        #region Static Members
-        private static Random seedGenerator = new Random();
-
-        private static Hashtable randomizers = new Hashtable();
-
-        /// <summary>
-        /// Get a random seed for use in creating a randomizer.
-        /// </summary>
-        public static int RandomSeed
-        {
-            get { return seedGenerator.Next(); }
-        }
-
-        /// <summary>
-        /// Get a randomizer for a particular member, returning
-        /// one that has already been created if it exists.
-        /// This ensures that the same values are generated
-        /// each time the tests are reloaded.
-        /// </summary>
-        public static Randomizer GetRandomizer(MemberInfo member)
-        {
-            Randomizer r = (Randomizer)randomizers[member];
-
-            if ( r == null )
-                randomizers[member] = r = new Randomizer();
-
-            return r;
-        }
-
-
-        /// <summary>
-        /// Get a randomizer for a particular parameter, returning
-        /// one that has already been created if it exists.
-        /// This ensures that the same values are generated
-        /// each time the tests are reloaded.
-        /// </summary>
-        public static Randomizer GetRandomizer(ParameterInfo parameter)
-        {
-            return GetRandomizer(parameter.Member);
-        }
-        #endregion
-
-        #region Constructors
-        /// <summary>
-        /// Construct a randomizer using a random seed
-        /// </summary>
-        public Randomizer() : base(RandomSeed) { }
-
-        /// <summary>
-        /// Construct a randomizer using a specified seed
-        /// </summary>
-        public Randomizer(int seed) : base(seed) { }
-        #endregion
-
-        #region Public Methods
-        /// <summary>
-        /// Return an array of random doubles between 0.0 and 1.0.
-        /// </summary>
-        /// <param name="count"></param>
-        /// <returns></returns>
-        public double[] GetDoubles(int count)
-        {
-            double[] rvals = new double[count];
-
-            for (int index = 0; index < count; index++)
-                rvals[index] = NextDouble();
-
-            return rvals;
-        }
-
-        /// <summary>
-        /// Return an array of random doubles with values in a specified range.
-        /// </summary>
-        public double[] GetDoubles(double min, double max, int count)
-        {
-            double range = max - min;
-            double[] rvals = new double[count];
-
-            for (int index = 0; index < count; index++)
-                rvals[index] = NextDouble() * range + min;
-
-            return rvals;
-        }
-
-        /// <summary>
-        /// Return an array of random ints with values in a specified range.
-        /// </summary>
-        public int[] GetInts(int min, int max, int count)
-        {
-            int[] ivals = new int[count];
-
-            for (int index = 0; index < count; index++)
-                ivals[index] = Next(min, max);
-
-            return ivals;
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Randomizer returns a set of random values in a repeatable
+    /// way, to allow re-running of tests if necessary.
+    /// </summary>
+    public class Randomizer : Random
+    {
+        #region Static Members
+        private static Random seedGenerator = new Random();
+
+        private static Hashtable randomizers = new Hashtable();
+
+        /// <summary>
+        /// Get a random seed for use in creating a randomizer.
+        /// </summary>
+        public static int RandomSeed
+        {
+            get { return seedGenerator.Next(); }
+        }
+
+        /// <summary>
+        /// Get a randomizer for a particular member, returning
+        /// one that has already been created if it exists.
+        /// This ensures that the same values are generated
+        /// each time the tests are reloaded.
+        /// </summary>
+        public static Randomizer GetRandomizer(MemberInfo member)
+        {
+            Randomizer r = (Randomizer)randomizers[member];
+
+            if ( r == null )
+                randomizers[member] = r = new Randomizer();
+
+            return r;
+        }
+
+
+        /// <summary>
+        /// Get a randomizer for a particular parameter, returning
+        /// one that has already been created if it exists.
+        /// This ensures that the same values are generated
+        /// each time the tests are reloaded.
+        /// </summary>
+        public static Randomizer GetRandomizer(ParameterInfo parameter)
+        {
+            return GetRandomizer(parameter.Member);
+        }
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Construct a randomizer using a random seed
+        /// </summary>
+        public Randomizer() : base(RandomSeed) { }
+
+        /// <summary>
+        /// Construct a randomizer using a specified seed
+        /// </summary>
+        public Randomizer(int seed) : base(seed) { }
+        #endregion
+
+        #region Public Methods
+        /// <summary>
+        /// Return an array of random doubles between 0.0 and 1.0.
+        /// </summary>
+        /// <param name="count"></param>
+        /// <returns></returns>
+        public double[] GetDoubles(int count)
+        {
+            double[] rvals = new double[count];
+
+            for (int index = 0; index < count; index++)
+                rvals[index] = NextDouble();
+
+            return rvals;
+        }
+
+        /// <summary>
+        /// Return an array of random doubles with values in a specified range.
+        /// </summary>
+        public double[] GetDoubles(double min, double max, int count)
+        {
+            double range = max - min;
+            double[] rvals = new double[count];
+
+            for (int index = 0; index < count; index++)
+                rvals[index] = NextDouble() * range + min;
+
+            return rvals;
+        }
+
+        /// <summary>
+        /// Return an array of random ints with values in a specified range.
+        /// </summary>
+        public int[] GetInts(int min, int max, int count)
+        {
+            int[] ivals = new int[count];
+
+            for (int index = 0; index < count; index++)
+                ivals[index] = Next(min, max);
+
+            return ivals;
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/SpecialValue.cs b/src/NUnitFramework/framework/SpecialValue.cs
index eb85614..f87b546 100644
--- a/src/NUnitFramework/framework/SpecialValue.cs
+++ b/src/NUnitFramework/framework/SpecialValue.cs
@@ -1,23 +1,23 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// The SpecialValue enum is used to represent TestCase arguments
-    /// that cannot be used as arguments to an Attribute.
-    /// </summary>
-	public enum SpecialValue
-	{
-        /// <summary>
-        /// Null represents a null value, which cannot be used as an 
-        /// argument to an attriute under .NET 1.x
-        /// </summary>
-        Null
-	}
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The SpecialValue enum is used to represent TestCase arguments
+    /// that cannot be used as arguments to an Attribute.
+    /// </summary>
+	public enum SpecialValue
+	{
+        /// <summary>
+        /// Null represents a null value, which cannot be used as an 
+        /// argument to an attribute under .NET 1.x
+        /// </summary>
+        Null
+	}
+}
diff --git a/src/NUnitFramework/framework/StringAssert.cs b/src/NUnitFramework/framework/StringAssert.cs
index 2140b70..f7afaf4 100644
--- a/src/NUnitFramework/framework/StringAssert.cs
+++ b/src/NUnitFramework/framework/StringAssert.cs
@@ -1,407 +1,407 @@
-// ****************************************************************
-// Copyright 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.ComponentModel;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// Basic Asserts on strings.
-	/// </summary>
-	public class StringAssert
-	{
-		#region Equals and ReferenceEquals
-
-		/// <summary>
-		/// The Equals method throws an AssertionException. This is done 
-		/// to make sure there is no mistake by calling this function.
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		[EditorBrowsable(EditorBrowsableState.Never)]
-		public static new bool Equals(object a, object b)
-		{
-			throw new AssertionException("Assert.Equals should not be used for Assertions");
-		}
-
-		/// <summary>
-		/// override the default ReferenceEquals to throw an AssertionException. This 
-		/// implementation makes sure there is no mistake in calling this function 
-		/// as part of Assert. 
-		/// </summary>
-		/// <param name="a"></param>
-		/// <param name="b"></param>
-		public static new void ReferenceEquals(object a, object b)
-		{
-			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
-		}
-
-		#endregion
-
-        #region Contains
-
-        /// <summary>
-        /// Asserts that a string is found within another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void Contains(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new SubstringConstraint(expected), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string is found within another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void Contains(string expected, string actual, string message)
-        {
-            Contains(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string is found within another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        static public void Contains(string expected, string actual)
-        {
-            Contains(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region DoesNotContain
-
-        /// <summary>
-        /// Asserts that a string is not found within another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void DoesNotContain(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new NotConstraint( new SubstringConstraint(expected) ), message, args );
-        }
-
-        /// <summary>
-        /// Asserts that a string is found within another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void DoesNotContain(string expected, string actual, string message)
-        {
-            DoesNotContain(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string is found within another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        static public void DoesNotContain(string expected, string actual)
-        {
-            DoesNotContain(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region StartsWith
-
-        /// <summary>
-        /// Asserts that a string starts with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void StartsWith(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new StartsWithConstraint(expected), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string starts with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void StartsWith(string expected, string actual, string message)
-        {
-            StartsWith(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string starts with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        static public void StartsWith(string expected, string actual)
-        {
-            StartsWith(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region DoesNotStartWith
-
-        /// <summary>
-        /// Asserts that a string does not start with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void DoesNotStartWith(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new NotConstraint( new StartsWithConstraint(expected) ), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string does not start with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void DoesNotStartWith(string expected, string actual, string message)
-        {
-            DoesNotStartWith(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string does not start with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        static public void DoesNotStartWith(string expected, string actual)
-        {
-            DoesNotStartWith(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region EndsWith
-
-        /// <summary>
-        /// Asserts that a string ends with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void EndsWith(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new EndsWithConstraint(expected), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string ends with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void EndsWith(string expected, string actual, string message)
-        {
-            EndsWith(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string ends with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        static public void EndsWith(string expected, string actual)
-        {
-            EndsWith(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region DoesNotEndWith
-
-        /// <summary>
-        /// Asserts that a string does not end with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void DoesNotEndWith(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new NotConstraint( new EndsWithConstraint(expected) ), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string does not end with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void DoesNotEndWith(string expected, string actual, string message)
-        {
-            DoesNotEndWith(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string does not end with another string.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The string to be examined</param>
-        static public void DoesNotEndWith(string expected, string actual)
-        {
-            DoesNotEndWith(expected, actual, string.Empty, null);
-        }
-
-        #endregion
-
-        #region AreEqualIgnoringCase
-        /// <summary>
-        /// Asserts that two strings are equal, without regard to case.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void AreEqualIgnoringCase(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new EqualConstraint(expected).IgnoreCase, message, args);
-        }
-
-        /// <summary>
-        /// Asserts that two strings are equal, without regard to case.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void AreEqualIgnoringCase(string expected, string actual, string message)
-        {
-            AreEqualIgnoringCase(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that two strings are equal, without regard to case.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        static public void AreEqualIgnoringCase(string expected, string actual)
-        {
-            AreEqualIgnoringCase(expected, actual, string.Empty, null);
-        }
-        #endregion
-
-        #region AreNotEqualIgnoringCase
-        /// <summary>
-        /// Asserts that two strings are not equal, without regard to case.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void AreNotEqualIgnoringCase(string expected, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new NotConstraint( new EqualConstraint(expected).IgnoreCase ), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that two strings are Notequal, without regard to case.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void AreNotEqualIgnoringCase(string expected, string actual, string message)
-        {
-            AreNotEqualIgnoringCase(expected, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that two strings are not equal, without regard to case.
-        /// </summary>
-        /// <param name="expected">The expected string</param>
-        /// <param name="actual">The actual string</param>
-        static public void AreNotEqualIgnoringCase(string expected, string actual)
-        {
-            AreNotEqualIgnoringCase(expected, actual, string.Empty, null);
-        }
-        #endregion
-
-        #region IsMatch
-        /// <summary>
-        /// Asserts that a string matches an expected regular expression pattern.
-        /// </summary>
-        /// <param name="pattern">The regex pattern to be matched</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void IsMatch(string pattern, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new RegexConstraint(pattern), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string matches an expected regular expression pattern.
-        /// </summary>
-        /// <param name="pattern">The regex pattern to be matched</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void IsMatch(string pattern, string actual, string message)
-        {
-            IsMatch(pattern, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string matches an expected regular expression pattern.
-        /// </summary>
-        /// <param name="pattern">The regex pattern to be matched</param>
-        /// <param name="actual">The actual string</param>
-        static public void IsMatch(string pattern, string actual)
-        {
-            IsMatch(pattern, actual, string.Empty, null);
-        }
-        #endregion
-
-        #region DoesNotMatch
-        /// <summary>
-        /// Asserts that a string does not match an expected regular expression pattern.
-        /// </summary>
-        /// <param name="pattern">The regex pattern to be used</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        /// <param name="args">Arguments used in formatting the message</param>
-        static public void DoesNotMatch(string pattern, string actual, string message, params object[] args)
-        {
-            Assert.That(actual, new NotConstraint( new RegexConstraint(pattern) ), message, args);
-        }
-
-        /// <summary>
-        /// Asserts that a string does not match an expected regular expression pattern.
-        /// </summary>
-        /// <param name="pattern">The regex pattern to be used</param>
-        /// <param name="actual">The actual string</param>
-        /// <param name="message">The message to display in case of failure</param>
-        static public void DoesNotMatch(string pattern, string actual, string message)
-        {
-            DoesNotMatch(pattern, actual, message, null);
-        }
-
-        /// <summary>
-        /// Asserts that a string does not match an expected regular expression pattern.
-        /// </summary>
-        /// <param name="pattern">The regex pattern to be used</param>
-        /// <param name="actual">The actual string</param>
-        static public void DoesNotMatch(string pattern, string actual)
-        {
-            DoesNotMatch(pattern, actual, string.Empty, null);
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 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.ComponentModel;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// Basic Asserts on strings.
+	/// </summary>
+	public class StringAssert
+	{
+		#region Equals and ReferenceEquals
+
+		/// <summary>
+		/// The Equals method throws an AssertionException. This is done 
+		/// to make sure there is no mistake by calling this function.
+		/// </summary>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		[EditorBrowsable(EditorBrowsableState.Never)]
+		public static new bool Equals(object a, object b)
+		{
+			throw new AssertionException("Assert.Equals should not be used for Assertions");
+		}
+
+		/// <summary>
+		/// override the default ReferenceEquals to throw an AssertionException. This 
+		/// implementation makes sure there is no mistake in calling this function 
+		/// as part of Assert. 
+		/// </summary>
+		/// <param name="a"></param>
+		/// <param name="b"></param>
+		public static new void ReferenceEquals(object a, object b)
+		{
+			throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions");
+		}
+
+		#endregion
+
+        #region Contains
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void Contains(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new SubstringConstraint(expected), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void Contains(string expected, string actual, string message)
+        {
+            Contains(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void Contains(string expected, string actual)
+        {
+            Contains(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region DoesNotContain
+
+        /// <summary>
+        /// Asserts that a string is not found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotContain(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new SubstringConstraint(expected) ), message, args );
+        }
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotContain(string expected, string actual, string message)
+        {
+            DoesNotContain(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string is found within another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void DoesNotContain(string expected, string actual)
+        {
+            DoesNotContain(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region StartsWith
+
+        /// <summary>
+        /// Asserts that a string starts with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void StartsWith(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new StartsWithConstraint(expected), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string starts with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void StartsWith(string expected, string actual, string message)
+        {
+            StartsWith(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string starts with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void StartsWith(string expected, string actual)
+        {
+            StartsWith(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region DoesNotStartWith
+
+        /// <summary>
+        /// Asserts that a string does not start with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotStartWith(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new StartsWithConstraint(expected) ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not start with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotStartWith(string expected, string actual, string message)
+        {
+            DoesNotStartWith(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not start with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void DoesNotStartWith(string expected, string actual)
+        {
+            DoesNotStartWith(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region EndsWith
+
+        /// <summary>
+        /// Asserts that a string ends with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void EndsWith(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new EndsWithConstraint(expected), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string ends with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void EndsWith(string expected, string actual, string message)
+        {
+            EndsWith(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string ends with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void EndsWith(string expected, string actual)
+        {
+            EndsWith(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region DoesNotEndWith
+
+        /// <summary>
+        /// Asserts that a string does not end with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotEndWith(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new EndsWithConstraint(expected) ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not end with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotEndWith(string expected, string actual, string message)
+        {
+            DoesNotEndWith(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not end with another string.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The string to be examined</param>
+        static public void DoesNotEndWith(string expected, string actual)
+        {
+            DoesNotEndWith(expected, actual, string.Empty, null);
+        }
+
+        #endregion
+
+        #region AreEqualIgnoringCase
+        /// <summary>
+        /// Asserts that two strings are equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void AreEqualIgnoringCase(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new EqualConstraint(expected).IgnoreCase, message, args);
+        }
+
+        /// <summary>
+        /// Asserts that two strings are equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void AreEqualIgnoringCase(string expected, string actual, string message)
+        {
+            AreEqualIgnoringCase(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that two strings are equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        static public void AreEqualIgnoringCase(string expected, string actual)
+        {
+            AreEqualIgnoringCase(expected, actual, string.Empty, null);
+        }
+        #endregion
+
+        #region AreNotEqualIgnoringCase
+        /// <summary>
+        /// Asserts that two strings are not equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void AreNotEqualIgnoringCase(string expected, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new EqualConstraint(expected).IgnoreCase ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that two strings are Notequal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void AreNotEqualIgnoringCase(string expected, string actual, string message)
+        {
+            AreNotEqualIgnoringCase(expected, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that two strings are not equal, without regard to case.
+        /// </summary>
+        /// <param name="expected">The expected string</param>
+        /// <param name="actual">The actual string</param>
+        static public void AreNotEqualIgnoringCase(string expected, string actual)
+        {
+            AreNotEqualIgnoringCase(expected, actual, string.Empty, null);
+        }
+        #endregion
+
+        #region IsMatch
+        /// <summary>
+        /// Asserts that a string matches an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be matched</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void IsMatch(string pattern, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new RegexConstraint(pattern), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string matches an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be matched</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void IsMatch(string pattern, string actual, string message)
+        {
+            IsMatch(pattern, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string matches an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be matched</param>
+        /// <param name="actual">The actual string</param>
+        static public void IsMatch(string pattern, string actual)
+        {
+            IsMatch(pattern, actual, string.Empty, null);
+        }
+        #endregion
+
+        #region DoesNotMatch
+        /// <summary>
+        /// Asserts that a string does not match an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be used</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        /// <param name="args">Arguments used in formatting the message</param>
+        static public void DoesNotMatch(string pattern, string actual, string message, params object[] args)
+        {
+            Assert.That(actual, new NotConstraint( new RegexConstraint(pattern) ), message, args);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not match an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be used</param>
+        /// <param name="actual">The actual string</param>
+        /// <param name="message">The message to display in case of failure</param>
+        static public void DoesNotMatch(string pattern, string actual, string message)
+        {
+            DoesNotMatch(pattern, actual, message, null);
+        }
+
+        /// <summary>
+        /// Asserts that a string does not match an expected regular expression pattern.
+        /// </summary>
+        /// <param name="pattern">The regex pattern to be used</param>
+        /// <param name="actual">The actual string</param>
+        static public void DoesNotMatch(string pattern, string actual)
+        {
+            DoesNotMatch(pattern, actual, string.Empty, null);
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/TestCaseData.cs b/src/NUnitFramework/framework/TestCaseData.cs
index 9558206..7167ee5 100644
--- a/src/NUnitFramework/framework/TestCaseData.cs
+++ b/src/NUnitFramework/framework/TestCaseData.cs
@@ -1,400 +1,400 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// The TestCaseData class represents a set of arguments
-    /// and other parameter info to be used for a parameterized
-    /// test case. It provides a number of instance modifiers
-    /// for use in initializing the test case.
-    /// 
-    /// Note: Instance modifiers are getters that return
-    /// the same instance after modifying it's state.
-    /// </summary>
-    public class TestCaseData : ITestCaseData
-    {
-        #region Constants
-        //private static readonly string DESCRIPTION = "_DESCRIPTION";
-        //private static readonly string IGNOREREASON = "_IGNOREREASON";
-        private static readonly string CATEGORIES = "_CATEGORIES";
-        #endregion
-
-        #region Instance Fields
-        /// <summary>
-        /// The argument list to be provided to the test
-        /// </summary>
-        private object[] arguments;
-
-        /// <summary>
-        /// The expected result to be returned
-        /// </summary>
-        private object expectedResult;
-
-        /// <summary>
-        /// Set to true if this has an expected result
-        /// </summary>
-        private bool hasExpectedResult;
-
-        /// <summary>
-        ///  The expected exception Type
-        /// </summary>
-        private Type expectedExceptionType;
-
-        /// <summary>
-        /// The FullName of the expected exception
-        /// </summary>
-        private string expectedExceptionName;
-
-        /// <summary>
-        /// The name to be used for the test
-        /// </summary>
-        private string testName;
-
-        /// <summary>
-        /// The description of the test
-        /// </summary>
-        private string description;
-
-        /// <summary>
-        /// A dictionary of properties, used to add information
-        /// to tests without requiring the class to change.
-        /// </summary>
-        private IDictionary properties;
-
-        /// <summary>
-        /// If true, indicates that the test case is to be ignored
-        /// </summary>
-        bool isIgnored;
-
-        /// <summary>
-        /// If true, indicates that the test case is marked explicit
-        /// </summary>
-        bool isExplicit;
-
-        /// <summary>
-        /// The reason for ignoring a test case
-        /// </summary>
-        string ignoreReason;
-
-        #endregion
-
-        #region Constructors
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
-        /// </summary>
-        /// <param name="args">The arguments.</param>
-        public TestCaseData(params object[] args)
-        {
-            if (args == null)
-                this.arguments = new object[] { null };
-            else
-                this.arguments = args;
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
-        /// </summary>
-        /// <param name="arg">The argument.</param>
-        public TestCaseData(object arg)
-        {
-            this.arguments = new object[] { arg };
-        }
-
-    /// <summary>
-    /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
-    /// </summary>
-    /// <param name="arg1">The first argument.</param>
-    /// <param name="arg2">The second argument.</param>
-    public TestCaseData(object arg1, object arg2)
-    {
-        this.arguments = new object[] { arg1, arg2 };
-    }
-
-    /// <summary>
-    /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
-    /// </summary>
-    /// <param name="arg1">The first argument.</param>
-    /// <param name="arg2">The second argument.</param>
-    /// <param name="arg3">The third argument.</param>
-    public TestCaseData(object arg1, object arg2, object arg3)
-    {
-        this.arguments = new object[] { arg1, arg2, arg3 };
-    }
-        #endregion
-
-        #region ITestCaseData Members
-        /// <summary>
-        /// Gets the argument list to be provided to the test
-        /// </summary>
-        public object[] Arguments
-        {
-            get { return arguments; }
-        }
-
-        /// <summary>
-        /// Gets the expected result
-        /// </summary>
-        public object Result
-        {
-            get { return expectedResult; }
-        }
-
-        /// <summary>
-        /// Returns true if the result has been set
-        /// </summary>
-        public bool HasExpectedResult
-        {
-            get { return hasExpectedResult; }
-        }
-
-        /// <summary>
-        ///  Gets the expected exception Type
-        /// </summary>
-        public Type ExpectedException
-        {
-            get { return expectedExceptionType; }
-        }
-
-        /// <summary>
-        /// Gets the FullName of the expected exception
-        /// </summary>
-        public string ExpectedExceptionName
-        {
-            get { return expectedExceptionName; }
-        }
-
-        /// <summary>
-        /// Gets the name to be used for the test
-        /// </summary>
-        public string TestName
-        {
-            get { return testName; }
-        }
-
-        /// <summary>
-        /// Gets the description of the test
-        /// </summary>
-        public string Description
-        {
-            get { return description; }
-        }
-
-        /// <summary>
-        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is ignored.
-        /// </summary>
-        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
-        public bool Ignored
-        {
-            get { return isIgnored; }
-        }
-
-        /// <summary>
-        /// Gets 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>
-        public string IgnoreReason
-        {
-            get { return ignoreReason; }
-        }
-
-        #endregion
-
-        #region Additional Public Properties
-        /// <summary>
-        /// Gets a list of categories associated with this test.
-        /// </summary>
-        public IList Categories
-        {
-            get
-            {
-                if (Properties[CATEGORIES] == null)
-                    Properties[CATEGORIES] = new ArrayList();
-
-                return (IList)Properties[CATEGORIES];
-            }
-        }
-
-        /// <summary>
-        /// Gets the property dictionary for this test
-        /// </summary>
-        public IDictionary Properties
-        {
-            get
-            {
-                if (properties == null)
-                    properties = new ListDictionary();
-
-                return properties;
-            }
-        }
-        #endregion
-
-        #region Fluent Instance Modifiers
-        /// <summary>
-        /// Sets the expected result for the test
-        /// </summary>
-        /// <param name="result">The expected result</param>
-        /// <returns>A modified TestCaseData</returns>
-        public TestCaseData Returns(object result)
-        {
-            this.expectedResult = result;
-            this.hasExpectedResult = true;
-            return this;
-        }
-
-        /// <summary>
-        /// Sets the expected exception type for the test
-        /// </summary>
-        /// <param name="exceptionType">Type of the expected exception.</param>
-        /// <returns>The modified TestCaseData instance</returns>
-        public TestCaseData Throws(Type exceptionType)
-        {
-            this.expectedExceptionType = exceptionType;
-            this.expectedExceptionName = exceptionType.FullName;
-            return this;
-        }
-
-        /// <summary>
-        /// Sets the expected exception type for the test
-        /// </summary>
-        /// <param name="exceptionName">FullName of the expected exception.</param>
-        /// <returns>The modified TestCaseData instance</returns>
-        public TestCaseData Throws(string exceptionName)
-        {
-            this.expectedExceptionName = exceptionName;
-            return this;
-        }
-
-        /// <summary>
-        /// Sets the name of the test case
-        /// </summary>
-        /// <returns>The modified TestCaseData instance</returns>
-        public TestCaseData SetName(string name)
-        {
-            this.testName = name;
-            return this;
-        }
-
-        /// <summary>
-        /// Sets the description for the test case
-        /// being constructed.
-        /// </summary>
-        /// <param name="description">The description.</param>
-        /// <returns>The modified TestCaseData instance.</returns>
-        public TestCaseData SetDescription(string description)
-        {
-            this.description = description;
-            return this;
-        }
-
-        /// <summary>
-        /// Applies a category to the test
-        /// </summary>
-        /// <param name="category"></param>
-        /// <returns></returns>
-        public TestCaseData SetCategory(string category)
-        {
-            this.Categories.Add(category);
-            return this;
-        }
-
-        /// <summary>
-        /// Applies a named property to the test
-        /// </summary>
-        /// <param name="propName"></param>
-        /// <param name="propValue"></param>
-        /// <returns></returns>
-        public TestCaseData SetProperty(string propName, string propValue)
-        {
-            this.Properties.Add(propName, propValue);
-            return this;
-        }
-
-        /// <summary>
-        /// Applies a named property to the test
-        /// </summary>
-        /// <param name="propName"></param>
-        /// <param name="propValue"></param>
-        /// <returns></returns>
-        public TestCaseData SetProperty(string propName, int propValue)
-        {
-            this.Properties.Add(propName, propValue);
-            return this;
-        }
-
-        /// <summary>
-        /// Applies a named property to the test
-        /// </summary>
-        /// <param name="propName"></param>
-        /// <param name="propValue"></param>
-        /// <returns></returns>
-        public TestCaseData SetProperty(string propName, double propValue)
-        {
-            this.Properties.Add(propName, propValue);
-            return this;
-        }
-
-        /// <summary>
-        /// Ignores this TestCase.
-        /// </summary>
-        /// <returns></returns>
-        public TestCaseData Ignore()
-        {
-            isIgnored = true;
-            return this;
-        }
-
-        /// <summary>
-        /// Ignores this TestCase, specifying the reason.
-        /// </summary>
-        /// <param name="reason">The reason.</param>
-        /// <returns></returns>
-        public TestCaseData Ignore(string reason)
-        {
-            isIgnored = true;
-            ignoreReason = reason;
-            return this;
-        }
-
-        /// <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
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// The TestCaseData class represents a set of arguments
+    /// and other parameter info to be used for a parameterized
+    /// test case. It provides a number of instance modifiers
+    /// for use in initializing the test case.
+    /// 
+    /// Note: Instance modifiers are getters that return
+    /// the same instance after modifying it's state.
+    /// </summary>
+    public class TestCaseData : ITestCaseData
+    {
+        #region Constants
+        //private static readonly string DESCRIPTION = "_DESCRIPTION";
+        //private static readonly string IGNOREREASON = "_IGNOREREASON";
+        private static readonly string CATEGORIES = "_CATEGORIES";
+        #endregion
+
+        #region Instance Fields
+        /// <summary>
+        /// The argument list to be provided to the test
+        /// </summary>
+        private object[] arguments;
+
+        /// <summary>
+        /// The expected result to be returned
+        /// </summary>
+        private object expectedResult;
+
+        /// <summary>
+        /// Set to true if this has an expected result
+        /// </summary>
+        private bool hasExpectedResult;
+
+        /// <summary>
+        ///  The expected exception Type
+        /// </summary>
+        private Type expectedExceptionType;
+
+        /// <summary>
+        /// The FullName of the expected exception
+        /// </summary>
+        private string expectedExceptionName;
+
+        /// <summary>
+        /// The name to be used for the test
+        /// </summary>
+        private string testName;
+
+        /// <summary>
+        /// The description of the test
+        /// </summary>
+        private string description;
+
+        /// <summary>
+        /// A dictionary of properties, used to add information
+        /// to tests without requiring the class to change.
+        /// </summary>
+        private IDictionary properties;
+
+        /// <summary>
+        /// If true, indicates that the test case is to be ignored
+        /// </summary>
+        bool isIgnored;
+
+        /// <summary>
+        /// If true, indicates that the test case is marked explicit
+        /// </summary>
+        bool isExplicit;
+
+        /// <summary>
+        /// The reason for ignoring a test case
+        /// </summary>
+        string ignoreReason;
+
+        #endregion
+
+        #region Constructors
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+        /// </summary>
+        /// <param name="args">The arguments.</param>
+        public TestCaseData(params object[] args)
+        {
+            if (args == null)
+                this.arguments = new object[] { null };
+            else
+                this.arguments = args;
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+        /// </summary>
+        /// <param name="arg">The argument.</param>
+        public TestCaseData(object arg)
+        {
+            this.arguments = new object[] { arg };
+        }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+    /// </summary>
+    /// <param name="arg1">The first argument.</param>
+    /// <param name="arg2">The second argument.</param>
+    public TestCaseData(object arg1, object arg2)
+    {
+        this.arguments = new object[] { arg1, arg2 };
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+    /// </summary>
+    /// <param name="arg1">The first argument.</param>
+    /// <param name="arg2">The second argument.</param>
+    /// <param name="arg3">The third argument.</param>
+    public TestCaseData(object arg1, object arg2, object arg3)
+    {
+        this.arguments = new object[] { arg1, arg2, arg3 };
+    }
+        #endregion
+
+        #region ITestCaseData Members
+        /// <summary>
+        /// Gets the argument list to be provided to the test
+        /// </summary>
+        public object[] Arguments
+        {
+            get { return arguments; }
+        }
+
+        /// <summary>
+        /// Gets the expected result
+        /// </summary>
+        public object Result
+        {
+            get { return expectedResult; }
+        }
+
+        /// <summary>
+        /// Returns true if the result has been set
+        /// </summary>
+        public bool HasExpectedResult
+        {
+            get { return hasExpectedResult; }
+        }
+
+        /// <summary>
+        ///  Gets the expected exception Type
+        /// </summary>
+        public Type ExpectedException
+        {
+            get { return expectedExceptionType; }
+        }
+
+        /// <summary>
+        /// Gets the FullName of the expected exception
+        /// </summary>
+        public string ExpectedExceptionName
+        {
+            get { return expectedExceptionName; }
+        }
+
+        /// <summary>
+        /// Gets the name to be used for the test
+        /// </summary>
+        public string TestName
+        {
+            get { return testName; }
+        }
+
+        /// <summary>
+        /// Gets the description of the test
+        /// </summary>
+        public string Description
+        {
+            get { return description; }
+        }
+
+        /// <summary>
+        /// Gets a value indicating whether this <see cref="ITestCaseData"/> is ignored.
+        /// </summary>
+        /// <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        public bool Ignored
+        {
+            get { return isIgnored; }
+        }
+
+        /// <summary>
+        /// Gets 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>
+        public string IgnoreReason
+        {
+            get { return ignoreReason; }
+        }
+
+        #endregion
+
+        #region Additional Public Properties
+        /// <summary>
+        /// Gets a list of categories associated with this test.
+        /// </summary>
+        public IList Categories
+        {
+            get
+            {
+                if (Properties[CATEGORIES] == null)
+                    Properties[CATEGORIES] = new ArrayList();
+
+                return (IList)Properties[CATEGORIES];
+            }
+        }
+
+        /// <summary>
+        /// Gets the property dictionary for this test
+        /// </summary>
+        public IDictionary Properties
+        {
+            get
+            {
+                if (properties == null)
+                    properties = new ListDictionary();
+
+                return properties;
+            }
+        }
+        #endregion
+
+        #region Fluent Instance Modifiers
+        /// <summary>
+        /// Sets the expected result for the test
+        /// </summary>
+        /// <param name="result">The expected result</param>
+        /// <returns>A modified TestCaseData</returns>
+        public TestCaseData Returns(object result)
+        {
+            this.expectedResult = result;
+            this.hasExpectedResult = true;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the expected exception type for the test
+        /// </summary>
+        /// <param name="exceptionType">Type of the expected exception.</param>
+        /// <returns>The modified TestCaseData instance</returns>
+        public TestCaseData Throws(Type exceptionType)
+        {
+            this.expectedExceptionType = exceptionType;
+            this.expectedExceptionName = exceptionType.FullName;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the expected exception type for the test
+        /// </summary>
+        /// <param name="exceptionName">FullName of the expected exception.</param>
+        /// <returns>The modified TestCaseData instance</returns>
+        public TestCaseData Throws(string exceptionName)
+        {
+            this.expectedExceptionName = exceptionName;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the name of the test case
+        /// </summary>
+        /// <returns>The modified TestCaseData instance</returns>
+        public TestCaseData SetName(string name)
+        {
+            this.testName = name;
+            return this;
+        }
+
+        /// <summary>
+        /// Sets the description for the test case
+        /// being constructed.
+        /// </summary>
+        /// <param name="description">The description.</param>
+        /// <returns>The modified TestCaseData instance.</returns>
+        public TestCaseData SetDescription(string description)
+        {
+            this.description = description;
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a category to the test
+        /// </summary>
+        /// <param name="category"></param>
+        /// <returns></returns>
+        public TestCaseData SetCategory(string category)
+        {
+            this.Categories.Add(category);
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a named property to the test
+        /// </summary>
+        /// <param name="propName"></param>
+        /// <param name="propValue"></param>
+        /// <returns></returns>
+        public TestCaseData SetProperty(string propName, string propValue)
+        {
+            this.Properties.Add(propName, propValue);
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a named property to the test
+        /// </summary>
+        /// <param name="propName"></param>
+        /// <param name="propValue"></param>
+        /// <returns></returns>
+        public TestCaseData SetProperty(string propName, int propValue)
+        {
+            this.Properties.Add(propName, propValue);
+            return this;
+        }
+
+        /// <summary>
+        /// Applies a named property to the test
+        /// </summary>
+        /// <param name="propName"></param>
+        /// <param name="propValue"></param>
+        /// <returns></returns>
+        public TestCaseData SetProperty(string propName, double propValue)
+        {
+            this.Properties.Add(propName, propValue);
+            return this;
+        }
+
+        /// <summary>
+        /// Ignores this TestCase.
+        /// </summary>
+        /// <returns></returns>
+        public TestCaseData Ignore()
+        {
+            isIgnored = true;
+            return this;
+        }
+
+        /// <summary>
+        /// Ignores this TestCase, specifying the reason.
+        /// </summary>
+        /// <param name="reason">The reason.</param>
+        /// <returns></returns>
+        public TestCaseData Ignore(string reason)
+        {
+            isIgnored = true;
+            ignoreReason = reason;
+            return this;
+        }
+
+        /// <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 ad027cc..ee32467 100644
--- a/src/NUnitFramework/framework/TestContext.cs
+++ b/src/NUnitFramework/framework/TestContext.cs
@@ -1,242 +1,242 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Collections;
-using System.Runtime.Remoting.Messaging;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Provide the context information of the current test
-    /// </summary>
-    public class TestContext
-    {
-        private const string contextKey = "NUnit.Framework.TestContext";
-        private const string stateKey = "Result.State";
-
-        private IDictionary _context;
-
-        private TestAdapter _test;
-        private ResultAdapter _result;
-
-        #region Constructor
-
-        /// <summary>
-        /// Constructs a TestContext using the provided context dictionary
-        /// </summary>
-        /// <param name="context">A context dictionary</param>
-        public TestContext(IDictionary context)
-        {
-            _context = context;
-        }
-
-        #endregion
-
-        #region Properties
-
-        /// <summary>
-        /// Get the current test context. This is created
-        /// as needed. The user may save the context for
-        /// use within a test, but it should not be used
-        /// outside the test for which it is created.
-        /// </summary>
-        public static TestContext CurrentContext
-        {
-            get
-            {
-                return new TestContext((IDictionary)CallContext.GetData(contextKey));
-            }
-        }
-
-        /// <summary>
-        /// Gets a TestAdapter representing the currently executing test in this context.
-        /// </summary>
-        public TestAdapter Test
-        {
-            get
-            {
-                if (_test == null)
-                    _test = new TestAdapter(_context);
-
-                return _test;
-            }
-        }
-
-        /// <summary>
-        /// Gets a ResultAdapter representing the current result for the test 
-        /// executing in this context.
-        /// </summary>
-        public ResultAdapter Result
-        {
-            get
-            {
-                if (_result == null)
-                    _result = new ResultAdapter(_context);
-
-                return _result;
-            }
-        }
-
-        /// <summary>
-        /// Gets the directory containing the current test assembly.
-        /// </summary>
-        public string TestDirectory
-        {
-            get
-            {
-                return (string)_context["TestDirectory"];
-            }
-        }
-
-        /// <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
-
-        /// <summary>
-        /// TestAdapter adapts a Test for consumption by
-        /// the user test code.
-        /// </summary>
-        public class TestAdapter
-        {
-            private IDictionary _context;
-
-            #region Constructor
-
-            /// <summary>
-            /// Constructs a TestAdapter for this context
-            /// </summary>
-            /// <param name="context">The context dictionary</param>
-            public TestAdapter(IDictionary context)
-            {
-                _context = context;
-            }
-
-            #endregion
-
-            #region Properties
-
-            /// <summary>
-            /// The name of the test.
-            /// </summary>
-            public string Name
-            {
-                get
-                {
-                    return _context["Test.Name"] as string;
-                }
-            }
-
-            /// <summary>
-            /// The FullName of the test
-            /// </summary>
-            public string FullName
-            {
-                get
-                {
-                    return _context["Test.FullName"] as string;
-                }
-            }
-
-            /// <summary>
-            /// The properties of the test.
-            /// </summary>
-            public IDictionary Properties
-            {
-                get
-                {
-                    return _context["Test.Properties"] as IDictionary;
-                }
-            }
-
-            #endregion
-        }
-
-        #endregion
-
-        #region Nested ResultAdapter Class
-
-        /// <summary>
-        /// ResultAdapter adapts a TestResult for consumption by
-        /// the user test code.
-        /// </summary>
-        public class ResultAdapter
-        {
-            private IDictionary _context;
-
-            #region Constructor
-
-            /// <summary>
-            /// Construct a ResultAdapter for a context
-            /// </summary>
-            /// <param name="context">The context holding the result</param>
-            public ResultAdapter(IDictionary context)
-            {
-                this._context = context;
-            }
-
-            #endregion
-
-            #region Properties
-
-            /// <summary>
-            /// The TestState of current test. This maps to the ResultState
-            /// used in nunit.core and is subject to change in the future.
-            /// </summary>
-            public TestState State
-            {
-                get
-                {
-                    return (TestState)_context["Result.State"];
-                }
-            }
-
-            /// <summary>
-            /// The TestStatus of current test. This enum will be used
-            /// in future versions of NUnit and so is to be preferred
-            /// to the TestState value.
-            /// </summary>
-            public TestStatus Status
-            {
-                get
-                {
-                    switch (State)
-                    {
-                        default:
-                        case TestState.Inconclusive:
-                            return TestStatus.Inconclusive;
-                        case TestState.Skipped:
-                        case TestState.Ignored:
-                        case TestState.NotRunnable:
-                            return TestStatus.Skipped;
-                        case TestState.Success:
-                            return TestStatus.Passed;
-                        case TestState.Failure:
-                        case TestState.Error:
-                        case TestState.Cancelled:
-                            return TestStatus.Failed;
-                    }
-                }
-            }
-
-
-            #endregion
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Collections;
+using System.Runtime.Remoting.Messaging;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Provide the context information of the current test
+    /// </summary>
+    public class TestContext
+    {
+        private const string contextKey = "NUnit.Framework.TestContext";
+        private const string stateKey = "Result.State";
+
+        private IDictionary _context;
+
+        private TestAdapter _test;
+        private ResultAdapter _result;
+
+        #region Constructor
+
+        /// <summary>
+        /// Constructs a TestContext using the provided context dictionary
+        /// </summary>
+        /// <param name="context">A context dictionary</param>
+        public TestContext(IDictionary context)
+        {
+            _context = context;
+        }
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Get the current test context. This is created
+        /// as needed. The user may save the context for
+        /// use within a test, but it should not be used
+        /// outside the test for which it is created.
+        /// </summary>
+        public static TestContext CurrentContext
+        {
+            get
+            {
+                return new TestContext((IDictionary)CallContext.GetData(contextKey));
+            }
+        }
+
+        /// <summary>
+        /// Gets a TestAdapter representing the currently executing test in this context.
+        /// </summary>
+        public TestAdapter Test
+        {
+            get
+            {
+                if (_test == null)
+                    _test = new TestAdapter(_context);
+
+                return _test;
+            }
+        }
+
+        /// <summary>
+        /// Gets a ResultAdapter representing the current result for the test 
+        /// executing in this context.
+        /// </summary>
+        public ResultAdapter Result
+        {
+            get
+            {
+                if (_result == null)
+                    _result = new ResultAdapter(_context);
+
+                return _result;
+            }
+        }
+
+        /// <summary>
+        /// Gets the directory containing the current test assembly.
+        /// </summary>
+        public string TestDirectory
+        {
+            get
+            {
+                return (string)_context["TestDirectory"];
+            }
+        }
+
+        /// <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
+
+        /// <summary>
+        /// TestAdapter adapts a Test for consumption by
+        /// the user test code.
+        /// </summary>
+        public class TestAdapter
+        {
+            private IDictionary _context;
+
+            #region Constructor
+
+            /// <summary>
+            /// Constructs a TestAdapter for this context
+            /// </summary>
+            /// <param name="context">The context dictionary</param>
+            public TestAdapter(IDictionary context)
+            {
+                _context = context;
+            }
+
+            #endregion
+
+            #region Properties
+
+            /// <summary>
+            /// The name of the test.
+            /// </summary>
+            public string Name
+            {
+                get
+                {
+                    return _context["Test.Name"] as string;
+                }
+            }
+
+            /// <summary>
+            /// The FullName of the test
+            /// </summary>
+            public string FullName
+            {
+                get
+                {
+                    return _context["Test.FullName"] as string;
+                }
+            }
+
+            /// <summary>
+            /// The properties of the test.
+            /// </summary>
+            public IDictionary Properties
+            {
+                get
+                {
+                    return _context["Test.Properties"] as IDictionary;
+                }
+            }
+
+            #endregion
+        }
+
+        #endregion
+
+        #region Nested ResultAdapter Class
+
+        /// <summary>
+        /// ResultAdapter adapts a TestResult for consumption by
+        /// the user test code.
+        /// </summary>
+        public class ResultAdapter
+        {
+            private IDictionary _context;
+
+            #region Constructor
+
+            /// <summary>
+            /// Construct a ResultAdapter for a context
+            /// </summary>
+            /// <param name="context">The context holding the result</param>
+            public ResultAdapter(IDictionary context)
+            {
+                this._context = context;
+            }
+
+            #endregion
+
+            #region Properties
+
+            /// <summary>
+            /// The TestState of current test. This maps to the ResultState
+            /// used in nunit.core and is subject to change in the future.
+            /// </summary>
+            public TestState State
+            {
+                get
+                {
+                    return (TestState)_context["Result.State"];
+                }
+            }
+
+            /// <summary>
+            /// The TestStatus of current test. This enum will be used
+            /// in future versions of NUnit and so is to be preferred
+            /// to the TestState value.
+            /// </summary>
+            public TestStatus Status
+            {
+                get
+                {
+                    switch (State)
+                    {
+                        default:
+                        case TestState.Inconclusive:
+                            return TestStatus.Inconclusive;
+                        case TestState.Skipped:
+                        case TestState.Ignored:
+                        case TestState.NotRunnable:
+                            return TestStatus.Skipped;
+                        case TestState.Success:
+                            return TestStatus.Passed;
+                        case TestState.Failure:
+                        case TestState.Error:
+                        case TestState.Cancelled:
+                            return TestStatus.Failed;
+                    }
+                }
+            }
+
+
+            #endregion
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/TestDetails.cs b/src/NUnitFramework/framework/TestDetails.cs
index e380c4b..567bf8c 100644
--- a/src/NUnitFramework/framework/TestDetails.cs
+++ b/src/NUnitFramework/framework/TestDetails.cs
@@ -1,66 +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; }
-    }
-}
-
+// ****************************************************************
+// 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/TestState.cs b/src/NUnitFramework/framework/TestState.cs
index 2f70d4b..b65f3fd 100644
--- a/src/NUnitFramework/framework/TestState.cs
+++ b/src/NUnitFramework/framework/TestState.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// The ResultState enum indicates the result of running a test
-	/// </summary>
-	public enum TestState
-	{
-        /// <summary>
-        /// The result is inconclusive
-        /// </summary>
-        Inconclusive = 0,
-
-        /// <summary>
-        /// The test was not runnable.
-        /// </summary>
-		NotRunnable = 1, 
-
-        /// <summary>
-        /// The test has been skipped. 
-        /// </summary>
-		Skipped = 2,
-
-        /// <summary>
-        /// The test has been ignored.
-        /// </summary>
-		Ignored = 3,
-
-        /// <summary>
-        /// The test succeeded
-        /// </summary>
-		Success = 4,
-
-        /// <summary>
-        /// The test failed
-        /// </summary>
-		Failure = 5,
-
-        /// <summary>
-        /// The test encountered an unexpected exception
-        /// </summary>
-		Error = 6,
-
-        /// <summary>
-        /// The test was cancelled by the user
-        /// </summary>
-        Cancelled =7
-	}
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// The ResultState enum indicates the result of running a test
+	/// </summary>
+	public enum TestState
+	{
+        /// <summary>
+        /// The result is inconclusive
+        /// </summary>
+        Inconclusive = 0,
+
+        /// <summary>
+        /// The test was not runnable.
+        /// </summary>
+		NotRunnable = 1, 
+
+        /// <summary>
+        /// The test has been skipped. 
+        /// </summary>
+		Skipped = 2,
+
+        /// <summary>
+        /// The test has been ignored.
+        /// </summary>
+		Ignored = 3,
+
+        /// <summary>
+        /// The test succeeded
+        /// </summary>
+		Success = 4,
+
+        /// <summary>
+        /// The test failed
+        /// </summary>
+		Failure = 5,
+
+        /// <summary>
+        /// The test encountered an unexpected exception
+        /// </summary>
+		Error = 6,
+
+        /// <summary>
+        /// The test was cancelled by the user
+        /// </summary>
+        Cancelled =7
+	}
+}
diff --git a/src/NUnitFramework/framework/TestStatus.cs b/src/NUnitFramework/framework/TestStatus.cs
index cf180c6..707a28b 100644
--- a/src/NUnitFramework/framework/TestStatus.cs
+++ b/src/NUnitFramework/framework/TestStatus.cs
@@ -1,34 +1,34 @@
-// ****************************************************************
-// 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
-{
-    /// <summary>
-    /// The TestStatus enum indicates the result of running a test
-    /// </summary>
-    public enum TestStatus
-    {
-        /// <summary>
-        /// The test was inconclusive
-        /// </summary>
-        Inconclusive = 0,
-
-        /// <summary>
-        /// The test has skipped 
-        /// </summary>
-        Skipped = 1,
-
-        /// <summary>
-        /// The test succeeded
-        /// </summary>
-        Passed = 2,
-
-        /// <summary>
-        /// The test failed
-        /// </summary>
-        Failed = 3
-    }
-}
+// ****************************************************************
+// 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
+{
+    /// <summary>
+    /// The TestStatus enum indicates the result of running a test
+    /// </summary>
+    public enum TestStatus
+    {
+        /// <summary>
+        /// The test was inconclusive
+        /// </summary>
+        Inconclusive = 0,
+
+        /// <summary>
+        /// The test has skipped 
+        /// </summary>
+        Skipped = 1,
+
+        /// <summary>
+        /// The test succeeded
+        /// </summary>
+        Passed = 2,
+
+        /// <summary>
+        /// The test failed
+        /// </summary>
+        Failed = 3
+    }
+}
diff --git a/src/NUnitFramework/framework/Text.cs b/src/NUnitFramework/framework/Text.cs
index a595c3b..1183e3b 100644
--- a/src/NUnitFramework/framework/Text.cs
+++ b/src/NUnitFramework/framework/Text.cs
@@ -1,146 +1,146 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Helper class with static methods used to supply constraints
-    /// that operate on strings.
-    /// </summary>
-    [Obsolete("Use Is class for string constraints")]
-    public class Text
-    {
-        #region All
-        
-        /// <summary>
-        /// Returns a ConstraintExpression, which will apply
-        /// the following constraint to all members of a collection,
-        /// succeeding if all of them succeed.
-        /// </summary>
-        [Obsolete("Use Is.All")]
-        public static ConstraintExpression All
-        {
-            get { return new ConstraintExpression().All; }
-        }
-        
-        #endregion
-        
-        #region Contains
-        
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        [Obsolete("Use Is.StringContaining")]
-        public static SubstringConstraint Contains(string expected)
-        {
-            return new SubstringConstraint(expected);
-        }
-        
-        #endregion
-        
-        #region DoesNotContain
-        
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value contains the substring supplied as an argument.
-        /// </summary>
-        [Obsolete("Use Is.Not.StringContaining")]
-        public static SubstringConstraint DoesNotContain(string expected)
-        {
-            return new ConstraintExpression().Not.ContainsSubstring(expected);
-        }
-        
-        #endregion
-        
-        #region StartsWith
-        
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        [Obsolete("Use Is.StringStarting")]
-        public static StartsWithConstraint StartsWith(string expected)
-        {
-            return new StartsWithConstraint(expected);
-        }
-        
-        #endregion
-        
-        #region DoesNotStartWith
-        
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value starts with the substring supplied as an argument.
-        /// </summary>
-        public static StartsWithConstraint DoesNotStartWith(string expected)
-        {
-            return new ConstraintExpression().Not.StartsWith(expected);
-        }
-        
-        #endregion
-        
-        #region EndsWith
-        
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        [Obsolete("Use Is.StringEnding")]
-        public static EndsWithConstraint EndsWith(string expected)
-        {
-            return new EndsWithConstraint(expected);
-        }
-        
-        #endregion
-        
-        #region DoesNotEndWith
-        
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value ends with the substring supplied as an argument.
-        /// </summary>
-        public static EndsWithConstraint DoesNotEndWith(string expected)
-        {
-            return new ConstraintExpression().Not.EndsWith(expected);
-        }
-        
-        #endregion
-        
-        #region Matches
-        
-        /// <summary>
-        /// Returns a constraint that succeeds if the actual
-        /// value matches the Regex pattern supplied as an argument.
-        /// </summary>
-        [Obsolete("Use Is.StringMatching")]
-        public static RegexConstraint Matches(string pattern)
-        {
-            return new RegexConstraint(pattern);
-        }
-        
-        #endregion
-        
-        #region DoesNotMatch
-        
-        /// <summary>
-        /// Returns a constraint that fails if the actual
-        /// value matches the pattern supplied as an argument.
-        /// </summary>
-        [Obsolete]
-        public static RegexConstraint DoesNotMatch(string pattern)
-        {
-            return new ConstraintExpression().Not.Matches(pattern);
-        }
-        
-        #endregion
-        
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with static methods used to supply constraints
+    /// that operate on strings.
+    /// </summary>
+    [Obsolete("Use Is class for string constraints")]
+    public class Text
+    {
+        #region All
+        
+        /// <summary>
+        /// Returns a ConstraintExpression, which will apply
+        /// the following constraint to all members of a collection,
+        /// succeeding if all of them succeed.
+        /// </summary>
+        [Obsolete("Use Is.All")]
+        public static ConstraintExpression All
+        {
+            get { return new ConstraintExpression().All; }
+        }
+        
+        #endregion
+        
+        #region Contains
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringContaining")]
+        public static SubstringConstraint Contains(string expected)
+        {
+            return new SubstringConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotContain
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value contains the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.Not.StringContaining")]
+        public static SubstringConstraint DoesNotContain(string expected)
+        {
+            return new ConstraintExpression().Not.ContainsSubstring(expected);
+        }
+        
+        #endregion
+        
+        #region StartsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringStarting")]
+        public static StartsWithConstraint StartsWith(string expected)
+        {
+            return new StartsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotStartWith
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value starts with the substring supplied as an argument.
+        /// </summary>
+        public static StartsWithConstraint DoesNotStartWith(string expected)
+        {
+            return new ConstraintExpression().Not.StartsWith(expected);
+        }
+        
+        #endregion
+        
+        #region EndsWith
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringEnding")]
+        public static EndsWithConstraint EndsWith(string expected)
+        {
+            return new EndsWithConstraint(expected);
+        }
+        
+        #endregion
+        
+        #region DoesNotEndWith
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value ends with the substring supplied as an argument.
+        /// </summary>
+        public static EndsWithConstraint DoesNotEndWith(string expected)
+        {
+            return new ConstraintExpression().Not.EndsWith(expected);
+        }
+        
+        #endregion
+        
+        #region Matches
+        
+        /// <summary>
+        /// Returns a constraint that succeeds if the actual
+        /// value matches the Regex pattern supplied as an argument.
+        /// </summary>
+        [Obsolete("Use Is.StringMatching")]
+        public static RegexConstraint Matches(string pattern)
+        {
+            return new RegexConstraint(pattern);
+        }
+        
+        #endregion
+        
+        #region DoesNotMatch
+        
+        /// <summary>
+        /// Returns a constraint that fails if the actual
+        /// value matches the pattern supplied as an argument.
+        /// </summary>
+        [Obsolete]
+        public static RegexConstraint DoesNotMatch(string pattern)
+        {
+            return new ConstraintExpression().Not.Matches(pattern);
+        }
+        
+        #endregion
+        
+    }
+}
diff --git a/src/NUnitFramework/framework/TextMessageWriter.cs b/src/NUnitFramework/framework/TextMessageWriter.cs
index 927a77f..dd175d2 100644
--- a/src/NUnitFramework/framework/TextMessageWriter.cs
+++ b/src/NUnitFramework/framework/TextMessageWriter.cs
@@ -1,472 +1,472 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Globalization;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-	/// <summary>
-	/// TextMessageWriter writes constraint descriptions and messages
-	/// in displayable form as a text stream. It tailors the display
-	/// of individual message components to form the standard message
-	/// format of NUnit assertion failure messages.
-	/// </summary>
-    public class TextMessageWriter : MessageWriter
-    {
-        #region Message Formats and Constants
-        private static readonly int DEFAULT_LINE_LENGTH = 78;
-
-		// Prefixes used in all failure messages. All must be the same
-		// length, which is held in the PrefixLength field. Should not
-		// contain any tabs or newline characters.
-		/// <summary>
-		/// Prefix used for the expected value line of a message
-		/// </summary>
-		public static readonly string Pfx_Expected = "  Expected: ";
-		/// <summary>
-		/// Prefix used for the actual value line of a message
-		/// </summary>
-		public static readonly string Pfx_Actual = "  But was:  ";
-		/// <summary>
-		/// Length of a message prefix
-		/// </summary>
-		public static readonly int PrefixLength = Pfx_Expected.Length;
-		
-		private static readonly string Fmt_Connector = " {0} ";
-        private static readonly string Fmt_Predicate = "{0} ";
-        //private static readonly string Fmt_Label = "{0}";
-		private static readonly string Fmt_Modifier = ", {0}";
-
-        private static readonly string Fmt_Null = "null";
-        private static readonly string Fmt_EmptyString = "<string.Empty>";
-        private static readonly string Fmt_EmptyCollection = "<empty>";
-
-        private static readonly string Fmt_String = "\"{0}\"";
-        private static readonly string Fmt_Char = "'{0}'";
-		private static readonly string Fmt_DateTime = "yyyy-MM-dd HH:mm:ss.fff";
-        private static readonly string Fmt_ValueType = "{0}";
-        private static readonly string Fmt_Default = "<{0}>";
-        #endregion
-
-		private int maxLineLength = DEFAULT_LINE_LENGTH;
-
-        #region Constructors
-		/// <summary>
-		/// Construct a TextMessageWriter
-		/// </summary>
-        public TextMessageWriter() { }
-
-        /// <summary>
-        /// Construct a TextMessageWriter, specifying a user message
-        /// and optional formatting arguments.
-        /// </summary>
-        /// <param name="userMessage"></param>
-        /// <param name="args"></param>
-		public TextMessageWriter(string userMessage, params object[] args)
-        {
-			if ( userMessage != null && userMessage != string.Empty)
-				this.WriteMessageLine(userMessage, args);
-        }
-        #endregion
-
-        #region Properties
-        /// <summary>
-        /// Gets or sets the maximum line length for this writer
-        /// </summary>
-        public override int MaxLineLength
-        {
-            get { return maxLineLength; }
-            set { maxLineLength = value; }
-        }
-        #endregion
-
-        #region Public Methods - High Level
-        /// <summary>
-        /// Method to write single line  message with optional args, usually
-        /// written to precede the general failure message, at a givel 
-        /// indentation level.
-        /// </summary>
-        /// <param name="level">The indentation level of the message</param>
-        /// <param name="message">The message to be written</param>
-        /// <param name="args">Any arguments used in formatting the message</param>
-        public override void WriteMessageLine(int level, string message, params object[] args)
-        {
-            if (message != null)
-            {
-                while (level-- >= 0) Write("  ");
-
-                if (args != null && args.Length > 0)
-                    message = string.Format(message, args);
-
-                WriteLine(message);
-            }
-        }
-
-        /// <summary>
-        /// Display Expected and Actual lines for a constraint. This
-        /// is called by MessageWriter's default implementation of 
-        /// WriteMessageTo and provides the generic two-line display. 
-        /// </summary>
-        /// <param name="constraint">The constraint that failed</param>
-        public override void DisplayDifferences(Constraint constraint)
-        {
-            WriteExpectedLine(constraint);
-            WriteActualLine(constraint);
-        }
-
-		/// <summary>
-		/// Display Expected and Actual lines for given values. This
-		/// method may be called by constraints that need more control over
-		/// the display of actual and expected values than is provided
-		/// by the default implementation.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value causing the failure</param>
-		public override void DisplayDifferences(object expected, object actual)
-		{
-			WriteExpectedLine(expected);
-			WriteActualLine(actual);
-		}
-
-		/// <summary>
-		/// Display Expected and Actual lines for given values, including
-		/// a tolerance value on the expected line.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="actual">The actual value causing the failure</param>
-		/// <param name="tolerance">The tolerance within which the test was made</param>
-		public override void DisplayDifferences(object expected, object actual, Tolerance tolerance)
-		{
-			WriteExpectedLine(expected, tolerance);
-			WriteActualLine(actual);
-		}
-
-		/// <summary>
-        /// Display the expected and actual string values on separate lines.
-        /// If the mismatch parameter is >=0, an additional line is displayed
-        /// line containing a caret that points to the mismatch point.
-        /// </summary>
-        /// <param name="expected">The expected string value</param>
-        /// <param name="actual">The actual string value</param>
-        /// <param name="mismatch">The point at which the strings don't match or -1</param>
-        /// <param name="ignoreCase">If true, case is ignored in string comparisons</param>
-        /// <param name="clipping">If true, clip the strings to fit the max line length</param>
-        public override void DisplayStringDifferences(string expected, string actual, int mismatch, bool ignoreCase, bool clipping)
-        {
-            // Maximum string we can display without truncating
-            int maxDisplayLength = MaxLineLength
-                - PrefixLength   // Allow for prefix
-                - 2;             // 2 quotation marks
-
-            if ( clipping )
-                MsgUtils.ClipExpectedAndActual(ref expected, ref actual, maxDisplayLength, mismatch);
-
-            expected = MsgUtils.EscapeControlChars(expected);
-            actual = MsgUtils.EscapeControlChars(actual);
-
-            // The mismatch position may have changed due to clipping or white space conversion
-            mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, ignoreCase);
-
-			Write( Pfx_Expected );
-			WriteExpectedValue( expected );
-			if ( ignoreCase )
-				WriteModifier( "ignoring case" );
-			WriteLine();
-			WriteActualLine( actual );
-            //DisplayDifferences(expected, actual);
-            if (mismatch >= 0)
-                WriteCaretLine(mismatch);
-        }
-        #endregion
-
-        #region Public Methods - Low Level
-		/// <summary>
-		/// Writes the text for a connector.
-		/// </summary>
-		/// <param name="connector">The connector.</param>
-		public override void WriteConnector(string connector)
-        {
-            Write(Fmt_Connector, connector);
-        }
-
-		/// <summary>
-		/// Writes the text for a predicate.
-		/// </summary>
-		/// <param name="predicate">The predicate.</param>
-		public override void WritePredicate(string predicate)
-        {
-            Write(Fmt_Predicate, predicate);
-        }
-
-        //public override void WriteLabel(string label)
-        //{
-        //    Write(Fmt_Label, label);
-        //}
-
-        /// <summary>
-        /// Write the text for a modifier.
-        /// </summary>
-        /// <param name="modifier">The modifier.</param>
-		public override void WriteModifier(string modifier)
-		{
-			Write(Fmt_Modifier, modifier);
-		}
-
-
-		/// <summary>
-		/// Writes the text for an expected value.
-		/// </summary>
-		/// <param name="expected">The expected value.</param>
-		public override void WriteExpectedValue(object expected)
-        {
-            WriteValue(expected);
-        }
-
-		/// <summary>
-		/// Writes the text for an actual value.
-		/// </summary>
-		/// <param name="actual">The actual value.</param>
-		public override void WriteActualValue(object actual)
-        {
-            WriteValue(actual);
-        }
-
-		/// <summary>
-		/// Writes the text for a generalized value.
-		/// </summary>
-		/// <param name="val">The value.</param>
-		public override void WriteValue(object val)
-        {
-            if (val == null)
-                Write(Fmt_Null);
-            else if (val.GetType().IsArray)
-                WriteArray((Array)val);
-            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)
-                WriteDouble((double)val);
-            else if (val is float)
-                WriteFloat((float)val);
-            else if (val is decimal)
-                WriteDecimal((decimal)val);
-			else if (val is DateTime)
-				WriteDateTime((DateTime)val);
-            else if (val.GetType().IsValueType)
-                Write(Fmt_ValueType, val);
-            else
-                Write(Fmt_Default, val);
-        }
-
-        /// <summary>
-        /// Writes the text for a collection value,
-        /// starting at a particular point, to a max length
-        /// </summary>
-        /// <param name="collection">The collection containing elements to write.</param>
-        /// <param name="start">The starting point of the elements to write</param>
-        /// <param name="max">The maximum number of elements to write</param>
-		public override void WriteCollectionElements(IEnumerable collection, int start, int max)
-		{
-			int count = 0;
-			int index = 0;
-
-			foreach (object obj in collection)
-			{
-				if ( index++ >= start)
-				{
-                    if (++count > max)
-                        break;
-                    Write(count == 1 ? "< " : ", ");
-                    WriteValue(obj);
-				}
-			}
-
-            if (count == 0)
-            {
-                Write(Fmt_EmptyCollection);
-                return;
-            }
-
-            if (count > max)
-				Write("...");
-
-			Write(" >");
-		}
-
-		private void WriteArray(Array array)
-        {
-			if ( array.Length == 0 )
-			{
-				Write( Fmt_EmptyCollection );
-				return;
-			}
-			
-			int rank = array.Rank;
-            int[] products = new int[rank];
-
-            for (int product = 1, r = rank; --r >= 0; )
-                products[r] = product *= array.GetLength(r);
-
-            int count = 0;
-            foreach (object obj in array)
-            {
-                if (count > 0)
-                    Write(", ");
-
-                bool startSegment = false;
-                for (int r = 0; r < rank; r++)
-                {
-                    startSegment = startSegment || count % products[r] == 0;
-                    if (startSegment) Write("< ");
-                }
-
-                WriteValue(obj);
-
-                ++count;
-
-                bool nextSegment = false;
-                for (int r = 0; r < rank; r++)
-                {
-                    nextSegment = nextSegment || count % products[r] == 0;
-                    if (nextSegment) Write(" >");
-                }
-            }
-        }
-
-        private void WriteString(string s)
-        {
-            if (s == string.Empty)
-                Write(Fmt_EmptyString);
-            else
-                Write(Fmt_String, s);
-        }
-
-        private void WriteChar(char c)
-        {
-            Write(Fmt_Char, c);
-        }
-
-        private void WriteDouble(double d)
-        {
-
-            if (double.IsNaN(d) || double.IsInfinity(d))
-                Write(d);
-            else
-            {
-                string s = d.ToString("G17", CultureInfo.InvariantCulture);
-
-                if (s.IndexOf('.') > 0)
-                    Write(s + "d");
-                else
-                    Write(s + ".0d");
-            }
-        }
-
-        private void WriteFloat(float f)
-        {
-            if (float.IsNaN(f) || float.IsInfinity(f))
-                Write(f);
-            else
-            {
-                string s = f.ToString("G9", CultureInfo.InvariantCulture);
-
-                if (s.IndexOf('.') > 0)
-                    Write(s + "f");
-                else
-                    Write(s + ".0f");
-            }
-        }
-
-        private void WriteDecimal(Decimal d)
-        {
-            Write(d.ToString("G29", CultureInfo.InvariantCulture) + "m");
-        }
-
-		private void WriteDateTime(DateTime dt)
-		{
-			Write(dt.ToString(Fmt_DateTime, CultureInfo.InvariantCulture));
-		}
-        #endregion
-
-        #region Helper Methods
-        /// <summary>
-        /// Write the generic 'Expected' line for a constraint
-        /// </summary>
-        /// <param name="constraint">The constraint that failed</param>
-        private void WriteExpectedLine(Constraint constraint)
-        {
-            Write(Pfx_Expected);
-            constraint.WriteDescriptionTo(this);
-            WriteLine();
-        }
-
-		/// <summary>
-		/// Write the generic 'Expected' line for a given value
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		private void WriteExpectedLine(object expected)
-		{
-            WriteExpectedLine(expected, null);
-		}
-
-		/// <summary>
-		/// Write the generic 'Expected' line for a given value
-		/// and tolerance.
-		/// </summary>
-		/// <param name="expected">The expected value</param>
-		/// <param name="tolerance">The tolerance within which the test was made</param>
-		private void WriteExpectedLine(object expected, Tolerance tolerance)
-		{
-			Write(Pfx_Expected);
-			WriteExpectedValue(expected);
-
-            if (tolerance != null && !tolerance.IsEmpty)
-            {
-                WriteConnector("+/-");
-                WriteExpectedValue(tolerance.Value);
-                if (tolerance.Mode != ToleranceMode.Linear)
-                    Write(" {0}", tolerance.Mode);
-            }
-
-			WriteLine();
-		}
-
-		/// <summary>
-		/// Write the generic 'Actual' line for a constraint
-		/// </summary>
-		/// <param name="constraint">The constraint for which the actual value is to be written</param>
-		private void WriteActualLine(Constraint constraint)
-		{
-			Write(Pfx_Actual);
-			constraint.WriteActualValueTo(this);
-			WriteLine();
-		}
-
-		/// <summary>
-		/// Write the generic 'Actual' line for a given value
-		/// </summary>
-		/// <param name="actual">The actual value causing a failure</param>
-		private void WriteActualLine(object actual)
-		{
-			Write(Pfx_Actual);
-			WriteActualValue(actual);
-			WriteLine();
-		}
-
-		private void WriteCaretLine(int mismatch)
-        {
-            // We subtract 2 for the initial 2 blanks and add back 1 for the initial quote
-            WriteLine("  {0}^", new string('-', PrefixLength + mismatch - 2 + 1));
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Globalization;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+	/// <summary>
+	/// TextMessageWriter writes constraint descriptions and messages
+	/// in displayable form as a text stream. It tailors the display
+	/// of individual message components to form the standard message
+	/// format of NUnit assertion failure messages.
+	/// </summary>
+    public class TextMessageWriter : MessageWriter
+    {
+        #region Message Formats and Constants
+        private static readonly int DEFAULT_LINE_LENGTH = 78;
+
+		// Prefixes used in all failure messages. All must be the same
+		// length, which is held in the PrefixLength field. Should not
+		// contain any tabs or newline characters.
+		/// <summary>
+		/// Prefix used for the expected value line of a message
+		/// </summary>
+		public static readonly string Pfx_Expected = "  Expected: ";
+		/// <summary>
+		/// Prefix used for the actual value line of a message
+		/// </summary>
+		public static readonly string Pfx_Actual = "  But was:  ";
+		/// <summary>
+		/// Length of a message prefix
+		/// </summary>
+		public static readonly int PrefixLength = Pfx_Expected.Length;
+		
+		private static readonly string Fmt_Connector = " {0} ";
+        private static readonly string Fmt_Predicate = "{0} ";
+        //private static readonly string Fmt_Label = "{0}";
+		private static readonly string Fmt_Modifier = ", {0}";
+
+        private static readonly string Fmt_Null = "null";
+        private static readonly string Fmt_EmptyString = "<string.Empty>";
+        private static readonly string Fmt_EmptyCollection = "<empty>";
+
+        private static readonly string Fmt_String = "\"{0}\"";
+        private static readonly string Fmt_Char = "'{0}'";
+		private static readonly string Fmt_DateTime = "yyyy-MM-dd HH:mm:ss.fff";
+        private static readonly string Fmt_ValueType = "{0}";
+        private static readonly string Fmt_Default = "<{0}>";
+        #endregion
+
+		private int maxLineLength = DEFAULT_LINE_LENGTH;
+
+        #region Constructors
+		/// <summary>
+		/// Construct a TextMessageWriter
+		/// </summary>
+        public TextMessageWriter() { }
+
+        /// <summary>
+        /// Construct a TextMessageWriter, specifying a user message
+        /// and optional formatting arguments.
+        /// </summary>
+        /// <param name="userMessage"></param>
+        /// <param name="args"></param>
+		public TextMessageWriter(string userMessage, params object[] args)
+        {
+			if ( userMessage != null && userMessage != string.Empty)
+				this.WriteMessageLine(userMessage, args);
+        }
+        #endregion
+
+        #region Properties
+        /// <summary>
+        /// Gets or sets the maximum line length for this writer
+        /// </summary>
+        public override int MaxLineLength
+        {
+            get { return maxLineLength; }
+            set { maxLineLength = value; }
+        }
+        #endregion
+
+        #region Public Methods - High Level
+        /// <summary>
+        /// Method to write single line  message with optional args, usually
+        /// written to precede the general failure message, at a givel 
+        /// indentation level.
+        /// </summary>
+        /// <param name="level">The indentation level of the message</param>
+        /// <param name="message">The message to be written</param>
+        /// <param name="args">Any arguments used in formatting the message</param>
+        public override void WriteMessageLine(int level, string message, params object[] args)
+        {
+            if (message != null)
+            {
+                while (level-- >= 0) Write("  ");
+
+                if (args != null && args.Length > 0)
+                    message = string.Format(message, args);
+
+                WriteLine(message);
+            }
+        }
+
+        /// <summary>
+        /// Display Expected and Actual lines for a constraint. This
+        /// is called by MessageWriter's default implementation of 
+        /// WriteMessageTo and provides the generic two-line display. 
+        /// </summary>
+        /// <param name="constraint">The constraint that failed</param>
+        public override void DisplayDifferences(Constraint constraint)
+        {
+            WriteExpectedLine(constraint);
+            WriteActualLine(constraint);
+        }
+
+		/// <summary>
+		/// Display Expected and Actual lines for given values. This
+		/// method may be called by constraints that need more control over
+		/// the display of actual and expected values than is provided
+		/// by the default implementation.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="actual">The actual value causing the failure</param>
+		public override void DisplayDifferences(object expected, object actual)
+		{
+			WriteExpectedLine(expected);
+			WriteActualLine(actual);
+		}
+
+		/// <summary>
+		/// Display Expected and Actual lines for given values, including
+		/// a tolerance value on the expected line.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="actual">The actual value causing the failure</param>
+		/// <param name="tolerance">The tolerance within which the test was made</param>
+		public override void DisplayDifferences(object expected, object actual, Tolerance tolerance)
+		{
+			WriteExpectedLine(expected, tolerance);
+			WriteActualLine(actual);
+		}
+
+		/// <summary>
+        /// Display the expected and actual string values on separate lines.
+        /// If the mismatch parameter is >=0, an additional line is displayed
+        /// line containing a caret that points to the mismatch point.
+        /// </summary>
+        /// <param name="expected">The expected string value</param>
+        /// <param name="actual">The actual string value</param>
+        /// <param name="mismatch">The point at which the strings don't match or -1</param>
+        /// <param name="ignoreCase">If true, case is ignored in string comparisons</param>
+        /// <param name="clipping">If true, clip the strings to fit the max line length</param>
+        public override void DisplayStringDifferences(string expected, string actual, int mismatch, bool ignoreCase, bool clipping)
+        {
+            // Maximum string we can display without truncating
+            int maxDisplayLength = MaxLineLength
+                - PrefixLength   // Allow for prefix
+                - 2;             // 2 quotation marks
+
+            if ( clipping )
+                MsgUtils.ClipExpectedAndActual(ref expected, ref actual, maxDisplayLength, mismatch);
+
+            expected = MsgUtils.EscapeControlChars(expected);
+            actual = MsgUtils.EscapeControlChars(actual);
+
+            // The mismatch position may have changed due to clipping or white space conversion
+            mismatch = MsgUtils.FindMismatchPosition(expected, actual, 0, ignoreCase);
+
+			Write( Pfx_Expected );
+			WriteExpectedValue( expected );
+			if ( ignoreCase )
+				WriteModifier( "ignoring case" );
+			WriteLine();
+			WriteActualLine( actual );
+            //DisplayDifferences(expected, actual);
+            if (mismatch >= 0)
+                WriteCaretLine(mismatch);
+        }
+        #endregion
+
+        #region Public Methods - Low Level
+		/// <summary>
+		/// Writes the text for a connector.
+		/// </summary>
+		/// <param name="connector">The connector.</param>
+		public override void WriteConnector(string connector)
+        {
+            Write(Fmt_Connector, connector);
+        }
+
+		/// <summary>
+		/// Writes the text for a predicate.
+		/// </summary>
+		/// <param name="predicate">The predicate.</param>
+		public override void WritePredicate(string predicate)
+        {
+            Write(Fmt_Predicate, predicate);
+        }
+
+        //public override void WriteLabel(string label)
+        //{
+        //    Write(Fmt_Label, label);
+        //}
+
+        /// <summary>
+        /// Write the text for a modifier.
+        /// </summary>
+        /// <param name="modifier">The modifier.</param>
+		public override void WriteModifier(string modifier)
+		{
+			Write(Fmt_Modifier, modifier);
+		}
+
+
+		/// <summary>
+		/// Writes the text for an expected value.
+		/// </summary>
+		/// <param name="expected">The expected value.</param>
+		public override void WriteExpectedValue(object expected)
+        {
+            WriteValue(expected);
+        }
+
+		/// <summary>
+		/// Writes the text for an actual value.
+		/// </summary>
+		/// <param name="actual">The actual value.</param>
+		public override void WriteActualValue(object actual)
+        {
+            WriteValue(actual);
+        }
+
+		/// <summary>
+		/// Writes the text for a generalized value.
+		/// </summary>
+		/// <param name="val">The value.</param>
+		public override void WriteValue(object val)
+        {
+            if (val == null)
+                Write(Fmt_Null);
+            else if (val.GetType().IsArray)
+                WriteArray((Array)val);
+            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)
+                WriteDouble((double)val);
+            else if (val is float)
+                WriteFloat((float)val);
+            else if (val is decimal)
+                WriteDecimal((decimal)val);
+			else if (val is DateTime)
+				WriteDateTime((DateTime)val);
+            else if (val.GetType().IsValueType)
+                Write(Fmt_ValueType, val);
+            else
+                Write(Fmt_Default, val);
+        }
+
+        /// <summary>
+        /// Writes the text for a collection value,
+        /// starting at a particular point, to a max length
+        /// </summary>
+        /// <param name="collection">The collection containing elements to write.</param>
+        /// <param name="start">The starting point of the elements to write</param>
+        /// <param name="max">The maximum number of elements to write</param>
+		public override void WriteCollectionElements(IEnumerable collection, int start, int max)
+		{
+			int count = 0;
+			int index = 0;
+
+			foreach (object obj in collection)
+			{
+				if ( index++ >= start)
+				{
+                    if (++count > max)
+                        break;
+                    Write(count == 1 ? "< " : ", ");
+                    WriteValue(obj);
+				}
+			}
+
+            if (count == 0)
+            {
+                Write(Fmt_EmptyCollection);
+                return;
+            }
+
+            if (count > max)
+				Write("...");
+
+			Write(" >");
+		}
+
+		private void WriteArray(Array array)
+        {
+			if ( array.Length == 0 )
+			{
+				Write( Fmt_EmptyCollection );
+				return;
+			}
+			
+			int rank = array.Rank;
+            int[] products = new int[rank];
+
+            for (int product = 1, r = rank; --r >= 0; )
+                products[r] = product *= array.GetLength(r);
+
+            int count = 0;
+            foreach (object obj in array)
+            {
+                if (count > 0)
+                    Write(", ");
+
+                bool startSegment = false;
+                for (int r = 0; r < rank; r++)
+                {
+                    startSegment = startSegment || count % products[r] == 0;
+                    if (startSegment) Write("< ");
+                }
+
+                WriteValue(obj);
+
+                ++count;
+
+                bool nextSegment = false;
+                for (int r = 0; r < rank; r++)
+                {
+                    nextSegment = nextSegment || count % products[r] == 0;
+                    if (nextSegment) Write(" >");
+                }
+            }
+        }
+
+        private void WriteString(string s)
+        {
+            if (s == string.Empty)
+                Write(Fmt_EmptyString);
+            else
+                Write(Fmt_String, s);
+        }
+
+        private void WriteChar(char c)
+        {
+            Write(Fmt_Char, c);
+        }
+
+        private void WriteDouble(double d)
+        {
+
+            if (double.IsNaN(d) || double.IsInfinity(d))
+                Write(d);
+            else
+            {
+                string s = d.ToString("G17", CultureInfo.InvariantCulture);
+
+                if (s.IndexOf('.') > 0)
+                    Write(s + "d");
+                else
+                    Write(s + ".0d");
+            }
+        }
+
+        private void WriteFloat(float f)
+        {
+            if (float.IsNaN(f) || float.IsInfinity(f))
+                Write(f);
+            else
+            {
+                string s = f.ToString("G9", CultureInfo.InvariantCulture);
+
+                if (s.IndexOf('.') > 0)
+                    Write(s + "f");
+                else
+                    Write(s + ".0f");
+            }
+        }
+
+        private void WriteDecimal(Decimal d)
+        {
+            Write(d.ToString("G29", CultureInfo.InvariantCulture) + "m");
+        }
+
+		private void WriteDateTime(DateTime dt)
+		{
+			Write(dt.ToString(Fmt_DateTime, CultureInfo.InvariantCulture));
+		}
+        #endregion
+
+        #region Helper Methods
+        /// <summary>
+        /// Write the generic 'Expected' line for a constraint
+        /// </summary>
+        /// <param name="constraint">The constraint that failed</param>
+        private void WriteExpectedLine(Constraint constraint)
+        {
+            Write(Pfx_Expected);
+            constraint.WriteDescriptionTo(this);
+            WriteLine();
+        }
+
+		/// <summary>
+		/// Write the generic 'Expected' line for a given value
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		private void WriteExpectedLine(object expected)
+		{
+            WriteExpectedLine(expected, null);
+		}
+
+		/// <summary>
+		/// Write the generic 'Expected' line for a given value
+		/// and tolerance.
+		/// </summary>
+		/// <param name="expected">The expected value</param>
+		/// <param name="tolerance">The tolerance within which the test was made</param>
+		private void WriteExpectedLine(object expected, Tolerance tolerance)
+		{
+			Write(Pfx_Expected);
+			WriteExpectedValue(expected);
+
+            if (tolerance != null && !tolerance.IsEmpty)
+            {
+                WriteConnector("+/-");
+                WriteExpectedValue(tolerance.Value);
+                if (tolerance.Mode != ToleranceMode.Linear)
+                    Write(" {0}", tolerance.Mode);
+            }
+
+			WriteLine();
+		}
+
+		/// <summary>
+		/// Write the generic 'Actual' line for a constraint
+		/// </summary>
+		/// <param name="constraint">The constraint for which the actual value is to be written</param>
+		private void WriteActualLine(Constraint constraint)
+		{
+			Write(Pfx_Actual);
+			constraint.WriteActualValueTo(this);
+			WriteLine();
+		}
+
+		/// <summary>
+		/// Write the generic 'Actual' line for a given value
+		/// </summary>
+		/// <param name="actual">The actual value causing a failure</param>
+		private void WriteActualLine(object actual)
+		{
+			Write(Pfx_Actual);
+			WriteActualValue(actual);
+			WriteLine();
+		}
+
+		private void WriteCaretLine(int mismatch)
+        {
+            // We subtract 2 for the initial 2 blanks and add back 1 for the initial quote
+            WriteLine("  {0}^", new string('-', PrefixLength + mismatch - 2 + 1));
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/framework/Throws.cs b/src/NUnitFramework/framework/Throws.cs
index 73feed8..5c826db 100644
--- a/src/NUnitFramework/framework/Throws.cs
+++ b/src/NUnitFramework/framework/Throws.cs
@@ -1,136 +1,136 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework
-{
-    /// <summary>
-    /// Helper class with properties and methods that supply
-    /// constraints that operate on exceptions.
-    /// </summary>
-    public class Throws
-    {
-        #region Exception
-
-        /// <summary>
-        /// Creates a constraint specifying an expected exception
-        /// </summary>
-        public static ResolvableConstraintExpression Exception
-        {
-            get { return new ConstraintExpression().Append(new ThrowsOperator()); }
-        }
-
-        #endregion
-
-        #region InnerException
-
-        /// <summary>
-        /// Creates a constraint specifying an exception with a given InnerException
-        /// </summary>
-        public static ResolvableConstraintExpression InnerException
-        {
-            get { return Exception.InnerException; }
-        }
-
-        #endregion
-
-        #region TargetInvocationException
-
-        /// <summary>
-        /// Creates a constraint specifying an expected TargetInvocationException
-        /// </summary>
-        public static ExactTypeConstraint TargetInvocationException
-        {
-            get { return TypeOf(typeof(System.Reflection.TargetInvocationException)); }
-        }
-
-        #endregion
-
-        #region ArgumentException
-
-        /// <summary>
-        /// Creates a constraint specifying an expected TargetInvocationException
-        /// </summary>
-        public static ExactTypeConstraint ArgumentException
-        {
-            get { return TypeOf(typeof(System.ArgumentException)); }
-        }
-
-        #endregion
-
-        #region InvalidOperationException
-
-        /// <summary>
-        /// Creates a constraint specifying an expected TargetInvocationException
-        /// </summary>
-        public static ExactTypeConstraint InvalidOperationException
-        {
-            get { return TypeOf(typeof(System.InvalidOperationException)); }
-        }
-
-        #endregion
-
-        #region Nothing
-
-        /// <summary>
-        /// Creates a constraint specifying that no exception is thrown
-        /// </summary>
-        public static ThrowsNothingConstraint Nothing
-        {
-            get { return new ThrowsNothingConstraint(); }
-        }
-
-        #endregion
-
-        #region TypeOf
-
-        /// <summary>
-        /// Creates a constraint specifying the exact type of exception expected
-        /// </summary>
-        public static ExactTypeConstraint TypeOf(Type expectedType)
-        {
-            return Exception.TypeOf(expectedType);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Creates a constraint specifying the exact type of exception expected
-        /// </summary>
-        public static ExactTypeConstraint TypeOf<T>()
-        {
-            return TypeOf(typeof(T));
-        }
-#endif
-
-        #endregion
-
-        #region InstanceOf
-
-        /// <summary>
-        /// Creates a constraint specifying the type of exception expected
-        /// </summary>
-        public static InstanceOfTypeConstraint InstanceOf(Type expectedType)
-        {
-            return Exception.InstanceOf(expectedType);
-        }
-
-#if CLR_2_0 || CLR_4_0
-        /// <summary>
-        /// Creates a constraint specifying the type of exception expected
-        /// </summary>
-        public static InstanceOfTypeConstraint InstanceOf<T>()
-        {
-            return InstanceOf(typeof(T));
-        }
-#endif
-
-        #endregion
-
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework
+{
+    /// <summary>
+    /// Helper class with properties and methods that supply
+    /// constraints that operate on exceptions.
+    /// </summary>
+    public class Throws
+    {
+        #region Exception
+
+        /// <summary>
+        /// Creates a constraint specifying an expected exception
+        /// </summary>
+        public static ResolvableConstraintExpression Exception
+        {
+            get { return new ConstraintExpression().Append(new ThrowsOperator()); }
+        }
+
+        #endregion
+
+        #region InnerException
+
+        /// <summary>
+        /// Creates a constraint specifying an exception with a given InnerException
+        /// </summary>
+        public static ResolvableConstraintExpression InnerException
+        {
+            get { return Exception.InnerException; }
+        }
+
+        #endregion
+
+        #region TargetInvocationException
+
+        /// <summary>
+        /// Creates a constraint specifying an expected TargetInvocationException
+        /// </summary>
+        public static ExactTypeConstraint TargetInvocationException
+        {
+            get { return TypeOf(typeof(System.Reflection.TargetInvocationException)); }
+        }
+
+        #endregion
+
+        #region ArgumentException
+
+        /// <summary>
+        /// Creates a constraint specifying an expected TargetInvocationException
+        /// </summary>
+        public static ExactTypeConstraint ArgumentException
+        {
+            get { return TypeOf(typeof(System.ArgumentException)); }
+        }
+
+        #endregion
+
+        #region InvalidOperationException
+
+        /// <summary>
+        /// Creates a constraint specifying an expected TargetInvocationException
+        /// </summary>
+        public static ExactTypeConstraint InvalidOperationException
+        {
+            get { return TypeOf(typeof(System.InvalidOperationException)); }
+        }
+
+        #endregion
+
+        #region Nothing
+
+        /// <summary>
+        /// Creates a constraint specifying that no exception is thrown
+        /// </summary>
+        public static ThrowsNothingConstraint Nothing
+        {
+            get { return new ThrowsNothingConstraint(); }
+        }
+
+        #endregion
+
+        #region TypeOf
+
+        /// <summary>
+        /// Creates a constraint specifying the exact type of exception expected
+        /// </summary>
+        public static ExactTypeConstraint TypeOf(Type expectedType)
+        {
+            return Exception.TypeOf(expectedType);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Creates a constraint specifying the exact type of exception expected
+        /// </summary>
+        public static ExactTypeConstraint TypeOf<T>()
+        {
+            return TypeOf(typeof(T));
+        }
+#endif
+
+        #endregion
+
+        #region InstanceOf
+
+        /// <summary>
+        /// Creates a constraint specifying the type of exception expected
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf(Type expectedType)
+        {
+            return Exception.InstanceOf(expectedType);
+        }
+
+#if CLR_2_0 || CLR_4_0
+        /// <summary>
+        /// Creates a constraint specifying the type of exception expected
+        /// </summary>
+        public static InstanceOfTypeConstraint InstanceOf<T>()
+        {
+            return InstanceOf(typeof(T));
+        }
+#endif
+
+        #endregion
+
+    }
+}
diff --git a/src/NUnitFramework/framework/nunit.framework.build b/src/NUnitFramework/framework/nunit.framework.build
index 62b9599..4c63faa 100644
--- a/src/NUnitFramework/framework/nunit.framework.build
+++ b/src/NUnitFramework/framework/nunit.framework.build
@@ -1,153 +1,115 @@
-<?xml version="1.0"?>
-<project name="NUnitFramework" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="Attributes/CategoryAttribute.cs"/>
-        <include name="Attributes/DatapointAttributes.cs"/>
-        <include name="Attributes/DescriptionAttribute.cs"/>
-        <include name="Attributes/ExpectedExceptionAttribute.cs"/>
-        <include name="Attributes/ExplicitAttribute.cs"/>
-        <include name="Attributes/IgnoreAttribute.cs"/>
-        <include name="Attributes/IncludeExcludeAttributes.cs"/>
-        <include name="Attributes/JoinTypeAttributes.cs"/>
-        <include name="Attributes/MaxTimeAttribute.cs"/>
-        <include name="Attributes/PropertyAttribute.cs"/>
-        <include name="Attributes/RandomAttribute.cs"/>
-        <include name="Attributes/RangeAttribute.cs"/>
-        <include name="Attributes/RepeatAttribute.cs"/>
-        <include name="Attributes/RequiredAddinAttribute.cs"/>
-        <include name="Attributes/SetCultureAttribute.cs"/>
-        <include name="Attributes/SetUICultureAttribute.cs"/>
-        <include name="Attributes/SetUpAttribute.cs"/>
-        <include name="Attributes/SetUpFixtureAttribute.cs"/>
-        <include name="Attributes/SuiteAttribute.cs"/>
-        <include name="Attributes/TearDownAttribute.cs"/>
-        <include name="Attributes/TestActionAttribute.cs"/>
-        <include name="Attributes/TestAttribute.cs"/>
-        <include name="Attributes/TestCaseAttribute.cs"/>
-        <include name="Attributes/TestCaseSourceAttribute.cs"/>
-        <include name="Attributes/TestFixtureAttribute.cs"/>
-        <include name="Attributes/TestFixtureSetUpAttribute.cs"/>
-        <include name="Attributes/TestFixtureTearDownAttribute.cs"/>
-        <include name="Attributes/TheoryAttribute.cs"/>
-        <include name="Attributes/ThreadingAttributes.cs"/>
-        <include name="Attributes/ValuesAttribute.cs"/>
-        <include name="Attributes/ValueSourceAttribute.cs"/>
-        <include name="Constraints/AttributeConstraints.cs"/>
-        <include name="Constraints/BasicConstraints.cs"/>
-        <include name="Constraints/BinaryOperations.cs"/>
-        <include name="Constraints/CollectionConstraints.cs"/>
-        <include name="Constraints/CollectionTally.cs"/>
-        <include name="Constraints/ComparisonAdapter.cs"/>
-        <include name="Constraints/ComparisonConstraints.cs"/>
-        <include name="Constraints/Constraint.cs"/>
-        <include name="Constraints/ConstraintBuilder.cs"/>
-        <include name="Constraints/ConstraintExpression.cs"/>
-        <include name="Constraints/ConstraintExpressionBase.cs"/>
-        <include name="Constraints/ConstraintFactory.cs"/>
-        <include name="Constraints/ConstraintOperators.cs"/>
-        <include name="Constraints/ContainsConstraint.cs"/>
-        <include name="Constraints/DelayedConstraint.cs"/>
-        <include name="Constraints/DirectoryConstraints.cs"/>
-        <include name="Constraints/EmptyConstraint.cs"/>
-        <include name="Constraints/EqualConstraint.cs"/>
-        <include name="Constraints/EqualityAdapter.cs"/>
-        <include name="Constraints/FloatingPointNumerics.cs"/>
-    <include name="Constraints/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"/>
-        <include name="Constraints/NUnitEqualityComparer.cs"/>
-        <include name="Constraints/PathConstraints.cs"/>
-        <include name="Constraints/PredicateConstraint.cs"/>
-        <include name="Constraints/PrefixConstraints.cs"/>
-        <include name="Constraints/PropertyConstraint.cs"/>
-        <include name="Constraints/RangeConstraint.cs"/>
-        <include name="Constraints/ResolvableConstraintExpression.cs"/>
-        <include name="Constraints/ReusableConstraint.cs"/>
-        <include name="Constraints/SameAsConstraint.cs"/>
-        <include name="Constraints/SerializableConstraints.cs"/>
-        <include name="Constraints/StringConstraints.cs"/>
-        <include name="Constraints/ThrowsConstraint.cs"/>
-        <include name="Constraints/Tolerance.cs"/>
-        <include name="Constraints/TypeConstraints.cs"/>
-        <include name="Exceptions/AssertionException.cs"/>
-        <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"/>
-        <include name="Assume.cs"/>
-        <include name="CollectionAssert.cs"/>
-        <include name="Contains.cs"/>
-        <include name="DirectoryAssert.cs"/>
-        <include name="FileAssert.cs"/>
-        <include name="GlobalSettings.cs"/>
-        <include name="Has.cs"/>
-        <include name="IExpectException.cs"/>
-        <include name="Is.cs"/>
-        <include name="Iz.cs"/>
-        <include name="ITestCaseData.cs"/>
-        <include name="List.cs"/>
-        <include name="ListMapper.cs"/>
-        <include name="Randomizer.cs"/>
-        <include name="SpecialValue.cs"/>
-        <include name="StringAssert.cs"/>
-        <include name="TestCaseData.cs"/>
-        <include name="TestContext.cs"/>
-        <include name="TestDetails.cs"/>
-        <include name="TestState.cs"/>
-        <include name="TestStatus.cs"/>
-        <include name="Text.cs"/>
-        <include name="TextMessageWriter.cs"/>
-        <include name="Throws.cs"/>
-  </patternset>
-
-  <target name="build">
-
-    <csc target="library"
-        output="${current.framework.dir}/nunit.framework.dll"
-        doc="${current.framework.dir}/nunit.framework.xml"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <nowarn>
-        <warning number="618,672"/>
-        <warning number="1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <sources basedir=".">
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs" />
-      </sources>
-    </csc>
-
-    <!-- Needed locally by some NUnit tests -->
-    <copy file="${current.framework.dir}/nunit.framework.dll"
-      todir="${current.test.dir}"/>
-
-    <!-- Needed in base dir by pnunit tests -->
-    <copy file="${current.framework.dir}/nunit.framework.dll"
-      todir="${current.build.dir}"/>
-
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitFramework/framework">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit.framework.build"/>
-        <include name="nunit.framework.dll.csproj"/>
-        <include name="SyntaxElements.txt"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitFramework" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AsyncSynchronizationContext.cs" if="${runtime.version >= '2.0'}"/>
+        <include name="AsyncInvocationRegion.cs" if="${runtime.version >= '2.0'}"/>
+        <include name="Attributes/CategoryAttribute.cs"/>
+        <include name="Attributes/DatapointAttributes.cs"/>
+        <include name="Attributes/DescriptionAttribute.cs"/>
+        <include name="Attributes/ExpectedExceptionAttribute.cs"/>
+        <include name="Attributes/ExplicitAttribute.cs"/>
+        <include name="Attributes/IgnoreAttribute.cs"/>
+        <include name="Attributes/IncludeExcludeAttributes.cs"/>
+        <include name="Attributes/JoinTypeAttributes.cs"/>
+        <include name="Attributes/MaxTimeAttribute.cs"/>
+        <include name="Attributes/PropertyAttribute.cs"/>
+        <include name="Attributes/RandomAttribute.cs"/>
+        <include name="Attributes/RangeAttribute.cs"/>
+        <include name="Attributes/RepeatAttribute.cs"/>
+        <include name="Attributes/RequiredAddinAttribute.cs"/>
+        <include name="Attributes/SetCultureAttribute.cs"/>
+        <include name="Attributes/SetUICultureAttribute.cs"/>
+        <include name="Attributes/SetUpAttribute.cs"/>
+        <include name="Attributes/SetUpFixtureAttribute.cs"/>
+        <include name="Attributes/SuiteAttribute.cs"/>
+        <include name="Attributes/TearDownAttribute.cs"/>
+        <include name="Attributes/TestActionAttribute.cs"/>
+        <include name="Attributes/TestAttribute.cs"/>
+        <include name="Attributes/TestCaseAttribute.cs"/>
+        <include name="Attributes/TestCaseSourceAttribute.cs"/>
+        <include name="Attributes/TestFixtureAttribute.cs"/>
+        <include name="Attributes/TestFixtureSetUpAttribute.cs"/>
+        <include name="Attributes/TestFixtureTearDownAttribute.cs"/>
+        <include name="Attributes/TheoryAttribute.cs"/>
+        <include name="Attributes/ThreadingAttributes.cs"/>
+        <include name="Attributes/ValuesAttribute.cs"/>
+        <include name="Attributes/ValueSourceAttribute.cs"/>
+        <include name="Constraints/*.cs"/>
+        <include name="Constraints/Operators/*.cs"/>
+        <include name="Exceptions/AssertionException.cs"/>
+        <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"/>
+        <include name="Assume.cs"/>
+        <include name="CollectionAssert.cs"/>
+        <include name="Contains.cs"/>
+        <include name="DirectoryAssert.cs"/>
+        <include name="FileAssert.cs"/>
+        <include name="GlobalSettings.cs"/>
+        <include name="Guard.cs"/>
+        <include name="Has.cs"/>
+        <include name="IExpectException.cs"/>
+        <include name="Is.cs"/>
+        <include name="Iz.cs"/>
+        <include name="ITestCaseData.cs"/>
+        <include name="List.cs"/>
+        <include name="ListMapper.cs"/>
+        <include name="Randomizer.cs"/>
+        <include name="SpecialValue.cs"/>
+        <include name="StringAssert.cs"/>
+        <include name="TestCaseData.cs"/>
+        <include name="TestContext.cs"/>
+        <include name="TestDetails.cs"/>
+        <include name="TestState.cs"/>
+        <include name="TestStatus.cs"/>
+        <include name="Text.cs"/>
+        <include name="TextMessageWriter.cs"/>
+        <include name="Throws.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="library"
+        output="${current.framework.dir}/nunit.framework.dll"
+        doc="${current.framework.dir}/nunit.framework.xml"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <nowarn>
+        <warning number="618,672"/>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs" />
+      </sources>
+    </csc>
+
+    <!-- Needed locally by some NUnit tests -->
+    <copy file="${current.framework.dir}/nunit.framework.dll"
+      todir="${current.test.dir}"/>
+
+    <!-- Needed in base dir by pnunit tests -->
+    <copy file="${current.framework.dir}/nunit.framework.dll"
+      todir="${current.build.dir}"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitFramework/framework">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.framework.build"/>
+        <include name="nunit.framework.dll.csproj"/>
+        <include name="SyntaxElements.txt"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitFramework/framework/nunit.framework.dll.csproj b/src/NUnitFramework/framework/nunit.framework.dll.csproj
index 1288a38..fa35c03 100644
--- a/src/NUnitFramework/framework/nunit.framework.dll.csproj
+++ b/src/NUnitFramework/framework/nunit.framework.dll.csproj
@@ -1,194 +1,284 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.framework</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Framework</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0</DefineConstants>
-    <DocumentationFile>..\..\..\bin\Debug\framework\nunit.framework.xml</DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0</DefineConstants>
-    <DocumentationFile>..\..\..\bin\Release\framework\nunit.framework.xml</DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="Assert.cs" />
-    <Compile Include="AssertionHelper.cs" />
-    <Compile Include="Assume.cs" />
-    <Compile Include="ActionTargets.cs" />
-    <Compile Include="Attributes\CategoryAttribute.cs" />
-    <Compile Include="Attributes\DatapointAttributes.cs" />
-    <Compile Include="Attributes\DescriptionAttribute.cs" />
-    <Compile Include="Attributes\ExpectedExceptionAttribute.cs" />
-    <Compile Include="Attributes\ExplicitAttribute.cs" />
-    <Compile Include="Attributes\IgnoreAttribute.cs" />
-    <Compile Include="Attributes\IncludeExcludeAttributes.cs" />
-    <Compile Include="Attributes\JoinTypeAttributes.cs" />
-    <Compile Include="Attributes\MaxTimeAttribute.cs" />
-    <Compile Include="Attributes\PropertyAttribute.cs" />
-    <Compile Include="Attributes\RandomAttribute.cs" />
-    <Compile Include="Attributes\RangeAttribute.cs" />
-    <Compile Include="Attributes\RepeatAttribute.cs" />
-    <Compile Include="Attributes\RequiredAddinAttribute.cs" />
-    <Compile Include="Attributes\SetCultureAttribute.cs" />
-    <Compile Include="Attributes\SetUICultureAttribute.cs" />
-    <Compile Include="Attributes\SetUpAttribute.cs" />
-    <Compile Include="Attributes\SetUpFixtureAttribute.cs" />
-    <Compile Include="Attributes\SuiteAttribute.cs" />
-    <Compile Include="Attributes\TearDownAttribute.cs" />
-    <Compile Include="Attributes\TestActionAttribute.cs" />
-    <Compile Include="Attributes\TestAttribute.cs" />
-    <Compile Include="Attributes\TestCaseAttribute.cs" />
-    <Compile Include="Attributes\TestCaseSourceAttribute.cs" />
-    <Compile Include="Attributes\TestFixtureAttribute.cs" />
-    <Compile Include="Attributes\TestFixtureSetUpAttribute.cs" />
-    <Compile Include="Attributes\TestFixtureTearDownAttribute.cs" />
-    <Compile Include="Attributes\TheoryAttribute.cs" />
-    <Compile Include="Attributes\ThreadingAttributes.cs" />
-    <Compile Include="Attributes\ValuesAttribute.cs" />
-    <Compile Include="Attributes\ValueSourceAttribute.cs" />
-    <Compile Include="CollectionAssert.cs" />
-    <Compile Include="Constraints\AttributeConstraints.cs" />
-    <Compile Include="Constraints\BasicConstraints.cs" />
-    <Compile Include="Constraints\BinaryOperations.cs" />
-    <Compile Include="Constraints\CollectionConstraints.cs" />
-    <Compile Include="Constraints\CollectionTally.cs" />
-    <Compile Include="Constraints\ComparisonAdapter.cs" />
-    <Compile Include="Constraints\ComparisonConstraints.cs" />
-    <Compile Include="Constraints\Constraint.cs" />
-    <Compile Include="Constraints\ConstraintBuilder.cs" />
-    <Compile Include="Constraints\ConstraintExpression.cs" />
-    <Compile Include="Constraints\ConstraintExpressionBase.cs" />
-    <Compile Include="Constraints\ConstraintFactory.cs" />
-    <Compile Include="Constraints\ConstraintOperators.cs" />
-    <Compile Include="Constraints\ContainsConstraint.cs" />
-    <Compile Include="Constraints\DelayedConstraint.cs" />
-    <Compile Include="Constraints\DirectoryConstraints.cs" />
-    <Compile Include="Constraints\EmptyConstraint.cs" />
-    <Compile Include="Constraints\EqualConstraint.cs" />
-    <Compile Include="Constraints\EqualityAdapter.cs" />
-    <Compile Include="Constraints\FloatingPointNumerics.cs" />
-    <Compile Include="Constraints\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" />
-    <Compile Include="Constraints\NUnitComparer.cs" />
-    <Compile Include="Constraints\NUnitEqualityComparer.cs" />
-    <Compile Include="Constraints\PathConstraints.cs" />
-    <Compile Include="Constraints\PredicateConstraint.cs" />
-    <Compile Include="Constraints\PrefixConstraints.cs" />
-    <Compile Include="Constraints\PropertyConstraint.cs" />
-    <Compile Include="Constraints\RangeConstraint.cs" />
-    <Compile Include="Constraints\ResolvableConstraintExpression.cs" />
-    <Compile Include="Constraints\ReusableConstraint.cs" />
-    <Compile Include="Constraints\SameAsConstraint.cs" />
-    <Compile Include="Constraints\SerializableConstraints.cs" />
-    <Compile Include="Constraints\StringConstraints.cs" />
-    <Compile Include="Constraints\ThrowsConstraint.cs" />
-    <Compile Include="Constraints\Tolerance.cs" />
-    <Compile Include="Constraints\TypeConstraints.cs" />
-    <Compile Include="Contains.cs" />
-    <Compile Include="DirectoryAssert.cs" />
-    <Compile Include="Exceptions\AssertionException.cs" />
-    <Compile Include="Exceptions\IgnoreException.cs" />
-    <Compile Include="Exceptions\InconclusiveException.cs" />
-    <Compile Include="Exceptions\SuccessException.cs" />
-    <Compile Include="FileAssert.cs" />
-    <Compile Include="GlobalSettings.cs" />
-    <Compile Include="Has.cs" />
-    <Compile Include="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" />
-    <Compile Include="List.cs" />
-    <Compile Include="ListMapper.cs" />
-    <Compile Include="Randomizer.cs" />
-    <Compile Include="SpecialValue.cs" />
-    <Compile Include="StringAssert.cs" />
-    <Compile Include="TestCaseData.cs" />
-    <Compile Include="TestContext.cs" />
-    <Compile Include="TestState.cs" />
-    <Compile Include="TestStatus.cs" />
-    <Compile Include="Text.cs" />
-    <Compile Include="TextMessageWriter.cs" />
-    <Compile Include="Throws.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.framework.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.framework</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Framework</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0</DefineConstants>
+    <DocumentationFile>..\..\..\bin\Debug\framework\nunit.framework.xml</DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0</DefineConstants>
+    <DocumentationFile>..\..\..\bin\Release\framework\nunit.framework.xml</DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Assert.cs" />
+    <Compile Include="AssertionHelper.cs" />
+    <Compile Include="Assume.cs" />
+    <Compile Include="ActionTargets.cs" />
+    <Compile Include="AsyncInvocationRegion.cs" />
+    <Compile Include="AsyncSynchronizationContext.cs" />
+    <Compile Include="Attributes\CategoryAttribute.cs" />
+    <Compile Include="Attributes\DatapointAttributes.cs" />
+    <Compile Include="Attributes\DescriptionAttribute.cs" />
+    <Compile Include="Attributes\ExpectedExceptionAttribute.cs" />
+    <Compile Include="Attributes\ExplicitAttribute.cs" />
+    <Compile Include="Attributes\IgnoreAttribute.cs" />
+    <Compile Include="Attributes\IncludeExcludeAttributes.cs" />
+    <Compile Include="Attributes\JoinTypeAttributes.cs" />
+    <Compile Include="Attributes\MaxTimeAttribute.cs" />
+    <Compile Include="Attributes\PropertyAttribute.cs" />
+    <Compile Include="Attributes\RandomAttribute.cs" />
+    <Compile Include="Attributes\RangeAttribute.cs" />
+    <Compile Include="Attributes\RepeatAttribute.cs" />
+    <Compile Include="Attributes\RequiredAddinAttribute.cs" />
+    <Compile Include="Attributes\SetCultureAttribute.cs" />
+    <Compile Include="Attributes\SetUICultureAttribute.cs" />
+    <Compile Include="Attributes\SetUpAttribute.cs" />
+    <Compile Include="Attributes\SetUpFixtureAttribute.cs" />
+    <Compile Include="Attributes\SuiteAttribute.cs" />
+    <Compile Include="Attributes\TearDownAttribute.cs" />
+    <Compile Include="Attributes\TestActionAttribute.cs" />
+    <Compile Include="Attributes\TestAttribute.cs" />
+    <Compile Include="Attributes\TestCaseAttribute.cs" />
+    <Compile Include="Attributes\TestCaseSourceAttribute.cs" />
+    <Compile Include="Attributes\TestFixtureAttribute.cs" />
+    <Compile Include="Attributes\TestFixtureSetUpAttribute.cs" />
+    <Compile Include="Attributes\TestFixtureTearDownAttribute.cs" />
+    <Compile Include="Attributes\TheoryAttribute.cs" />
+    <Compile Include="Attributes\ThreadingAttributes.cs" />
+    <Compile Include="Attributes\ValuesAttribute.cs" />
+    <Compile Include="Attributes\ValueSourceAttribute.cs" />
+    <Compile Include="CollectionAssert.cs" />
+    <Compile Include="Constraints\AllItemsConstraint.cs" />
+    <Compile Include="Constraints\AndConstraint.cs" />
+    <Compile Include="Constraints\AssignableFromConstraint.cs" />
+    <Compile Include="Constraints\AssignableToConstraint.cs" />
+    <Compile Include="Constraints\AttributeConstraint.cs" />
+    <Compile Include="Constraints\AttributeExistsConstraint.cs" />
+    <Compile Include="Constraints\BasicConstraint.cs" />
+    <Compile Include="Constraints\BinaryConstraint.cs" />
+    <Compile Include="Constraints\CollectionConstraint.cs" />
+    <Compile Include="Constraints\CollectionContainsConstraint.cs" />
+    <Compile Include="Constraints\CollectionEquivalentConstraint.cs" />
+    <Compile Include="Constraints\CollectionItemsEqualConstraint.cs" />
+    <Compile Include="Constraints\CollectionSubsetConstraint.cs" />
+    <Compile Include="Constraints\CollectionTally.cs" />
+    <Compile Include="Constraints\ComparisonAdapter.cs" />
+    <Compile Include="Constraints\ComparisonConstraint.cs" />
+    <Compile Include="Constraints\Constraint.cs" />
+    <Compile Include="Constraints\ConstraintBuilder.cs" />
+    <Compile Include="Constraints\ConstraintExpression.cs" />
+    <Compile Include="Constraints\ConstraintExpressionBase.cs" />
+    <Compile Include="Constraints\ConstraintFactory.cs" />
+    <Compile Include="Constraints\ContainsConstraint.cs" />
+    <Compile Include="Constraints\DelayedConstraint.cs" />
+    <Compile Include="Constraints\EmptyCollectionConstraint.cs" />
+    <Compile Include="Constraints\EmptyConstraint.cs" />
+    <Compile Include="Constraints\EmptyDirectoryConstraint.cs" />
+    <Compile Include="Constraints\EmptyStringConstraint.cs" />
+    <Compile Include="Constraints\EndsWithConstraint.cs" />
+    <Compile Include="Constraints\EqualConstraint.cs" />
+    <Compile Include="Constraints\EqualityAdapter.cs" />
+    <Compile Include="Constraints\ExactCountConstraint.cs" />
+    <Compile Include="Constraints\ExactTypeConstraint.cs" />
+    <Compile Include="Constraints\ExceptionTypeConstraint.cs" />
+    <Compile Include="Constraints\FailurePoint.cs" />
+    <Compile Include="Constraints\FalseConstraint.cs" />
+    <Compile Include="Constraints\FloatingPointNumerics.cs" />
+    <Compile Include="Constraints\GreaterThanConstraint.cs" />
+    <Compile Include="Constraints\GreaterThanOrEqualConstraint.cs" />
+    <Compile Include="Constraints\InstanceOfTypeConstraint.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\NaNConstraint.cs" />
+    <Compile Include="Constraints\NoItemConstraint.cs" />
+    <Compile Include="Constraints\NotConstraint.cs" />
+    <Compile Include="Constraints\NullConstraint.cs" />
+    <Compile Include="Constraints\NullOrEmptyStringConstraint.cs" />
+    <Compile Include="Constraints\Numerics.cs" />
+    <Compile Include="Constraints\NUnitComparer.cs" />
+    <Compile Include="Constraints\NUnitEqualityComparer.cs" />
+    <Compile Include="Constraints\Operators\AllOperator.cs" />
+    <Compile Include="Constraints\Operators\AndOperator.cs" />
+    <Compile Include="Constraints\Operators\AttributeOperator.cs" />
+    <Compile Include="Constraints\Operators\BinaryOperator.cs" />
+    <Compile Include="Constraints\Operators\CollectionOperator.cs" />
+    <Compile Include="Constraints\CollectionOrderedConstraint.cs" />
+    <Compile Include="Constraints\Operators\ConstraintOperator.cs" />
+    <Compile Include="Constraints\Operators\ExactCountOperator.cs" />
+    <Compile Include="Constraints\Operators\NoneOperator.cs" />
+    <Compile Include="Constraints\Operators\NotOperator.cs" />
+    <Compile Include="Constraints\Operators\OrOperator.cs" />
+    <Compile Include="Constraints\Operators\PrefixOperator.cs" />
+    <Compile Include="Constraints\Operators\PropOperator.cs" />
+    <Compile Include="Constraints\Operators\SelfResolvingOperator.cs" />
+    <Compile Include="Constraints\Operators\ThrowsOperator.cs" />
+    <Compile Include="Constraints\Operators\WithOperator.cs" />
+    <Compile Include="Constraints\OrConstraint.cs" />
+    <Compile Include="Constraints\PathConstraint.cs" />
+    <Compile Include="Constraints\PredicateConstraint.cs" />
+    <Compile Include="Constraints\PrefixConstraint.cs" />
+    <Compile Include="Constraints\PropertyConstraint.cs" />
+    <Compile Include="Constraints\PropertyExistsConstraint.cs" />
+    <Compile Include="Constraints\RangeConstraint.cs" />
+    <Compile Include="Constraints\RegexConstraint.cs" />
+    <Compile Include="Constraints\ResolvableConstraintExpression.cs" />
+    <Compile Include="Constraints\ReusableConstraint.cs" />
+    <Compile Include="Constraints\SameAsConstraint.cs" />
+    <Compile Include="Constraints\SamePathConstraint.cs" />
+    <Compile Include="Constraints\SamePathOrUnderConstraint.cs" />
+    <Compile Include="Constraints\BinarySerializableConstraint.cs" />
+    <Compile Include="Constraints\Operators\SomeOperator.cs" />
+    <Compile Include="Constraints\SomeItemsConstraint.cs" />
+    <Compile Include="Constraints\StartsWithConstraint.cs" />
+    <Compile Include="Constraints\StringConstraint.cs" />
+    <Compile Include="Constraints\SubPathConstraint.cs" />
+    <Compile Include="Constraints\SubstringConstraint.cs" />
+    <Compile Include="Constraints\ThrowsConstraint.cs" />
+    <Compile Include="Constraints\ThrowsNothingConstraint.cs" />
+    <Compile Include="Constraints\Tolerance.cs" />
+    <Compile Include="Constraints\ToleranceMode.cs" />
+    <Compile Include="Constraints\TrueConstraint.cs" />
+    <Compile Include="Constraints\TypeConstraint.cs" />
+    <Compile Include="Constraints\UniqueItemsConstraint.cs" />
+    <Compile Include="Constraints\XmlSerializableConstraint.cs" />
+    <Compile Include="Contains.cs" />
+    <Compile Include="DirectoryAssert.cs" />
+    <Compile Include="Exceptions\AssertionException.cs" />
+    <Compile Include="Exceptions\IgnoreException.cs" />
+    <Compile Include="Exceptions\InconclusiveException.cs" />
+    <Compile Include="Exceptions\SuccessException.cs" />
+    <Compile Include="FileAssert.cs" />
+    <Compile Include="GlobalSettings.cs" />
+    <Compile Include="Guard.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" />
+    <Compile Include="List.cs" />
+    <Compile Include="ListMapper.cs" />
+    <Compile Include="Randomizer.cs" />
+    <Compile Include="SpecialValue.cs" />
+    <Compile Include="StringAssert.cs" />
+    <Compile Include="TestCaseData.cs" />
+    <Compile Include="TestContext.cs" />
+    <Compile Include="TestState.cs" />
+    <Compile Include="TestStatus.cs" />
+    <Compile Include="Text.cs" />
+    <Compile Include="TextMessageWriter.cs" />
+    <Compile Include="Throws.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.framework.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </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/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitFramework/framework/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..2d921cb
Binary files /dev/null and b/src/NUnitFramework/framework/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitFramework/framework/obj/Debug/nunit.framework.dll.csproj.FileListAbsolute.txt b/src/NUnitFramework/framework/obj/Debug/nunit.framework.dll.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..e2218e0
--- /dev/null
+++ b/src/NUnitFramework/framework/obj/Debug/nunit.framework.dll.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\framework\nunit.framework.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\framework\nunit.framework.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitFramework\framework\obj\Debug\nunit.framework.dll
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitFramework\framework\obj\Debug\nunit.framework.pdb
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\framework\nunit.framework.xml
diff --git a/src/NUnitFramework/framework/obj/Debug/nunit.framework.pdb b/src/NUnitFramework/framework/obj/Debug/nunit.framework.pdb
new file mode 100644
index 0000000..b485c6f
Binary files /dev/null and b/src/NUnitFramework/framework/obj/Debug/nunit.framework.pdb differ
diff --git a/src/NUnitFramework/tests-net45/AfterDelayedTests.cs b/src/NUnitFramework/tests-net45/AfterDelayedTests.cs
new file mode 100644
index 0000000..4de205a
--- /dev/null
+++ b/src/NUnitFramework/tests-net45/AfterDelayedTests.cs
@@ -0,0 +1,87 @@
+#if NET_3_5 || NET_4_0 || NET_4_5
+using System;
+using System.Threading.Tasks;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+namespace nunit.framework.tests.net45
+{
+	[TestFixture]
+	public class AfterDelayedTests
+	{
+		[Test]
+		public void ConstraintSuccess()
+		{
+			Assert.IsTrue(new DelayedConstraint(new EqualConstraint(1), 100)
+				.Matches(async () => await One()));
+		}
+
+		[Test]
+		public void ConstraintFailure()
+		{
+			Assert.IsFalse(new DelayedConstraint(new EqualConstraint(2), 100)
+				.Matches(async () => await One()));
+		}
+
+		[Test]
+		public void ConstraintError()
+		{
+			Assert.Throws<InvalidOperationException>(() => 
+				new DelayedConstraint(new EqualConstraint(1), 100).Matches(async () => await Throw()));
+		}
+
+		[Test]
+		public void ConstraintVoidDelegateFailureAsDelegateIsNotCalled()
+		{
+			Assert.IsFalse(new DelayedConstraint(new EqualConstraint(1), 100)
+				.Matches(new TestDelegate(async () => { await One(); })));
+		}
+
+		[Test]
+		public void ConstraintVoidDelegateExceptionIsFailureAsDelegateIsNotCalled()
+		{
+			Assert.IsFalse(new DelayedConstraint(new EqualConstraint(1), 100)
+				.Matches(new TestDelegate(async () => { await Throw(); })));
+		}
+
+		[Test]
+		public void SyntaxSuccess()
+		{
+			Assert.That(async () => await One(), Is.EqualTo(1).After(100));
+		}
+
+
+		[Test]
+		public void SyntaxFailure()
+		{
+			Assert.Throws<AssertionException>(() =>
+				Assert.That(async () => await One(), Is.EqualTo(2).After(100)));
+		}
+
+		[Test]
+		public void SyntaxError()
+		{
+			Assert.Throws<InvalidOperationException>(() =>
+				Assert.That(async () => await Throw(), Is.EqualTo(1).After(100)));
+		}
+
+		[Test]
+		public void SyntaxVoidDelegateExceptionIsFailureAsCodeIsNotCalled()
+		{
+			Assert.Throws<AssertionException>(() =>
+				Assert.That(new TestDelegate(async () => await Throw()), Is.EqualTo(1).After(100)));
+		}
+
+		private static async Task<int> One()
+		{
+			return await Task.Run(() => 1);
+		}
+
+		private static async Task Throw()
+		{
+			await One();
+			throw new InvalidOperationException();
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitFramework/tests-net45/AssertAssumeThatTests.cs b/src/NUnitFramework/tests-net45/AssertAssumeThatTests.cs
new file mode 100644
index 0000000..12033ca
--- /dev/null
+++ b/src/NUnitFramework/tests-net45/AssertAssumeThatTests.cs
@@ -0,0 +1,97 @@
+#if NET_3_5 || NET_4_0 || NET_4_5
+using System;
+using System.Threading.Tasks;
+using NUnit.Framework;
+
+namespace nunit.framework.tests.net45
+{
+	[TestFixture]
+	public class AssertAssumeThatTests
+	{
+		[Test]
+		public void AssertThatSuccess()
+		{
+			Assert.That(async () => await One(), Is.EqualTo(1));
+		}
+
+		[Test]
+		public void AssertThatFailure()
+		{
+			var exception = Assert.Throws<AssertionException>(() =>
+				Assert.That(async () => await One(), Is.EqualTo(2)));
+		}
+
+		[Test]
+		public void AssertThatErrorTask()
+		{
+			var exception = Assert.Throws<InvalidOperationException>(() => 
+				Assert.That(async () => await ThrowExceptionTask(), Is.EqualTo(1)));
+
+			Assert.That(exception.StackTrace, Contains.Substring("ThrowExceptionTask"));
+		}
+
+		[Test]
+		public void AssertThatErrorGenericTask()
+		{
+			var exception = Assert.Throws<InvalidOperationException>(() => 
+				Assert.That(async () => await ThrowExceptionGenericTask(), Is.EqualTo(1)));
+
+			Assert.That(exception.StackTrace, Contains.Substring("ThrowExceptionGenericTask"));
+		}
+
+		[Test]
+		public void AssertThatErrorVoid()
+		{
+			var exception = Assert.Throws<InvalidOperationException>(() =>
+				Assert.That(async () => { await ThrowExceptionGenericTask(); }, Is.EqualTo(1)));
+
+			Assert.That(exception.StackTrace, Contains.Substring("ThrowExceptionGenericTask"));
+		}
+
+		[Test]
+		public void AssumeThatSuccess()
+		{
+			Assume.That(async () => await One(), Is.EqualTo(1));
+		}
+
+		[Test]
+		public void AssumeThatFailure()
+		{
+			var exception = Assert.Throws<InconclusiveException>(() =>
+				Assume.That(async () => await One(), Is.EqualTo(2)));
+		}
+
+		[Test]
+		public void AssumeThatError()
+		{
+			var exception = Assert.Throws<InvalidOperationException>(() =>
+				Assume.That(async () => await ThrowExceptionGenericTask(), Is.EqualTo(1)));
+
+			Assert.That(exception.StackTrace, Contains.Substring("ThrowExceptionGenericTask"));
+		}
+
+		private static Task<int> One()
+		{
+			return Task.Run(() => 1);
+		}
+
+		private static async Task<int> ThrowExceptionGenericTask()
+		{
+			await One();
+			throw new InvalidOperationException();
+		}
+
+		private static async Task ThrowExceptionTask()
+		{
+			await One();
+			throw new InvalidOperationException();
+		}
+
+		private static async void ThrowExceptionVoid()
+		{
+			await One();
+			throw new InvalidOperationException();
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitFramework/tests-net45/ThrowsTests.cs b/src/NUnitFramework/tests-net45/ThrowsTests.cs
new file mode 100644
index 0000000..1987b98
--- /dev/null
+++ b/src/NUnitFramework/tests-net45/ThrowsTests.cs
@@ -0,0 +1,163 @@
+#if NET_3_5 || NET_4_0 || NET_4_5
+using System;
+using System.Threading.Tasks;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+namespace nunit.framework.tests.net45
+{
+	[TestFixture]
+	public class ThrowsTests
+	{
+		private readonly TestDelegate _noThrowsVoid = new TestDelegate(async () => await Task.Yield());
+		private readonly ActualValueDelegate<Task> _noThrowsAsyncTask = async () => await Task.Yield();
+		private readonly ActualValueDelegate<Task<int>> _noThrowsAsyncGenericTask = async () => await ReturnOne();
+		private readonly TestDelegate _throwsAsyncVoid = new TestDelegate(async () => await ThrowAsyncTask());
+		private readonly TestDelegate _throwsSyncVoid = new TestDelegate(async () => { throw new InvalidOperationException(); });
+		private readonly ActualValueDelegate<Task> _throwsAsyncTask = async () => await ThrowAsyncTask();
+		private readonly ActualValueDelegate<Task<int>> _throwsAsyncGenericTask = async () => await ThrowAsyncGenericTask();
+
+		private static ThrowsConstraint ThrowsInvalidOperationExceptionConstraint
+		{
+			get { return new ThrowsConstraint(new ExactTypeConstraint(typeof(InvalidOperationException))); }
+		}
+
+		[Test]
+		public void ThrowsConstraintVoid()
+		{
+			Assert.IsTrue(ThrowsInvalidOperationExceptionConstraint.Matches(_throwsAsyncVoid));
+		}
+
+		[Test]
+		public void ThrowsConstraintVoidRunSynchronously()
+		{
+			Assert.IsTrue(ThrowsInvalidOperationExceptionConstraint.Matches(_throwsSyncVoid));
+		}
+
+		[Test]
+		public void ThrowsConstraintAsyncTask()
+		{
+			Assert.IsTrue(ThrowsInvalidOperationExceptionConstraint.Matches(_throwsAsyncTask));
+		}
+
+		[Test]
+		public void ThrowsConstraintAsyncGenericTask()
+		{
+			Assert.IsTrue(ThrowsInvalidOperationExceptionConstraint.Matches(_throwsAsyncGenericTask));
+		}
+
+		[Test]
+		public void ThrowsNothingConstraintVoidSuccess()
+		{
+			Assert.IsTrue(new ThrowsNothingConstraint().Matches(_noThrowsVoid));
+		}
+
+		[Test]
+		public void ThrowsNothingConstraintVoidFailure()
+		{
+			Assert.IsFalse(new ThrowsNothingConstraint().Matches(_throwsAsyncVoid));
+		}
+
+		[Test]
+		public void ThrowsNothingConstraintTaskVoidSuccess()
+		{
+			Assert.IsTrue(new ThrowsNothingConstraint().Matches(_noThrowsAsyncTask));
+		}
+
+		[Test]
+		public void ThrowsNothingConstraintTaskFailure()
+		{
+			Assert.IsFalse(new ThrowsNothingConstraint().Matches(_throwsAsyncTask));
+		}
+
+		[Test]
+		public void AssertThrowsVoid()
+		{
+			Assert.Throws(typeof(InvalidOperationException), _throwsAsyncVoid);
+		}
+
+		[Test]
+		public void AssertThatThrowsVoid()
+		{
+			Assert.That(_throwsAsyncVoid, Throws.TypeOf<InvalidOperationException>());
+		}
+		
+		[Test]
+		public void AssertThatThrowsTask()
+		{
+			Assert.That(_throwsAsyncTask, Throws.TypeOf<InvalidOperationException>());
+		}
+
+		[Test]
+		public void AssertThatThrowsGenericTask()
+		{
+			Assert.That(_throwsAsyncGenericTask, Throws.TypeOf<InvalidOperationException>());
+		}
+
+		[Test]
+		public void AssertThatThrowsNothingVoidSuccess()
+		{
+			Assert.That(_noThrowsVoid, Throws.Nothing);
+		}
+
+		[Test]
+		public void AssertThatThrowsNothingTaskSuccess()
+		{
+			Assert.That(_noThrowsAsyncTask, Throws.Nothing);
+		}
+
+		[Test]
+		public void AssertThatThrowsNothingGenericTaskSuccess()
+		{
+			Assert.That(_noThrowsAsyncGenericTask, Throws.Nothing);
+		}
+
+		[Test]
+		public void AssertThatThrowsNothingVoidFailure()
+		{
+			Assert.Throws<AssertionException>(() => Assert.That(_throwsAsyncVoid, Throws.Nothing));
+		}
+
+		[Test]
+		public void AssertThatThrowsNothingTaskFailure()
+		{
+			Assert.Throws<AssertionException>(() => Assert.That(_throwsAsyncTask, Throws.Nothing));
+		}
+
+		[Test]
+		public void AssertThatThrowsNothingGenericTaskFailure()
+		{
+			Assert.Throws<AssertionException>(() => Assert.That(_throwsAsyncGenericTask, Throws.Nothing));
+		}
+
+		[Test]
+		public void AssertThrowsAsync()
+		{
+			Assert.Throws<InvalidOperationException>(_throwsAsyncVoid);
+		}
+
+		[Test]
+		public void AssertThrowsSync()
+		{
+			Assert.Throws<InvalidOperationException>(_throwsSyncVoid);
+		}
+
+		private static async Task ThrowAsyncTask()
+		{
+			await ReturnOne();
+			throw new InvalidOperationException();
+		}
+
+		private static async Task<int> ThrowAsyncGenericTask()
+		{
+			await ThrowAsyncTask();
+			return await ReturnOne();
+		}
+
+		private static Task<int> ReturnOne()
+		{
+			return Task.Run(() => 1);
+		}
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/NUnitFramework/tests-net45/nunit.framework.tests.net45.build b/src/NUnitFramework/tests-net45/nunit.framework.tests.net45.build
new file mode 100644
index 0000000..85494a5
--- /dev/null
+++ b/src/NUnitFramework/tests-net45/nunit.framework.tests.net45.build
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<project name="NUnitCoreTestsNet45" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="AfterDelayedTests.cs"/>
+    <include name="AssertAssumeThatTests.cs"/>
+    <include name="ThrowsTests.cs"/>
+  </patternset>
+
+  <target name="build" if ="${runtime.version >= '2.0'}">
+
+    <echo message=".NET 4.5 is not installed - skipping nunit.framework.tests.net45"
+	unless="${framework::exists('net-4.5')}"/>
+
+    <if test="${framework::exists('net-4.5')}">
+
+      <property name="previousFramework" value="${nant.settings.currentframework}"/>
+      <property name="nant.settings.currentframework" value="net-4.5"/>
+
+      <csc target="library" 
+         output="${current.test.dir}/nunit.framework.tests.net45.dll"
+         debug="${build.debug}" 
+         define="${build.defines}">
+        <nowarn>
+          <warning number="618,672"/>
+        </nowarn>
+        <sources>
+          <patternset refid="source-files"/>
+          <include name="../../GeneratedAssemblyInfo.cs"/>
+        </sources>
+        <resources prefix="NUnit.Framework.Tests.45">
+          <include name="Results.xsd"/>
+         </resources>
+        <references>
+          <include name="${current.framework.dir}/nunit.framework.dll"/>
+        </references>
+      </csc>
+
+      <property name="nant.settings.currentframework" value="${previousFramework}"/>
+
+    </if>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitFramework/tests-net45">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.framework.tests.net45.csproj"/>
+        <include name="nunit.framework.tests.net45.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/NUnitFramework/tests-net45/nunit.framework.tests.net45.csproj b/src/NUnitFramework/tests-net45/nunit.framework.tests.net45.csproj
new file mode 100644
index 0000000..11f39d6
--- /dev/null
+++ b/src/NUnitFramework/tests-net45/nunit.framework.tests.net45.csproj
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{4E9322CE-CED7-42B4-B5DA-7837D9224EE6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>nunit.framework.tests.net45</RootNamespace>
+    <AssemblyName>nunit.framework.tests.net45</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </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_4_0,NET_4_5,CS_5_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </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>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AfterDelayedTests.cs" />
+    <Compile Include="AssertAssumeThatTests.cs" />
+    <Compile Include="ThrowsTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\framework\nunit.framework.dll.csproj">
+      <Project>{83dd7e12-a705-4dba-9d71-09c8973d9382}</Project>
+      <Name>nunit.framework.dll</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.framework.tests.net45.build">
+      <SubType>Designer</SubType>
+    </None>
+  </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/NUnitFramework/tests-net45/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitFramework/tests-net45/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..de3b95d
Binary files /dev/null and b/src/NUnitFramework/tests-net45/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitFramework/tests-net45/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/src/NUnitFramework/tests-net45/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/NUnitFramework/tests-net45/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/src/NUnitFramework/tests-net45/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/NUnitFramework/tests-net45/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/src/NUnitFramework/tests-net45/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.csproj.FileListAbsolute.txt b/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..8c15a45
--- /dev/null
+++ b/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.framework.tests.net45.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.framework.tests.net45.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitFramework\tests-net45\obj\Debug\nunit.framework.tests.net45.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitFramework\tests-net45\obj\Debug\nunit.framework.tests.net45.dll
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitFramework\tests-net45\obj\Debug\nunit.framework.tests.net45.pdb
diff --git a/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.csprojResolveAssemblyReference.cache b/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..5c71683
Binary files /dev/null and b/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.csprojResolveAssemblyReference.cache differ
diff --git a/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.pdb b/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.pdb
new file mode 100644
index 0000000..6f320f6
Binary files /dev/null and b/src/NUnitFramework/tests-net45/obj/Debug/nunit.framework.tests.net45.pdb differ
diff --git a/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs b/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs
index ac0ff48..a9839fe 100644
--- a/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs
+++ b/src/NUnitFramework/tests/ArrayEqualsFailureMessageFixture.cs
@@ -1,240 +1,240 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// Summary description for ArrayEqualsFailureMessageFixture.
-	/// </summary>
-    [TestFixture]
-    public class ArrayEqualsFailureMessageFixture : MessageChecker
-    {
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ArraysHaveDifferentRanks()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4 };
-            int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ExpectedArrayIsLonger()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4, 5 };
-            int[] actual = new int[] { 1, 2, 3 };
-
-            expectedMessage =
-                "  Expected is <System.Int32[5]>, actual is <System.Int32[3]>" + Environment.NewLine +
-                "  Values differ at index [3]" + Environment.NewLine +
-                "  Missing:  < 4, 5 >";
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ActualArrayIsLonger()
-        {
-            int[] expected = new int[] { 1, 2, 3 };
-            int[] actual = new int[] { 1, 2, 3, 4, 5, 6, 7 };
-
-            expectedMessage =
-                "  Expected is <System.Int32[3]>, actual is <System.Int32[7]>" + Environment.NewLine +
-                "  Values differ at index [3]" + Environment.NewLine +
-                "  Extra:    < 4, 5, 6... >";
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailureOnSingleDimensionedArrays()
-        {
-            int[] expected = new int[] { 1, 2, 3 };
-            int[] actual = new int[] { 1, 5, 3 };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[3]>" + Environment.NewLine +
-                "  Values differ at index [1]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "5" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void DoubleDimensionedArrays()
-        {
-            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-            int[,] actual = new int[,] { { 1, 3, 2 }, { 4, 0, 6 } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[2,3]>" + Environment.NewLine +
-                "  Values differ at index [0,1]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "3" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void TripleDimensionedArrays()
-        {
-            int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
-            int[, ,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 0, 6 }, { 7, 8 } } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[2,2,2]>" + Environment.NewLine +
-                "  Values differ at index [1,0,0]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "5" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FiveDimensionedArrays()
-        {
-            int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-            int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 4, 3 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[2,2,2,2,2]>" + Environment.NewLine +
-                "  Values differ at index [0,0,0,1,0]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "3" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "4" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void JaggedArrays()
-        {
-            int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
-            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
-
-            expectedMessage =
-                "  Expected and actual are both <System.Int32[3][]>" + Environment.NewLine +
-                "  Values differ at index [1]" + Environment.NewLine +
-                "    Expected and actual are both <System.Int32[4]>" + Environment.NewLine +
-                "    Values differ at index [2]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "6" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void JaggedArrayComparedToSimpleArray()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
-            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[9]>, actual is <System.Int32[3][]>" + Environment.NewLine +
-                "  Values differ at index [0]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "1" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "< 1, 2, 3 >" + Environment.NewLine;
-            Expect(actual, EqualTo(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ArraysWithDifferentRanksAsCollection()
-        {
-            int[] expected = new int[] { 1, 2, 3, 4 };
-            int[,] actual = new int[,] { { 1, 0 }, { 3, 4 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine +
-                "  Values differ at expected index [1], actual index [0,1]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
-            Expect(actual, EqualTo(expected).AsCollection);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ArraysWithDifferentDimensionsAsCollection()
-        {
-            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-            int[,] actual = new int[,] { { 1, 2 }, { 3, 0 }, { 5, 6 } };
-
-            expectedMessage =
-                "  Expected is <System.Int32[2,3]>, actual is <System.Int32[3,2]>" + Environment.NewLine +
-                "  Values differ at expected index [1,0], actual index [1,1]" + Environment.NewLine +
-                TextMessageWriter.Pfx_Expected + "4" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
-            Expect(actual, EqualTo(expected).AsCollection);
-        }
-
-        //		[Test,ExpectedException(typeof(AssertionException))]
-        //		public void ExpectedArrayIsLonger()
-        //		{
-        //			string[] array1 = { "one", "two", "three" };
-        //			string[] array2 = { "one", "two", "three", "four", "five" };
-        //
-        //			expectedMessage =
-        //				"  Expected is <System.String[5]>, actual is <System.String[3]>" + Environment.NewLine +
-        //				"  Values differ at index [3]" + Environment.NewLine +
-        //				"  Missing:  < \"four\", \"five\" >";
-        //			Expect(array1, EqualTo(array2));
-        //		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void SameLengthDifferentContent()
-        {
-            string[] array1 = { "one", "two", "three" };
-            string[] array2 = { "one", "two", "ten" };
-
-            expectedMessage =
-                "  Expected and actual are both <System.String[3]>" + Environment.NewLine +
-                "  Values differ at index [2]" + Environment.NewLine +
-                "  Expected string length 3 but was 5. Strings differ at index 1." + Environment.NewLine +
-                "  Expected: \"ten\"" + Environment.NewLine +
-                "  But was:  \"three\"" + Environment.NewLine +
-                "  ------------^" + Environment.NewLine;
-            Expect(array1, EqualTo(array2));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ArraysDeclaredAsDifferentTypes()
-        {
-            string[] array1 = { "one", "two", "three" };
-            object[] array2 = { "one", "three", "two" };
-
-            expectedMessage =
-                "  Expected is <System.Object[3]>, actual is <System.String[3]>" + Environment.NewLine +
-                "  Values differ at index [1]" + Environment.NewLine +
-                "  Expected string length 5 but was 3. Strings differ at index 1." + Environment.NewLine +
-                "  Expected: \"three\"" + Environment.NewLine +
-                "  But was:  \"two\"" + Environment.NewLine +
-                "  ------------^" + Environment.NewLine;
-            Expect(array1, EqualTo(array2));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void ArrayAndCollection_Failure()
-        {
-            int[] a = new int[] { 1, 2, 3 };
-            ArrayList b = new ArrayList();
-            b.Add(1);
-            b.Add(3);
-            Assert.AreEqual(a, b);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void DifferentArrayTypesEqualFails()
-        {
-            string[] array1 = { "one", "two", "three" };
-            object[] array2 = { "one", "three", "two" };
-
-            expectedMessage =
-                "  Expected is <System.String[3]>, actual is <System.Object[3]>" + System.Environment.NewLine +
-                "  Values differ at index [1]" + System.Environment.NewLine +
-                "  Expected string length 3 but was 5. Strings differ at index 1." + System.Environment.NewLine +
-                "  Expected: \"two\"" + System.Environment.NewLine +
-                "  But was:  \"three\"" + System.Environment.NewLine +
-                "  ------------^" + System.Environment.NewLine;
-            Assert.AreEqual(array1, array2);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// Summary description for ArrayEqualsFailureMessageFixture.
+	/// </summary>
+    [TestFixture]
+    public class ArrayEqualsFailureMessageFixture : MessageChecker
+    {
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysHaveDifferentRanks()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4 };
+            int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ExpectedArrayIsLonger()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4, 5 };
+            int[] actual = new int[] { 1, 2, 3 };
+
+            expectedMessage =
+                "  Expected is <System.Int32[5]>, actual is <System.Int32[3]>" + Environment.NewLine +
+                "  Values differ at index [3]" + Environment.NewLine +
+                "  Missing:  < 4, 5 >";
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ActualArrayIsLonger()
+        {
+            int[] expected = new int[] { 1, 2, 3 };
+            int[] actual = new int[] { 1, 2, 3, 4, 5, 6, 7 };
+
+            expectedMessage =
+                "  Expected is <System.Int32[3]>, actual is <System.Int32[7]>" + Environment.NewLine +
+                "  Values differ at index [3]" + Environment.NewLine +
+                "  Extra:    < 4, 5, 6... >";
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailureOnSingleDimensionedArrays()
+        {
+            int[] expected = new int[] { 1, 2, 3 };
+            int[] actual = new int[] { 1, 5, 3 };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[3]>" + Environment.NewLine +
+                "  Values differ at index [1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "5" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoubleDimensionedArrays()
+        {
+            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
+            int[,] actual = new int[,] { { 1, 3, 2 }, { 4, 0, 6 } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[2,3]>" + Environment.NewLine +
+                "  Values differ at index [0,1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "3" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void TripleDimensionedArrays()
+        {
+            int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
+            int[, ,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 0, 6 }, { 7, 8 } } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[2,2,2]>" + Environment.NewLine +
+                "  Values differ at index [1,0,0]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "5" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FiveDimensionedArrays()
+        {
+            int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
+            int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 4, 3 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[2,2,2,2,2]>" + Environment.NewLine +
+                "  Values differ at index [0,0,0,1,0]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "3" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "4" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void JaggedArrays()
+        {
+            int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
+            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
+
+            expectedMessage =
+                "  Expected and actual are both <System.Int32[3][]>" + Environment.NewLine +
+                "  Values differ at index [1]" + Environment.NewLine +
+                "    Expected and actual are both <System.Int32[4]>" + Environment.NewLine +
+                "    Values differ at index [2]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "6" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void JaggedArrayComparedToSimpleArray()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+            int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 0, 7 }, new int[] { 8, 9 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[9]>, actual is <System.Int32[3][]>" + Environment.NewLine +
+                "  Values differ at index [0]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "1" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "< 1, 2, 3 >" + Environment.NewLine;
+            Expect(actual, EqualTo(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysWithDifferentRanksAsCollection()
+        {
+            int[] expected = new int[] { 1, 2, 3, 4 };
+            int[,] actual = new int[,] { { 1, 0 }, { 3, 4 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[4]>, actual is <System.Int32[2,2]>" + Environment.NewLine +
+                "  Values differ at expected index [1], actual index [0,1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "2" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected).AsCollection);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysWithDifferentDimensionsAsCollection()
+        {
+            int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
+            int[,] actual = new int[,] { { 1, 2 }, { 3, 0 }, { 5, 6 } };
+
+            expectedMessage =
+                "  Expected is <System.Int32[2,3]>, actual is <System.Int32[3,2]>" + Environment.NewLine +
+                "  Values differ at expected index [1,0], actual index [1,1]" + Environment.NewLine +
+                TextMessageWriter.Pfx_Expected + "4" + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "0" + Environment.NewLine;
+            Expect(actual, EqualTo(expected).AsCollection);
+        }
+
+        //		[Test,ExpectedException(typeof(AssertionException))]
+        //		public void ExpectedArrayIsLonger()
+        //		{
+        //			string[] array1 = { "one", "two", "three" };
+        //			string[] array2 = { "one", "two", "three", "four", "five" };
+        //
+        //			expectedMessage =
+        //				"  Expected is <System.String[5]>, actual is <System.String[3]>" + Environment.NewLine +
+        //				"  Values differ at index [3]" + Environment.NewLine +
+        //				"  Missing:  < \"four\", \"five\" >";
+        //			Expect(array1, EqualTo(array2));
+        //		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void SameLengthDifferentContent()
+        {
+            string[] array1 = { "one", "two", "three" };
+            string[] array2 = { "one", "two", "ten" };
+
+            expectedMessage =
+                "  Expected and actual are both <System.String[3]>" + Environment.NewLine +
+                "  Values differ at index [2]" + Environment.NewLine +
+                "  Expected string length 3 but was 5. Strings differ at index 1." + Environment.NewLine +
+                "  Expected: \"ten\"" + Environment.NewLine +
+                "  But was:  \"three\"" + Environment.NewLine +
+                "  ------------^" + Environment.NewLine;
+            Expect(array1, EqualTo(array2));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArraysDeclaredAsDifferentTypes()
+        {
+            string[] array1 = { "one", "two", "three" };
+            object[] array2 = { "one", "three", "two" };
+
+            expectedMessage =
+                "  Expected is <System.Object[3]>, actual is <System.String[3]>" + Environment.NewLine +
+                "  Values differ at index [1]" + Environment.NewLine +
+                "  Expected string length 5 but was 3. Strings differ at index 1." + Environment.NewLine +
+                "  Expected: \"three\"" + Environment.NewLine +
+                "  But was:  \"two\"" + Environment.NewLine +
+                "  ------------^" + Environment.NewLine;
+            Expect(array1, EqualTo(array2));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void ArrayAndCollection_Failure()
+        {
+            int[] a = new int[] { 1, 2, 3 };
+            ArrayList b = new ArrayList();
+            b.Add(1);
+            b.Add(3);
+            Assert.AreEqual(a, b);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DifferentArrayTypesEqualFails()
+        {
+            string[] array1 = { "one", "two", "three" };
+            object[] array2 = { "one", "three", "two" };
+
+            expectedMessage =
+                "  Expected is <System.String[3]>, actual is <System.Object[3]>" + System.Environment.NewLine +
+                "  Values differ at index [1]" + System.Environment.NewLine +
+                "  Expected string length 3 but was 5. Strings differ at index 1." + System.Environment.NewLine +
+                "  Expected: \"two\"" + System.Environment.NewLine +
+                "  But was:  \"three\"" + System.Environment.NewLine +
+                "  ------------^" + System.Environment.NewLine;
+            Assert.AreEqual(array1, array2);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/ArrayEqualsFixture.cs b/src/NUnitFramework/tests/ArrayEqualsFixture.cs
index b8964a7..aaa8555 100644
--- a/src/NUnitFramework/tests/ArrayEqualsFixture.cs
+++ b/src/NUnitFramework/tests/ArrayEqualsFixture.cs
@@ -1,202 +1,202 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// Summary description for ArrayEqualTests.
-	/// </summary>
-	[TestFixture]
-	public class ArrayEqualsFixture : AssertionHelper
-	{
-		[Test]
-		public void ArrayIsEqualToItself()
-		{
-			string[] array = { "one", "two", "three" };
-			Assert.AreSame( array, array );
-			Assert.AreEqual( array, array );
-            Expect(array, EqualTo(array));
-		}
-
-		[Test]
-		public void ArraysOfString()
-		{
-			string[] array1 = { "one", "two", "three" };
-			string[] array2 = { "one", "two", "three" };
-			Assert.IsFalse( array1 == array2 );
-            Assert.AreEqual(array1, array2);
-            Expect(array1, EqualTo(array2));
-            Assert.AreEqual(array2, array1);
-            Expect(array2, EqualTo(array1));
-        }
-
-        [Test]
-		public void ArraysOfInt()
-		{
-			int[] a = new int[] { 1, 2, 3 };
-			int[] b = new int[] { 1, 2, 3 };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void ArraysOfDouble()
-		{
-			double[] a = new double[] { 1.0, 2.0, 3.0 };
-			double[] b = new double[] { 1.0, 2.0, 3.0 };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void ArraysOfDecimal()
-		{
-			decimal[] a = new decimal[] { 1.0m, 2.0m, 3.0m };
-			decimal[] b = new decimal[] { 1.0m, 2.0m, 3.0m };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void ArrayOfIntAndArrayOfDouble()
-		{
-			int[] a = new int[] { 1, 2, 3 };
-			double[] b = new double[] { 1.0, 2.0, 3.0 };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void ArraysDeclaredAsDifferentTypes()
-		{
-			string[] array1 = { "one", "two", "three" };
-			object[] array2 = { "one", "two", "three" };
-			Assert.AreEqual( array1, array2, "String[] not equal to Object[]" );
-			Assert.AreEqual( array2, array1, "Object[] not equal to String[]" );
-			Expect(array1, EqualTo(array2), "String[] not equal to Object[]");
-			Expect(array2, EqualTo(array1), "Object[] not equal to String[]");
-		}
-
-		[Test]
-		public void ArraysOfMixedTypes()
-		{
-			DateTime now = DateTime.Now;
-			object[] array1 = new object[] { 1, 2.0f, 3.5d, 7.000m, "Hello", now };
-			object[] array2 = new object[] { 1.0d, 2, 3.5, 7, "Hello", now };
-			Assert.AreEqual( array1, array2 );
-			Assert.AreEqual(array2, array1);
-            Expect(array1, EqualTo(array2));
-            Expect(array2, EqualTo(array1));
-		}
-
-		[Test]
-		public void DoubleDimensionedArrays()
-		{
-			int[,] a = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
-			int[,] b = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void TripleDimensionedArrays()
-		{
-			int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
-			int[,,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
-
-			Assert.AreEqual(expected, actual);
-            Expect(actual, EqualTo(expected));
-		}
-
-		[Test]
-		public void FiveDimensionedArrays()
-		{
-			int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-			int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
-
-			Assert.AreEqual(expected, actual);
-            Expect(actual, EqualTo(expected));
-		}
-
-		[Test]
-		public void ArraysOfArrays()
-		{
-			int[][] a = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } };
-			int[][] b = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void JaggedArrays()
-		{
-			int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
-			int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
-
-			Assert.AreEqual(expected, actual);
-            Expect(actual, EqualTo(expected));
-		}
-
-		[Test]
-		public void ArraysPassedAsObjects()
-		{
-			object a = new int[] { 1, 2, 3 };
-			object b = new double[] { 1.0, 2.0, 3.0 };
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void ArrayAndCollection()
-		{
-			int[] a = new int[] { 1, 2, 3 };
-			ICollection b = new ArrayList( a );
-            Assert.AreEqual(a, b);
-            Assert.AreEqual(b, a);
-            Expect(a, EqualTo(b));
-            Expect(b, EqualTo(a));
-        }
-
-		[Test]
-		public void ArraysWithDifferentRanksComparedAsCollection()
-		{
-			int[] expected = new int[] { 1, 2, 3, 4 };
-			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
-
-			Assert.AreNotEqual(expected, actual);
-            Expect(actual, Not.EqualTo(expected));
-            Expect(actual, EqualTo(expected).AsCollection);
-		}
-
-		[Test]
-		public void ArraysWithDifferentDimensionsMatchedAsCollection()
-		{
-			int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
-			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
-
-			Assert.AreNotEqual(expected, actual);
-            Expect(actual, Not.EqualTo(expected));
-            Expect(actual, EqualTo(expected).AsCollection);
-		}
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// Summary description for ArrayEqualTests.
+	/// </summary>
+	[TestFixture]
+	public class ArrayEqualsFixture : AssertionHelper
+	{
+		[Test]
+		public void ArrayIsEqualToItself()
+		{
+			string[] array = { "one", "two", "three" };
+			Assert.AreSame( array, array );
+			Assert.AreEqual( array, array );
+            Expect(array, EqualTo(array));
+		}
+
+		[Test]
+		public void ArraysOfString()
+		{
+			string[] array1 = { "one", "two", "three" };
+			string[] array2 = { "one", "two", "three" };
+			Assert.IsFalse( array1 == array2 );
+            Assert.AreEqual(array1, array2);
+            Expect(array1, EqualTo(array2));
+            Assert.AreEqual(array2, array1);
+            Expect(array2, EqualTo(array1));
+        }
+
+        [Test]
+		public void ArraysOfInt()
+		{
+			int[] a = new int[] { 1, 2, 3 };
+			int[] b = new int[] { 1, 2, 3 };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void ArraysOfDouble()
+		{
+			double[] a = new double[] { 1.0, 2.0, 3.0 };
+			double[] b = new double[] { 1.0, 2.0, 3.0 };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void ArraysOfDecimal()
+		{
+			decimal[] a = new decimal[] { 1.0m, 2.0m, 3.0m };
+			decimal[] b = new decimal[] { 1.0m, 2.0m, 3.0m };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void ArrayOfIntAndArrayOfDouble()
+		{
+			int[] a = new int[] { 1, 2, 3 };
+			double[] b = new double[] { 1.0, 2.0, 3.0 };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void ArraysDeclaredAsDifferentTypes()
+		{
+			string[] array1 = { "one", "two", "three" };
+			object[] array2 = { "one", "two", "three" };
+			Assert.AreEqual( array1, array2, "String[] not equal to Object[]" );
+			Assert.AreEqual( array2, array1, "Object[] not equal to String[]" );
+			Expect(array1, EqualTo(array2), "String[] not equal to Object[]");
+			Expect(array2, EqualTo(array1), "Object[] not equal to String[]");
+		}
+
+		[Test]
+		public void ArraysOfMixedTypes()
+		{
+			DateTime now = DateTime.Now;
+			object[] array1 = new object[] { 1, 2.0f, 3.5d, 7.000m, "Hello", now };
+			object[] array2 = new object[] { 1.0d, 2, 3.5, 7, "Hello", now };
+			Assert.AreEqual( array1, array2 );
+			Assert.AreEqual(array2, array1);
+            Expect(array1, EqualTo(array2));
+            Expect(array2, EqualTo(array1));
+		}
+
+		[Test]
+		public void DoubleDimensionedArrays()
+		{
+			int[,] a = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
+			int[,] b = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void TripleDimensionedArrays()
+		{
+			int[, ,] expected = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
+			int[,,] actual = new int[,,] { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } };
+
+			Assert.AreEqual(expected, actual);
+            Expect(actual, EqualTo(expected));
+		}
+
+		[Test]
+		public void FiveDimensionedArrays()
+		{
+			int[, , , ,] expected = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
+			int[, , , ,] actual = new int[2, 2, 2, 2, 2] { { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } }, { { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }, { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } } } };
+
+			Assert.AreEqual(expected, actual);
+            Expect(actual, EqualTo(expected));
+		}
+
+		[Test]
+		public void ArraysOfArrays()
+		{
+			int[][] a = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } };
+			int[][] b = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void JaggedArrays()
+		{
+			int[][] expected = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
+			int[][] actual = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6, 7 }, new int[] { 8, 9 } };
+
+			Assert.AreEqual(expected, actual);
+            Expect(actual, EqualTo(expected));
+		}
+
+		[Test]
+		public void ArraysPassedAsObjects()
+		{
+			object a = new int[] { 1, 2, 3 };
+			object b = new double[] { 1.0, 2.0, 3.0 };
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void ArrayAndCollection()
+		{
+			int[] a = new int[] { 1, 2, 3 };
+			ICollection b = new ArrayList( a );
+            Assert.AreEqual(a, b);
+            Assert.AreEqual(b, a);
+            Expect(a, EqualTo(b));
+            Expect(b, EqualTo(a));
+        }
+
+		[Test]
+		public void ArraysWithDifferentRanksComparedAsCollection()
+		{
+			int[] expected = new int[] { 1, 2, 3, 4 };
+			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 } };
+
+			Assert.AreNotEqual(expected, actual);
+            Expect(actual, Not.EqualTo(expected));
+            Expect(actual, EqualTo(expected).AsCollection);
+		}
+
+		[Test]
+		public void ArraysWithDifferentDimensionsMatchedAsCollection()
+		{
+			int[,] expected = new int[,] { { 1, 2, 3 }, { 4, 5, 6 } };
+			int[,] actual = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
+
+			Assert.AreNotEqual(expected, actual);
+            Expect(actual, Not.EqualTo(expected));
+            Expect(actual, EqualTo(expected).AsCollection);
+		}
+    }
+}
diff --git a/src/NUnitFramework/tests/ArrayNotEqualFixture.cs b/src/NUnitFramework/tests/ArrayNotEqualFixture.cs
index b327c5d..c1eca78 100644
--- a/src/NUnitFramework/tests/ArrayNotEqualFixture.cs
+++ b/src/NUnitFramework/tests/ArrayNotEqualFixture.cs
@@ -1,51 +1,51 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// Summary description for ArrayNotEqualFixture.
-	/// </summary>
-	[TestFixture]
-	public class ArrayNotEqualFixture : AssertionHelper
-	{
-		[Test]
-		public void DifferentLengthArrays()
-		{
-			string[] array1 = { "one", "two", "three" };
-			string[] array2 = { "one", "two", "three", "four", "five" };
-
-			Assert.AreNotEqual(array1, array2);
-			Assert.AreNotEqual(array2, array1);
-            Expect(array1, Not.EqualTo(array2));
-            Expect(array2, Not.EqualTo(array1));
-		}
-
-		[Test]
-		public void SameLengthDifferentContent()
-		{
-			string[] array1 = { "one", "two", "three" };
-			string[] array2 = { "one", "two", "ten" };
-			Assert.AreNotEqual(array1, array2);
-			Assert.AreNotEqual(array2, array1);
-            Expect(array1, Not.EqualTo(array2));
-            Expect(array2, Not.EqualTo(array1));
-		}
-
-		[Test]
-		public void ArraysDeclaredAsDifferentTypes()
-		{
-			string[] array1 = { "one", "two", "three" };
-			object[] array2 = { "one", "three", "two" };
-			Assert.AreNotEqual(array1, array2);
-            Expect(array1, Not.EqualTo(array2));
-            Expect(array2, Not.EqualTo(array1));
-		}
-
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// Summary description for ArrayNotEqualFixture.
+	/// </summary>
+	[TestFixture]
+	public class ArrayNotEqualFixture : AssertionHelper
+	{
+		[Test]
+		public void DifferentLengthArrays()
+		{
+			string[] array1 = { "one", "two", "three" };
+			string[] array2 = { "one", "two", "three", "four", "five" };
+
+			Assert.AreNotEqual(array1, array2);
+			Assert.AreNotEqual(array2, array1);
+            Expect(array1, Not.EqualTo(array2));
+            Expect(array2, Not.EqualTo(array1));
+		}
+
+		[Test]
+		public void SameLengthDifferentContent()
+		{
+			string[] array1 = { "one", "two", "three" };
+			string[] array2 = { "one", "two", "ten" };
+			Assert.AreNotEqual(array1, array2);
+			Assert.AreNotEqual(array2, array1);
+            Expect(array1, Not.EqualTo(array2));
+            Expect(array2, Not.EqualTo(array1));
+		}
+
+		[Test]
+		public void ArraysDeclaredAsDifferentTypes()
+		{
+			string[] array1 = { "one", "two", "three" };
+			object[] array2 = { "one", "three", "two" };
+			Assert.AreNotEqual(array1, array2);
+            Expect(array1, Not.EqualTo(array2));
+            Expect(array2, Not.EqualTo(array1));
+		}
+
+	}
+}
diff --git a/src/NUnitFramework/tests/AssertThrowsTests.cs b/src/NUnitFramework/tests/AssertThrowsTests.cs
index 786ed99..cc53a87 100644
--- a/src/NUnitFramework/tests/AssertThrowsTests.cs
+++ b/src/NUnitFramework/tests/AssertThrowsTests.cs
@@ -1,191 +1,191 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-//using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class AssertThrowsTests : MessageChecker
-	{
-        [Test]
-        public void CanCatchUnspecifiedException()
-        {
-            Exception ex = Assert.Catch(new TestDelegate(TestDelegates.ThrowsArgumentException));
-            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
-
-#if CLR_2_0 || CLR_4_0
-            ex = Assert.Catch(TestDelegates.ThrowsArgumentException);
-            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
-#endif
-        }
-
-        [Test]
-        public void CanCatchExceptionOfExactType()
-        {
-            Exception ex = Assert.Catch(typeof(ArgumentException), new TestDelegate(TestDelegates.ThrowsArgumentException));
-            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
-
-#if CLR_2_0 || CLR_4_0
-            ex = Assert.Catch<ArgumentException>(new TestDelegate(TestDelegates.ThrowsArgumentException));
-            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
-#endif
-        }
-
-        [Test]
-        public void CanCatchExceptionOfDerivedType()
-        {
-            Exception ex = Assert.Catch(typeof(ApplicationException), new TestDelegate(TestDelegates.ThrowsDerivedApplicationException));
-            Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
-
-#if CLR_2_0 || CLR_4_0
-            ex = Assert.Catch<ApplicationException>(TestDelegates.ThrowsDerivedApplicationException);
-            Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
-#endif
-        }
-
-        [Test]
-		public void CorrectExceptionThrown()
-        {
-#if CLR_2_0 || CLR_4_0
-            Assert.Throws(typeof(ArgumentException), TestDelegates.ThrowsArgumentException);
-            Assert.Throws(typeof(ArgumentException),
-                delegate { throw new ArgumentException(); });
-
-            Assert.Throws<ArgumentException>(
-                delegate { throw new ArgumentException(); });
-            Assert.Throws<ArgumentException>(TestDelegates.ThrowsArgumentException);
-
-            // Without cast, delegate is ambiguous before C# 3.0.
-            Assert.That((TestDelegate)delegate { throw new ArgumentException(); },
-                    Throws.Exception.TypeOf<ArgumentException>() );
-            //Assert.Throws( Is.TypeOf(typeof(ArgumentException)),
-            //        delegate { throw new ArgumentException(); } );
-#else
-			Assert.Throws(typeof(ArgumentException),
-				new TestDelegate( TestDelegates.ThrowsArgumentException ) );
-#endif
-        }
-
-		[Test]
-		public void CorrectExceptionIsReturnedToMethod()
-		{
-			ArgumentException ex = Assert.Throws(typeof(ArgumentException),
-                new TestDelegate(TestDelegates.ThrowsArgumentException)) as ArgumentException;
-
-            Assert.IsNotNull(ex, "No ArgumentException thrown");
-            Assert.That(ex.Message, StartsWith("myMessage"));
-            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
-
-#if CLR_2_0 || CLR_4_0
-            ex = Assert.Throws<ArgumentException>(
-                delegate { throw new ArgumentException("myMessage", "myParam"); }) as ArgumentException;
-
-            Assert.IsNotNull(ex, "No ArgumentException thrown");
-            Assert.That(ex.Message, StartsWith("myMessage"));
-            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
-
-			ex = Assert.Throws(typeof(ArgumentException), 
-                delegate { throw new ArgumentException("myMessage", "myParam"); } ) as ArgumentException;
-
-            Assert.IsNotNull(ex, "No ArgumentException thrown");
-            Assert.That(ex.Message, StartsWith("myMessage"));
-            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
-
-            ex = Assert.Throws<ArgumentException>(TestDelegates.ThrowsArgumentException) as ArgumentException;
-
-            Assert.IsNotNull(ex, "No ArgumentException thrown");
-            Assert.That(ex.Message, StartsWith("myMessage"));
-            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
-#endif
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void NoExceptionThrown()
-		{
-			expectedMessage =
-				"  Expected: <System.ArgumentException>" + Environment.NewLine +
-				"  But was:  null" + Environment.NewLine;
-#if CLR_2_0 || CLR_4_0
-            Assert.Throws<ArgumentException>(TestDelegates.ThrowsNothing);
-#else
-			Assert.Throws( typeof(ArgumentException),
-				new TestDelegate( TestDelegates.ThrowsNothing ) );
-#endif
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void UnrelatedExceptionThrown()
-        {
-            expectedMessage =
-                "  Expected: <System.ArgumentException>" + Environment.NewLine +
-                "  But was:  <System.ApplicationException> (my message)" + Environment.NewLine;
-            matchType = MessageMatch.StartsWith;
-
-#if CLR_2_0 || CLR_4_0
-            Assert.Throws<ArgumentException>(TestDelegates.ThrowsApplicationException);
-#else
-			Assert.Throws( typeof(ArgumentException),
-				new TestDelegate(TestDelegates.ThrowsApplicationException) );
-#endif
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void BaseExceptionThrown()
-        {
-            expectedMessage =
-                "  Expected: <System.ArgumentException>" + Environment.NewLine +
-                "  But was:  <System.Exception> (my message)" + Environment.NewLine;
-            matchType = MessageMatch.StartsWith;
-
-#if CLR_2_0 || CLR_4_0
-            Assert.Throws<ArgumentException>(TestDelegates.ThrowsSystemException);
-#else
-            Assert.Throws( typeof(ArgumentException),
-                new TestDelegate( TestDelegates.ThrowsSystemException) );
-#endif
-        }
-
-        [Test,ExpectedException(typeof(AssertionException))]
-        public void DerivedExceptionThrown()
-        {
-            expectedMessage =
-                "  Expected: <System.Exception>" + Environment.NewLine +
-                "  But was:  <System.ArgumentException> (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),
-				new TestDelegate( TestDelegates.ThrowsArgumentException) );
-#endif
-        }
-
-        [Test]
-        public void DoesNotThrowSuceeds()
-        {
-#if CLR_2_0 || CLR_4_0
-            Assert.DoesNotThrow(TestDelegates.ThrowsNothing);
-#else
-            Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsNothing ) );
-
-			Assert.That( new TestDelegate( TestDelegates.ThrowsNothing ), Throws.Nothing );
-#endif
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void DoesNotThrowFails()
-        {
-#if CLR_2_0 || CLR_4_0
-            Assert.DoesNotThrow(TestDelegates.ThrowsArgumentException);
-#else
-            Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsArgumentException ) );
-#endif
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+//using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class AssertThrowsTests : MessageChecker
+	{
+        [Test]
+        public void CanCatchUnspecifiedException()
+        {
+            Exception ex = Assert.Catch(new TestDelegate(TestDelegates.ThrowsArgumentException));
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+
+#if CLR_2_0 || CLR_4_0
+            ex = Assert.Catch(TestDelegates.ThrowsArgumentException);
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+#endif
+        }
+
+        [Test]
+        public void CanCatchExceptionOfExactType()
+        {
+            Exception ex = Assert.Catch(typeof(ArgumentException), new TestDelegate(TestDelegates.ThrowsArgumentException));
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+
+#if CLR_2_0 || CLR_4_0
+            ex = Assert.Catch<ArgumentException>(new TestDelegate(TestDelegates.ThrowsArgumentException));
+            Assert.That(ex, Is.TypeOf(typeof(ArgumentException)));
+#endif
+        }
+
+        [Test]
+        public void CanCatchExceptionOfDerivedType()
+        {
+            Exception ex = Assert.Catch(typeof(ApplicationException), new TestDelegate(TestDelegates.ThrowsDerivedApplicationException));
+            Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
+
+#if CLR_2_0 || CLR_4_0
+            ex = Assert.Catch<ApplicationException>(TestDelegates.ThrowsDerivedApplicationException);
+            Assert.That(ex, Is.TypeOf(typeof(TestDelegates.DerivedApplicationException)));
+#endif
+        }
+
+        [Test]
+		public void CorrectExceptionThrown()
+        {
+#if CLR_2_0 || CLR_4_0
+            Assert.Throws(typeof(ArgumentException), TestDelegates.ThrowsArgumentException);
+            Assert.Throws(typeof(ArgumentException),
+                delegate { throw new ArgumentException(); });
+
+            Assert.Throws<ArgumentException>(
+                delegate { throw new ArgumentException(); });
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsArgumentException);
+
+            // Without cast, delegate is ambiguous before C# 3.0.
+            Assert.That((TestDelegate)delegate { throw new ArgumentException(); },
+                    Throws.Exception.TypeOf<ArgumentException>() );
+            //Assert.Throws( Is.TypeOf(typeof(ArgumentException)),
+            //        delegate { throw new ArgumentException(); } );
+#else
+			Assert.Throws(typeof(ArgumentException),
+				new TestDelegate( TestDelegates.ThrowsArgumentException ) );
+#endif
+        }
+
+		[Test]
+		public void CorrectExceptionIsReturnedToMethod()
+		{
+			ArgumentException ex = Assert.Throws(typeof(ArgumentException),
+                new TestDelegate(TestDelegates.ThrowsArgumentException)) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+
+#if CLR_2_0 || CLR_4_0
+            ex = Assert.Throws<ArgumentException>(
+                delegate { throw new ArgumentException("myMessage", "myParam"); }) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+
+			ex = Assert.Throws(typeof(ArgumentException), 
+                delegate { throw new ArgumentException("myMessage", "myParam"); } ) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+
+            ex = Assert.Throws<ArgumentException>(TestDelegates.ThrowsArgumentException) as ArgumentException;
+
+            Assert.IsNotNull(ex, "No ArgumentException thrown");
+            Assert.That(ex.Message, StartsWith("myMessage"));
+            Assert.That(ex.ParamName, Is.EqualTo("myParam"));
+#endif
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void NoExceptionThrown()
+		{
+			expectedMessage =
+				"  Expected: <System.ArgumentException>" + Environment.NewLine +
+				"  But was:  null" + Environment.NewLine;
+#if CLR_2_0 || CLR_4_0
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsNothing);
+#else
+			Assert.Throws( typeof(ArgumentException),
+				new TestDelegate( TestDelegates.ThrowsNothing ) );
+#endif
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void UnrelatedExceptionThrown()
+        {
+            expectedMessage =
+                "  Expected: <System.ArgumentException>" + Environment.NewLine +
+                "  But was:  <System.ApplicationException> (my message)" + Environment.NewLine;
+            matchType = MessageMatch.StartsWith;
+
+#if CLR_2_0 || CLR_4_0
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsApplicationException);
+#else
+			Assert.Throws( typeof(ArgumentException),
+				new TestDelegate(TestDelegates.ThrowsApplicationException) );
+#endif
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void BaseExceptionThrown()
+        {
+            expectedMessage =
+                "  Expected: <System.ArgumentException>" + Environment.NewLine +
+                "  But was:  <System.Exception> (my message)" + Environment.NewLine;
+            matchType = MessageMatch.StartsWith;
+
+#if CLR_2_0 || CLR_4_0
+            Assert.Throws<ArgumentException>(TestDelegates.ThrowsSystemException);
+#else
+            Assert.Throws( typeof(ArgumentException),
+                new TestDelegate( TestDelegates.ThrowsSystemException) );
+#endif
+        }
+
+        [Test,ExpectedException(typeof(AssertionException))]
+        public void DerivedExceptionThrown()
+        {
+            expectedMessage =
+                "  Expected: <System.Exception>" + Environment.NewLine +
+                "  But was:  <System.ArgumentException> (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),
+				new TestDelegate( TestDelegates.ThrowsArgumentException) );
+#endif
+        }
+
+        [Test]
+        public void DoesNotThrowSuceeds()
+        {
+#if CLR_2_0 || CLR_4_0
+            Assert.DoesNotThrow(TestDelegates.ThrowsNothing);
+#else
+            Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsNothing ) );
+
+			Assert.That( new TestDelegate( TestDelegates.ThrowsNothing ), Throws.Nothing );
+#endif
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotThrowFails()
+        {
+#if CLR_2_0 || CLR_4_0
+            Assert.DoesNotThrow(TestDelegates.ThrowsArgumentException);
+#else
+            Assert.DoesNotThrow( new TestDelegate( TestDelegates.ThrowsArgumentException ) );
+#endif
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/AssumeThatTests.cs b/src/NUnitFramework/tests/AssumeThatTests.cs
index 34d923a..ca4f638 100644
--- a/src/NUnitFramework/tests/AssumeThatTests.cs
+++ b/src/NUnitFramework/tests/AssumeThatTests.cs
@@ -1,174 +1,179 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-
-namespace NUnit.Framework.Tests
-{
-    [TestFixture]
-    public class AssumeThatTests
-    {
-        [Test]
-        public void AssumptionPasses_Boolean()
-        {
-            Assume.That(2 + 2 == 4);
-        }
-
-        [Test]
-        public void AssumptionPasses_BooleanWithMessage()
-        {
-            Assume.That(2 + 2 == 4, "Not Equal");
-        }
-
-        [Test]
-        public void AssumptionPasses_BooleanWithMessageAndArgs()
-        {
-            Assume.That(2 + 2 == 4, "Not Equal to {0}", 4);
-        }
-
-        [Test]
-        public void AssumptionPasses_ActualAndConstraint()
-        {
-            Assume.That(2 + 2, Is.EqualTo(4));
-        }
-
-        [Test]
-        public void AssumptionPasses_ActualAndConstraintWithMessage()
-        {
-            Assume.That(2 + 2, Is.EqualTo(4), "Should be 4");
-        }
-
-        [Test]
-        public void AssumptionPasses_ActualAndConstraintWithMessageAndArgs()
-        {
-            Assume.That(2 + 2, Is.EqualTo(4), "Should be {0}", 4);
-        }
-
-        [Test]
-        public void AssumptionPasses_ReferenceAndConstraint()
-        {
-            bool value = true;
-            Assume.That(ref value, Is.True);
-        }
-
-        [Test]
-        public void AssumptionPasses_ReferenceAndConstraintWithMessage()
-        {
-            bool value = true;
-            Assume.That(ref value, Is.True, "Message");
-        }
-
-        [Test]
-        public void AssumptionPasses_ReferenceAndConstraintWithMessageAndArgs()
-        {
-            bool value = true;
-            Assume.That(ref value, Is.True, "Message", 42);
-        }
-
-        [Test]
-        public void AssumptionPasses_DelegateAndConstraint()
-        {
-            Assume.That(new Constraints.ActualValueDelegate(ReturnsFour), Is.EqualTo(4));
-        }
-
-        [Test]
-        public void AssumptionPasses_DelegateAndConstraintWithMessage()
-        {
-            Assume.That(new Constraints.ActualValueDelegate(ReturnsFour), Is.EqualTo(4), "Message");
-        }
-
-        [Test]
-        public void AssumptionPasses_DelegateAndConstraintWithMessageAndArgs()
-        {
-            Assume.That(new Constraints.ActualValueDelegate(ReturnsFour), Is.EqualTo(4), "Should be {0}", 4);
-        }
-
-        private object ReturnsFour()
-        {
-            return 4;
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_Boolean()
-        {
-            Assume.That(2 + 2 == 5);
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_BooleanWithMessage()
-        {
-            Assume.That(2 + 2 == 5, "message");
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_BooleanWithMessageAndArgs()
-        {
-            Assume.That(2 + 2 == 5, "message", 5);
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_ActualAndConstraint()
-        {
-            Assume.That(2 + 2, Is.EqualTo(5));
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_ActualAndConstraintWithMessage()
-        {
-            Assume.That(2 + 2, Is.EqualTo(5), "Error");
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_ActualAndConstraintWithMessageAndArgs()
-        {
-            Assume.That(2 + 2, Is.EqualTo(5), "Should be {0}", 5);
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_ReferenceAndConstraint()
-        {
-            bool value = false;
-            Assume.That(ref value, Is.True);
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_ReferenceAndConstraintWithMessage()
-        {
-            bool value = false;
-            Assume.That(ref value, Is.True, "message");
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_ReferenceAndConstraintWithMessageAndArgs()
-        {
-            bool value = false;
-            Assume.That(ref value, Is.True, "message", 42);
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_DelegateAndConstraint()
-        {
-            Assume.That(new Constraints.ActualValueDelegate(ReturnsFive), Is.EqualTo(4));
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_DelegateAndConstraintWithMessage()
-        {
-            Assume.That(new Constraints.ActualValueDelegate(ReturnsFive), Is.EqualTo(4), "Error");
-        }
-
-        [Test, ExpectedException(typeof(InconclusiveException))]
-        public void FailureThrowsInconclusiveException_DelegateAndConstraintWithMessageAndArgs()
-        {
-            Assume.That(new Constraints.ActualValueDelegate(ReturnsFive), Is.EqualTo(4), "Should be {0}", 4);
-        }
-
-        private object ReturnsFive()
-        {
-            return 5;
-        }
-    }
-}
+// ****************************************************************
+// 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;
+#if CLR_2_0 || CLR_4_0
+using ActualValueDelegate = NUnit.Framework.Constraints.ActualValueDelegate<object>;
+#else
+using ActualValueDelegate = NUnit.Framework.Constraints.ActualValueDelegate;
+#endif
+
+namespace NUnit.Framework.Tests
+{
+    [TestFixture]
+    public class AssumeThatTests
+    {
+        [Test]
+        public void AssumptionPasses_Boolean()
+        {
+            Assume.That(2 + 2 == 4);
+        }
+
+        [Test]
+        public void AssumptionPasses_BooleanWithMessage()
+        {
+            Assume.That(2 + 2 == 4, "Not Equal");
+        }
+
+        [Test]
+        public void AssumptionPasses_BooleanWithMessageAndArgs()
+        {
+            Assume.That(2 + 2 == 4, "Not Equal to {0}", 4);
+        }
+
+        [Test]
+        public void AssumptionPasses_ActualAndConstraint()
+        {
+            Assume.That(2 + 2, Is.EqualTo(4));
+        }
+
+        [Test]
+        public void AssumptionPasses_ActualAndConstraintWithMessage()
+        {
+            Assume.That(2 + 2, Is.EqualTo(4), "Should be 4");
+        }
+
+        [Test]
+        public void AssumptionPasses_ActualAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(2 + 2, Is.EqualTo(4), "Should be {0}", 4);
+        }
+
+        [Test]
+        public void AssumptionPasses_ReferenceAndConstraint()
+        {
+            bool value = true;
+            Assume.That(ref value, Is.True);
+        }
+
+        [Test]
+        public void AssumptionPasses_ReferenceAndConstraintWithMessage()
+        {
+            bool value = true;
+            Assume.That(ref value, Is.True, "Message");
+        }
+
+        [Test]
+        public void AssumptionPasses_ReferenceAndConstraintWithMessageAndArgs()
+        {
+            bool value = true;
+            Assume.That(ref value, Is.True, "Message", 42);
+        }
+
+        [Test]
+        public void AssumptionPasses_DelegateAndConstraint()
+        {
+            Assume.That(new ActualValueDelegate(ReturnsFour), Is.EqualTo(4));
+        }
+
+        [Test]
+        public void AssumptionPasses_DelegateAndConstraintWithMessage()
+        {
+            Assume.That(new ActualValueDelegate(ReturnsFour), Is.EqualTo(4), "Message");
+        }
+
+        [Test]
+        public void AssumptionPasses_DelegateAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(new ActualValueDelegate(ReturnsFour), Is.EqualTo(4), "Should be {0}", 4);
+        }
+
+        private object ReturnsFour()
+        {
+            return 4;
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_Boolean()
+        {
+            Assume.That(2 + 2 == 5);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_BooleanWithMessage()
+        {
+            Assume.That(2 + 2 == 5, "message");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_BooleanWithMessageAndArgs()
+        {
+            Assume.That(2 + 2 == 5, "message", 5);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ActualAndConstraint()
+        {
+            Assume.That(2 + 2, Is.EqualTo(5));
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ActualAndConstraintWithMessage()
+        {
+            Assume.That(2 + 2, Is.EqualTo(5), "Error");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ActualAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(2 + 2, Is.EqualTo(5), "Should be {0}", 5);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ReferenceAndConstraint()
+        {
+            bool value = false;
+            Assume.That(ref value, Is.True);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ReferenceAndConstraintWithMessage()
+        {
+            bool value = false;
+            Assume.That(ref value, Is.True, "message");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_ReferenceAndConstraintWithMessageAndArgs()
+        {
+            bool value = false;
+            Assume.That(ref value, Is.True, "message", 42);
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_DelegateAndConstraint()
+        {
+            Assume.That(new ActualValueDelegate(ReturnsFive), Is.EqualTo(4));
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_DelegateAndConstraintWithMessage()
+        {
+            Assume.That(new ActualValueDelegate(ReturnsFive), Is.EqualTo(4), "Error");
+        }
+
+        [Test, ExpectedException(typeof(InconclusiveException))]
+        public void FailureThrowsInconclusiveException_DelegateAndConstraintWithMessageAndArgs()
+        {
+            Assume.That(new ActualValueDelegate(ReturnsFive), Is.EqualTo(4), "Should be {0}", 4);
+        }
+
+        private object ReturnsFive()
+        {
+            return 5;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/CollectionAdapter.cs b/src/NUnitFramework/tests/CollectionAdapter.cs
index 6fad66b..c0651c6 100644
--- a/src/NUnitFramework/tests/CollectionAdapter.cs
+++ b/src/NUnitFramework/tests/CollectionAdapter.cs
@@ -1,63 +1,63 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// ICollectionAdapter is used in testing to wrap an array or
-	/// ArrayList, ensuring that only methods of the ICollection
-	/// interface are accessible.
-	/// </summary>
-	class ICollectionAdapter : ICollection
-	{
-		private readonly ICollection inner;
-
-		public ICollectionAdapter(ICollection inner)
-		{
-			this.inner = inner;
-		}
-
-		public ICollectionAdapter(params object[] inner)
-		{
-			this.inner = inner;
-		}
-
-		#region ICollection Members
-
-		public void CopyTo(Array array, int index)
-		{
-			inner.CopyTo(array, index);
-		}
-
-		public int Count
-		{
-			get { return inner.Count; }
-		}
-
-		public bool IsSynchronized
-		{
-			get { return  inner.IsSynchronized; }
-		}
-
-		public object SyncRoot
-		{
-			get { return inner.SyncRoot; }
-		}
-
-		#endregion
-
-		#region IEnumerable Members
-
-		public IEnumerator GetEnumerator()
-		{
-			return inner.GetEnumerator();
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// ICollectionAdapter is used in testing to wrap an array or
+	/// ArrayList, ensuring that only methods of the ICollection
+	/// interface are accessible.
+	/// </summary>
+	class ICollectionAdapter : ICollection
+	{
+		private readonly ICollection inner;
+
+		public ICollectionAdapter(ICollection inner)
+		{
+			this.inner = inner;
+		}
+
+		public ICollectionAdapter(params object[] inner)
+		{
+			this.inner = inner;
+		}
+
+		#region ICollection Members
+
+		public void CopyTo(Array array, int index)
+		{
+			inner.CopyTo(array, index);
+		}
+
+		public int Count
+		{
+			get { return inner.Count; }
+		}
+
+		public bool IsSynchronized
+		{
+			get { return  inner.IsSynchronized; }
+		}
+
+		public object SyncRoot
+		{
+			get { return inner.SyncRoot; }
+		}
+
+		#endregion
+
+		#region IEnumerable Members
+
+		public IEnumerator GetEnumerator()
+		{
+			return inner.GetEnumerator();
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitFramework/tests/CollectionAssertTest.cs b/src/NUnitFramework/tests/CollectionAssertTest.cs
index 234a6fb..510e1f9 100644
--- a/src/NUnitFramework/tests/CollectionAssertTest.cs
+++ b/src/NUnitFramework/tests/CollectionAssertTest.cs
@@ -1,762 +1,762 @@
-// ****************************************************************
-// 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;
-#if NET_3_5 || NET_4_0
-using System.Linq;
-#endif
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// Test Library for the NUnit CollectionAssert class.
-	/// </summary>
-	[TestFixture()]
-	public class CollectionAssertTest : MessageChecker
-	{
-		#region AllItemsAreInstancesOfType
-		[Test()]
-		public void ItemsOfType()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add("z");
-			CollectionAssert.AllItemsAreInstancesOfType(al,typeof(string));
-        }
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ItemsOfTypeFailure()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add(new object());
-
-			expectedMessage =
-				"  Expected: all items instance of <System.String>" + Environment.NewLine +
-				"  But was:  < \"x\", \"y\", <System.Object> >" + Environment.NewLine;
-			CollectionAssert.AllItemsAreInstancesOfType(al,typeof(string));
-		}
-		#endregion
-
-		#region AllItemsAreNotNull
-		[Test()]
-		public void ItemsNotNull()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add("z");
-
-			CollectionAssert.AllItemsAreNotNull(al);
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ItemsNotNullFailure()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add(null);
-			al.Add("z");
-
-			expectedMessage =
-                "  Expected: all items not null" + Environment.NewLine +
-                "  But was:  < \"x\", null, \"z\" >" + Environment.NewLine;
-			CollectionAssert.AllItemsAreNotNull(al);
-		}
-		#endregion
-
-		#region AllItemsAreUnique
-
-		[Test]
-		public void Unique_WithObjects()
-		{
-			CollectionAssert.AllItemsAreUnique(
-				new ICollectionAdapter( new object(), new object(), new object() ) );
-		}
-
-		[Test]
-		public void Unique_WithStrings()
-		{
-			CollectionAssert.AllItemsAreUnique( new ICollectionAdapter( "x", "y", "z" ) );
-		}
-
-		[Test]
-		public void Unique_WithNull()
-		{
-			CollectionAssert.AllItemsAreUnique(	new ICollectionAdapter( "x", "y", null, "z" ) );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void UniqueFailure()
-		{
-			expectedMessage =
-                "  Expected: all items unique" + Environment.NewLine +
-                "  But was:  < \"x\", \"y\", \"x\" >" + Environment.NewLine;
-			CollectionAssert.AllItemsAreUnique( new ICollectionAdapter( "x", "y", "x" ) );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void UniqueFailure_WithTwoNulls()
-		{
-			CollectionAssert.AllItemsAreUnique( new ICollectionAdapter( "x", null, "y", null, "z" ) );
-		}
-
-		#endregion
-
-		#region AreEqual
-
-		[Test]
-		public void AreEqual()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("z");
-
-			CollectionAssert.AreEqual(set1,set2);
-			CollectionAssert.AreEqual(set1,set2,new TestComparer());
-
-			Assert.AreEqual(set1,set2);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreEqualFailCount()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("z");
-			set2.Add("a");
-
-			expectedMessage =
-                "  Expected is <System.Collections.ArrayList> with 3 elements, actual is <System.Collections.ArrayList> with 4 elements" + Environment.NewLine +
-                "  Values differ at index [3]" + Environment.NewLine +
-                "  Extra:    < \"a\" >";
-			CollectionAssert.AreEqual(set1,set2,new TestComparer());
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void AreEqualFail()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("a");
-
-			expectedMessage =
-                "  Expected and actual are both <System.Collections.ArrayList> with 3 elements" + Environment.NewLine +
-                "  Values differ at index [2]" + Environment.NewLine +
-                "  String lengths are both 1. Strings differ at index 0." + Environment.NewLine +
-                "  Expected: \"z\"" + Environment.NewLine +
-                "  But was:  \"a\"" + Environment.NewLine +
-                "  -----------^" + Environment.NewLine;
-
-			CollectionAssert.AreEqual(set1,set2,new TestComparer());
-		}
-
-		[Test]
-		public void AreEqual_HandlesNull()
-		{
-			object[] set1 = new object[3];
-			object[] set2 = new object[3];
-
-			CollectionAssert.AreEqual(set1,set2);
-			CollectionAssert.AreEqual(set1,set2,new TestComparer());
-		}
-
-		[Test]
-		public void EnsureComparerIsUsed()
-		{
-			// Create two collections
-			int[] array1 = new int[2];
-			int[] array2 = new int[2];
-
-			array1[0] = 4;
-			array1[1] = 5;
-
-			array2[0] = 99;
-			array2[1] = -99;
-
-			CollectionAssert.AreEqual(array1, array2, new AlwaysEqualComparer());
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void AreEqual_UsingIterator()
-        {
-            int[] array = new int[] { 1, 2, 3 };
-
-            CollectionAssert.AreEqual(array, CountToThree());
-        }
-
-        IEnumerable CountToThree()
-        {
-            yield return 1;
-            yield return 2;
-            yield return 3;
-        }
-
-        [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
-
-#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, 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" );
-			ICollection set2 = new ICollectionAdapter( "z", "y", "x" );
-
-			CollectionAssert.AreEquivalent(set1,set2);
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void EquivalentFailOne()
-		{
-			ICollection set1 = new ICollectionAdapter( "x", "y", "z" );
-			ICollection set2 = new ICollectionAdapter( "x", "y", "x" );
-
-			expectedMessage =
-                "  Expected: equivalent to < \"x\", \"y\", \"z\" >" + Environment.NewLine +
-                "  But was:  < \"x\", \"y\", \"x\" >" + Environment.NewLine;
-			CollectionAssert.AreEquivalent(set1,set2);
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void EquivalentFailTwo()
-		{
-			ICollection set1 = new ICollectionAdapter( "x", "y", "x" );
-			ICollection set2 = new ICollectionAdapter( "x", "y", "z" );
-			
-			expectedMessage =
-                "  Expected: equivalent to < \"x\", \"y\", \"x\" >" + Environment.NewLine +
-                "  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.AreEquivalent(set1,set2);
-		}
-
-        [Test]
-		public void AreEquivalentHandlesNull()
-		{
-			ICollection set1 = new ICollectionAdapter( null, "x", null, "z" );
-			ICollection set2 = new ICollectionAdapter( "z", null, "x", null );
-			
-			CollectionAssert.AreEquivalent(set1,set2);
-		}
-		#endregion
-
-		#region AreNotEqual
-
-		[Test]
-		public void AreNotEqual()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("x");
-
-			CollectionAssert.AreNotEqual(set1,set2);
-			CollectionAssert.AreNotEqual(set1,set2,new TestComparer());
-			CollectionAssert.AreNotEqual(set1,set2,"test");
-			CollectionAssert.AreNotEqual(set1,set2,new TestComparer(),"test");
-			CollectionAssert.AreNotEqual(set1,set2,"test {0}","1");
-			CollectionAssert.AreNotEqual(set1,set2,new TestComparer(),"test {0}","1");
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void AreNotEqual_Fails()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("z");
-
-			expectedMessage = 
-				"  Expected: not < \"x\", \"y\", \"z\" >" + Environment.NewLine +
-				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.AreNotEqual(set1,set2);
-		}
-
-		[Test]
-		public void AreNotEqual_HandlesNull()
-		{
-			object[] set1 = new object[3];
-			ArrayList set2 = new ArrayList();
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("z");
-
-			CollectionAssert.AreNotEqual(set1,set2);
-			CollectionAssert.AreNotEqual(set1,set2,new TestComparer());
-		}
-
-		#endregion
-
-		#region AreNotEquivalent
-
-		[Test]
-		public void NotEquivalent()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-
-			set2.Add("x");
-			set2.Add("y");
-			set2.Add("x");
-
-			CollectionAssert.AreNotEquivalent(set1,set2);
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void NotEquivalent_Fails()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-
-			set2.Add("x");
-			set2.Add("z");
-			set2.Add("y");
-
-			expectedMessage =
-				"  Expected: not equivalent to < \"x\", \"y\", \"z\" >" + Environment.NewLine +
-				"  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
-			CollectionAssert.AreNotEquivalent(set1,set2);
-		}
-
-		[Test]
-		public void NotEquivalentHandlesNull()
-		{
-			ArrayList set1 = new ArrayList();
-			ArrayList set2 = new ArrayList();
-			
-			set1.Add("x");
-			set1.Add(null);
-			set1.Add("z");
-
-			set2.Add("x");
-			set2.Add(null);
-			set2.Add("x");
-
-			CollectionAssert.AreNotEquivalent(set1,set2);
-		}
-		#endregion
-
-		#region Contains
-		[Test]
-		public void Contains_IList()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add("z");
-
-			CollectionAssert.Contains(al,"x");
-		}
-
-		[Test]
-		public void Contains_ICollection()
-		{
-			ICollectionAdapter ca = new ICollectionAdapter( new string[] { "x", "y", "z" } );
-
-			CollectionAssert.Contains(ca,"x");
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ContainsFails_ILIst()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add("z");
-
-			expectedMessage =
-				"  Expected: collection containing \"a\"" + Environment.NewLine +
-				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.Contains(al,"a");
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ContainsFails_ICollection()
-		{
-			ICollectionAdapter ca = new ICollectionAdapter( new string[] { "x", "y", "z" } );
-
-			expectedMessage =
-				"  Expected: collection containing \"a\"" + Environment.NewLine +
-				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.Contains(ca,"a");
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ContainsFails_EmptyIList()
-		{
-			ArrayList al = new ArrayList();
-
-			expectedMessage =
-				"  Expected: collection containing \"x\"" + Environment.NewLine +
-				"  But was:  <empty>" + Environment.NewLine;
-			CollectionAssert.Contains(al,"x");
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ContainsFails_EmptyICollection()
-		{
-			ICollectionAdapter ca = new ICollectionAdapter( new object[0] );
-
-			expectedMessage =
-				"  Expected: collection containing \"x\"" + Environment.NewLine +
-				"  But was:  <empty>" + Environment.NewLine;
-			CollectionAssert.Contains(ca,"x");
-		}
-
-		[Test]
-		public void ContainsNull_IList()
-		{
-			Object[] oa = new object[] { 1, 2, 3, null, 4, 5 };
-			CollectionAssert.Contains( oa, null );
-		}
-
-		[Test]
-		public void ContainsNull_ICollection()
-		{
-			ICollectionAdapter ca = new ICollectionAdapter( new object[] { 1, 2, 3, null, 4, 5 } );
-			CollectionAssert.Contains( ca, null );
-		}
-		#endregion
-
-		#region DoesNotContain
-		[Test]
-		public void DoesNotContain()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add("z");
-
-			CollectionAssert.DoesNotContain(al,"a");
-		}
-
-		[Test]
-		public void DoesNotContain_Empty()
-		{
-			ArrayList al = new ArrayList();
-
-			CollectionAssert.DoesNotContain(al,"x");
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void DoesNotContain_Fails()
-		{
-			ArrayList al = new ArrayList();
-			al.Add("x");
-			al.Add("y");
-			al.Add("z");
-
-			expectedMessage = 
-				"  Expected: not collection containing \"y\"" + Environment.NewLine +
-				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.DoesNotContain(al,"y");
-		}
-		#endregion
-
-		#region IsSubsetOf
-		[Test]
-		public void IsSubsetOf()
-		{
-			ArrayList set1 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-
-			ArrayList set2 = new ArrayList();
-			set2.Add("y");
-			set2.Add("z");
-
-			CollectionAssert.IsSubsetOf(set2,set1);
-            Expect(set2, SubsetOf(set1));
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsSubsetOf_Fails()
-		{
-			ArrayList set1 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-
-			ArrayList set2 = new ArrayList();
-			set2.Add("y");
-			set2.Add("z");
-			set2.Add("a");
-
-			expectedMessage =
-				"  Expected: subset of < \"y\", \"z\", \"a\" >" + Environment.NewLine +
-				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.IsSubsetOf(set1,set2);
-		}
-
-		[Test]
-		public void IsSubsetOfHandlesNull()
-		{
-			ArrayList set1 = new ArrayList();
-			set1.Add("x");
-			set1.Add(null);
-			set1.Add("z");
-
-			ArrayList set2 = new ArrayList();
-			set2.Add(null);
-			set2.Add("z");
-
-			CollectionAssert.IsSubsetOf(set2,set1);
-            Expect(set2, SubsetOf(set1));
-		}
-		#endregion
-
-		#region IsNotSubsetOf
-		[Test]
-		public void IsNotSubsetOf()
-		{
-			ArrayList set1 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-
-			ArrayList set2 = new ArrayList();
-			set1.Add("y");
-			set1.Add("z");
-			set2.Add("a");
-
-			CollectionAssert.IsNotSubsetOf(set1,set2);
-            Expect(set1, Not.SubsetOf(set2));
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsNotSubsetOf_Fails()
-		{
-			ArrayList set1 = new ArrayList();
-			set1.Add("x");
-			set1.Add("y");
-			set1.Add("z");
-
-			ArrayList set2 = new ArrayList();
-			set2.Add("y");
-			set2.Add("z");
-
-			expectedMessage =
-				"  Expected: not subset of < \"x\", \"y\", \"z\" >" + Environment.NewLine +
-				"  But was:  < \"y\", \"z\" >" + Environment.NewLine;
-			CollectionAssert.IsNotSubsetOf(set2,set1);
-		}
-		
-		[Test]
-		public void IsNotSubsetOfHandlesNull()
-		{
-			ArrayList set1 = new ArrayList();
-			set1.Add("x");
-			set1.Add(null);
-			set1.Add("z");
-
-			ArrayList set2 = new ArrayList();
-			set1.Add(null);
-			set1.Add("z");
-			set2.Add("a");
-
-			CollectionAssert.IsNotSubsetOf(set1,set2);
-		}
-		#endregion
-
-        #region IsOrdered
-
-        [Test]
-        public void IsOrdered()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add("y");
-            al.Add("z");
-
-            CollectionAssert.IsOrdered(al);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsOrdered_Fails()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add("z");
-            al.Add("y");
-
-            expectedMessage =
-                "  Expected: collection ordered" + Environment.NewLine +
-                "  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
-
-            CollectionAssert.IsOrdered(al);
-        }
-
-        [Test]
-        public void IsOrdered_Allows_adjacent_equal_values()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add("x");
-            al.Add("z");
-
-            CollectionAssert.IsOrdered(al);
-        }
-
-        [Test, ExpectedException(typeof(ArgumentNullException),
-            ExpectedMessage = "index 1", MatchType = MessageMatch.Contains)]
-        public void IsOrdered_Handles_null()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add(null);
-            al.Add("z");
-
-            CollectionAssert.IsOrdered(al);
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsOrdered_ContainedTypesMustBeCompatible()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(1);
-            al.Add("x");
-
-            CollectionAssert.IsOrdered(al);
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsOrdered_TypesMustImplementIComparable()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new object());
-            al.Add(new object());
-
-            CollectionAssert.IsOrdered(al);
-        }
-
-        [Test]
-        public void IsOrdered_Handles_custom_comparison()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new object());
-            al.Add(new object());
-
-            CollectionAssert.IsOrdered(al, new AlwaysEqualComparer());
-        }
-
-        [Test]
-        public void IsOrdered_Handles_custom_comparison2()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(2);
-            al.Add(1);
-
-            CollectionAssert.IsOrdered(al, new TestComparer());
-        }
-
-        #endregion
-    }
-
-	public class TestComparer : IComparer
-	{
-        public bool Called = false;
-        
-        #region IComparer Members
-		public int Compare(object x, object y)
-		{
-            Called = true;
-
-			if ( x == null && y == null )
-				return 0;
-
-			if ( x == null || y == null )
-				return -1;
-
-			if (x.Equals(y))
-				return 0;
-
-			return -1;
-		}
-		#endregion
-	}
-
-	public class AlwaysEqualComparer : IComparer
-	{
-        public bool Called = false;
-
-		int IComparer.Compare(object x, object y)
-		{
-            Called = true;
-
-			// This comparer ALWAYS returns zero (equal)!
-			return 0;
-		}
-	}
-}
-
-
+// ****************************************************************
+// 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;
+#if NET_3_5 || NET_4_0 || NET_4_5
+using System.Linq;
+#endif
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// Test Library for the NUnit CollectionAssert class.
+	/// </summary>
+	[TestFixture()]
+	public class CollectionAssertTest : MessageChecker
+	{
+		#region AllItemsAreInstancesOfType
+		[Test()]
+		public void ItemsOfType()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add("z");
+			CollectionAssert.AllItemsAreInstancesOfType(al,typeof(string));
+        }
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void ItemsOfTypeFailure()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add(new object());
+
+			expectedMessage =
+				"  Expected: all items instance of <System.String>" + Environment.NewLine +
+				"  But was:  < \"x\", \"y\", <System.Object> >" + Environment.NewLine;
+			CollectionAssert.AllItemsAreInstancesOfType(al,typeof(string));
+		}
+		#endregion
+
+		#region AllItemsAreNotNull
+		[Test()]
+		public void ItemsNotNull()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add("z");
+
+			CollectionAssert.AllItemsAreNotNull(al);
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void ItemsNotNullFailure()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add(null);
+			al.Add("z");
+
+			expectedMessage =
+                "  Expected: all items not null" + Environment.NewLine +
+                "  But was:  < \"x\", null, \"z\" >" + Environment.NewLine;
+			CollectionAssert.AllItemsAreNotNull(al);
+		}
+		#endregion
+
+		#region AllItemsAreUnique
+
+		[Test]
+		public void Unique_WithObjects()
+		{
+			CollectionAssert.AllItemsAreUnique(
+				new ICollectionAdapter( new object(), new object(), new object() ) );
+		}
+
+		[Test]
+		public void Unique_WithStrings()
+		{
+			CollectionAssert.AllItemsAreUnique( new ICollectionAdapter( "x", "y", "z" ) );
+		}
+
+		[Test]
+		public void Unique_WithNull()
+		{
+			CollectionAssert.AllItemsAreUnique(	new ICollectionAdapter( "x", "y", null, "z" ) );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void UniqueFailure()
+		{
+			expectedMessage =
+                "  Expected: all items unique" + Environment.NewLine +
+                "  But was:  < \"x\", \"y\", \"x\" >" + Environment.NewLine;
+			CollectionAssert.AllItemsAreUnique( new ICollectionAdapter( "x", "y", "x" ) );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void UniqueFailure_WithTwoNulls()
+		{
+			CollectionAssert.AllItemsAreUnique( new ICollectionAdapter( "x", null, "y", null, "z" ) );
+		}
+
+		#endregion
+
+		#region AreEqual
+
+		[Test]
+		public void AreEqual()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("z");
+
+			CollectionAssert.AreEqual(set1,set2);
+			CollectionAssert.AreEqual(set1,set2,new TestComparer());
+
+			Assert.AreEqual(set1,set2);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreEqualFailCount()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("z");
+			set2.Add("a");
+
+			expectedMessage =
+                "  Expected is <System.Collections.ArrayList> with 3 elements, actual is <System.Collections.ArrayList> with 4 elements" + Environment.NewLine +
+                "  Values differ at index [3]" + Environment.NewLine +
+                "  Extra:    < \"a\" >";
+			CollectionAssert.AreEqual(set1,set2,new TestComparer());
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void AreEqualFail()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("a");
+
+			expectedMessage =
+                "  Expected and actual are both <System.Collections.ArrayList> with 3 elements" + Environment.NewLine +
+                "  Values differ at index [2]" + Environment.NewLine +
+                "  String lengths are both 1. Strings differ at index 0." + Environment.NewLine +
+                "  Expected: \"z\"" + Environment.NewLine +
+                "  But was:  \"a\"" + Environment.NewLine +
+                "  -----------^" + Environment.NewLine;
+
+			CollectionAssert.AreEqual(set1,set2,new TestComparer());
+		}
+
+		[Test]
+		public void AreEqual_HandlesNull()
+		{
+			object[] set1 = new object[3];
+			object[] set2 = new object[3];
+
+			CollectionAssert.AreEqual(set1,set2);
+			CollectionAssert.AreEqual(set1,set2,new TestComparer());
+		}
+
+		[Test]
+		public void EnsureComparerIsUsed()
+		{
+			// Create two collections
+			int[] array1 = new int[2];
+			int[] array2 = new int[2];
+
+			array1[0] = 4;
+			array1[1] = 5;
+
+			array2[0] = 99;
+			array2[1] = -99;
+
+			CollectionAssert.AreEqual(array1, array2, new AlwaysEqualComparer());
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void AreEqual_UsingIterator()
+        {
+            int[] array = new int[] { 1, 2, 3 };
+
+            CollectionAssert.AreEqual(array, CountToThree());
+        }
+
+        IEnumerable CountToThree()
+        {
+            yield return 1;
+            yield return 2;
+            yield return 3;
+        }
+
+        [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
+
+#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, 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" );
+			ICollection set2 = new ICollectionAdapter( "z", "y", "x" );
+
+			CollectionAssert.AreEquivalent(set1,set2);
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void EquivalentFailOne()
+		{
+			ICollection set1 = new ICollectionAdapter( "x", "y", "z" );
+			ICollection set2 = new ICollectionAdapter( "x", "y", "x" );
+
+			expectedMessage =
+                "  Expected: equivalent to < \"x\", \"y\", \"z\" >" + Environment.NewLine +
+                "  But was:  < \"x\", \"y\", \"x\" >" + Environment.NewLine;
+			CollectionAssert.AreEquivalent(set1,set2);
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void EquivalentFailTwo()
+		{
+			ICollection set1 = new ICollectionAdapter( "x", "y", "x" );
+			ICollection set2 = new ICollectionAdapter( "x", "y", "z" );
+			
+			expectedMessage =
+                "  Expected: equivalent to < \"x\", \"y\", \"x\" >" + Environment.NewLine +
+                "  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.AreEquivalent(set1,set2);
+		}
+
+        [Test]
+		public void AreEquivalentHandlesNull()
+		{
+			ICollection set1 = new ICollectionAdapter( null, "x", null, "z" );
+			ICollection set2 = new ICollectionAdapter( "z", null, "x", null );
+			
+			CollectionAssert.AreEquivalent(set1,set2);
+		}
+		#endregion
+
+		#region AreNotEqual
+
+		[Test]
+		public void AreNotEqual()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("x");
+
+			CollectionAssert.AreNotEqual(set1,set2);
+			CollectionAssert.AreNotEqual(set1,set2,new TestComparer());
+			CollectionAssert.AreNotEqual(set1,set2,"test");
+			CollectionAssert.AreNotEqual(set1,set2,new TestComparer(),"test");
+			CollectionAssert.AreNotEqual(set1,set2,"test {0}","1");
+			CollectionAssert.AreNotEqual(set1,set2,new TestComparer(),"test {0}","1");
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void AreNotEqual_Fails()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("z");
+
+			expectedMessage = 
+				"  Expected: not < \"x\", \"y\", \"z\" >" + Environment.NewLine +
+				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.AreNotEqual(set1,set2);
+		}
+
+		[Test]
+		public void AreNotEqual_HandlesNull()
+		{
+			object[] set1 = new object[3];
+			ArrayList set2 = new ArrayList();
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("z");
+
+			CollectionAssert.AreNotEqual(set1,set2);
+			CollectionAssert.AreNotEqual(set1,set2,new TestComparer());
+		}
+
+		#endregion
+
+		#region AreNotEquivalent
+
+		[Test]
+		public void NotEquivalent()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+
+			set2.Add("x");
+			set2.Add("y");
+			set2.Add("x");
+
+			CollectionAssert.AreNotEquivalent(set1,set2);
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void NotEquivalent_Fails()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+
+			set2.Add("x");
+			set2.Add("z");
+			set2.Add("y");
+
+			expectedMessage =
+				"  Expected: not equivalent to < \"x\", \"y\", \"z\" >" + Environment.NewLine +
+				"  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
+			CollectionAssert.AreNotEquivalent(set1,set2);
+		}
+
+		[Test]
+		public void NotEquivalentHandlesNull()
+		{
+			ArrayList set1 = new ArrayList();
+			ArrayList set2 = new ArrayList();
+			
+			set1.Add("x");
+			set1.Add(null);
+			set1.Add("z");
+
+			set2.Add("x");
+			set2.Add(null);
+			set2.Add("x");
+
+			CollectionAssert.AreNotEquivalent(set1,set2);
+		}
+		#endregion
+
+		#region Contains
+		[Test]
+		public void Contains_IList()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add("z");
+
+			CollectionAssert.Contains(al,"x");
+		}
+
+		[Test]
+		public void Contains_ICollection()
+		{
+			ICollectionAdapter ca = new ICollectionAdapter( new string[] { "x", "y", "z" } );
+
+			CollectionAssert.Contains(ca,"x");
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void ContainsFails_ILIst()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add("z");
+
+			expectedMessage =
+				"  Expected: collection containing \"a\"" + Environment.NewLine +
+				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.Contains(al,"a");
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void ContainsFails_ICollection()
+		{
+			ICollectionAdapter ca = new ICollectionAdapter( new string[] { "x", "y", "z" } );
+
+			expectedMessage =
+				"  Expected: collection containing \"a\"" + Environment.NewLine +
+				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.Contains(ca,"a");
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void ContainsFails_EmptyIList()
+		{
+			ArrayList al = new ArrayList();
+
+			expectedMessage =
+				"  Expected: collection containing \"x\"" + Environment.NewLine +
+				"  But was:  <empty>" + Environment.NewLine;
+			CollectionAssert.Contains(al,"x");
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void ContainsFails_EmptyICollection()
+		{
+			ICollectionAdapter ca = new ICollectionAdapter( new object[0] );
+
+			expectedMessage =
+				"  Expected: collection containing \"x\"" + Environment.NewLine +
+				"  But was:  <empty>" + Environment.NewLine;
+			CollectionAssert.Contains(ca,"x");
+		}
+
+		[Test]
+		public void ContainsNull_IList()
+		{
+			Object[] oa = new object[] { 1, 2, 3, null, 4, 5 };
+			CollectionAssert.Contains( oa, null );
+		}
+
+		[Test]
+		public void ContainsNull_ICollection()
+		{
+			ICollectionAdapter ca = new ICollectionAdapter( new object[] { 1, 2, 3, null, 4, 5 } );
+			CollectionAssert.Contains( ca, null );
+		}
+		#endregion
+
+		#region DoesNotContain
+		[Test]
+		public void DoesNotContain()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add("z");
+
+			CollectionAssert.DoesNotContain(al,"a");
+		}
+
+		[Test]
+		public void DoesNotContain_Empty()
+		{
+			ArrayList al = new ArrayList();
+
+			CollectionAssert.DoesNotContain(al,"x");
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void DoesNotContain_Fails()
+		{
+			ArrayList al = new ArrayList();
+			al.Add("x");
+			al.Add("y");
+			al.Add("z");
+
+			expectedMessage = 
+				"  Expected: not collection containing \"y\"" + Environment.NewLine +
+				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.DoesNotContain(al,"y");
+		}
+		#endregion
+
+		#region IsSubsetOf
+		[Test]
+		public void IsSubsetOf()
+		{
+			ArrayList set1 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+
+			ArrayList set2 = new ArrayList();
+			set2.Add("y");
+			set2.Add("z");
+
+			CollectionAssert.IsSubsetOf(set2,set1);
+            Expect(set2, SubsetOf(set1));
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void IsSubsetOf_Fails()
+		{
+			ArrayList set1 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+
+			ArrayList set2 = new ArrayList();
+			set2.Add("y");
+			set2.Add("z");
+			set2.Add("a");
+
+			expectedMessage =
+				"  Expected: subset of < \"y\", \"z\", \"a\" >" + Environment.NewLine +
+				"  But was:  < \"x\", \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.IsSubsetOf(set1,set2);
+		}
+
+		[Test]
+		public void IsSubsetOfHandlesNull()
+		{
+			ArrayList set1 = new ArrayList();
+			set1.Add("x");
+			set1.Add(null);
+			set1.Add("z");
+
+			ArrayList set2 = new ArrayList();
+			set2.Add(null);
+			set2.Add("z");
+
+			CollectionAssert.IsSubsetOf(set2,set1);
+            Expect(set2, SubsetOf(set1));
+		}
+		#endregion
+
+		#region IsNotSubsetOf
+		[Test]
+		public void IsNotSubsetOf()
+		{
+			ArrayList set1 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+
+			ArrayList set2 = new ArrayList();
+			set1.Add("y");
+			set1.Add("z");
+			set2.Add("a");
+
+			CollectionAssert.IsNotSubsetOf(set1,set2);
+            Expect(set1, Not.SubsetOf(set2));
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void IsNotSubsetOf_Fails()
+		{
+			ArrayList set1 = new ArrayList();
+			set1.Add("x");
+			set1.Add("y");
+			set1.Add("z");
+
+			ArrayList set2 = new ArrayList();
+			set2.Add("y");
+			set2.Add("z");
+
+			expectedMessage =
+				"  Expected: not subset of < \"x\", \"y\", \"z\" >" + Environment.NewLine +
+				"  But was:  < \"y\", \"z\" >" + Environment.NewLine;
+			CollectionAssert.IsNotSubsetOf(set2,set1);
+		}
+		
+		[Test]
+		public void IsNotSubsetOfHandlesNull()
+		{
+			ArrayList set1 = new ArrayList();
+			set1.Add("x");
+			set1.Add(null);
+			set1.Add("z");
+
+			ArrayList set2 = new ArrayList();
+			set1.Add(null);
+			set1.Add("z");
+			set2.Add("a");
+
+			CollectionAssert.IsNotSubsetOf(set1,set2);
+		}
+		#endregion
+
+        #region IsOrdered
+
+        [Test]
+        public void IsOrdered()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("y");
+            al.Add("z");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsOrdered_Fails()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("z");
+            al.Add("y");
+
+            expectedMessage =
+                "  Expected: collection ordered" + Environment.NewLine +
+                "  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test]
+        public void IsOrdered_Allows_adjacent_equal_values()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add("x");
+            al.Add("z");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentNullException),
+            ExpectedMessage = "index 1", MatchType = MessageMatch.Contains)]
+        public void IsOrdered_Handles_null()
+        {
+            ArrayList al = new ArrayList();
+            al.Add("x");
+            al.Add(null);
+            al.Add("z");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsOrdered_ContainedTypesMustBeCompatible()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(1);
+            al.Add("x");
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsOrdered_TypesMustImplementIComparable()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new object());
+            al.Add(new object());
+
+            CollectionAssert.IsOrdered(al);
+        }
+
+        [Test]
+        public void IsOrdered_Handles_custom_comparison()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(new object());
+            al.Add(new object());
+
+            CollectionAssert.IsOrdered(al, new AlwaysEqualComparer());
+        }
+
+        [Test]
+        public void IsOrdered_Handles_custom_comparison2()
+        {
+            ArrayList al = new ArrayList();
+            al.Add(2);
+            al.Add(1);
+
+            CollectionAssert.IsOrdered(al, new TestComparer());
+        }
+
+        #endregion
+    }
+
+	public class TestComparer : IComparer
+	{
+        public bool Called = false;
+        
+        #region IComparer Members
+		public int Compare(object x, object y)
+		{
+            Called = true;
+
+			if ( x == null && y == null )
+				return 0;
+
+			if ( x == null || y == null )
+				return -1;
+
+			if (x.Equals(y))
+				return 0;
+
+			return -1;
+		}
+		#endregion
+	}
+
+	public class AlwaysEqualComparer : IComparer
+	{
+        public bool Called = false;
+
+		int IComparer.Compare(object x, object y)
+		{
+            Called = true;
+
+			// This comparer ALWAYS returns zero (equal)!
+			return 0;
+		}
+	}
+}
+
+
diff --git a/src/NUnitFramework/tests/ConditionAssertTests.cs b/src/NUnitFramework/tests/ConditionAssertTests.cs
index fb646b8..2060076 100644
--- a/src/NUnitFramework/tests/ConditionAssertTests.cs
+++ b/src/NUnitFramework/tests/ConditionAssertTests.cs
@@ -1,205 +1,205 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Threading;
-using System.Globalization;
-using NUnit.Framework;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class ConditionAssertTests : MessageChecker
-	{
-		[Test]
-		public void IsTrue()
-		{
-			Assert.IsTrue(true);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsTrueFails()
-		{
-			expectedMessage =
-				"  Expected: True" + Environment.NewLine +
-				"  But was:  False" + Environment.NewLine;
-			Assert.IsTrue(false);
-		}
-
-		[Test]
-		public void IsFalse()
-		{
-			Assert.IsFalse(false);
-		}
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void IsFalseFails()
-		{
-			expectedMessage =
-				"  Expected: False" + Environment.NewLine +
-				"  But was:  True" + Environment.NewLine;
-			Assert.IsFalse(true);
-		}
-	
-		[Test]
-		public void IsNull()
-		{
-			Assert.IsNull(null);
-		}
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void IsNullFails()
-		{
-			String s1 = "S1";
-			expectedMessage =
-				"  Expected: null" + Environment.NewLine +
-				"  But was:  \"S1\"" + Environment.NewLine;
-			Assert.IsNull(s1);
-		}
-	
-		[Test]
-		public void IsNotNull()
-		{
-			String s1 = "S1";
-			Assert.IsNotNull(s1);
-		}
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void IsNotNullFails()
-		{
-			expectedMessage =
-				"  Expected: not null" + Environment.NewLine +
-				"  But was:  null" + Environment.NewLine;
-			Assert.IsNotNull(null);
-		}
-	
-		[Test]
-		public void IsNaN()
-		{
-			Assert.IsNaN(double.NaN);
-		}
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void IsNaNFails()
-		{
-			expectedMessage =
-				"  Expected: NaN" + Environment.NewLine +
-				"  But was:  10.0d" + Environment.NewLine;
-			Assert.IsNaN(10.0);
-		}
-
-		[Test]
-		public void IsEmpty()
-		{
-			Assert.IsEmpty( "", "Failed on empty String" );
-			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))]
-		public void IsEmptyFailsOnString()
-		{
-			expectedMessage =
-				"  Expected: <empty>" + Environment.NewLine +
-				"  But was:  \"Hi!\"" + Environment.NewLine;
-			Assert.IsEmpty( "Hi!" );
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void IsEmptyFailsOnNullString()
-		{
-			expectedMessage =
-				"  Expected: <empty>" + Environment.NewLine +
-				"  But was:  null" + Environment.NewLine;
-			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, 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 };
-			ArrayList list = new ArrayList( array );
-			Hashtable hash = new Hashtable();
-			hash.Add( "array", array );
-
-			Assert.IsNotEmpty( "Hi!", "Failed on String" );
-			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))]
-		public void IsNotEmptyFailsOnEmptyString()
-		{
-			expectedMessage =
-				"  Expected: not <empty>" + Environment.NewLine +
-				"  But was:  <string.Empty>" + Environment.NewLine;
-			Assert.IsNotEmpty( "" );
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void IsNotEmptyFailsOnEmptyArray()
-		{
-			expectedMessage =
-				"  Expected: not <empty>" + Environment.NewLine +
-				"  But was:  <empty>" + Environment.NewLine;
-			Assert.IsNotEmpty( new int[0] );
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void IsNotEmptyFailsOnEmptyArrayList()
-		{
-			expectedMessage =
-				"  Expected: not <empty>" + Environment.NewLine +
-				"  But was:  <empty>" + Environment.NewLine;
-			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 IsNotEmptyFailsOnEmptyIEnumerable()
-        {
-            expectedMessage =
-                "  Expected: not <empty>" + Environment.NewLine +
-                "  But was:  <empty>" + Environment.NewLine;
-            Assert.IsNotEmpty((IEnumerable)new int[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.Collections;
+using System.Threading;
+using System.Globalization;
+using NUnit.Framework;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class ConditionAssertTests : MessageChecker
+	{
+		[Test]
+		public void IsTrue()
+		{
+			Assert.IsTrue(true);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void IsTrueFails()
+		{
+			expectedMessage =
+				"  Expected: True" + Environment.NewLine +
+				"  But was:  False" + Environment.NewLine;
+			Assert.IsTrue(false);
+		}
+
+		[Test]
+		public void IsFalse()
+		{
+			Assert.IsFalse(false);
+		}
+
+		[Test]
+		[ExpectedException(typeof(AssertionException))]
+		public void IsFalseFails()
+		{
+			expectedMessage =
+				"  Expected: False" + Environment.NewLine +
+				"  But was:  True" + Environment.NewLine;
+			Assert.IsFalse(true);
+		}
+	
+		[Test]
+		public void IsNull()
+		{
+			Assert.IsNull(null);
+		}
+
+		[Test]
+		[ExpectedException(typeof(AssertionException))]
+		public void IsNullFails()
+		{
+			String s1 = "S1";
+			expectedMessage =
+				"  Expected: null" + Environment.NewLine +
+				"  But was:  \"S1\"" + Environment.NewLine;
+			Assert.IsNull(s1);
+		}
+	
+		[Test]
+		public void IsNotNull()
+		{
+			String s1 = "S1";
+			Assert.IsNotNull(s1);
+		}
+
+		[Test]
+		[ExpectedException(typeof(AssertionException))]
+		public void IsNotNullFails()
+		{
+			expectedMessage =
+				"  Expected: not null" + Environment.NewLine +
+				"  But was:  null" + Environment.NewLine;
+			Assert.IsNotNull(null);
+		}
+	
+		[Test]
+		public void IsNaN()
+		{
+			Assert.IsNaN(double.NaN);
+		}
+
+		[Test]
+		[ExpectedException(typeof(AssertionException))]
+		public void IsNaNFails()
+		{
+			expectedMessage =
+				"  Expected: NaN" + Environment.NewLine +
+				"  But was:  10.0d" + Environment.NewLine;
+			Assert.IsNaN(10.0);
+		}
+
+		[Test]
+		public void IsEmpty()
+		{
+			Assert.IsEmpty( "", "Failed on empty String" );
+			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))]
+		public void IsEmptyFailsOnString()
+		{
+			expectedMessage =
+				"  Expected: <empty>" + Environment.NewLine +
+				"  But was:  \"Hi!\"" + Environment.NewLine;
+			Assert.IsEmpty( "Hi!" );
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void IsEmptyFailsOnNullString()
+		{
+			expectedMessage =
+				"  Expected: <empty>" + Environment.NewLine +
+				"  But was:  null" + Environment.NewLine;
+			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, 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 };
+			ArrayList list = new ArrayList( array );
+			Hashtable hash = new Hashtable();
+			hash.Add( "array", array );
+
+			Assert.IsNotEmpty( "Hi!", "Failed on String" );
+			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))]
+		public void IsNotEmptyFailsOnEmptyString()
+		{
+			expectedMessage =
+				"  Expected: not <empty>" + Environment.NewLine +
+				"  But was:  <string.Empty>" + Environment.NewLine;
+			Assert.IsNotEmpty( "" );
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void IsNotEmptyFailsOnEmptyArray()
+		{
+			expectedMessage =
+				"  Expected: not <empty>" + Environment.NewLine +
+				"  But was:  <empty>" + Environment.NewLine;
+			Assert.IsNotEmpty( new int[0] );
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void IsNotEmptyFailsOnEmptyArrayList()
+		{
+			expectedMessage =
+				"  Expected: not <empty>" + Environment.NewLine +
+				"  But was:  <empty>" + Environment.NewLine;
+			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 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
deleted file mode 100644
index 166773f..0000000
--- a/src/NUnitFramework/tests/Constraints/AfterConstraintTests.cs
+++ /dev/null
@@ -1,167 +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
-// ****************************************************************
-
-using System;
-using System.Threading;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-	public class AfterConstraintTest : ConstraintTestBase
-	{
-		private static bool value;
-
-        //public AfterConstraintTest(int x) { }
-
-		[SetUp]
-		public void SetUp()
-		{
-			theConstraint = new DelayedConstraint(new EqualConstraint(true), 500);
-			expectedDescription = "True after 500 millisecond delay";
-			stringRepresentation = "<after 500 <equal True>>";
-
-            value = false;
-            //SetValueTrueAfterDelay(300);
-		}
-
-        internal object[] SuccessData = new object[] { true };
-        internal object[] FailureData = new object[] { false, 0, null };
-		internal string[] ActualValues = new string[] { "False", "0", "null" };
-
-		internal object[] InvalidData = new object[] { InvalidDelegate };
-
-        internal ActualValueDelegate[] SuccessDelegates = new ActualValueDelegate[] { DelegateReturningValue };
-        internal ActualValueDelegate[] FailureDelegates = new ActualValueDelegate[] { DelegateReturningFalse, DelegateReturningZero };
-
-        [Test, TestCaseSource("SuccessDelegates")]
-        public void SucceedsWithGoodDelegates(ActualValueDelegate del)
-        {
-            SetValueTrueAfterDelay(300);
-            Assert.That(theConstraint.Matches(del));
-        }
-
-        [Test,TestCaseSource("FailureDelegates")]
-        public void FailsWithBadDelegates(ActualValueDelegate del)
-        {
-            Assert.IsFalse(theConstraint.Matches(del));
-        }
-
-        [Test]
-        public void SimpleTest()
-        {
-            SetValueTrueAfterDelay(500);
-            Assert.That(DelegateReturningValue, new DelayedConstraint(new EqualConstraint(true), 5000, 200));
-        }
-
-        [Test]
-        public void SimpleTestUsingReference()
-        {
-            SetValueTrueAfterDelay(500);
-            Assert.That(ref value, new DelayedConstraint(new EqualConstraint(true), 5000, 200));
-        }
-
-        [Test]
-        public void ThatOverload_ZeroDelayIsAllowed()
-        {
-            Assert.That(DelegateReturningZero, new DelayedConstraint(new EqualConstraint(0), 0));
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void ThatOverload_DoesNotAcceptNegativeDelayValues()
-        {
-            Assert.That(DelegateReturningZero, new DelayedConstraint(new EqualConstraint(0), -1));
-        }
-
-#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)
-		{
-            setValueTrueDelay = delay;
-            Thread thread = new Thread( SetValueTrueDelegate );
-            thread.Start();
-		}
-
-		private static void MethodReturningVoid() { }
-		private static TestDelegate InvalidDelegate = new TestDelegate(MethodReturningVoid);
-
-		private static object MethodReturningValue() { return value; }
-		private static ActualValueDelegate DelegateReturningValue = new ActualValueDelegate(MethodReturningValue);
-
-		private static object MethodReturningFalse() { return false; }
-		private static ActualValueDelegate DelegateReturningFalse = new ActualValueDelegate(MethodReturningFalse);
-
-		private static object MethodReturningZero() { return 0; }
-		private static ActualValueDelegate DelegateReturningZero = new ActualValueDelegate(MethodReturningZero);
-
-        private static void MethodSetsValueTrue()
-        {
-            Thread.Sleep(setValueTrueDelay);
-            value = true;
-        }
-		private ThreadStart SetValueTrueDelegate = new ThreadStart(MethodSetsValueTrue);
-	}
-}
diff --git a/src/NUnitFramework/tests/Constraints/AndTest.cs b/src/NUnitFramework/tests/Constraints/AndTest.cs
deleted file mode 100644
index cb5f080..0000000
--- a/src/NUnitFramework/tests/Constraints/AndTest.cs
+++ /dev/null
@@ -1,32 +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.
-// ****************************************************************
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class AndTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new AndConstraint(new GreaterThanConstraint(40), new LessThanConstraint(50));
-            expectedDescription = "greater than 40 and less than 50";
-            stringRepresentation = "<and <greaterthan 40> <lessthan 50>>";
-        }
-
-		internal object[] SuccessData = new object[] { 42 };
-	
-		internal object[] FailureData = new object[] { 37, 53 };
-
-		internal string[] ActualValues = new string[] { "37", "53" };
-
-		[Test]
-        public void CanCombineTestsWithAndOperator()
-        {
-            Assert.That(42, new GreaterThanConstraint(40) & new LessThanConstraint(50));
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs b/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs
index 3078008..b98b75d 100644
--- a/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/BasicConstraintTests.cs
@@ -1,87 +1,87 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class NullConstraintTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new NullConstraint();
-            expectedDescription = "null";
-            stringRepresentation = "<null>";
-        }
-        
-        internal object[] SuccessData = new object[] { null };
-        
-        internal object[] FailureData = new object[] { "hello" };
-
-        internal string[] ActualValues = new string[] { "\"hello\"" };
-    }
-
-    [TestFixture]
-    public class TrueConstraintTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new TrueConstraint();
-            expectedDescription = "True";
-            stringRepresentation = "<true>";
-        }
-        
-        internal object[] SuccessData = new object[] { true, 2+2==4 };
-        
-        internal object[] FailureData = new object[] { null, "hello", false, 2+2==5 };
-
-        internal string[] ActualValues = new string[] { "null", "\"hello\"", "False", "False" };
-    }
-
-    [TestFixture]
-    public class FalseConstraintTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new FalseConstraint();
-            expectedDescription = "False";
-            stringRepresentation = "<false>";
-        }
-
-        internal object[] SuccessData = new object[] { false, 2 + 2 == 5 };
-
-        internal object[] FailureData = new object[] { null, "hello", true, 2+2==4 };
-
-        internal string[] ActualValues = new string[] { "null", "\"hello\"", "True", "True" };
-    }
-
-    [TestFixture]
-    public class NaNConstraintTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new NaNConstraint();
-            expectedDescription = "NaN";
-            stringRepresentation = "<nan>";
-        }
-        
-        internal object[] SuccessData = new object[] { double.NaN, float.NaN };
-
-        internal object[] FailureData = new object[] { null, "hello", 42, 
-            double.PositiveInfinity, double.NegativeInfinity,
-            float.PositiveInfinity, float.NegativeInfinity };
-
-        internal string[] ActualValues = new string[] { "null", "\"hello\"", "42", 
-            "Infinity", "-Infinity", "Infinity", "-Infinity" };
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class NullConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new NullConstraint();
+            expectedDescription = "null";
+            stringRepresentation = "<null>";
+        }
+        
+        internal object[] SuccessData = new object[] { null };
+        
+        internal object[] FailureData = new object[] { "hello" };
+
+        internal string[] ActualValues = new string[] { "\"hello\"" };
+    }
+
+    [TestFixture]
+    public class TrueConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new TrueConstraint();
+            expectedDescription = "True";
+            stringRepresentation = "<true>";
+        }
+        
+        internal object[] SuccessData = new object[] { true, 2+2==4 };
+        
+        internal object[] FailureData = new object[] { null, "hello", false, 2+2==5 };
+
+        internal string[] ActualValues = new string[] { "null", "\"hello\"", "False", "False" };
+    }
+
+    [TestFixture]
+    public class FalseConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new FalseConstraint();
+            expectedDescription = "False";
+            stringRepresentation = "<false>";
+        }
+
+        internal object[] SuccessData = new object[] { false, 2 + 2 == 5 };
+
+        internal object[] FailureData = new object[] { null, "hello", true, 2+2==4 };
+
+        internal string[] ActualValues = new string[] { "null", "\"hello\"", "True", "True" };
+    }
+
+    [TestFixture]
+    public class NaNConstraintTest : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new NaNConstraint();
+            expectedDescription = "NaN";
+            stringRepresentation = "<nan>";
+        }
+        
+        internal object[] SuccessData = new object[] { double.NaN, float.NaN };
+
+        internal object[] FailureData = new object[] { null, "hello", 42, 
+            double.PositiveInfinity, double.NegativeInfinity,
+            float.PositiveInfinity, float.NegativeInfinity };
+
+        internal string[] ActualValues = new string[] { "null", "\"hello\"", "42", 
+            "Infinity", "-Infinity", "Infinity", "-Infinity" };
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs b/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
deleted file mode 100644
index 4ac453c..0000000
--- a/src/NUnitFramework/tests/Constraints/CollectionConstraintTests.cs
+++ /dev/null
@@ -1,711 +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.Collections;
-using NUnit.Framework.Tests;
-
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-using RangeConstraint = NUnit.Framework.Constraints.RangeConstraint<int>;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    #region AllItems
-    [TestFixture]
-    public class AllItemsTests : MessageChecker
-    {
-        [Test]
-        public void AllItemsAreNotNull()
-        {
-            object[] c = new object[] { 1, "hello", 3, Environment.OSVersion };
-            Assert.That(c, new AllItemsConstraint( Is.Not.Null ));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AllItemsAreNotNullFails()
-        {
-            object[] c = new object[] { 1, "hello", null, 3 };
-            expectedMessage = 
-				TextMessageWriter.Pfx_Expected + "all items not null" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "< 1, \"hello\", null, 3 >" + Environment.NewLine;
-            Assert.That(c, new AllItemsConstraint(new NotConstraint(new EqualConstraint(null))));
-        }
-
-        [Test]
-        public void AllItemsAreInRange()
-        {
-            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
-            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100)));
-        }
-
-        [Test]
-        public void AllItemsAreInRange_UsingIComparer()
-        {
-            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
-            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void AllItemsAreInRange_UsingIComparerOfT()
-        {
-            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
-            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
-        }
-
-        [Test]
-        public void AllItemsAreInRange_UsingComparisonOfT()
-        {
-            int[] c = new int[] { 12, 27, 19, 32, 45, 99, 26 };
-            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100).Using(Comparer.Default)));
-        }
-#endif
-
-		[Test, ExpectedException(typeof(AssertionException))]
-        public void AllItemsAreInRangeFailureMessage()
-        {
-            int[] c = new int[] { 12, 27, 19, 32, 107, 99, 26 };
-            expectedMessage = 
-                TextMessageWriter.Pfx_Expected + "all items in range (10,100)" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual   + "< 12, 27, 19, 32, 107, 99, 26 >" + Environment.NewLine;
-            Assert.That(c, new AllItemsConstraint(new RangeConstraint(10, 100)));
-        }
-
-        [Test]
-        public void AllItemsAreInstancesOfType()
-        {
-            object[] c = new object[] { 'a', 'b', 'c' };
-            Assert.That(c, new AllItemsConstraint(new InstanceOfTypeConstraint(typeof(char))));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AllItemsAreInstancesOfTypeFailureMessage()
-        {
-            object[] c = new object[] { 'a', "b", 'c' };
-            expectedMessage = 
-                TextMessageWriter.Pfx_Expected + "all items instance of <System.Char>" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual   + "< 'a', \"b\", 'c' >" + Environment.NewLine;
-            Assert.That(c, new AllItemsConstraint(new InstanceOfTypeConstraint(typeof(char))));
-        }
-    }
-    #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
-    {
-        [Test]
-        public void CanTestContentsOfArray()
-        {
-            object item = "xyz";
-            object[] c = new object[] { 123, item, "abc" };
-            Assert.That(c, new CollectionContainsConstraint(item));
-        }
-
-        [Test]
-        public void CanTestContentsOfArrayList()
-        {
-            object item = "xyz";
-            ArrayList list = new ArrayList( new object[] { 123, item, "abc" } );
-            Assert.That(list, new CollectionContainsConstraint(item));
-        }
-
-        [Test]
-        public void CanTestContentsOfSortedList()
-        {
-            object item = "xyz";
-            SortedList list = new SortedList();
-            list.Add("a", 123);
-            list.Add("b", item);
-            list.Add("c", "abc");
-            Assert.That(list.Values, new CollectionContainsConstraint(item));
-            Assert.That(list.Keys, new CollectionContainsConstraint("b"));
-        }
-
-		[Test]
-		public void CanTestContentsOfCollectionNotImplementingIList()
-		{
-			ICollectionAdapter ints = new ICollectionAdapter(new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});           
-			Assert.That(ints, new CollectionContainsConstraint( 9 ));
-		}
-
-        [Test]
-        public void IgnoreCaseIsHonored()
-        {
-            Assert.That(new string[] { "Hello", "World" }, 
-                new CollectionContainsConstraint("WORLD").IgnoreCase);
-        }
-		
-        [Test]
-        public void UsesProvidedIComparer()
-        {
-            MyComparer comparer = new MyComparer();
-            Assert.That(new string[] { "Hello", "World" }, 
-                new CollectionContainsConstraint("World").Using(comparer));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer : IComparer
-        {
-            public bool Called;
-
-            public int Compare(object x, object y)
-            {
-                Called = true;
-                return Comparer.Default.Compare(x, y);
-            }
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void UsesProvidedEqualityComparer()
-        {
-            MyEqualityComparer comparer = new MyEqualityComparer();
-            Assert.That(new string[] { "Hello", "World" }, 
-                new CollectionContainsConstraint("World").Using(comparer));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyEqualityComparer : IEqualityComparer
-        {
-            public bool Called;
-
-            bool IEqualityComparer.Equals(object x, object y)
-            {
-                Called = true;
-                return Comparer.Default.Compare(x, y) == 0;
-            }
-
-            int IEqualityComparer.GetHashCode(object x)
-            {
-                return x.GetHashCode();
-            }
-        }
-
-        [Test]
-        public void UsesProvidedEqualityComparerOfT()
-        {
-            MyEqualityComparerOfT<string> comparer = new MyEqualityComparerOfT<string>();
-            Assert.That(new string[] { "Hello", "World" }, 
-                new CollectionContainsConstraint("World").Using(comparer));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyEqualityComparerOfT<T> : IEqualityComparer<T>
-        {
-            public bool Called;
-
-            bool IEqualityComparer<T>.Equals(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y) == 0;
-            }
-
-            int IEqualityComparer<T>.GetHashCode(T x)
-            {
-                return x.GetHashCode();
-            }
-        }
-
-        [Test]
-        public void UsesProvidedComparerOfT()
-        {
-            MyComparer<string> comparer = new MyComparer<string>();
-            Assert.That(new string[] { "Hello", "World" }, 
-                new CollectionContainsConstraint("World").Using(comparer));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer<T> : IComparer<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-        [Test]
-        public void UsesProvidedComparisonOfT()
-        {
-            MyComparison<string> comparer = new MyComparison<string>();
-            Assert.That(new string[] { "Hello", "World" }, 
-                new CollectionContainsConstraint("World").Using(new Comparison<string>(comparer.Compare)));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparison<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void UsesProvidedLambdaExpression()
-        {
-            Assert.That(new string[] { "Hello", "World" },
-                new CollectionContainsConstraint("WORLD").Using<string>( (x,y)=>String.Compare(x, y, true) ));
-        }
-#endif
-#endif
-    }
-    #endregion
-
-    #region CollectionEquivalent
-    public class CollectionEquivalentTests
-    {
-        [Test]
-        public void EqualCollectionsAreEquivalent()
-        {
-            ICollection set1 = new ICollectionAdapter("x", "y", "z");
-            ICollection set2 = new ICollectionAdapter("x", "y", "z");
-
-            Assert.That(new CollectionEquivalentConstraint(set1).Matches(set2));
-        }
-
-        [Test]
-        public void WorksWithCollectionsOfArrays()
-        {
-            byte[] array1 = new byte[] { 0x20, 0x44, 0x56, 0x76, 0x1e, 0xff };
-            byte[] array2 = new byte[] { 0x42, 0x52, 0x72, 0xef };
-            byte[] array3 = new byte[] { 0x20, 0x44, 0x56, 0x76, 0x1e, 0xff };
-            byte[] array4 = new byte[] { 0x42, 0x52, 0x72, 0xef };
-
-            ICollection set1 = new ICollectionAdapter(array1, array2);
-            ICollection set2 = new ICollectionAdapter(array3, array4);
-
-            Constraint constraint = new CollectionEquivalentConstraint(set1);
-            Assert.That(constraint.Matches(set2));
-
-            set2 = new ICollectionAdapter(array4, array3);
-            Assert.That(constraint.Matches(set2));
-        }
-
-        [Test]
-        public void EquivalentIgnoresOrder()
-        {
-            ICollection set1 = new ICollectionAdapter("x", "y", "z");
-            ICollection set2 = new ICollectionAdapter("z", "y", "x");
-
-            Assert.That(new CollectionEquivalentConstraint(set1).Matches(set2));
-        }
-
-        [Test]
-        public void EquivalentFailsWithDuplicateElementInActual()
-        {
-            ICollection set1 = new ICollectionAdapter("x", "y", "z");
-            ICollection set2 = new ICollectionAdapter("x", "y", "x");
-
-            Assert.False(new CollectionEquivalentConstraint(set1).Matches(set2));
-        }
-
-        [Test]
-        public void EquivalentFailsWithDuplicateElementInExpected()
-        {
-            ICollection set1 = new ICollectionAdapter("x", "y", "x");
-            ICollection set2 = new ICollectionAdapter("x", "y", "z");
-
-            Assert.False(new CollectionEquivalentConstraint(set1).Matches(set2));
-        }
-
-        [Test]
-        public void EquivalentHandlesNull()
-        {
-            ICollection set1 = new ICollectionAdapter(null, "x", null, "z");
-            ICollection set2 = new ICollectionAdapter("z", null, "x", null);
-
-            Assert.That(new CollectionEquivalentConstraint(set1).Matches(set2));
-        }
-
-        [Test]
-        public void EquivalentHonorsIgnoreCase()
-        {
-            ICollection set1 = new ICollectionAdapter("x", "y", "z");
-            ICollection set2 = new ICollectionAdapter("z", "Y", "X");
-
-            Assert.That(new CollectionEquivalentConstraint(set1).IgnoreCase.Matches(set2));
-        }
-
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void EquivalentHonorsUsing()
-        {
-            ICollection set1 = new ICollectionAdapter("x", "y", "z");
-            ICollection set2 = new ICollectionAdapter("z", "Y", "X");
-
-            Assert.That(new CollectionEquivalentConstraint(set1)
-                .Using<string>( (x,y)=>String.Compare(x,y,true) )
-                .Matches(set2));
-        }
-
-        [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
-
-    #region CollectionOrdered
-    [TestFixture]
-    public class CollectionOrderedTests : MessageChecker
-    {
-        [Test]
-        public void IsOrdered()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add("y");
-            al.Add("z");
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test]
-        public void IsOrdered_2()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(1);
-            al.Add(2);
-            al.Add(3);
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test]
-        public void IsOrderedDescending()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("z");
-            al.Add("y");
-            al.Add("x");
-
-            Assert.That(al, Is.Ordered.Descending);
-        }
-
-        [Test]
-        public void IsOrderedDescending_2()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(3);
-            al.Add(2);
-            al.Add(1);
-
-            Assert.That(al, Is.Ordered.Descending);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsOrdered_Fails()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add("z");
-            al.Add("y");
-
-            expectedMessage =
-                "  Expected: collection ordered" + Environment.NewLine +
-                "  But was:  < \"x\", \"z\", \"y\" >" + Environment.NewLine;
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test]
-        public void IsOrdered_Allows_adjacent_equal_values()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add("x");
-            al.Add("z");
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test, ExpectedException(typeof(ArgumentNullException), 
-            ExpectedMessage="index 1", MatchType=MessageMatch.Contains)]
-        public void IsOrdered_Handles_null()
-        {
-            ArrayList al = new ArrayList();
-            al.Add("x");
-            al.Add(null);
-            al.Add("z");
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsOrdered_TypesMustBeComparable()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(1);
-            al.Add("x");
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsOrdered_AtLeastOneArgMustImplementIComparable()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new object());
-            al.Add(new object());
-
-            Assert.That(al, Is.Ordered);
-        }
-
-        [Test]
-        public void IsOrdered_Handles_custom_comparison()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new object());
-            al.Add(new object());
-
-            AlwaysEqualComparer comparer = new AlwaysEqualComparer();
-            Assert.That(al, Is.Ordered.Using(comparer));
-            Assert.That(comparer.Called, "TestComparer was not called");
-        }
-
-        [Test]
-        public void IsOrdered_Handles_custom_comparison2()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(2);
-            al.Add(1);
-
-            TestComparer comparer = new TestComparer();
-            Assert.That(al, Is.Ordered.Using(comparer));
-            Assert.That(comparer.Called, "TestComparer was not called");
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void UsesProvidedComparerOfT()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(1);
-            al.Add(2);
-
-            MyComparer<int> comparer = new MyComparer<int>();
-            Assert.That(al, Is.Ordered.Using(comparer));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer<T> : IComparer<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-        [Test]
-        public void UsesProvidedComparisonOfT()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(1);
-            al.Add(2);
-
-            MyComparison<int> comparer = new MyComparison<int>();
-            Assert.That(al, Is.Ordered.Using(new Comparison<int>(comparer.Compare)));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparison<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void UsesProvidedLambda()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(1);
-            al.Add(2);
-
-            Comparison<int> comparer = (x, y) => x.CompareTo(y);
-            Assert.That(al, Is.Ordered.Using(comparer));
-        }
-#endif
-#endif
-
-        [Test]
-        public void IsOrderedBy()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new OrderedByTestClass(1));
-            al.Add(new OrderedByTestClass(2));
-
-            Assert.That(al, Is.Ordered.By("Value"));
-        }
-
-        [Test]
-        public void IsOrderedBy_Comparer()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new OrderedByTestClass(1));
-            al.Add(new OrderedByTestClass(2));
-
-            Assert.That(al, Is.Ordered.By("Value").Using(Comparer.Default));
-        }
-
-        [Test]
-        public void IsOrderedBy_Handles_heterogeneous_classes_as_long_as_the_property_is_of_same_type()
-        {
-            ArrayList al = new ArrayList();
-            al.Add(new OrderedByTestClass(1));
-            al.Add(new OrderedByTestClass2(2));
-
-            Assert.That(al, Is.Ordered.By("Value"));
-        }
-
-        class OrderedByTestClass
-        {
-            private int myValue;
-
-            public int Value 
-            {
-                get { return myValue; }
-                set { myValue = value; } 
-            }
-
-            public OrderedByTestClass(int value)
-            {
-                Value = value;
-            }
-        }
-
-        class OrderedByTestClass2
-        {
-            private int myValue;
-            public int Value 
-            {
-                get { return myValue; }
-                set { myValue = value; } 
-            }
-
-            public OrderedByTestClass2(int value)
-            {
-                Value = value;
-            }
-        }
-    }
-    #endregion
-}
diff --git a/src/NUnitFramework/tests/Constraints/ComparerTests.cs b/src/NUnitFramework/tests/Constraints/ComparerTests.cs
deleted file mode 100644
index feb6b50..0000000
--- a/src/NUnitFramework/tests/Constraints/ComparerTests.cs
+++ /dev/null
@@ -1,73 +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
-// ****************************************************************
-
-using System;
-
-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)]
-        [TestCase(4, 4.0d)]
-        [TestCase(4, 4.0f)]
-        [TestCase(4.0d, 4)]
-        [TestCase(4.0d, 4.0f)]
-        [TestCase(4.0f, 4)]
-        [TestCase(4.0f, 4.0d)]
-        [TestCase(SpecialValue.Null, SpecialValue.Null)]
-#if 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.AreEqual(x, y, ref tolerance));
-        }
-
-        [TestCase(4, 2)]
-        [TestCase(4.0d, 2.0d)]
-        [TestCase(4.0f, 2.0f)]
-        [TestCase(4, 2.0d)]
-        [TestCase(4, 2.0f)]
-        [TestCase(4.0d, 2)]
-        [TestCase(4.0d, 2.0f)]
-        [TestCase(4.0f, 2)]
-        [TestCase(4.0f, 2.0d)]
-        [TestCase(4, SpecialValue.Null)]
-#if 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.AreEqual(greater, lesser, ref tolerance));
-            Assert.False(NUnitEqualityComparer.Default.AreEqual(lesser, greater, ref tolerance));
-        }
-
-        [TestCase(double.PositiveInfinity)]
-        [TestCase(double.NegativeInfinity)]
-        [TestCase(double.NaN)]
-        [TestCase(float.PositiveInfinity)]
-        [TestCase(float.NegativeInfinity)]
-        [TestCase(float.NaN)]
-        public void SpecialFloatingPointValues(object x)
-        {
-            Assert.That(NUnitEqualityComparer.Default.AreEqual(x, x, ref tolerance));
-        }
-    }
-}
diff --git a/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
deleted file mode 100644
index 1105c67..0000000
--- a/src/NUnitFramework/tests/Constraints/ComparisonConstraintTests.cs
+++ /dev/null
@@ -1,387 +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.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    #region ComparisonTest
-    public abstract class ComparisonConstraintTest : ConstraintTestBaseWithArgumentException
-    {
-        protected ComparisonConstraint comparisonConstraint;
-
-        [Test]
-        public void UsesProvidedIComparer()
-        {
-            MyComparer comparer = new MyComparer();
-            comparisonConstraint.Using(comparer).Matches(0);
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer : IComparer
-        {
-            public bool Called;
-
-            public int Compare(object x, object y)
-            {
-                Called = true;
-                return Comparer.Default.Compare(x, y);
-            }
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void UsesProvidedComparerOfT()
-        {
-            MyComparer<int> comparer = new MyComparer<int>();
-            comparisonConstraint.Using(comparer).Matches(0);
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer<T> : IComparer<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-        [Test]
-        public void UsesProvidedComparisonOfT()
-        {
-            MyComparison<int> comparer = new MyComparison<int>();
-            comparisonConstraint.Using(new Comparison<int>(comparer.Compare)).Matches(0);
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparison<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void UsesProvidedLambda()
-        {
-            Comparison<int> comparer = (x, y) => x.CompareTo(y);
-            comparisonConstraint.Using(comparer).Matches(0);
-        }
-#endif
-#endif
-    }
-    #endregion
-
-    #region GreaterThan
-    [TestFixture]
-    public class GreaterThanTest : ComparisonConstraintTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = comparisonConstraint = new GreaterThanConstraint(5);
-            expectedDescription = "greater than 5";
-            stringRepresentation = "<greaterthan 5>";
-        }
-
-        internal object[] SuccessData = new object[] { 6, 5.001 };
-
-        internal object[] FailureData = new object[] { 4, 5 };
-
-        internal string[] ActualValues = new string[] { "4", "5" };
-
-        internal object[] InvalidData = new object[] { null, "xxx" };
-
-        [Test]
-        public void CanCompareIComparables()
-        {
-            ClassWithIComparable expected = new ClassWithIComparable(0);
-            ClassWithIComparable actual = new ClassWithIComparable(42);
-            Assert.That(actual, Is.GreaterThan(expected));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void CanCompareIComparablesOfT()
-        {
-            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(0);
-            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(42);
-            Assert.That(actual, Is.GreaterThan(expected));
-        }
-#endif
-    }
-    #endregion
-
-    #region GreaterThanOrEqual
-    [TestFixture]
-    public class GreaterThanOrEqualTest : ComparisonConstraintTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = comparisonConstraint = new GreaterThanOrEqualConstraint(5);
-            expectedDescription = "greater than or equal to 5";
-            stringRepresentation = "<greaterthanorequal 5>";
-        }
-
-        internal object[] SuccessData = new object[] { 6, 5 };
-
-        internal object[] FailureData = new object[] { 4 };
-
-        internal string[] ActualValues = new string[] { "4" };
-
-        internal object[] InvalidData = new object[] { null, "xxx" };
-
-        [Test]
-        public void CanCompareIComparables()
-        {
-            ClassWithIComparable expected = new ClassWithIComparable(0);
-            ClassWithIComparable actual = new ClassWithIComparable(42);
-            Assert.That(actual, Is.GreaterThanOrEqualTo(expected));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void CanCompareIComparablesOfT()
-        {
-            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(0);
-            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(42);
-            Assert.That(actual, Is.GreaterThanOrEqualTo(expected));
-        }
-#endif
-    }
-    #endregion
-
-    #region LessThan
-    [TestFixture]
-    public class LessThanTest : ComparisonConstraintTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = comparisonConstraint = new LessThanConstraint(5);
-            expectedDescription = "less than 5";
-            stringRepresentation = "<lessthan 5>";
-        }
-
-        internal object[] SuccessData = new object[] { 4, 4.999 };
-
-        internal object[] FailureData = new object[] { 6, 5 };
-
-        internal string[] ActualValues = new string[] { "6", "5" };
-
-        internal object[] InvalidData = new object[] { null, "xxx" };
-
-        [Test]
-        public void CanCompareIComparables()
-        {
-            ClassWithIComparable expected = new ClassWithIComparable(42);
-            ClassWithIComparable actual = new ClassWithIComparable(0);
-            Assert.That(actual, Is.LessThan(expected));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void CanCompareIComparablesOfT()
-        {
-            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(42);
-            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(0);
-            Assert.That(actual, Is.LessThan(expected));
-        }
-#endif
-    }
-    #endregion
-
-    #region LessThanOrEqual
-    [TestFixture]
-    public class LessThanOrEqualTest : ComparisonConstraintTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = comparisonConstraint = new LessThanOrEqualConstraint(5);
-            expectedDescription = "less than or equal to 5";
-            stringRepresentation = "<lessthanorequal 5>";
-        }
-
-        internal object[] SuccessData = new object[] { 4, 5 };
-
-        internal object[] FailureData = new object[] { 6 };
-
-        internal string[] ActualValues = new string[] { "6" };
-
-        internal object[] InvalidData = new object[] { null, "xxx" };
-
-        [Test]
-        public void CanCompareIComparables()
-        {
-            ClassWithIComparable expected = new ClassWithIComparable(42);
-            ClassWithIComparable actual = new ClassWithIComparable(0);
-            Assert.That(actual, Is.LessThanOrEqualTo(expected));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void CanCompareIComparablesOfT()
-        {
-            ClassWithIComparableOfT expected = new ClassWithIComparableOfT(42);
-            ClassWithIComparableOfT actual = new ClassWithIComparableOfT(0);
-            Assert.That(actual, Is.LessThanOrEqualTo(expected));
-        }
-#endif
-    }
-    #endregion
-
-    #region RangeConstraint
-    [TestFixture]
-    public class RangeConstraintTest : ConstraintTestBaseWithArgumentException
-    {
-#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>";
-        }
-
-        internal object[] SuccessData = new object[] { 5, 23, 42 };
-
-        internal object[] FailureData = new object[] { 4, 43 };
-
-        internal string[] ActualValues = new string[] { "4", "43" };
-
-        internal object[] InvalidData = new object[] { null, "xxx" };
-
-        [Test]
-        public void UsesProvidedIComparer()
-        {
-            MyComparer comparer = new MyComparer();
-            Assert.That(rangeConstraint.Using(comparer).Matches(19));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer : IComparer
-        {
-            public bool Called;
-
-            public int Compare(object x, object y)
-            {
-                Called = true;
-                return Comparer.Default.Compare(x, y);
-            }
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void UsesProvidedComparerOfT()
-        {
-            MyComparer<int> comparer = new MyComparer<int>();
-            Assert.That(rangeConstraint.Using(comparer).Matches(19));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparer<T> : IComparer<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-        [Test]
-        public void UsesProvidedComparisonOfT()
-        {
-            MyComparison<int> comparer = new MyComparison<int>();
-            Assert.That(rangeConstraint.Using(new Comparison<int>(comparer.Compare)).Matches(19));
-            Assert.That(comparer.Called, "Comparer was not called");
-        }
-
-        class MyComparison<T>
-        {
-            public bool Called;
-
-            public int Compare(T x, T y)
-            {
-                Called = true;
-                return Comparer<T>.Default.Compare(x, y);
-            }
-        }
-
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void UsesProvidedLambda()
-        {
-            Comparison<int> comparer = (x, y) => x.CompareTo(y);
-            Assert.That(rangeConstraint.Using(comparer).Matches(19));
-        }
-#endif
-#endif
-    }
-    #endregion
-
-    #region Test Classes
-    class ClassWithIComparable : IComparable
-    {
-        private int val;
-
-        public ClassWithIComparable(int val)
-        {
-            this.val = val;
-        }
-
-        public int CompareTo(object x)
-        {
-            ClassWithIComparable other = x as ClassWithIComparable;
-            if (x is ClassWithIComparable)
-                return val.CompareTo(other.val);
-
-            throw new ArgumentException();
-        }
-    }
-
-#if CLR_2_0 || CLR_4_0
-    class ClassWithIComparableOfT : IComparable<ClassWithIComparableOfT>
-    {
-        private int val;
-
-        public ClassWithIComparableOfT(int val)
-        {
-            this.val = val;
-        }
-
-        public int CompareTo(ClassWithIComparableOfT other)
-        {
-            return val.CompareTo(other.val);
-        }
-    }
-#endif
-    #endregion
-}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs b/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs
index 1fe4bbc..a2e5bb0 100644
--- a/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs
+++ b/src/NUnitFramework/tests/Constraints/ConstraintTestBase.cs
@@ -1,85 +1,85 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    public abstract class ConstraintTestBaseNoData
-    {
-        protected Constraint theConstraint;
-        protected string expectedDescription = "<NOT SET>";
-        protected string stringRepresentation = "<NOT SET>";
-
-        [Test]
-        public void ProvidesProperDescription()
-        {
-            TextMessageWriter writer = new TextMessageWriter();
-            theConstraint.WriteDescriptionTo(writer);
-            Assert.AreEqual(expectedDescription, writer.ToString());
-        }
-
-        [Test]
-        public void ProvidesProperStringRepresentation()
-        {
-            Assert.AreEqual(stringRepresentation, theConstraint.ToString());
-        }
-    }
-
-    public abstract class ConstraintTestBase : ConstraintTestBaseNoData
-    {
-        [Test, TestCaseSource("SuccessData")]
-        public void SucceedsWithGoodValues(object value)
-        {
-            Assert.That(theConstraint.Matches(value));
-        }
-
-        [Test, TestCaseSource("FailureData")]
-        public void FailsWithBadValues(object badValue)
-        {
-            Assert.IsFalse(theConstraint.Matches(badValue));
-        }
-
-        [Test, Sequential]
-        public void ProvidesProperFailureMessage(
-            [ValueSource("FailureData")] object badValue,
-            [ValueSource("ActualValues")] string message)
-        {
-            theConstraint.Matches(badValue);
-            TextMessageWriter writer = new TextMessageWriter();
-            theConstraint.WriteMessageTo(writer);
-            Assert.AreEqual(
-                TextMessageWriter.Pfx_Expected + expectedDescription + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + message + Environment.NewLine,
-                writer.ToString());
-        }
-    }
-
-    /// <summary>
-    /// Base class for testing constraints that can throw an ArgumentException
-    /// </summary>
-    public abstract class ConstraintTestBaseWithArgumentException : ConstraintTestBase
-    {
-        [Test, TestCaseSource("InvalidData")]
-        [ExpectedException(typeof(ArgumentException))]
-        public void InvalidDataThrowsArgumentException(object value)
-        {
-            theConstraint.Matches(value);
-        }
-    }
-
-    /// <summary>
-    /// Base class for tests that can throw multiple exceptions. Use
-    /// TestCaseData class to specify the expected exception type.
-    /// </summary>
-    public abstract class ConstraintTestBaseWithExceptionTests : ConstraintTestBase
-    {
-        [Test, TestCaseSource("InvalidData")]
-        public void InvalidDataThrowsException(object value)
-        {
-            theConstraint.Matches(value);
-        }
-    }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    public abstract class ConstraintTestBaseNoData
+    {
+        protected Constraint theConstraint;
+        protected string expectedDescription = "<NOT SET>";
+        protected string stringRepresentation = "<NOT SET>";
+
+        [Test]
+        public void ProvidesProperDescription()
+        {
+            TextMessageWriter writer = new TextMessageWriter();
+            theConstraint.WriteDescriptionTo(writer);
+            Assert.AreEqual(expectedDescription, writer.ToString());
+        }
+
+        [Test]
+        public void ProvidesProperStringRepresentation()
+        {
+            Assert.AreEqual(stringRepresentation, theConstraint.ToString());
+        }
+    }
+
+    public abstract class ConstraintTestBase : ConstraintTestBaseNoData
+    {
+        [Test, TestCaseSource("SuccessData")]
+        public void SucceedsWithGoodValues(object value)
+        {
+            Assert.That(theConstraint.Matches(value));
+        }
+
+        [Test, TestCaseSource("FailureData")]
+        public void FailsWithBadValues(object badValue)
+        {
+            Assert.IsFalse(theConstraint.Matches(badValue));
+        }
+
+        [Test, Sequential]
+        public void ProvidesProperFailureMessage(
+            [ValueSource("FailureData")] object badValue,
+            [ValueSource("ActualValues")] string message)
+        {
+            theConstraint.Matches(badValue);
+            TextMessageWriter writer = new TextMessageWriter();
+            theConstraint.WriteMessageTo(writer);
+            Assert.AreEqual(
+                TextMessageWriter.Pfx_Expected + expectedDescription + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + message + Environment.NewLine,
+                writer.ToString());
+        }
+    }
+
+    /// <summary>
+    /// Base class for testing constraints that can throw an ArgumentException
+    /// </summary>
+    public abstract class ConstraintTestBaseWithArgumentException : ConstraintTestBase
+    {
+        [Test, TestCaseSource("InvalidData")]
+        [ExpectedException(typeof(ArgumentException))]
+        public void InvalidDataThrowsArgumentException(object value)
+        {
+            theConstraint.Matches(value);
+        }
+    }
+
+    /// <summary>
+    /// Base class for tests that can throw multiple exceptions. Use
+    /// TestCaseData class to specify the expected exception type.
+    /// </summary>
+    public abstract class ConstraintTestBaseWithExceptionTests : ConstraintTestBase
+    {
+        [Test, TestCaseSource("InvalidData")]
+        public void InvalidDataThrowsException(object value)
+        {
+            theConstraint.Matches(value);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs b/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
index 1cfc5dc..a3aaa08 100644
--- a/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
+++ b/src/NUnitFramework/tests/Constraints/EmptyConstraintTest.cs
@@ -1,84 +1,84 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class EmptyConstraintTest : ConstraintTestBaseWithArgumentException
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new EmptyConstraint();
-            expectedDescription = "<empty>";
-            stringRepresentation = "<empty>";
-        }
-
-        internal static object[] SuccessData = new object[] 
-        {
-            string.Empty,
-            new object[0],
-            new ArrayList(),
-#if CLR_2_0 || CLR_4_0
-            new System.Collections.Generic.List<int>()
-#endif  
-        };
-
-        internal static object[] FailureData = new object[]
-        {
-            "Hello",
-            new object[] { 1, 2, 3 }
-        };
-
-        internal static string[] ActualValues = new string[]
-        {
-            "\"Hello\"",
-            "< 1, 2, 3 >"
-        };
-
-        internal static object[] InvalidData = new object[]
-            {
-                null,
-                5
-            };
-    }
-
-    [TestFixture]
-    public class NullOrEmptyStringConstraintTest : ConstraintTestBaseWithArgumentException
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new NullOrEmptyStringConstraint();
-            expectedDescription = "null or empty string";
-            stringRepresentation = "<nullorempty>";
-        }
-
-        internal static object[] SuccessData = new object[] 
-        {
-            string.Empty,
-            null
-        };
-
-        internal static object[] FailureData = new object[]
-        {
-            "Hello"
-        };
-
-        internal static string[] ActualValues = new string[]
-        {
-            "\"Hello\""
-        };
-
-        internal static object[] InvalidData = new object[]
-            {
-                5
-            };
-    }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class EmptyConstraintTest : ConstraintTestBaseWithArgumentException
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new EmptyConstraint();
+            expectedDescription = "<empty>";
+            stringRepresentation = "<empty>";
+        }
+
+        internal static object[] SuccessData = new object[] 
+        {
+            string.Empty,
+            new object[0],
+            new ArrayList(),
+#if CLR_2_0 || CLR_4_0
+            new System.Collections.Generic.List<int>()
+#endif  
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            "Hello",
+            new object[] { 1, 2, 3 }
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "\"Hello\"",
+            "< 1, 2, 3 >"
+        };
+
+        internal static object[] InvalidData = new object[]
+            {
+                null,
+                5
+            };
+    }
+
+    [TestFixture]
+    public class NullOrEmptyStringConstraintTest : ConstraintTestBaseWithArgumentException
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new NullOrEmptyStringConstraint();
+            expectedDescription = "null or empty string";
+            stringRepresentation = "<nullorempty>";
+        }
+
+        internal static object[] SuccessData = new object[] 
+        {
+            string.Empty,
+            null
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            "Hello"
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "\"Hello\""
+        };
+
+        internal static object[] InvalidData = new object[]
+            {
+                5
+            };
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs b/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs
index 4abde29..fe1e973 100644
--- a/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs
@@ -1,488 +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
-    }
-}
+// ****************************************************************
+// Copyright 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 || CS_5_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 || CS_5_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 a2e14c4..e5a08b2 100644
--- a/src/NUnitFramework/tests/Constraints/EqualTest.cs
+++ b/src/NUnitFramework/tests/Constraints/EqualTest.cs
@@ -1,128 +1,128 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Drawing;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class EqualTest : IExpectException
-    {
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailedStringMatchShowsFailurePosition()
-        {
-            Assert.That( "abcdgfe", new EqualConstraint( "abcdefg" ) );
-        }
-
-        static readonly string testString = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void LongStringsAreTruncated()
-        {
-            string expected = testString;
-            string actual = testString.Replace('k', 'X');
-
-            Assert.That(actual, new EqualConstraint(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void LongStringsAreTruncatedAtBothEndsIfNecessary()
-        {
-            string expected = testString;
-            string actual = testString.Replace('Z', '?');
-
-            Assert.That(actual, new EqualConstraint(expected));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void LongStringsAreTruncatedAtFrontEndIfNecessary()
-        {
-            string expected = testString;
-            string actual = testString  + "+++++";
-
-            Assert.That(actual, new EqualConstraint(expected));
-        }
-
-//        [Test]
-//        public void NamedAndUnnamedColorsCompareAsEqual()
-//        {
-//            EqualConstraint.SetConstraintForType(typeof(Color), typeof(SameColorAs));
-//            Assert.That(System.Drawing.Color.Red,
-//                Is.EqualTo(System.Drawing.Color.FromArgb(255, 0, 0)));
-//        }
-
-        public void HandleException(Exception ex)
-        {
-            StringReader rdr = new StringReader(ex.Message);
-            /* skip */ rdr.ReadLine();
-            string expected = rdr.ReadLine();
-            if (expected != null && expected.Length > 11)
-                expected = expected.Substring(11);
-            string actual = rdr.ReadLine();
-            if (actual != null && actual.Length > 11)
-                actual = actual.Substring(11);
-            string line = rdr.ReadLine();
-            Assert.That(line, new NotConstraint(new EqualConstraint(null)), "No caret line displayed");
-            int caret = line.Substring(11).IndexOf('^');
-
-            int minLength = Math.Min(expected.Length, actual.Length);
-            int minMatch = Math.Min(caret, minLength);
-
-            if (caret != minLength)
-            {
-                if (caret > minLength ||
-                    expected.Substring(0, minMatch) != actual.Substring(0, minMatch) ||
-                    expected[caret] == actual[caret])
-                    Assert.Fail("Message Error: Caret does not point at first mismatch..." + Environment.NewLine + ex.Message);
-            }
-
-            if (expected.Length > 68 || actual.Length > 68 || caret > 68)
-                Assert.Fail("Message Error: Strings are not truncated..." + Environment.NewLine + ex.Message);
-        }
-
-        public class SameColorAs : Constraint
-        {
-            private Color expectedColor;
-
-            public SameColorAs(Color expectedColor)
-            {
-                this.expectedColor = expectedColor;
-            }
-
-            public override bool Matches(object actual)
-            {
-                this.actual = actual;
-                return actual is Color && ((Color)actual).ToArgb() == expectedColor.ToArgb();
-            }
-
-            public override void WriteDescriptionTo(MessageWriter writer)
-            {
-                writer.WriteExpectedValue( "same color as " + expectedColor );
-            }
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void TestPropertyWithPrivateSetter()
-        {
-            SomeClass obj = new SomeClass();
-            Assert.That(obj.BrokenProp, Is.EqualTo(string.Empty));
-        }
-
-        private class SomeClass
-        {
-            public string BrokenProp
-            {
-                get { return string.Empty; }
-                private set { }
-            }
-        }
-#endif
-    }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Drawing;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class EqualTest : IExpectException
+    {
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailedStringMatchShowsFailurePosition()
+        {
+            Assert.That( "abcdgfe", new EqualConstraint( "abcdefg" ) );
+        }
+
+        static readonly string testString = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void LongStringsAreTruncated()
+        {
+            string expected = testString;
+            string actual = testString.Replace('k', 'X');
+
+            Assert.That(actual, new EqualConstraint(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void LongStringsAreTruncatedAtBothEndsIfNecessary()
+        {
+            string expected = testString;
+            string actual = testString.Replace('Z', '?');
+
+            Assert.That(actual, new EqualConstraint(expected));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void LongStringsAreTruncatedAtFrontEndIfNecessary()
+        {
+            string expected = testString;
+            string actual = testString  + "+++++";
+
+            Assert.That(actual, new EqualConstraint(expected));
+        }
+
+//        [Test]
+//        public void NamedAndUnnamedColorsCompareAsEqual()
+//        {
+//            EqualConstraint.SetConstraintForType(typeof(Color), typeof(SameColorAs));
+//            Assert.That(System.Drawing.Color.Red,
+//                Is.EqualTo(System.Drawing.Color.FromArgb(255, 0, 0)));
+//        }
+
+        public void HandleException(Exception ex)
+        {
+            StringReader rdr = new StringReader(ex.Message);
+            /* skip */ rdr.ReadLine();
+            string expected = rdr.ReadLine();
+            if (expected != null && expected.Length > 11)
+                expected = expected.Substring(11);
+            string actual = rdr.ReadLine();
+            if (actual != null && actual.Length > 11)
+                actual = actual.Substring(11);
+            string line = rdr.ReadLine();
+            Assert.That(line, new NotConstraint(new EqualConstraint(null)), "No caret line displayed");
+            int caret = line.Substring(11).IndexOf('^');
+
+            int minLength = Math.Min(expected.Length, actual.Length);
+            int minMatch = Math.Min(caret, minLength);
+
+            if (caret != minLength)
+            {
+                if (caret > minLength ||
+                    expected.Substring(0, minMatch) != actual.Substring(0, minMatch) ||
+                    expected[caret] == actual[caret])
+                    Assert.Fail("Message Error: Caret does not point at first mismatch..." + Environment.NewLine + ex.Message);
+            }
+
+            if (expected.Length > 68 || actual.Length > 68 || caret > 68)
+                Assert.Fail("Message Error: Strings are not truncated..." + Environment.NewLine + ex.Message);
+        }
+
+        public class SameColorAs : Constraint
+        {
+            private Color expectedColor;
+
+            public SameColorAs(Color expectedColor)
+            {
+                this.expectedColor = expectedColor;
+            }
+
+            public override bool Matches(object actual)
+            {
+                this.actual = actual;
+                return actual is Color && ((Color)actual).ToArgb() == expectedColor.ToArgb();
+            }
+
+            public override void WriteDescriptionTo(MessageWriter writer)
+            {
+                writer.WriteExpectedValue( "same color as " + expectedColor );
+            }
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void TestPropertyWithPrivateSetter()
+        {
+            SomeClass obj = new SomeClass();
+            Assert.That(obj.BrokenProp, Is.EqualTo(string.Empty));
+        }
+
+        private class SomeClass
+        {
+            public string BrokenProp
+            {
+                get { return string.Empty; }
+                private set { }
+            }
+        }
+#endif
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs b/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs
index 4d55d2d..123d999 100644
--- a/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs
+++ b/src/NUnitFramework/tests/Constraints/FloatingPointNumericsTest.cs
@@ -1,107 +1,107 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Drawing;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class FloatingPointNumericsTest
-    {
-
-        /// <summary>Tests the floating point value comparison helper</summary>
-        [Test]
-        public void FloatEqualityWithUlps()
-        {
-            Assert.IsTrue(
-                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001f, 0.0000000100000008f, 1)
-            );
-            Assert.IsFalse(
-                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001f, 0.0000000100000017f, 1)
-            );
-
-            Assert.IsTrue(
-                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00f, 1000000.06f, 1)
-            );
-            Assert.IsFalse(
-                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00f, 1000000.13f, 1)
-            );
-        }
-
-        /// <summary>Tests the double precision floating point value comparison helper</summary>
-        [Test]
-        public void DoubleEqualityWithUlps()
-        {
-            Assert.IsTrue(
-                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001, 0.000000010000000000000002, 1)
-            );
-            Assert.IsFalse(
-                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001, 0.000000010000000000000004, 1)
-            );
-
-            Assert.IsTrue(
-                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00, 1000000.0000000001, 1)
-            );
-            Assert.IsFalse(
-                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00, 1000000.0000000002, 1)
-            );
-        }
-
-        /// <summary>Tests the integer reinterpretation functions</summary>
-        [Test]
-        public void MirroredIntegerReinterpretation()
-        {
-            Assert.AreEqual(
-                12345.0f,
-                FloatingPointNumerics.ReinterpretAsFloat(
-                    FloatingPointNumerics.ReinterpretAsInt(12345.0f)
-                )
-            );
-        }
-
-        /// <summary>Tests the long reinterpretation functions</summary>
-        [Test]
-        public void MirroredLongReinterpretation()
-        {
-            Assert.AreEqual(
-                12345.67890,
-                FloatingPointNumerics.ReinterpretAsDouble(
-                    FloatingPointNumerics.ReinterpretAsLong(12345.67890)
-                )
-            );
-        }
-
-        /// <summary>Tests the floating point reinterpretation functions</summary>
-        [Test]
-        public void MirroredFloatReinterpretation()
-        {
-            Assert.AreEqual(
-                12345,
-                FloatingPointNumerics.ReinterpretAsInt(
-                    FloatingPointNumerics.ReinterpretAsFloat(12345)
-                )
-            );
-        }
-
-
-        /// <summary>
-        ///   Tests the double prevision floating point reinterpretation functions
-        /// </summary>
-        [Test]
-        public void MirroredDoubleReinterpretation()
-        {
-            Assert.AreEqual(
-                1234567890,
-                FloatingPointNumerics.ReinterpretAsLong(
-                    FloatingPointNumerics.ReinterpretAsDouble(1234567890)
-                )
-            );
-        }
-
-  }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Drawing;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class FloatingPointNumericsTest
+    {
+
+        /// <summary>Tests the floating point value comparison helper</summary>
+        [Test]
+        public void FloatEqualityWithUlps()
+        {
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001f, 0.0000000100000008f, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001f, 0.0000000100000017f, 1)
+            );
+
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00f, 1000000.06f, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00f, 1000000.13f, 1)
+            );
+        }
+
+        /// <summary>Tests the double precision floating point value comparison helper</summary>
+        [Test]
+        public void DoubleEqualityWithUlps()
+        {
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001, 0.000000010000000000000002, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(0.00000001, 0.000000010000000000000004, 1)
+            );
+
+            Assert.IsTrue(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00, 1000000.0000000001, 1)
+            );
+            Assert.IsFalse(
+                FloatingPointNumerics.AreAlmostEqualUlps(1000000.00, 1000000.0000000002, 1)
+            );
+        }
+
+        /// <summary>Tests the integer reinterpretation functions</summary>
+        [Test]
+        public void MirroredIntegerReinterpretation()
+        {
+            Assert.AreEqual(
+                12345.0f,
+                FloatingPointNumerics.ReinterpretAsFloat(
+                    FloatingPointNumerics.ReinterpretAsInt(12345.0f)
+                )
+            );
+        }
+
+        /// <summary>Tests the long reinterpretation functions</summary>
+        [Test]
+        public void MirroredLongReinterpretation()
+        {
+            Assert.AreEqual(
+                12345.67890,
+                FloatingPointNumerics.ReinterpretAsDouble(
+                    FloatingPointNumerics.ReinterpretAsLong(12345.67890)
+                )
+            );
+        }
+
+        /// <summary>Tests the floating point reinterpretation functions</summary>
+        [Test]
+        public void MirroredFloatReinterpretation()
+        {
+            Assert.AreEqual(
+                12345,
+                FloatingPointNumerics.ReinterpretAsInt(
+                    FloatingPointNumerics.ReinterpretAsFloat(12345)
+                )
+            );
+        }
+
+
+        /// <summary>
+        ///   Tests the double prevision floating point reinterpretation functions
+        /// </summary>
+        [Test]
+        public void MirroredDoubleReinterpretation()
+        {
+            Assert.AreEqual(
+                1234567890,
+                FloatingPointNumerics.ReinterpretAsLong(
+                    FloatingPointNumerics.ReinterpretAsDouble(1234567890)
+                )
+            );
+        }
+
+  }
+}
diff --git a/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs b/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
index 6c5b462..19fa236 100644
--- a/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
+++ b/src/NUnitFramework/tests/Constraints/MsgUtilTests.cs
@@ -1,113 +1,113 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework.Constraints
-{
-	/// <summary>
-	/// Summary description for MsgUtilTests.
-	/// </summary>
-	[TestFixture]
-	public class MsgUtilTests
-	{
-        [TestCase("\n", "\\n")]
-        [TestCase("\n\n", "\\n\\n")]
-        [TestCase("\n\n\n", "\\n\\n\\n")]
-        [TestCase("\r", "\\r")]
-        [TestCase("\r\r", "\\r\\r")]
-        [TestCase("\r\r\r", "\\r\\r\\r")]
-        [TestCase("\r\n", "\\r\\n")]
-        [TestCase("\n\r", "\\n\\r")]
-        [TestCase("This is a\rtest message", "This is a\\rtest message")]
-        [TestCase("", "")]
-#if CLR_2_0 || CLR_4_0
-        [TestCase(null, null)]
-#endif
-        [TestCase("\t", "\\t")]
-        [TestCase("\t\n", "\\t\\n")]
-        [TestCase("\\r\\n", "\\\\r\\\\n")]
-        // TODO: Figure out why this fails in Mono
-        // TODO: Need Platform property on test case
-        //[TestCase("\0", "\\0")]
-        [TestCase("\a", "\\a")]
-        [TestCase("\b", "\\b")]
-        [TestCase("\f", "\\f")]
-        [TestCase("\v", "\\v")]
-        // New Line
-        [TestCase("\x0085", "\\x0085", Description = "Next line character")]
-        [TestCase("\x2028", "\\x2028", Description = "Line separator character")]
-        [TestCase("\x2029", "\\x2029", Description = "Paragraph separator character")]
-        public void EscapeControlCharsTest(string input, string expected)
-		{
-            Assert.AreEqual( expected, MsgUtils.EscapeControlChars(input) );
-		}
-
-#if MONO
-        [Test]
-        public void EscapeNullCharInString()
-        {
-            Assert.That(MsgUtils.EscapeControlChars("\0"), Is.EqualTo("\\0"));
-        }
-#endif
-
-        private const string s52 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-        [TestCase(s52, 52, 0, s52, TestName="NoClippingNeeded")]
-        [TestCase(s52, 29, 0, "abcdefghijklmnopqrstuvwxyz...", TestName="ClipAtEnd")]
-        [TestCase(s52, 29, 26, "...ABCDEFGHIJKLMNOPQRSTUVWXYZ", TestName="ClipAtStart")]
-        [TestCase(s52, 28, 26, "...ABCDEFGHIJKLMNOPQRSTUV...", TestName="ClipAtStartAndEnd")]
-        public void TestClipString(string input, int max, int start, string result)
-        {
-            Assert.AreEqual(result, MsgUtils.ClipString(input, max, start));
-        }
-
-        //[TestCase('\0')]
-        //[TestCase('\r')]
-        //public void CharacterArgumentTest(char c)
-        //{
-        //}
-
-        [Test]
-        public void ClipExpectedAndActual_StringsFitInLine()
-        {
-            string eClip = s52;
-            string aClip = "abcde";
-            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 5);
-            Assert.AreEqual(s52, eClip);
-            Assert.AreEqual("abcde", aClip);
-
-            eClip = s52;
-            aClip = "abcdefghijklmno?qrstuvwxyz";
-            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 15);
-            Assert.AreEqual(s52, eClip);
-            Assert.AreEqual("abcdefghijklmno?qrstuvwxyz", aClip);
-        }
-
-        [Test]
-        public void ClipExpectedAndActual_StringTailsFitInLine()
-        {
-            string s1 = s52;
-            string s2 = s52.Replace('Z', '?');
-            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 51);
-            Assert.AreEqual("...ABCDEFGHIJKLMNOPQRSTUVWXYZ", s1);
-        }
-
-        [Test]
-        public void ClipExpectedAndActual_StringsDoNotFitInLine()
-        {
-            string s1 = s52;
-            string s2 = "abcdefghij";
-            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 10);
-            Assert.AreEqual("abcdefghijklmnopqrstuvwxyz...", s1);
-            Assert.AreEqual("abcdefghij", s2);
-
-            s1 = s52;
-            s2 = "abcdefghijklmno?qrstuvwxyz";
-            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 25, 15);
-            Assert.AreEqual("...efghijklmnopqrstuvw...", s1);
-            Assert.AreEqual("...efghijklmno?qrstuvwxyz", s2);
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+	/// <summary>
+	/// Summary description for MsgUtilTests.
+	/// </summary>
+	[TestFixture]
+	public class MsgUtilTests
+	{
+        [TestCase("\n", "\\n")]
+        [TestCase("\n\n", "\\n\\n")]
+        [TestCase("\n\n\n", "\\n\\n\\n")]
+        [TestCase("\r", "\\r")]
+        [TestCase("\r\r", "\\r\\r")]
+        [TestCase("\r\r\r", "\\r\\r\\r")]
+        [TestCase("\r\n", "\\r\\n")]
+        [TestCase("\n\r", "\\n\\r")]
+        [TestCase("This is a\rtest message", "This is a\\rtest message")]
+        [TestCase("", "")]
+#if CLR_2_0 || CLR_4_0
+        [TestCase(null, null)]
+#endif
+        [TestCase("\t", "\\t")]
+        [TestCase("\t\n", "\\t\\n")]
+        [TestCase("\\r\\n", "\\\\r\\\\n")]
+        // TODO: Figure out why this fails in Mono
+        // TODO: Need Platform property on test case
+        //[TestCase("\0", "\\0")]
+        [TestCase("\a", "\\a")]
+        [TestCase("\b", "\\b")]
+        [TestCase("\f", "\\f")]
+        [TestCase("\v", "\\v")]
+        // New Line
+        [TestCase("\x0085", "\\x0085", Description = "Next line character")]
+        [TestCase("\x2028", "\\x2028", Description = "Line separator character")]
+        [TestCase("\x2029", "\\x2029", Description = "Paragraph separator character")]
+        public void EscapeControlCharsTest(string input, string expected)
+		{
+            Assert.AreEqual( expected, MsgUtils.EscapeControlChars(input) );
+		}
+
+#if MONO
+        [Test]
+        public void EscapeNullCharInString()
+        {
+            Assert.That(MsgUtils.EscapeControlChars("\0"), Is.EqualTo("\\0"));
+        }
+#endif
+
+        private const string s52 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+        [TestCase(s52, 52, 0, s52, TestName="NoClippingNeeded")]
+        [TestCase(s52, 29, 0, "abcdefghijklmnopqrstuvwxyz...", TestName="ClipAtEnd")]
+        [TestCase(s52, 29, 26, "...ABCDEFGHIJKLMNOPQRSTUVWXYZ", TestName="ClipAtStart")]
+        [TestCase(s52, 28, 26, "...ABCDEFGHIJKLMNOPQRSTUV...", TestName="ClipAtStartAndEnd")]
+        public void TestClipString(string input, int max, int start, string result)
+        {
+            Assert.AreEqual(result, MsgUtils.ClipString(input, max, start));
+        }
+
+        //[TestCase('\0')]
+        //[TestCase('\r')]
+        //public void CharacterArgumentTest(char c)
+        //{
+        //}
+
+        [Test]
+        public void ClipExpectedAndActual_StringsFitInLine()
+        {
+            string eClip = s52;
+            string aClip = "abcde";
+            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 5);
+            Assert.AreEqual(s52, eClip);
+            Assert.AreEqual("abcde", aClip);
+
+            eClip = s52;
+            aClip = "abcdefghijklmno?qrstuvwxyz";
+            MsgUtils.ClipExpectedAndActual(ref eClip, ref aClip, 52, 15);
+            Assert.AreEqual(s52, eClip);
+            Assert.AreEqual("abcdefghijklmno?qrstuvwxyz", aClip);
+        }
+
+        [Test]
+        public void ClipExpectedAndActual_StringTailsFitInLine()
+        {
+            string s1 = s52;
+            string s2 = s52.Replace('Z', '?');
+            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 51);
+            Assert.AreEqual("...ABCDEFGHIJKLMNOPQRSTUVWXYZ", s1);
+        }
+
+        [Test]
+        public void ClipExpectedAndActual_StringsDoNotFitInLine()
+        {
+            string s1 = s52;
+            string s2 = "abcdefghij";
+            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 29, 10);
+            Assert.AreEqual("abcdefghijklmnopqrstuvwxyz...", s1);
+            Assert.AreEqual("abcdefghij", s2);
+
+            s1 = s52;
+            s2 = "abcdefghijklmno?qrstuvwxyz";
+            MsgUtils.ClipExpectedAndActual(ref s1, ref s2, 25, 15);
+            Assert.AreEqual("...efghijklmnopqrstuvw...", s1);
+            Assert.AreEqual("...efghijklmno?qrstuvwxyz", s2);
+        }
+	}
+}
diff --git a/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs b/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs
index 132c40b..4c173c4 100644
--- a/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs
+++ b/src/NUnitFramework/tests/Constraints/NUnitEqualityComparerTests.cs
@@ -5,6 +5,10 @@
 // ****************************************************************
 
 using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
 
 namespace NUnit.Framework.Constraints
 {
@@ -32,10 +36,43 @@ namespace NUnit.Framework.Constraints
 
 #if CLR_2_0 || CLR_4_0
         [Test]
+        public void SelfContainingRecursiveEnumerablesAreNotEqual()
+        {
+            var a1 = new object[1];
+            var a2 = new object[1];
+			a1[0] = a1;
+			a2[0] = a2;
+
+            Assert.False(comparer.AreEqual(a1, a2, ref tolerance));
+        }
+
+        [Test]
+        public void CrossReferencingRecursiveEnumerablesAreNotEqual()
+        {
+            var a1 = new object[1];
+            var a2 = new object[1];
+            a1[0] = a2;
+            a2[0] = a1;
+
+            Assert.False(comparer.AreEqual(a1, a2, ref tolerance));
+        }
+
+		[Test]
+		public void RecursionCheckDoesNotRelyOnValueEquality()
+		{
+			var a1 = new StructEnumerable<int>[2];
+			var a2 = new StructEnumerable<int>[2];
+
+			a1[0] = a2[0] = a1[1] = a2[1] = new StructEnumerable<int>(1);
+
+			Assert.True(comparer.AreEqual(a1, a2, ref tolerance));
+		}
+
+        [Test]
         public void IEquatableSuccess()
         {
-            IEquatableWithoutEqualsOverridden x = new IEquatableWithoutEqualsOverridden(1);
-            IEquatableWithoutEqualsOverridden y = new IEquatableWithoutEqualsOverridden(1);
+            var x = new IEquatableWithoutEqualsOverridden(1);
+            var y = new IEquatableWithoutEqualsOverridden(1);
 
             Assert.IsTrue(comparer.AreEqual(x, y, ref tolerance));
         }
@@ -43,8 +80,8 @@ namespace NUnit.Framework.Constraints
         [Test]
         public void IEquatableDifferentTypesSuccess_WhenActualImplementsIEquatable()
         {
-            int x = 1;
-            Int32IEquatable y = new Int32IEquatable(1);
+            var x = 1;
+            var y = new Int32IEquatable(1);
 
             // y.Equals(x) is what gets actually called
             // TODO: This should work both ways
@@ -54,8 +91,8 @@ namespace NUnit.Framework.Constraints
         [Test]
         public void IEquatableDifferentTypesSuccess_WhenExpectedImplementsIEquatable()
         {
-            int x = 1;
-            Int32IEquatable y = new Int32IEquatable(1);
+            var x = 1;
+            var y = new Int32IEquatable(1);
 
             // y.Equals(x) is what gets actually called
             // TODO: This should work both ways
@@ -65,7 +102,7 @@ namespace NUnit.Framework.Constraints
         [Test]
         public void ReferenceEqualityHasPrecedenceOverIEquatable()
         {
-            NeverEqualIEquatable z = new NeverEqualIEquatable();
+            var z = new NeverEqualIEquatable();
 
             Assert.IsTrue(comparer.AreEqual(z, z, ref tolerance));
         }
@@ -73,8 +110,8 @@ namespace NUnit.Framework.Constraints
         [Test]
         public void IEquatableHasPrecedenceOverDefaultEquals()
         {
-            NeverEqualIEquatableWithOverriddenAlwaysTrueEquals x = new NeverEqualIEquatableWithOverriddenAlwaysTrueEquals();
-            NeverEqualIEquatableWithOverriddenAlwaysTrueEquals y = new NeverEqualIEquatableWithOverriddenAlwaysTrueEquals();
+            var x = new NeverEqualIEquatableWithOverriddenAlwaysTrueEquals();
+            var y = new NeverEqualIEquatableWithOverriddenAlwaysTrueEquals();
 
             Assert.IsFalse(comparer.AreEqual(x, y, ref tolerance));
         }
@@ -137,5 +174,25 @@ namespace NUnit.Framework.Constraints
             return value.Equals(other.value);
         }
     }
+
+	struct StructEnumerable<T> : IEnumerable<T>
+	{
+		public readonly T Value;
+
+		public StructEnumerable(T value)
+		{
+			Value = value;
+		}
+
+		public IEnumerator<T> GetEnumerator()
+		{
+			yield return Value;
+		}
+
+		IEnumerator IEnumerable.GetEnumerator()
+		{
+			return GetEnumerator();
+		}
+	}
 #endif
 }
diff --git a/src/NUnitFramework/tests/Constraints/NotTest.cs b/src/NUnitFramework/tests/Constraints/NotTest.cs
deleted file mode 100644
index 377cf7a..0000000
--- a/src/NUnitFramework/tests/Constraints/NotTest.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 NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class NotTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new NotConstraint( new EqualConstraint(null) );
-            expectedDescription = "not null";
-            stringRepresentation = "<not <equal null>>";
-        }
-
-        internal object[] SuccessData = new object[] { 42, "Hello" };
-            
-        internal object[] FailureData = new object [] { null };
-
-        internal string[] ActualValues = new string[] { "null" };
-
-        [Test, ExpectedException(typeof(AssertionException), ExpectedMessage = "ignoring case", MatchType = MessageMatch.Contains)]
-        public void NotHonorsIgnoreCaseUsingConstructors()
-        {
-            Assert.That("abc", new NotConstraint(new EqualConstraint("ABC").IgnoreCase));
-        }
-
-        [Test,ExpectedException(typeof(AssertionException),ExpectedMessage="ignoring case",MatchType=MessageMatch.Contains)]
-        public void NotHonorsIgnoreCaseUsingPrefixNotation()
-        {
-            Assert.That( "abc", Is.Not.EqualTo( "ABC" ).IgnoreCase );
-        }
-
-        [Test,ExpectedException(typeof(AssertionException),ExpectedMessage="+/-",MatchType=MessageMatch.Contains)]
-        public void NotHonorsTolerance()
-        {
-            Assert.That( 4.99d, Is.Not.EqualTo( 5.0d ).Within( .05d ) );
-        }
-
-        [Test]
-        public void CanUseNotOperator()
-        {
-            Assert.That(42, !new EqualConstraint(99));
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/NumericsTest.cs b/src/NUnitFramework/tests/Constraints/NumericsTest.cs
index a859f38..a96c090 100644
--- a/src/NUnitFramework/tests/Constraints/NumericsTest.cs
+++ b/src/NUnitFramework/tests/Constraints/NumericsTest.cs
@@ -1,95 +1,95 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class NumericsTest
-    {
-        private Tolerance tenPercent, zeroTolerance;
-
-        [SetUp]
-        public void SetUp()
-        {
-            tenPercent = new Tolerance(10.0).Percent;
-            zeroTolerance = new Tolerance(0);
-        }
-
-        [TestCase(123456789)]
-        [TestCase(123456789U)]
-        [TestCase(123456789L)]
-        [TestCase(123456789UL)]
-        [TestCase(1234.5678f)]
-        [TestCase(1234.5678)]
-        [Test]
-        public void CanMatchWithoutToleranceMode(object value)
-        {
-            Assert.IsTrue(Numerics.AreEqual(value, value, ref zeroTolerance));
-        }
-
-        // Separate test case because you can't use decimal in an attribute (24.1.3)
-        [Test]
-        public void CanMatchDecimalWithoutToleranceMode()
-        {
-            Assert.IsTrue(Numerics.AreEqual(123m, 123m, ref zeroTolerance));
-        }
-
-        [TestCase((int)9500)]
-        [TestCase((int)10000)]
-        [TestCase((int)10500)]
-        [TestCase((uint)9500)]
-        [TestCase((uint)10000)]
-        [TestCase((uint)10500)]
-        [TestCase((long)9500)]
-        [TestCase((long)10000)]
-        [TestCase((long)10500)]
-        [TestCase((ulong)9500)]
-        [TestCase((ulong)10000)]
-        [TestCase((ulong)10500)]
-        [Test]
-        public void CanMatchIntegralsWithPercentage(object value)
-        {
-            Assert.IsTrue(Numerics.AreEqual(10000, value, ref tenPercent));
-        }
-
-        [Test]
-        public void CanMatchDecimalWithPercentage()
-        {
-            Assert.IsTrue(Numerics.AreEqual(10000m, 9500m, ref tenPercent));
-            Assert.IsTrue(Numerics.AreEqual(10000m, 10000m, ref tenPercent));
-            Assert.IsTrue(Numerics.AreEqual(10000m, 10500m, ref tenPercent));
-        }
-
-        [TestCase((int)8500)]
-        [TestCase((int)11500)]
-        [TestCase((uint)8500)]
-        [TestCase((uint)11500)]
-        [TestCase((long)8500)]
-        [TestCase((long)11500)]
-        [TestCase((ulong)8500)]
-        [TestCase((ulong)11500)]
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailsOnIntegralsOutsideOfPercentage(object value)
-        {
-            Assert.IsTrue(Numerics.AreEqual(10000, value, ref tenPercent));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailsOnDecimalBelowPercentage()
-        {
-            Assert.IsTrue(Numerics.AreEqual(10000m, 8500m, ref tenPercent));
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void FailsOnDecimalAbovePercentage()
-        {
-            Assert.IsTrue(Numerics.AreEqual(10000m, 11500m, ref tenPercent));
-        }
-    }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class NumericsTest
+    {
+        private Tolerance tenPercent, zeroTolerance;
+
+        [SetUp]
+        public void SetUp()
+        {
+            tenPercent = new Tolerance(10.0).Percent;
+            zeroTolerance = new Tolerance(0);
+        }
+
+        [TestCase(123456789)]
+        [TestCase(123456789U)]
+        [TestCase(123456789L)]
+        [TestCase(123456789UL)]
+        [TestCase(1234.5678f)]
+        [TestCase(1234.5678)]
+        [Test]
+        public void CanMatchWithoutToleranceMode(object value)
+        {
+            Assert.IsTrue(Numerics.AreEqual(value, value, ref zeroTolerance));
+        }
+
+        // Separate test case because you can't use decimal in an attribute (24.1.3)
+        [Test]
+        public void CanMatchDecimalWithoutToleranceMode()
+        {
+            Assert.IsTrue(Numerics.AreEqual(123m, 123m, ref zeroTolerance));
+        }
+
+        [TestCase((int)9500)]
+        [TestCase((int)10000)]
+        [TestCase((int)10500)]
+        [TestCase((uint)9500)]
+        [TestCase((uint)10000)]
+        [TestCase((uint)10500)]
+        [TestCase((long)9500)]
+        [TestCase((long)10000)]
+        [TestCase((long)10500)]
+        [TestCase((ulong)9500)]
+        [TestCase((ulong)10000)]
+        [TestCase((ulong)10500)]
+        [Test]
+        public void CanMatchIntegralsWithPercentage(object value)
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000, value, ref tenPercent));
+        }
+
+        [Test]
+        public void CanMatchDecimalWithPercentage()
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000m, 9500m, ref tenPercent));
+            Assert.IsTrue(Numerics.AreEqual(10000m, 10000m, ref tenPercent));
+            Assert.IsTrue(Numerics.AreEqual(10000m, 10500m, ref tenPercent));
+        }
+
+        [TestCase((int)8500)]
+        [TestCase((int)11500)]
+        [TestCase((uint)8500)]
+        [TestCase((uint)11500)]
+        [TestCase((long)8500)]
+        [TestCase((long)11500)]
+        [TestCase((ulong)8500)]
+        [TestCase((ulong)11500)]
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailsOnIntegralsOutsideOfPercentage(object value)
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000, value, ref tenPercent));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailsOnDecimalBelowPercentage()
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000m, 8500m, ref tenPercent));
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void FailsOnDecimalAbovePercentage()
+        {
+            Assert.IsTrue(Numerics.AreEqual(10000m, 11500m, ref tenPercent));
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/OrTest.cs b/src/NUnitFramework/tests/Constraints/OrTest.cs
deleted file mode 100644
index 8f466ad..0000000
--- a/src/NUnitFramework/tests/Constraints/OrTest.cs
+++ /dev/null
@@ -1,32 +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.
-// ****************************************************************
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class OrTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new OrConstraint(new EqualConstraint(42), new EqualConstraint(99));
-            expectedDescription = "42 or 99";
-            stringRepresentation = "<or <equal 42> <equal 99>>";
-        }
-
-		internal object[] SuccessData = new object[] { 99, 42 };
-
-		internal object[] FailureData = new object[] { 37 };
-
-		internal string[] ActualValues = new string[] { "37" };
-
-		[Test]
-        public void CanCombineTestsWithOrOperator()
-        {
-            Assert.That(99, new EqualConstraint(42) | new EqualConstraint(99) );
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs b/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs
index 6712cec..a794fc9 100644
--- a/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/PathConstraintTests.cs
@@ -1,284 +1,288 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    /// <summary>
-    /// Summary description for PathConstraintTests.
-    /// </summary>]
-    [TestFixture]
-    public class SamePathTest_Windows : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SamePathConstraint( @"C:\folder1\file.tmp" ).IgnoreCase;
-            expectedDescription = @"Path matching ""C:\folder1\file.tmp""";
-            stringRepresentation = "<samepath \"C:\\folder1\\file.tmp\" ignorecase>";
-        }
-
-        internal object[] SuccessData = new object[] 
-            { 
-                @"C:\folder1\file.tmp", 
-                @"C:\Folder1\File.TMP",
-                @"C:\folder1\.\file.tmp",
-                @"C:\folder1\folder2\..\file.tmp",
-                @"C:\FOLDER1\.\folder2\..\File.TMP",
-                @"C:/folder1/file.tmp"
-            };
-        internal object[] FailureData = new object[] 
-            { 
-                123,
-                @"C:\folder2\file.tmp",
-                @"C:\folder1\.\folder2\..\file.temp"
-            };
-        internal string[] ActualValues = new string[] 
-            { 
-                "123",
-                "\"C:\\folder2\\file.tmp\"",
-                "\"C:\\folder1\\.\\folder2\\..\\file.temp\""
-            };
-		
-		[Test]
-		public void RootPathEquality()
-		{
-			Assert.That("c:\\", Is.SamePath("C:\\junk\\..\\").IgnoreCase);
-		}
-    }
-
-    [TestFixture]
-    public class SamePathTest_Linux : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SamePathConstraint(@"/folder1/file.tmp").RespectCase;
-            expectedDescription = @"Path matching ""/folder1/file.tmp""";
-            stringRepresentation = @"<samepath ""/folder1/file.tmp"" respectcase>";
-        }
-
-        internal object[] SuccessData = new object[] 
-            { 
-                @"/folder1/file.tmp", 
-                @"/folder1/./file.tmp",
-                @"/folder1/folder2/../file.tmp",
-                @"/folder1/./folder2/../file.tmp",
-                @"\folder1\file.tmp"
-            };
-        internal object[] FailureData = new object[] 
-            { 
-                123,
-                @"/folder2/file.tmp",
-                @"/folder1/./folder2/../file.temp",
-                @"/Folder1/File.TMP",
-                @"/FOLDER1/./folder2/../File.TMP",
-            };
-        internal string[] ActualValues = new string[] 
-            { 
-                "123",
-                "\"/folder2/file.tmp\"",
-                "\"/folder1/./folder2/../file.temp\"",
-                "\"/Folder1/File.TMP\"",
-                "\"/FOLDER1/./folder2/../File.TMP\"",
-            };
-
-		[Test]
-		public void RootPathEquality()
-		{
-			Assert.That("/", Is.SamePath("/junk/../"));
-		}
-	}
-
-    [TestFixture]
-    public class SubPathTest_Windows : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SubPathConstraint( @"C:\folder1\folder2" ).IgnoreCase;
-            expectedDescription = @"Path under ""C:\folder1\folder2""";
-            stringRepresentation = @"<subpath ""C:\folder1\folder2"" ignorecase>";
-        }
-
-        internal object[] SuccessData = new object[]
-            {
-                @"C:\folder1\folder2\folder3",
-                @"C:\folder1\.\folder2\folder3",
-                @"C:\folder1\junk\..\folder2\folder3",
-                @"C:\FOLDER1\.\junk\..\Folder2\temp\..\Folder3",
-                @"C:/folder1/folder2/folder3",
-            };
-        internal object[] FailureData = new object[]
-            {
-                123,
-                @"C:\folder1\folder3",
-                @"C:\folder1\.\folder2\..\file.temp",
-                @"C:\folder1\folder2",
-                @"C:\Folder1\Folder2",
-                @"C:\folder1\.\folder2",
-                @"C:\folder1\junk\..\folder2",
-                @"C:\FOLDER1\.\junk\..\Folder2",
-                @"C:/folder1/folder2"
-            };
-        internal string[] ActualValues = new string[]
-            {
-                "123",
-                "\"C:\\folder1\\folder3\"",
-                "\"C:\\folder1\\.\\folder2\\..\\file.temp\"",
-                "\"C:\\folder1\\folder2\"",
-                "\"C:\\Folder1\\Folder2\"",
-                "\"C:\\folder1\\.\\folder2\"",
-                "\"C:\\folder1\\junk\\..\\folder2\"",
-                "\"C:\\FOLDER1\\.\\junk\\..\\Folder2\"",
-                "\"C:/folder1/folder2\""
-            };
-		
-		[Test]
-		public void SubPathOfRoot()
-		{
-			Assert.That("C:\\junk\\file.temp", new SubPathConstraint("C:\\"));
-		}
-    }
-
-    [TestFixture]
-    public class SubPathTest_Linux : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SubPathConstraint( @"/folder1/folder2"  ).RespectCase;
-            expectedDescription = @"Path under ""/folder1/folder2""";
-            stringRepresentation = @"<subpath ""/folder1/folder2"" respectcase>";
-        }
-
-        internal object[] SuccessData = new object[]
-            {
-                @"/folder1/folder2/folder3",
-                @"/folder1/./folder2/folder3",
-                @"/folder1/junk/../folder2/folder3",
-                @"\folder1\folder2\folder3",
-            };
-        internal object[] FailureData = new object[]
-            {
-                123,
-                "/Folder1/Folder2",
-                "/FOLDER1/./junk/../Folder2",
-                "/FOLDER1/./junk/../Folder2/temp/../Folder3",
-                "/folder1/folder3",
-                "/folder1/./folder2/../folder3",
-				"/folder1",
-                "/folder1/folder2",
-                "/folder1/./folder2",
-                "/folder1/junk/../folder2",
-                @"\folder1\folder2"
-            };
-        internal string[] ActualValues = new string[]
-            {
-                "123",
-                "\"/Folder1/Folder2\"",
-                "\"/FOLDER1/./junk/../Folder2\"",
-                "\"/FOLDER1/./junk/../Folder2/temp/../Folder3\"",
-                "\"/folder1/folder3\"",
-                "\"/folder1/./folder2/../folder3\"",
-				"\"/folder1\"",
-                "\"/folder1/folder2\"",
-                "\"/folder1/./folder2\"",
-                "\"/folder1/junk/../folder2\"",
-                "\"\\folder1\\folder2\""
-            };
-
-		[Test]
-		public void SubPathOfRoot()
-		{
-			Assert.That("/junk/file.temp", new SubPathConstraint("/"));
-		}
-}
-	
-    [TestFixture]
-    public class SamePathOrUnderTest_Windows : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SamePathOrUnderConstraint( @"C:\folder1\folder2" ).IgnoreCase;
-            expectedDescription = @"Path under or matching ""C:\folder1\folder2""";
-            stringRepresentation = @"<samepathorunder ""C:\folder1\folder2"" ignorecase>";
-        }
-
-        internal object[] SuccessData = new object[]
-            {
-                @"C:\folder1\folder2",
-                @"C:\Folder1\Folder2",
-                @"C:\folder1\.\folder2",
-                @"C:\folder1\junk\..\folder2",
-                @"C:\FOLDER1\.\junk\..\Folder2",
-                @"C:/folder1/folder2",
-                @"C:\folder1\folder2\folder3",
-                @"C:\folder1\.\folder2\folder3",
-                @"C:\folder1\junk\..\folder2\folder3",
-                @"C:\FOLDER1\.\junk\..\Folder2\temp\..\Folder3",
-                @"C:/folder1/folder2/folder3",
-            };
-        internal object[] FailureData = new object[]
-            {
-                123,
-                @"C:\folder1\folder3",
-                @"C:\folder1\.\folder2\..\file.temp"
-            };
-        internal string[] ActualValues = new string[]
-            {
-                "123",
-                "\"C:\\folder1\\folder3\"",
-                "\"C:\\folder1\\.\\folder2\\..\\file.temp\""
-            };
-    }
-
-    [TestFixture]
-    public class SamePathOrUnderTest_Linux : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SamePathOrUnderConstraint( @"/folder1/folder2"  ).RespectCase;
-            expectedDescription = @"Path under or matching ""/folder1/folder2""";
-            stringRepresentation = @"<samepathorunder ""/folder1/folder2"" respectcase>";
-        }
-
-        internal object[] SuccessData = new object[]
-            {
-                @"/folder1/folder2",
-                @"/folder1/./folder2",
-                @"/folder1/junk/../folder2",
-                @"\folder1\folder2",
-                @"/folder1/folder2/folder3",
-                @"/folder1/./folder2/folder3",
-                @"/folder1/junk/../folder2/folder3",
-                @"\folder1\folder2\folder3",
-            };
-        internal object[] FailureData = new object[]
-            {
-                123,
-                "/Folder1/Folder2",
-                "/FOLDER1/./junk/../Folder2",
-                "/FOLDER1/./junk/../Folder2/temp/../Folder3",
-                "/folder1/folder3",
-                "/folder1/./folder2/../folder3",
-				"/folder1"
-            };
-        internal string[] ActualValues = new string[]
-            {
-                "123",
-                "\"/Folder1/Folder2\"",
-                "\"/FOLDER1/./junk/../Folder2\"",
-                "\"/FOLDER1/./junk/../Folder2/temp/../Folder3\"",
-                "\"/folder1/folder3\"",
-                "\"/folder1/./folder2/../folder3\"",
-				"\"/folder1\""
-            };
-    }
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    /// <summary>
+    /// Summary description for PathConstraintTests.
+    /// </summary>]
+    [TestFixture]
+    public class SamePathTest_Windows : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathConstraint( @"C:\folder1\file.tmp" ).IgnoreCase;
+            expectedDescription = @"Path matching ""C:\folder1\file.tmp""";
+            stringRepresentation = "<samepath \"C:\\folder1\\file.tmp\" ignorecase>";
+        }
+
+        internal object[] SuccessData = new object[] 
+            { 
+                @"C:\folder1\file.tmp", 
+                @"C:\Folder1\File.TMP",
+                @"C:\folder1\.\file.tmp",
+                @"C:\folder1\folder2\..\file.tmp",
+                @"C:\FOLDER1\.\folder2\..\File.TMP",
+                @"C:/folder1/file.tmp"
+            };
+        internal object[] FailureData = new object[] 
+            { 
+                123,
+                @"C:\folder2\file.tmp",
+                @"C:\folder1\.\folder2\..\file.temp"
+            };
+        internal string[] ActualValues = new string[] 
+            { 
+                "123",
+                "\"C:\\folder2\\file.tmp\"",
+                "\"C:\\folder1\\.\\folder2\\..\\file.temp\""
+            };
+		
+		[Test]
+		public void RootPathEquality()
+		{
+			Assert.That("c:\\", Is.SamePath("C:\\junk\\..\\").IgnoreCase);
+		}
+    }
+
+    [TestFixture]
+    public class SamePathTest_Linux : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathConstraint(@"/folder1/file.tmp").RespectCase;
+            expectedDescription = @"Path matching ""/folder1/file.tmp""";
+            stringRepresentation = @"<samepath ""/folder1/file.tmp"" respectcase>";
+        }
+
+        internal object[] SuccessData = new object[] 
+            { 
+                @"/folder1/file.tmp", 
+                @"/folder1/./file.tmp",
+                @"/folder1/folder2/../file.tmp",
+                @"/folder1/./folder2/../file.tmp",
+                @"\folder1\file.tmp"
+            };
+        internal object[] FailureData = new object[] 
+            { 
+                123,
+                @"/folder2/file.tmp",
+                @"folder1/file.tmp",
+                @"//folder1/file.tmp",
+                @"/folder1/./folder2/../file.temp",
+                @"/Folder1/File.TMP",
+                @"/FOLDER1/./folder2/../File.TMP",
+            };
+        internal string[] ActualValues = new string[] 
+            { 
+                "123",
+                "\"/folder2/file.tmp\"",
+                "\"folder1/file.tmp\"",
+                "\"//folder1/file.tmp\"",
+                "\"/folder1/./folder2/../file.temp\"",
+                "\"/Folder1/File.TMP\"",
+                "\"/FOLDER1/./folder2/../File.TMP\"",
+            };
+
+		[Test]
+		public void RootPathEquality()
+		{
+			Assert.That("/", Is.SamePath("/junk/../"));
+		}
+	}
+
+    [TestFixture]
+    public class SubPathTest_Windows : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SubPathConstraint( @"C:\folder1\folder2" ).IgnoreCase;
+            expectedDescription = @"Path under ""C:\folder1\folder2""";
+            stringRepresentation = @"<subpath ""C:\folder1\folder2"" ignorecase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"C:\folder1\folder2\folder3",
+                @"C:\folder1\.\folder2\folder3",
+                @"C:\folder1\junk\..\folder2\folder3",
+                @"C:\FOLDER1\.\junk\..\Folder2\temp\..\Folder3",
+                @"C:/folder1/folder2/folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                @"C:\folder1\folder3",
+                @"C:\folder1\.\folder2\..\file.temp",
+                @"C:\folder1\folder2",
+                @"C:\Folder1\Folder2",
+                @"C:\folder1\.\folder2",
+                @"C:\folder1\junk\..\folder2",
+                @"C:\FOLDER1\.\junk\..\Folder2",
+                @"C:/folder1/folder2"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"C:\\folder1\\folder3\"",
+                "\"C:\\folder1\\.\\folder2\\..\\file.temp\"",
+                "\"C:\\folder1\\folder2\"",
+                "\"C:\\Folder1\\Folder2\"",
+                "\"C:\\folder1\\.\\folder2\"",
+                "\"C:\\folder1\\junk\\..\\folder2\"",
+                "\"C:\\FOLDER1\\.\\junk\\..\\Folder2\"",
+                "\"C:/folder1/folder2\""
+            };
+		
+		[Test]
+		public void SubPathOfRoot()
+		{
+			Assert.That("C:\\junk\\file.temp", new SubPathConstraint("C:\\"));
+		}
+    }
+
+    [TestFixture]
+    public class SubPathTest_Linux : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SubPathConstraint( @"/folder1/folder2"  ).RespectCase;
+            expectedDescription = @"Path under ""/folder1/folder2""";
+            stringRepresentation = @"<subpath ""/folder1/folder2"" respectcase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"/folder1/folder2/folder3",
+                @"/folder1/./folder2/folder3",
+                @"/folder1/junk/../folder2/folder3",
+                @"\folder1\folder2\folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                "/Folder1/Folder2",
+                "/FOLDER1/./junk/../Folder2",
+                "/FOLDER1/./junk/../Folder2/temp/../Folder3",
+                "/folder1/folder3",
+                "/folder1/./folder2/../folder3",
+				"/folder1",
+                "/folder1/folder2",
+                "/folder1/./folder2",
+                "/folder1/junk/../folder2",
+                @"\folder1\folder2"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"/Folder1/Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2/temp/../Folder3\"",
+                "\"/folder1/folder3\"",
+                "\"/folder1/./folder2/../folder3\"",
+				"\"/folder1\"",
+                "\"/folder1/folder2\"",
+                "\"/folder1/./folder2\"",
+                "\"/folder1/junk/../folder2\"",
+                "\"\\folder1\\folder2\""
+            };
+
+		[Test]
+		public void SubPathOfRoot()
+		{
+			Assert.That("/junk/file.temp", new SubPathConstraint("/"));
+		}
+}
+	
+    [TestFixture]
+    public class SamePathOrUnderTest_Windows : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathOrUnderConstraint( @"C:\folder1\folder2" ).IgnoreCase;
+            expectedDescription = @"Path under or matching ""C:\folder1\folder2""";
+            stringRepresentation = @"<samepathorunder ""C:\folder1\folder2"" ignorecase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"C:\folder1\folder2",
+                @"C:\Folder1\Folder2",
+                @"C:\folder1\.\folder2",
+                @"C:\folder1\junk\..\folder2",
+                @"C:\FOLDER1\.\junk\..\Folder2",
+                @"C:/folder1/folder2",
+                @"C:\folder1\folder2\folder3",
+                @"C:\folder1\.\folder2\folder3",
+                @"C:\folder1\junk\..\folder2\folder3",
+                @"C:\FOLDER1\.\junk\..\Folder2\temp\..\Folder3",
+                @"C:/folder1/folder2/folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                @"C:\folder1\folder3",
+                @"C:\folder1\.\folder2\..\file.temp"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"C:\\folder1\\folder3\"",
+                "\"C:\\folder1\\.\\folder2\\..\\file.temp\""
+            };
+    }
+
+    [TestFixture]
+    public class SamePathOrUnderTest_Linux : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SamePathOrUnderConstraint( @"/folder1/folder2"  ).RespectCase;
+            expectedDescription = @"Path under or matching ""/folder1/folder2""";
+            stringRepresentation = @"<samepathorunder ""/folder1/folder2"" respectcase>";
+        }
+
+        internal object[] SuccessData = new object[]
+            {
+                @"/folder1/folder2",
+                @"/folder1/./folder2",
+                @"/folder1/junk/../folder2",
+                @"\folder1\folder2",
+                @"/folder1/folder2/folder3",
+                @"/folder1/./folder2/folder3",
+                @"/folder1/junk/../folder2/folder3",
+                @"\folder1\folder2\folder3",
+            };
+        internal object[] FailureData = new object[]
+            {
+                123,
+                "/Folder1/Folder2",
+                "/FOLDER1/./junk/../Folder2",
+                "/FOLDER1/./junk/../Folder2/temp/../Folder3",
+                "/folder1/folder3",
+                "/folder1/./folder2/../folder3",
+				"/folder1"
+            };
+        internal string[] ActualValues = new string[]
+            {
+                "123",
+                "\"/Folder1/Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2\"",
+                "\"/FOLDER1/./junk/../Folder2/temp/../Folder3\"",
+                "\"/folder1/folder3\"",
+                "\"/folder1/./folder2/../folder3\"",
+				"\"/folder1\""
+            };
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/PredicateConstraintTests.cs b/src/NUnitFramework/tests/Constraints/PredicateConstraintTests.cs
new file mode 100644
index 0000000..fb62e8f
--- /dev/null
+++ b/src/NUnitFramework/tests/Constraints/PredicateConstraintTests.cs
@@ -0,0 +1,39 @@
+// ****************************************************************
+// 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.Constraints
+{
+    [TestFixture]
+    public class PredicateConstraintTests : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new PredicateConstraint<int>((x) => x < 5 );
+            expectedDescription = @"value matching lambda expression";
+            stringRepresentation = "<predicate>";
+        }
+
+        internal object[] SuccessData = new object[] 
+        {
+            0,
+            -5
+        };
+
+        internal object[] FailureData = new object[]
+        {
+            123
+        };
+        internal string[] ActualValues = new string[]
+        {
+            "123"
+        };
+    }
+}
+#endif
diff --git a/src/NUnitFramework/tests/Constraints/PropertyTests.cs b/src/NUnitFramework/tests/Constraints/PropertyTests.cs
index cd49ba8..1d449cc 100644
--- a/src/NUnitFramework/tests/Constraints/PropertyTests.cs
+++ b/src/NUnitFramework/tests/Constraints/PropertyTests.cs
@@ -1,70 +1,70 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    public class PropertyExistsTest : ConstraintTestBaseWithExceptionTests
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new PropertyExistsConstraint("Length");
-            expectedDescription = "property Length";
-            stringRepresentation = "<propertyexists Length>";
-        }
-
-        internal static object[] SuccessData = new object[] { new int[0], "hello", typeof(Array) };
-
-        internal static object[] FailureData = new object[] { 42, new System.Collections.ArrayList(), typeof(Int32) };
-
-        internal static string[] ActualValues = new string[] { "<System.Int32>", "<System.Collections.ArrayList>", "<System.Int32>" };
-
-        internal static object[] InvalidData = new TestCaseData[] 
-        { 
-            new TestCaseData(null).Throws(typeof(ArgumentNullException))
-        };
-    }
-
-    public class PropertyTest : ConstraintTestBaseWithExceptionTests
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new PropertyConstraint("Length", new EqualConstraint(5));
-            expectedDescription = "property Length equal to 5";
-            stringRepresentation = "<property Length <equal 5>>";
-        }
-
-        internal static object[] SuccessData = new object[] { new int[5], "hello" };
-
-        internal static object[] FailureData = new object[] { new int[3], "goodbye" };
-
-        internal static string[] ActualValues = new string[] { "3", "7" };
-
-        internal static object[] InvalidData = new object[] 
-        { 
-            new TestCaseData(null).Throws(typeof(ArgumentNullException)),
-            new TestCaseData(42).Throws(typeof(ArgumentException)), 
-            new TestCaseData(new System.Collections.ArrayList()).Throws(typeof(ArgumentException))
-        };
-
-        [Test]
-        public void PropertyEqualToValueWithTolerance()
-        {
-            Constraint c = new EqualConstraint(105m).Within(0.1m);
-            TextMessageWriter w = new TextMessageWriter();
-            c.WriteDescriptionTo(w);
-            Assert.That(w.ToString(), Is.EqualTo("105m +/- 0.1m"));
-
-            c = new PropertyConstraint("D", new EqualConstraint(105m).Within(0.1m));
-            w = new TextMessageWriter();
-            c.WriteDescriptionTo(w);
-            Assert.That(w.ToString(), Is.EqualTo("property D equal to 105m +/- 0.1m"));
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    public class PropertyExistsTest : ConstraintTestBaseWithExceptionTests
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new PropertyExistsConstraint("Length");
+            expectedDescription = "property Length";
+            stringRepresentation = "<propertyexists Length>";
+        }
+
+        internal static object[] SuccessData = new object[] { new int[0], "hello", typeof(Array) };
+
+        internal static object[] FailureData = new object[] { 42, new System.Collections.ArrayList(), typeof(Int32) };
+
+        internal static string[] ActualValues = new string[] { "<System.Int32>", "<System.Collections.ArrayList>", "<System.Int32>" };
+
+        internal static object[] InvalidData = new TestCaseData[] 
+        { 
+            new TestCaseData(null).Throws(typeof(ArgumentNullException))
+        };
+    }
+
+    public class PropertyTest : ConstraintTestBaseWithExceptionTests
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new PropertyConstraint("Length", new EqualConstraint(5));
+            expectedDescription = "property Length equal to 5";
+            stringRepresentation = "<property Length <equal 5>>";
+        }
+
+        internal static object[] SuccessData = new object[] { new int[5], "hello" };
+
+        internal static object[] FailureData = new object[] { new int[3], "goodbye" };
+
+        internal static string[] ActualValues = new string[] { "3", "7" };
+
+        internal static object[] InvalidData = new object[] 
+        { 
+            new TestCaseData(null).Throws(typeof(ArgumentNullException)),
+            new TestCaseData(42).Throws(typeof(ArgumentException)), 
+            new TestCaseData(new System.Collections.ArrayList()).Throws(typeof(ArgumentException))
+        };
+
+        [Test]
+        public void PropertyEqualToValueWithTolerance()
+        {
+            Constraint c = new EqualConstraint(105m).Within(0.1m);
+            TextMessageWriter w = new TextMessageWriter();
+            c.WriteDescriptionTo(w);
+            Assert.That(w.ToString(), Is.EqualTo("105m +/- 0.1m"));
+
+            c = new PropertyConstraint("D", new EqualConstraint(105m).Within(0.1m));
+            w = new TextMessageWriter();
+            c.WriteDescriptionTo(w);
+            Assert.That(w.ToString(), Is.EqualTo("property D equal to 105m +/- 0.1m"));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
index db87d69..209a840 100644
--- a/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ReusableConstraintTests.cs
@@ -1,45 +1,45 @@
-// ****************************************************************
-// 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
-{
-    [TestFixture]
-    public class ReusableConstraintTests
-    {
-        [Datapoints]
-        internal static readonly ReusableConstraint[] constraints = new ReusableConstraint[] {
-            Is.Not.Empty,
-            Is.Not.Null,
-            Has.Length.GreaterThan(3),
-            Has.Property("Length").EqualTo(4).And.StartsWith("te")
-        };
-
-        [Theory]
-        public void CanReuseReusableConstraintMultipleTimes(ReusableConstraint c)
-        {
-            string s = "test";
-
-            Assume.That(s, c);
-
-            Assert.That(s, c, "Should pass first time");
-            Assert.That(s, c, "Should pass second time");
-            Assert.That(s, c, "Should pass third time");
-        }
-
-        [Test]
-        public void CanCreateReusableConstraintByImplicitConversion()
-        {
-            ReusableConstraint c = Is.Not.Null;
-
-            string s = "test";
-            Assert.That(s, c, "Should pass first time");
-            Assert.That(s, c, "Should pass second time");
-            Assert.That(s, c, "Should pass third time");
-        }
-    }
-}
+// ****************************************************************
+// 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
+{
+    [TestFixture]
+    public class ReusableConstraintTests
+    {
+        [Datapoints]
+        internal static readonly ReusableConstraint[] constraints = new ReusableConstraint[] {
+            Is.Not.Empty,
+            Is.Not.Null,
+            Has.Length.GreaterThan(3),
+            Has.Property("Length").EqualTo(4).And.StartsWith("te")
+        };
+
+        [Theory]
+        public void CanReuseReusableConstraintMultipleTimes(ReusableConstraint c)
+        {
+            string s = "test";
+
+            Assume.That(s, c);
+
+            Assert.That(s, c, "Should pass first time");
+            Assert.That(s, c, "Should pass second time");
+            Assert.That(s, c, "Should pass third time");
+        }
+
+        [Test]
+        public void CanCreateReusableConstraintByImplicitConversion()
+        {
+            ReusableConstraint c = Is.Not.Null;
+
+            string s = "test";
+            Assert.That(s, c, "Should pass first time");
+            Assert.That(s, c, "Should pass second time");
+            Assert.That(s, c, "Should pass third time");
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/SameAsTest.cs b/src/NUnitFramework/tests/Constraints/SameAsTest.cs
index c72b38d..cee0a1e 100644
--- a/src/NUnitFramework/tests/Constraints/SameAsTest.cs
+++ b/src/NUnitFramework/tests/Constraints/SameAsTest.cs
@@ -1,29 +1,29 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class SameAsTest : ConstraintTestBase
-    {
-        private static readonly object obj1 = new object();
-        private static readonly object obj2 = new object();
-
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SameAsConstraint(obj1);
-            expectedDescription = "same as <System.Object>";
-            stringRepresentation = "<sameas System.Object>";
-        }
-
-        internal static object[] SuccessData = new object[] { obj1 };
-
-        internal static object[] FailureData = new object[] { obj2, 3, "Hello" };
-
-        internal static string[] ActualValues = new string[] { "<System.Object>", "3", "\"Hello\"" };
-    }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class SameAsTest : ConstraintTestBase
+    {
+        private static readonly object obj1 = new object();
+        private static readonly object obj2 = new object();
+
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new SameAsConstraint(obj1);
+            expectedDescription = "same as <System.Object>";
+            stringRepresentation = "<sameas System.Object>";
+        }
+
+        internal static object[] SuccessData = new object[] { obj1 };
+
+        internal static object[] FailureData = new object[] { obj2, 3, "Hello" };
+
+        internal static string[] ActualValues = new string[] { "<System.Object>", "3", "\"Hello\"" };
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs b/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
deleted file mode 100644
index 59f2ac9..0000000
--- a/src/NUnitFramework/tests/Constraints/SerializableConstraintTest.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class BinarySerializableTest : ConstraintTestBaseWithArgumentException
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new BinarySerializableConstraint();
-            expectedDescription = "binary serializable";
-            stringRepresentation = "<binaryserializable>";
-        }
-
-        internal object[] SuccessData = new object[] { 1, "a", new ArrayList(), new InternalWithSerializableAttributeClass() };
-        
-        internal object[] FailureData = new object[] { new InternalClass() };
-
-        internal string[] ActualValues = new string[] { "<InternalClass>" }; 
-
-        internal object[] InvalidData = new object[] { null };
-    }
-
-    [TestFixture]
-    public class XmlSerializableTest : ConstraintTestBaseWithArgumentException
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new XmlSerializableConstraint();
-            expectedDescription = "xml serializable";
-            stringRepresentation = "<xmlserializable>";
-        }
-
-        internal object[] SuccessData = new object[] { 1, "a", new ArrayList() };
-
-#if 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() };
-		internal string[] ActualValues = new string[] { "<InternalClass>", "<InternalWithSerializableAttributeClass>" };
-#endif
-
-
-        internal object[] InvalidData = new object[] { null };
-    }
-
-    internal class InternalClass
-    {}
-
-    [Serializable]
-    internal class InternalWithSerializableAttributeClass
-    {}
-}
diff --git a/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs b/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs
deleted file mode 100644
index da3218d..0000000
--- a/src/NUnitFramework/tests/Constraints/StringConstraintTests.cs
+++ /dev/null
@@ -1,142 +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.Framework.Constraints
-{
-    [TestFixture]
-    public class SubstringTest : ConstraintTestBase, IExpectException
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SubstringConstraint("hello");
-            expectedDescription = "String containing \"hello\"";
-            stringRepresentation = "<substring \"hello\">";
-        }
-
-        internal object[] SuccessData = new object[] { "hello", "hello there", "I said hello", "say hello to fred" };
-        
-        internal object[] FailureData = new object[] { "goodbye", "HELLO", "What the hell?", string.Empty, null };
-
-        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"HELLO\"", "\"What the hell?\"", "<string.Empty>", "null" }; 
-
-        public void HandleException(Exception ex)
-        {
-            Assert.That(ex.Message, new EqualConstraint(
-                TextMessageWriter.Pfx_Expected + "String containing \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...\"" + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual   + "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...\"" + Environment.NewLine));
-        }
-    }
-
-    [TestFixture]
-    public class SubstringTestIgnoringCase : ConstraintTestBase
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new SubstringConstraint("hello").IgnoreCase;
-            expectedDescription = "String containing \"hello\", ignoring case";
-            stringRepresentation = "<substring \"hello\">";
-        }
-
-        internal object[] SuccessData = new object[] { "Hello", "HellO there", "I said HELLO", "say hello to fred" };
-        
-        internal object[] FailureData = new object[] { "goodbye", "What the hell?", string.Empty, null };
-
-        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "<string.Empty>", "null" };
-    }
-
-    [TestFixture]
-    public class StartsWithTest : ConstraintTestBase
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new StartsWithConstraint("hello");
-            expectedDescription = "String starting with \"hello\"";
-            stringRepresentation = "<startswith \"hello\">";
-        }
-
-        internal object[] SuccessData = new object[] { "hello", "hello there" };
-
-        internal object[] FailureData = new object[] { "goodbye", "HELLO THERE", "I said hello", "say hello to fred", string.Empty, null };
-
-        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"HELLO THERE\"", "\"I said hello\"", "\"say hello to fred\"", "<string.Empty>", "null" };
-    }
-
-    [TestFixture]
-    public class StartsWithTestIgnoringCase : ConstraintTestBase
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new StartsWithConstraint("hello").IgnoreCase;
-            expectedDescription = "String starting with \"hello\", ignoring case";
-            stringRepresentation = "<startswith \"hello\">";
-        }
-
-        internal object[] SuccessData = new object[] { "Hello", "HELLO there" };
-            
-        internal object[] FailureData = new object[] { "goodbye", "What the hell?", "I said hello", "say Hello to fred", string.Empty, null };
-
-        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "\"I said hello\"", "\"say Hello to fred\"", "<string.Empty>", "null" };
-    }
-
-    [TestFixture]
-    public class EndsWithTest : ConstraintTestBase
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new EndsWithConstraint("hello");
-            expectedDescription = "String ending with \"hello\"";
-            stringRepresentation = "<endswith \"hello\">";
-        }
-
-        internal object[] SuccessData = new object[] { "hello", "I said hello" };
-            
-        internal object[] FailureData = new object[] { "goodbye", "What the hell?", "hello there", "say hello to fred", string.Empty, null };
-
-        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "\"hello there\"", "\"say hello to fred\"", "<string.Empty>", "null" };
-    }
-
-    [TestFixture]
-    public class EndsWithTestIgnoringCase : ConstraintTestBase
-    {
-		[SetUp]
-        public void SetUp()
-        {
-            theConstraint = new EndsWithConstraint("hello").IgnoreCase;
-            expectedDescription = "String ending with \"hello\", ignoring case";
-            stringRepresentation = "<endswith \"hello\">";
-        }
-
-        internal object[] SuccessData = new object[] { "HELLO", "I said Hello" };
-            
-        internal object[] FailureData = new object[] { "goodbye", "What the hell?", "hello there", "say hello to fred", string.Empty, null };
-
-        internal string[] ActualValues = new string[] { "\"goodbye\"", "\"What the hell?\"", "\"hello there\"", "\"say hello to fred\"", "<string.Empty>", "null" };
-    }
-
-    //[TestFixture]
-    //public class EqualIgnoringCaseTest : ConstraintTest
-    //{
-    //    [SetUp]
-    //    public void SetUp()
-    //    {
-    //        Matcher = new EqualConstraint("Hello World!").IgnoreCase;
-    //        Description = "\"Hello World!\", ignoring case";
-    //    }
-
-    //    object[] SuccessData = new object[] { "hello world!", "Hello World!", "HELLO world!" };
-            
-    //    object[] FailureData = new object[] { "goodbye", "Hello Friends!", string.Empty, null };
-
-    //    string[] ActualValues = new string[] { "\"goodbye\"", "\"Hello Friends!\"", "<string.Empty>", "null" };
-    //}
-}
diff --git a/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs b/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs
index 1dc9ed8..3dcd9e8 100644
--- a/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ThrowsConstraintTests.cs
@@ -1,109 +1,109 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Tests;
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class ThrowsConstraintTest_ExactType : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new ThrowsConstraint(
-                new ExactTypeConstraint(typeof(ArgumentException)));
-            expectedDescription = "<System.ArgumentException>";
-            stringRepresentation = "<throws <typeof System.ArgumentException>>";
-        }
-
-        internal static object[] SuccessData = new object[]
-        {
-            new TestDelegate( TestDelegates.ThrowsArgumentException )
-        };
-
-        internal static object[] FailureData = new object[]
-        {
-            new TestDelegate( TestDelegates.ThrowsApplicationException ),
-            new TestDelegate( TestDelegates.ThrowsNothing ),
-            new TestDelegate( TestDelegates.ThrowsSystemException )
-        };
-
-        internal static string[] ActualValues = new string[]
-        {
-            "<System.ApplicationException>",
-            "no exception thrown",
-            "<System.Exception>"
-        };
-    }
-
-    [TestFixture]
-    public class ThrowsConstraintTest_InstanceOfType : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new ThrowsConstraint(
-                new InstanceOfTypeConstraint(typeof(ApplicationException)));
-            expectedDescription = "instance of <System.ApplicationException>";
-            stringRepresentation = "<throws <instanceof System.ApplicationException>>";
-        }
-
-        internal static object[] SuccessData = new object[]
-        {
-            new TestDelegate( TestDelegates.ThrowsApplicationException ),
-            new TestDelegate( TestDelegates.ThrowsDerivedApplicationException )
-        };
-
-        internal static object[] FailureData = new object[]
-        {
-            new TestDelegate( TestDelegates.ThrowsArgumentException ),
-            new TestDelegate( TestDelegates.ThrowsNothing ),
-            new TestDelegate( TestDelegates.ThrowsSystemException )
-        };
-
-        internal static string[] ActualValues = new string[]
-        {
-            "<System.ArgumentException>",
-            "no exception thrown",
-            "<System.Exception>"
-        };
-    }
-
-    public class ThrowsConstraintTest_WithConstraint : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new ThrowsConstraint(
-                new AndConstraint(
-                    new ExactTypeConstraint(typeof(ArgumentException)),
-                    new PropertyConstraint("ParamName", new EqualConstraint("myParam"))));
-            expectedDescription = @"<System.ArgumentException> and property ParamName equal to ""myParam""";
-            stringRepresentation = @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>";
-        }
-
-        internal static object[] SuccessData = new object[]
-        {
-            new TestDelegate( TestDelegates.ThrowsArgumentException )
-        };
-
-        internal static object[] FailureData = new object[]
-        {
-            new TestDelegate( TestDelegates.ThrowsApplicationException ),
-            new TestDelegate( TestDelegates.ThrowsNothing ),
-            new TestDelegate( TestDelegates.ThrowsSystemException )
-        };
-
-        internal static string[] ActualValues = new string[]
-        {
-            "<System.ApplicationException>",
-            "no exception thrown",
-            "<System.Exception>"
-        };
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Tests;
+
+namespace NUnit.Framework.Constraints
+{
+    [TestFixture]
+    public class ThrowsConstraintTest_ExactType : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new ThrowsConstraint(
+                new ExactTypeConstraint(typeof(ArgumentException)));
+            expectedDescription = "<System.ArgumentException>";
+            stringRepresentation = "<throws <typeof System.ArgumentException>>";
+        }
+
+        internal static object[] SuccessData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsArgumentException )
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsApplicationException ),
+            new TestDelegate( TestDelegates.ThrowsNothing ),
+            new TestDelegate( TestDelegates.ThrowsSystemException )
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "<System.ApplicationException>",
+            "no exception thrown",
+            "<System.Exception>"
+        };
+    }
+
+    [TestFixture]
+    public class ThrowsConstraintTest_InstanceOfType : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new ThrowsConstraint(
+                new InstanceOfTypeConstraint(typeof(ApplicationException)));
+            expectedDescription = "instance of <System.ApplicationException>";
+            stringRepresentation = "<throws <instanceof System.ApplicationException>>";
+        }
+
+        internal static object[] SuccessData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsApplicationException ),
+            new TestDelegate( TestDelegates.ThrowsDerivedApplicationException )
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsArgumentException ),
+            new TestDelegate( TestDelegates.ThrowsNothing ),
+            new TestDelegate( TestDelegates.ThrowsSystemException )
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "<System.ArgumentException>",
+            "no exception thrown",
+            "<System.Exception>"
+        };
+    }
+
+    public class ThrowsConstraintTest_WithConstraint : ConstraintTestBase
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            theConstraint = new ThrowsConstraint(
+                new AndConstraint(
+                    new ExactTypeConstraint(typeof(ArgumentException)),
+                    new PropertyConstraint("ParamName", new EqualConstraint("myParam"))));
+            expectedDescription = @"<System.ArgumentException> and property ParamName equal to ""myParam""";
+            stringRepresentation = @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>";
+        }
+
+        internal static object[] SuccessData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsArgumentException )
+        };
+
+        internal static object[] FailureData = new object[]
+        {
+            new TestDelegate( TestDelegates.ThrowsApplicationException ),
+            new TestDelegate( TestDelegates.ThrowsNothing ),
+            new TestDelegate( TestDelegates.ThrowsSystemException )
+        };
+
+        internal static string[] ActualValues = new string[]
+        {
+            "<System.ApplicationException>",
+            "no exception thrown",
+            "<System.Exception>"
+        };
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/ToStringTests.cs b/src/NUnitFramework/tests/Constraints/ToStringTests.cs
index b48bd49..efdec05 100644
--- a/src/NUnitFramework/tests/Constraints/ToStringTests.cs
+++ b/src/NUnitFramework/tests/Constraints/ToStringTests.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Constraints
-{
-    public class ToStringTests
-    {
-        [Test]
-        public void CanDisplaySimpleConstraints_Unresolved()
-        {
-            Assert.That(Is.EqualTo(5).ToString(), Is.EqualTo("<equal 5>"));
-            Assert.That(Has.Property("X").ToString(), Is.EqualTo("<propertyexists X>"));
-            Assert.That(Has.Attribute(typeof(TestAttribute)).ToString(), 
-                Is.EqualTo("<attributeexists NUnit.Framework.TestAttribute>"));
-        }
-
-        [Test]
-        public void CanDisplaySimpleConstraints_Resolved()
-        {
-            IResolveConstraint constraint = Is.EqualTo(5);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<equal 5>"));
-            constraint = Has.Property("X");
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<propertyexists X>"));
-            constraint = Has.Attribute(typeof(TestAttribute)).With.Property("Description").EqualTo("smoke");
-            Assert.That(constraint.Resolve().ToString(),
-                Is.EqualTo("<attribute NUnit.Framework.TestAttribute <property Description <equal \"smoke\">>>"));
-        }
-
-        [Test]
-        public void DisplayPrefixConstraints_Unresolved()
-        {
-            Assert.That(Is.Not.EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
-            Assert.That(Is.Not.All.EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
-            Assert.That(Has.Property("X").EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
-            Assert.That(Has.Attribute(typeof(TestAttribute)).With.Property("Description").EqualTo("smoke").ToString(),
-                Is.EqualTo("<unresolved <equal \"smoke\">>"));
-        }
-
-        [Test]
-        public void CanDisplayPrefixConstraints_Resolved()
-        {
-            IResolveConstraint constraint = Is.Not.EqualTo(5);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<not <equal 5>>"));
-            constraint = Is.Not.All.EqualTo(5);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<not <all <equal 5>>>"));
-            constraint = Has.Property("X").EqualTo(5);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<property X <equal 5>>"));
-        }
-
-        [Test]
-        public void DisplayBinaryConstraints_Resolved()
-        {
-            IResolveConstraint constraint = Is.GreaterThan(0).And.LessThan(100);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<and <greaterthan 0> <lessthan 100>>"));
-        }
-
-        [Test]
-        public void DisplayBinaryConstraints_UnResolved()
-        {
-            IResolveConstraint constraint = Is.GreaterThan(0).And.LessThan(100);
-            Assert.That(constraint.ToString(), Is.EqualTo("<unresolved <lessthan 100>>"));
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Constraints
+{
+    public class ToStringTests
+    {
+        [Test]
+        public void CanDisplaySimpleConstraints_Unresolved()
+        {
+            Assert.That(Is.EqualTo(5).ToString(), Is.EqualTo("<equal 5>"));
+            Assert.That(Has.Property("X").ToString(), Is.EqualTo("<propertyexists X>"));
+            Assert.That(Has.Attribute(typeof(TestAttribute)).ToString(), 
+                Is.EqualTo("<attributeexists NUnit.Framework.TestAttribute>"));
+        }
+
+        [Test]
+        public void CanDisplaySimpleConstraints_Resolved()
+        {
+            IResolveConstraint constraint = Is.EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<equal 5>"));
+            constraint = Has.Property("X");
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<propertyexists X>"));
+            constraint = Has.Attribute(typeof(TestAttribute)).With.Property("Description").EqualTo("smoke");
+            Assert.That(constraint.Resolve().ToString(),
+                Is.EqualTo("<attribute NUnit.Framework.TestAttribute <property Description <equal \"smoke\">>>"));
+        }
+
+        [Test]
+        public void DisplayPrefixConstraints_Unresolved()
+        {
+            Assert.That(Is.Not.EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
+            Assert.That(Is.Not.All.EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
+            Assert.That(Has.Property("X").EqualTo(5).ToString(), Is.EqualTo("<unresolved <equal 5>>"));
+            Assert.That(Has.Attribute(typeof(TestAttribute)).With.Property("Description").EqualTo("smoke").ToString(),
+                Is.EqualTo("<unresolved <equal \"smoke\">>"));
+        }
+
+        [Test]
+        public void CanDisplayPrefixConstraints_Resolved()
+        {
+            IResolveConstraint constraint = Is.Not.EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<not <equal 5>>"));
+            constraint = Is.Not.All.EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<not <all <equal 5>>>"));
+            constraint = Has.Property("X").EqualTo(5);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<property X <equal 5>>"));
+        }
+
+        [Test]
+        public void DisplayBinaryConstraints_Resolved()
+        {
+            IResolveConstraint constraint = Is.GreaterThan(0).And.LessThan(100);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<and <greaterthan 0> <lessthan 100>>"));
+        }
+
+        [Test]
+        public void DisplayBinaryConstraints_UnResolved()
+        {
+            IResolveConstraint constraint = Is.GreaterThan(0).And.LessThan(100);
+            Assert.That(constraint.ToString(), Is.EqualTo("<unresolved <lessthan 100>>"));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs b/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs
deleted file mode 100644
index 2cff43d..0000000
--- a/src/NUnitFramework/tests/Constraints/TypeConstraintTests.cs
+++ /dev/null
@@ -1,142 +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.
-// ****************************************************************
-
-namespace NUnit.Framework.Constraints
-{
-    [TestFixture]
-    public class ExactTypeTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new ExactTypeConstraint(typeof(D1));
-            expectedDescription = string.Format("<{0}>", typeof(D1));
-            stringRepresentation = string.Format("<typeof {0}>", typeof(D1));
-        }
-
-        internal object[] SuccessData = new object[] { new D1() };
-        
-        internal object[] FailureData = new object[] { new B(), new D2() };
-
-        internal string[] ActualValues = new string[]
-            {
-                "<NUnit.Framework.Constraints.B>",
-                "<NUnit.Framework.Constraints.D2>"
-            };
-    }
-
-    [TestFixture]
-    public class InstanceOfTypeTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new InstanceOfTypeConstraint(typeof(D1));
-            expectedDescription = string.Format("instance of <{0}>", typeof(D1));
-            stringRepresentation = string.Format("<instanceof {0}>", typeof(D1));
-        }
-
-        internal object[] SuccessData = new object[] { new D1(), new D2() };
-
-        internal object[] FailureData = new object[] { new B() };
-
-        internal string[] ActualValues = new string[]
-            {
-                "<NUnit.Framework.Constraints.B>"
-            };
-    }
-
-    [TestFixture]
-    public class AssignableFromTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new AssignableFromConstraint(typeof(D1));
-            expectedDescription = string.Format("assignable from <{0}>", typeof(D1));
-            stringRepresentation = string.Format("<assignablefrom {0}>", typeof(D1));
-        }
-
-        internal object[] SuccessData = new object[] { new D1(), new B() };
-            
-        internal object[] FailureData = new object[] { new D2() };
-
-        internal string[] ActualValues = new string[]
-            {
-                "<NUnit.Framework.Constraints.D2>"
-            };
-    }
-
-    [TestFixture]
-    public class AssignableToTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new AssignableToConstraint(typeof(D1));
-            expectedDescription = string.Format("assignable to <{0}>", typeof(D1));
-            stringRepresentation = string.Format("<assignableto {0}>", typeof(D1));
-        }
-        
-        internal object[] SuccessData = new object[] { new D1(), new D2() };
-            
-        internal object[] FailureData = new object[] { new B() };
-
-        internal string[] ActualValues = new string[]
-            {
-                "<NUnit.Framework.Constraints.B>"
-            };
-    }
-
-    class B { }
-
-    class D1 : B { }
-
-    class D2 : D1 { }
-
-    [TestFixture]
-    public class AttributeExistsConstraintTest : ConstraintTestBase
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            theConstraint = new AttributeExistsConstraint(typeof(TestFixtureAttribute));
-            expectedDescription = "type with attribute <NUnit.Framework.TestFixtureAttribute>";
-            stringRepresentation = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
-        }
-
-        internal object[] SuccessData = new object[] { typeof(AttributeExistsConstraintTest) };
-            
-        internal object[] FailureData = new object[] { typeof(D2) };
-
-        internal string[] ActualValues = new string[]
-            {
-                "<NUnit.Framework.Constraints.D2>"
-            };
-
-        [Test, ExpectedException(typeof(System.ArgumentException))]
-        public void NonAttributeThrowsException()
-        {
-            new AttributeExistsConstraint(typeof(string));
-        }
-
-        [Test]
-        public void AttributeExistsOnMethodInfo()
-        {
-            Assert.That(
-                System.Reflection.MethodInfo.GetCurrentMethod(),
-                new AttributeExistsConstraint(typeof(TestAttribute)));
-        }
-
-        [Test, Description("my description")]
-        public void AttributeTestPropertyValueOnMethodInfo()
-        {
-            Assert.That(
-                System.Reflection.MethodInfo.GetCurrentMethod(),
-                Has.Attribute(typeof(DescriptionAttribute)).Property("Description").EqualTo("my description"));
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/DirectoryAssertTests.cs b/src/NUnitFramework/tests/DirectoryAssertTests.cs
index 56face9..705158b 100644
--- a/src/NUnitFramework/tests/DirectoryAssertTests.cs
+++ b/src/NUnitFramework/tests/DirectoryAssertTests.cs
@@ -1,449 +1,449 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-
-namespace NUnit.Framework.Tests
-{
-    public class TestDirectory : IDisposable
-    {
-        private bool _disposedValue = false;
-        public string directoryName;
-        public DirectoryInfo directoryInformation;
-        public DirectoryInfo diSubSubDirectory;
-
-        #region TestDirectory Utility Class
-
-        public TestDirectory(string dirName) : this(dirName, true) { }
-
-        public TestDirectory(string dirName, bool CreateSubDirectory)
-        {
-            this.directoryName = Path.Combine(Path.GetTempPath(), dirName);
-
-            directoryInformation = Directory.CreateDirectory(this.directoryName);
-
-            if (CreateSubDirectory)
-            {
-                DirectoryInfo diSubDirectory = directoryInformation.CreateSubdirectory("SubDirectory");
-                diSubSubDirectory = diSubDirectory.CreateSubdirectory("SubSubDirectory");
-            }
-        }
-
-        protected virtual void Dispose(bool disposing)
-        {
-            if (!this._disposedValue)
-            {
-                if (disposing)
-                {
-                    if (Directory.Exists(directoryName))
-                    {
-                        Directory.Delete(directoryName,true);
-                    }
-                }
-            }
-            this._disposedValue = true;
-        }
-
-        #region IDisposable Members
-
-        public void Dispose()
-        {
-            // Do not change this code.  Put cleanup code in Dispose(bool disposing) above.
-            Dispose(true);
-            GC.SuppressFinalize(this);
-        }
-
-        #endregion
-
-        #endregion
-    }
-
-    /// <summary>
-	/// Summary description for DirectoryAssertTests.
-	/// </summary>
-	[TestFixture, Obsolete("DirectoryAssert is obsolete")]
-    public class DirectoryAssertTests : MessageChecker
-    {
-        #region AreEqual
-
-        #region Success Tests
-        [Test]
-        public void AreEqualPassesWhenBothAreNull()
-        {
-            DirectoryInfo expected = null;
-            DirectoryInfo actual = null;
-            DirectoryAssert.AreEqual(expected, actual);
-        }
-
-        [Test]
-        public void AreEqualPassesWithDirectoryInfos()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryAssert.AreEqual(td.directoryInformation, td.directoryInformation);
-            }
-        }
-
-        [Test]
-        public void AreEqualPassesWithStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryAssert.AreEqual(td.directoryName, td.directoryName);
-            }
-        }
-        #endregion
-
-        #region Failure Tests
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreEqualFailsWhenOneIsNull()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {               
-                DirectoryAssert.AreEqual(td.directoryInformation, null);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreEqualFailsWhenOneDoesNotExist()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryInfo actual = new DirectoryInfo("NotExistingDirectoryName");
-                DirectoryAssert.AreEqual(td.directoryInformation, actual);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreEqualFailsWithDirectoryInfos()
-        {
-            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
-            {
-                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
-                {
-                    DirectoryAssert.AreEqual(td1.directoryInformation, td2.directoryInformation);
-                }
-            }
-        }
-
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreEqualFailsWithStringPath()
-        {
-            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
-            {
-                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
-                {
-                    DirectoryAssert.AreEqual(td1.directoryName, td2.directoryName);
-                }
-            }
-        }
-        #endregion
-
-        #endregion
-
-        #region AreNotEqual
-
-        #region Success Tests
-        [Test]
-        public void AreNotEqualPassesIfOneIsNull()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryAssert.AreNotEqual(td.directoryInformation, null);
-            }
-        }
-
-        [Test]
-        public void AreNotEqualPassesWhenOneDoesNotExist()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryInfo actual = new DirectoryInfo("NotExistingDirectoryName");
-                DirectoryAssert.AreNotEqual(td.directoryInformation, actual);
-            }
-        }
-
-        public void AreNotEqualPassesWithDirectoryInfos()
-        {
-            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
-            {
-                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
-                {
-                    DirectoryAssert.AreNotEqual(td1.directoryInformation, td2.directoryInformation);
-                }
-            }
-        }
-
-        [Test]
-        public void AreNotEqualPassesWithStringPath()
-        {
-            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
-            {
-                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
-                {
-                    DirectoryAssert.AreNotEqual(td1.directoryName, td2.directoryName);
-                }
-            }
-        }
-        #endregion
-
-        #region Failure Tests
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreNotEqualFailsWhenBothAreNull()
-        {
-            DirectoryInfo expected = null;
-            DirectoryInfo actual = null;
-            expectedMessage =
-    "  Expected: not null" + Environment.NewLine +
-    "  But was:  null" + Environment.NewLine;
-            DirectoryAssert.AreNotEqual(expected, actual);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreNotEqualFailsWithDirectoryInfos()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryAssert.AreNotEqual(td.directoryInformation, td.directoryInformation);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void AreNotEqualFailsWithStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory"))
-            {
-                DirectoryAssert.AreNotEqual(td.directoryName, td.directoryName);
-            }
-        }
-        #endregion
-
-        #endregion
-
-        #region IsEmpty
-
-        [Test]
-        public void IsEmptyPassesWithEmptyDirectoryUsingDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
-            {
-                DirectoryAssert.IsEmpty(td.directoryInformation);
-                Assert.That(td.directoryInformation, Is.Empty);
-            }
-        }
-
-        [Test]
-        public void IsEmptyPassesWithEmptyDirectoryUsingStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
-            {
-                DirectoryAssert.IsEmpty(td.directoryName);
-            }
-        }
-
-        [Test, ExpectedException(typeof(DirectoryNotFoundException))]
-        public void IsEmptyFailsWithInvalidDirectory()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
-            {
-                DirectoryAssert.IsEmpty(td.directoryName + "INVALID");
-            }
-        }
-
-        [Test,ExpectedException(typeof(ArgumentException))]
-        public void IsEmptyThrowsUsingNull()
-        {
-            DirectoryAssert.IsEmpty((DirectoryInfo)null);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsEmptyFailsWithNonEmptyDirectoryUsingDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsEmpty(td.directoryInformation);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsEmptyFailsWithNonEmptyDirectoryUsingStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsEmpty(td.directoryName);
-            }
-        }
-
-        #endregion
-
-        #region IsNotEmpty
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsNotEmptyFailsWithEmptyDirectoryUsingDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
-            {
-                DirectoryAssert.IsNotEmpty(td.directoryInformation);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsNotEmptyFailsWithEmptyDirectoryUsingStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
-            {
-                DirectoryAssert.IsNotEmpty(td.directoryName);
-            }
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsNotEmptyThrowsUsingNull()
-        {
-            DirectoryAssert.IsNotEmpty((DirectoryInfo) null);
-        }
-
-        [Test, ExpectedException(typeof(DirectoryNotFoundException))]
-        public void IsNotEmptyFailsWithInvalidDirectory()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
-            {
-                DirectoryAssert.IsNotEmpty(td.directoryName + "INVALID");
-            }
-        }
-
-        [Test]
-        public void IsNotEmptyPassesWithNonEmptyDirectoryUsingDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsNotEmpty(td.directoryInformation);
-                Assert.That(td.directoryInformation, Is.Not.Empty);
-            }
-        }
-
-        [Test]
-        public void IsNotEmptyPassesWithNonEmptyDirectoryUsingStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsNotEmpty(td.directoryName);
-            }
-        }
-
-        #endregion
-
-        #region IsWithin
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsWithinThrowsWhenBothAreNull()
-        {
-            DirectoryInfo expected = null;
-            DirectoryInfo actual = null;
-            DirectoryAssert.IsWithin(expected, actual);
-        }
-
-        [Test]
-        public void IsWithinPassesWithDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory",true))
-            {
-                DirectoryAssert.IsWithin(td.directoryInformation, td.diSubSubDirectory);
-            }
-        }
-
-        [Test]
-        public void IsWithinPassesWithStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsWithin(td.directoryName, td.diSubSubDirectory.FullName);
-            }
-        }
-
-        [Test]
-        public void IsWithinPassesWithTempPath()
-        {
-            // Special case because GetTempPath() returns with a trailing slash
-            string tempPath = Path.GetTempPath();
-            string tempPathParent = Path.GetDirectoryName(Path.GetDirectoryName(tempPath));
-
-            DirectoryAssert.IsWithin(tempPathParent, tempPath);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsWithinFailsWhenOutsidePathUsingDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryInfo diSystemFolder = new DirectoryInfo(Environment.SpecialFolder.System.ToString());
-                DirectoryAssert.IsWithin(td.directoryInformation, diSystemFolder);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsWithinFailsWhenOutsidePathUsingStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsWithin(td.directoryName, Environment.SpecialFolder.System.ToString());
-            }
-        }
-
-        #endregion
-
-        #region IsNotWithin
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void IsNotWithinThrowsWhenBothAreNull()
-        {
-            DirectoryInfo expected = null;
-            DirectoryInfo actual = null;
-            DirectoryAssert.IsNotWithin(expected, actual);
-        }
-
-        [Test]
-        public void IsNotWithinPassesWhenOutsidePathUsingDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryInfo diSystemFolder = new DirectoryInfo(Environment.SpecialFolder.System.ToString());
-                DirectoryAssert.IsNotWithin(td.directoryInformation, diSystemFolder);
-            }
-        }
-
-        [Test]
-        public void IsNotWithinPassesWhenOutsidePathUsingStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsNotWithin(td.directoryName, Environment.SpecialFolder.System.ToString());
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsNotWithinFailsWithDirectoryInfo()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsNotWithin(td.directoryInformation, td.diSubSubDirectory);
-            }
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void IsNotWithinFailsWithStringPath()
-        {
-            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
-            {
-                DirectoryAssert.IsNotWithin(td.directoryName, td.diSubSubDirectory.FullName);
-            }
-        }
-
-        #endregion
-    }
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+
+namespace NUnit.Framework.Tests
+{
+    public class TestDirectory : IDisposable
+    {
+        private bool _disposedValue = false;
+        public string directoryName;
+        public DirectoryInfo directoryInformation;
+        public DirectoryInfo diSubSubDirectory;
+
+        #region TestDirectory Utility Class
+
+        public TestDirectory(string dirName) : this(dirName, true) { }
+
+        public TestDirectory(string dirName, bool CreateSubDirectory)
+        {
+            this.directoryName = Path.Combine(Path.GetTempPath(), dirName);
+
+            directoryInformation = Directory.CreateDirectory(this.directoryName);
+
+            if (CreateSubDirectory)
+            {
+                DirectoryInfo diSubDirectory = directoryInformation.CreateSubdirectory("SubDirectory");
+                diSubSubDirectory = diSubDirectory.CreateSubdirectory("SubSubDirectory");
+            }
+        }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!this._disposedValue)
+            {
+                if (disposing)
+                {
+                    if (Directory.Exists(directoryName))
+                    {
+                        Directory.Delete(directoryName,true);
+                    }
+                }
+            }
+            this._disposedValue = true;
+        }
+
+        #region IDisposable Members
+
+        public void Dispose()
+        {
+            // Do not change this code.  Put cleanup code in Dispose(bool disposing) above.
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        #endregion
+
+        #endregion
+    }
+
+    /// <summary>
+	/// Summary description for DirectoryAssertTests.
+	/// </summary>
+	[TestFixture, Obsolete("DirectoryAssert is obsolete")]
+    public class DirectoryAssertTests : MessageChecker
+    {
+        #region AreEqual
+
+        #region Success Tests
+        [Test]
+        public void AreEqualPassesWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            DirectoryAssert.AreEqual(expected, actual);
+        }
+
+        [Test]
+        public void AreEqualPassesWithDirectoryInfos()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreEqual(td.directoryInformation, td.directoryInformation);
+            }
+        }
+
+        [Test]
+        public void AreEqualPassesWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreEqual(td.directoryName, td.directoryName);
+            }
+        }
+        #endregion
+
+        #region Failure Tests
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWhenOneIsNull()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {               
+                DirectoryAssert.AreEqual(td.directoryInformation, null);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWhenOneDoesNotExist()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryInfo actual = new DirectoryInfo("NotExistingDirectoryName");
+                DirectoryAssert.AreEqual(td.directoryInformation, actual);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWithDirectoryInfos()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreEqual(td1.directoryInformation, td2.directoryInformation);
+                }
+            }
+        }
+
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreEqualFailsWithStringPath()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreEqual(td1.directoryName, td2.directoryName);
+                }
+            }
+        }
+        #endregion
+
+        #endregion
+
+        #region AreNotEqual
+
+        #region Success Tests
+        [Test]
+        public void AreNotEqualPassesIfOneIsNull()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreNotEqual(td.directoryInformation, null);
+            }
+        }
+
+        [Test]
+        public void AreNotEqualPassesWhenOneDoesNotExist()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryInfo actual = new DirectoryInfo("NotExistingDirectoryName");
+                DirectoryAssert.AreNotEqual(td.directoryInformation, actual);
+            }
+        }
+
+        public void AreNotEqualPassesWithDirectoryInfos()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreNotEqual(td1.directoryInformation, td2.directoryInformation);
+                }
+            }
+        }
+
+        [Test]
+        public void AreNotEqualPassesWithStringPath()
+        {
+            using (TestDirectory td1 = new TestDirectory("ParentDirectory1"))
+            {
+                using (TestDirectory td2 = new TestDirectory("ParentDirectory2"))
+                {
+                    DirectoryAssert.AreNotEqual(td1.directoryName, td2.directoryName);
+                }
+            }
+        }
+        #endregion
+
+        #region Failure Tests
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreNotEqualFailsWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            expectedMessage =
+    "  Expected: not null" + Environment.NewLine +
+    "  But was:  null" + Environment.NewLine;
+            DirectoryAssert.AreNotEqual(expected, actual);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreNotEqualFailsWithDirectoryInfos()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreNotEqual(td.directoryInformation, td.directoryInformation);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void AreNotEqualFailsWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory"))
+            {
+                DirectoryAssert.AreNotEqual(td.directoryName, td.directoryName);
+            }
+        }
+        #endregion
+
+        #endregion
+
+        #region IsEmpty
+
+        [Test]
+        public void IsEmptyPassesWithEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsEmpty(td.directoryInformation);
+                Assert.That(td.directoryInformation, Is.Empty);
+            }
+        }
+
+        [Test]
+        public void IsEmptyPassesWithEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsEmpty(td.directoryName);
+            }
+        }
+
+        [Test, ExpectedException(typeof(DirectoryNotFoundException))]
+        public void IsEmptyFailsWithInvalidDirectory()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsEmpty(td.directoryName + "INVALID");
+            }
+        }
+
+        [Test,ExpectedException(typeof(ArgumentException))]
+        public void IsEmptyThrowsUsingNull()
+        {
+            DirectoryAssert.IsEmpty((DirectoryInfo)null);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsEmptyFailsWithNonEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsEmpty(td.directoryInformation);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsEmptyFailsWithNonEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsEmpty(td.directoryName);
+            }
+        }
+
+        #endregion
+
+        #region IsNotEmpty
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotEmptyFailsWithEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryInformation);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotEmptyFailsWithEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryName);
+            }
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsNotEmptyThrowsUsingNull()
+        {
+            DirectoryAssert.IsNotEmpty((DirectoryInfo) null);
+        }
+
+        [Test, ExpectedException(typeof(DirectoryNotFoundException))]
+        public void IsNotEmptyFailsWithInvalidDirectory()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", false))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryName + "INVALID");
+            }
+        }
+
+        [Test]
+        public void IsNotEmptyPassesWithNonEmptyDirectoryUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryInformation);
+                Assert.That(td.directoryInformation, Is.Not.Empty);
+            }
+        }
+
+        [Test]
+        public void IsNotEmptyPassesWithNonEmptyDirectoryUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotEmpty(td.directoryName);
+            }
+        }
+
+        #endregion
+
+        #region IsWithin
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsWithinThrowsWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            DirectoryAssert.IsWithin(expected, actual);
+        }
+
+        [Test]
+        public void IsWithinPassesWithDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory",true))
+            {
+                DirectoryAssert.IsWithin(td.directoryInformation, td.diSubSubDirectory);
+            }
+        }
+
+        [Test]
+        public void IsWithinPassesWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsWithin(td.directoryName, td.diSubSubDirectory.FullName);
+            }
+        }
+
+        [Test]
+        public void IsWithinPassesWithTempPath()
+        {
+            // Special case because GetTempPath() returns with a trailing slash
+            string tempPath = Path.GetTempPath();
+            string tempPathParent = Path.GetDirectoryName(Path.GetDirectoryName(tempPath));
+
+            DirectoryAssert.IsWithin(tempPathParent, tempPath);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsWithinFailsWhenOutsidePathUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryInfo diSystemFolder = new DirectoryInfo(Environment.SpecialFolder.System.ToString());
+                DirectoryAssert.IsWithin(td.directoryInformation, diSystemFolder);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsWithinFailsWhenOutsidePathUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsWithin(td.directoryName, Environment.SpecialFolder.System.ToString());
+            }
+        }
+
+        #endregion
+
+        #region IsNotWithin
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void IsNotWithinThrowsWhenBothAreNull()
+        {
+            DirectoryInfo expected = null;
+            DirectoryInfo actual = null;
+            DirectoryAssert.IsNotWithin(expected, actual);
+        }
+
+        [Test]
+        public void IsNotWithinPassesWhenOutsidePathUsingDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryInfo diSystemFolder = new DirectoryInfo(Environment.SpecialFolder.System.ToString());
+                DirectoryAssert.IsNotWithin(td.directoryInformation, diSystemFolder);
+            }
+        }
+
+        [Test]
+        public void IsNotWithinPassesWhenOutsidePathUsingStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotWithin(td.directoryName, Environment.SpecialFolder.System.ToString());
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotWithinFailsWithDirectoryInfo()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotWithin(td.directoryInformation, td.diSubSubDirectory);
+            }
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void IsNotWithinFailsWithStringPath()
+        {
+            using (TestDirectory td = new TestDirectory("ParentDirectory", true))
+            {
+                DirectoryAssert.IsNotWithin(td.directoryName, td.diSubSubDirectory.FullName);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/tests/EqualsFixture.cs b/src/NUnitFramework/tests/EqualsFixture.cs
index 1cfbdd0..f080095 100644
--- a/src/NUnitFramework/tests/EqualsFixture.cs
+++ b/src/NUnitFramework/tests/EqualsFixture.cs
@@ -1,578 +1,578 @@
-// ****************************************************************
-// 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.RegularExpressions;
-using System.Globalization;
-using System.IO;
-using System.Threading;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class EqualsFixture : MessageChecker
-	{
-		[Test]
-		public void Equals()
-		{
-			string nunitString = "Hello NUnit";
-			string expected = nunitString;
-			string actual = nunitString;
-
-			Assert.IsTrue(expected == actual);
-			Assert.AreEqual(expected, actual);
-		}
-
-		[Test]
-		public void EqualsNull() 
-		{
-			Assert.AreEqual(null, null);
-		}
-		
-		[Test]
-		public void Bug575936Int32Int64Comparison()
-		{
-			long l64 = 0;
-			int i32 = 0;
-			Assert.AreEqual(i32, l64);
-		}
-		
-		[Test]
-		public void IntegerLongComparison()
-		{
-			Assert.AreEqual(1, 1L);
-			Assert.AreEqual(1L, 1);
-		}
-
-		[Test]
-		public void IntegerEquals()
-		{
-			int val = 42;
-			Assert.AreEqual(val, 42);
-		}
-
-		
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void EqualsFail()
-		{
-			string junitString = "Goodbye JUnit";
-			string expected = "Hello NUnit";
-
-			expectedMessage =
-				"  Expected string length 11 but was 13. Strings differ at index 0." + Environment.NewLine +
-				"  Expected: \"Hello NUnit\"" + Environment.NewLine +
-				"  But was:  \"Goodbye JUnit\"" + Environment.NewLine +
-				"  -----------^" + Environment.NewLine;
-			Assert.AreEqual(expected, junitString);
-		}
-		
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void EqualsNaNFails() 
-		{
-			expectedMessage =
-				"  Expected: 1.234d +/- 0.0d" + Environment.NewLine +
-				"  But was:  NaN" + Environment.NewLine;
-			Assert.AreEqual(1.234, Double.NaN, 0.0);
-		}    
-
-
-		[Test]
-		[ExpectedException(typeof(AssertionException))]
-		public void NanEqualsFails() 
-		{
-			expectedMessage =
-				"  Expected: NaN" + Environment.NewLine +
-				"  But was:  1.234d" + Environment.NewLine;
-			Assert.AreEqual(Double.NaN, 1.234, 0.0);
-		}     
-		
-		[Test]
-		public void NanEqualsNaNSucceeds() 
-		{
-			Assert.AreEqual(Double.NaN, Double.NaN, 0.0);
-		}     
-
-		[Test]
-		public void NegInfinityEqualsInfinity() 
-		{
-			Assert.AreEqual(Double.NegativeInfinity, Double.NegativeInfinity, 0.0);
-		}
-
-		[Test]
-		public void PosInfinityEqualsInfinity() 
-		{
-			Assert.AreEqual(Double.PositiveInfinity, Double.PositiveInfinity, 0.0);
-		}
-		
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void PosInfinityNotEquals() 
-		{
-			expectedMessage =
-				"  Expected: Infinity" + Environment.NewLine +
-				"  But was:  1.23d" + Environment.NewLine;
-			Assert.AreEqual(Double.PositiveInfinity, 1.23, 0.0);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void PosInfinityNotEqualsNegInfinity() 
-		{
-			expectedMessage =
-				"  Expected: Infinity" + Environment.NewLine +
-				"  But was:  -Infinity" + Environment.NewLine;
-			Assert.AreEqual(Double.PositiveInfinity, Double.NegativeInfinity, 0.0);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]	
-		public void SinglePosInfinityNotEqualsNegInfinity() 
-		{
-			expectedMessage =
-				"  Expected: Infinity" + Environment.NewLine +
-				"  But was:  -Infinity" + Environment.NewLine;
-			Assert.AreEqual(float.PositiveInfinity, float.NegativeInfinity, (float)0.0);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void EqualsThrowsException()
-		{
-			object o = new object();
-			Assert.Equals(o, o);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ReferenceEqualsThrowsException()
-		{
-			object o = new object();
-			Assert.ReferenceEquals(o, o);
-		}
-		
-		[Test]
-		public void Float() 
-		{
-			float val = (float)1.0;
-			float expected = val;
-			float actual = val;
-
-			Assert.IsTrue(expected == actual);
-			Assert.AreEqual(expected, actual, (float)0.0);
-		}
-
-		[Test]
-		public void Byte() 
-		{
-			byte val = 1;
-			byte expected = val;
-			byte actual = val;
-
-			Assert.IsTrue(expected == actual);
-			Assert.AreEqual(expected, actual);
-		}
-
-		[Test]
-		public void String() 
-		{
-			string s1 = "test";
-			string s2 = new System.Text.StringBuilder(s1).ToString();
-
-			Assert.IsTrue(s1.Equals(s2));
-			Assert.AreEqual(s1,s2);
-		}
-
-		[Test]
-		public void Short() 
-		{
-			short val = 1;
-			short expected = val;
-			short actual = val;
-
-			Assert.IsTrue(expected == actual);
-			Assert.AreEqual(expected, actual);
-		}
-
-		[Test]
-		public void Int() 
-		{
-			int val = 1;
-			int expected = val;
-			int actual = val;
-
-			Assert.IsTrue(expected == actual);
-			Assert.AreEqual(expected, actual);
-		}
-
-		[Test]
-		public void UInt() 
-		{
-			uint val = 1;
-			uint expected = val;
-			uint actual = val;
-
-			Assert.IsTrue(expected == actual);
-			Assert.AreEqual(expected, actual);
-		}
-
-		[Test]
-		public void Decimal() 
-		{
-			decimal expected = 100m;
-			decimal actual = 100.0m;
-			int integer = 100;
-
-			Assert.IsTrue( expected == actual );
-			Assert.AreEqual(expected, actual);
-			Assert.IsTrue(expected == integer);
-			Assert.AreEqual(expected, integer);
-			Assert.IsTrue(actual == integer);
-			Assert.AreEqual(actual, integer);
-		}
-
-
-		
-		/// <summary>
-		/// Checks to see that a value comparison works with all types.
-		/// Current version has problems when value is the same but the
-		/// types are different...C# is not like Java, and doesn't automatically
-		/// perform value type conversion to simplify this type of comparison.
-		/// 
-		/// Related to Bug575936Int32Int64Comparison, but covers all numeric
-		/// types.
-		/// </summary>
-		[Test]
-		public void EqualsSameTypes()
-		{
-			byte      b1 = 35;
-			sbyte    sb2 = 35;
-			decimal   d4 = 35;
-			double    d5 = 35;
-			float     f6 = 35;
-			int       i7 = 35;
-			uint      u8 = 35;
-			long      l9 = 35;
-			short    s10 = 35;
-			ushort  us11 = 35;
-		
-			System.Byte    b12  = 35;  
-			System.SByte   sb13 = 35; 
-			System.Decimal d14  = 35; 
-			System.Double  d15  = 35; 
-			System.Single  s16  = 35; 
-			System.Int32   i17  = 35; 
-			System.UInt32  ui18 = 35; 
-			System.Int64   i19  = 35; 
-			System.UInt64  ui20 = 35; 
-			System.Int16   i21  = 35; 
-			System.UInt16  i22  = 35;
-
-            Assert.AreEqual(35, b1);
-            Assert.AreEqual(35, sb2);
-            Assert.AreEqual(35, d4);
-            Assert.AreEqual(35, d5);
-            Assert.AreEqual(35, f6);
-            Assert.AreEqual(35, i7);
-            Assert.AreEqual(35, u8);
-            Assert.AreEqual(35, l9);
-            Assert.AreEqual(35, s10);
-            Assert.AreEqual(35, us11);
-		
-			Assert.AreEqual( 35, b12  );
-			Assert.AreEqual( 35, sb13 );
-			Assert.AreEqual( 35, d14  );
-			Assert.AreEqual( 35, d15  );
-			Assert.AreEqual( 35, s16  );
-			Assert.AreEqual( 35, i17  );
-			Assert.AreEqual( 35, ui18 );
-			Assert.AreEqual( 35, i19  );
-			Assert.AreEqual( 35, ui20 );
-			Assert.AreEqual( 35, i21  );
-			Assert.AreEqual( 35, i22  );
-
-#if CLR_2_0 || CLR_4_0
-            byte? b23 = 35;
-            sbyte? sb24 = 35;
-            decimal? d25 = 35;
-            double? d26 = 35;
-            float? f27 = 35;
-            int? i28 = 35;
-            uint? u29 = 35;
-            long? l30 = 35;
-            short? s31 = 35;
-            ushort? us32 = 35;
-
-            Assert.AreEqual(35, b23);
-            Assert.AreEqual(35, sb24);
-            Assert.AreEqual(35, d25);
-            Assert.AreEqual(35, d26);
-            Assert.AreEqual(35, f27);
-            Assert.AreEqual(35, i28);
-            Assert.AreEqual(35, u29);
-            Assert.AreEqual(35, l30);
-            Assert.AreEqual(35, s31);
-            Assert.AreEqual(35, us32);
-#endif
-        }
-
-		[Test]
-		public void EnumsEqual()
-		{
-			MyEnum actual = MyEnum.a;
-			Assert.AreEqual( MyEnum.a, actual );
-		}
-
-		[Test, ExpectedException( typeof(AssertionException) )]
-		public void EnumsNotEqual()
-		{
-			MyEnum actual = MyEnum.a;
-			expectedMessage =
-				"  Expected: c" + Environment.NewLine +
-				"  But was:  a" + Environment.NewLine;
-			Assert.AreEqual( MyEnum.c, actual );
-		}
-
-		[Test]
-		public void DateTimeEqual()
-		{
-			DateTime dt1 = new DateTime( 2005, 6, 1, 7, 0, 0 );
-			DateTime dt2 = new DateTime( 2005, 6, 1, 0, 0, 0 ) + TimeSpan.FromHours( 7.0 );
-			Assert.AreEqual( dt1, dt2 );
-		}
-
-		[Test, ExpectedException( typeof (AssertionException) )]
-		public void DateTimeNotEqual()
-		{
-			DateTime dt1 = new DateTime( 2005, 6, 1, 7, 0, 0 );
-			DateTime dt2 = new DateTime( 2005, 6, 1, 0, 0, 0 );
-			expectedMessage =
-				"  Expected: 2005-06-01 07:00:00.000" + Environment.NewLine +
-				"  But was:  2005-06-01 00:00:00.000" + Environment.NewLine;
-			Assert.AreEqual(dt1, dt2);
-		}
-
-		private enum MyEnum
-		{
-			a, b, c
-		}
-
-		[Test]
-		public void DoubleNotEqualMessageDisplaysAllDigits()
-		{
-			string message = "";
-
-			try
-			{
-				double d1 = 36.1;
-				double d2 = 36.099999999999994;
-				Assert.AreEqual( d1, d2 );
-			}
-			catch(AssertionException ex)
-			{
-				message = ex.Message;
-			}
-
-			if ( message == "" )
-				Assert.Fail( "Should have thrown an AssertionException" );
-
-            int i = message.IndexOf('3');
-			int j = message.IndexOf( 'd', i );
-			string expected = message.Substring( i, j - i + 1 );
-			i = message.IndexOf( '3', j );
-			j = message.IndexOf( 'd', i );
-			string actual = message.Substring( i , j - i + 1 );
-			Assert.AreNotEqual( expected, actual );
-		}
-
-		[Test]
-		public void FloatNotEqualMessageDisplaysAllDigits()
-		{
-			string message = "";
-
-			try
-			{
-				float f1 = 36.125F;
-				float f2 = 36.125004F;
-				Assert.AreEqual( f1, f2 );
-			}
-			catch(AssertionException ex)
-			{
-				message = ex.Message;
-			}
-
-			if ( message == "" )
-				Assert.Fail( "Should have thrown an AssertionException" );
-
-			int i = message.IndexOf( '3' );
-			int j = message.IndexOf( 'f', i );
-			string expected = message.Substring( i, j - i + 1 );
-			i = message.IndexOf( '3', j );
-			j = message.IndexOf( 'f', i );
-			string actual = message.Substring( i, j - i + 1 );
-			Assert.AreNotEqual( expected, actual );
-		}
-
-		[Test]
-		public void DoubleNotEqualMessageDisplaysTolerance()
-		{
-            string message = "";
-
-            try
-            {
-                double d1 = 0.15;
-                double d2 = 0.12;
-                double tol = 0.005;
-                Assert.AreEqual(d1, d2, tol);
-            }
-            catch (AssertionException ex)
-            {
-                message = ex.Message;
-            }
-
-            if (message == "")
-                Assert.Fail("Should have thrown an AssertionException");
-
-            StringAssert.Contains("+/- 0.005", message);
-        }
-
-		[Test]
-		public void FloatNotEqualMessageDisplaysTolerance()
-		{
-			string message = "";
-
-			try
-			{
-				float f1 = 0.15F;
-				float f2 = 0.12F;
-				float tol = 0.001F;
-				Assert.AreEqual( f1, f2, tol );
-			}
-			catch( AssertionException ex )
-			{
-				message = ex.Message;
-			}
-
-			if ( message == "" )
-				Assert.Fail( "Should have thrown an AssertionException" );
-
-			StringAssert.Contains( "+/- 0.001", message );
-		}
-
-        [Test]
-        public void DoubleNotEqualMessageDisplaysDefaultTolerance()
-        {
-            string message = "";
-            GlobalSettings.DefaultFloatingPointTolerance = 0.005d;
-
-            try
-            {
-                double d1 = 0.15;
-                double d2 = 0.12;
-                Assert.AreEqual(d1, d2);
-            }
-            catch (AssertionException ex)
-            {
-                message = ex.Message;
-            }
-            finally
-            {
-                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
-            }
-
-            if (message == "")
-                Assert.Fail("Should have thrown an AssertionException");
-
-            StringAssert.Contains("+/- 0.005", message);
-        }
-
-        [Test]
-        public void DoubleNotEqualWithNanDoesNotDisplayDefaultTolerance()
-        {
-            string message = "";
-            GlobalSettings.DefaultFloatingPointTolerance = 0.005d;
-
-            try
-            {
-                double d1 = double.NaN;
-                double d2 = 0.12;
-                Assert.AreEqual(d1, d2);
-            }
-            catch (AssertionException ex)
-            {
-                message = ex.Message;
-            }
-            finally
-            {
-                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
-            }
-
-            if (message == "")
-                Assert.Fail("Should have thrown an AssertionException");
-
-            Assert.That(message.IndexOf("+/-") == -1);
-        }
-
-        [Test]
-        public void DirectoryInfoEquality()
-        {
-            string path = Environment.CurrentDirectory;
-            DirectoryInfo dir1 = new DirectoryInfo(path);
-            DirectoryInfo dir2 = new DirectoryInfo(path);
-
-            Assert.AreEqual(dir1, dir2);
-        }
-
-        [Test]
-        public void DirectoryInfoEqualityIgnoresTrailingDirectorySeparator()
-        {
-            string path1 = Environment.CurrentDirectory;
-            string path2 = path1;
-            int length = path1.Length;
-
-            if (path1[length - 1] == Path.DirectorySeparatorChar)
-                path1 = path1.Substring(0, length - 1);
-            else
-                path1 += Path.DirectorySeparatorChar;
-
-            DirectoryInfo dir1 = new DirectoryInfo(path1);
-            DirectoryInfo dir2 = new DirectoryInfo(path2);
-
-            Assert.AreEqual(dir1, dir2);
-        }
-
-#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
+// ****************************************************************
+// 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.RegularExpressions;
+using System.Globalization;
+using System.IO;
+using System.Threading;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class EqualsFixture : MessageChecker
+	{
+		[Test]
+		public void Equals()
+		{
+			string nunitString = "Hello NUnit";
+			string expected = nunitString;
+			string actual = nunitString;
+
+			Assert.IsTrue(expected == actual);
+			Assert.AreEqual(expected, actual);
+		}
+
+		[Test]
+		public void EqualsNull() 
+		{
+			Assert.AreEqual(null, null);
+		}
+		
+		[Test]
+		public void Bug575936Int32Int64Comparison()
+		{
+			long l64 = 0;
+			int i32 = 0;
+			Assert.AreEqual(i32, l64);
+		}
+		
+		[Test]
+		public void IntegerLongComparison()
+		{
+			Assert.AreEqual(1, 1L);
+			Assert.AreEqual(1L, 1);
+		}
+
+		[Test]
+		public void IntegerEquals()
+		{
+			int val = 42;
+			Assert.AreEqual(val, 42);
+		}
+
+		
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void EqualsFail()
+		{
+			string junitString = "Goodbye JUnit";
+			string expected = "Hello NUnit";
+
+			expectedMessage =
+				"  Expected string length 11 but was 13. Strings differ at index 0." + Environment.NewLine +
+				"  Expected: \"Hello NUnit\"" + Environment.NewLine +
+				"  But was:  \"Goodbye JUnit\"" + Environment.NewLine +
+				"  -----------^" + Environment.NewLine;
+			Assert.AreEqual(expected, junitString);
+		}
+		
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void EqualsNaNFails() 
+		{
+			expectedMessage =
+				"  Expected: 1.234d +/- 0.0d" + Environment.NewLine +
+				"  But was:  NaN" + Environment.NewLine;
+			Assert.AreEqual(1.234, Double.NaN, 0.0);
+		}    
+
+
+		[Test]
+		[ExpectedException(typeof(AssertionException))]
+		public void NanEqualsFails() 
+		{
+			expectedMessage =
+				"  Expected: NaN" + Environment.NewLine +
+				"  But was:  1.234d" + Environment.NewLine;
+			Assert.AreEqual(Double.NaN, 1.234, 0.0);
+		}     
+		
+		[Test]
+		public void NanEqualsNaNSucceeds() 
+		{
+			Assert.AreEqual(Double.NaN, Double.NaN, 0.0);
+		}     
+
+		[Test]
+		public void NegInfinityEqualsInfinity() 
+		{
+			Assert.AreEqual(Double.NegativeInfinity, Double.NegativeInfinity, 0.0);
+		}
+
+		[Test]
+		public void PosInfinityEqualsInfinity() 
+		{
+			Assert.AreEqual(Double.PositiveInfinity, Double.PositiveInfinity, 0.0);
+		}
+		
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void PosInfinityNotEquals() 
+		{
+			expectedMessage =
+				"  Expected: Infinity" + Environment.NewLine +
+				"  But was:  1.23d" + Environment.NewLine;
+			Assert.AreEqual(Double.PositiveInfinity, 1.23, 0.0);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void PosInfinityNotEqualsNegInfinity() 
+		{
+			expectedMessage =
+				"  Expected: Infinity" + Environment.NewLine +
+				"  But was:  -Infinity" + Environment.NewLine;
+			Assert.AreEqual(Double.PositiveInfinity, Double.NegativeInfinity, 0.0);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]	
+		public void SinglePosInfinityNotEqualsNegInfinity() 
+		{
+			expectedMessage =
+				"  Expected: Infinity" + Environment.NewLine +
+				"  But was:  -Infinity" + Environment.NewLine;
+			Assert.AreEqual(float.PositiveInfinity, float.NegativeInfinity, (float)0.0);
+		}
+
+		[Test,ExpectedException(typeof(InvalidOperationException))]
+		public void EqualsThrowsException()
+		{
+			object o = new object();
+			Assert.Equals(o, o);
+		}
+
+		[Test,ExpectedException(typeof(InvalidOperationException))]
+		public void ReferenceEqualsThrowsException()
+		{
+			object o = new object();
+			Assert.ReferenceEquals(o, o);
+		}
+		
+		[Test]
+		public void Float() 
+		{
+			float val = (float)1.0;
+			float expected = val;
+			float actual = val;
+
+			Assert.IsTrue(expected == actual);
+			Assert.AreEqual(expected, actual, (float)0.0);
+		}
+
+		[Test]
+		public void Byte() 
+		{
+			byte val = 1;
+			byte expected = val;
+			byte actual = val;
+
+			Assert.IsTrue(expected == actual);
+			Assert.AreEqual(expected, actual);
+		}
+
+		[Test]
+		public void String() 
+		{
+			string s1 = "test";
+			string s2 = new System.Text.StringBuilder(s1).ToString();
+
+			Assert.IsTrue(s1.Equals(s2));
+			Assert.AreEqual(s1,s2);
+		}
+
+		[Test]
+		public void Short() 
+		{
+			short val = 1;
+			short expected = val;
+			short actual = val;
+
+			Assert.IsTrue(expected == actual);
+			Assert.AreEqual(expected, actual);
+		}
+
+		[Test]
+		public void Int() 
+		{
+			int val = 1;
+			int expected = val;
+			int actual = val;
+
+			Assert.IsTrue(expected == actual);
+			Assert.AreEqual(expected, actual);
+		}
+
+		[Test]
+		public void UInt() 
+		{
+			uint val = 1;
+			uint expected = val;
+			uint actual = val;
+
+			Assert.IsTrue(expected == actual);
+			Assert.AreEqual(expected, actual);
+		}
+
+		[Test]
+		public void Decimal() 
+		{
+			decimal expected = 100m;
+			decimal actual = 100.0m;
+			int integer = 100;
+
+			Assert.IsTrue( expected == actual );
+			Assert.AreEqual(expected, actual);
+			Assert.IsTrue(expected == integer);
+			Assert.AreEqual(expected, integer);
+			Assert.IsTrue(actual == integer);
+			Assert.AreEqual(actual, integer);
+		}
+
+
+		
+		/// <summary>
+		/// Checks to see that a value comparison works with all types.
+		/// Current version has problems when value is the same but the
+		/// types are different...C# is not like Java, and doesn't automatically
+		/// perform value type conversion to simplify this type of comparison.
+		/// 
+		/// Related to Bug575936Int32Int64Comparison, but covers all numeric
+		/// types.
+		/// </summary>
+		[Test]
+		public void EqualsSameTypes()
+		{
+			byte      b1 = 35;
+			sbyte    sb2 = 35;
+			decimal   d4 = 35;
+			double    d5 = 35;
+			float     f6 = 35;
+			int       i7 = 35;
+			uint      u8 = 35;
+			long      l9 = 35;
+			short    s10 = 35;
+			ushort  us11 = 35;
+		
+			System.Byte    b12  = 35;  
+			System.SByte   sb13 = 35; 
+			System.Decimal d14  = 35; 
+			System.Double  d15  = 35; 
+			System.Single  s16  = 35; 
+			System.Int32   i17  = 35; 
+			System.UInt32  ui18 = 35; 
+			System.Int64   i19  = 35; 
+			System.UInt64  ui20 = 35; 
+			System.Int16   i21  = 35; 
+			System.UInt16  i22  = 35;
+
+            Assert.AreEqual(35, b1);
+            Assert.AreEqual(35, sb2);
+            Assert.AreEqual(35, d4);
+            Assert.AreEqual(35, d5);
+            Assert.AreEqual(35, f6);
+            Assert.AreEqual(35, i7);
+            Assert.AreEqual(35, u8);
+            Assert.AreEqual(35, l9);
+            Assert.AreEqual(35, s10);
+            Assert.AreEqual(35, us11);
+		
+			Assert.AreEqual( 35, b12  );
+			Assert.AreEqual( 35, sb13 );
+			Assert.AreEqual( 35, d14  );
+			Assert.AreEqual( 35, d15  );
+			Assert.AreEqual( 35, s16  );
+			Assert.AreEqual( 35, i17  );
+			Assert.AreEqual( 35, ui18 );
+			Assert.AreEqual( 35, i19  );
+			Assert.AreEqual( 35, ui20 );
+			Assert.AreEqual( 35, i21  );
+			Assert.AreEqual( 35, i22  );
+
+#if CLR_2_0 || CLR_4_0
+            byte? b23 = 35;
+            sbyte? sb24 = 35;
+            decimal? d25 = 35;
+            double? d26 = 35;
+            float? f27 = 35;
+            int? i28 = 35;
+            uint? u29 = 35;
+            long? l30 = 35;
+            short? s31 = 35;
+            ushort? us32 = 35;
+
+            Assert.AreEqual(35, b23);
+            Assert.AreEqual(35, sb24);
+            Assert.AreEqual(35, d25);
+            Assert.AreEqual(35, d26);
+            Assert.AreEqual(35, f27);
+            Assert.AreEqual(35, i28);
+            Assert.AreEqual(35, u29);
+            Assert.AreEqual(35, l30);
+            Assert.AreEqual(35, s31);
+            Assert.AreEqual(35, us32);
+#endif
+        }
+
+		[Test]
+		public void EnumsEqual()
+		{
+			MyEnum actual = MyEnum.a;
+			Assert.AreEqual( MyEnum.a, actual );
+		}
+
+		[Test, ExpectedException( typeof(AssertionException) )]
+		public void EnumsNotEqual()
+		{
+			MyEnum actual = MyEnum.a;
+			expectedMessage =
+				"  Expected: c" + Environment.NewLine +
+				"  But was:  a" + Environment.NewLine;
+			Assert.AreEqual( MyEnum.c, actual );
+		}
+
+		[Test]
+		public void DateTimeEqual()
+		{
+			DateTime dt1 = new DateTime( 2005, 6, 1, 7, 0, 0 );
+			DateTime dt2 = new DateTime( 2005, 6, 1, 0, 0, 0 ) + TimeSpan.FromHours( 7.0 );
+			Assert.AreEqual( dt1, dt2 );
+		}
+
+		[Test, ExpectedException( typeof (AssertionException) )]
+		public void DateTimeNotEqual()
+		{
+			DateTime dt1 = new DateTime( 2005, 6, 1, 7, 0, 0 );
+			DateTime dt2 = new DateTime( 2005, 6, 1, 0, 0, 0 );
+			expectedMessage =
+				"  Expected: 2005-06-01 07:00:00.000" + Environment.NewLine +
+				"  But was:  2005-06-01 00:00:00.000" + Environment.NewLine;
+			Assert.AreEqual(dt1, dt2);
+		}
+
+		private enum MyEnum
+		{
+			a, b, c
+		}
+
+		[Test]
+		public void DoubleNotEqualMessageDisplaysAllDigits()
+		{
+			string message = "";
+
+			try
+			{
+				double d1 = 36.1;
+				double d2 = 36.099999999999994;
+				Assert.AreEqual( d1, d2 );
+			}
+			catch(AssertionException ex)
+			{
+				message = ex.Message;
+			}
+
+			if ( message == "" )
+				Assert.Fail( "Should have thrown an AssertionException" );
+
+            int i = message.IndexOf('3');
+			int j = message.IndexOf( 'd', i );
+			string expected = message.Substring( i, j - i + 1 );
+			i = message.IndexOf( '3', j );
+			j = message.IndexOf( 'd', i );
+			string actual = message.Substring( i , j - i + 1 );
+			Assert.AreNotEqual( expected, actual );
+		}
+
+		[Test]
+		public void FloatNotEqualMessageDisplaysAllDigits()
+		{
+			string message = "";
+
+			try
+			{
+				float f1 = 36.125F;
+				float f2 = 36.125004F;
+				Assert.AreEqual( f1, f2 );
+			}
+			catch(AssertionException ex)
+			{
+				message = ex.Message;
+			}
+
+			if ( message == "" )
+				Assert.Fail( "Should have thrown an AssertionException" );
+
+			int i = message.IndexOf( '3' );
+			int j = message.IndexOf( 'f', i );
+			string expected = message.Substring( i, j - i + 1 );
+			i = message.IndexOf( '3', j );
+			j = message.IndexOf( 'f', i );
+			string actual = message.Substring( i, j - i + 1 );
+			Assert.AreNotEqual( expected, actual );
+		}
+
+		[Test]
+		public void DoubleNotEqualMessageDisplaysTolerance()
+		{
+            string message = "";
+
+            try
+            {
+                double d1 = 0.15;
+                double d2 = 0.12;
+                double tol = 0.005;
+                Assert.AreEqual(d1, d2, tol);
+            }
+            catch (AssertionException ex)
+            {
+                message = ex.Message;
+            }
+
+            if (message == "")
+                Assert.Fail("Should have thrown an AssertionException");
+
+            StringAssert.Contains("+/- 0.005", message);
+        }
+
+		[Test]
+		public void FloatNotEqualMessageDisplaysTolerance()
+		{
+			string message = "";
+
+			try
+			{
+				float f1 = 0.15F;
+				float f2 = 0.12F;
+				float tol = 0.001F;
+				Assert.AreEqual( f1, f2, tol );
+			}
+			catch( AssertionException ex )
+			{
+				message = ex.Message;
+			}
+
+			if ( message == "" )
+				Assert.Fail( "Should have thrown an AssertionException" );
+
+			StringAssert.Contains( "+/- 0.001", message );
+		}
+
+        [Test]
+        public void DoubleNotEqualMessageDisplaysDefaultTolerance()
+        {
+            string message = "";
+            GlobalSettings.DefaultFloatingPointTolerance = 0.005d;
+
+            try
+            {
+                double d1 = 0.15;
+                double d2 = 0.12;
+                Assert.AreEqual(d1, d2);
+            }
+            catch (AssertionException ex)
+            {
+                message = ex.Message;
+            }
+            finally
+            {
+                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
+            }
+
+            if (message == "")
+                Assert.Fail("Should have thrown an AssertionException");
+
+            StringAssert.Contains("+/- 0.005", message);
+        }
+
+        [Test]
+        public void DoubleNotEqualWithNanDoesNotDisplayDefaultTolerance()
+        {
+            string message = "";
+            GlobalSettings.DefaultFloatingPointTolerance = 0.005d;
+
+            try
+            {
+                double d1 = double.NaN;
+                double d2 = 0.12;
+                Assert.AreEqual(d1, d2);
+            }
+            catch (AssertionException ex)
+            {
+                message = ex.Message;
+            }
+            finally
+            {
+                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
+            }
+
+            if (message == "")
+                Assert.Fail("Should have thrown an AssertionException");
+
+            Assert.That(message.IndexOf("+/-") == -1);
+        }
+
+        [Test]
+        public void DirectoryInfoEquality()
+        {
+            string path = Environment.CurrentDirectory;
+            DirectoryInfo dir1 = new DirectoryInfo(path);
+            DirectoryInfo dir2 = new DirectoryInfo(path);
+
+            Assert.AreEqual(dir1, dir2);
+        }
+
+        [Test]
+        public void DirectoryInfoEqualityIgnoresTrailingDirectorySeparator()
+        {
+            string path1 = Environment.CurrentDirectory;
+            string path2 = path1;
+            int length = path1.Length;
+
+            if (path1[length - 1] == Path.DirectorySeparatorChar)
+                path1 = path1.Substring(0, length - 1);
+            else
+                path1 += Path.DirectorySeparatorChar;
+
+            DirectoryInfo dir1 = new DirectoryInfo(path1);
+            DirectoryInfo dir2 = new DirectoryInfo(path2);
+
+            Assert.AreEqual(dir1, dir2);
+        }
+
+#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 2b12bc5..f5103f8 100644
--- a/src/NUnitFramework/tests/FileAssertTests.cs
+++ b/src/NUnitFramework/tests/FileAssertTests.cs
@@ -1,441 +1,441 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.IO;
-using System.Reflection;
-using System.Net.Sockets;
-
-namespace NUnit.Framework.Tests
-{
-    #region Nested TestFile Utility Class
-    public class TestFile : IDisposable
-	{
-		private bool _disposedValue = false;
-		private string _resourceName;
-		private string _fileName;
-
-		public TestFile(string fileName, string resourceName)
-		{
-			_resourceName = "NUnit.Framework.Tests.data." + resourceName;
-            _fileName = Path.Combine(Path.GetTempPath(), fileName);
-
-			Assembly a = Assembly.GetExecutingAssembly();
-			using (Stream s = a.GetManifestResourceStream(_resourceName))
-			{
-				if (s == null) throw new Exception("Manifest Resource Stream " + _resourceName + " was not found.");
-
-				byte[] buffer = new byte[1024];
-				using (FileStream fs = File.Create(_fileName))
-				{
-					while(true)
-					{
-						int count = s.Read(buffer, 0, buffer.Length);
-						if(count == 0) break;
-						fs.Write(buffer, 0, count);
-					}
-				}
-			}
-		}
-
-        public string FileName
-        {
-            get { return _fileName; }
-        }
-
-		protected virtual void Dispose(bool disposing)
-		{
-			if (!this._disposedValue)
-			{
-				if (disposing)
-				{
-					if(File.Exists(_fileName))
-					{
-						File.Delete(_fileName);
-					}
-				}
-			}
-			this._disposedValue = true;
-		}
-
-		#region IDisposable Members
-
-		public void Dispose()
-		{
-			// Do not change this code.  Put cleanup code in Dispose(bool disposing) above.
-			Dispose(true);
-			GC.SuppressFinalize(this);
-		}
-
-		#endregion
-    }
-    #endregion
-
-    /// <summary>
-	/// Summary description for FileAssertTests.
-	/// </summary>
-	[TestFixture]
-	public class FileAssertTests : MessageChecker
-	{
-		#region AreEqual
-
-		#region Success Tests
-		[Test]
-		public void AreEqualPassesWhenBothAreNull()
-		{
-			FileStream expected = null;
-			FileStream actual = null;
-			FileAssert.AreEqual( expected, actual );
-		}
-
-        [Test]
-        public void AreEqualPassesWithSameStream()
-        {
-            Stream exampleStream = new MemoryStream(new byte[] { 1, 2, 3 });
-            Assert.That(exampleStream, Is.EqualTo(exampleStream));
-        }
-
-        [Test]
-        public void AreEqualPassesWithEqualStreams()
-        {
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
-            {
-                using (FileStream expected = File.OpenRead(tf1.FileName))
-                {
-                    using (FileStream actual = File.OpenRead(tf2.FileName))
-                    {
-                        FileAssert.AreEqual(expected, actual);
-                    }
-                }
-            }
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "not readable", MatchType = MessageMatch.Contains)]
-        public void NonReadableStreamGivesException()
-        {
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
-            {
-                using (FileStream expected = File.OpenRead(tf1.FileName))
-                {
-                    using (FileStream actual = File.OpenWrite(tf2.FileName))
-                    {
-                        FileAssert.AreEqual(expected, actual);
-                    }
-                }
-            }
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException),
-            ExpectedMessage = "not seekable", MatchType = MessageMatch.Contains)]
-        public void NonSeekableStreamGivesException()
-        {
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-            {
-                using (FileStream expected = File.OpenRead(tf1.FileName))
-                {
-                    using (FakeStream actual = new FakeStream())
-                    {
-                        FileAssert.AreEqual(expected, actual);
-                    }
-                }
-            }
-        }
-
-        private class FakeStream : MemoryStream
-        {
-            public override bool CanSeek
-            {
-                get { return false; }
-            }
-        }
-
-        [Test]
-		public void AreEqualPassesWithFiles()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
-			{
-				FileAssert.AreEqual( tf1.FileName, tf2.FileName, "Failed using file names" );
-			}
-		}
-
-		[Test]
-		public void AreEqualPassesUsingSameFileTwice()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-				FileAssert.AreEqual( tf1.FileName, tf1.FileName );
-			}
-		}
-
-		[Test]
-		public void AreEqualPassesWithFileInfos()
-		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
-			using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
-			{
-				FileInfo expected = new FileInfo( tf1.FileName );
-				FileInfo actual = new FileInfo( tf2.FileName );
-				FileAssert.AreEqual( expected, actual );
-				FileAssert.AreEqual( expected, actual );
-			}
-		}
-
-		[Test]
-		public void AreEqualPassesWithTextFiles()
-		{
-			using(TestFile tf1 = new TestFile("Test1.txt","TestText1.txt"))
-			{
-				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
-				{
-					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
-				}
-			}
-		}
-		#endregion
-
-		#region Failure Tests
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreEqualFailsWhenOneIsNull()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-				using(FileStream expected = File.OpenRead(tf1.FileName))
-				{
-					expectedMessage = 
-						"  Expected: <System.IO.FileStream>" + Environment.NewLine +
-						"  But was:  null" + Environment.NewLine;
-					FileAssert.AreEqual( expected, null );
-				}
-			}
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreEqualFailsWithStreams()
-		{
-			string expectedFile = "Test1.jpg";
-			string actualFile = "Test2.jpg";
-            using (TestFile tf1 = new TestFile(expectedFile, "TestImage1.jpg"))
-			{
-                using (TestFile tf2 = new TestFile(actualFile, "TestImage2.jpg"))
-				{
-					using(FileStream expected = File.OpenRead(tf1.FileName))
-					{
-						using(FileStream actual = File.OpenRead(tf2.FileName))
-						{
-							expectedMessage =
-								string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
-									new FileInfo(tf1.FileName).Length, new FileInfo(tf2.FileName).Length);
-							FileAssert.AreEqual( tf1.FileName, tf2.FileName);
-						}
-					}
-				}
-			}
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreEqualFailsWithFileInfos()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.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);
-					FileAssert.AreEqual( expected, actual );
-				}
-			}
-		}
-
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreEqualFailsWithFiles()
-		{
-			string expected = "Test1.jpg";
-			string actual = "Test2.jpg";
-            using (TestFile tf1 = new TestFile(expected, "TestImage1.jpg"))
-			{
-                using (TestFile tf2 = new TestFile(actual, "TestImage2.jpg"))
-				{
-					expectedMessage =
-						string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
-							new FileInfo(tf1.FileName).Length, new FileInfo(tf2.FileName).Length);
-					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
-				}
-			}
-		}
-
-		[Test]
-        [ExpectedException(typeof(AssertionException), 
-            ExpectedMessage="Stream lengths are both",
-            MatchType=MessageMatch.Contains)]
-		public void AreEqualFailsWithTextFilesAfterReadingBothFiles()
-		{
-            using (TestFile tf1 = new TestFile("Test1.txt", "TestText1.txt"))
-			{
-                using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
-				{
-					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
-				}
-			}
-		}
-		#endregion
-
-		#endregion
-
-		#region AreNotEqual
-
-		#region Success Tests
-		[Test]
-		public void AreNotEqualPassesIfOneIsNull()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-				using(FileStream expected = File.OpenRead(tf1.FileName))
-				{
-					FileAssert.AreNotEqual( expected, null );
-				}
-			}
-		}
-
-		[Test]
-		public void AreNotEqualPassesWithStreams()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
-				{
-					using(FileStream expected = File.OpenRead(tf1.FileName))
-					{
-						using(FileStream actual = File.OpenRead(tf2.FileName))
-						{
-							FileAssert.AreNotEqual( expected, actual);
-						}
-					}
-				}
-			}
-		}
-
-		[Test]
-		public void AreNotEqualPassesWithFiles()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
-				{
-					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
-				}
-			}
-		}
-
-		[Test]
-		public void AreNotEqualPassesWithFileInfos()
-		{
-            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
-			{
-                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
-				{
-					FileInfo expected = new FileInfo( tf1.FileName );
-					FileInfo actual = new FileInfo( tf2.FileName );
-					FileAssert.AreNotEqual( expected, actual );
-				}
-			}
-		}
-
-		[Test]
-		public void AreNotEqualIteratesOverTheEntireFile()
-		{
-            using (TestFile tf1 = new TestFile("Test1.txt", "TestText1.txt"))
-			{
-                using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
-				{
-					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
-				}
-			}
-		}
-		#endregion
-
-		#region Failure Tests
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void AreNotEqualFailsWhenBothAreNull()
-		{
-			FileStream expected = null;
-			FileStream actual = null;
-			expectedMessage =
-				"  Expected: not null" + Environment.NewLine +
-				"  But was:  null" + Environment.NewLine;
-			FileAssert.AreNotEqual( expected, actual );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreNotEqualFailsWithStreams()
-		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
-			using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
-			using(FileStream expected = File.OpenRead(tf1.FileName))
-			using(FileStream actual = File.OpenRead(tf2.FileName))
-			{
-				expectedMessage = 
-					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
-					"  But was:  <System.IO.FileStream>" + Environment.NewLine;
-				FileAssert.AreNotEqual( expected, actual );
-			}
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreNotEqualFailsWithFileInfos()
-		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
-			{
-				using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.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;
-					FileAssert.AreNotEqual( expected, actual );
-				}
-			}
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreNotEqualFailsWithFiles()
-		{
-			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
-			{
-				expectedMessage = 
-					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
-					"  But was:  <System.IO.FileStream>" + Environment.NewLine;
-				FileAssert.AreNotEqual( tf1.FileName, tf1.FileName );
-			}
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void AreNotEqualIteratesOverTheEntireFileAndFails()
-		{
-			using(TestFile tf1 = new TestFile("Test1.txt","TestText1.txt"))
-			{
-				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
-				{
-					expectedMessage = 
-						"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
-						"  But was:  <System.IO.FileStream>" + Environment.NewLine;
-					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
-				}
-			}
-		}
-		#endregion
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Net.Sockets;
+
+namespace NUnit.Framework.Tests
+{
+    #region Nested TestFile Utility Class
+    public class TestFile : IDisposable
+	{
+		private bool _disposedValue = false;
+		private string _resourceName;
+		private string _fileName;
+
+		public TestFile(string fileName, string resourceName)
+		{
+			_resourceName = "NUnit.Framework.Tests.data." + resourceName;
+            _fileName = Path.Combine(Path.GetTempPath(), fileName);
+
+			Assembly a = Assembly.GetExecutingAssembly();
+			using (Stream s = a.GetManifestResourceStream(_resourceName))
+			{
+				if (s == null) throw new Exception("Manifest Resource Stream " + _resourceName + " was not found.");
+
+				byte[] buffer = new byte[1024];
+				using (FileStream fs = File.Create(_fileName))
+				{
+					while(true)
+					{
+						int count = s.Read(buffer, 0, buffer.Length);
+						if(count == 0) break;
+						fs.Write(buffer, 0, count);
+					}
+				}
+			}
+		}
+
+        public string FileName
+        {
+            get { return _fileName; }
+        }
+
+		protected virtual void Dispose(bool disposing)
+		{
+			if (!this._disposedValue)
+			{
+				if (disposing)
+				{
+					if(File.Exists(_fileName))
+					{
+						File.Delete(_fileName);
+					}
+				}
+			}
+			this._disposedValue = true;
+		}
+
+		#region IDisposable Members
+
+		public void Dispose()
+		{
+			// Do not change this code.  Put cleanup code in Dispose(bool disposing) above.
+			Dispose(true);
+			GC.SuppressFinalize(this);
+		}
+
+		#endregion
+    }
+    #endregion
+
+    /// <summary>
+	/// Summary description for FileAssertTests.
+	/// </summary>
+	[TestFixture]
+	public class FileAssertTests : MessageChecker
+	{
+		#region AreEqual
+
+		#region Success Tests
+		[Test]
+		public void AreEqualPassesWhenBothAreNull()
+		{
+			FileStream expected = null;
+			FileStream actual = null;
+			FileAssert.AreEqual( expected, actual );
+		}
+
+        [Test]
+        public void AreEqualPassesWithSameStream()
+        {
+            Stream exampleStream = new MemoryStream(new byte[] { 1, 2, 3 });
+            Assert.That(exampleStream, Is.EqualTo(exampleStream));
+        }
+
+        [Test]
+        public void AreEqualPassesWithEqualStreams()
+        {
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
+            {
+                using (FileStream expected = File.OpenRead(tf1.FileName))
+                {
+                    using (FileStream actual = File.OpenRead(tf2.FileName))
+                    {
+                        FileAssert.AreEqual(expected, actual);
+                    }
+                }
+            }
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "not readable", MatchType = MessageMatch.Contains)]
+        public void NonReadableStreamGivesException()
+        {
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
+            {
+                using (FileStream expected = File.OpenRead(tf1.FileName))
+                {
+                    using (FileStream actual = File.OpenWrite(tf2.FileName))
+                    {
+                        FileAssert.AreEqual(expected, actual);
+                    }
+                }
+            }
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException),
+            ExpectedMessage = "not seekable", MatchType = MessageMatch.Contains)]
+        public void NonSeekableStreamGivesException()
+        {
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            {
+                using (FileStream expected = File.OpenRead(tf1.FileName))
+                {
+                    using (FakeStream actual = new FakeStream())
+                    {
+                        FileAssert.AreEqual(expected, actual);
+                    }
+                }
+            }
+        }
+
+        private class FakeStream : MemoryStream
+        {
+            public override bool CanSeek
+            {
+                get { return false; }
+            }
+        }
+
+        [Test]
+		public void AreEqualPassesWithFiles()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+            using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage1.jpg"))
+			{
+				FileAssert.AreEqual( tf1.FileName, tf2.FileName, "Failed using file names" );
+			}
+		}
+
+		[Test]
+		public void AreEqualPassesUsingSameFileTwice()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+				FileAssert.AreEqual( tf1.FileName, tf1.FileName );
+			}
+		}
+
+		[Test]
+		public void AreEqualPassesWithFileInfos()
+		{
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
+			using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
+			{
+				FileInfo expected = new FileInfo( tf1.FileName );
+				FileInfo actual = new FileInfo( tf2.FileName );
+				FileAssert.AreEqual( expected, actual );
+				FileAssert.AreEqual( expected, actual );
+			}
+		}
+
+		[Test]
+		public void AreEqualPassesWithTextFiles()
+		{
+			using(TestFile tf1 = new TestFile("Test1.txt","TestText1.txt"))
+			{
+				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
+				{
+					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
+				}
+			}
+		}
+		#endregion
+
+		#region Failure Tests
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreEqualFailsWhenOneIsNull()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+				using(FileStream expected = File.OpenRead(tf1.FileName))
+				{
+					expectedMessage = 
+						"  Expected: <System.IO.FileStream>" + Environment.NewLine +
+						"  But was:  null" + Environment.NewLine;
+					FileAssert.AreEqual( expected, null );
+				}
+			}
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreEqualFailsWithStreams()
+		{
+			string expectedFile = "Test1.jpg";
+			string actualFile = "Test2.jpg";
+            using (TestFile tf1 = new TestFile(expectedFile, "TestImage1.jpg"))
+			{
+                using (TestFile tf2 = new TestFile(actualFile, "TestImage2.jpg"))
+				{
+					using(FileStream expected = File.OpenRead(tf1.FileName))
+					{
+						using(FileStream actual = File.OpenRead(tf2.FileName))
+						{
+							expectedMessage =
+								string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
+									new FileInfo(tf1.FileName).Length, new FileInfo(tf2.FileName).Length);
+							FileAssert.AreEqual( tf1.FileName, tf2.FileName);
+						}
+					}
+				}
+			}
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreEqualFailsWithFileInfos()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.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);
+					FileAssert.AreEqual( expected, actual );
+				}
+			}
+		}
+
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreEqualFailsWithFiles()
+		{
+			string expected = "Test1.jpg";
+			string actual = "Test2.jpg";
+            using (TestFile tf1 = new TestFile(expected, "TestImage1.jpg"))
+			{
+                using (TestFile tf2 = new TestFile(actual, "TestImage2.jpg"))
+				{
+					expectedMessage =
+						string.Format("  Expected Stream length {0} but was {1}." + Environment.NewLine,
+							new FileInfo(tf1.FileName).Length, new FileInfo(tf2.FileName).Length);
+					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
+				}
+			}
+		}
+
+		[Test]
+        [ExpectedException(typeof(AssertionException), 
+            ExpectedMessage="Stream lengths are both",
+            MatchType=MessageMatch.Contains)]
+		public void AreEqualFailsWithTextFilesAfterReadingBothFiles()
+		{
+            using (TestFile tf1 = new TestFile("Test1.txt", "TestText1.txt"))
+			{
+                using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
+				{
+					FileAssert.AreEqual( tf1.FileName, tf2.FileName );
+				}
+			}
+		}
+		#endregion
+
+		#endregion
+
+		#region AreNotEqual
+
+		#region Success Tests
+		[Test]
+		public void AreNotEqualPassesIfOneIsNull()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+				using(FileStream expected = File.OpenRead(tf1.FileName))
+				{
+					FileAssert.AreNotEqual( expected, null );
+				}
+			}
+		}
+
+		[Test]
+		public void AreNotEqualPassesWithStreams()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
+				{
+					using(FileStream expected = File.OpenRead(tf1.FileName))
+					{
+						using(FileStream actual = File.OpenRead(tf2.FileName))
+						{
+							FileAssert.AreNotEqual( expected, actual);
+						}
+					}
+				}
+			}
+		}
+
+		[Test]
+		public void AreNotEqualPassesWithFiles()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
+				{
+					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
+				}
+			}
+		}
+
+		[Test]
+		public void AreNotEqualPassesWithFileInfos()
+		{
+            using (TestFile tf1 = new TestFile("Test1.jpg", "TestImage1.jpg"))
+			{
+                using (TestFile tf2 = new TestFile("Test2.jpg", "TestImage2.jpg"))
+				{
+					FileInfo expected = new FileInfo( tf1.FileName );
+					FileInfo actual = new FileInfo( tf2.FileName );
+					FileAssert.AreNotEqual( expected, actual );
+				}
+			}
+		}
+
+		[Test]
+		public void AreNotEqualIteratesOverTheEntireFile()
+		{
+            using (TestFile tf1 = new TestFile("Test1.txt", "TestText1.txt"))
+			{
+                using (TestFile tf2 = new TestFile("Test2.txt", "TestText2.txt"))
+				{
+					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
+				}
+			}
+		}
+		#endregion
+
+		#region Failure Tests
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void AreNotEqualFailsWhenBothAreNull()
+		{
+			FileStream expected = null;
+			FileStream actual = null;
+			expectedMessage =
+				"  Expected: not null" + Environment.NewLine +
+				"  But was:  null" + Environment.NewLine;
+			FileAssert.AreNotEqual( expected, actual );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreNotEqualFailsWithStreams()
+		{
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
+			using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.jpg"))
+			using(FileStream expected = File.OpenRead(tf1.FileName))
+			using(FileStream actual = File.OpenRead(tf2.FileName))
+			{
+				expectedMessage = 
+					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
+					"  But was:  <System.IO.FileStream>" + Environment.NewLine;
+				FileAssert.AreNotEqual( expected, actual );
+			}
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreNotEqualFailsWithFileInfos()
+		{
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
+			{
+				using(TestFile tf2 = new TestFile("Test2.jpg","TestImage1.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;
+					FileAssert.AreNotEqual( expected, actual );
+				}
+			}
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreNotEqualFailsWithFiles()
+		{
+			using(TestFile tf1 = new TestFile("Test1.jpg","TestImage1.jpg"))
+			{
+				expectedMessage = 
+					"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
+					"  But was:  <System.IO.FileStream>" + Environment.NewLine;
+				FileAssert.AreNotEqual( tf1.FileName, tf1.FileName );
+			}
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void AreNotEqualIteratesOverTheEntireFileAndFails()
+		{
+			using(TestFile tf1 = new TestFile("Test1.txt","TestText1.txt"))
+			{
+				using(TestFile tf2 = new TestFile("Test2.txt","TestText1.txt"))
+				{
+					expectedMessage = 
+						"  Expected: not <System.IO.FileStream>" + Environment.NewLine +
+						"  But was:  <System.IO.FileStream>" + Environment.NewLine;
+					FileAssert.AreNotEqual( tf1.FileName, tf2.FileName );
+				}
+			}
+		}
+		#endregion
+
+		#endregion
+	}
+}
diff --git a/src/NUnitFramework/tests/GreaterEqualFixture.cs b/src/NUnitFramework/tests/GreaterEqualFixture.cs
index bf2dbb5..a7a1d7d 100644
--- a/src/NUnitFramework/tests/GreaterEqualFixture.cs
+++ b/src/NUnitFramework/tests/GreaterEqualFixture.cs
@@ -1,170 +1,170 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-    [TestFixture]
-    public class GreaterEqualFixture : MessageChecker
-    {
-        private readonly int i1 = 5;
-        private readonly int i2 = 4;
-		private readonly uint u1 = 12345879;
-		private readonly uint u2 = 12345678;
-		private readonly long l1 = 12345879;
-		private readonly long l2 = 12345678;
-		private readonly ulong ul1 = 12345879;
-		private readonly ulong ul2 = 12345678;
-		private readonly float f1 = 3.543F;
-        private readonly float f2 = 2.543F;
-        private readonly decimal de1 = 53.4M;
-        private readonly decimal de2 = 33.4M;
-        private readonly double d1 = 4.85948654;
-        private readonly double d2 = 1.0;
-        private readonly System.Enum e1 = System.Data.CommandType.TableDirect;
-        private readonly System.Enum e2 = System.Data.CommandType.StoredProcedure;
-
-		[Test]
-		public void GreaterOrEqual_Int32()
-		{
-			Assert.GreaterOrEqual(i1, i1);           
-			Assert.GreaterOrEqual(i1, i2);
-		}
-
-		[Test]
-		public void GreaterOrEqual_UInt32()
-		{
-			Assert.GreaterOrEqual(u1, u1);
-			Assert.GreaterOrEqual(u1, u2);
-		}
-
-		[Test]
-		public void GreaterOrEqual_Long()
-		{
-			Assert.GreaterOrEqual(l1, l1);
-			Assert.GreaterOrEqual(l1, l2);
-		}
-
-		[Test]
-		public void GreaterOrEqual_ULong()
-		{
-			Assert.GreaterOrEqual(ul1, ul1);
-			Assert.GreaterOrEqual(ul1, ul2);
-		}
-
-		[Test]
-		public void GreaterOrEqual_Double()
-		{
-			Assert.GreaterOrEqual(d1, d1, "double");
-			Assert.GreaterOrEqual(d1, d2, "double");
-		}
-
-		[Test]
-		public void GreaterOrEqual_Decimal()
-		{
-			Assert.GreaterOrEqual(de1, de1, "{0}", "decimal");
-			Assert.GreaterOrEqual(de1, de2, "{0}", "decimal");
-		}
-
-		[Test]
-		public void GreaterOrEqual_Float()
-		{
-			Assert.GreaterOrEqual(f1, f1, "float");
-			Assert.GreaterOrEqual(f1, f2, "float");
-		}
-
-		[Test]
-		public void MixedTypes()
-		{	
-			Assert.GreaterOrEqual( 5, 3L, "int to long");
-			Assert.GreaterOrEqual( 5, 3.5f, "int to float" );
-			Assert.GreaterOrEqual( 5, 3.5d, "int to double" );
-			Assert.GreaterOrEqual( 5, 3U, "int to uint" );
-			Assert.GreaterOrEqual( 5, 3UL, "int to ulong" );
-			Assert.GreaterOrEqual( 5, 3M, "int to decimal" );
-
-			Assert.GreaterOrEqual( 5L, 3, "long to int");
-			Assert.GreaterOrEqual( 5L, 3.5f, "long to float" );
-			Assert.GreaterOrEqual( 5L, 3.5d, "long to double" );
-			Assert.GreaterOrEqual( 5L, 3U, "long to uint" );
-			Assert.GreaterOrEqual( 5L, 3UL, "long to ulong" );
-			Assert.GreaterOrEqual( 5L, 3M, "long to decimal" );
-
-			Assert.GreaterOrEqual( 8.2f, 5, "float to int" );
-			Assert.GreaterOrEqual( 8.2f, 8L, "float to long" );
-			Assert.GreaterOrEqual( 8.2f, 3.5d, "float to double" );
-			Assert.GreaterOrEqual( 8.2f, 8U, "float to uint" );
-			Assert.GreaterOrEqual( 8.2f, 8UL, "float to ulong" );
-			Assert.GreaterOrEqual( 8.2f, 3.5M, "float to decimal" );
-
-			Assert.GreaterOrEqual( 8.2d, 5, "double to int" );
-			Assert.GreaterOrEqual( 8.2d, 5L, "double to long" );
-			Assert.GreaterOrEqual( 8.2d, 3.5f, "double to float" );
-			Assert.GreaterOrEqual( 8.2d, 8U, "double to uint" );
-			Assert.GreaterOrEqual( 8.2d, 8UL, "double to ulong" );
-			Assert.GreaterOrEqual( 8.2d, 3.5M, "double to decimal" );
-			
-
-			Assert.GreaterOrEqual( 5U, 3, "uint to int" );
-			Assert.GreaterOrEqual( 5U, 3L, "uint to long" );
-			Assert.GreaterOrEqual( 5U, 3.5f, "uint to float" );
-			Assert.GreaterOrEqual( 5U, 3.5d, "uint to double" );
-			Assert.GreaterOrEqual( 5U, 3UL, "uint to ulong" );
-			Assert.GreaterOrEqual( 5U, 3M, "uint to decimal" );
-			
-			Assert.GreaterOrEqual( 5ul, 3, "ulong to int" );
-			Assert.GreaterOrEqual( 5UL, 3L, "ulong to long" );
-			Assert.GreaterOrEqual( 5UL, 3.5f, "ulong to float" );
-			Assert.GreaterOrEqual( 5UL, 3.5d, "ulong to double" );
-			Assert.GreaterOrEqual( 5UL, 3U, "ulong to uint" );
-			Assert.GreaterOrEqual( 5UL, 3M, "ulong to decimal" );
-			
-			Assert.GreaterOrEqual( 5M, 3, "decimal to int" );
-			Assert.GreaterOrEqual( 5M, 3L, "decimal to long" );
-			Assert.GreaterOrEqual( 5M, 3.5f, "decimal to float" );
-			Assert.GreaterOrEqual( 5M, 3.5d, "decimal to double" );
-			Assert.GreaterOrEqual( 5M, 3U, "decimal to uint" );
-			Assert.GreaterOrEqual( 5M, 3UL, "decimal to ulong" );
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-        public void NotGreaterOrEqual()
-        {
-			expectedMessage =
-				"  Expected: greater than or equal to 5" + Environment.NewLine +
-				"  But was:  4" + Environment.NewLine;
-			Assert.GreaterOrEqual(i2, i1);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void NotGreaterEqualIComparable()
-        {
-			expectedMessage =
-				"  Expected: greater than or equal to TableDirect" + Environment.NewLine +
-				"  But was:  StoredProcedure" + Environment.NewLine;
-			Assert.GreaterOrEqual(e2, e1);
-        }
-
-        [Test]
-        public void FailureMessage()
-        {
-            string msg = null;
-
-            try
-            {
-                Assert.GreaterOrEqual(7, 99);
-            }
-            catch (AssertionException ex)
-            {
-                msg = ex.Message;
-            }
-
-            StringAssert.Contains( TextMessageWriter.Pfx_Expected + "greater than or equal to 99", msg);
-            StringAssert.Contains( TextMessageWriter.Pfx_Actual + "7", msg);
-		}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+    [TestFixture]
+    public class GreaterEqualFixture : MessageChecker
+    {
+        private readonly int i1 = 5;
+        private readonly int i2 = 4;
+		private readonly uint u1 = 12345879;
+		private readonly uint u2 = 12345678;
+		private readonly long l1 = 12345879;
+		private readonly long l2 = 12345678;
+		private readonly ulong ul1 = 12345879;
+		private readonly ulong ul2 = 12345678;
+		private readonly float f1 = 3.543F;
+        private readonly float f2 = 2.543F;
+        private readonly decimal de1 = 53.4M;
+        private readonly decimal de2 = 33.4M;
+        private readonly double d1 = 4.85948654;
+        private readonly double d2 = 1.0;
+        private readonly System.Enum e1 = System.Data.CommandType.TableDirect;
+        private readonly System.Enum e2 = System.Data.CommandType.StoredProcedure;
+
+		[Test]
+		public void GreaterOrEqual_Int32()
+		{
+			Assert.GreaterOrEqual(i1, i1);           
+			Assert.GreaterOrEqual(i1, i2);
+		}
+
+		[Test]
+		public void GreaterOrEqual_UInt32()
+		{
+			Assert.GreaterOrEqual(u1, u1);
+			Assert.GreaterOrEqual(u1, u2);
+		}
+
+		[Test]
+		public void GreaterOrEqual_Long()
+		{
+			Assert.GreaterOrEqual(l1, l1);
+			Assert.GreaterOrEqual(l1, l2);
+		}
+
+		[Test]
+		public void GreaterOrEqual_ULong()
+		{
+			Assert.GreaterOrEqual(ul1, ul1);
+			Assert.GreaterOrEqual(ul1, ul2);
+		}
+
+		[Test]
+		public void GreaterOrEqual_Double()
+		{
+			Assert.GreaterOrEqual(d1, d1, "double");
+			Assert.GreaterOrEqual(d1, d2, "double");
+		}
+
+		[Test]
+		public void GreaterOrEqual_Decimal()
+		{
+			Assert.GreaterOrEqual(de1, de1, "{0}", "decimal");
+			Assert.GreaterOrEqual(de1, de2, "{0}", "decimal");
+		}
+
+		[Test]
+		public void GreaterOrEqual_Float()
+		{
+			Assert.GreaterOrEqual(f1, f1, "float");
+			Assert.GreaterOrEqual(f1, f2, "float");
+		}
+
+		[Test]
+		public void MixedTypes()
+		{	
+			Assert.GreaterOrEqual( 5, 3L, "int to long");
+			Assert.GreaterOrEqual( 5, 3.5f, "int to float" );
+			Assert.GreaterOrEqual( 5, 3.5d, "int to double" );
+			Assert.GreaterOrEqual( 5, 3U, "int to uint" );
+			Assert.GreaterOrEqual( 5, 3UL, "int to ulong" );
+			Assert.GreaterOrEqual( 5, 3M, "int to decimal" );
+
+			Assert.GreaterOrEqual( 5L, 3, "long to int");
+			Assert.GreaterOrEqual( 5L, 3.5f, "long to float" );
+			Assert.GreaterOrEqual( 5L, 3.5d, "long to double" );
+			Assert.GreaterOrEqual( 5L, 3U, "long to uint" );
+			Assert.GreaterOrEqual( 5L, 3UL, "long to ulong" );
+			Assert.GreaterOrEqual( 5L, 3M, "long to decimal" );
+
+			Assert.GreaterOrEqual( 8.2f, 5, "float to int" );
+			Assert.GreaterOrEqual( 8.2f, 8L, "float to long" );
+			Assert.GreaterOrEqual( 8.2f, 3.5d, "float to double" );
+			Assert.GreaterOrEqual( 8.2f, 8U, "float to uint" );
+			Assert.GreaterOrEqual( 8.2f, 8UL, "float to ulong" );
+			Assert.GreaterOrEqual( 8.2f, 3.5M, "float to decimal" );
+
+			Assert.GreaterOrEqual( 8.2d, 5, "double to int" );
+			Assert.GreaterOrEqual( 8.2d, 5L, "double to long" );
+			Assert.GreaterOrEqual( 8.2d, 3.5f, "double to float" );
+			Assert.GreaterOrEqual( 8.2d, 8U, "double to uint" );
+			Assert.GreaterOrEqual( 8.2d, 8UL, "double to ulong" );
+			Assert.GreaterOrEqual( 8.2d, 3.5M, "double to decimal" );
+			
+
+			Assert.GreaterOrEqual( 5U, 3, "uint to int" );
+			Assert.GreaterOrEqual( 5U, 3L, "uint to long" );
+			Assert.GreaterOrEqual( 5U, 3.5f, "uint to float" );
+			Assert.GreaterOrEqual( 5U, 3.5d, "uint to double" );
+			Assert.GreaterOrEqual( 5U, 3UL, "uint to ulong" );
+			Assert.GreaterOrEqual( 5U, 3M, "uint to decimal" );
+			
+			Assert.GreaterOrEqual( 5ul, 3, "ulong to int" );
+			Assert.GreaterOrEqual( 5UL, 3L, "ulong to long" );
+			Assert.GreaterOrEqual( 5UL, 3.5f, "ulong to float" );
+			Assert.GreaterOrEqual( 5UL, 3.5d, "ulong to double" );
+			Assert.GreaterOrEqual( 5UL, 3U, "ulong to uint" );
+			Assert.GreaterOrEqual( 5UL, 3M, "ulong to decimal" );
+			
+			Assert.GreaterOrEqual( 5M, 3, "decimal to int" );
+			Assert.GreaterOrEqual( 5M, 3L, "decimal to long" );
+			Assert.GreaterOrEqual( 5M, 3.5f, "decimal to float" );
+			Assert.GreaterOrEqual( 5M, 3.5d, "decimal to double" );
+			Assert.GreaterOrEqual( 5M, 3U, "decimal to uint" );
+			Assert.GreaterOrEqual( 5M, 3UL, "decimal to ulong" );
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+        public void NotGreaterOrEqual()
+        {
+			expectedMessage =
+				"  Expected: greater than or equal to 5" + Environment.NewLine +
+				"  But was:  4" + Environment.NewLine;
+			Assert.GreaterOrEqual(i2, i1);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void NotGreaterEqualIComparable()
+        {
+			expectedMessage =
+				"  Expected: greater than or equal to TableDirect" + Environment.NewLine +
+				"  But was:  StoredProcedure" + Environment.NewLine;
+			Assert.GreaterOrEqual(e2, e1);
+        }
+
+        [Test]
+        public void FailureMessage()
+        {
+            string msg = null;
+
+            try
+            {
+                Assert.GreaterOrEqual(7, 99);
+            }
+            catch (AssertionException ex)
+            {
+                msg = ex.Message;
+            }
+
+            StringAssert.Contains( TextMessageWriter.Pfx_Expected + "greater than or equal to 99", msg);
+            StringAssert.Contains( TextMessageWriter.Pfx_Actual + "7", msg);
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/GreaterFixture.cs b/src/NUnitFramework/tests/GreaterFixture.cs
index a4fab10..0cf8434 100644
--- a/src/NUnitFramework/tests/GreaterFixture.cs
+++ b/src/NUnitFramework/tests/GreaterFixture.cs
@@ -1,135 +1,135 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class GreaterFixture : MessageChecker
-	{
-		private readonly int i1 = 5;
-		private readonly int i2 = 4;
-		private readonly uint u1 = 12345879;
-		private readonly uint u2 = 12345678;
-		private readonly long l1 = 12345879;
-		private readonly long l2 = 12345678;
-		private readonly ulong ul1 = 12345879;
-		private readonly ulong ul2 = 12345678;
-		private readonly float f1 = 3.543F;
-		private readonly float f2 = 2.543F;
-		private readonly decimal de1 = 53.4M;
-		private readonly decimal de2 = 33.4M;
-		private readonly double d1 = 4.85948654;
-		private readonly double d2 = 1.0;
-		private readonly System.Enum e1 = System.Data.CommandType.TableDirect;
-		private readonly System.Enum e2 = System.Data.CommandType.StoredProcedure;
-
-		[Test]
-		public void Greater()
-		{
-			Assert.Greater(i1,i2);
-			Assert.Greater(u1,u2);
-			Assert.Greater(l1,l2);
-			Assert.Greater(ul1,ul2);
-			Assert.Greater(d1,d2, "double");
-			Assert.Greater(de1,de2, "{0}", "decimal");
-			Assert.Greater(f1,f2, "float");
-		}
-
-		[Test]
-		public void MixedTypes()
-		{	
-			Assert.Greater( 5, 3L, "int to long");
-			Assert.Greater( 5, 3.5f, "int to float" );
-			Assert.Greater( 5, 3.5d, "int to double" );
-			Assert.Greater( 5, 3U, "int to uint" );
-			Assert.Greater( 5, 3UL, "int to ulong" );
-			Assert.Greater( 5, 3M, "int to decimal" );
-
-			Assert.Greater( 5L, 3, "long to int");
-			Assert.Greater( 5L, 3.5f, "long to float" );
-			Assert.Greater( 5L, 3.5d, "long to double" );
-			Assert.Greater( 5L, 3U, "long to uint" );
-			Assert.Greater( 5L, 3UL, "long to ulong" );
-			Assert.Greater( 5L, 3M, "long to decimal" );
-
-			Assert.Greater( 8.2f, 5, "float to int" );
-			Assert.Greater( 8.2f, 8L, "float to long" );
-			Assert.Greater( 8.2f, 3.5d, "float to double" );
-			Assert.Greater( 8.2f, 8U, "float to uint" );
-			Assert.Greater( 8.2f, 8UL, "float to ulong" );
-			Assert.Greater( 8.2f, 3.5M, "float to decimal" );
-
-			Assert.Greater( 8.2d, 5, "double to int" );
-			Assert.Greater( 8.2d, 5L, "double to long" );
-			Assert.Greater( 8.2d, 3.5f, "double to float" );
-			Assert.Greater( 8.2d, 8U, "double to uint" );
-			Assert.Greater( 8.2d, 8UL, "double to ulong" );
-			Assert.Greater( 8.2d, 3.5M, "double to decimal" );
-			
-
-			Assert.Greater( 5U, 3, "uint to int" );
-			Assert.Greater( 5U, 3L, "uint to long" );
-			Assert.Greater( 5U, 3.5f, "uint to float" );
-			Assert.Greater( 5U, 3.5d, "uint to double" );
-			Assert.Greater( 5U, 3UL, "uint to ulong" );
-			Assert.Greater( 5U, 3M, "uint to decimal" );
-			
-			Assert.Greater( 5ul, 3, "ulong to int" );
-			Assert.Greater( 5UL, 3L, "ulong to long" );
-			Assert.Greater( 5UL, 3.5f, "ulong to float" );
-			Assert.Greater( 5UL, 3.5d, "ulong to double" );
-			Assert.Greater( 5UL, 3U, "ulong to uint" );
-			Assert.Greater( 5UL, 3M, "ulong to decimal" );
-			
-			Assert.Greater( 5M, 3, "decimal to int" );
-			Assert.Greater( 5M, 3L, "decimal to long" );
-			Assert.Greater( 5M, 3.5f, "decimal to float" );
-			Assert.Greater( 5M, 3.5d, "decimal to double" );
-			Assert.Greater( 5M, 3U, "decimal to uint" );
-			Assert.Greater( 5M, 3UL, "decimal to ulong" );
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ))]
-		public void NotGreaterWhenEqual()
-		{
-			expectedMessage =
-				"  Expected: greater than 5" + Environment.NewLine +
-				"  But was:  5" + Environment.NewLine;
-			Assert.Greater(i1,i1);
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ))]
-		public void NotGreater()
-		{
-			expectedMessage =
-				"  Expected: greater than 5" + Environment.NewLine +
-				"  But was:  4" + Environment.NewLine;
-			Assert.Greater(i2,i1);
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ))]
-		public void NotGreaterIComparable()
-		{
-			expectedMessage =
-				"  Expected: greater than TableDirect" + Environment.NewLine +
-				"  But was:  StoredProcedure" + Environment.NewLine;
-			Assert.Greater(e2,e1);
-		}
-
-		[Test,ExpectedException( typeof(AssertionException))]
-		public void FailureMessage()
-		{
-			expectedMessage =
-				"  Expected: greater than 99" + Environment.NewLine +
-				"  But was:  7" + Environment.NewLine;
-			Assert.Greater( 7, 99 );
-		}
-	}
-}
-
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class GreaterFixture : MessageChecker
+	{
+		private readonly int i1 = 5;
+		private readonly int i2 = 4;
+		private readonly uint u1 = 12345879;
+		private readonly uint u2 = 12345678;
+		private readonly long l1 = 12345879;
+		private readonly long l2 = 12345678;
+		private readonly ulong ul1 = 12345879;
+		private readonly ulong ul2 = 12345678;
+		private readonly float f1 = 3.543F;
+		private readonly float f2 = 2.543F;
+		private readonly decimal de1 = 53.4M;
+		private readonly decimal de2 = 33.4M;
+		private readonly double d1 = 4.85948654;
+		private readonly double d2 = 1.0;
+		private readonly System.Enum e1 = System.Data.CommandType.TableDirect;
+		private readonly System.Enum e2 = System.Data.CommandType.StoredProcedure;
+
+		[Test]
+		public void Greater()
+		{
+			Assert.Greater(i1,i2);
+			Assert.Greater(u1,u2);
+			Assert.Greater(l1,l2);
+			Assert.Greater(ul1,ul2);
+			Assert.Greater(d1,d2, "double");
+			Assert.Greater(de1,de2, "{0}", "decimal");
+			Assert.Greater(f1,f2, "float");
+		}
+
+		[Test]
+		public void MixedTypes()
+		{	
+			Assert.Greater( 5, 3L, "int to long");
+			Assert.Greater( 5, 3.5f, "int to float" );
+			Assert.Greater( 5, 3.5d, "int to double" );
+			Assert.Greater( 5, 3U, "int to uint" );
+			Assert.Greater( 5, 3UL, "int to ulong" );
+			Assert.Greater( 5, 3M, "int to decimal" );
+
+			Assert.Greater( 5L, 3, "long to int");
+			Assert.Greater( 5L, 3.5f, "long to float" );
+			Assert.Greater( 5L, 3.5d, "long to double" );
+			Assert.Greater( 5L, 3U, "long to uint" );
+			Assert.Greater( 5L, 3UL, "long to ulong" );
+			Assert.Greater( 5L, 3M, "long to decimal" );
+
+			Assert.Greater( 8.2f, 5, "float to int" );
+			Assert.Greater( 8.2f, 8L, "float to long" );
+			Assert.Greater( 8.2f, 3.5d, "float to double" );
+			Assert.Greater( 8.2f, 8U, "float to uint" );
+			Assert.Greater( 8.2f, 8UL, "float to ulong" );
+			Assert.Greater( 8.2f, 3.5M, "float to decimal" );
+
+			Assert.Greater( 8.2d, 5, "double to int" );
+			Assert.Greater( 8.2d, 5L, "double to long" );
+			Assert.Greater( 8.2d, 3.5f, "double to float" );
+			Assert.Greater( 8.2d, 8U, "double to uint" );
+			Assert.Greater( 8.2d, 8UL, "double to ulong" );
+			Assert.Greater( 8.2d, 3.5M, "double to decimal" );
+			
+
+			Assert.Greater( 5U, 3, "uint to int" );
+			Assert.Greater( 5U, 3L, "uint to long" );
+			Assert.Greater( 5U, 3.5f, "uint to float" );
+			Assert.Greater( 5U, 3.5d, "uint to double" );
+			Assert.Greater( 5U, 3UL, "uint to ulong" );
+			Assert.Greater( 5U, 3M, "uint to decimal" );
+			
+			Assert.Greater( 5ul, 3, "ulong to int" );
+			Assert.Greater( 5UL, 3L, "ulong to long" );
+			Assert.Greater( 5UL, 3.5f, "ulong to float" );
+			Assert.Greater( 5UL, 3.5d, "ulong to double" );
+			Assert.Greater( 5UL, 3U, "ulong to uint" );
+			Assert.Greater( 5UL, 3M, "ulong to decimal" );
+			
+			Assert.Greater( 5M, 3, "decimal to int" );
+			Assert.Greater( 5M, 3L, "decimal to long" );
+			Assert.Greater( 5M, 3.5f, "decimal to float" );
+			Assert.Greater( 5M, 3.5d, "decimal to double" );
+			Assert.Greater( 5M, 3U, "decimal to uint" );
+			Assert.Greater( 5M, 3UL, "decimal to ulong" );
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ))]
+		public void NotGreaterWhenEqual()
+		{
+			expectedMessage =
+				"  Expected: greater than 5" + Environment.NewLine +
+				"  But was:  5" + Environment.NewLine;
+			Assert.Greater(i1,i1);
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ))]
+		public void NotGreater()
+		{
+			expectedMessage =
+				"  Expected: greater than 5" + Environment.NewLine +
+				"  But was:  4" + Environment.NewLine;
+			Assert.Greater(i2,i1);
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ))]
+		public void NotGreaterIComparable()
+		{
+			expectedMessage =
+				"  Expected: greater than TableDirect" + Environment.NewLine +
+				"  But was:  StoredProcedure" + Environment.NewLine;
+			Assert.Greater(e2,e1);
+		}
+
+		[Test,ExpectedException( typeof(AssertionException))]
+		public void FailureMessage()
+		{
+			expectedMessage =
+				"  Expected: greater than 99" + Environment.NewLine +
+				"  But was:  7" + Environment.NewLine;
+			Assert.Greater( 7, 99 );
+		}
+	}
+}
+
+
diff --git a/src/NUnitFramework/tests/LessEqualFixture.cs b/src/NUnitFramework/tests/LessEqualFixture.cs
index 3e3c893..d5c8562 100644
--- a/src/NUnitFramework/tests/LessEqualFixture.cs
+++ b/src/NUnitFramework/tests/LessEqualFixture.cs
@@ -1,164 +1,164 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-    [TestFixture]
-    public class LessEqualFixture : MessageChecker
-    {
-        private readonly int i1 = 5;
-        private readonly int i2 = 8;
-		private readonly uint u1 = 12345678;
-		private readonly uint u2 = 12345879;
-		private readonly long l1 = 12345678;
-		private readonly long l2 = 12345879;
-		private readonly ulong ul1 = 12345678;
-		private readonly ulong ul2 = 12345879;
-		private readonly float f1 = 3.543F;
-        private readonly float f2 = 8.543F;
-        private readonly decimal de1 = 53.4M;
-        private readonly decimal de2 = 83.4M;
-        private readonly double d1 = 4.85948654;
-        private readonly double d2 = 8.0;
-        private readonly System.Enum e1 = System.Data.CommandType.StoredProcedure;
-        private readonly System.Enum e2 = System.Data.CommandType.TableDirect;
-
-        [Test]
-        public void LessOrEqual()
-        {
-            // Test equality check for all forms
-            Assert.LessOrEqual(i1, i1);
-            Assert.LessOrEqual(i1, i1, "int");
-            Assert.LessOrEqual(i1, i1, "{0}", "int");
-			Assert.LessOrEqual(u1, u1);
-			Assert.LessOrEqual(u1, u1, "uint");
-			Assert.LessOrEqual(u1, u1, "{0}", "uint");
-			Assert.LessOrEqual(l1, l1);
-			Assert.LessOrEqual(l1, l1, "long");
-			Assert.LessOrEqual(l1, l1, "{0}", "long");
-			Assert.LessOrEqual(ul1, ul1);
-			Assert.LessOrEqual(ul1, ul1, "ulong");
-			Assert.LessOrEqual(ul1, ul1, "{0}", "ulong");
-			Assert.LessOrEqual(d1, d1);
-            Assert.LessOrEqual(d1, d1, "double");
-            Assert.LessOrEqual(d1, d1, "{0}", "double");
-            Assert.LessOrEqual(de1, de1);
-            Assert.LessOrEqual(de1, de1, "decimal");
-            Assert.LessOrEqual(de1, de1, "{0}", "decimal");
-            Assert.LessOrEqual(f1, f1);
-            Assert.LessOrEqual(f1, f1, "float");
-            Assert.LessOrEqual(f1, f1, "{0}", "float");
-
-            // Testing all forms after seeing some bugs. CFP
-            Assert.LessOrEqual(i1, i2);
-            Assert.LessOrEqual(i1, i2, "int");
-            Assert.LessOrEqual(i1, i2, "{0}", "int");
-            Assert.LessOrEqual(u1, u2);
-            Assert.LessOrEqual(u1, u2, "uint");
-            Assert.LessOrEqual(u1, u2, "{0}", "uint");
-			Assert.LessOrEqual(l1, l2);
-			Assert.LessOrEqual(l1, l2, "long");
-			Assert.LessOrEqual(l1, l2, "{0}", "long");
-			Assert.LessOrEqual(ul1, ul2);
-			Assert.LessOrEqual(ul1, ul2, "ulong");
-			Assert.LessOrEqual(ul1, ul2, "{0}", "ulong");
-			Assert.LessOrEqual(d1, d2);
-            Assert.LessOrEqual(d1, d2, "double");
-            Assert.LessOrEqual(d1, d2, "{0}", "double");
-            Assert.LessOrEqual(de1, de2);
-            Assert.LessOrEqual(de1, de2, "decimal");
-            Assert.LessOrEqual(de1, de2, "{0}", "decimal");
-            Assert.LessOrEqual(f1, f2);
-            Assert.LessOrEqual(f1, f2, "float");
-            Assert.LessOrEqual(f1, f2, "{0}", "float");
-        }
-
-		[Test]
-		public void MixedTypes()
-		{	
-			Assert.LessOrEqual( 5, 8L, "int to long");
-			Assert.LessOrEqual( 5, 8.2f, "int to float" );
-			Assert.LessOrEqual( 5, 8.2d, "int to double" );
-			Assert.LessOrEqual( 5, 8U, "int to uint" );
-			Assert.LessOrEqual( 5, 8UL, "int to ulong" );
-			Assert.LessOrEqual( 5, 8M, "int to decimal" );
-
-			Assert.LessOrEqual( 5L, 8, "long to int");
-			Assert.LessOrEqual( 5L, 8.2f, "long to float" );
-			Assert.LessOrEqual( 5L, 8.2d, "long to double" );
-			Assert.LessOrEqual( 5L, 8U, "long to uint" );
-			Assert.LessOrEqual( 5L, 8UL, "long to ulong" );
-			Assert.LessOrEqual( 5L, 8M, "long to decimal" );
-
-			Assert.LessOrEqual( 3.5f, 5, "float to int" );
-			Assert.LessOrEqual( 3.5f, 8L, "float to long" );
-			Assert.LessOrEqual( 3.5f, 8.2d, "float to double" );
-			Assert.LessOrEqual( 3.5f, 8U, "float to uint" );
-			Assert.LessOrEqual( 3.5f, 8UL, "float to ulong" );
-			Assert.LessOrEqual( 3.5f, 8.2M, "float to decimal" );
-
-			Assert.LessOrEqual( 3.5d, 5, "double to int" );
-			Assert.LessOrEqual( 3.5d, 5L, "double to long" );
-			Assert.LessOrEqual( 3.5d, 8.2f, "double to float" );
-			Assert.LessOrEqual( 3.5d, 8U, "double to uint" );
-			Assert.LessOrEqual( 3.5d, 8UL, "double to ulong" );
-			Assert.LessOrEqual( 3.5d, 8.2M, "double to decimal" );
-			
-
-			Assert.LessOrEqual( 5U, 8, "uint to int" );
-			Assert.LessOrEqual( 5U, 8L, "uint to long" );
-			Assert.LessOrEqual( 5U, 8.2f, "uint to float" );
-			Assert.LessOrEqual( 5U, 8.2d, "uint to double" );
-			Assert.LessOrEqual( 5U, 8UL, "uint to ulong" );
-			Assert.LessOrEqual( 5U, 8M, "uint to decimal" );
-			
-			Assert.LessOrEqual( 5ul, 8, "ulong to int" );
-			Assert.LessOrEqual( 5UL, 8L, "ulong to long" );
-			Assert.LessOrEqual( 5UL, 8.2f, "ulong to float" );
-			Assert.LessOrEqual( 5UL, 8.2d, "ulong to double" );
-			Assert.LessOrEqual( 5UL, 8U, "ulong to uint" );
-			Assert.LessOrEqual( 5UL, 8M, "ulong to decimal" );
-			
-			Assert.LessOrEqual( 5M, 8, "decimal to int" );
-			Assert.LessOrEqual( 5M, 8L, "decimal to long" );
-			Assert.LessOrEqual( 5M, 8.2f, "decimal to float" );
-			Assert.LessOrEqual( 5M, 8.2d, "decimal to double" );
-			Assert.LessOrEqual( 5M, 8U, "decimal to uint" );
-			Assert.LessOrEqual( 5M, 8UL, "decimal to ulong" );
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-        public void NotLessOrEqual()
-        {
-			expectedMessage =
-				"  Expected: less than or equal to 5" + Environment.NewLine +
-				"  But was:  8" + Environment.NewLine;
-			Assert.LessOrEqual(i2, i1);
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void NotLessEqualIComparable()
-        {
-			expectedMessage =
-				"  Expected: less than or equal to StoredProcedure" + Environment.NewLine +
-				"  But was:  TableDirect" + Environment.NewLine;
-			Assert.LessOrEqual(e2, e1);
-        }
-
-        [Test,ExpectedException(typeof(AssertionException))]
-        public void FailureMessage()
-        {
-			expectedMessage =
-				"  Expected: less than or equal to 4" + Environment.NewLine +
-				"  But was:  9" + Environment.NewLine;
-            Assert.LessOrEqual(9, 4);
-        }
-    }
-}
-
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+    [TestFixture]
+    public class LessEqualFixture : MessageChecker
+    {
+        private readonly int i1 = 5;
+        private readonly int i2 = 8;
+		private readonly uint u1 = 12345678;
+		private readonly uint u2 = 12345879;
+		private readonly long l1 = 12345678;
+		private readonly long l2 = 12345879;
+		private readonly ulong ul1 = 12345678;
+		private readonly ulong ul2 = 12345879;
+		private readonly float f1 = 3.543F;
+        private readonly float f2 = 8.543F;
+        private readonly decimal de1 = 53.4M;
+        private readonly decimal de2 = 83.4M;
+        private readonly double d1 = 4.85948654;
+        private readonly double d2 = 8.0;
+        private readonly System.Enum e1 = System.Data.CommandType.StoredProcedure;
+        private readonly System.Enum e2 = System.Data.CommandType.TableDirect;
+
+        [Test]
+        public void LessOrEqual()
+        {
+            // Test equality check for all forms
+            Assert.LessOrEqual(i1, i1);
+            Assert.LessOrEqual(i1, i1, "int");
+            Assert.LessOrEqual(i1, i1, "{0}", "int");
+			Assert.LessOrEqual(u1, u1);
+			Assert.LessOrEqual(u1, u1, "uint");
+			Assert.LessOrEqual(u1, u1, "{0}", "uint");
+			Assert.LessOrEqual(l1, l1);
+			Assert.LessOrEqual(l1, l1, "long");
+			Assert.LessOrEqual(l1, l1, "{0}", "long");
+			Assert.LessOrEqual(ul1, ul1);
+			Assert.LessOrEqual(ul1, ul1, "ulong");
+			Assert.LessOrEqual(ul1, ul1, "{0}", "ulong");
+			Assert.LessOrEqual(d1, d1);
+            Assert.LessOrEqual(d1, d1, "double");
+            Assert.LessOrEqual(d1, d1, "{0}", "double");
+            Assert.LessOrEqual(de1, de1);
+            Assert.LessOrEqual(de1, de1, "decimal");
+            Assert.LessOrEqual(de1, de1, "{0}", "decimal");
+            Assert.LessOrEqual(f1, f1);
+            Assert.LessOrEqual(f1, f1, "float");
+            Assert.LessOrEqual(f1, f1, "{0}", "float");
+
+            // Testing all forms after seeing some bugs. CFP
+            Assert.LessOrEqual(i1, i2);
+            Assert.LessOrEqual(i1, i2, "int");
+            Assert.LessOrEqual(i1, i2, "{0}", "int");
+            Assert.LessOrEqual(u1, u2);
+            Assert.LessOrEqual(u1, u2, "uint");
+            Assert.LessOrEqual(u1, u2, "{0}", "uint");
+			Assert.LessOrEqual(l1, l2);
+			Assert.LessOrEqual(l1, l2, "long");
+			Assert.LessOrEqual(l1, l2, "{0}", "long");
+			Assert.LessOrEqual(ul1, ul2);
+			Assert.LessOrEqual(ul1, ul2, "ulong");
+			Assert.LessOrEqual(ul1, ul2, "{0}", "ulong");
+			Assert.LessOrEqual(d1, d2);
+            Assert.LessOrEqual(d1, d2, "double");
+            Assert.LessOrEqual(d1, d2, "{0}", "double");
+            Assert.LessOrEqual(de1, de2);
+            Assert.LessOrEqual(de1, de2, "decimal");
+            Assert.LessOrEqual(de1, de2, "{0}", "decimal");
+            Assert.LessOrEqual(f1, f2);
+            Assert.LessOrEqual(f1, f2, "float");
+            Assert.LessOrEqual(f1, f2, "{0}", "float");
+        }
+
+		[Test]
+		public void MixedTypes()
+		{	
+			Assert.LessOrEqual( 5, 8L, "int to long");
+			Assert.LessOrEqual( 5, 8.2f, "int to float" );
+			Assert.LessOrEqual( 5, 8.2d, "int to double" );
+			Assert.LessOrEqual( 5, 8U, "int to uint" );
+			Assert.LessOrEqual( 5, 8UL, "int to ulong" );
+			Assert.LessOrEqual( 5, 8M, "int to decimal" );
+
+			Assert.LessOrEqual( 5L, 8, "long to int");
+			Assert.LessOrEqual( 5L, 8.2f, "long to float" );
+			Assert.LessOrEqual( 5L, 8.2d, "long to double" );
+			Assert.LessOrEqual( 5L, 8U, "long to uint" );
+			Assert.LessOrEqual( 5L, 8UL, "long to ulong" );
+			Assert.LessOrEqual( 5L, 8M, "long to decimal" );
+
+			Assert.LessOrEqual( 3.5f, 5, "float to int" );
+			Assert.LessOrEqual( 3.5f, 8L, "float to long" );
+			Assert.LessOrEqual( 3.5f, 8.2d, "float to double" );
+			Assert.LessOrEqual( 3.5f, 8U, "float to uint" );
+			Assert.LessOrEqual( 3.5f, 8UL, "float to ulong" );
+			Assert.LessOrEqual( 3.5f, 8.2M, "float to decimal" );
+
+			Assert.LessOrEqual( 3.5d, 5, "double to int" );
+			Assert.LessOrEqual( 3.5d, 5L, "double to long" );
+			Assert.LessOrEqual( 3.5d, 8.2f, "double to float" );
+			Assert.LessOrEqual( 3.5d, 8U, "double to uint" );
+			Assert.LessOrEqual( 3.5d, 8UL, "double to ulong" );
+			Assert.LessOrEqual( 3.5d, 8.2M, "double to decimal" );
+			
+
+			Assert.LessOrEqual( 5U, 8, "uint to int" );
+			Assert.LessOrEqual( 5U, 8L, "uint to long" );
+			Assert.LessOrEqual( 5U, 8.2f, "uint to float" );
+			Assert.LessOrEqual( 5U, 8.2d, "uint to double" );
+			Assert.LessOrEqual( 5U, 8UL, "uint to ulong" );
+			Assert.LessOrEqual( 5U, 8M, "uint to decimal" );
+			
+			Assert.LessOrEqual( 5ul, 8, "ulong to int" );
+			Assert.LessOrEqual( 5UL, 8L, "ulong to long" );
+			Assert.LessOrEqual( 5UL, 8.2f, "ulong to float" );
+			Assert.LessOrEqual( 5UL, 8.2d, "ulong to double" );
+			Assert.LessOrEqual( 5UL, 8U, "ulong to uint" );
+			Assert.LessOrEqual( 5UL, 8M, "ulong to decimal" );
+			
+			Assert.LessOrEqual( 5M, 8, "decimal to int" );
+			Assert.LessOrEqual( 5M, 8L, "decimal to long" );
+			Assert.LessOrEqual( 5M, 8.2f, "decimal to float" );
+			Assert.LessOrEqual( 5M, 8.2d, "decimal to double" );
+			Assert.LessOrEqual( 5M, 8U, "decimal to uint" );
+			Assert.LessOrEqual( 5M, 8UL, "decimal to ulong" );
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+        public void NotLessOrEqual()
+        {
+			expectedMessage =
+				"  Expected: less than or equal to 5" + Environment.NewLine +
+				"  But was:  8" + Environment.NewLine;
+			Assert.LessOrEqual(i2, i1);
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void NotLessEqualIComparable()
+        {
+			expectedMessage =
+				"  Expected: less than or equal to StoredProcedure" + Environment.NewLine +
+				"  But was:  TableDirect" + Environment.NewLine;
+			Assert.LessOrEqual(e2, e1);
+        }
+
+        [Test,ExpectedException(typeof(AssertionException))]
+        public void FailureMessage()
+        {
+			expectedMessage =
+				"  Expected: less than or equal to 4" + Environment.NewLine +
+				"  But was:  9" + Environment.NewLine;
+            Assert.LessOrEqual(9, 4);
+        }
+    }
+}
+
+
diff --git a/src/NUnitFramework/tests/LessFixture.cs b/src/NUnitFramework/tests/LessFixture.cs
index f44d67d..eadc0b9 100644
--- a/src/NUnitFramework/tests/LessFixture.cs
+++ b/src/NUnitFramework/tests/LessFixture.cs
@@ -1,156 +1,156 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class LessFixture : MessageChecker
-	{
-		private readonly int i1 = 5;
-		private readonly int i2 = 8;
-		private readonly uint u1 = 12345678;
-		private readonly uint u2 = 12345879;
-		private readonly long l1 = 12345678;
-		private readonly long l2 = 12345879;
-		private readonly ulong ul1 = 12345678;
-		private readonly ulong ul2 = 12345879;
-		private readonly float f1 = 3.543F;
-		private readonly float f2 = 8.543F;
-		private readonly decimal de1 = 53.4M;
-		private readonly decimal de2 = 83.4M;
-		private readonly double d1 = 4.85948654;
-		private readonly double d2 = 8.0;
-		private readonly System.Enum e1 = System.Data.CommandType.StoredProcedure;
-		private readonly System.Enum e2 = System.Data.CommandType.TableDirect;
-
-		[Test]
-		public void Less()
-		{
-			// Testing all forms after seeing some bugs. CFP
-			Assert.Less(i1,i2);
-			Assert.Less(i1,i2,"int");
-			Assert.Less(i1,i2,"{0}","int");
-			Assert.Less(u1,u2,"uint");
-			Assert.Less(u1,u2,"{0}","uint");
-			Assert.Less(l1,l2,"long");
-			Assert.Less(l1,l2,"{0}","long");
-			Assert.Less(ul1,ul2,"ulong");
-			Assert.Less(ul1,ul2,"{0}","ulong");
-			Assert.Less(d1,d2);
-			Assert.Less(d1,d2, "double");
-			Assert.Less(d1,d2, "{0}", "double");
-			Assert.Less(de1,de2);
-			Assert.Less(de1,de2, "decimal");
-			Assert.Less(de1,de2, "{0}", "decimal");
-			Assert.Less(f1,f2);
-			Assert.Less(f1,f2, "float");
-			Assert.Less(f1,f2, "{0}", "float");
-		}
-
-		[Test]
-		public void MixedTypes()
-		{	
-			Assert.Less( 5, 8L, "int to long");
-			Assert.Less( 5, 8.2f, "int to float" );
-			Assert.Less( 5, 8.2d, "int to double" );
-			Assert.Less( 5, 8U, "int to uint" );
-			Assert.Less( 5, 8UL, "int to ulong" );
-			Assert.Less( 5, 8M, "int to decimal" );
-
-			Assert.Less( 5L, 8, "long to int");
-			Assert.Less( 5L, 8.2f, "long to float" );
-			Assert.Less( 5L, 8.2d, "long to double" );
-			Assert.Less( 5L, 8U, "long to uint" );
-			Assert.Less( 5L, 8UL, "long to ulong" );
-			Assert.Less( 5L, 8M, "long to decimal" );
-
-			Assert.Less( 3.5f, 5, "float to int" );
-			Assert.Less( 3.5f, 8L, "float to long" );
-			Assert.Less( 3.5f, 8.2d, "float to double" );
-			Assert.Less( 3.5f, 8U, "float to uint" );
-			Assert.Less( 3.5f, 8UL, "float to ulong" );
-			Assert.Less( 3.5f, 8.2M, "float to decimal" );
-
-			Assert.Less( 3.5d, 5, "double to int" );
-			Assert.Less( 3.5d, 5L, "double to long" );
-			Assert.Less( 3.5d, 8.2f, "double to float" );
-			Assert.Less( 3.5d, 8U, "double to uint" );
-			Assert.Less( 3.5d, 8UL, "double to ulong" );
-			Assert.Less( 3.5d, 8.2M, "double to decimal" );
-			
-
-			Assert.Less( 5U, 8, "uint to int" );
-			Assert.Less( 5U, 8L, "uint to long" );
-			Assert.Less( 5U, 8.2f, "uint to float" );
-			Assert.Less( 5U, 8.2d, "uint to double" );
-			Assert.Less( 5U, 8UL, "uint to ulong" );
-			Assert.Less( 5U, 8M, "uint to decimal" );
-			
-			Assert.Less( 5ul, 8, "ulong to int" );
-			Assert.Less( 5UL, 8L, "ulong to long" );
-			Assert.Less( 5UL, 8.2f, "ulong to float" );
-			Assert.Less( 5UL, 8.2d, "ulong to double" );
-			Assert.Less( 5UL, 8U, "ulong to uint" );
-			Assert.Less( 5UL, 8M, "ulong to decimal" );
-			
-			Assert.Less( 5M, 8, "decimal to int" );
-			Assert.Less( 5M, 8L, "decimal to long" );
-			Assert.Less( 5M, 8.2f, "decimal to float" );
-			Assert.Less( 5M, 8.2d, "decimal to double" );
-			Assert.Less( 5M, 8U, "decimal to uint" );
-			Assert.Less( 5M, 8UL, "decimal to ulong" );
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ))]
-		public void NotLessWhenEqual()
-		{
-			expectedMessage =
-				"  Expected: less than 5" + Environment.NewLine +
-				"  But was:  5" + Environment.NewLine;
-			Assert.Less(i1,i1);
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ))]
-		public void NotLess()
-		{
-			expectedMessage =
-				"  Expected: less than 5" + Environment.NewLine +
-				"  But was:  8" + Environment.NewLine;
-			Assert.Less(i2,i1);
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ))]
-		public void NotLessIComparable()
-		{
-			expectedMessage =
-				"  Expected: less than StoredProcedure" + Environment.NewLine +
-				"  But was:  TableDirect" + Environment.NewLine;
-			Assert.Less(e2,e1);
-		}
-
-		[Test]
-		public void FailureMessage()
-		{
-			string msg = null;
-
-			try
-			{
-				Assert.Less( 9, 4 );
-			}
-			catch( AssertionException ex )
-			{
-				msg = ex.Message;
-			}
-
-			StringAssert.Contains( TextMessageWriter.Pfx_Expected + "less than 4", msg );
-			StringAssert.Contains( TextMessageWriter.Pfx_Actual + "9", msg );
-		}
-	}
-}
-
-
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class LessFixture : MessageChecker
+	{
+		private readonly int i1 = 5;
+		private readonly int i2 = 8;
+		private readonly uint u1 = 12345678;
+		private readonly uint u2 = 12345879;
+		private readonly long l1 = 12345678;
+		private readonly long l2 = 12345879;
+		private readonly ulong ul1 = 12345678;
+		private readonly ulong ul2 = 12345879;
+		private readonly float f1 = 3.543F;
+		private readonly float f2 = 8.543F;
+		private readonly decimal de1 = 53.4M;
+		private readonly decimal de2 = 83.4M;
+		private readonly double d1 = 4.85948654;
+		private readonly double d2 = 8.0;
+		private readonly System.Enum e1 = System.Data.CommandType.StoredProcedure;
+		private readonly System.Enum e2 = System.Data.CommandType.TableDirect;
+
+		[Test]
+		public void Less()
+		{
+			// Testing all forms after seeing some bugs. CFP
+			Assert.Less(i1,i2);
+			Assert.Less(i1,i2,"int");
+			Assert.Less(i1,i2,"{0}","int");
+			Assert.Less(u1,u2,"uint");
+			Assert.Less(u1,u2,"{0}","uint");
+			Assert.Less(l1,l2,"long");
+			Assert.Less(l1,l2,"{0}","long");
+			Assert.Less(ul1,ul2,"ulong");
+			Assert.Less(ul1,ul2,"{0}","ulong");
+			Assert.Less(d1,d2);
+			Assert.Less(d1,d2, "double");
+			Assert.Less(d1,d2, "{0}", "double");
+			Assert.Less(de1,de2);
+			Assert.Less(de1,de2, "decimal");
+			Assert.Less(de1,de2, "{0}", "decimal");
+			Assert.Less(f1,f2);
+			Assert.Less(f1,f2, "float");
+			Assert.Less(f1,f2, "{0}", "float");
+		}
+
+		[Test]
+		public void MixedTypes()
+		{	
+			Assert.Less( 5, 8L, "int to long");
+			Assert.Less( 5, 8.2f, "int to float" );
+			Assert.Less( 5, 8.2d, "int to double" );
+			Assert.Less( 5, 8U, "int to uint" );
+			Assert.Less( 5, 8UL, "int to ulong" );
+			Assert.Less( 5, 8M, "int to decimal" );
+
+			Assert.Less( 5L, 8, "long to int");
+			Assert.Less( 5L, 8.2f, "long to float" );
+			Assert.Less( 5L, 8.2d, "long to double" );
+			Assert.Less( 5L, 8U, "long to uint" );
+			Assert.Less( 5L, 8UL, "long to ulong" );
+			Assert.Less( 5L, 8M, "long to decimal" );
+
+			Assert.Less( 3.5f, 5, "float to int" );
+			Assert.Less( 3.5f, 8L, "float to long" );
+			Assert.Less( 3.5f, 8.2d, "float to double" );
+			Assert.Less( 3.5f, 8U, "float to uint" );
+			Assert.Less( 3.5f, 8UL, "float to ulong" );
+			Assert.Less( 3.5f, 8.2M, "float to decimal" );
+
+			Assert.Less( 3.5d, 5, "double to int" );
+			Assert.Less( 3.5d, 5L, "double to long" );
+			Assert.Less( 3.5d, 8.2f, "double to float" );
+			Assert.Less( 3.5d, 8U, "double to uint" );
+			Assert.Less( 3.5d, 8UL, "double to ulong" );
+			Assert.Less( 3.5d, 8.2M, "double to decimal" );
+			
+
+			Assert.Less( 5U, 8, "uint to int" );
+			Assert.Less( 5U, 8L, "uint to long" );
+			Assert.Less( 5U, 8.2f, "uint to float" );
+			Assert.Less( 5U, 8.2d, "uint to double" );
+			Assert.Less( 5U, 8UL, "uint to ulong" );
+			Assert.Less( 5U, 8M, "uint to decimal" );
+			
+			Assert.Less( 5ul, 8, "ulong to int" );
+			Assert.Less( 5UL, 8L, "ulong to long" );
+			Assert.Less( 5UL, 8.2f, "ulong to float" );
+			Assert.Less( 5UL, 8.2d, "ulong to double" );
+			Assert.Less( 5UL, 8U, "ulong to uint" );
+			Assert.Less( 5UL, 8M, "ulong to decimal" );
+			
+			Assert.Less( 5M, 8, "decimal to int" );
+			Assert.Less( 5M, 8L, "decimal to long" );
+			Assert.Less( 5M, 8.2f, "decimal to float" );
+			Assert.Less( 5M, 8.2d, "decimal to double" );
+			Assert.Less( 5M, 8U, "decimal to uint" );
+			Assert.Less( 5M, 8UL, "decimal to ulong" );
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ))]
+		public void NotLessWhenEqual()
+		{
+			expectedMessage =
+				"  Expected: less than 5" + Environment.NewLine +
+				"  But was:  5" + Environment.NewLine;
+			Assert.Less(i1,i1);
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ))]
+		public void NotLess()
+		{
+			expectedMessage =
+				"  Expected: less than 5" + Environment.NewLine +
+				"  But was:  8" + Environment.NewLine;
+			Assert.Less(i2,i1);
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ))]
+		public void NotLessIComparable()
+		{
+			expectedMessage =
+				"  Expected: less than StoredProcedure" + Environment.NewLine +
+				"  But was:  TableDirect" + Environment.NewLine;
+			Assert.Less(e2,e1);
+		}
+
+		[Test]
+		public void FailureMessage()
+		{
+			string msg = null;
+
+			try
+			{
+				Assert.Less( 9, 4 );
+			}
+			catch( AssertionException ex )
+			{
+				msg = ex.Message;
+			}
+
+			StringAssert.Contains( TextMessageWriter.Pfx_Expected + "less than 4", msg );
+			StringAssert.Contains( TextMessageWriter.Pfx_Actual + "9", msg );
+		}
+	}
+}
+
+
diff --git a/src/NUnitFramework/tests/ListContentsTests.cs b/src/NUnitFramework/tests/ListContentsTests.cs
index eaf76ad..8521954 100644
--- a/src/NUnitFramework/tests/ListContentsTests.cs
+++ b/src/NUnitFramework/tests/ListContentsTests.cs
@@ -1,82 +1,82 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// Summary description for ListContentsTests.
-	/// </summary>
-	[TestFixture]
-	public class ListContentsTests : MessageChecker
-	{
-		private static readonly object[] testArray = { "abc", 123, "xyz" };
-
-		[Test]
-		public void ArraySucceeds()
-		{
-			Assert.Contains( "abc", testArray );
-			Assert.Contains( 123, testArray );
-			Assert.Contains( "xyz", testArray );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ArrayFails()
-		{
-			expectedMessage =
-				"  Expected: collection containing \"def\"" + Environment.NewLine + 
-				"  But was:  < \"abc\", 123, \"xyz\" >" + Environment.NewLine;	
-			Assert.Contains("def", testArray);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void EmptyArrayFails()
-		{
-			expectedMessage =
-				"  Expected: collection containing \"def\"" + Environment.NewLine + 
-				"  But was:  <empty>" + Environment.NewLine;	
-			Assert.Contains( "def", new object[0] );
-		}
-
-		[Test,ExpectedException(typeof(ArgumentException))]
-		public void NullArrayIsError()
-		{
-			Assert.Contains( "def", null );
-		}
-
-		[Test]
-		public void ArrayListSucceeds()
-		{
-			ArrayList list = new ArrayList( testArray );
-
-			Assert.Contains( "abc", list );
-			Assert.Contains( 123, list );
-			Assert.Contains( "xyz", list );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ArrayListFails()
-		{
-			expectedMessage =
-				"  Expected: collection containing \"def\"" + Environment.NewLine + 
-				"  But was:  < \"abc\", 123, \"xyz\" >" + Environment.NewLine;
-			Assert.Contains( "def", new ArrayList( testArray ) );
-		}
-
-		[Test]
-		public void DifferentTypesMayBeEqual()
-		{
-			// TODO: Better message for this case
-			expectedMessage =
-				"  Expected: collection containing 123.0d" + Environment.NewLine + 
-				"  But was:  < \"abc\", 123, \"xyz\" >" + Environment.NewLine;
-			Assert.Contains( 123.0, new ArrayList( testArray ) );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// Summary description for ListContentsTests.
+	/// </summary>
+	[TestFixture]
+	public class ListContentsTests : MessageChecker
+	{
+		private static readonly object[] testArray = { "abc", 123, "xyz" };
+
+		[Test]
+		public void ArraySucceeds()
+		{
+			Assert.Contains( "abc", testArray );
+			Assert.Contains( 123, testArray );
+			Assert.Contains( "xyz", testArray );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void ArrayFails()
+		{
+			expectedMessage =
+				"  Expected: collection containing \"def\"" + Environment.NewLine + 
+				"  But was:  < \"abc\", 123, \"xyz\" >" + Environment.NewLine;	
+			Assert.Contains("def", testArray);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void EmptyArrayFails()
+		{
+			expectedMessage =
+				"  Expected: collection containing \"def\"" + Environment.NewLine + 
+				"  But was:  <empty>" + Environment.NewLine;	
+			Assert.Contains( "def", new object[0] );
+		}
+
+		[Test,ExpectedException(typeof(ArgumentException))]
+		public void NullArrayIsError()
+		{
+			Assert.Contains( "def", null );
+		}
+
+		[Test]
+		public void ArrayListSucceeds()
+		{
+			ArrayList list = new ArrayList( testArray );
+
+			Assert.Contains( "abc", list );
+			Assert.Contains( 123, list );
+			Assert.Contains( "xyz", list );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void ArrayListFails()
+		{
+			expectedMessage =
+				"  Expected: collection containing \"def\"" + Environment.NewLine + 
+				"  But was:  < \"abc\", 123, \"xyz\" >" + Environment.NewLine;
+			Assert.Contains( "def", new ArrayList( testArray ) );
+		}
+
+		[Test]
+		public void DifferentTypesMayBeEqual()
+		{
+			// TODO: Better message for this case
+			expectedMessage =
+				"  Expected: collection containing 123.0d" + Environment.NewLine + 
+				"  But was:  < \"abc\", 123, \"xyz\" >" + Environment.NewLine;
+			Assert.Contains( 123.0, new ArrayList( testArray ) );
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/MessageChecker.cs b/src/NUnitFramework/tests/MessageChecker.cs
index d4c178f..97ba9f9 100644
--- a/src/NUnitFramework/tests/MessageChecker.cs
+++ b/src/NUnitFramework/tests/MessageChecker.cs
@@ -1,50 +1,50 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	/// <summary>
-	/// MessageCheckingTest is an abstract base for tests
-	/// that check for an expected message in the exception
-	/// handler.
-	/// </summary>
-	public abstract class MessageChecker : AssertionHelper, IExpectException
-	{
-		protected string expectedMessage;
-        protected MessageMatch matchType = MessageMatch.Exact;
-
-		[SetUp]
-		public void SetUp()
-		{
-			expectedMessage = null;
-		}
-
-		public void HandleException( Exception ex )
-		{
-			if ( expectedMessage != null )
-            {
-                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;
-                }
-            }
-        }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	/// <summary>
+	/// MessageCheckingTest is an abstract base for tests
+	/// that check for an expected message in the exception
+	/// handler.
+	/// </summary>
+	public abstract class MessageChecker : AssertionHelper, IExpectException
+	{
+		protected string expectedMessage;
+        protected MessageMatch matchType = MessageMatch.Exact;
+
+		[SetUp]
+		public void SetUp()
+		{
+			expectedMessage = null;
+		}
+
+		public void HandleException( Exception ex )
+		{
+			if ( expectedMessage != null )
+            {
+                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/NotEqualFixture.cs b/src/NUnitFramework/tests/NotEqualFixture.cs
index e39676f..d1b763f 100644
--- a/src/NUnitFramework/tests/NotEqualFixture.cs
+++ b/src/NUnitFramework/tests/NotEqualFixture.cs
@@ -1,117 +1,117 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class NotEqualFixture : MessageChecker
-	{
-		[Test]
-		public void NotEqual()
-		{
-			Assert.AreNotEqual( 5, 3 );
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void NotEqualFails()
-		{
-			expectedMessage =
-				"  Expected: not 5" + Environment.NewLine +
-				"  But was:  5" + Environment.NewLine;
-			Assert.AreNotEqual( 5, 5 );
-		}
-
-		[Test]
-		public void NullNotEqualToNonNull()
-		{
-			Assert.AreNotEqual( null, 3 );
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void NullEqualsNull()
-		{
-			expectedMessage =
-				"  Expected: not null" + Environment.NewLine +
-				"  But was:  null" + Environment.NewLine;
-			Assert.AreNotEqual( null, null );
-		}
-
-		[Test]
-		public void ArraysNotEqual()
-		{
-			Assert.AreNotEqual( new object[] { 1, 2, 3 }, new object[] { 1, 3, 2 } );
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void ArraysNotEqualFails()
-		{
-			expectedMessage =
-				"  Expected: not < 1, 2, 3 >" + Environment.NewLine +
-				"  But was:  < 1, 2, 3 >" + Environment.NewLine;
-			Assert.AreNotEqual( new object[] { 1, 2, 3 }, new object[] { 1, 2, 3 } );
-		}
-
-		[Test]
-		public void UInt()
-		{
-			uint u1 = 5;
-			uint u2 = 8;
-			Assert.AreNotEqual( u1, u2 );
-		}
-
-        [Test]
-        public void NotEqualSameTypes()
-        {
-            byte b1 = 35;
-            sbyte sb2 = 35;
-            decimal d4 = 35;
-            double d5 = 35;
-            float f6 = 35;
-            int i7 = 35;
-            uint u8 = 35;
-            long l9 = 35;
-            short s10 = 35;
-            ushort us11 = 35;
-
-            System.Byte b12 = 35;
-            System.SByte sb13 = 35;
-            System.Decimal d14 = 35;
-            System.Double d15 = 35;
-            System.Single s16 = 35;
-            System.Int32 i17 = 35;
-            System.UInt32 ui18 = 35;
-            System.Int64 i19 = 35;
-            System.UInt64 ui20 = 35;
-            System.Int16 i21 = 35;
-            System.UInt16 i22 = 35;
-
-            Assert.AreNotEqual(23, b1);
-            Assert.AreNotEqual(23, sb2);
-            Assert.AreNotEqual(23, d4);
-            Assert.AreNotEqual(23, d5);
-            Assert.AreNotEqual(23, f6);
-            Assert.AreNotEqual(23, i7);
-            Assert.AreNotEqual(23, u8);
-            Assert.AreNotEqual(23, l9);
-            Assert.AreNotEqual(23, s10);
-            Assert.AreNotEqual(23, us11);
-
-            Assert.AreNotEqual(23, b12);
-            Assert.AreNotEqual(23, sb13);
-            Assert.AreNotEqual(23, d14);
-            Assert.AreNotEqual(23, d15);
-            Assert.AreNotEqual(23, s16);
-            Assert.AreNotEqual(23, i17);
-            Assert.AreNotEqual(23, ui18);
-            Assert.AreNotEqual(23, i19);
-            Assert.AreNotEqual(23, ui20);
-            Assert.AreNotEqual(23, i21);
-            Assert.AreNotEqual(23, i22);
-        }
-   }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class NotEqualFixture : MessageChecker
+	{
+		[Test]
+		public void NotEqual()
+		{
+			Assert.AreNotEqual( 5, 3 );
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ) )]
+		public void NotEqualFails()
+		{
+			expectedMessage =
+				"  Expected: not 5" + Environment.NewLine +
+				"  But was:  5" + Environment.NewLine;
+			Assert.AreNotEqual( 5, 5 );
+		}
+
+		[Test]
+		public void NullNotEqualToNonNull()
+		{
+			Assert.AreNotEqual( null, 3 );
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ) )]
+		public void NullEqualsNull()
+		{
+			expectedMessage =
+				"  Expected: not null" + Environment.NewLine +
+				"  But was:  null" + Environment.NewLine;
+			Assert.AreNotEqual( null, null );
+		}
+
+		[Test]
+		public void ArraysNotEqual()
+		{
+			Assert.AreNotEqual( new object[] { 1, 2, 3 }, new object[] { 1, 3, 2 } );
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ) )]
+		public void ArraysNotEqualFails()
+		{
+			expectedMessage =
+				"  Expected: not < 1, 2, 3 >" + Environment.NewLine +
+				"  But was:  < 1, 2, 3 >" + Environment.NewLine;
+			Assert.AreNotEqual( new object[] { 1, 2, 3 }, new object[] { 1, 2, 3 } );
+		}
+
+		[Test]
+		public void UInt()
+		{
+			uint u1 = 5;
+			uint u2 = 8;
+			Assert.AreNotEqual( u1, u2 );
+		}
+
+        [Test]
+        public void NotEqualSameTypes()
+        {
+            byte b1 = 35;
+            sbyte sb2 = 35;
+            decimal d4 = 35;
+            double d5 = 35;
+            float f6 = 35;
+            int i7 = 35;
+            uint u8 = 35;
+            long l9 = 35;
+            short s10 = 35;
+            ushort us11 = 35;
+
+            System.Byte b12 = 35;
+            System.SByte sb13 = 35;
+            System.Decimal d14 = 35;
+            System.Double d15 = 35;
+            System.Single s16 = 35;
+            System.Int32 i17 = 35;
+            System.UInt32 ui18 = 35;
+            System.Int64 i19 = 35;
+            System.UInt64 ui20 = 35;
+            System.Int16 i21 = 35;
+            System.UInt16 i22 = 35;
+
+            Assert.AreNotEqual(23, b1);
+            Assert.AreNotEqual(23, sb2);
+            Assert.AreNotEqual(23, d4);
+            Assert.AreNotEqual(23, d5);
+            Assert.AreNotEqual(23, f6);
+            Assert.AreNotEqual(23, i7);
+            Assert.AreNotEqual(23, u8);
+            Assert.AreNotEqual(23, l9);
+            Assert.AreNotEqual(23, s10);
+            Assert.AreNotEqual(23, us11);
+
+            Assert.AreNotEqual(23, b12);
+            Assert.AreNotEqual(23, sb13);
+            Assert.AreNotEqual(23, d14);
+            Assert.AreNotEqual(23, d15);
+            Assert.AreNotEqual(23, s16);
+            Assert.AreNotEqual(23, i17);
+            Assert.AreNotEqual(23, ui18);
+            Assert.AreNotEqual(23, i19);
+            Assert.AreNotEqual(23, ui20);
+            Assert.AreNotEqual(23, i21);
+            Assert.AreNotEqual(23, i22);
+        }
+   }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/NotSameFixture.cs b/src/NUnitFramework/tests/NotSameFixture.cs
index 69f4f21..753b349 100644
--- a/src/NUnitFramework/tests/NotSameFixture.cs
+++ b/src/NUnitFramework/tests/NotSameFixture.cs
@@ -1,32 +1,32 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class NotSameFixture : MessageChecker
-	{
-		private readonly string s1 = "S1";
-		private readonly string s2 = "S2";
-
-		[Test]
-		public void NotSame()
-		{
-			Assert.AreNotSame(s1, s2);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void NotSameFails()
-		{
-			expectedMessage =
-				"  Expected: not same as \"S1\"" + Environment.NewLine +
-				"  But was:  \"S1\"" + Environment.NewLine;
-			Assert.AreNotSame( s1, s1 );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class NotSameFixture : MessageChecker
+	{
+		private readonly string s1 = "S1";
+		private readonly string s2 = "S2";
+
+		[Test]
+		public void NotSame()
+		{
+			Assert.AreNotSame(s1, s2);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void NotSameFails()
+		{
+			expectedMessage =
+				"  Expected: not same as \"S1\"" + Environment.NewLine +
+				"  But was:  \"S1\"" + Environment.NewLine;
+			Assert.AreNotSame( s1, s1 );
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/NullableTypesTests.cs b/src/NUnitFramework/tests/NullableTypesTests.cs
index d3b861e..e008d43 100644
--- a/src/NUnitFramework/tests/NullableTypesTests.cs
+++ b/src/NUnitFramework/tests/NullableTypesTests.cs
@@ -1,253 +1,253 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework.Tests
-{
-#if CLR_2_0 || CLR_4_0
-#if !MONO
-    [TestFixture, Category("Generics")]
-    public class NullableTypesTests
-    {
-        [Test]
-        public void CanTestForNull()
-        {
-            int? nullInt = null;
-            int? five = 5;
-
-            Assert.IsNull(nullInt);
-            Assert.IsNotNull(five);
-            Assert.That(nullInt, Is.Null);
-            Assert.That(five, Is.Not.Null);
-        }
-
-#if false
-        [Test]
-        public void CanCompareNullableInts()
-        {
-            int? five = 5;
-            int? answer = 2 + 3;
-
-            Assert.AreEqual(five, answer);
-            Assert.AreEqual(five, 5);
-            Assert.AreEqual(5, five);
-
-            Assert.That(five, Is.EqualTo(answer));
-            Assert.That(five, Is.EqualTo(5));
-            Assert.That(5, Is.EqualTo(five));
-
-            Assert.Greater(five, 3);
-            Assert.GreaterOrEqual(five, 5);
-            Assert.Less(3, five);
-            Assert.LessOrEqual(5, five);
-
-            Assert.That(five, Is.GreaterThan(3));
-            Assert.That(five, Is.GreaterThanOrEqualTo(5));
-            //Assert.That(3, Is.LessThan(five));
-            //Assert.That(5, Is.LessThanOrEqualTo(five));
-        }
-		
-        [Test]
-        public void CanCompareNullableDoubles()
-        {
-            double? five = 5.0;
-            double? answer = 2.0 + 3.0;
-
-            Assert.AreEqual(five, answer);
-            Assert.AreEqual(five, 5.0);
-            Assert.AreEqual(5.0, five);
-
-            Assert.That(five, Is.EqualTo(answer));
-            Assert.That(five, Is.EqualTo(5.0));
-            Assert.That(5.0, Is.EqualTo(five));
-
-            Assert.Greater(five, 3.0);
-            Assert.GreaterOrEqual(five, 5.0);
-            Assert.Less(3.0, five);
-            Assert.LessOrEqual(5.0, five);
-
-            Assert.That(five, Is.GreaterThan(3.0));
-            Assert.That(five, Is.GreaterThanOrEqualTo(5.0));
-            //Assert.That(3.0, Is.LessThan(five));
-            //Assert.That(5.0, Is.LessThanOrEqualTo(five));
-        }
-#endif
-
-        [Test]
-        public void CanTestForNaN()
-        {
-            double? anNaN = Double.NaN;
-            Assert.IsNaN(anNaN);
-            Assert.That(anNaN, Is.NaN);
-        }
-
-#if false
-        [Test]
-        public void CanCompareNullableDecimals()
-        {
-            decimal? five = 5m;
-            decimal? answer = 2m + 3m;
-
-            Assert.AreEqual(five, answer);
-            Assert.AreEqual(five, 5m);
-            Assert.AreEqual(5m, five);
-
-            Assert.That(five, Is.EqualTo(answer));
-            Assert.That(five, Is.EqualTo(5m));
-            Assert.That(5m, Is.EqualTo(five));
-
-            Assert.Greater(five, 3m);
-            Assert.GreaterOrEqual(five, 5m);
-            Assert.Less(3m, five);
-            Assert.LessOrEqual(5m, five);
-
-            Assert.That(five, Is.GreaterThan(3m));
-            Assert.That(five, Is.GreaterThanOrEqualTo(5m));
-            //Assert.That(3m, Is.LessThan(five));
-            //Assert.That(5m, Is.LessThanOrEqualTo(five));
-        }
-#endif
-		
-        [Test]
-        public void CanCompareWithTolerance()
-        {
-            double? five = 5.0;
-
-            Assert.AreEqual(5.0000001, five, .0001); 
-            Assert.That( five, Is.EqualTo(5.0000001).Within(.0001));
-
-            float? three = 3.0f;
-
-            Assert.AreEqual(3.00001f, three, .001);
-            Assert.That( three, Is.EqualTo(3.00001f).Within(.001));
-        }
-
-        private enum Colors
-        {
-            Red,
-            Blue,
-            Green
-        }
-
-        [Test]
-        public void CanCompareNullableEnums()
-        {
-            Colors? color = Colors.Red;
-            Colors? other = Colors.Red;
-
-            Assert.AreEqual(color, other);
-            Assert.AreEqual(color, Colors.Red);
-            Assert.AreEqual(Colors.Red, color);
-        }
-
-        [Test]
-        public void CanCompareNullableMixedNumerics()
-        {
-            int? int5 = 5;
-            double? double5 = 5.0;
-            decimal? decimal5 = 5.00m;
-
-            Assert.AreEqual(int5, double5);
-            Assert.AreEqual(int5, decimal5);
-            Assert.AreEqual(double5, int5);
-            Assert.AreEqual(double5, decimal5);
-            Assert.AreEqual(decimal5, int5);
-            Assert.AreEqual(decimal5, double5);
-
-            Assert.That(int5, Is.EqualTo(double5));
-            Assert.That(int5, Is.EqualTo(decimal5));
-            Assert.That(double5, Is.EqualTo(int5));
-            Assert.That(double5, Is.EqualTo(decimal5));
-            Assert.That(decimal5, Is.EqualTo(int5));
-            Assert.That(decimal5, Is.EqualTo(double5));
-
-            Assert.AreEqual(5, double5);
-            Assert.AreEqual(5, decimal5);
-            Assert.AreEqual(5.0, int5);
-            Assert.AreEqual(5.0, decimal5);
-            Assert.AreEqual(5m, int5);
-            Assert.AreEqual(5m, double5);
-
-            Assert.That(5, Is.EqualTo(double5));
-            Assert.That(5, Is.EqualTo(decimal5));
-            Assert.That(5.0, Is.EqualTo(int5));
-            Assert.That(5.0, Is.EqualTo(decimal5));
-            Assert.That(5m, Is.EqualTo(int5));
-            Assert.That(5m, Is.EqualTo(double5));
-
-            Assert.AreEqual(double5, 5);
-            Assert.AreEqual(decimal5, 5);
-            Assert.AreEqual(int5, 5.0);
-            Assert.AreEqual(decimal5, 5.0);
-            Assert.AreEqual(int5, 5m);
-            Assert.AreEqual(double5, 5m);
-
-            Assert.That(double5, Is.EqualTo(5));
-            Assert.That(decimal5, Is.EqualTo(5));
-            Assert.That(int5, Is.EqualTo(5.0));
-            Assert.That(decimal5, Is.EqualTo(5.0));
-            Assert.That(int5, Is.EqualTo(5m));
-            Assert.That(double5, Is.EqualTo(5m));
-
-#if false
-            Assert.Greater(int5, 3.0);
-            Assert.Greater(int5, 3m);
-            Assert.Greater(double5, 3);
-            Assert.Greater(double5, 3m);
-            Assert.Greater(decimal5, 3);
-            Assert.Greater(decimal5, 3.0);
-
-            Assert.That(int5, Is.GreaterThan(3.0));
-            Assert.That(int5, Is.GreaterThan(3m));
-            Assert.That(double5, Is.GreaterThan(3));
-            Assert.That(double5, Is.GreaterThan(3m));
-            Assert.That(decimal5, Is.GreaterThan(3));
-            Assert.That(decimal5, Is.GreaterThan(3.0));
-
-            Assert.Less(3.0, int5);
-            Assert.Less(3m, int5);
-            Assert.Less(3, double5);
-            Assert.Less(3m, double5);
-            Assert.Less(3, decimal5);
-            Assert.Less(3.0, decimal5);
-#endif
-            //Assert.That(3.0, Is.LessThan(int5));
-            //Assert.That(3m, Is.LessThan(int5));
-            //Assert.That(3, Is.LessThan(double5));
-            //Assert.That(3m, Is.LessThan(double5));
-            //Assert.That(3, Is.LessThan(decimal5));
-            //Assert.That(3.0, Is.LessThan(decimal5));
-        }
-
-        private struct MyStruct
-        {
-            int i;
-            string s;
-
-            public MyStruct(int i, string s)
-            {
-                this.i = i;
-                this.s = s;
-            }
-        }
-
-        [Test]
-        public void CanCompareNullableStructs()
-        {
-            MyStruct struct1 = new MyStruct(5, "Hello");
-            MyStruct struct2 = new MyStruct(5, "Hello");
-            Nullable<MyStruct> one = new MyStruct(5, "Hello");
-            Nullable<MyStruct> two = new MyStruct(5, "Hello");
-
-            Assert.AreEqual(struct1, struct2); // Control
-            Assert.AreEqual(one, two);
-            Assert.AreEqual(one, struct1);
-            Assert.AreEqual(struct2, two);
-        }
-    }
-#endif
-#endif
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+#if CLR_2_0 || CLR_4_0
+#if !MONO
+    [TestFixture, Category("Generics")]
+    public class NullableTypesTests
+    {
+        [Test]
+        public void CanTestForNull()
+        {
+            int? nullInt = null;
+            int? five = 5;
+
+            Assert.IsNull(nullInt);
+            Assert.IsNotNull(five);
+            Assert.That(nullInt, Is.Null);
+            Assert.That(five, Is.Not.Null);
+        }
+
+#if false
+        [Test]
+        public void CanCompareNullableInts()
+        {
+            int? five = 5;
+            int? answer = 2 + 3;
+
+            Assert.AreEqual(five, answer);
+            Assert.AreEqual(five, 5);
+            Assert.AreEqual(5, five);
+
+            Assert.That(five, Is.EqualTo(answer));
+            Assert.That(five, Is.EqualTo(5));
+            Assert.That(5, Is.EqualTo(five));
+
+            Assert.Greater(five, 3);
+            Assert.GreaterOrEqual(five, 5);
+            Assert.Less(3, five);
+            Assert.LessOrEqual(5, five);
+
+            Assert.That(five, Is.GreaterThan(3));
+            Assert.That(five, Is.GreaterThanOrEqualTo(5));
+            //Assert.That(3, Is.LessThan(five));
+            //Assert.That(5, Is.LessThanOrEqualTo(five));
+        }
+		
+        [Test]
+        public void CanCompareNullableDoubles()
+        {
+            double? five = 5.0;
+            double? answer = 2.0 + 3.0;
+
+            Assert.AreEqual(five, answer);
+            Assert.AreEqual(five, 5.0);
+            Assert.AreEqual(5.0, five);
+
+            Assert.That(five, Is.EqualTo(answer));
+            Assert.That(five, Is.EqualTo(5.0));
+            Assert.That(5.0, Is.EqualTo(five));
+
+            Assert.Greater(five, 3.0);
+            Assert.GreaterOrEqual(five, 5.0);
+            Assert.Less(3.0, five);
+            Assert.LessOrEqual(5.0, five);
+
+            Assert.That(five, Is.GreaterThan(3.0));
+            Assert.That(five, Is.GreaterThanOrEqualTo(5.0));
+            //Assert.That(3.0, Is.LessThan(five));
+            //Assert.That(5.0, Is.LessThanOrEqualTo(five));
+        }
+#endif
+
+        [Test]
+        public void CanTestForNaN()
+        {
+            double? anNaN = Double.NaN;
+            Assert.IsNaN(anNaN);
+            Assert.That(anNaN, Is.NaN);
+        }
+
+#if false
+        [Test]
+        public void CanCompareNullableDecimals()
+        {
+            decimal? five = 5m;
+            decimal? answer = 2m + 3m;
+
+            Assert.AreEqual(five, answer);
+            Assert.AreEqual(five, 5m);
+            Assert.AreEqual(5m, five);
+
+            Assert.That(five, Is.EqualTo(answer));
+            Assert.That(five, Is.EqualTo(5m));
+            Assert.That(5m, Is.EqualTo(five));
+
+            Assert.Greater(five, 3m);
+            Assert.GreaterOrEqual(five, 5m);
+            Assert.Less(3m, five);
+            Assert.LessOrEqual(5m, five);
+
+            Assert.That(five, Is.GreaterThan(3m));
+            Assert.That(five, Is.GreaterThanOrEqualTo(5m));
+            //Assert.That(3m, Is.LessThan(five));
+            //Assert.That(5m, Is.LessThanOrEqualTo(five));
+        }
+#endif
+		
+        [Test]
+        public void CanCompareWithTolerance()
+        {
+            double? five = 5.0;
+
+            Assert.AreEqual(5.0000001, five, .0001); 
+            Assert.That( five, Is.EqualTo(5.0000001).Within(.0001));
+
+            float? three = 3.0f;
+
+            Assert.AreEqual(3.00001f, three, .001);
+            Assert.That( three, Is.EqualTo(3.00001f).Within(.001));
+        }
+
+        private enum Colors
+        {
+            Red,
+            Blue,
+            Green
+        }
+
+        [Test]
+        public void CanCompareNullableEnums()
+        {
+            Colors? color = Colors.Red;
+            Colors? other = Colors.Red;
+
+            Assert.AreEqual(color, other);
+            Assert.AreEqual(color, Colors.Red);
+            Assert.AreEqual(Colors.Red, color);
+        }
+
+        [Test]
+        public void CanCompareNullableMixedNumerics()
+        {
+            int? int5 = 5;
+            double? double5 = 5.0;
+            decimal? decimal5 = 5.00m;
+
+            Assert.AreEqual(int5, double5);
+            Assert.AreEqual(int5, decimal5);
+            Assert.AreEqual(double5, int5);
+            Assert.AreEqual(double5, decimal5);
+            Assert.AreEqual(decimal5, int5);
+            Assert.AreEqual(decimal5, double5);
+
+            Assert.That(int5, Is.EqualTo(double5));
+            Assert.That(int5, Is.EqualTo(decimal5));
+            Assert.That(double5, Is.EqualTo(int5));
+            Assert.That(double5, Is.EqualTo(decimal5));
+            Assert.That(decimal5, Is.EqualTo(int5));
+            Assert.That(decimal5, Is.EqualTo(double5));
+
+            Assert.AreEqual(5, double5);
+            Assert.AreEqual(5, decimal5);
+            Assert.AreEqual(5.0, int5);
+            Assert.AreEqual(5.0, decimal5);
+            Assert.AreEqual(5m, int5);
+            Assert.AreEqual(5m, double5);
+
+            Assert.That(5, Is.EqualTo(double5));
+            Assert.That(5, Is.EqualTo(decimal5));
+            Assert.That(5.0, Is.EqualTo(int5));
+            Assert.That(5.0, Is.EqualTo(decimal5));
+            Assert.That(5m, Is.EqualTo(int5));
+            Assert.That(5m, Is.EqualTo(double5));
+
+            Assert.AreEqual(double5, 5);
+            Assert.AreEqual(decimal5, 5);
+            Assert.AreEqual(int5, 5.0);
+            Assert.AreEqual(decimal5, 5.0);
+            Assert.AreEqual(int5, 5m);
+            Assert.AreEqual(double5, 5m);
+
+            Assert.That(double5, Is.EqualTo(5));
+            Assert.That(decimal5, Is.EqualTo(5));
+            Assert.That(int5, Is.EqualTo(5.0));
+            Assert.That(decimal5, Is.EqualTo(5.0));
+            Assert.That(int5, Is.EqualTo(5m));
+            Assert.That(double5, Is.EqualTo(5m));
+
+#if false
+            Assert.Greater(int5, 3.0);
+            Assert.Greater(int5, 3m);
+            Assert.Greater(double5, 3);
+            Assert.Greater(double5, 3m);
+            Assert.Greater(decimal5, 3);
+            Assert.Greater(decimal5, 3.0);
+
+            Assert.That(int5, Is.GreaterThan(3.0));
+            Assert.That(int5, Is.GreaterThan(3m));
+            Assert.That(double5, Is.GreaterThan(3));
+            Assert.That(double5, Is.GreaterThan(3m));
+            Assert.That(decimal5, Is.GreaterThan(3));
+            Assert.That(decimal5, Is.GreaterThan(3.0));
+
+            Assert.Less(3.0, int5);
+            Assert.Less(3m, int5);
+            Assert.Less(3, double5);
+            Assert.Less(3m, double5);
+            Assert.Less(3, decimal5);
+            Assert.Less(3.0, decimal5);
+#endif
+            //Assert.That(3.0, Is.LessThan(int5));
+            //Assert.That(3m, Is.LessThan(int5));
+            //Assert.That(3, Is.LessThan(double5));
+            //Assert.That(3m, Is.LessThan(double5));
+            //Assert.That(3, Is.LessThan(decimal5));
+            //Assert.That(3.0, Is.LessThan(decimal5));
+        }
+
+        private struct MyStruct
+        {
+            int i;
+            string s;
+
+            public MyStruct(int i, string s)
+            {
+                this.i = i;
+                this.s = s;
+            }
+        }
+
+        [Test]
+        public void CanCompareNullableStructs()
+        {
+            MyStruct struct1 = new MyStruct(5, "Hello");
+            MyStruct struct2 = new MyStruct(5, "Hello");
+            Nullable<MyStruct> one = new MyStruct(5, "Hello");
+            Nullable<MyStruct> two = new MyStruct(5, "Hello");
+
+            Assert.AreEqual(struct1, struct2); // Control
+            Assert.AreEqual(one, two);
+            Assert.AreEqual(one, struct1);
+            Assert.AreEqual(struct2, two);
+        }
+    }
+#endif
+#endif
+}
diff --git a/src/NUnitFramework/tests/RandomizerTests.cs b/src/NUnitFramework/tests/RandomizerTests.cs
index 3a156d9..6ae59f4 100644
--- a/src/NUnitFramework/tests/RandomizerTests.cs
+++ b/src/NUnitFramework/tests/RandomizerTests.cs
@@ -1,109 +1,109 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Framework.Tests
-{
-    public class RandomizerTests
-    {
-        [Test]
-        public void RandomSeedsAreUnique()
-        {
-            int[] seeds = new int[10];
-            for (int i = 0; i < 10; i++)
-                seeds[i] = Randomizer.RandomSeed;
-
-            Assert.That(seeds, Is.Unique);
-        }
-
-        [Test]
-        public void RandomIntsAreUnique()
-        {
-            Randomizer r = new Randomizer();
-
-            int[] values = new int[10];
-            for (int i = 0; i < 10; i++)
-                values[i] = r.Next();
-
-            Assert.That(values, Is.Unique);
-        }
-
-        [Test]
-        public void RandomDoublesAreUnique()
-        {
-            Randomizer r = new Randomizer();
-
-            double[] values = new double[10];
-            for (int i = 0; i < 10; i++)
-                values[i] = r.NextDouble();
-
-            Assert.That(values, Is.Unique);
-        }
-
-        [Test]
-        public void RandomizersWithSameSeedsReturnSameValues()
-        {
-            Randomizer r1 = new Randomizer(1234);
-            Randomizer r2 = new Randomizer(1234);
-
-            for (int i = 0; i < 10; i++)
-                Assert.That(r1.NextDouble(), Is.EqualTo(r2.NextDouble()));
-        }
-
-        [Test]
-        public void RandomizersWithDifferentSeedsReturnDifferentValues()
-        {
-            Randomizer r1 = new Randomizer(1234);
-            Randomizer r2 = new Randomizer(4321);
-
-            for (int i = 0; i < 10; i++)
-                Assert.That(r1.NextDouble(), Is.Not.EqualTo(r2.NextDouble()));
-        }
-
-        [Test]
-        public void ReturnsSameRandomizerForSameParameter()
-        {
-            ParameterInfo p = testMethod.GetParameters()[0];
-            Randomizer r1 = Randomizer.GetRandomizer(p);
-            Randomizer r2 = Randomizer.GetRandomizer(p);
-            Assert.That(r1, Is.SameAs(r2));
-        }
-
-        [Test]
-        public void ReturnsSameRandomizerForDifferentParametersOfSameMethod()
-        {
-            ParameterInfo p1 = testMethod.GetParameters()[0];
-            ParameterInfo p2 = testMethod.GetParameters()[1];
-            Randomizer r1 = Randomizer.GetRandomizer(p1);
-            Randomizer r2 = Randomizer.GetRandomizer(p2);
-            Assert.That(r1, Is.SameAs(r2));
-        }
-
-        [Test]
-        public void ReturnsSameRandomizerForSameMethod()
-        {
-            Randomizer r1 = Randomizer.GetRandomizer(testMethod);
-            Randomizer r2 = Randomizer.GetRandomizer(testMethod);
-            Assert.That(r1, Is.SameAs(r2));
-        }
-
-        [Test]
-        public void ReturnsDifferentRandomizersForDifferentMethods()
-        {
-            Randomizer r1 = Randomizer.GetRandomizer(testMethod);
-            Randomizer r2 = Randomizer.GetRandomizer(MethodInfo.GetCurrentMethod());
-            Assert.That(r1, Is.Not.SameAs(r2));
-        }
-
-        static readonly MethodInfo testMethod =
-            typeof(RandomizerTests).GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Instance);
-        private void TestMethod(int x, int y)
-        {
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Framework.Tests
+{
+    public class RandomizerTests
+    {
+        [Test]
+        public void RandomSeedsAreUnique()
+        {
+            int[] seeds = new int[10];
+            for (int i = 0; i < 10; i++)
+                seeds[i] = Randomizer.RandomSeed;
+
+            Assert.That(seeds, Is.Unique);
+        }
+
+        [Test]
+        public void RandomIntsAreUnique()
+        {
+            Randomizer r = new Randomizer();
+
+            int[] values = new int[10];
+            for (int i = 0; i < 10; i++)
+                values[i] = r.Next();
+
+            Assert.That(values, Is.Unique);
+        }
+
+        [Test]
+        public void RandomDoublesAreUnique()
+        {
+            Randomizer r = new Randomizer();
+
+            double[] values = new double[10];
+            for (int i = 0; i < 10; i++)
+                values[i] = r.NextDouble();
+
+            Assert.That(values, Is.Unique);
+        }
+
+        [Test]
+        public void RandomizersWithSameSeedsReturnSameValues()
+        {
+            Randomizer r1 = new Randomizer(1234);
+            Randomizer r2 = new Randomizer(1234);
+
+            for (int i = 0; i < 10; i++)
+                Assert.That(r1.NextDouble(), Is.EqualTo(r2.NextDouble()));
+        }
+
+        [Test]
+        public void RandomizersWithDifferentSeedsReturnDifferentValues()
+        {
+            Randomizer r1 = new Randomizer(1234);
+            Randomizer r2 = new Randomizer(4321);
+
+            for (int i = 0; i < 10; i++)
+                Assert.That(r1.NextDouble(), Is.Not.EqualTo(r2.NextDouble()));
+        }
+
+        [Test]
+        public void ReturnsSameRandomizerForSameParameter()
+        {
+            ParameterInfo p = testMethod.GetParameters()[0];
+            Randomizer r1 = Randomizer.GetRandomizer(p);
+            Randomizer r2 = Randomizer.GetRandomizer(p);
+            Assert.That(r1, Is.SameAs(r2));
+        }
+
+        [Test]
+        public void ReturnsSameRandomizerForDifferentParametersOfSameMethod()
+        {
+            ParameterInfo p1 = testMethod.GetParameters()[0];
+            ParameterInfo p2 = testMethod.GetParameters()[1];
+            Randomizer r1 = Randomizer.GetRandomizer(p1);
+            Randomizer r2 = Randomizer.GetRandomizer(p2);
+            Assert.That(r1, Is.SameAs(r2));
+        }
+
+        [Test]
+        public void ReturnsSameRandomizerForSameMethod()
+        {
+            Randomizer r1 = Randomizer.GetRandomizer(testMethod);
+            Randomizer r2 = Randomizer.GetRandomizer(testMethod);
+            Assert.That(r1, Is.SameAs(r2));
+        }
+
+        [Test]
+        public void ReturnsDifferentRandomizersForDifferentMethods()
+        {
+            Randomizer r1 = Randomizer.GetRandomizer(testMethod);
+            Randomizer r2 = Randomizer.GetRandomizer(MethodInfo.GetCurrentMethod());
+            Assert.That(r1, Is.Not.SameAs(r2));
+        }
+
+        static readonly MethodInfo testMethod =
+            typeof(RandomizerTests).GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Instance);
+        private void TestMethod(int x, int y)
+        {
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/RangeTests.cs b/src/NUnitFramework/tests/RangeTests.cs
index a0a32a6..cfd16b6 100644
--- a/src/NUnitFramework/tests/RangeTests.cs
+++ b/src/NUnitFramework/tests/RangeTests.cs
@@ -1,66 +1,66 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class RangeTests
-	{
-        static readonly string NL = Environment.NewLine;
-
-		[Test]
-		public void InRangeSucceeds()
-		{
-			Assert.That( 7, Is.InRange(5, 10) );
-			Assert.That(0.23, Is.InRange(-1.0, 1.0));
-			Assert.That(DateTime.Parse("12-December-2008"),
-				Is.InRange(DateTime.Parse("1-October-2008"), DateTime.Parse("31-December-2008")));
-		}
-
-
-		[Test]
-		public void InRangeFails()
-		{
-			string expectedMessage =
-                "  Expected: in range (5,10)" + NL +
-                "  But was:  12" + NL;
-
-			Assert.That(
-				new TestDelegate( FailingInRangeMethod ),
-				Throws.TypeOf(typeof(AssertionException)).With.Message.EqualTo(expectedMessage));
-		}
-
-		private void FailingInRangeMethod()
-		{
-			Assert.That(12, Is.InRange(5, 10));
-		}
-
-		[Test]
-		public void NotInRangeSucceeds()
-		{
-			Assert.That(12, Is.Not.InRange(5, 10));
-			Assert.That(2.57, Is.Not.InRange(-1.0, 1.0));
-		}
-
-		[Test]
-		public void NotInRangeFails()
-		{
-			string expectedMessage =
-                "  Expected: not in range (5,10)" + NL +
-                "  But was:  7" + NL;
-
-			Assert.That(
-				new TestDelegate(FailingNotInRangeMethod),
-				Throws.TypeOf(typeof(AssertionException)).With.Message.EqualTo(expectedMessage));
-		}
-
-		private void FailingNotInRangeMethod()
-		{
-			Assert.That(7, Is.Not.InRange(5, 10));
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class RangeTests
+	{
+        static readonly string NL = Environment.NewLine;
+
+		[Test]
+		public void InRangeSucceeds()
+		{
+			Assert.That( 7, Is.InRange(5, 10) );
+			Assert.That(0.23, Is.InRange(-1.0, 1.0));
+			Assert.That(DateTime.Parse("12-December-2008"),
+				Is.InRange(DateTime.Parse("1-October-2008"), DateTime.Parse("31-December-2008")));
+		}
+
+
+		[Test]
+		public void InRangeFails()
+		{
+			string expectedMessage =
+                "  Expected: in range (5,10)" + NL +
+                "  But was:  12" + NL;
+
+			Assert.That(
+				new TestDelegate( FailingInRangeMethod ),
+				Throws.TypeOf(typeof(AssertionException)).With.Message.EqualTo(expectedMessage));
+		}
+
+		private void FailingInRangeMethod()
+		{
+			Assert.That(12, Is.InRange(5, 10));
+		}
+
+		[Test]
+		public void NotInRangeSucceeds()
+		{
+			Assert.That(12, Is.Not.InRange(5, 10));
+			Assert.That(2.57, Is.Not.InRange(-1.0, 1.0));
+		}
+
+		[Test]
+		public void NotInRangeFails()
+		{
+			string expectedMessage =
+                "  Expected: not in range (5,10)" + NL +
+                "  But was:  7" + NL;
+
+			Assert.That(
+				new TestDelegate(FailingNotInRangeMethod),
+				Throws.TypeOf(typeof(AssertionException)).With.Message.EqualTo(expectedMessage));
+		}
+
+		private void FailingNotInRangeMethod()
+		{
+			Assert.That(7, Is.Not.InRange(5, 10));
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/SameFixture.cs b/src/NUnitFramework/tests/SameFixture.cs
index a16d16b..c1b2f8d 100644
--- a/src/NUnitFramework/tests/SameFixture.cs
+++ b/src/NUnitFramework/tests/SameFixture.cs
@@ -1,44 +1,44 @@
-// ****************************************************************
-// 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 NUnit.Framework;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class SameFixture : MessageChecker
-	{
-		[Test]
-		public void Same()
-		{
-			string s1 = "S1";
-			Assert.AreSame(s1, s1);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void SameFails()
-		{
-			Exception ex1 = new Exception( "one" );
-			Exception ex2 = new Exception( "two" );
-			expectedMessage =
-				"  Expected: same as <System.Exception: one>" + Environment.NewLine +
-				"  But was:  <System.Exception: two>" + Environment.NewLine;
-			Assert.AreSame(ex1, ex2);
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void SameValueTypes()
-		{
-			int index = 2;
-			expectedMessage =
-				"  Expected: same as 2" + Environment.NewLine +
-				"  But was:  2" + Environment.NewLine;
-			Assert.AreSame(index, index);
-		}
-	}
-}
+// ****************************************************************
+// 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 NUnit.Framework;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class SameFixture : MessageChecker
+	{
+		[Test]
+		public void Same()
+		{
+			string s1 = "S1";
+			Assert.AreSame(s1, s1);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void SameFails()
+		{
+			Exception ex1 = new Exception( "one" );
+			Exception ex2 = new Exception( "two" );
+			expectedMessage =
+				"  Expected: same as <System.Exception: one>" + Environment.NewLine +
+				"  But was:  <System.Exception: two>" + Environment.NewLine;
+			Assert.AreSame(ex1, ex2);
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void SameValueTypes()
+		{
+			int index = 2;
+			expectedMessage =
+				"  Expected: same as 2" + Environment.NewLine +
+				"  But was:  2" + Environment.NewLine;
+			Assert.AreSame(index, index);
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/StringAssertTests.cs b/src/NUnitFramework/tests/StringAssertTests.cs
index fc5e709..f8ceaf2 100644
--- a/src/NUnitFramework/tests/StringAssertTests.cs
+++ b/src/NUnitFramework/tests/StringAssertTests.cs
@@ -1,139 +1,139 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture]
-	public class StringAssertTests : MessageChecker
-	{
-		[Test]
-		public void Contains()
-		{
-			StringAssert.Contains( "abc", "abc" );
-			StringAssert.Contains( "abc", "***abc" );
-			StringAssert.Contains( "abc", "**abc**" );
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void ContainsFails()
-		{
-            expectedMessage =
-                TextMessageWriter.Pfx_Expected + "String containing \"abc\"" + System.Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "\"abxcdxbc\"" + System.Environment.NewLine;
-            StringAssert.Contains("abc", "abxcdxbc");
-		}
-
-        [Test]
-        public void DoesNotContain()
-        {
-            StringAssert.DoesNotContain("x", "abc");
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void DoesNotContainFails()
-        {
-            StringAssert.DoesNotContain("abc", "**abc**");
-        }
-
-        [Test]
-		public void StartsWith()
-		{
-			StringAssert.StartsWith( "abc", "abcdef" );
-			StringAssert.StartsWith( "abc", "abc" );
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void StartsWithFails()
-		{
-            expectedMessage =
-                TextMessageWriter.Pfx_Expected + "String starting with \"xyz\"" + System.Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "\"abcxyz\"" + System.Environment.NewLine;
-            StringAssert.StartsWith("xyz", "abcxyz");
-		}
-
-        [Test]
-        public void DoesNotStartWith()
-        {
-            StringAssert.DoesNotStartWith("x", "abc");
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void DoesNotStartWithFails()
-        {
-            StringAssert.DoesNotStartWith("abc", "abc**");
-        }
-
-        [Test]
-		public void EndsWith()
-		{
-			StringAssert.EndsWith( "abc", "abc" );
-			StringAssert.EndsWith( "abc", "123abc" );
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void EndsWithFails()
-		{
-            expectedMessage =
-                TextMessageWriter.Pfx_Expected + "String ending with \"xyz\"" + System.Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "\"abcdef\"" + System.Environment.NewLine;
-            StringAssert.EndsWith( "xyz", "abcdef" );
-		}
-
-        [Test]
-        public void DoesNotEndWith()
-        {
-            StringAssert.DoesNotEndWith("x", "abc");
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void DoesNotEndWithFails()
-        {
-            StringAssert.DoesNotEndWith("abc", "***abc");
-        }
-
-        [Test]
-		public void CaseInsensitiveCompare()
-		{
-			StringAssert.AreEqualIgnoringCase( "name", "NAME" );
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void CaseInsensitiveCompareFails()
-		{
-            expectedMessage =
-                "  Expected string length 4 but was 5. Strings differ at index 4." + System.Environment.NewLine
-                + TextMessageWriter.Pfx_Expected + "\"Name\", ignoring case" + System.Environment.NewLine
-                + TextMessageWriter.Pfx_Actual   + "\"NAMES\"" + System.Environment.NewLine
-                + "  ---------------^" + System.Environment.NewLine;
-            StringAssert.AreEqualIgnoringCase("Name", "NAMES");
-		}
-
-		[Test]		
-		public void IsMatch()
-		{
-			StringAssert.IsMatch( "a?bc", "12a3bc45" );
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void IsMatchFails()
-		{
-            expectedMessage =
-                TextMessageWriter.Pfx_Expected + "String matching \"a?b*c\"" + System.Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + "\"12ab456\"" + System.Environment.NewLine;
-            StringAssert.IsMatch("a?b*c", "12ab456");
-		}
-
-		[Test]
-		public void DifferentEncodingsOfSameStringAreNotEqual()
-		{
-			string input = "Hello World";
-			byte[] data = System.Text.Encoding.Unicode.GetBytes( input );
-			string garbage = System.Text.Encoding.UTF8.GetString( data );
-
-			Assert.AreNotEqual( input, garbage );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture]
+	public class StringAssertTests : MessageChecker
+	{
+		[Test]
+		public void Contains()
+		{
+			StringAssert.Contains( "abc", "abc" );
+			StringAssert.Contains( "abc", "***abc" );
+			StringAssert.Contains( "abc", "**abc**" );
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void ContainsFails()
+		{
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "String containing \"abc\"" + System.Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "\"abxcdxbc\"" + System.Environment.NewLine;
+            StringAssert.Contains("abc", "abxcdxbc");
+		}
+
+        [Test]
+        public void DoesNotContain()
+        {
+            StringAssert.DoesNotContain("x", "abc");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotContainFails()
+        {
+            StringAssert.DoesNotContain("abc", "**abc**");
+        }
+
+        [Test]
+		public void StartsWith()
+		{
+			StringAssert.StartsWith( "abc", "abcdef" );
+			StringAssert.StartsWith( "abc", "abc" );
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void StartsWithFails()
+		{
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "String starting with \"xyz\"" + System.Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "\"abcxyz\"" + System.Environment.NewLine;
+            StringAssert.StartsWith("xyz", "abcxyz");
+		}
+
+        [Test]
+        public void DoesNotStartWith()
+        {
+            StringAssert.DoesNotStartWith("x", "abc");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotStartWithFails()
+        {
+            StringAssert.DoesNotStartWith("abc", "abc**");
+        }
+
+        [Test]
+		public void EndsWith()
+		{
+			StringAssert.EndsWith( "abc", "abc" );
+			StringAssert.EndsWith( "abc", "123abc" );
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void EndsWithFails()
+		{
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "String ending with \"xyz\"" + System.Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "\"abcdef\"" + System.Environment.NewLine;
+            StringAssert.EndsWith( "xyz", "abcdef" );
+		}
+
+        [Test]
+        public void DoesNotEndWith()
+        {
+            StringAssert.DoesNotEndWith("x", "abc");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void DoesNotEndWithFails()
+        {
+            StringAssert.DoesNotEndWith("abc", "***abc");
+        }
+
+        [Test]
+		public void CaseInsensitiveCompare()
+		{
+			StringAssert.AreEqualIgnoringCase( "name", "NAME" );
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void CaseInsensitiveCompareFails()
+		{
+            expectedMessage =
+                "  Expected string length 4 but was 5. Strings differ at index 4." + System.Environment.NewLine
+                + TextMessageWriter.Pfx_Expected + "\"Name\", ignoring case" + System.Environment.NewLine
+                + TextMessageWriter.Pfx_Actual   + "\"NAMES\"" + System.Environment.NewLine
+                + "  ---------------^" + System.Environment.NewLine;
+            StringAssert.AreEqualIgnoringCase("Name", "NAMES");
+		}
+
+		[Test]		
+		public void IsMatch()
+		{
+			StringAssert.IsMatch( "a?bc", "12a3bc45" );
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void IsMatchFails()
+		{
+            expectedMessage =
+                TextMessageWriter.Pfx_Expected + "String matching \"a?b*c\"" + System.Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + "\"12ab456\"" + System.Environment.NewLine;
+            StringAssert.IsMatch("a?b*c", "12ab456");
+		}
+
+		[Test]
+		public void DifferentEncodingsOfSameStringAreNotEqual()
+		{
+			string input = "Hello World";
+			byte[] data = System.Text.Encoding.Unicode.GetBytes( input );
+			string garbage = System.Text.Encoding.UTF8.GetString( data );
+
+			Assert.AreNotEqual( input, garbage );
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/Syntax/AfterTests.cs b/src/NUnitFramework/tests/Syntax/AfterTests.cs
index 4f675c1..405bfb1 100644
--- a/src/NUnitFramework/tests/Syntax/AfterTests.cs
+++ b/src/NUnitFramework/tests/Syntax/AfterTests.cs
@@ -1,178 +1,184 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Collections;
-
-namespace NUnit.Framework.Syntax
-{
-	public class AfterTest_SimpleConstraint : SyntaxTest
-	{
-		[SetUp]
-		public void SetUp()
-		{
-			parseTree = "<after 1000 <equal 10>>";
-			staticSyntax = Is.EqualTo(10).After(1000);
-			inheritedSyntax = Helper().EqualTo(10).After(1000);
-			builderSyntax = Builder().EqualTo(10).After(1000);
-		}
-	}
-
-	public class AfterTest_ProperyTest : SyntaxTest
-	{
-		[SetUp]
-		public void SetUp()
-		{
-			parseTree = "<after 1000 <property X <equal 10>>>";
-			staticSyntax = Has.Property("X").EqualTo(10).After(1000);
-			inheritedSyntax = Helper().Property("X").EqualTo(10).After(1000);
-			builderSyntax = Builder().Property("X").EqualTo(10).After(1000);
-		}
-	}
-
-	public class AfterTest_AndOperator : SyntaxTest
-	{
-		[SetUp]
-		public void SetUp()
-		{
-			parseTree = "<after 1000 <and <greaterthan 0> <lessthan 10>>>";
-			staticSyntax = Is.GreaterThan(0).And.LessThan(10).After(1000);
-			inheritedSyntax = Helper().GreaterThan(0).And.LessThan(10).After(1000);
-			builderSyntax = Builder().GreaterThan(0).And.LessThan(10).After(1000);
-		}
-    }
-
-#if CLR_2_0 || CLR_4_0
-    public abstract class AfterSyntaxTests
-    {
-        protected bool flag;
-        protected int num;
-        protected object ob1, ob2, ob3;
-        protected ArrayList list;
-        protected string greeting;
-
-        [SetUp]
-        public void InitializeValues()
-        {
-            this.flag = false;
-            this.num = 0;
-            this.ob1 = new object();
-            this.ob2 = new object();
-            this.ob3 = new object();
-            this.list = new ArrayList();
-            this.list.Add(1);
-            this.list.Add(2);
-            this.list.Add(3);
-            this.greeting = "hello";
-
-            new Thread(ModifyValuesAfterDelay).Start();
-        }
-
-        private void ModifyValuesAfterDelay()
-        {
-            Thread.Sleep(100);
-
-            this.flag = true;
-            this.num = 1;
-            this.ob1 = ob2;
-            this.ob3 = null;
-            this.list.Add(4);
-            this.greeting += "world";
-        }
-    }
-
-    public class AfterSyntaxUsingAnonymousDelegates : AfterSyntaxTests
-    {
-        [Test]
-        public void TrueTest()
-        {
-            Assert.That(delegate { return flag; }, Is.True.After(5000, 200));
-        }
-
-        [Test]
-        public void EqualToTest()
-        {
-            Assert.That(delegate { return num; }, Is.EqualTo(1).After(5000, 200));
-        }
-
-        [Test]
-        public void SameAsTest()
-        {
-            Assert.That(delegate { return ob1; }, Is.SameAs(ob2).After(5000, 200));
-        }
-
-        [Test]
-        public void GreaterTest()
-        {
-            Assert.That(delegate { return num; }, Is.GreaterThan(0).After(5000,200));
-        }
-
-        [Test]
-        public void HasMemberTest()
-        {
-            Assert.That(delegate { return list; }, Has.Member(4).After(5000, 200));
-        }
-
-        [Test]
-        public void NullTest()
-        {
-            Assert.That(delegate { return ob3; }, Is.Null.After(5000, 200));
-        }
-
-        [Test]
-        public void TextTest()
-        {
-            Assert.That(delegate { return greeting; }, Is.StringEnding("world").After(5000, 200));
-        }
-    }
-
-    public class AfterSyntaxUsingActualPassedByRef : AfterSyntaxTests
-    {
-        [Test]
-        public void TrueTest()
-        {
-            Assert.That(ref flag, Is.True.After(5000, 200));
-        }
-
-        [Test]
-        public void EqualToTest()
-        {
-            Assert.That(ref num, Is.EqualTo(1).After(5000, 200));
-        }
-
-        [Test]
-        public void SameAsTest()
-        {
-            Assert.That(ref ob1, Is.SameAs(ob2).After(5000, 200));
-        }
-
-        [Test]
-        public void GreaterTest()
-        {
-            Assert.That(ref num, Is.GreaterThan(0).After(5000, 200));
-        }
-
-        [Test]
-        public void HasMemberTest()
-        {
-            Assert.That(ref list, Has.Member(4).After(5000, 200));
-        }
-
-        [Test]
-        public void NullTest()
-        {
-            Assert.That(ref ob3, Is.Null.After(5000, 200));
-        }
-
-        [Test]
-        public void TextTest()
-        {
-            Assert.That(ref greeting, Is.StringEnding("world").After(5000, 200));
-        }
-    }
-#endif
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Collections;
+
+namespace NUnit.Framework.Syntax
+{
+	public class AfterTest_SimpleConstraint : SyntaxTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			parseTree = "<after 1000 <equal 10>>";
+			staticSyntax = Is.EqualTo(10).After(1000);
+			inheritedSyntax = Helper().EqualTo(10).After(1000);
+			builderSyntax = Builder().EqualTo(10).After(1000);
+		}
+	}
+
+	public class AfterTest_ProperyTest : SyntaxTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			parseTree = "<after 1000 <property X <equal 10>>>";
+			staticSyntax = Has.Property("X").EqualTo(10).After(1000);
+			inheritedSyntax = Helper().Property("X").EqualTo(10).After(1000);
+			builderSyntax = Builder().Property("X").EqualTo(10).After(1000);
+		}
+	}
+
+	public class AfterTest_AndOperator : SyntaxTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			parseTree = "<after 1000 <and <greaterthan 0> <lessthan 10>>>";
+			staticSyntax = Is.GreaterThan(0).And.LessThan(10).After(1000);
+			inheritedSyntax = Helper().GreaterThan(0).And.LessThan(10).After(1000);
+			builderSyntax = Builder().GreaterThan(0).And.LessThan(10).After(1000);
+		}
+    }
+
+#if CLR_2_0 || CLR_4_0
+    public abstract class AfterSyntaxTests
+    {
+        protected bool flag;
+        protected int num;
+        protected object ob1, ob2, ob3;
+        protected ArrayList list;
+        protected string greeting;
+
+        [SetUp]
+        public void InitializeValues()
+        {
+            this.flag = false;
+            this.num = 0;
+            this.ob1 = new object();
+            this.ob2 = new object();
+            this.ob3 = new object();
+            this.list = new ArrayList();
+            this.list.Add(1);
+            this.list.Add(2);
+            this.list.Add(3);
+            this.greeting = "hello";
+
+            new Thread(ModifyValuesAfterDelay).Start();
+        }
+
+        private void ModifyValuesAfterDelay()
+        {
+            Thread.Sleep(100);
+
+            this.flag = true;
+            this.num = 1;
+            this.ob1 = ob2;
+            this.ob3 = null;
+            this.list.Add(4);
+            this.greeting += "world";
+        }
+    }
+
+    public class AfterSyntaxUsingAnonymousDelegates : AfterSyntaxTests
+    {
+        [Test]
+        public void TrueTest()
+        {
+            Assert.That(delegate { return flag; }, Is.True.After(5000, 200));
+        }
+
+        [Test]
+        public void EqualToTest()
+        {
+            Assert.That(delegate { return num; }, Is.EqualTo(1).After(5000, 200));
+        }
+
+        [Test]
+        public void SameAsTest()
+        {
+            Assert.That(delegate { return ob1; }, Is.SameAs(ob2).After(5000, 200));
+        }
+
+        [Test]
+        public void GreaterTest()
+        {
+            Assert.That(delegate { return num; }, Is.GreaterThan(0).After(5000,200));
+        }
+
+        [Test]
+        public void HasMemberTest()
+        {
+            Assert.That(delegate { return list; }, Has.Member(4).After(5000, 200));
+        }
+
+        [Test]
+        public void NullTest()
+        {
+            Assert.That(delegate { return ob3; }, Is.Null.After(5000, 200));
+        }
+
+        [Test]
+        public void TextTest()
+        {
+            Assert.That(delegate { return greeting; }, Is.StringEnding("world").After(5000, 200));
+        }
+
+		[Test]
+		public void ThrowsTest()
+		{
+			Assert.That(delegate { throw new Exception(); }, Throws.TypeOf<Exception>().After(100));
+		}
+    }
+
+    public class AfterSyntaxUsingActualPassedByRef : AfterSyntaxTests
+    {
+        [Test]
+        public void TrueTest()
+        {
+            Assert.That(ref flag, Is.True.After(5000, 200));
+        }
+
+        [Test]
+        public void EqualToTest()
+        {
+            Assert.That(ref num, Is.EqualTo(1).After(5000, 200));
+        }
+
+        [Test]
+        public void SameAsTest()
+        {
+            Assert.That(ref ob1, Is.SameAs(ob2).After(5000, 200));
+        }
+
+        [Test]
+        public void GreaterTest()
+        {
+            Assert.That(ref num, Is.GreaterThan(0).After(5000, 200));
+        }
+
+        [Test]
+        public void HasMemberTest()
+        {
+            Assert.That(ref list, Has.Member(4).After(5000, 200));
+        }
+
+        [Test]
+        public void NullTest()
+        {
+            Assert.That(ref ob3, Is.Null.After(5000, 200));
+        }
+
+        [Test]
+        public void TextTest()
+        {
+            Assert.That(ref greeting, Is.StringEnding("world").After(5000, 200));
+        }
+    }
+#endif
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs b/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
index 44c4f9c..d9f0b9f 100644
--- a/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
+++ b/src/NUnitFramework/tests/Syntax/ArbitraryConstraintMatching.cs
@@ -1,81 +1,81 @@
-// ****************************************************************
-// 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
-{
-    [TestFixture]
-    public class ArbitraryConstraintMatching
-    {
-        Constraint custom = new CustomConstraint();
-        Constraint another = new AnotherConstraint();
-
-        [Test]
-        public void CanMatchCustomConstraint()
-        {
-            IResolveConstraint constraint = new ConstraintExpression().Matches(custom);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<custom>"));
-        }
-
-        [Test]
-        public void CanMatchCustomConstraintAfterPrefix()
-        {
-            IResolveConstraint constraint = Is.All.Matches(custom);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <custom>>"));
-        }
-
-        [Test]
-        public void CanMatchCustomConstraintsUnderAndOperator()
-        {
-            IResolveConstraint constraint = Is.All.Matches(custom).And.Matches(another);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <and <custom> <another>>>"));
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test]
-        public void CanMatchPredicate()
-        {
-            IResolveConstraint constraint = new ConstraintExpression().Matches(new Predicate<int>(IsEven));
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<predicate>"));
-            Assert.That(42, constraint);
-        }
-
-        bool IsEven(int num)
-        {
-            return (num & 1) == 0;
-        }
-
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void CanMatchLambda()
-        {
-            IResolveConstraint constraint = new ConstraintExpression().Matches<int>( (x) => (x & 1) == 0);
-            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<predicate>"));
-            Assert.That(42, constraint);
-        }
-#endif
-#endif
-
-        class CustomConstraint : Constraint
-        {
-            public override bool Matches(object actual)
-            {
-                throw new NotImplementedException();
-            }
-
-            public override void WriteDescriptionTo(MessageWriter writer)
-            {
-                throw new NotImplementedException();
-            }
-        }
-
-        class AnotherConstraint : CustomConstraint
-        {
-        }
-    }
-}
+// ****************************************************************
+// 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
+{
+    [TestFixture]
+    public class ArbitraryConstraintMatching
+    {
+        Constraint custom = new CustomConstraint();
+        Constraint another = new AnotherConstraint();
+
+        [Test]
+        public void CanMatchCustomConstraint()
+        {
+            IResolveConstraint constraint = new ConstraintExpression().Matches(custom);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<custom>"));
+        }
+
+        [Test]
+        public void CanMatchCustomConstraintAfterPrefix()
+        {
+            IResolveConstraint constraint = Is.All.Matches(custom);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <custom>>"));
+        }
+
+        [Test]
+        public void CanMatchCustomConstraintsUnderAndOperator()
+        {
+            IResolveConstraint constraint = Is.All.Matches(custom).And.Matches(another);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<all <and <custom> <another>>>"));
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test]
+        public void CanMatchPredicate()
+        {
+            IResolveConstraint constraint = new ConstraintExpression().Matches(new Predicate<int>(IsEven));
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<predicate>"));
+            Assert.That(42, constraint);
+        }
+
+        bool IsEven(int num)
+        {
+            return (num & 1) == 0;
+        }
+
+#if CS_3_0 || CS_4_0 || CS_5_0
+        [Test]
+        public void CanMatchLambda()
+        {
+            IResolveConstraint constraint = new ConstraintExpression().Matches<int>( (x) => (x & 1) == 0);
+            Assert.That(constraint.Resolve().ToString(), Is.EqualTo("<predicate>"));
+            Assert.That(42, constraint);
+        }
+#endif
+#endif
+
+        class CustomConstraint : Constraint
+        {
+            public override bool Matches(object actual)
+            {
+                throw new NotImplementedException();
+            }
+
+            public override void WriteDescriptionTo(MessageWriter writer)
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        class AnotherConstraint : CustomConstraint
+        {
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/CollectionTests.cs b/src/NUnitFramework/tests/Syntax/CollectionTests.cs
index 4cd1f30..9294a45 100644
--- a/src/NUnitFramework/tests/Syntax/CollectionTests.cs
+++ b/src/NUnitFramework/tests/Syntax/CollectionTests.cs
@@ -1,259 +1,259 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-using NUnit.Framework.Tests;
-
-namespace NUnit.Framework.Syntax
-{
-    public class UniqueTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<uniqueitems>";
-            staticSyntax = Is.Unique;
-            inheritedSyntax = Helper().Unique;
-            builderSyntax = Builder().Unique;
-        }
-    }
-
-    public class CollectionOrderedTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<ordered>";
-            staticSyntax = Is.Ordered;
-            inheritedSyntax = Helper().Ordered;
-            builderSyntax = Builder().Ordered;
-        }
-    }
-
-    public class CollectionOrderedTest_Descending : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<ordered descending>";
-            staticSyntax = Is.Ordered.Descending;
-            inheritedSyntax = Helper().Ordered.Descending;
-            builderSyntax = Builder().Ordered.Descending;
-        }
-    }
-
-    public class CollectionOrderedTest_Comparer : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            IComparer comparer = Comparer.Default;
-            parseTree = "<ordered System.Collections.Comparer>";
-            staticSyntax = Is.Ordered.Using(comparer);
-            inheritedSyntax = Helper().Ordered.Using(comparer);
-            builderSyntax = Builder().Ordered.Using(comparer);
-        }
-    }
-
-    public class CollectionOrderedTest_Comparer_Descending : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            IComparer comparer = Comparer.Default;
-            parseTree = "<ordered descending System.Collections.Comparer>";
-            staticSyntax = Is.Ordered.Using(comparer).Descending;
-            inheritedSyntax = Helper().Ordered.Using(comparer).Descending;
-            builderSyntax = Builder().Ordered.Using(comparer).Descending;
-        }
-    }
-
-    public class CollectionOrderedByTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<orderedby SomePropertyName>";
-            staticSyntax = Is.Ordered.By("SomePropertyName");
-            inheritedSyntax = Helper().Ordered.By("SomePropertyName");
-            builderSyntax = Builder().Ordered.By("SomePropertyName");
-        }
-    }
-
-    public class CollectionOrderedByTest_Descending : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<orderedby SomePropertyName descending>";
-            staticSyntax = Is.Ordered.By("SomePropertyName").Descending;
-            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Descending;
-            builderSyntax = Builder().Ordered.By("SomePropertyName").Descending;
-        }
-    }
-
-    public class CollectionOrderedByTest_Comparer : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<orderedby SomePropertyName System.Collections.Comparer>";
-            staticSyntax = Is.Ordered.By("SomePropertyName").Using(Comparer.Default);
-            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Using(Comparer.Default);
-            builderSyntax = Builder().Ordered.By("SomePropertyName").Using(Comparer.Default);
-        }
-    }
-
-    public class CollectionOrderedByTest_Comparer_Descending : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<orderedby SomePropertyName descending System.Collections.Comparer>";
-            staticSyntax = Is.Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
-            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
-            builderSyntax = Builder().Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
-        }
-    }
-
-    public class CollectionContainsTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<contains 42>";
-            staticSyntax = Contains.Item(42);
-            inheritedSyntax = Helper().Contains(42);
-            builderSyntax = Builder().Contains(42);
-        }
-    }
-
-    public class CollectionContainsTest_String : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<contains \"abc\">";
-            staticSyntax = Contains.Item("abc");
-            inheritedSyntax = Helper().Contains("abc");
-            builderSyntax = Builder().Contains("abc");
-        }
-    }
-
-    public class CollectionContainsTest_Comparer : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<contains 42>";
-            staticSyntax = Contains.Item(42).Using(Comparer.Default);
-            inheritedSyntax = Helper().Contains(42).Using(Comparer.Default);
-            builderSyntax = Builder().Contains(42).Using(Comparer.Default);
-        }
-
-		[Test]
-		public void ComparerIsCalled()
-		{
-			TestComparer comparer = new TestComparer();
-            Assert.That(new int[] { 1, 2, 3 }, 
-                Contains.Item(2).Using(comparer));
-			Assert.That(comparer.Called, "Comparer was not called");
-		}
-
-		[Test]
-		public void ComparerIsCalledInExpression()
-		{
-			TestComparer comparer = new TestComparer();
-            Assert.That(new int[] { 1, 2, 3 }, 
-                Has.Length.EqualTo(3).And.Contains(2).Using(comparer));
-			Assert.That(comparer.Called, "Comparer was not called");
-		}
-	}
-
-    public class CollectionContainsTest_Comparer_String : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<contains \"abc\">";
-            staticSyntax = Contains.Item("abc").Using(Comparer.Default);
-            inheritedSyntax = Helper().Contains("abc").Using(Comparer.Default);
-            builderSyntax = Builder().Contains("abc").Using(Comparer.Default);
-        }
-		
-		[Test]
-		public void ComparerIsCalled()
-		{
-			TestComparer comparer = new TestComparer();
-            Assert.That(new string[] { "Hello", "World" }, 
-                Contains.Item("World").Using(comparer));
-			Assert.That(comparer.Called, "Comparer was not called");
-		}
-
-		[Test]
-		public void ComparerIsCalledInExpression()
-		{
-			TestComparer comparer = new TestComparer();
-            Assert.That(new string[] { "Hello", "World" }, 
-                Has.Length.EqualTo(2).And.Contains("World").Using(comparer));
-			Assert.That(comparer.Called, "Comparer was not called");
-		}
-    }
-
-    public class CollectionMemberTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<contains 42>";
-            staticSyntax = Has.Member(42);
-            inheritedSyntax = Helper().Contains(42);
-            builderSyntax = Builder().Contains(42);
-        }
-    }
-
-    public class CollectionMemberTest_Comparer : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<contains 42>";
-            staticSyntax = Has.Member(42).Using(Comparer.Default);
-            inheritedSyntax = Helper().Contains(42).Using(Comparer.Default);
-            builderSyntax = Builder().Contains(42).Using(Comparer.Default);
-        }
-    }
-
-    public class CollectionSubsetTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            int[] ints = new int[] { 1, 2, 3 };
-            parseTree = "<subsetof System.Int32[]>";
-            staticSyntax = Is.SubsetOf(ints);
-            inheritedSyntax = Helper().SubsetOf(ints);
-            builderSyntax = Builder().SubsetOf(ints);
-        }
-    }
-
-    public class CollectionEquivalentTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            int[] ints = new int[] { 1, 2, 3 };
-            parseTree = "<equivalent System.Int32[]>";
-            staticSyntax = Is.EquivalentTo(ints);
-            inheritedSyntax = Helper().EquivalentTo(ints);
-            builderSyntax = Builder().EquivalentTo(ints);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+using NUnit.Framework.Tests;
+
+namespace NUnit.Framework.Syntax
+{
+    public class UniqueTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<uniqueitems>";
+            staticSyntax = Is.Unique;
+            inheritedSyntax = Helper().Unique;
+            builderSyntax = Builder().Unique;
+        }
+    }
+
+    public class CollectionOrderedTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<ordered>";
+            staticSyntax = Is.Ordered;
+            inheritedSyntax = Helper().Ordered;
+            builderSyntax = Builder().Ordered;
+        }
+    }
+
+    public class CollectionOrderedTest_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<ordered descending>";
+            staticSyntax = Is.Ordered.Descending;
+            inheritedSyntax = Helper().Ordered.Descending;
+            builderSyntax = Builder().Ordered.Descending;
+        }
+    }
+
+    public class CollectionOrderedTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            IComparer comparer = Comparer.Default;
+            parseTree = "<ordered System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.Using(comparer);
+            inheritedSyntax = Helper().Ordered.Using(comparer);
+            builderSyntax = Builder().Ordered.Using(comparer);
+        }
+    }
+
+    public class CollectionOrderedTest_Comparer_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            IComparer comparer = Comparer.Default;
+            parseTree = "<ordered descending System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.Using(comparer).Descending;
+            inheritedSyntax = Helper().Ordered.Using(comparer).Descending;
+            builderSyntax = Builder().Ordered.Using(comparer).Descending;
+        }
+    }
+
+    public class CollectionOrderedByTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName>";
+            staticSyntax = Is.Ordered.By("SomePropertyName");
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName");
+            builderSyntax = Builder().Ordered.By("SomePropertyName");
+        }
+    }
+
+    public class CollectionOrderedByTest_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName descending>";
+            staticSyntax = Is.Ordered.By("SomePropertyName").Descending;
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Descending;
+            builderSyntax = Builder().Ordered.By("SomePropertyName").Descending;
+        }
+    }
+
+    public class CollectionOrderedByTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.By("SomePropertyName").Using(Comparer.Default);
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Using(Comparer.Default);
+            builderSyntax = Builder().Ordered.By("SomePropertyName").Using(Comparer.Default);
+        }
+    }
+
+    public class CollectionOrderedByTest_Comparer_Descending : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<orderedby SomePropertyName descending System.Collections.Comparer>";
+            staticSyntax = Is.Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
+            inheritedSyntax = Helper().Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
+            builderSyntax = Builder().Ordered.By("SomePropertyName").Using(Comparer.Default).Descending;
+        }
+    }
+
+    public class CollectionContainsTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Contains.Item(42);
+            inheritedSyntax = Helper().Contains(42);
+            builderSyntax = Builder().Contains(42);
+        }
+    }
+
+    public class CollectionContainsTest_String : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains \"abc\">";
+            staticSyntax = Contains.Item("abc");
+            inheritedSyntax = Helper().Contains("abc");
+            builderSyntax = Builder().Contains("abc");
+        }
+    }
+
+    public class CollectionContainsTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Contains.Item(42).Using(Comparer.Default);
+            inheritedSyntax = Helper().Contains(42).Using(Comparer.Default);
+            builderSyntax = Builder().Contains(42).Using(Comparer.Default);
+        }
+
+        [Test]
+        public void ComparerIsCalled()
+        {
+            TestComparer comparer = new TestComparer();
+            Assert.That(new int[] { 1, 2, 3 },
+                Contains.Item(2).Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        [Test]
+        public void ComparerIsCalledInExpression()
+        {
+            TestComparer comparer = new TestComparer();
+            Assert.That(new int[] { 1, 2, 3 },
+                Has.Length.EqualTo(3).And.Contains(2).Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+    }
+
+    public class CollectionContainsTest_Comparer_String : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains \"abc\">";
+            staticSyntax = Contains.Item("abc").Using(Comparer.Default);
+            inheritedSyntax = Helper().Contains("abc").Using(Comparer.Default);
+            builderSyntax = Builder().Contains("abc").Using(Comparer.Default);
+        }
+
+        [Test]
+        public void ComparerIsCalled()
+        {
+            TestComparer comparer = new TestComparer();
+            Assert.That(new string[] { "Hello", "World" },
+                Contains.Item("World").Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+
+        [Test]
+        public void ComparerIsCalledInExpression()
+        {
+            TestComparer comparer = new TestComparer();
+            Assert.That(new string[] { "Hello", "World" },
+                Has.Length.EqualTo(2).And.Contains("World").Using(comparer));
+            Assert.That(comparer.Called, "Comparer was not called");
+        }
+    }
+
+    public class CollectionMemberTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Has.Member(42);
+            inheritedSyntax = Helper().Contains(42);
+            builderSyntax = Builder().Contains(42);
+        }
+    }
+
+    public class CollectionMemberTest_Comparer : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<contains 42>";
+            staticSyntax = Has.Member(42).Using(Comparer.Default);
+            inheritedSyntax = Helper().Contains(42).Using(Comparer.Default);
+            builderSyntax = Builder().Contains(42).Using(Comparer.Default);
+        }
+    }
+
+    public class CollectionSubsetTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            int[] ints = new int[] { 1, 2, 3 };
+            parseTree = "<subsetof System.Int32[]>";
+            staticSyntax = Is.SubsetOf(ints);
+            inheritedSyntax = Helper().SubsetOf(ints);
+            builderSyntax = Builder().SubsetOf(ints);
+        }
+    }
+
+    public class CollectionEquivalentTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            int[] ints = new int[] { 1, 2, 3 };
+            parseTree = "<equivalent System.Int32[]>";
+            staticSyntax = Is.EquivalentTo(ints);
+            inheritedSyntax = Helper().EquivalentTo(ints);
+            builderSyntax = Builder().EquivalentTo(ints);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/ComparisonTests.cs b/src/NUnitFramework/tests/Syntax/ComparisonTests.cs
index 358c9b9..ede346b 100644
--- a/src/NUnitFramework/tests/Syntax/ComparisonTests.cs
+++ b/src/NUnitFramework/tests/Syntax/ComparisonTests.cs
@@ -1,82 +1,82 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Syntax
-{
-    public class GreaterThanTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<greaterthan 7>";
-            staticSyntax = Is.GreaterThan(7);
-            inheritedSyntax = Helper().GreaterThan(7);
-            builderSyntax = Builder().GreaterThan(7);
-        }
-    }
-
-    public class GreaterThanOrEqualTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<greaterthanorequal 7>";
-            staticSyntax = Is.GreaterThanOrEqualTo(7);
-            inheritedSyntax = Helper().GreaterThanOrEqualTo(7);
-            builderSyntax = Builder().GreaterThanOrEqualTo(7);
-        }
-    }
-
-    public class AtLeastTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<greaterthanorequal 7>";
-            staticSyntax = Is.AtLeast(7);
-            inheritedSyntax = Helper().AtLeast(7);
-            builderSyntax = Builder().AtLeast(7);
-        }
-    }
-
-    public class LessThanTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<lessthan 7>";
-            staticSyntax = Is.LessThan(7);
-            inheritedSyntax = Helper().LessThan(7);
-            builderSyntax = Builder().LessThan(7);
-        }
-    }
-
-    public class LessThanOrEqualTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<lessthanorequal 7>";
-            staticSyntax = Is.LessThanOrEqualTo(7);
-            inheritedSyntax = Helper().LessThanOrEqualTo(7);
-            builderSyntax = Builder().LessThanOrEqualTo(7);
-        }
-    }
-
-    public class AtMostTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<lessthanorequal 7>";
-            staticSyntax = Is.AtMost(7);
-            inheritedSyntax = Helper().AtMost(7);
-            builderSyntax = Builder().AtMost(7);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    public class GreaterThanTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthan 7>";
+            staticSyntax = Is.GreaterThan(7);
+            inheritedSyntax = Helper().GreaterThan(7);
+            builderSyntax = Builder().GreaterThan(7);
+        }
+    }
+
+    public class GreaterThanOrEqualTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthanorequal 7>";
+            staticSyntax = Is.GreaterThanOrEqualTo(7);
+            inheritedSyntax = Helper().GreaterThanOrEqualTo(7);
+            builderSyntax = Builder().GreaterThanOrEqualTo(7);
+        }
+    }
+
+    public class AtLeastTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<greaterthanorequal 7>";
+            staticSyntax = Is.AtLeast(7);
+            inheritedSyntax = Helper().AtLeast(7);
+            builderSyntax = Builder().AtLeast(7);
+        }
+    }
+
+    public class LessThanTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthan 7>";
+            staticSyntax = Is.LessThan(7);
+            inheritedSyntax = Helper().LessThan(7);
+            builderSyntax = Builder().LessThan(7);
+        }
+    }
+
+    public class LessThanOrEqualTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthanorequal 7>";
+            staticSyntax = Is.LessThanOrEqualTo(7);
+            inheritedSyntax = Helper().LessThanOrEqualTo(7);
+            builderSyntax = Builder().LessThanOrEqualTo(7);
+        }
+    }
+
+    public class AtMostTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<lessthanorequal 7>";
+            staticSyntax = Is.AtMost(7);
+            inheritedSyntax = Helper().AtMost(7);
+            builderSyntax = Builder().AtMost(7);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/EqualityTests.cs b/src/NUnitFramework/tests/Syntax/EqualityTests.cs
index f5e7f1e..d405a14 100644
--- a/src/NUnitFramework/tests/Syntax/EqualityTests.cs
+++ b/src/NUnitFramework/tests/Syntax/EqualityTests.cs
@@ -1,141 +1,141 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Syntax
-{
-    public class EqualToTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<equal 999>";
-            staticSyntax = Is.EqualTo(999);
-            inheritedSyntax = Helper().EqualTo(999);
-            builderSyntax = Builder().EqualTo(999);
-        }
-    }
-
-    public class EqualToTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<equal ""X"">";
-            staticSyntax = Is.EqualTo("X").IgnoreCase;
-            inheritedSyntax = Helper().EqualTo("X").IgnoreCase;
-            builderSyntax = Builder().EqualTo("X").IgnoreCase;
-        }
-    }
-
-    public class EqualToTest_WithinTolerance : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<equal 0.7>";
-            staticSyntax = Is.EqualTo(0.7).Within(.005);
-            inheritedSyntax = Helper().EqualTo(0.7).Within(.005);
-            builderSyntax = Builder().EqualTo(0.7).Within(.005);
-        }
-    }
-
-    
-    public class EqualityTests
-    {
-        [Test]
-        public void SimpleEqualityTests()
-        {
-            int[] i3 = new int[] { 1, 2, 3 };
-            double[] d3 = new double[] { 1.0, 2.0, 3.0 };
-            int[] iunequal = new int[] { 1, 3, 2 };
-
-            Assert.That(2 + 2, Is.EqualTo(4));
-            Assert.That(2 + 2 == 4);
-            Assert.That(i3, Is.EqualTo(d3));
-            Assert.That(2 + 2, Is.Not.EqualTo(5));
-            Assert.That(i3, Is.Not.EqualTo(iunequal));
-#if CLR_2_0 || CLR_4_0
-            List<string> list = new List<string>();
-            list.Add("foo");
-            list.Add("bar");
-            Assert.That(list, Is.EqualTo(new string[] { "foo", "bar" }));
-#endif
-        }
-
-        [Test]
-        public void EqualityTestsWithTolerance()
-        {
-            Assert.That(4.99d, Is.EqualTo(5.0d).Within(0.05d));
-            Assert.That(4.0d, Is.Not.EqualTo(5.0d).Within(0.5d));
-            Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f));
-            Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m));
-            Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u));
-            Assert.That(499, Is.EqualTo(500).Within(5));
-            Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L));
-            Assert.That(5999999999ul, Is.EqualTo(6000000000ul).Within(5ul));
-        }
-
-        [Test]
-        public void EqualityTestsWithTolerance_MixedFloatAndDouble()
-        {
-            // Bug Fix 1743844
-            Assert.That(2.20492d, Is.EqualTo(2.2d).Within(0.01f),
-                "Double actual, Double expected, Single tolerance");
-            Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01d),
-                "Double actual, Single expected, Double tolerance");
-            Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01f),
-                "Double actual, Single expected, Single tolerance");
-            Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01d),
-                "Single actual, Single expected, Double tolerance");
-            Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01d),
-                "Single actual, Double expected, Double tolerance");
-            Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01f),
-                "Single actual, Double expected, Single tolerance");
-        }
-
-        [Test]
-        public void EqualityTestsWithTolerance_MixingTypesGenerally()
-        {
-            // Extending tolerance to all numeric types
-            Assert.That(202d, Is.EqualTo(200d).Within(2),
-                "Double actual, Double expected, int tolerance");
-            Assert.That(4.87m, Is.EqualTo(5).Within(.25),
-                "Decimal actual, int expected, Double tolerance");
-            Assert.That(4.87m, Is.EqualTo(5ul).Within(1),
-                "Decimal actual, ulong expected, int tolerance");
-            Assert.That(487, Is.EqualTo(500).Within(25),
-                "int actual, int expected, int tolerance");
-            Assert.That(487u, Is.EqualTo(500).Within(25),
-                "uint actual, int expected, int tolerance");
-            Assert.That(487L, Is.EqualTo(500).Within(25),
-                "long actual, int expected, int tolerance");
-            Assert.That(487ul, Is.EqualTo(500).Within(25),
-                "ulong actual, int expected, int tolerance");
-        }
-
-        [Test]
-        public void EqualityTestsUsingDefaultFloatingPointTolerance()
-        {
-            GlobalSettings.DefaultFloatingPointTolerance = 0.05d;
-
-            try
-            {
-                Assert.That(4.99d, Is.EqualTo(5.0d));
-                Assert.That(4.0d, Is.Not.EqualTo(5.0d));
-                Assert.That(4.99f, Is.EqualTo(5.0f));
-            }
-            finally
-            {
-                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Syntax
+{
+    public class EqualToTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<equal 999>";
+            staticSyntax = Is.EqualTo(999);
+            inheritedSyntax = Helper().EqualTo(999);
+            builderSyntax = Builder().EqualTo(999);
+        }
+    }
+
+    public class EqualToTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<equal ""X"">";
+            staticSyntax = Is.EqualTo("X").IgnoreCase;
+            inheritedSyntax = Helper().EqualTo("X").IgnoreCase;
+            builderSyntax = Builder().EqualTo("X").IgnoreCase;
+        }
+    }
+
+    public class EqualToTest_WithinTolerance : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<equal 0.7>";
+            staticSyntax = Is.EqualTo(0.7).Within(.005);
+            inheritedSyntax = Helper().EqualTo(0.7).Within(.005);
+            builderSyntax = Builder().EqualTo(0.7).Within(.005);
+        }
+    }
+
+    
+    public class EqualityTests
+    {
+        [Test]
+        public void SimpleEqualityTests()
+        {
+            int[] i3 = new int[] { 1, 2, 3 };
+            double[] d3 = new double[] { 1.0, 2.0, 3.0 };
+            int[] iunequal = new int[] { 1, 3, 2 };
+
+            Assert.That(2 + 2, Is.EqualTo(4));
+            Assert.That(2 + 2 == 4);
+            Assert.That(i3, Is.EqualTo(d3));
+            Assert.That(2 + 2, Is.Not.EqualTo(5));
+            Assert.That(i3, Is.Not.EqualTo(iunequal));
+#if CLR_2_0 || CLR_4_0
+            List<string> list = new List<string>();
+            list.Add("foo");
+            list.Add("bar");
+            Assert.That(list, Is.EqualTo(new string[] { "foo", "bar" }));
+#endif
+        }
+
+        [Test]
+        public void EqualityTestsWithTolerance()
+        {
+            Assert.That(4.99d, Is.EqualTo(5.0d).Within(0.05d));
+            Assert.That(4.0d, Is.Not.EqualTo(5.0d).Within(0.5d));
+            Assert.That(4.99f, Is.EqualTo(5.0f).Within(0.05f));
+            Assert.That(4.99m, Is.EqualTo(5.0m).Within(0.05m));
+            Assert.That(3999999999u, Is.EqualTo(4000000000u).Within(5u));
+            Assert.That(499, Is.EqualTo(500).Within(5));
+            Assert.That(4999999999L, Is.EqualTo(5000000000L).Within(5L));
+            Assert.That(5999999999ul, Is.EqualTo(6000000000ul).Within(5ul));
+        }
+
+        [Test]
+        public void EqualityTestsWithTolerance_MixedFloatAndDouble()
+        {
+            // Bug Fix 1743844
+            Assert.That(2.20492d, Is.EqualTo(2.2d).Within(0.01f),
+                "Double actual, Double expected, Single tolerance");
+            Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01d),
+                "Double actual, Single expected, Double tolerance");
+            Assert.That(2.20492d, Is.EqualTo(2.2f).Within(0.01f),
+                "Double actual, Single expected, Single tolerance");
+            Assert.That(2.20492f, Is.EqualTo(2.2f).Within(0.01d),
+                "Single actual, Single expected, Double tolerance");
+            Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01d),
+                "Single actual, Double expected, Double tolerance");
+            Assert.That(2.20492f, Is.EqualTo(2.2d).Within(0.01f),
+                "Single actual, Double expected, Single tolerance");
+        }
+
+        [Test]
+        public void EqualityTestsWithTolerance_MixingTypesGenerally()
+        {
+            // Extending tolerance to all numeric types
+            Assert.That(202d, Is.EqualTo(200d).Within(2),
+                "Double actual, Double expected, int tolerance");
+            Assert.That(4.87m, Is.EqualTo(5).Within(.25),
+                "Decimal actual, int expected, Double tolerance");
+            Assert.That(4.87m, Is.EqualTo(5ul).Within(1),
+                "Decimal actual, ulong expected, int tolerance");
+            Assert.That(487, Is.EqualTo(500).Within(25),
+                "int actual, int expected, int tolerance");
+            Assert.That(487u, Is.EqualTo(500).Within(25),
+                "uint actual, int expected, int tolerance");
+            Assert.That(487L, Is.EqualTo(500).Within(25),
+                "long actual, int expected, int tolerance");
+            Assert.That(487ul, Is.EqualTo(500).Within(25),
+                "ulong actual, int expected, int tolerance");
+        }
+
+        [Test]
+        public void EqualityTestsUsingDefaultFloatingPointTolerance()
+        {
+            GlobalSettings.DefaultFloatingPointTolerance = 0.05d;
+
+            try
+            {
+                Assert.That(4.99d, Is.EqualTo(5.0d));
+                Assert.That(4.0d, Is.Not.EqualTo(5.0d));
+                Assert.That(4.99f, Is.EqualTo(5.0f));
+            }
+            finally
+            {
+                GlobalSettings.DefaultFloatingPointTolerance = 0.0d;
+            }
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs b/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
index 91e02ce..f79ce6b 100644
--- a/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
+++ b/src/NUnitFramework/tests/Syntax/InvalidCodeTests.cs
@@ -1,78 +1,78 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.CodeDom.Compiler;
-using NUnit.Framework.Constraints;
-#if CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.Framework.Syntax
-{
-    [TestFixture]
-    public class InvalidCodeTests : AssertionHelper
-    {
-        static readonly string template1 =
-@"using System;
-using NUnit.Framework;
-using NUnit.Framework.Constraints;
-
-class SomeClass
-{
-    void SomeMethod()
-    {
-        object c = $FRAGMENT$;
-    }
-}";
-
-        [TestCase("Is.Null.Not")]
-        [TestCase("Is.Not.Null.GreaterThan(10))")]
-        [TestCase("Is.Null.All")]
-        [TestCase("Is.And")]
-        [TestCase("Is.All.And.And")]
-        [TestCase("Is.Null.And.Throws")]
-        public void CodeShouldNotCompile(string fragment)
-        {
-            string code = template1.Replace("$FRAGMENT$", fragment);
-            TestCompiler compiler = new TestCompiler(
-                new string[] { "system.dll", "nunit.framework.dll" },
-                "test.dll");
-            CompilerResults results = compiler.CompileCode(code);
-            if (results.NativeCompilerReturnValue == 0)
-                Assert.Fail("Code fragment \"" + fragment + "\" should not compile but it did");
-        }
-
-        static readonly string template2 =
-@"using System;
-using NUnit.Framework;
-using NUnit.Framework.Constraints;
-
-class SomeClass
-{
-    void SomeMethod()
-    {
-        Assert.That(42, $FRAGMENT$);
-    }
-}";
-
-        [TestCase("Is.Not")]
-        [TestCase("Is.All")]
-        [TestCase("Is.Not.All")]
-        [TestCase("Is.All.Not")]
-        public void CodeShouldNotCompileAsFinishedConstraint(string fragment)
-        {
-            string code = template2.Replace("$FRAGMENT$", fragment);
-            TestCompiler compiler = new TestCompiler(
-                new string[] { "system.dll", "nunit.framework.dll" },
-                "test.dll");
-            CompilerResults results = compiler.CompileCode(code);
-            if (results.NativeCompilerReturnValue == 0)
-                Assert.Fail("Code fragment \"" + fragment + "\" should not compile as a finished constraint but it did");
-        }
-    }
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.CodeDom.Compiler;
+using NUnit.Framework.Constraints;
+#if CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class InvalidCodeTests : AssertionHelper
+    {
+        static readonly string template1 =
+@"using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+class SomeClass
+{
+    void SomeMethod()
+    {
+        object c = $FRAGMENT$;
+    }
+}";
+
+        [TestCase("Is.Null.Not")]
+        [TestCase("Is.Not.Null.GreaterThan(10))")]
+        [TestCase("Is.Null.All")]
+        [TestCase("Is.And")]
+        [TestCase("Is.All.And.And")]
+        [TestCase("Is.Null.And.Throws")]
+        public void CodeShouldNotCompile(string fragment)
+        {
+            string code = template1.Replace("$FRAGMENT$", fragment);
+            TestCompiler compiler = new TestCompiler(
+                new string[] { "system.dll", "nunit.framework.dll" },
+                "test.dll");
+            CompilerResults results = compiler.CompileCode(code);
+            if (results.NativeCompilerReturnValue == 0)
+                Assert.Fail("Code fragment \"" + fragment + "\" should not compile but it did");
+        }
+
+        static readonly string template2 =
+@"using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+class SomeClass
+{
+    void SomeMethod()
+    {
+        Assert.That(42, $FRAGMENT$);
+    }
+}";
+
+        [TestCase("Is.Not")]
+        [TestCase("Is.All")]
+        [TestCase("Is.Not.All")]
+        [TestCase("Is.All.Not")]
+        public void CodeShouldNotCompileAsFinishedConstraint(string fragment)
+        {
+            string code = template2.Replace("$FRAGMENT$", fragment);
+            TestCompiler compiler = new TestCompiler(
+                new string[] { "system.dll", "nunit.framework.dll" },
+                "test.dll");
+            CompilerResults results = compiler.CompileCode(code);
+            if (results.NativeCompilerReturnValue == 0)
+                Assert.Fail("Code fragment \"" + fragment + "\" should not compile as a finished constraint but it did");
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs b/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs
index fb0e904..47e6634 100644
--- a/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs
+++ b/src/NUnitFramework/tests/Syntax/OperatorOverrides.cs
@@ -1,67 +1,111 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Syntax
-{
-    public class NotOperatorOverride : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<not <null>>";
-            staticSyntax = !Is.Null;
-            inheritedSyntax = !Helper().Null;
-            builderSyntax = !Builder().Null;
-        }
-    }
-
-    public class AndOperatorOverride : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<and <greaterthan 5> <lessthan 10>>";
-            staticSyntax = Is.GreaterThan(5) & Is.LessThan(10);
-            inheritedSyntax = Helper().GreaterThan(5) & Is.LessThan(10);
-            builderSyntax = Builder().GreaterThan(5) & Builder().LessThan(10);
-        }
-    }
-
-    public class OrOperatorOverride : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<or <lessthan 5> <greaterthan 10>>";
-            staticSyntax = Is.LessThan(5) | Is.GreaterThan(10);
-            inheritedSyntax = Helper().LessThan(5) | Is.GreaterThan(10);
-            builderSyntax = Builder().LessThan(5) | Is.GreaterThan(10);
-        }
-    }
-
-    public class MixedOperatorOverrides
-    {
-        [Test]
-        public void ComplexTests()
-        {
-            string expected = "<and <and <not <null>> <not <lessthan 5>>> <not <greaterthan 10>>>";
-
-            Constraint c =
-                Is.Not.Null & Is.Not.LessThan(5) & Is.Not.GreaterThan(10);
-            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
-
-            c = !Is.Null & !Is.LessThan(5) & !Is.GreaterThan(10);
-            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
-
-            Constraint x = null;
-            c = !x & !Is.LessThan(5) & !Is.GreaterThan(10);
-            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    public class NotOperatorOverride : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<not <null>>";
+            staticSyntax = !Is.Null;
+            inheritedSyntax = !Helper().Null;
+            builderSyntax = !Builder().Null;
+        }
+
+        [Test]
+        public void NotOperatorCanApplyToResolvableConstraintExpression()
+        {
+            Assert.That(GetType(), !Has.Attribute(typeof(DescriptionAttribute)));
+        }
+    }
+
+    [TestFixture, Description("Test")]
+    public class AndOperatorOverride : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <greaterthan 5> <lessthan 10>>";
+            staticSyntax = Is.GreaterThan(5) & Is.LessThan(10);
+            inheritedSyntax = Helper().GreaterThan(5) & Is.LessThan(10);
+            builderSyntax = Builder().GreaterThan(5) & Builder().LessThan(10);
+        }
+
+        [Test]
+        public void AndOperatorCanCombineTwoResolvableConstraintExpressions()
+        {
+            Assert.That(GetType(), Has.Attribute(typeof(TestFixtureAttribute)) & Has.Attribute(typeof(DescriptionAttribute)));
+        }
+
+        [Test]
+        public void AndOperatorCanCombineConstraintAndResolvableConstraintExpression()
+        {
+            Assert.That(GetType(), Is.EqualTo(typeof(AndOperatorOverride)) & Has.Attribute(typeof(DescriptionAttribute)));
+        }
+
+        [Test]
+        public void AndOperatorCanCombineResolvableConstraintExpressionAndConstraint()
+        {
+            Assert.That(GetType(), Has.Attribute(typeof(DescriptionAttribute)) & Is.EqualTo(typeof(AndOperatorOverride)));
+        }
+    }
+
+    [TestFixture]
+    public class OrOperatorOverride : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <lessthan 5> <greaterthan 10>>";
+            staticSyntax = Is.LessThan(5) | Is.GreaterThan(10);
+            inheritedSyntax = Helper().LessThan(5) | Is.GreaterThan(10);
+            builderSyntax = Builder().LessThan(5) | Is.GreaterThan(10);
+        }
+
+        [Test]
+        public void OrOperatorCanCombineTwoResolvableConstraintExpressions()
+        {
+            Assert.That(GetType(), Has.Attribute(typeof(TestFixtureAttribute)) | Has.Attribute(typeof(TestCaseAttribute)));
+        }
+
+        [Test]
+        public void OrOperatorCanCombineResolvableConstraintExpressionAndConstraint()
+        {
+            Assert.That(GetType(), Has.Attribute(typeof(TestFixtureAttribute)) | Is.EqualTo(7));
+        }
+
+        [Test]
+        public void OrOperatorCanCombineConstraintAndResolvableConstraintExpression()
+        {
+            Assert.That(GetType(), Is.EqualTo(7) | Has.Attribute(typeof(TestFixtureAttribute)));
+        }
+    }
+
+    public class MixedOperatorOverrides
+    {
+        [Test]
+        public void ComplexTests()
+        {
+            string expected = "<and <and <not <null>> <not <lessthan 5>>> <not <greaterthan 10>>>";
+
+            Constraint c =
+                Is.Not.Null & Is.Not.LessThan(5) & Is.Not.GreaterThan(10);
+            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
+
+            c = !Is.Null & !Is.LessThan(5) & !Is.GreaterThan(10);
+            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
+
+            Constraint x = null;
+            c = !x & !Is.LessThan(5) & !Is.GreaterThan(10);
+            Assert.That(c.ToString(), Is.EqualTo(expected).NoClip);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/OperatorTests.cs b/src/NUnitFramework/tests/Syntax/OperatorTests.cs
index 9dbedf8..6b55bb7 100644
--- a/src/NUnitFramework/tests/Syntax/OperatorTests.cs
+++ b/src/NUnitFramework/tests/Syntax/OperatorTests.cs
@@ -1,254 +1,254 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Syntax
-{
-    #region Not
-    public class NotTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<not <null>>";
-            staticSyntax = Is.Not.Null;
-            inheritedSyntax = Helper().Not.Null;
-            builderSyntax = Builder().Not.Null;
-        }
-    }
-
-    public class NotTest_Cascaded : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<not <not <not <null>>>>";
-            staticSyntax = Is.Not.Not.Not.Null;
-            inheritedSyntax = Helper().Not.Not.Not.Null;
-            builderSyntax = Builder().Not.Not.Not.Null;
-        }
-    }
-    #endregion
-
-    #region All
-    public class AllTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<all <greaterthan 0>>";
-            staticSyntax = Is.All.GreaterThan(0);
-            inheritedSyntax = Helper().All.GreaterThan(0);
-            builderSyntax = Builder().All.GreaterThan(0);
-        }
-    }
-    #endregion
-
-    #region Some
-    public class SomeTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<some <equal 3>>";
-            staticSyntax = Has.Some.EqualTo(3);
-            inheritedSyntax = Helper().Some.EqualTo(3);
-            builderSyntax = Builder().Some.EqualTo(3);
-        }
-    }
-
-    public class SomeTest_BeforeBinaryOperators : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<some <or <and <greaterthan 0> <lessthan 100>> <equal 999>>>";
-            staticSyntax = Has.Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
-            inheritedSyntax = Helper().Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
-            builderSyntax = Builder().Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
-        }
-    }
-
-    public class SomeTest_NestedSome : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<some <some <lessthan 100>>>";
-            staticSyntax = Has.Some.With.Some.LessThan(100);
-            inheritedSyntax = Helper().Some.With.Some.LessThan(100);
-            builderSyntax = Builder().Some.With.Some.LessThan(100);
-        }
-        
-    }
-
-    public class SomeTest_UseOfAndSome : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<and <some <greaterthan 0>> <some <lessthan 100>>>";
-            staticSyntax = Has.Some.GreaterThan(0).And.Some.LessThan(100);
-            inheritedSyntax = Helper().Some.GreaterThan(0).And.Some.LessThan(100);
-            builderSyntax = Builder().Some.GreaterThan(0).And.Some.LessThan(100);
-        }
-    }
-    #endregion
-
-    #region None
-    public class NoneTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<none <lessthan 0>>";
-            staticSyntax = Has.None.LessThan(0);
-            inheritedSyntax = Helper().None.LessThan(0);
-            builderSyntax = Builder().None.LessThan(0);
-        }
-    }
-    #endregion
-
-    #region And
-    public class AndTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<and <greaterthan 5> <lessthan 10>>";
-            staticSyntax = Is.GreaterThan(5).And.LessThan(10);
-            inheritedSyntax = Helper().GreaterThan(5).And.LessThan(10);
-            builderSyntax = Builder().GreaterThan(5).And.LessThan(10);
-        }
-    }
-
-    public class AndTest_ThreeAndsWithNot : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<and <not <null>> <and <not <lessthan 5>> <not <greaterthan 10>>>>";
-            staticSyntax = Is.Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
-            inheritedSyntax = Helper().Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
-            builderSyntax = Builder().Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
-        }
-    }
-    #endregion
-
-    #region Or
-    public class OrTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<or <lessthan 5> <greaterthan 10>>";
-            staticSyntax = Is.LessThan(5).Or.GreaterThan(10);
-            inheritedSyntax = Helper().LessThan(5).Or.GreaterThan(10);
-            builderSyntax = Builder().LessThan(5).Or.GreaterThan(10);
-        }
-    }
-
-    public class OrTest_ThreeOrs : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<or <lessthan 5> <or <greaterthan 10> <equal 7>>>";
-            staticSyntax = Is.LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
-            inheritedSyntax = Helper().LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
-            builderSyntax = Builder().LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
-        }
-    }
-    #endregion
-
-    #region Binary Operator Precedence
-    public class AndIsEvaluatedBeforeFollowingOr : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<or <and <lessthan 100> <greaterthan 0>> <equal 999>>";
-            staticSyntax = Is.LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
-            inheritedSyntax = Helper().LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
-            builderSyntax = Builder().LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
-        }
-    }
-
-    public class AndIsEvaluatedBeforePrecedingOr : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<or <equal 999> <and <greaterthan 0> <lessthan 100>>>";
-            staticSyntax = Is.EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
-            inheritedSyntax = Helper().EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
-            builderSyntax = Builder().EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
-        }
-    }
-    #endregion
-
-    public class OperatorPrecedenceTests
-    {
-        class A
-        {
-            B B
-            {
-                get { return new B(); }
-            }
-
-            string X
-            {
-                get { return "X in A"; }
-            }
-
-            string Y
-            {
-                get { return "Y in A"; }
-            }
-        }
-
-        class B
-        {
-            string X
-            {
-                get { return "X in B"; }
-            }
-
-            string Y
-            {
-                get { return "Y in B"; }
-            }
-        }
-
-        [Test]
-        public void WithTests()
-        {
-            A a = new A();
-            Assert.That(a, Has.Property("X").EqualTo("X in A")
-                          .And.Property("Y").EqualTo("Y in A"));
-            Assert.That(a, Has.Property("X").EqualTo("X in A")
-                          .And.Property("B").Property("X").EqualTo("X in B"));
-            Assert.That(a, Has.Property("X").EqualTo("X in A")
-                          .And.Property("B").With.Property("X").EqualTo("X in B"));
-            Assert.That(a, Has.Property("B").Property("X").EqualTo("X in B")
-                          .And.Property("B").Property("Y").EqualTo("Y in B"));
-            Assert.That(a, Has.Property("B").Property("X").EqualTo("X in B")
-                          .And.Property("B").With.Property("Y").EqualTo("Y in B"));
-            Assert.That(a, Has.Property("B").With.Property("X").EqualTo("X in B")
-                                            .And.Property("Y").EqualTo("Y in B"));
-        }
-
-        [Test]
-        public void SomeTests()
-        {
-            string[] array = new string[] { "a", "aa", "x", "xy", "xyz" };
-            //Assert.That(array, Has.Some.StartsWith("a").And.Some.Length.EqualTo(3));
-            Assert.That(array, Has.None.StartsWith("a").And.Length.EqualTo(3));
-            Assert.That(array, Has.Some.StartsWith("x").And.Length.EqualTo(3));
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    #region Not
+    public class NotTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<not <null>>";
+            staticSyntax = Is.Not.Null;
+            inheritedSyntax = Helper().Not.Null;
+            builderSyntax = Builder().Not.Null;
+        }
+    }
+
+    public class NotTest_Cascaded : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<not <not <not <null>>>>";
+            staticSyntax = Is.Not.Not.Not.Null;
+            inheritedSyntax = Helper().Not.Not.Not.Null;
+            builderSyntax = Builder().Not.Not.Not.Null;
+        }
+    }
+    #endregion
+
+    #region All
+    public class AllTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<all <greaterthan 0>>";
+            staticSyntax = Is.All.GreaterThan(0);
+            inheritedSyntax = Helper().All.GreaterThan(0);
+            builderSyntax = Builder().All.GreaterThan(0);
+        }
+    }
+    #endregion
+
+    #region Some
+    public class SomeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<some <equal 3>>";
+            staticSyntax = Has.Some.EqualTo(3);
+            inheritedSyntax = Helper().Some.EqualTo(3);
+            builderSyntax = Builder().Some.EqualTo(3);
+        }
+    }
+
+    public class SomeTest_BeforeBinaryOperators : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<some <or <and <greaterthan 0> <lessthan 100>> <equal 999>>>";
+            staticSyntax = Has.Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
+            inheritedSyntax = Helper().Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
+            builderSyntax = Builder().Some.GreaterThan(0).And.LessThan(100).Or.EqualTo(999);
+        }
+    }
+
+    public class SomeTest_NestedSome : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<some <some <lessthan 100>>>";
+            staticSyntax = Has.Some.With.Some.LessThan(100);
+            inheritedSyntax = Helper().Some.With.Some.LessThan(100);
+            builderSyntax = Builder().Some.With.Some.LessThan(100);
+        }
+        
+    }
+
+    public class SomeTest_UseOfAndSome : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <some <greaterthan 0>> <some <lessthan 100>>>";
+            staticSyntax = Has.Some.GreaterThan(0).And.Some.LessThan(100);
+            inheritedSyntax = Helper().Some.GreaterThan(0).And.Some.LessThan(100);
+            builderSyntax = Builder().Some.GreaterThan(0).And.Some.LessThan(100);
+        }
+    }
+    #endregion
+
+    #region None
+    public class NoneTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<none <lessthan 0>>";
+            staticSyntax = Has.None.LessThan(0);
+            inheritedSyntax = Helper().None.LessThan(0);
+            builderSyntax = Builder().None.LessThan(0);
+        }
+    }
+    #endregion
+
+    #region And
+    public class AndTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <greaterthan 5> <lessthan 10>>";
+            staticSyntax = Is.GreaterThan(5).And.LessThan(10);
+            inheritedSyntax = Helper().GreaterThan(5).And.LessThan(10);
+            builderSyntax = Builder().GreaterThan(5).And.LessThan(10);
+        }
+    }
+
+    public class AndTest_ThreeAndsWithNot : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <not <null>> <and <not <lessthan 5>> <not <greaterthan 10>>>>";
+            staticSyntax = Is.Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
+            inheritedSyntax = Helper().Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
+            builderSyntax = Builder().Not.Null.And.Not.LessThan(5).And.Not.GreaterThan(10);
+        }
+    }
+    #endregion
+
+    #region Or
+    public class OrTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <lessthan 5> <greaterthan 10>>";
+            staticSyntax = Is.LessThan(5).Or.GreaterThan(10);
+            inheritedSyntax = Helper().LessThan(5).Or.GreaterThan(10);
+            builderSyntax = Builder().LessThan(5).Or.GreaterThan(10);
+        }
+    }
+
+    public class OrTest_ThreeOrs : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <lessthan 5> <or <greaterthan 10> <equal 7>>>";
+            staticSyntax = Is.LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
+            inheritedSyntax = Helper().LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
+            builderSyntax = Builder().LessThan(5).Or.GreaterThan(10).Or.EqualTo(7);
+        }
+    }
+    #endregion
+
+    #region Binary Operator Precedence
+    public class AndIsEvaluatedBeforeFollowingOr : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <and <lessthan 100> <greaterthan 0>> <equal 999>>";
+            staticSyntax = Is.LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
+            inheritedSyntax = Helper().LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
+            builderSyntax = Builder().LessThan(100).And.GreaterThan(0).Or.EqualTo(999);
+        }
+    }
+
+    public class AndIsEvaluatedBeforePrecedingOr : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<or <equal 999> <and <greaterthan 0> <lessthan 100>>>";
+            staticSyntax = Is.EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
+            inheritedSyntax = Helper().EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
+            builderSyntax = Builder().EqualTo(999).Or.GreaterThan(0).And.LessThan(100);
+        }
+    }
+    #endregion
+
+    public class OperatorPrecedenceTests
+    {
+        class A
+        {
+            B B
+            {
+                get { return new B(); }
+            }
+
+            string X
+            {
+                get { return "X in A"; }
+            }
+
+            string Y
+            {
+                get { return "Y in A"; }
+            }
+        }
+
+        class B
+        {
+            string X
+            {
+                get { return "X in B"; }
+            }
+
+            string Y
+            {
+                get { return "Y in B"; }
+            }
+        }
+
+        [Test]
+        public void WithTests()
+        {
+            A a = new A();
+            Assert.That(a, Has.Property("X").EqualTo("X in A")
+                          .And.Property("Y").EqualTo("Y in A"));
+            Assert.That(a, Has.Property("X").EqualTo("X in A")
+                          .And.Property("B").Property("X").EqualTo("X in B"));
+            Assert.That(a, Has.Property("X").EqualTo("X in A")
+                          .And.Property("B").With.Property("X").EqualTo("X in B"));
+            Assert.That(a, Has.Property("B").Property("X").EqualTo("X in B")
+                          .And.Property("B").Property("Y").EqualTo("Y in B"));
+            Assert.That(a, Has.Property("B").Property("X").EqualTo("X in B")
+                          .And.Property("B").With.Property("Y").EqualTo("Y in B"));
+            Assert.That(a, Has.Property("B").With.Property("X").EqualTo("X in B")
+                                            .And.Property("Y").EqualTo("Y in B"));
+        }
+
+        [Test]
+        public void SomeTests()
+        {
+            string[] array = new string[] { "a", "aa", "x", "xy", "xyz" };
+            //Assert.That(array, Has.Some.StartsWith("a").And.Some.Length.EqualTo(3));
+            Assert.That(array, Has.None.StartsWith("a").And.Length.EqualTo(3));
+            Assert.That(array, Has.Some.StartsWith("x").And.Length.EqualTo(3));
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs b/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs
index 166bb13..812cf12 100644
--- a/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs
+++ b/src/NUnitFramework/tests/Syntax/PathConstraintTests.cs
@@ -1,155 +1,155 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-
-namespace NUnit.Framework.Syntax
-{
-    public class SamePathTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-            string defaultCaseSensitivity = Path.DirectorySeparatorChar == '\\'
-                ? "ignorecase" : "respectcase";
-
-            parseTree = string.Format(@"<samepath ""{0}"" {1}>", path, defaultCaseSensitivity);
-            staticSyntax = Is.SamePath(path);
-            inheritedSyntax = Helper().SamePath(path);
-            builderSyntax = Builder().SamePath(path);
-        }
-    }
-
-    public class SamePathTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<samepath ""{0}"" ignorecase>", path);
-            staticSyntax = Is.SamePath(path).IgnoreCase;
-            inheritedSyntax = Helper().SamePath(path).IgnoreCase;
-            builderSyntax = Builder().SamePath(path).IgnoreCase;
-        }
-    }
-
-    public class NotSamePathTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<not <samepath ""{0}"" ignorecase>>", path);
-            staticSyntax = Is.Not.SamePath(path).IgnoreCase;
-            inheritedSyntax = Helper().Not.SamePath(path).IgnoreCase;
-            builderSyntax = Builder().Not.SamePath(path).IgnoreCase;
-        }
-    }
-
-    public class SamePathTest_RespectCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<samepath ""{0}"" respectcase>", path);
-            staticSyntax = Is.SamePath(path).RespectCase;
-            inheritedSyntax = Helper().SamePath(path).RespectCase;
-            builderSyntax = Builder().SamePath(path).RespectCase;
-        }
-    }
-
-    public class NotSamePathTest_RespectCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<not <samepath ""{0}"" respectcase>>", path);
-            staticSyntax = Is.Not.SamePath(path).RespectCase;
-            inheritedSyntax = Helper().Not.SamePath(path).RespectCase;
-            builderSyntax = Builder().Not.SamePath(path).RespectCase;
-        }
-    }
-
-    public class SamePathOrUnderTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-            string defaultCaseSensitivity = Path.DirectorySeparatorChar == '\\'
-                ? "ignorecase" : "respectcase";
-
-            parseTree = string.Format(@"<samepathorunder ""{0}"" {1}>", path, defaultCaseSensitivity);
-            staticSyntax = Is.SamePathOrUnder(path);
-            inheritedSyntax = Helper().SamePathOrUnder(path);
-            builderSyntax = Builder().SamePathOrUnder(path);
-        }
-    }
-
-    public class SamePathOrUnderTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<samepathorunder ""{0}"" ignorecase>", path);
-            staticSyntax = Is.SamePathOrUnder(path).IgnoreCase;
-            inheritedSyntax = Helper().SamePathOrUnder(path).IgnoreCase;
-            builderSyntax = Builder().SamePathOrUnder(path).IgnoreCase;
-        }
-    }
-
-    public class NotSamePathOrUnderTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<not <samepathorunder ""{0}"" ignorecase>>", path);
-            staticSyntax = Is.Not.SamePathOrUnder(path).IgnoreCase;
-            inheritedSyntax = Helper().Not.SamePathOrUnder(path).IgnoreCase;
-            builderSyntax = Builder().Not.SamePathOrUnder(path).IgnoreCase;
-        }
-    }
-
-    public class SamePathOrUnderTest_RespectCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<samepathorunder ""{0}"" respectcase>", path);
-            staticSyntax = Is.SamePathOrUnder(path).RespectCase;
-            inheritedSyntax = Helper().SamePathOrUnder(path).RespectCase;
-            builderSyntax = Builder().SamePathOrUnder(path).RespectCase;
-        }
-    }
-
-    public class NotSamePathOrUnderTest_RespectCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            string path = "/path/to/match";
-
-            parseTree = string.Format(@"<not <samepathorunder ""{0}"" respectcase>>", path);
-            staticSyntax = Is.Not.SamePathOrUnder(path).RespectCase;
-            inheritedSyntax = Helper().Not.SamePathOrUnder(path).RespectCase;
-            builderSyntax = Builder().Not.SamePathOrUnder(path).RespectCase;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+
+namespace NUnit.Framework.Syntax
+{
+    public class SamePathTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+            string defaultCaseSensitivity = Path.DirectorySeparatorChar == '\\'
+                ? "ignorecase" : "respectcase";
+
+            parseTree = string.Format(@"<samepath ""{0}"" {1}>", path, defaultCaseSensitivity);
+            staticSyntax = Is.SamePath(path);
+            inheritedSyntax = Helper().SamePath(path);
+            builderSyntax = Builder().SamePath(path);
+        }
+    }
+
+    public class SamePathTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepath ""{0}"" ignorecase>", path);
+            staticSyntax = Is.SamePath(path).IgnoreCase;
+            inheritedSyntax = Helper().SamePath(path).IgnoreCase;
+            builderSyntax = Builder().SamePath(path).IgnoreCase;
+        }
+    }
+
+    public class NotSamePathTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepath ""{0}"" ignorecase>>", path);
+            staticSyntax = Is.Not.SamePath(path).IgnoreCase;
+            inheritedSyntax = Helper().Not.SamePath(path).IgnoreCase;
+            builderSyntax = Builder().Not.SamePath(path).IgnoreCase;
+        }
+    }
+
+    public class SamePathTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepath ""{0}"" respectcase>", path);
+            staticSyntax = Is.SamePath(path).RespectCase;
+            inheritedSyntax = Helper().SamePath(path).RespectCase;
+            builderSyntax = Builder().SamePath(path).RespectCase;
+        }
+    }
+
+    public class NotSamePathTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepath ""{0}"" respectcase>>", path);
+            staticSyntax = Is.Not.SamePath(path).RespectCase;
+            inheritedSyntax = Helper().Not.SamePath(path).RespectCase;
+            builderSyntax = Builder().Not.SamePath(path).RespectCase;
+        }
+    }
+
+    public class SamePathOrUnderTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+            string defaultCaseSensitivity = Path.DirectorySeparatorChar == '\\'
+                ? "ignorecase" : "respectcase";
+
+            parseTree = string.Format(@"<samepathorunder ""{0}"" {1}>", path, defaultCaseSensitivity);
+            staticSyntax = Is.SamePathOrUnder(path);
+            inheritedSyntax = Helper().SamePathOrUnder(path);
+            builderSyntax = Builder().SamePathOrUnder(path);
+        }
+    }
+
+    public class SamePathOrUnderTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepathorunder ""{0}"" ignorecase>", path);
+            staticSyntax = Is.SamePathOrUnder(path).IgnoreCase;
+            inheritedSyntax = Helper().SamePathOrUnder(path).IgnoreCase;
+            builderSyntax = Builder().SamePathOrUnder(path).IgnoreCase;
+        }
+    }
+
+    public class NotSamePathOrUnderTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepathorunder ""{0}"" ignorecase>>", path);
+            staticSyntax = Is.Not.SamePathOrUnder(path).IgnoreCase;
+            inheritedSyntax = Helper().Not.SamePathOrUnder(path).IgnoreCase;
+            builderSyntax = Builder().Not.SamePathOrUnder(path).IgnoreCase;
+        }
+    }
+
+    public class SamePathOrUnderTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<samepathorunder ""{0}"" respectcase>", path);
+            staticSyntax = Is.SamePathOrUnder(path).RespectCase;
+            inheritedSyntax = Helper().SamePathOrUnder(path).RespectCase;
+            builderSyntax = Builder().SamePathOrUnder(path).RespectCase;
+        }
+    }
+
+    public class NotSamePathOrUnderTest_RespectCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            string path = "/path/to/match";
+
+            parseTree = string.Format(@"<not <samepathorunder ""{0}"" respectcase>>", path);
+            staticSyntax = Is.Not.SamePathOrUnder(path).RespectCase;
+            inheritedSyntax = Helper().Not.SamePathOrUnder(path).RespectCase;
+            builderSyntax = Builder().Not.SamePathOrUnder(path).RespectCase;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/PropertyTests.cs b/src/NUnitFramework/tests/Syntax/PropertyTests.cs
index 535f663..0d47861 100644
--- a/src/NUnitFramework/tests/Syntax/PropertyTests.cs
+++ b/src/NUnitFramework/tests/Syntax/PropertyTests.cs
@@ -1,114 +1,114 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-
-namespace NUnit.Framework.Syntax
-{
-    public class PropertyExistsTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<propertyexists X>";
-            staticSyntax = Has.Property("X");
-            inheritedSyntax = Helper().Property("X");
-            builderSyntax = Builder().Property("X");
-        }
-    }
-
-    public class PropertyExistsTest_AndFollows : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<and <propertyexists X> <equal 7>>";
-            staticSyntax = Has.Property("X").And.EqualTo(7);
-            inheritedSyntax = Helper().Property("X").And.EqualTo(7);
-            builderSyntax = Builder().Property("X").And.EqualTo(7);
-        }
-    }
-
-    public class PropertyTest_ConstraintFollows : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<property X <greaterthan 5>>";
-            staticSyntax = Has.Property("X").GreaterThan(5);
-            inheritedSyntax = Helper().Property("X").GreaterThan(5);
-            builderSyntax = Builder().Property("X").GreaterThan(5);
-        }
-    }
-
-    public class PropertyTest_NotFollows : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<property X <not <greaterthan 5>>>";
-            staticSyntax = Has.Property("X").Not.GreaterThan(5);
-            inheritedSyntax = Helper().Property("X").Not.GreaterThan(5);
-            builderSyntax = Builder().Property("X").Not.GreaterThan(5);
-        }
-    }
-
-    public class LengthTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<property Length <greaterthan 5>>";
-            staticSyntax = Has.Length.GreaterThan(5);
-            inheritedSyntax = Helper().Length.GreaterThan(5);
-            builderSyntax = Builder().Length.GreaterThan(5);
-        }
-    }
-
-    public class CountTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<property Count <equal 5>>";
-            staticSyntax = Has.Count.EqualTo(5);
-            inheritedSyntax = Helper().Count.EqualTo(5);
-            builderSyntax = Builder().Count.EqualTo(5);
-        }
-    }
-
-    public class MessageTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<property Message <startswith ""Expected"">>";
-            staticSyntax = Has.Message.StartsWith("Expected");
-            inheritedSyntax = Helper().Message.StartsWith("Expected");
-            builderSyntax = Builder().Message.StartsWith("Expected");
-        }
-    }
-
-    public class PropertySyntaxVariations
-    {
-        private readonly int[] ints = new int[] { 1, 2, 3 };
-
-        [Test]
-        public void ExistenceTest()
-        {
-            Assert.That(ints, Has.Property("Length"));
-            Assert.That(ints, Has.Length);
-        }
-
-        [Test]
-        public void SeparateConstraintTest()
-        {
-            Assert.That(ints, Has.Property("Length").EqualTo(3));
-            Assert.That(ints, Has.Length.EqualTo(3));
-        }
-    }
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+
+namespace NUnit.Framework.Syntax
+{
+    public class PropertyExistsTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<propertyexists X>";
+            staticSyntax = Has.Property("X");
+            inheritedSyntax = Helper().Property("X");
+            builderSyntax = Builder().Property("X");
+        }
+    }
+
+    public class PropertyExistsTest_AndFollows : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<and <propertyexists X> <equal 7>>";
+            staticSyntax = Has.Property("X").And.EqualTo(7);
+            inheritedSyntax = Helper().Property("X").And.EqualTo(7);
+            builderSyntax = Builder().Property("X").And.EqualTo(7);
+        }
+    }
+
+    public class PropertyTest_ConstraintFollows : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property X <greaterthan 5>>";
+            staticSyntax = Has.Property("X").GreaterThan(5);
+            inheritedSyntax = Helper().Property("X").GreaterThan(5);
+            builderSyntax = Builder().Property("X").GreaterThan(5);
+        }
+    }
+
+    public class PropertyTest_NotFollows : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property X <not <greaterthan 5>>>";
+            staticSyntax = Has.Property("X").Not.GreaterThan(5);
+            inheritedSyntax = Helper().Property("X").Not.GreaterThan(5);
+            builderSyntax = Builder().Property("X").Not.GreaterThan(5);
+        }
+    }
+
+    public class LengthTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property Length <greaterthan 5>>";
+            staticSyntax = Has.Length.GreaterThan(5);
+            inheritedSyntax = Helper().Length.GreaterThan(5);
+            builderSyntax = Builder().Length.GreaterThan(5);
+        }
+    }
+
+    public class CountTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<property Count <equal 5>>";
+            staticSyntax = Has.Count.EqualTo(5);
+            inheritedSyntax = Helper().Count.EqualTo(5);
+            builderSyntax = Builder().Count.EqualTo(5);
+        }
+    }
+
+    public class MessageTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<property Message <startswith ""Expected"">>";
+            staticSyntax = Has.Message.StartsWith("Expected");
+            inheritedSyntax = Helper().Message.StartsWith("Expected");
+            builderSyntax = Builder().Message.StartsWith("Expected");
+        }
+    }
+
+    public class PropertySyntaxVariations
+    {
+        private readonly int[] ints = new int[] { 1, 2, 3 };
+
+        [Test]
+        public void ExistenceTest()
+        {
+            Assert.That(ints, Has.Property("Length"));
+            Assert.That(ints, Has.Length);
+        }
+
+        [Test]
+        public void SeparateConstraintTest()
+        {
+            Assert.That(ints, Has.Property("Length").EqualTo(3));
+            Assert.That(ints, Has.Length.EqualTo(3));
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs b/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs
index 4467ecc..37310dc 100644
--- a/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs
+++ b/src/NUnitFramework/tests/Syntax/SerializableConstraints.cs
@@ -1,34 +1,34 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-namespace NUnit.Framework.Syntax
-{
-    [TestFixture]
-    public class BinarySerializableTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<binaryserializable>";
-            staticSyntax = Is.BinarySerializable;
-            inheritedSyntax = Helper().BinarySerializable;
-            builderSyntax = Builder().BinarySerializable;
-        }
-    }
-
-    [TestFixture]
-    public class XmlSerializableTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<xmlserializable>";
-            staticSyntax = Is.XmlSerializable;
-            inheritedSyntax = Helper().XmlSerializable;
-            builderSyntax = Builder().XmlSerializable;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class BinarySerializableTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<binaryserializable>";
+            staticSyntax = Is.BinarySerializable;
+            inheritedSyntax = Helper().BinarySerializable;
+            builderSyntax = Builder().BinarySerializable;
+        }
+    }
+
+    [TestFixture]
+    public class XmlSerializableTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<xmlserializable>";
+            staticSyntax = Is.XmlSerializable;
+            inheritedSyntax = Helper().XmlSerializable;
+            builderSyntax = Builder().XmlSerializable;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs b/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
index a73e249..58a04f7 100644
--- a/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
+++ b/src/NUnitFramework/tests/Syntax/SimpleConstraints.cs
@@ -1,94 +1,94 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Syntax
-{
-    public class NullTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<null>";
-            staticSyntax = Is.Null;
-            inheritedSyntax = Helper().Null;
-            builderSyntax = Builder().Null;
-        }
-    }
-
-    public class TrueTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<true>";
-            staticSyntax = Is.True;
-            inheritedSyntax = Helper().True;
-            builderSyntax = Builder().True;
-        }
-    }
-
-    public class FalseTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<false>";
-            staticSyntax = Is.False;
-            inheritedSyntax = Helper().False;
-            builderSyntax = Builder().False;
-        }
-    }
-
-    public class NaNTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<nan>";
-            staticSyntax = Is.NaN;
-            inheritedSyntax = Helper().NaN;
-            builderSyntax = Builder().NaN;
-        }
-    }
-
-    public class 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]
-        public void SetUp()
-        {
-            parseTree = "<empty>";
-            staticSyntax = Is.Empty;
-            inheritedSyntax = Helper().Empty;
-            builderSyntax = Builder().Empty;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    public class NullTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<null>";
+            staticSyntax = Is.Null;
+            inheritedSyntax = Helper().Null;
+            builderSyntax = Builder().Null;
+        }
+    }
+
+    public class TrueTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<true>";
+            staticSyntax = Is.True;
+            inheritedSyntax = Helper().True;
+            builderSyntax = Builder().True;
+        }
+    }
+
+    public class FalseTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<false>";
+            staticSyntax = Is.False;
+            inheritedSyntax = Helper().False;
+            builderSyntax = Builder().False;
+        }
+    }
+
+    public class NaNTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<nan>";
+            staticSyntax = Is.NaN;
+            inheritedSyntax = Helper().NaN;
+            builderSyntax = Builder().NaN;
+        }
+    }
+
+    public class 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]
+        public void SetUp()
+        {
+            parseTree = "<empty>";
+            staticSyntax = Is.Empty;
+            inheritedSyntax = Helper().Empty;
+            builderSyntax = Builder().Empty;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/StringConstraints.cs b/src/NUnitFramework/tests/Syntax/StringConstraints.cs
index 5bcbecf..42d9b03 100644
--- a/src/NUnitFramework/tests/Syntax/StringConstraints.cs
+++ b/src/NUnitFramework/tests/Syntax/StringConstraints.cs
@@ -1,158 +1,158 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Syntax
-{
-    public class SubstringTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<substring ""X"">";
-            staticSyntax = Is.StringContaining("X");
-            inheritedSyntax = Helper().ContainsSubstring("X");
-            builderSyntax = Builder().ContainsSubstring("X");
-        }
-    }
-
-    [Obsolete]
-    public class TextContains : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<substring ""X"">";
-            staticSyntax = Text.Contains("X");
-            inheritedSyntax = Helper().ContainsSubstring("X");
-            builderSyntax = Builder().ContainsSubstring("X");
-        }
-    }
-
-    public class SubstringTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<substring ""X"">";
-            staticSyntax = Is.StringContaining("X").IgnoreCase;
-            inheritedSyntax = Helper().ContainsSubstring("X").IgnoreCase;
-            builderSyntax = Builder().ContainsSubstring("X").IgnoreCase;
-        }
-    }
-
-    public class StartsWithTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<startswith ""X"">";
-            staticSyntax = Is.StringStarting("X");
-            inheritedSyntax = Helper().StartsWith("X");
-            builderSyntax = Builder().StartsWith("X");
-        }
-    }
-
-    [Obsolete]
-    public class TextStartsWithTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<startswith ""X"">";
-            staticSyntax = Text.StartsWith("X");
-            inheritedSyntax = Helper().StartsWith("X");
-            builderSyntax = Builder().StartsWith("X");
-        }
-    }
-
-    public class StartsWithTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<startswith ""X"">";
-            staticSyntax = Is.StringStarting("X").IgnoreCase;
-            inheritedSyntax = Helper().StartsWith("X").IgnoreCase;
-            builderSyntax = Builder().StartsWith("X").IgnoreCase;
-        }
-    }
-
-    public class EndsWithTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<endswith ""X"">";
-            staticSyntax = Is.StringEnding("X");
-            inheritedSyntax = Helper().EndsWith("X");
-            builderSyntax = Builder().EndsWith("X");
-        }
-    }
-
-    [Obsolete]
-    public class TextEndsWithTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<endswith ""X"">";
-            staticSyntax = Text.EndsWith("X");
-            inheritedSyntax = Helper().EndsWith("X");
-            builderSyntax = Builder().EndsWith("X");
-        }
-    }
-
-    public class EndsWithTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<endswith ""X"">";
-            staticSyntax = Is.StringEnding("X").IgnoreCase;
-            inheritedSyntax = Helper().EndsWith("X").IgnoreCase;
-            builderSyntax = Builder().EndsWith("X").IgnoreCase;
-        }
-    }
-
-    public class RegexTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<regex ""X"">";
-            staticSyntax = Is.StringMatching("X");
-            inheritedSyntax = Helper().Matches("X");
-            builderSyntax = Builder().Matches("X");
-        }
-    }
-
-    [Obsolete]
-    public class TextMatchesTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<regex ""X"">";
-            staticSyntax = Text.Matches("X");
-            inheritedSyntax = Helper().Matches("X");
-            builderSyntax = Builder().Matches("X");
-        }
-    }
-
-    public class RegexTest_IgnoreCase : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<regex ""X"">";
-            staticSyntax = Is.StringMatching("X").IgnoreCase;
-            inheritedSyntax = Helper().Matches("X").IgnoreCase;
-            builderSyntax = Builder().Matches("X").IgnoreCase;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    public class SubstringTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<substring ""X"">";
+            staticSyntax = Is.StringContaining("X");
+            inheritedSyntax = Helper().ContainsSubstring("X");
+            builderSyntax = Builder().ContainsSubstring("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextContains : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<substring ""X"">";
+            staticSyntax = Text.Contains("X");
+            inheritedSyntax = Helper().ContainsSubstring("X");
+            builderSyntax = Builder().ContainsSubstring("X");
+        }
+    }
+
+    public class SubstringTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<substring ""X"">";
+            staticSyntax = Is.StringContaining("X").IgnoreCase;
+            inheritedSyntax = Helper().ContainsSubstring("X").IgnoreCase;
+            builderSyntax = Builder().ContainsSubstring("X").IgnoreCase;
+        }
+    }
+
+    public class StartsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<startswith ""X"">";
+            staticSyntax = Is.StringStarting("X");
+            inheritedSyntax = Helper().StartsWith("X");
+            builderSyntax = Builder().StartsWith("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextStartsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<startswith ""X"">";
+            staticSyntax = Text.StartsWith("X");
+            inheritedSyntax = Helper().StartsWith("X");
+            builderSyntax = Builder().StartsWith("X");
+        }
+    }
+
+    public class StartsWithTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<startswith ""X"">";
+            staticSyntax = Is.StringStarting("X").IgnoreCase;
+            inheritedSyntax = Helper().StartsWith("X").IgnoreCase;
+            builderSyntax = Builder().StartsWith("X").IgnoreCase;
+        }
+    }
+
+    public class EndsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<endswith ""X"">";
+            staticSyntax = Is.StringEnding("X");
+            inheritedSyntax = Helper().EndsWith("X");
+            builderSyntax = Builder().EndsWith("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextEndsWithTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<endswith ""X"">";
+            staticSyntax = Text.EndsWith("X");
+            inheritedSyntax = Helper().EndsWith("X");
+            builderSyntax = Builder().EndsWith("X");
+        }
+    }
+
+    public class EndsWithTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<endswith ""X"">";
+            staticSyntax = Is.StringEnding("X").IgnoreCase;
+            inheritedSyntax = Helper().EndsWith("X").IgnoreCase;
+            builderSyntax = Builder().EndsWith("X").IgnoreCase;
+        }
+    }
+
+    public class RegexTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<regex ""X"">";
+            staticSyntax = Is.StringMatching("X");
+            inheritedSyntax = Helper().Matches("X");
+            builderSyntax = Builder().Matches("X");
+        }
+    }
+
+    [Obsolete]
+    public class TextMatchesTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<regex ""X"">";
+            staticSyntax = Text.Matches("X");
+            inheritedSyntax = Helper().Matches("X");
+            builderSyntax = Builder().Matches("X");
+        }
+    }
+
+    public class RegexTest_IgnoreCase : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<regex ""X"">";
+            staticSyntax = Is.StringMatching("X").IgnoreCase;
+            inheritedSyntax = Helper().Matches("X").IgnoreCase;
+            builderSyntax = Builder().Matches("X").IgnoreCase;
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/SyntaxTest.cs b/src/NUnitFramework/tests/Syntax/SyntaxTest.cs
index 8714aad..9b90f4b 100644
--- a/src/NUnitFramework/tests/Syntax/SyntaxTest.cs
+++ b/src/NUnitFramework/tests/Syntax/SyntaxTest.cs
@@ -1,53 +1,53 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Syntax
-{
-    public abstract class SyntaxTest
-    {
-        protected string parseTree;
-        protected IResolveConstraint staticSyntax;
-        protected IResolveConstraint inheritedSyntax;
-        protected IResolveConstraint builderSyntax;
-
-        protected AssertionHelper Helper()
-        {
-            return new AssertionHelper();
-        }
-
-        protected ConstraintExpression Builder()
-        {
-            return new ConstraintExpression();
-        }
-
-        [Test]
-        public void SupportedByStaticSyntax()
-        {
-            Assert.That(
-                staticSyntax.Resolve().ToString(),
-                Is.EqualTo(parseTree).NoClip);
-        }
-
-        [Test]
-        public void SupportedByConstraintBuilder()
-        {
-            Assert.That(
-                builderSyntax.Resolve().ToString(),
-                Is.EqualTo(parseTree).NoClip);
-        }
-
-        [Test]
-        public void SupportedByInheritedSyntax()
-        {
-            Assert.That(
-                inheritedSyntax.Resolve().ToString(),
-                Is.EqualTo(parseTree).NoClip);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    public abstract class SyntaxTest
+    {
+        protected string parseTree;
+        protected IResolveConstraint staticSyntax;
+        protected IResolveConstraint inheritedSyntax;
+        protected IResolveConstraint builderSyntax;
+
+        protected AssertionHelper Helper()
+        {
+            return new AssertionHelper();
+        }
+
+        protected ConstraintExpression Builder()
+        {
+            return new ConstraintExpression();
+        }
+
+        [Test]
+        public void SupportedByStaticSyntax()
+        {
+            Assert.That(
+                staticSyntax.Resolve().ToString(),
+                Is.EqualTo(parseTree).NoClip);
+        }
+
+        [Test]
+        public void SupportedByConstraintBuilder()
+        {
+            Assert.That(
+                builderSyntax.Resolve().ToString(),
+                Is.EqualTo(parseTree).NoClip);
+        }
+
+        [Test]
+        public void SupportedByInheritedSyntax()
+        {
+            Assert.That(
+                inheritedSyntax.Resolve().ToString(),
+                Is.EqualTo(parseTree).NoClip);
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/TestCompiler.cs b/src/NUnitFramework/tests/Syntax/TestCompiler.cs
index b6f583c..87ab63e 100644
--- a/src/NUnitFramework/tests/Syntax/TestCompiler.cs
+++ b/src/NUnitFramework/tests/Syntax/TestCompiler.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// Copyright 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;
-using System.IO;
-
-namespace NUnit.Framework.Syntax
-{
-    class TestCompiler
-    {
-        Microsoft.CSharp.CSharpCodeProvider provider;
-#if CLR_1_0 || CLR_1_1
-		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 CLR_1_0 || CLR_1_1
-			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( Path.GetTempPath(), false );
-			options.GenerateInMemory = false;
-		}
-
-		public CompilerParameters Options
-		{
-			get { return options; }
-		}
-
-		public CompilerResults CompileCode( string code )
-        {
-#if CLR_2_0 || CLR_4_0
-            return provider.CompileAssemblyFromSource( options, code );
-#else
-            return compiler.CompileAssemblyFromSource(options, code);
-#endif
-        }
-    }
-}
+// ****************************************************************
+// Copyright 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;
+using System.IO;
+
+namespace NUnit.Framework.Syntax
+{
+    class TestCompiler
+    {
+        Microsoft.CSharp.CSharpCodeProvider provider;
+#if CLR_1_0 || CLR_1_1
+		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 CLR_1_0 || CLR_1_1
+			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( Path.GetTempPath(), false );
+			options.GenerateInMemory = false;
+		}
+
+		public CompilerParameters Options
+		{
+			get { return options; }
+		}
+
+		public CompilerResults CompileCode( string 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 c97e8bf..734b10f 100644
--- a/src/NUnitFramework/tests/Syntax/ThrowsTests.cs
+++ b/src/NUnitFramework/tests/Syntax/ThrowsTests.cs
@@ -1,227 +1,224 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Framework.Syntax
-{
-    [TestFixture]
-    public class ThrowsTests
-    {
-        [Test]
-        public void ThrowsException()
-        {
-            IResolveConstraint expr = Throws.Exception;
-            Assert.AreEqual(
-                "<throws>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsExceptionWithConstraint()
-        {
-            IResolveConstraint expr = Throws.Exception.With.Property("ParamName").EqualTo("myParam");
-            Assert.AreEqual(
-                @"<throws <property ParamName <equal ""myParam"">>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsExceptionTypeOf()
-        {
-            IResolveConstraint expr = Throws.Exception.TypeOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <typeof System.ArgumentException>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsTypeOf()
-        {
-            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <typeof System.ArgumentException>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsTypeOfAndConstraint()
-        {
-            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).And.Property("ParamName").EqualTo("myParam");
-            Assert.AreEqual(
-                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsExceptionTypeOfAndConstraint()
-        {
-            IResolveConstraint expr = Throws.Exception.TypeOf(typeof(ArgumentException)).And.Property("ParamName").EqualTo("myParam");
-            Assert.AreEqual(
-                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsTypeOfWithConstraint()
-        {
-            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).With.Property("ParamName").EqualTo("myParam");
-            Assert.AreEqual(
-                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsTypeofWithMessage()
-        {
-            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).With.Message.EqualTo("my message");
-            Assert.AreEqual(
-                @"<throws <and <typeof System.ArgumentException> <property Message <equal ""my message"">>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsInstanceOf()
-        {
-            IResolveConstraint expr = Throws.InstanceOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <instanceof System.ArgumentException>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsExceptionInstanceOf()
-        {
-            IResolveConstraint expr = Throws.Exception.InstanceOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <instanceof System.ArgumentException>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsInnerException()
-        {
-            IResolveConstraint expr = Throws.InnerException.TypeOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <property InnerException <typeof System.ArgumentException>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsExceptionWithInnerException()
-        {
-            IResolveConstraint expr = Throws.Exception.With.InnerException.TypeOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <property InnerException <typeof System.ArgumentException>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsTypeOfWithInnerException()
-        {
-            IResolveConstraint expr = Throws.TypeOf(typeof(System.Reflection.TargetInvocationException))
-                .With.InnerException.TypeOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <and <typeof System.Reflection.TargetInvocationException> <property InnerException <typeof System.ArgumentException>>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsTargetInvocationExceptionWithInnerException()
-        {
-            IResolveConstraint expr = Throws.TargetInvocationException
-                .With.InnerException.TypeOf(typeof(ArgumentException));
-            Assert.AreEqual(
-                "<throws <and <typeof System.Reflection.TargetInvocationException> <property InnerException <typeof System.ArgumentException>>>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsArgumentException()
-        {
-            IResolveConstraint expr = Throws.ArgumentException;
-            Assert.AreEqual(
-                "<throws <typeof System.ArgumentException>>",
-                expr.Resolve().ToString());
-        }
-
-        [Test]
-        public void ThrowsInvalidOperationException()
-        {
-            IResolveConstraint expr = Throws.InvalidOperationException;
-            Assert.AreEqual(
-                "<throws <typeof System.InvalidOperationException>>",
-                expr.Resolve().ToString());
-        }
-
-        // TODO: Move these to AssertThat tests
-#if CLR_2_0 || CLR_4_0
-#if CS_3_0 || CS_4_0
-        [Test]
-        public void DelegateThrowsException()
-        {
-            Assert.That(
-                delegate { throw new ApplicationException(); },
-                Throws.Exception);
-        }
-
-        [Test]
-        public void LambdaThrowsExcepton()
-        {
-            Assert.That(
-                () => new MyClass(null),
-                Throws.InstanceOf<ArgumentNullException>());
-        }
-
-        [Test]
-        public void LambdaThrowsExceptionWithMessage()
-        {
-            Assert.That(
-                () => new MyClass(null),
-                Throws.InstanceOf<ArgumentNullException>()
-                .And.Message.Matches("null"));
-        }
-
-        internal class MyClass
-        {
-            public MyClass(string s)
-            {
-                if (s == null)
-                {
-                    throw new ArgumentNullException();
-                }
-            }
-        }
-
-        [Test]
-        public void LambdaThrowsNothing()
-        {
-            Assert.That(
-                () => null,
-                Throws.Nothing);
-        }
-#else
-        [Test]
-        public void DelegateThrowsException()
-        {
-            Assert.That(
-                delegate { Throw(); return; },
-                Throws.Exception);
-        }
-
-        // Encapsulate throw to trick compiler and
-        // avoid unreachable code warning. Can't
-        // use pragma because this is also compiled
-        // under the .NET 1.0 and 1.1 compilers.
-        private void Throw()
-        {
-            throw new ApplicationException();
-        }
-#endif
-#endif
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class ThrowsTests
+    {
+        [Test]
+        public void ThrowsException()
+        {
+            IResolveConstraint expr = Throws.Exception;
+            Assert.AreEqual(
+                "<throws>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionWithConstraint()
+        {
+            IResolveConstraint expr = Throws.Exception.With.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <property ParamName <equal ""myParam"">>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionTypeOf()
+        {
+            IResolveConstraint expr = Throws.Exception.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <typeof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOf()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <typeof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOfAndConstraint()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).And.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionTypeOfAndConstraint()
+        {
+            IResolveConstraint expr = Throws.Exception.TypeOf(typeof(ArgumentException)).And.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOfWithConstraint()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).With.Property("ParamName").EqualTo("myParam");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property ParamName <equal ""myParam"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeofWithMessage()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(ArgumentException)).With.Message.EqualTo("my message");
+            Assert.AreEqual(
+                @"<throws <and <typeof System.ArgumentException> <property Message <equal ""my message"">>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsInstanceOf()
+        {
+            IResolveConstraint expr = Throws.InstanceOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <instanceof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionInstanceOf()
+        {
+            IResolveConstraint expr = Throws.Exception.InstanceOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <instanceof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsInnerException()
+        {
+            IResolveConstraint expr = Throws.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <property InnerException <typeof System.ArgumentException>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsExceptionWithInnerException()
+        {
+            IResolveConstraint expr = Throws.Exception.With.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <property InnerException <typeof System.ArgumentException>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTypeOfWithInnerException()
+        {
+            IResolveConstraint expr = Throws.TypeOf(typeof(System.Reflection.TargetInvocationException))
+                .With.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <and <typeof System.Reflection.TargetInvocationException> <property InnerException <typeof System.ArgumentException>>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsTargetInvocationExceptionWithInnerException()
+        {
+            IResolveConstraint expr = Throws.TargetInvocationException
+                .With.InnerException.TypeOf(typeof(ArgumentException));
+            Assert.AreEqual(
+                "<throws <and <typeof System.Reflection.TargetInvocationException> <property InnerException <typeof System.ArgumentException>>>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsArgumentException()
+        {
+            IResolveConstraint expr = Throws.ArgumentException;
+            Assert.AreEqual(
+                "<throws <typeof System.ArgumentException>>",
+                expr.Resolve().ToString());
+        }
+
+        [Test]
+        public void ThrowsInvalidOperationException()
+        {
+            IResolveConstraint expr = Throws.InvalidOperationException;
+            Assert.AreEqual(
+                "<throws <typeof System.InvalidOperationException>>",
+                expr.Resolve().ToString());
+        }
+
+        // TODO: Move these to AssertThat tests
+#if CLR_2_0 || CLR_4_0
+#if CS_3_0 || CS_4_0 || CS_5_0
+        [Test]
+        public void DelegateThrowsException()
+        {
+            Assert.That(
+                delegate { throw new ApplicationException(); },
+                Throws.Exception);
+        }
+
+        [Test]
+        public void LambdaThrowsException()
+        {
+            Assert.That(
+                () => new MyClass(null),
+                Throws.InstanceOf<ArgumentNullException>());
+        }
+
+        [Test]
+        public void LambdaThrowsExceptionWithMessage()
+        {
+            Assert.That(
+                () => new MyClass(null),
+                Throws.InstanceOf<ArgumentNullException>());
+        }
+
+        internal class MyClass
+        {
+            public MyClass(string s)
+            {
+                if (s == null)
+                {
+                    throw new ArgumentNullException();
+                }
+            }
+        }
+
+        [Test]
+        public void LambdaThrowsNothing()
+        {
+            Assert.That(() => (object)null, Throws.Nothing);
+        }
+#else
+        [Test]
+        public void DelegateThrowsException()
+        {
+            Assert.That(
+                delegate { Throw(); return; },
+                Throws.Exception);
+        }
+
+        // Encapsulate throw to trick compiler and
+        // avoid unreachable code warning. Can't
+        // use pragma because this is also compiled
+        // under the .NET 1.0 and 1.1 compilers.
+        private void Throw()
+        {
+            throw new ApplicationException();
+        }
+#endif
+#endif
+    }
+}
diff --git a/src/NUnitFramework/tests/Syntax/TypeConstraints.cs b/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
index 32cc035..20b1094 100644
--- a/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
+++ b/src/NUnitFramework/tests/Syntax/TypeConstraints.cs
@@ -1,181 +1,181 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Framework.Syntax
-{
-    [TestFixture]
-    public class ExactTypeTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<typeof System.String>";
-            staticSyntax = Is.TypeOf(typeof(string));
-            inheritedSyntax = Helper().TypeOf(typeof(string));
-            builderSyntax = Builder().TypeOf(typeof(string));
-        }
-    }
-
-    [TestFixture]
-    public class InstanceOfTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<instanceof System.String>";
-            staticSyntax = Is.InstanceOf(typeof(string));
-            inheritedSyntax = Helper().InstanceOf(typeof(string));
-            builderSyntax = Builder().InstanceOf(typeof(string));
-        }
-    }
-
-    [TestFixture, Obsolete]
-    public class InstanceOfTypeTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<instanceof System.String>";
-            staticSyntax = Is.InstanceOfType(typeof(string));
-            inheritedSyntax = Helper().InstanceOfType(typeof(string));
-            builderSyntax = Builder().InstanceOfType(typeof(string));
-        }
-    }
-
-    [TestFixture]
-    public class AssignableFromTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<assignablefrom System.String>";
-            staticSyntax = Is.AssignableFrom(typeof(string));
-            inheritedSyntax = Helper().AssignableFrom(typeof(string));
-            builderSyntax = Builder().AssignableFrom(typeof(string));
-        }
-    }
-
-    [TestFixture]
-    public class AssignableToTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<assignableto System.String>";
-            staticSyntax = Is.AssignableTo(typeof(string));
-            inheritedSyntax = Helper().AssignableTo(typeof(string));
-            builderSyntax = Builder().AssignableTo(typeof(string));
-        }
-    }
-
-    [TestFixture]
-    public class AttributeTest : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
-            staticSyntax = Has.Attribute(typeof(TestFixtureAttribute));
-            inheritedSyntax = Helper().Attribute(typeof(TestFixtureAttribute));
-            builderSyntax = Builder().Attribute(typeof(TestFixtureAttribute));
-        }
-    }
-
-    [TestFixture]
-    public class AttributeTestWithFollowingConstraint : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = @"<attribute NUnit.Framework.TestFixtureAttribute <property Description <not <null>>>>";
-            staticSyntax = Has.Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
-            inheritedSyntax = Helper().Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
-            builderSyntax = Builder().Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
-        }
-    }
-
-#if CLR_2_0 || CLR_4_0
-    [TestFixture]
-    public class ExactTypeTest_Generic : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<typeof System.String>";
-            staticSyntax = Is.TypeOf<string>();
-            inheritedSyntax = Helper().TypeOf<string>();
-            builderSyntax = Builder().TypeOf<string>();
-        }
-    }
-
-    [TestFixture]
-    public class InstanceOfTest_Generic : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<instanceof System.String>";
-            staticSyntax = Is.InstanceOf<string>();
-            inheritedSyntax = Helper().InstanceOf<string>();
-            builderSyntax = Builder().InstanceOf<string>();
-        }
-    }
-
-    [TestFixture, Obsolete]
-    public class InstanceOfTypeTest_Generic : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<instanceof System.String>";
-            staticSyntax = Is.InstanceOfType<string>();
-            inheritedSyntax = Helper().InstanceOfType<string>();
-            builderSyntax = Builder().InstanceOfType<string>();
-        }
-    }
-
-    [TestFixture]
-    public class AssignableFromTest_Generic : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<assignablefrom System.String>";
-            staticSyntax = Is.AssignableFrom<string>();
-            inheritedSyntax = Helper().AssignableFrom<string>();
-            builderSyntax = Builder().AssignableFrom<string>();
-        }
-    }
-
-    [TestFixture]
-    public class AssignableToTest_Generic : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<assignableto System.String>";
-            staticSyntax = Is.AssignableTo<string>();
-            inheritedSyntax = Helper().AssignableTo<string>();
-            builderSyntax = Builder().AssignableTo<string>();
-        }
-    }
-
-    [TestFixture]
-    public class AttributeTest_Generic : SyntaxTest
-    {
-        [SetUp]
-        public void SetUp()
-        {
-            parseTree = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
-            staticSyntax = Has.Attribute<TestFixtureAttribute>();
-            inheritedSyntax = Helper().Attribute<TestFixtureAttribute>();
-            builderSyntax = Builder().Attribute<TestFixtureAttribute>();
-        }
-    }
-#endif
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+
+namespace NUnit.Framework.Syntax
+{
+    [TestFixture]
+    public class ExactTypeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<typeof System.String>";
+            staticSyntax = Is.TypeOf(typeof(string));
+            inheritedSyntax = Helper().TypeOf(typeof(string));
+            builderSyntax = Builder().TypeOf(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class InstanceOfTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOf(typeof(string));
+            inheritedSyntax = Helper().InstanceOf(typeof(string));
+            builderSyntax = Builder().InstanceOf(typeof(string));
+        }
+    }
+
+    [TestFixture, Obsolete]
+    public class InstanceOfTypeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOfType(typeof(string));
+            inheritedSyntax = Helper().InstanceOfType(typeof(string));
+            builderSyntax = Builder().InstanceOfType(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class AssignableFromTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignablefrom System.String>";
+            staticSyntax = Is.AssignableFrom(typeof(string));
+            inheritedSyntax = Helper().AssignableFrom(typeof(string));
+            builderSyntax = Builder().AssignableFrom(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class AssignableToTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignableto System.String>";
+            staticSyntax = Is.AssignableTo(typeof(string));
+            inheritedSyntax = Helper().AssignableTo(typeof(string));
+            builderSyntax = Builder().AssignableTo(typeof(string));
+        }
+    }
+
+    [TestFixture]
+    public class AttributeTest : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
+            staticSyntax = Has.Attribute(typeof(TestFixtureAttribute));
+            inheritedSyntax = Helper().Attribute(typeof(TestFixtureAttribute));
+            builderSyntax = Builder().Attribute(typeof(TestFixtureAttribute));
+        }
+    }
+
+    [TestFixture]
+    public class AttributeTestWithFollowingConstraint : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = @"<attribute NUnit.Framework.TestFixtureAttribute <property Description <not <null>>>>";
+            staticSyntax = Has.Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
+            inheritedSyntax = Helper().Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
+            builderSyntax = Builder().Attribute(typeof(TestFixtureAttribute)).Property("Description").Not.Null;
+        }
+    }
+
+#if CLR_2_0 || CLR_4_0
+    [TestFixture]
+    public class ExactTypeTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<typeof System.String>";
+            staticSyntax = Is.TypeOf<string>();
+            inheritedSyntax = Helper().TypeOf<string>();
+            builderSyntax = Builder().TypeOf<string>();
+        }
+    }
+
+    [TestFixture]
+    public class InstanceOfTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOf<string>();
+            inheritedSyntax = Helper().InstanceOf<string>();
+            builderSyntax = Builder().InstanceOf<string>();
+        }
+    }
+
+    [TestFixture, Obsolete]
+    public class InstanceOfTypeTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<instanceof System.String>";
+            staticSyntax = Is.InstanceOfType<string>();
+            inheritedSyntax = Helper().InstanceOfType<string>();
+            builderSyntax = Builder().InstanceOfType<string>();
+        }
+    }
+
+    [TestFixture]
+    public class AssignableFromTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignablefrom System.String>";
+            staticSyntax = Is.AssignableFrom<string>();
+            inheritedSyntax = Helper().AssignableFrom<string>();
+            builderSyntax = Builder().AssignableFrom<string>();
+        }
+    }
+
+    [TestFixture]
+    public class AssignableToTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<assignableto System.String>";
+            staticSyntax = Is.AssignableTo<string>();
+            inheritedSyntax = Helper().AssignableTo<string>();
+            builderSyntax = Builder().AssignableTo<string>();
+        }
+    }
+
+    [TestFixture]
+    public class AttributeTest_Generic : SyntaxTest
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            parseTree = "<attributeexists NUnit.Framework.TestFixtureAttribute>";
+            staticSyntax = Has.Attribute<TestFixtureAttribute>();
+            inheritedSyntax = Helper().Attribute<TestFixtureAttribute>();
+            builderSyntax = Builder().Attribute<TestFixtureAttribute>();
+        }
+    }
+#endif
+}
diff --git a/src/NUnitFramework/tests/TestDelegates.cs b/src/NUnitFramework/tests/TestDelegates.cs
index 8016bfd..a032be6 100644
--- a/src/NUnitFramework/tests/TestDelegates.cs
+++ b/src/NUnitFramework/tests/TestDelegates.cs
@@ -1,40 +1,40 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework.Tests
-{
-    public class TestDelegates
-    {
-        public static void ThrowsArgumentException()
-        {
-            throw new ArgumentException("myMessage", "myParam");
-        }
-
-        public static void ThrowsApplicationException()
-        {
-            throw new ApplicationException("my message");
-        }
-
-        public static void ThrowsSystemException()
-        {
-            throw new Exception("my message");
-        }
-
-        public static void ThrowsNothing()
-        {
-        }
-
-        public static void ThrowsDerivedApplicationException()
-        {
-            throw new DerivedApplicationException();
-        }
-
-        public class DerivedApplicationException : ApplicationException
-        {
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+    public class TestDelegates
+    {
+        public static void ThrowsArgumentException()
+        {
+            throw new ArgumentException("myMessage", "myParam");
+        }
+
+        public static void ThrowsApplicationException()
+        {
+            throw new ApplicationException("my message");
+        }
+
+        public static void ThrowsSystemException()
+        {
+            throw new Exception("my message");
+        }
+
+        public static void ThrowsNothing()
+        {
+        }
+
+        public static void ThrowsDerivedApplicationException()
+        {
+            throw new DerivedApplicationException();
+        }
+
+        public class DerivedApplicationException : ApplicationException
+        {
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/TestFixtureAttributeTests.cs b/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
index caa9886..9f578fc 100644
--- a/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
+++ b/src/NUnitFramework/tests/TestFixtureAttributeTests.cs
@@ -1,74 +1,74 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-
-namespace NUnit.Framework.Tests
-{
-    public class TestFixtureAttributeTests
-    {
-        static object[] fixtureArgs = new object[] { 10, 20, "Charlie" };
-#if 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
-
-        [Test]
-        public void ConstructWithoutArguments()
-        {
-            TestFixtureAttribute attr = new TestFixtureAttribute();
-            Assert.That(attr.Arguments.Length == 0);
-#if CLR_2_0 || CLR_4_0
-            Assert.That(attr.TypeArgs.Length == 0);
-#endif
-        }
-
-        [Test]
-        public void ConstructWithFixtureArgs()
-        {
-            TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
-            Assert.That(attr.Arguments, Is.EqualTo( fixtureArgs ) );
-#if CLR_2_0 || CLR_4_0
-            Assert.That(attr.TypeArgs.Length == 0 );
-#endif
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [Test, Category("Generics")]
-        public void ConstructWithJustTypeArgs()
-        {
-            TestFixtureAttribute attr = new TestFixtureAttribute(typeArgs);
-            Assert.That(attr.Arguments.Length == 0);
-            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
-        }
-
-        [Test, Category("Generics")]
-        public void ConstructWithNoArgumentsAndSetTypeArgs()
-        {
-            TestFixtureAttribute attr = new TestFixtureAttribute();
-            attr.TypeArgs = typeArgs;
-            Assert.That(attr.Arguments.Length == 0);
-            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
-        }
-
-        [Test, Category("Generics")]
-        public void ConstructWithFixtureArgsAndSetTypeArgs()
-        {
-            TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
-            attr.TypeArgs = typeArgs;
-            Assert.That(attr.Arguments, Is.EqualTo(fixtureArgs));
-            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
-        }
-
-        [Test, Category("Generics")]
-        public void ConstructWithCombinedArgs()
-        {
-            TestFixtureAttribute attr = new TestFixtureAttribute(combinedArgs);
-            Assert.That(attr.Arguments, Is.EqualTo(fixtureArgs));
-            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
-        }
-#endif
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+
+namespace NUnit.Framework.Tests
+{
+    public class TestFixtureAttributeTests
+    {
+        static object[] fixtureArgs = new object[] { 10, 20, "Charlie" };
+#if 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
+
+        [Test]
+        public void ConstructWithoutArguments()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute();
+            Assert.That(attr.Arguments.Length == 0);
+#if CLR_2_0 || CLR_4_0
+            Assert.That(attr.TypeArgs == null);
+#endif
+        }
+
+        [Test]
+        public void ConstructWithFixtureArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
+            Assert.That(attr.Arguments, Is.EqualTo( fixtureArgs ) );
+#if CLR_2_0 || CLR_4_0
+            Assert.That(attr.TypeArgs == null );
+#endif
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [Test, Category("Generics")]
+        public void ConstructWithJustTypeArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(typeArgs);
+            Assert.That(attr.Arguments.Length == 2);
+            Assert.That(attr.TypeArgs == null);
+        }
+
+        [Test, Category("Generics")]
+        public void ConstructWithNoArgumentsAndSetTypeArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute();
+            attr.TypeArgs = typeArgs;
+            Assert.That(attr.Arguments.Length == 0);
+            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
+        }
+
+        [Test, Category("Generics")]
+        public void ConstructWithFixtureArgsAndSetTypeArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(fixtureArgs);
+            attr.TypeArgs = typeArgs;
+            Assert.That(attr.Arguments, Is.EqualTo(fixtureArgs));
+            Assert.That(attr.TypeArgs, Is.EqualTo(typeArgs));
+        }
+
+        [Test, Category("Generics")]
+        public void ConstructWithCombinedArgs()
+        {
+            TestFixtureAttribute attr = new TestFixtureAttribute(combinedArgs);
+            Assert.That(attr.Arguments, Is.EqualTo(combinedArgs));
+            Assert.That(attr.TypeArgs, Is.Null);
+        }
+#endif
+	}
+}
diff --git a/src/NUnitFramework/tests/TextMessageWriterTests.cs b/src/NUnitFramework/tests/TextMessageWriterTests.cs
index a0420f2..c07dde8 100644
--- a/src/NUnitFramework/tests/TextMessageWriterTests.cs
+++ b/src/NUnitFramework/tests/TextMessageWriterTests.cs
@@ -1,145 +1,145 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Threading;
-using System.Globalization;
-
-namespace NUnit.Framework.Tests
-{
-    [TestFixture]
-    public class TextMessageWriterTests : AssertionHelper
-    {
-        private TextMessageWriter writer;
-
-		[SetUp]
-		public void SetUp()
-        {
-            writer = new TextMessageWriter();
-        }
-
-        [Test]
-        public void ConnectorIsWrittenWithSurroundingSpaces()
-        {
-            writer.WriteConnector("and");
-            Expect(writer.ToString(), EqualTo(" and "));
-        }
-
-        [Test]
-        public void PredicateIsWrittenWithTrailingSpace()
-        {
-            writer.WritePredicate("contains");
-            Expect(writer.ToString(), EqualTo("contains "));
-        }
-
-        [Test]
-        public void IntegerIsWrittenAsIs()
-        {
-            writer.WriteValue(42);
-            Expect(writer.ToString(), EqualTo("42"));
-        }
-
-        [Test]
-        public void StringIsWrittenWithQuotes()
-        {
-            writer.WriteValue("Hello");
-            Expect(writer.ToString(), EqualTo("\"Hello\""));
-        }
-
-		// This test currently fails because control character replacement is
-		// done at a higher level...
-		// TODO: See if we should do it at a lower level
-//            [Test]
-//            public void ControlCharactersInStringsAreEscaped()
-//            {
-//                WriteValue("Best Wishes,\r\n\tCharlie\r\n");
-//                Assert.That(writer.ToString(), Is.EqualTo("\"Best Wishes,\\r\\n\\tCharlie\\r\\n\""));
-//            }
-
-        [Test]
-        public void FloatIsWrittenWithTrailingF()
-        {
-            writer.WriteValue(0.5f);
-            Expect(writer.ToString(), EqualTo("0.5f"));
-        }
-
-        [Test]
-        public void FloatIsWrittenToNineDigits()
-        {
-            writer.WriteValue(0.33333333333333f);
-            int digits = writer.ToString().Length - 3;   // 0.dddddddddf
-            Expect(digits, EqualTo(9));
-            Expect(writer.ToString().Length, EqualTo(12));
-        }
-
-        [Test]
-        public void DoubleIsWrittenWithTrailingD()
-        {
-            writer.WriteValue(0.5d);
-            Expect(writer.ToString(), EqualTo("0.5d"));
-        }
-
-        [Test]
-        public void DoubleIsWrittenToSeventeenDigits()
-        {
-            writer.WriteValue(0.33333333333333333333333333333333333333333333d);
-            Expect(writer.ToString().Length, EqualTo(20)); // add 3 for leading 0, decimal and trailing d
-        }
-
-        [Test]
-        public void DecimalIsWrittenWithTrailingM()
-        {
-            writer.WriteValue(0.5m);
-            Expect(writer.ToString(), EqualTo("0.5m"));
-        }
-
-        [Test]
-        public void DecimalIsWrittenToTwentyNineDigits()
-        {
-            writer.WriteValue(12345678901234567890123456789m);
-            Expect(writer.ToString(), EqualTo("12345678901234567890123456789m"));
-        }
-
-		[Test]
-		public void DateTimeTest()
-		{
-            writer.WriteValue(new DateTime(2007, 7, 4, 9, 15, 30, 123));
-            Expect(writer.ToString(), EqualTo("2007-07-04 09:15:30.123"));
-		}
-
-        [Test]
-        public void DisplayStringDifferences()
-        {
-            string s72 = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-            string exp = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXY...";
-
-            writer.DisplayStringDifferences(s72, "abcde", 5, false, true);
-//            string message = writer.ToString();
-            Expect(writer.ToString(), EqualTo(
-                TextMessageWriter.Pfx_Expected + Q(exp) + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + Q("abcde") + Environment.NewLine +
-                "  ----------------^" + Environment.NewLine));
-        }
-
-        [Test]
-        public void DisplayStringDifferences_NoClipping()
-        {
-            string s72 = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-
-            writer.DisplayStringDifferences(s72, "abcde", 5, false, false);
-//            string message = writer.ToString();
-            Expect(writer.ToString(), EqualTo(
-                TextMessageWriter.Pfx_Expected + Q(s72) + Environment.NewLine +
-                TextMessageWriter.Pfx_Actual + Q("abcde") + Environment.NewLine +
-                "  ----------------^" + Environment.NewLine));
-        }
-
-        private string Q(string s)
-        {
-            return "\"" + s + "\"";
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Threading;
+using System.Globalization;
+
+namespace NUnit.Framework.Tests
+{
+    [TestFixture]
+    public class TextMessageWriterTests : AssertionHelper
+    {
+        private TextMessageWriter writer;
+
+		[SetUp]
+		public void SetUp()
+        {
+            writer = new TextMessageWriter();
+        }
+
+        [Test]
+        public void ConnectorIsWrittenWithSurroundingSpaces()
+        {
+            writer.WriteConnector("and");
+            Expect(writer.ToString(), EqualTo(" and "));
+        }
+
+        [Test]
+        public void PredicateIsWrittenWithTrailingSpace()
+        {
+            writer.WritePredicate("contains");
+            Expect(writer.ToString(), EqualTo("contains "));
+        }
+
+        [Test]
+        public void IntegerIsWrittenAsIs()
+        {
+            writer.WriteValue(42);
+            Expect(writer.ToString(), EqualTo("42"));
+        }
+
+        [Test]
+        public void StringIsWrittenWithQuotes()
+        {
+            writer.WriteValue("Hello");
+            Expect(writer.ToString(), EqualTo("\"Hello\""));
+        }
+
+		// This test currently fails because control character replacement is
+		// done at a higher level...
+		// TODO: See if we should do it at a lower level
+//            [Test]
+//            public void ControlCharactersInStringsAreEscaped()
+//            {
+//                WriteValue("Best Wishes,\r\n\tCharlie\r\n");
+//                Assert.That(writer.ToString(), Is.EqualTo("\"Best Wishes,\\r\\n\\tCharlie\\r\\n\""));
+//            }
+
+        [Test]
+        public void FloatIsWrittenWithTrailingF()
+        {
+            writer.WriteValue(0.5f);
+            Expect(writer.ToString(), EqualTo("0.5f"));
+        }
+
+        [Test]
+        public void FloatIsWrittenToNineDigits()
+        {
+            writer.WriteValue(0.33333333333333f);
+            int digits = writer.ToString().Length - 3;   // 0.dddddddddf
+            Expect(digits, EqualTo(9));
+            Expect(writer.ToString().Length, EqualTo(12));
+        }
+
+        [Test]
+        public void DoubleIsWrittenWithTrailingD()
+        {
+            writer.WriteValue(0.5d);
+            Expect(writer.ToString(), EqualTo("0.5d"));
+        }
+
+        [Test]
+        public void DoubleIsWrittenToSeventeenDigits()
+        {
+            writer.WriteValue(0.33333333333333333333333333333333333333333333d);
+            Expect(writer.ToString().Length, EqualTo(20)); // add 3 for leading 0, decimal and trailing d
+        }
+
+        [Test]
+        public void DecimalIsWrittenWithTrailingM()
+        {
+            writer.WriteValue(0.5m);
+            Expect(writer.ToString(), EqualTo("0.5m"));
+        }
+
+        [Test]
+        public void DecimalIsWrittenToTwentyNineDigits()
+        {
+            writer.WriteValue(12345678901234567890123456789m);
+            Expect(writer.ToString(), EqualTo("12345678901234567890123456789m"));
+        }
+
+		[Test]
+		public void DateTimeTest()
+		{
+            writer.WriteValue(new DateTime(2007, 7, 4, 9, 15, 30, 123));
+            Expect(writer.ToString(), EqualTo("2007-07-04 09:15:30.123"));
+		}
+
+        [Test]
+        public void DisplayStringDifferences()
+        {
+            string s72 = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+            string exp = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXY...";
+
+            writer.DisplayStringDifferences(s72, "abcde", 5, false, true);
+//            string message = writer.ToString();
+            Expect(writer.ToString(), EqualTo(
+                TextMessageWriter.Pfx_Expected + Q(exp) + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + Q("abcde") + Environment.NewLine +
+                "  ----------------^" + Environment.NewLine));
+        }
+
+        [Test]
+        public void DisplayStringDifferences_NoClipping()
+        {
+            string s72 = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+            writer.DisplayStringDifferences(s72, "abcde", 5, false, false);
+//            string message = writer.ToString();
+            Expect(writer.ToString(), EqualTo(
+                TextMessageWriter.Pfx_Expected + Q(s72) + Environment.NewLine +
+                TextMessageWriter.Pfx_Actual + Q("abcde") + Environment.NewLine +
+                "  ----------------^" + Environment.NewLine));
+        }
+
+        private string Q(string s)
+        {
+            return "\"" + s + "\"";
+        }
+    }
+}
diff --git a/src/NUnitFramework/tests/TypeAssertTest.cs b/src/NUnitFramework/tests/TypeAssertTest.cs
index cb9de89..9cf91fa 100644
--- a/src/NUnitFramework/tests/TypeAssertTest.cs
+++ b/src/NUnitFramework/tests/TypeAssertTest.cs
@@ -1,118 +1,118 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-
-using System;
-//using NUnit.Framework.Syntax;
-
-namespace NUnit.Framework.Tests
-{
-	[TestFixture()]
-	public class TypeAssertTests : MessageChecker
-	{
-		[Test]
-		public void ExactType()
-		{
-			Expect( "Hello", TypeOf( typeof(System.String) ) );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ExactTypeFails()
-		{
-			expectedMessage =
-				"  Expected: <System.Int32>" + Environment.NewLine +
-				"  But was:  <System.String>" + Environment.NewLine;
-			Expect( "Hello", TypeOf( typeof(System.Int32) ) );
-		}
-
-		[Test]
-		public void IsInstanceOf()
-		{
-            ApplicationException ex = new ApplicationException();
-
-			Assert.IsInstanceOf(typeof(System.Exception), ex );
-            Expect( ex, InstanceOf(typeof(Exception)));
-#if CLR_2_0 || CLR_4_0
-            Assert.IsInstanceOf<Exception>( ex );
-#endif
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsInstanceOfFails()
-		{
-			expectedMessage =
-				"  Expected: instance of <System.Int32>" + System.Environment.NewLine + 
-				"  But was:  <System.String>" + System.Environment.NewLine;
-			Expect( "abc123", InstanceOf( typeof(System.Int32) ) );
-		}
-
-		[Test]
-		public void IsNotInstanceOf()
-		{
-			Assert.IsNotInstanceOf(typeof(System.Int32), "abc123" );
-			Expect( "abc123", Not.InstanceOf(typeof(System.Int32)) );
-#if CLR_2_0 || CLR_4_0
-            Assert.IsNotInstanceOf<System.Int32>("abc123");
-#endif
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsNotInstanceOfFails()
-		{
-			expectedMessage =
-				"  Expected: not instance of <System.Exception>" + System.Environment.NewLine + 
-				"  But was:  <System.ApplicationException>" + System.Environment.NewLine;
-			Assert.IsNotInstanceOf( typeof(System.Exception), new ApplicationException() );
-		}
-
-        [Test()]
-        public void IsAssignableFrom()
-        {
-            int[] array10 = new int[10];
-
-            Assert.IsAssignableFrom(typeof(int[]), array10);
-            Expect(array10, AssignableFrom(typeof(int[])));
-#if CLR_2_0 || CLR_4_0
-            Assert.IsAssignableFrom<int[]>(array10);
-#endif
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-		public void IsAssignableFromFails()
-		{
-			int [] array10 = new int [10];
-			int [,] array2 = new int[2,2];
-
-			expectedMessage =
-				"  Expected: assignable from <System.Int32[,]>" + System.Environment.NewLine + 
-				"  But was:  <System.Int32[]>" + System.Environment.NewLine;
-			Expect( array10, AssignableFrom( array2.GetType() ) );
-		}
-
-		[Test()]
-		public void IsNotAssignableFrom()
-		{
-			int [] array10 = new int [10];
-
-			Assert.IsNotAssignableFrom( typeof(int[,] ),array10);
-			Expect( array10, Not.AssignableFrom( typeof(int[,] ) ) );
-#if CLR_2_0 || CLR_4_0
-            Assert.IsNotAssignableFrom<int[,]>(array10);
-#endif
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void IsNotAssignableFromFails()
-		{
-			int [] array10 = new int [10];
-			int [] array2 = new int[2];
-
-			expectedMessage =
-				"  Expected: not assignable from <System.Int32[]>" + System.Environment.NewLine + 
-				"  But was:  <System.Int32[]>" + System.Environment.NewLine;
-			Expect( array10, Not.AssignableFrom( array2.GetType() ) );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Syntax;
+
+namespace NUnit.Framework.Tests
+{
+	[TestFixture()]
+	public class TypeAssertTests : MessageChecker
+	{
+		[Test]
+		public void ExactType()
+		{
+			Expect( "Hello", TypeOf( typeof(System.String) ) );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void ExactTypeFails()
+		{
+			expectedMessage =
+				"  Expected: <System.Int32>" + Environment.NewLine +
+				"  But was:  <System.String>" + Environment.NewLine;
+			Expect( "Hello", TypeOf( typeof(System.Int32) ) );
+		}
+
+		[Test]
+		public void IsInstanceOf()
+		{
+            ApplicationException ex = new ApplicationException();
+
+			Assert.IsInstanceOf(typeof(System.Exception), ex );
+            Expect( ex, InstanceOf(typeof(Exception)));
+#if CLR_2_0 || CLR_4_0
+            Assert.IsInstanceOf<Exception>( ex );
+#endif
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void IsInstanceOfFails()
+		{
+			expectedMessage =
+				"  Expected: instance of <System.Int32>" + System.Environment.NewLine + 
+				"  But was:  <System.String>" + System.Environment.NewLine;
+			Expect( "abc123", InstanceOf( typeof(System.Int32) ) );
+		}
+
+		[Test]
+		public void IsNotInstanceOf()
+		{
+			Assert.IsNotInstanceOf(typeof(System.Int32), "abc123" );
+			Expect( "abc123", Not.InstanceOf(typeof(System.Int32)) );
+#if CLR_2_0 || CLR_4_0
+            Assert.IsNotInstanceOf<System.Int32>("abc123");
+#endif
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void IsNotInstanceOfFails()
+		{
+			expectedMessage =
+				"  Expected: not instance of <System.Exception>" + System.Environment.NewLine + 
+				"  But was:  <System.ApplicationException>" + System.Environment.NewLine;
+			Assert.IsNotInstanceOf( typeof(System.Exception), new ApplicationException() );
+		}
+
+        [Test()]
+        public void IsAssignableFrom()
+        {
+            int[] array10 = new int[10];
+
+            Assert.IsAssignableFrom(typeof(int[]), array10);
+            Expect(array10, AssignableFrom(typeof(int[])));
+#if CLR_2_0 || CLR_4_0
+            Assert.IsAssignableFrom<int[]>(array10);
+#endif
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+		public void IsAssignableFromFails()
+		{
+			int [] array10 = new int [10];
+			int [,] array2 = new int[2,2];
+
+			expectedMessage =
+				"  Expected: assignable from <System.Int32[,]>" + System.Environment.NewLine + 
+				"  But was:  <System.Int32[]>" + System.Environment.NewLine;
+			Expect( array10, AssignableFrom( array2.GetType() ) );
+		}
+
+		[Test()]
+		public void IsNotAssignableFrom()
+		{
+			int [] array10 = new int [10];
+
+			Assert.IsNotAssignableFrom( typeof(int[,] ),array10);
+			Expect( array10, Not.AssignableFrom( typeof(int[,] ) ) );
+#if CLR_2_0 || CLR_4_0
+            Assert.IsNotAssignableFrom<int[,]>(array10);
+#endif
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void IsNotAssignableFromFails()
+		{
+			int [] array10 = new int [10];
+			int [] array2 = new int[2];
+
+			expectedMessage =
+				"  Expected: not assignable from <System.Int32[]>" + System.Environment.NewLine + 
+				"  But was:  <System.Int32[]>" + System.Environment.NewLine;
+			Expect( array10, Not.AssignableFrom( array2.GetType() ) );
+		}
+	}
+}
diff --git a/src/NUnitFramework/tests/ValuesAttributeTests.cs b/src/NUnitFramework/tests/ValuesAttributeTests.cs
index 6b1390c..3cb0a97 100644
--- a/src/NUnitFramework/tests/ValuesAttributeTests.cs
+++ b/src/NUnitFramework/tests/ValuesAttributeTests.cs
@@ -1,140 +1,140 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-namespace NUnit.Framework.Tests
-{
-    public class ValuesAttributeTests
-    {
-        [Test]
-        public void ValuesAttributeProvidesSpecifiedValues()
-        {
-            CheckValues("MethodWithValues", 1, 2, 3);
-        }
-
-        private void MethodWithValues( [Values(1, 2, 3)] int x) { }
-
-        [Test]
-        public void CanConvertSmallIntsToShort([Values(5)]short x)
-        {
-        }
-
-        [Test]
-        public void CanConvertSmallIntsToByte([Values(5)]byte x)
-        {
-        }
-
-        [Test]
-        public void CanConvertSmallIntsToSByte([Values(5)]sbyte x)
-        {
-        }
-
-        [Test]
-        public void CanConvertIntToDecimal([Values(12)]decimal x)
-        {
-        }
-
-        [Test]
-        public void CanConverDoubleToDecimal([Values(12.5)]decimal x)
-        {
-        }
-
-        [Test]
-        public void CanConvertStringToDecimal([Values("12.5")]decimal x)
-        {
-        }
-
-        [Test]
-        public void RangeAttributeWithIntRange()
-        {
-            CheckValues("MethodWithIntRange", 11, 12, 13, 14, 15);
-        }
-
-        private void MethodWithIntRange([Range(11, 15)] int x) { }
-
-        [Test]
-        public void RangeAttributeWithIntRangeAndStep()
-        {
-            CheckValues("MethodWithIntRangeAndStep", 11, 13, 15);
-        }
-
-        private void MethodWithIntRangeAndStep([Range(11, 15, 2)] int x) { }
-
-        [Test]
-        public void RangeAttributeWithLongRangeAndStep()
-        {
-            CheckValues("MethodWithLongRangeAndStep", 11L, 13L, 15L);
-        }
-
-        private void MethodWithLongRangeAndStep([Range(11L, 15L, 2)] long x) { }
-
-        [Test]
-        public void RangeAttributeWithDoubleRangeAndStep()
-        {
-            CheckValuesWithinTolerance("MethodWithDoubleRangeAndStep", 0.7, 0.9, 1.1);
-        }
-
-        private void MethodWithDoubleRangeAndStep([Range(0.7, 1.2, 0.2)] double x) { }
-
-        [Test]
-        public void RangeAttributeWithFloatRangeAndStep()
-        {
-            CheckValuesWithinTolerance("MethodWithFloatRangeAndStep", 0.7f, 0.9f, 1.1f);
-        }
-
-        private void MethodWithFloatRangeAndStep([Range(0.7f, 1.2f, 0.2f)] float x) { }
-
-        [Test]
-        public void CanConvertIntRangeToShort([Range(1, 3)] short x) { }
-
-        [Test]
-        public void CanConvertIntRangeToByte([Range(1, 3)] byte x) { }
-
-        [Test]
-        public void CanConvertIntRangeToSByte([Range(1, 3)] sbyte x) { }
-
-        [Test]
-        public void CanConvertIntRangeToDecimal([Range(1, 3)] decimal x) { }
-
-        [Test]
-        public void CanConvertDoubleRangeToDecimal([Range(1.0, 1.3, 0.1)] decimal x) { }
-
-        [Test]
-        public void CanConvertRandomIntToShort([Random(1, 10, 3)] short x) { }
-
-        [Test]
-        public void CanConvertRandomIntToByte([Random(1, 10, 3)] byte x) { }
-
-        [Test]
-        public void CanConvertRandomIntToSByte([Random(1, 10, 3)] sbyte x) { }
-
-        [Test]
-        public void CanConvertRandomIntToDecimal([Random(1, 10, 3)] decimal x) { }
-        
-        [Test]
-        public void CanConvertRandomDoubleToDecimal([Random(1.0, 10.0, 3)] decimal x) { }
-
-        #region Helper Methods
-        private void CheckValues(string methodName, params object[] expected)
-        {
-            MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
-            ParameterInfo param = method.GetParameters()[0];
-            ValuesAttribute attr = param.GetCustomAttributes(typeof(ValuesAttribute), false)[0] as ValuesAttribute;
-            Assert.That(attr.GetData(param), Is.EqualTo(expected));
-        }
-
-        private void CheckValuesWithinTolerance(string methodName, params object[] expected)
-        {
-            MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
-            ParameterInfo param = method.GetParameters()[0];
-            ValuesAttribute attr = param.GetCustomAttributes(typeof(ValuesAttribute), false)[0] as ValuesAttribute;
-            Assert.That(attr.GetData(param), Is.EqualTo(expected).Within(0.000001));
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+namespace NUnit.Framework.Tests
+{
+    public class ValuesAttributeTests
+    {
+        [Test]
+        public void ValuesAttributeProvidesSpecifiedValues()
+        {
+            CheckValues("MethodWithValues", 1, 2, 3);
+        }
+
+        private void MethodWithValues( [Values(1, 2, 3)] int x) { }
+
+        [Test]
+        public void CanConvertSmallIntsToShort([Values(5)]short x)
+        {
+        }
+
+        [Test]
+        public void CanConvertSmallIntsToByte([Values(5)]byte x)
+        {
+        }
+
+        [Test]
+        public void CanConvertSmallIntsToSByte([Values(5)]sbyte x)
+        {
+        }
+
+        [Test]
+        public void CanConvertIntToDecimal([Values(12)]decimal x)
+        {
+        }
+
+        [Test]
+        public void CanConverDoubleToDecimal([Values(12.5)]decimal x)
+        {
+        }
+
+        [Test]
+        public void CanConvertStringToDecimal([Values("12.5")]decimal x)
+        {
+        }
+
+        [Test]
+        public void RangeAttributeWithIntRange()
+        {
+            CheckValues("MethodWithIntRange", 11, 12, 13, 14, 15);
+        }
+
+        private void MethodWithIntRange([Range(11, 15)] int x) { }
+
+        [Test]
+        public void RangeAttributeWithIntRangeAndStep()
+        {
+            CheckValues("MethodWithIntRangeAndStep", 11, 13, 15);
+        }
+
+        private void MethodWithIntRangeAndStep([Range(11, 15, 2)] int x) { }
+
+        [Test]
+        public void RangeAttributeWithLongRangeAndStep()
+        {
+            CheckValues("MethodWithLongRangeAndStep", 11L, 13L, 15L);
+        }
+
+        private void MethodWithLongRangeAndStep([Range(11L, 15L, 2)] long x) { }
+
+        [Test]
+        public void RangeAttributeWithDoubleRangeAndStep()
+        {
+            CheckValuesWithinTolerance("MethodWithDoubleRangeAndStep", 0.7, 0.9, 1.1);
+        }
+
+        private void MethodWithDoubleRangeAndStep([Range(0.7, 1.2, 0.2)] double x) { }
+
+        [Test]
+        public void RangeAttributeWithFloatRangeAndStep()
+        {
+            CheckValuesWithinTolerance("MethodWithFloatRangeAndStep", 0.7f, 0.9f, 1.1f);
+        }
+
+        private void MethodWithFloatRangeAndStep([Range(0.7f, 1.2f, 0.2f)] float x) { }
+
+        [Test]
+        public void CanConvertIntRangeToShort([Range(1, 3)] short x) { }
+
+        [Test]
+        public void CanConvertIntRangeToByte([Range(1, 3)] byte x) { }
+
+        [Test]
+        public void CanConvertIntRangeToSByte([Range(1, 3)] sbyte x) { }
+
+        [Test]
+        public void CanConvertIntRangeToDecimal([Range(1, 3)] decimal x) { }
+
+        [Test]
+        public void CanConvertDoubleRangeToDecimal([Range(1.0, 1.3, 0.1)] decimal x) { }
+
+        [Test]
+        public void CanConvertRandomIntToShort([Random(1, 10, 3)] short x) { }
+
+        [Test]
+        public void CanConvertRandomIntToByte([Random(1, 10, 3)] byte x) { }
+
+        [Test]
+        public void CanConvertRandomIntToSByte([Random(1, 10, 3)] sbyte x) { }
+
+        [Test]
+        public void CanConvertRandomIntToDecimal([Random(1, 10, 3)] decimal x) { }
+        
+        [Test]
+        public void CanConvertRandomDoubleToDecimal([Random(1.0, 10.0, 3)] decimal x) { }
+
+        #region Helper Methods
+        private void CheckValues(string methodName, params object[] expected)
+        {
+            MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
+            ParameterInfo param = method.GetParameters()[0];
+            ValuesAttribute attr = param.GetCustomAttributes(typeof(ValuesAttribute), false)[0] as ValuesAttribute;
+            Assert.That(attr.GetData(param), Is.EqualTo(expected));
+        }
+
+        private void CheckValuesWithinTolerance(string methodName, params object[] expected)
+        {
+            MethodInfo method = GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
+            ParameterInfo param = method.GetParameters()[0];
+            ValuesAttribute attr = param.GetCustomAttributes(typeof(ValuesAttribute), false)[0] as ValuesAttribute;
+            Assert.That(attr.GetData(param), Is.EqualTo(expected).Within(0.000001));
+        }
+        #endregion
+    }
+}
diff --git a/src/NUnitFramework/tests/data/TestText1.txt b/src/NUnitFramework/tests/data/TestText1.txt
index 98b0c28..b47f416 100644
--- a/src/NUnitFramework/tests/data/TestText1.txt
+++ b/src/NUnitFramework/tests/data/TestText1.txt
@@ -1,800 +1,800 @@
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-1234567890123456789012345678901234567890123456789012345678901234567890123456789!
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+1234567890123456789012345678901234567890123456789012345678901234567890123456789!
diff --git a/src/NUnitFramework/tests/data/TestText2.txt b/src/NUnitFramework/tests/data/TestText2.txt
index 2904246..2b3ba6b 100644
--- a/src/NUnitFramework/tests/data/TestText2.txt
+++ b/src/NUnitFramework/tests/data/TestText2.txt
@@ -1,800 +1,800 @@
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
-12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.build b/src/NUnitFramework/tests/nunit.framework.tests.build
index 69b445e..d90d99f 100644
--- a/src/NUnitFramework/tests/nunit.framework.tests.build
+++ b/src/NUnitFramework/tests/nunit.framework.tests.build
@@ -1,119 +1,120 @@
-<?xml version="1.0"?>
-<project name="NUnitFrameworkTests" default="build" basedir=".">
-
-  <patternset id="source-files">
-    <include name="Constraints/AfterConstraintTests.cs"/>
-    <include name="Constraints/AndTest.cs"/>
-    <include name="Constraints/BasicConstraintTests.cs"/>
-    <include name="Constraints/CollectionConstraintTests.cs"/>
-    <include name="Constraints/ComparerTests.cs"/>
-    <include name="Constraints/ComparisonConstraintTests.cs"/>
-    <include name="Constraints/ConstraintTestBase.cs"/>
-    <include name="Constraints/EmptyConstraintTest.cs"/>
-    <include name="Constraints/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"/>
-    <include name="Constraints/ReusableConstraintTests.cs"/>
-    <include name="Constraints/SameAsTest.cs"/>
-    <include name="Constraints/SerializableConstraintTest.cs"/>
-    <include name="Constraints/StringConstraintTests.cs"/>
-    <include name="Constraints/ThrowsConstraintTests.cs"/>
-    <include name="Constraints/ToStringTests.cs"/>
-    <include name="Constraints/TypeConstraintTests.cs"/>
-    <include name="Syntax/AfterTests.cs"/>
-    <include name="Syntax/ArbitraryConstraintMatching.cs"/>
-    <include name="Syntax/CollectionTests.cs"/>
-    <include name="Syntax/ComparisonTests.cs"/>
-    <include name="Syntax/EqualityTests.cs"/>
-    <include name="Syntax/InvalidCodeTests.cs"/>
-    <include name="Syntax/OperatorOverrides.cs"/>
-    <include name="Syntax/OperatorTests.cs"/>
-    <include name="Syntax/PathConstraintTests.cs"/>
-    <include name="Syntax/PropertyTests.cs"/>
-    <include name="Syntax/SerializableConstraints.cs"/>
-    <include name="Syntax/SimpleConstraints.cs"/>
-    <include name="Syntax/StringConstraints.cs"/>
-    <include name="Syntax/SyntaxTest.cs"/>
-    <include name="Syntax/TestCompiler.cs"/>
-    <include name="Syntax/ThrowsTests.cs"/>
-    <include name="Syntax/TypeConstraints.cs"/>
-    <include name="ArrayEqualsFailureMessageFixture.cs"/>
-    <include name="ArrayEqualsFixture.cs"/>
-    <include name="ArrayNotEqualFixture.cs"/>
-    <include name="AssertThrowsTests.cs"/>
-    <include name="AssumeThatTests.cs"/>
-    <include name="CollectionAssertTest.cs"/>
-    <include name="CollectionAdapter.cs"/>
-    <include name="ConditionAssertTests.cs"/>
-    <include name="DirectoryAssertTests.cs"/>
-    <include name="EqualsFixture.cs"/>
-    <include name="FileAssertTests.cs"/>
-    <include name="GreaterEqualFixture.cs"/>
-    <include name="GreaterFixture.cs"/>
-    <include name="LessEqualFixture.cs"/>
-    <include name="LessFixture.cs"/>
-    <include name="ListContentsTests.cs"/>
-    <include name="MessageChecker.cs"/>
-    <include name="NotEqualFixture.cs"/>
-    <include name="NotSameFixture.cs"/>
-    <include name="NullableTypesTests.cs"/>
-    <include name="RandomizerTests.cs"/>
-    <include name="RangeTests.cs"/>
-    <include name="SameFixture.cs"/>
-    <include name="StringAssertTests.cs"/>
-    <include name="TestDelegates.cs"/>
-    <include name="TestFixtureAttributeTests.cs"/>
-    <include name="TextMessageWriterTests.cs"/>
-    <include name="TypeAssertTest.cs"/>
-    <include name="ValuesAttributeTests.cs"/>
-  </patternset>
-
-  <patternset id="resource-files">
-        <include name="data/TestImage1.jpg"/>
-        <include name="data/TestImage2.jpg"/>
-        <include name="data/TestText1.txt"/>
-        <include name="data/TestText2.txt"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/nunit.framework.tests.dll"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <nowarn>
-        <warning number="618,672"/>
-      </nowarn>
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <resources prefix="NUnit.Framework.Tests.data">
-        <patternset refid="resource-files"/>
-      </resources>
-      <references>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="System.Data.dll"/>
-        <include name="System.Drawing.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitFramework/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <patternset refid="resource-files"/>
-        <include name="nunit.framework.tests.csproj"/>
-        <include name="nunit.framework.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitFrameworkTests" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Constraints/AfterConstraintTests.cs"/>
+    <include name="Constraints/AndTest.cs"/>
+    <include name="Constraints/BasicConstraintTests.cs"/>
+    <include name="Constraints/CollectionConstraintTests.cs"/>
+    <include name="Constraints/ComparerTests.cs"/>
+    <include name="Constraints/ComparisonConstraintTests.cs"/>
+    <include name="Constraints/ConstraintTestBase.cs"/>
+    <include name="Constraints/EmptyConstraintTest.cs"/>
+    <include name="Constraints/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/PredicateConstraintTests.cs"/>
+    <include name="Constraints/PropertyTests.cs"/>
+    <include name="Constraints/ReusableConstraintTests.cs"/>
+    <include name="Constraints/SameAsTest.cs"/>
+    <include name="Constraints/SerializableConstraintTest.cs"/>
+    <include name="Constraints/StringConstraintTests.cs"/>
+    <include name="Constraints/ThrowsConstraintTests.cs"/>
+    <include name="Constraints/ToStringTests.cs"/>
+    <include name="Constraints/TypeConstraintTests.cs"/>
+    <include name="Syntax/AfterTests.cs"/>
+    <include name="Syntax/ArbitraryConstraintMatching.cs"/>
+    <include name="Syntax/CollectionTests.cs"/>
+    <include name="Syntax/ComparisonTests.cs"/>
+    <include name="Syntax/EqualityTests.cs"/>
+    <include name="Syntax/InvalidCodeTests.cs"/>
+    <include name="Syntax/OperatorOverrides.cs"/>
+    <include name="Syntax/OperatorTests.cs"/>
+    <include name="Syntax/PathConstraintTests.cs"/>
+    <include name="Syntax/PropertyTests.cs"/>
+    <include name="Syntax/SerializableConstraints.cs"/>
+    <include name="Syntax/SimpleConstraints.cs"/>
+    <include name="Syntax/StringConstraints.cs"/>
+    <include name="Syntax/SyntaxTest.cs"/>
+    <include name="Syntax/TestCompiler.cs"/>
+    <include name="Syntax/ThrowsTests.cs"/>
+    <include name="Syntax/TypeConstraints.cs"/>
+    <include name="ArrayEqualsFailureMessageFixture.cs"/>
+    <include name="ArrayEqualsFixture.cs"/>
+    <include name="ArrayNotEqualFixture.cs"/>
+    <include name="AssertThrowsTests.cs"/>
+    <include name="AssumeThatTests.cs"/>
+    <include name="CollectionAssertTest.cs"/>
+    <include name="CollectionAdapter.cs"/>
+    <include name="ConditionAssertTests.cs"/>
+    <include name="DirectoryAssertTests.cs"/>
+    <include name="EqualsFixture.cs"/>
+    <include name="FileAssertTests.cs"/>
+    <include name="GreaterEqualFixture.cs"/>
+    <include name="GreaterFixture.cs"/>
+    <include name="LessEqualFixture.cs"/>
+    <include name="LessFixture.cs"/>
+    <include name="ListContentsTests.cs"/>
+    <include name="MessageChecker.cs"/>
+    <include name="NotEqualFixture.cs"/>
+    <include name="NotSameFixture.cs"/>
+    <include name="NullableTypesTests.cs"/>
+    <include name="RandomizerTests.cs"/>
+    <include name="RangeTests.cs"/>
+    <include name="SameFixture.cs"/>
+    <include name="StringAssertTests.cs"/>
+    <include name="TestDelegates.cs"/>
+    <include name="TestFixtureAttributeTests.cs"/>
+    <include name="TextMessageWriterTests.cs"/>
+    <include name="TypeAssertTest.cs"/>
+    <include name="ValuesAttributeTests.cs"/>
+  </patternset>
+
+  <patternset id="resource-files">
+        <include name="data/TestImage1.jpg"/>
+        <include name="data/TestImage2.jpg"/>
+        <include name="data/TestText1.txt"/>
+        <include name="data/TestText2.txt"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/nunit.framework.tests.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <nowarn>
+        <warning number="618,672"/>
+      </nowarn>
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <resources prefix="NUnit.Framework.Tests.data">
+        <patternset refid="resource-files"/>
+      </resources>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="System.Data.dll"/>
+        <include name="System.Drawing.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitFramework/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <patternset refid="resource-files"/>
+        <include name="nunit.framework.tests.csproj"/>
+        <include name="nunit.framework.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitFramework/tests/nunit.framework.tests.csproj b/src/NUnitFramework/tests/nunit.framework.tests.csproj
index 21f8c8e..45814dc 100644
--- a/src/NUnitFramework/tests/nunit.framework.tests.csproj
+++ b/src/NUnitFramework/tests/nunit.framework.tests.csproj
@@ -1,177 +1,228 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8C326431-AE57-4645-ACC1-A90A0B425129}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.framework.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Framework.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618,672</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="ArrayEqualsFailureMessageFixture.cs" />
-    <Compile Include="ArrayEqualsFixture.cs" />
-    <Compile Include="ArrayNotEqualFixture.cs" />
-    <Compile Include="AssertThrowsTests.cs" />
-    <Compile Include="AssumeThatTests.cs" />
-    <Compile Include="CollectionAdapter.cs" />
-    <Compile Include="CollectionAssertTest.cs" />
-    <Compile Include="ConditionAssertTests.cs" />
-    <Compile Include="Constraints\AfterConstraintTests.cs" />
-    <Compile Include="Constraints\AndTest.cs" />
-    <Compile Include="Constraints\BasicConstraintTests.cs" />
-    <Compile Include="Constraints\CollectionConstraintTests.cs" />
-    <Compile Include="Constraints\ComparerTests.cs" />
-    <Compile Include="Constraints\ComparisonConstraintTests.cs" />
-    <Compile Include="Constraints\ConstraintTestBase.cs" />
-    <Compile Include="Constraints\EmptyConstraintTest.cs" />
-    <Compile Include="Constraints\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" />
-    <Compile Include="Constraints\ReusableConstraintTests.cs" />
-    <Compile Include="Constraints\SameAsTest.cs" />
-    <Compile Include="Constraints\SerializableConstraintTest.cs" />
-    <Compile Include="Constraints\StringConstraintTests.cs" />
-    <Compile Include="Constraints\ThrowsConstraintTests.cs" />
-    <Compile Include="Constraints\ToStringTests.cs" />
-    <Compile Include="Constraints\TypeConstraintTests.cs" />
-    <Compile Include="DirectoryAssertTests.cs" />
-    <Compile Include="EqualsFixture.cs" />
-    <Compile Include="FileAssertTests.cs" />
-    <Compile Include="GreaterEqualFixture.cs" />
-    <Compile Include="GreaterFixture.cs" />
-    <Compile Include="LessEqualFixture.cs" />
-    <Compile Include="LessFixture.cs" />
-    <Compile Include="ListContentsTests.cs" />
-    <Compile Include="MessageChecker.cs" />
-    <Compile Include="NotEqualFixture.cs" />
-    <Compile Include="NotSameFixture.cs" />
-    <Compile Include="NullableTypesTests.cs" />
-    <Compile Include="RandomizerTests.cs" />
-    <Compile Include="RangeTests.cs" />
-    <Compile Include="SameFixture.cs" />
-    <Compile Include="StringAssertTests.cs" />
-    <Compile Include="Syntax\AfterTests.cs" />
-    <Compile Include="Syntax\ArbitraryConstraintMatching.cs" />
-    <Compile Include="Syntax\CollectionTests.cs" />
-    <Compile Include="Syntax\ComparisonTests.cs" />
-    <Compile Include="Syntax\EqualityTests.cs" />
-    <Compile Include="Syntax\InvalidCodeTests.cs" />
-    <Compile Include="Syntax\OperatorOverrides.cs" />
-    <Compile Include="Syntax\OperatorTests.cs" />
-    <Compile Include="Syntax\PathConstraintTests.cs" />
-    <Compile Include="Syntax\PropertyTests.cs" />
-    <Compile Include="Syntax\SerializableConstraints.cs" />
-    <Compile Include="Syntax\SimpleConstraints.cs" />
-    <Compile Include="Syntax\StringConstraints.cs" />
-    <Compile Include="Syntax\SyntaxTest.cs" />
-    <Compile Include="Syntax\TestCompiler.cs" />
-    <Compile Include="Syntax\ThrowsTests.cs" />
-    <Compile Include="Syntax\TypeConstraints.cs" />
-    <Compile Include="TestDelegates.cs" />
-    <Compile Include="TestFixtureAttributeTests.cs" />
-    <Compile Include="TextMessageWriterTests.cs" />
-    <Compile Include="TypeAssertTest.cs" />
-    <Compile Include="ValuesAttributeTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="data\TestImage1.jpg" />
-    <EmbeddedResource Include="data\TestImage2.jpg" />
-    <EmbeddedResource Include="data\TestText1.txt" />
-    <EmbeddedResource Include="data\TestText2.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.framework.tests.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8C326431-AE57-4645-ACC1-A90A0B425129}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.framework.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Framework.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_3_5,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_3_5,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,672</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <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>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="ArrayEqualsFailureMessageFixture.cs" />
+    <Compile Include="ArrayEqualsFixture.cs" />
+    <Compile Include="ArrayNotEqualFixture.cs" />
+    <Compile Include="AssertThrowsTests.cs" />
+    <Compile Include="AssumeThatTests.cs" />
+    <Compile Include="CollectionAdapter.cs" />
+    <Compile Include="CollectionAssertTest.cs" />
+    <Compile Include="ConditionAssertTests.cs" />
+    <Compile Include="Constraints\AllItemsConstraintTests.cs" />
+    <Compile Include="Constraints\AssignableFromConstraintTests.cs" />
+    <Compile Include="Constraints\AttributeExistsConstraintTests.cs" />
+    <Compile Include="Constraints\BinarySerializableTest.cs" />
+    <Compile Include="Constraints\CollectionContainsConstraintTests.cs" />
+    <Compile Include="Constraints\CollectionEquivalentConstraintTests.cs" />
+    <Compile Include="Constraints\CollectionOrderedConstraintTests.cs" />
+    <Compile Include="Constraints\DelayedConstraintTest.cs" />
+    <Compile Include="Constraints\AndConstraintTests.cs" />
+    <Compile Include="Constraints\BasicConstraintTests.cs" />
+    <Compile Include="Constraints\EndsWithConstraintTests.cs" />
+    <Compile Include="Constraints\ExactCountConstraintTests.cs" />
+    <Compile Include="Constraints\ExactTypeConstraintTests.cs" />
+    <Compile Include="Constraints\InstanceOfTypeConstraintTests.cs" />
+    <Compile Include="Constraints\NUnitComparerTests.cs" />
+    <Compile Include="Constraints\ComparisonConstraintTest.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\GreaterThanOrEqualConstraintTests.cs" />
+    <Compile Include="Constraints\GreaterThanConstraintTests.cs" />
+    <Compile Include="Constraints\LessThanOrEqualConstraintTests.cs" />
+    <Compile Include="Constraints\LessThanConstraintTests.cs" />
+    <Compile Include="Constraints\MsgUtilTests.cs" />
+    <Compile Include="Constraints\NotConstraintTests.cs" />
+    <Compile Include="Constraints\NumericsTest.cs" />
+    <Compile Include="Constraints\NUnitEqualityComparerTests.cs" />
+    <Compile Include="Constraints\OrConstraintTests.cs" />
+    <Compile Include="Constraints\PathConstraintTests.cs" />
+    <Compile Include="Constraints\PredicateConstraintTests.cs" />
+    <Compile Include="Constraints\PropertyTests.cs" />
+    <Compile Include="Constraints\RangeConstraintTests.cs" />
+    <Compile Include="Constraints\ReusableConstraintTests.cs" />
+    <Compile Include="Constraints\SameAsTest.cs" />
+    <Compile Include="Constraints\StartsWithConstraintTests.cs" />
+    <Compile Include="Constraints\XmlSerializableTest.cs" />
+    <Compile Include="Constraints\SubstringConstraintTests.cs" />
+    <Compile Include="Constraints\ThrowsConstraintTests.cs" />
+    <Compile Include="Constraints\ToStringTests.cs" />
+    <Compile Include="Constraints\AssignableToConstraintTests.cs" />
+    <Compile Include="DirectoryAssertTests.cs" />
+    <Compile Include="EqualsFixture.cs" />
+    <Compile Include="FileAssertTests.cs" />
+    <Compile Include="GreaterEqualFixture.cs" />
+    <Compile Include="GreaterFixture.cs" />
+    <Compile Include="LessEqualFixture.cs" />
+    <Compile Include="LessFixture.cs" />
+    <Compile Include="ListContentsTests.cs" />
+    <Compile Include="MessageChecker.cs" />
+    <Compile Include="NotEqualFixture.cs" />
+    <Compile Include="NotSameFixture.cs" />
+    <Compile Include="NullableTypesTests.cs" />
+    <Compile Include="RandomizerTests.cs" />
+    <Compile Include="RangeTests.cs" />
+    <Compile Include="SameFixture.cs" />
+    <Compile Include="StringAssertTests.cs" />
+    <Compile Include="Syntax\AfterTests.cs" />
+    <Compile Include="Syntax\ArbitraryConstraintMatching.cs" />
+    <Compile Include="Syntax\CollectionTests.cs" />
+    <Compile Include="Syntax\ComparisonTests.cs" />
+    <Compile Include="Syntax\EqualityTests.cs" />
+    <Compile Include="Syntax\InvalidCodeTests.cs" />
+    <Compile Include="Syntax\OperatorOverrides.cs" />
+    <Compile Include="Syntax\OperatorTests.cs" />
+    <Compile Include="Syntax\PathConstraintTests.cs" />
+    <Compile Include="Syntax\PropertyTests.cs" />
+    <Compile Include="Syntax\SerializableConstraints.cs" />
+    <Compile Include="Syntax\SimpleConstraints.cs" />
+    <Compile Include="Syntax\StringConstraints.cs" />
+    <Compile Include="Syntax\SyntaxTest.cs" />
+    <Compile Include="Syntax\TestCompiler.cs" />
+    <Compile Include="Syntax\ThrowsTests.cs" />
+    <Compile Include="Syntax\TypeConstraints.cs" />
+    <Compile Include="TestDelegates.cs" />
+    <Compile Include="TestFixtureAttributeTests.cs" />
+    <Compile Include="TextMessageWriterTests.cs" />
+    <Compile Include="TypeAssertTest.cs" />
+    <Compile Include="ValuesAttributeTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="data\TestImage1.jpg" />
+    <EmbeddedResource Include="data\TestImage2.jpg" />
+    <EmbeddedResource Include="data\TestText1.txt" />
+    <EmbeddedResource Include="data\TestText2.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.framework.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/mocks/AssemblyInfo.cs b/src/NUnitMocks/mocks/AssemblyInfo.cs
index 22fea6f..3e2666c 100644
--- a/src/NUnitMocks/mocks/AssemblyInfo.cs
+++ b/src/NUnitMocks/mocks/AssemblyInfo.cs
@@ -1,12 +1,12 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("../../nunit.snk")]
-[assembly: AssemblyKeyName("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("../../nunit.snk")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/NUnitMocks/mocks/DynamicMock.cs b/src/NUnitMocks/mocks/DynamicMock.cs
index b6d48ba..9529647 100644
--- a/src/NUnitMocks/mocks/DynamicMock.cs
+++ b/src/NUnitMocks/mocks/DynamicMock.cs
@@ -1,48 +1,48 @@
-// ****************************************************************
-// Copyright 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.Mocks
-{
-	/// <summary>
-	/// Summary description for DynamicMock.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-	public class DynamicMock : Mock
-	{
-		private Type type;
-
-		private object mockInstance;
-
-		public object MockInstance
-		{
-			get 
-			{ 
-				if ( mockInstance == null )
-				{
-					MockInterfaceHandler handler = new MockInterfaceHandler( type, this );
-					mockInstance = handler.GetTransparentProxy();
-				}
-
-				return mockInstance; 
-			}
-		}
-
-		#region Constructors
-
-		public DynamicMock( Type type ) : this( "Mock" + type.Name, type ) { }
-
-		public DynamicMock( string name, Type type ) : base( name )
-		{
-//			if ( !type.IsInterface )
-//				throw new VerifyException( "DynamicMock constructor requires an interface type" );
-			this.type = type;
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// Summary description for DynamicMock.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+	public class DynamicMock : Mock
+	{
+		private Type type;
+
+		private object mockInstance;
+
+		public object MockInstance
+		{
+			get 
+			{ 
+				if ( mockInstance == null )
+				{
+					MockInterfaceHandler handler = new MockInterfaceHandler( type, this );
+					mockInstance = handler.GetTransparentProxy();
+				}
+
+				return mockInstance; 
+			}
+		}
+
+		#region Constructors
+
+		public DynamicMock( Type type ) : this( "Mock" + type.Name, type ) { }
+
+		public DynamicMock( string name, Type type ) : base( name )
+		{
+//			if ( !type.IsInterface )
+//				throw new VerifyException( "DynamicMock constructor requires an interface type" );
+			this.type = type;
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitMocks/mocks/ICall.cs b/src/NUnitMocks/mocks/ICall.cs
index 37903f2..2accf95 100644
--- a/src/NUnitMocks/mocks/ICall.cs
+++ b/src/NUnitMocks/mocks/ICall.cs
@@ -1,25 +1,25 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// The ICall interface is implemented by objects that can be called
-	/// with an array of arguments and return a value.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public interface ICall
-	{
-		/// <summary>
-		/// Process a call with a possibly empty set of arguments.
-		/// </summary>
-		/// <param name="args">Arguments for this call</param>
-		/// <returns>An implementation-defined return value</returns>
-		object Call( object[] args );
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// The ICall interface is implemented by objects that can be called
+	/// with an array of arguments and return a value.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface ICall
+	{
+		/// <summary>
+		/// Process a call with a possibly empty set of arguments.
+		/// </summary>
+		/// <param name="args">Arguments for this call</param>
+		/// <returns>An implementation-defined return value</returns>
+		object Call( object[] args );
+	}
+}
diff --git a/src/NUnitMocks/mocks/ICallHandler.cs b/src/NUnitMocks/mocks/ICallHandler.cs
index f73cf01..445d731 100644
--- a/src/NUnitMocks/mocks/ICallHandler.cs
+++ b/src/NUnitMocks/mocks/ICallHandler.cs
@@ -1,26 +1,26 @@
-// ****************************************************************
-// Copyright 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.Mocks
-{
-	/// <summary>
-	/// The ICallHandler interface dispatches calls to methods or
-	/// other objects implementing the ICall interface.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public interface ICallHandler
-	{		
-		/// <summary>
-		/// Simulate a method call on the mocked object.
-		/// </summary>
-		/// <param name="methodName">The name of the method</param>
-		/// <param name="args">Arguments for this call</param>
-		/// <returns>Previously specified object or null</returns>
-		object Call( string methodName, params object[] args );
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// The ICallHandler interface dispatches calls to methods or
+	/// other objects implementing the ICall interface.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface ICallHandler
+	{		
+		/// <summary>
+		/// Simulate a method call on the mocked object.
+		/// </summary>
+		/// <param name="methodName">The name of the method</param>
+		/// <param name="args">Arguments for this call</param>
+		/// <returns>Previously specified object or null</returns>
+		object Call( string methodName, params object[] args );
+	}
+}
diff --git a/src/NUnitMocks/mocks/IMethod.cs b/src/NUnitMocks/mocks/IMethod.cs
index a1468b7..5cac4e9 100644
--- a/src/NUnitMocks/mocks/IMethod.cs
+++ b/src/NUnitMocks/mocks/IMethod.cs
@@ -1,29 +1,29 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// The IMethod interface represents an method or other named object that 
-	/// is both callable and self-verifying.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public interface IMethod : IVerify, ICall
-	{
-		/// <summary>
-		/// The name of the object
-		/// </summary>
-		string Name { get; }
-
-		/// <summary>
-		/// Tell the object to expect a certain call.
-		/// </summary>
-		/// <param name="call"></param>
-		void Expect( ICall call );
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// The IMethod interface represents an method or other named object that 
+	/// is both callable and self-verifying.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface IMethod : IVerify, ICall
+	{
+		/// <summary>
+		/// The name of the object
+		/// </summary>
+		string Name { get; }
+
+		/// <summary>
+		/// Tell the object to expect a certain call.
+		/// </summary>
+		/// <param name="call"></param>
+		void Expect( ICall call );
+	}
+}
diff --git a/src/NUnitMocks/mocks/IMock.cs b/src/NUnitMocks/mocks/IMock.cs
index beed5da..be78434 100644
--- a/src/NUnitMocks/mocks/IMock.cs
+++ b/src/NUnitMocks/mocks/IMock.cs
@@ -1,67 +1,67 @@
-// ****************************************************************
-// Copyright 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.Mocks
-{
-	/// <summary>
-	/// Summary description for IMock.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public interface IMock : IVerify, ICallHandler
-	{
-		/// <summary>
-		/// The name of this mock - used in messages
-		/// </summary>
-		string Name { get; }
-	
-		/// <summary>
-		/// True if unexpected calls should cause an error, false to ignore them
-		/// </summary>
-		bool Strict { get; set; }
-
-		/// <summary>
-		/// Set up to expect a call to a method with a set of arguments
-		/// </summary>
-		/// <param name="methodName">The name of the method</param>
-		/// <param name="args">Arguments for this call</param>
-		void Expect( string methodName, params object[] args );
-
-		void Expect( string MethodName );
-
-		/// <summary>
-		/// Set up expectation that the named method will not be called
-		/// </summary>
-		/// <param name="methodName">The name of the method</param>
-		void ExpectNoCall( string methodName );
-
-		/// <summary>
-		/// Set up to expect a call to a method with a set of arguments.
-		/// The specified value will be returned.
-		/// </summary>
-		/// <param name="methodName">The name of the method</param>
-		/// <param name="returnVal">The value to be returned</param>
-		/// <param name="args">Arguments for this call</param>
-		void ExpectAndReturn( string methodName, object returnVal, params object[] args );
-
-		/// <summary>
-		/// Set up to expect a call to a method with a set of arguments.
-		/// The specified exception will be thrown.
-		/// </summary>
-		/// <param name="methodname">The name of the method</param>
-		/// <param name="exception">The exception to throw</param>
-		/// <param name="args">Arguments for this call</param>
-		void ExpectAndThrow( string methodname, Exception exception, params object[] args );
-
-		/// <summary>
-		/// Set value to return for a method or property called with any arguments
-		/// </summary>
-		/// <param name="methodName">The name of the method</param>
-		/// <param name="returnVal">The value to be returned</param>
-		void SetReturnValue( string methodName, object returnVal );
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// Summary description for IMock.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public interface IMock : IVerify, ICallHandler
+	{
+		/// <summary>
+		/// The name of this mock - used in messages
+		/// </summary>
+		string Name { get; }
+	
+		/// <summary>
+		/// True if unexpected calls should cause an error, false to ignore them
+		/// </summary>
+		bool Strict { get; set; }
+
+		/// <summary>
+		/// Set up to expect a call to a method with a set of arguments
+		/// </summary>
+		/// <param name="methodName">The name of the method</param>
+		/// <param name="args">Arguments for this call</param>
+		void Expect( string methodName, params object[] args );
+
+		void Expect( string MethodName );
+
+		/// <summary>
+		/// Set up expectation that the named method will not be called
+		/// </summary>
+		/// <param name="methodName">The name of the method</param>
+		void ExpectNoCall( string methodName );
+
+		/// <summary>
+		/// Set up to expect a call to a method with a set of arguments.
+		/// The specified value will be returned.
+		/// </summary>
+		/// <param name="methodName">The name of the method</param>
+		/// <param name="returnVal">The value to be returned</param>
+		/// <param name="args">Arguments for this call</param>
+		void ExpectAndReturn( string methodName, object returnVal, params object[] args );
+
+		/// <summary>
+		/// Set up to expect a call to a method with a set of arguments.
+		/// The specified exception will be thrown.
+		/// </summary>
+		/// <param name="methodname">The name of the method</param>
+		/// <param name="exception">The exception to throw</param>
+		/// <param name="args">Arguments for this call</param>
+		void ExpectAndThrow( string methodname, Exception exception, params object[] args );
+
+		/// <summary>
+		/// Set value to return for a method or property called with any arguments
+		/// </summary>
+		/// <param name="methodName">The name of the method</param>
+		/// <param name="returnVal">The value to be returned</param>
+		void SetReturnValue( string methodName, object returnVal );
+	}
+}
diff --git a/src/NUnitMocks/mocks/IVerify.cs b/src/NUnitMocks/mocks/IVerify.cs
index bafdc42..733afe3 100644
--- a/src/NUnitMocks/mocks/IVerify.cs
+++ b/src/NUnitMocks/mocks/IVerify.cs
@@ -1,19 +1,19 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// The IVerify interface is implemented by objects capable of self-verification.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public interface IVerify
-	{
-		void Verify();
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// The IVerify interface is implemented by objects capable of self-verification.
+	/// </summary>
+    [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 94efd6b..7177678 100644
--- a/src/NUnitMocks/mocks/MethodSignature.cs
+++ b/src/NUnitMocks/mocks/MethodSignature.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// Copyright 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.Mocks
-{
-	/// <summary>
-	/// Summary description for MockSignature.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public class MethodSignature
-	{
-		public readonly string typeName;
-		public readonly string methodName;
-		public readonly Type[] argTypes;
-
-		public MethodSignature( string typeName, string methodName, Type[] argTypes )
-		{
-			this.typeName = typeName;
-			this.methodName = methodName;
-			this.argTypes = argTypes; 
-		}
-
-		public bool IsCompatibleWith( object[] args )
-		{
-			if ( args.Length != argTypes.Length )
-				return false;
-
-			for( int i = 0; i < args.Length; i++ )
-				if ( !argTypes[i].IsAssignableFrom( args[i].GetType() ) )
-					return false;
-
-			return true;
-		}
-
-		public static Type[] GetArgTypes( object[] args )
-		{
-			if ( args == null )
-				return new Type[0];
-
-			Type[] argTypes = new Type[args.Length];
-			for (int i = 0; i < argTypes.Length; ++i)
-			{
-				if (args[i] == null)
-					argTypes[i] = typeof(object);
-				else
-					argTypes[i] = args[i].GetType();
-			}
-
-			return argTypes;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks
+{
+	/// <summary>
+	/// Summary description for MockSignature.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MethodSignature
+	{
+		public readonly string typeName;
+		public readonly string methodName;
+		public readonly Type[] argTypes;
+
+		public MethodSignature( string typeName, string methodName, Type[] argTypes )
+		{
+			this.typeName = typeName;
+			this.methodName = methodName;
+			this.argTypes = argTypes; 
+		}
+
+		public bool IsCompatibleWith( object[] args )
+		{
+			if ( args.Length != argTypes.Length )
+				return false;
+
+			for( int i = 0; i < args.Length; i++ )
+				if ( !argTypes[i].IsAssignableFrom( args[i].GetType() ) )
+					return false;
+
+			return true;
+		}
+
+		public static Type[] GetArgTypes( object[] args )
+		{
+			if ( args == null )
+				return new Type[0];
+
+			Type[] argTypes = new Type[args.Length];
+			for (int i = 0; i < argTypes.Length; ++i)
+			{
+				if (args[i] == null)
+					argTypes[i] = typeof(object);
+				else
+					argTypes[i] = args[i].GetType();
+			}
+
+			return argTypes;
+		}
+	}
+}
diff --git a/src/NUnitMocks/mocks/Mock.cs b/src/NUnitMocks/mocks/Mock.cs
index 4b339c6..05fb254 100644
--- a/src/NUnitMocks/mocks/Mock.cs
+++ b/src/NUnitMocks/mocks/Mock.cs
@@ -1,164 +1,164 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Runtime.Remoting.Proxies;
-using System.Runtime.Remoting.Messaging;
-using NUnit.Framework;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// Summary description for MockObject.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public class Mock : IMock
-	{
-		#region Private Fields
-
-		private string name;
-
-		private bool strict;
-
-		private IDictionary methods = new Hashtable();
-
-		private Exception lastException;
-
-        private ArrayList unexpected = new ArrayList();
-
-		#endregion
-
-		#region Properties
-
-		public Exception LastException
-		{
-			get { return lastException; }
-		}
-
-		#endregion
-
-		#region Constructors
-
-		public Mock() : this( "Mock" ) { }
-
-		public Mock( string name )
-		{
-			this.name = name;
-		}
-
-		#endregion
-
-		#region IMock Members
-
-		public string Name
-		{
-			get { return name; }
-		}
-
-		public bool Strict
-		{
-			get { return strict; }
-			set { strict = value; }
-		}
-
-		public void Expect( string methodName, params object[] args )
-		{
-			ExpectAndReturn( methodName, null, args );
-		}
-
-		public void Expect( string methodName )
-		{
-			ExpectAndReturn( methodName, null, null );
-		}
-
-		public void ExpectNoCall( string methodName )
-		{
-			methods[methodName] = new MockMethod( methodName, null, 
-				new AssertionException("Unexpected call to method " + methodName) );
-		}
-
-		public void ExpectAndReturn( string methodName, object returnVal, params object[] args )
-		{
-			AddExpectedCall( methodName, returnVal, null, args );
-		}
-
-		public void ExpectAndThrow( string methodName, Exception exception, params object[] args )
-		{
-			AddExpectedCall( methodName, null, exception, args );
-		}
-
-		public void SetReturnValue( string methodName, object returnVal )
-		{
-			methods[methodName] = new MockMethod( methodName, returnVal );
-		}
-
-		#endregion
-
-		#region IVerify Members
-
-        public virtual void Verify()
-        {
-            foreach (IMethod method in methods.Values)
-                method.Verify();
-
-            if (unexpected.Count > 0)
-                Assert.Fail("Unexpected call to " + (string)unexpected[0]);
-        }
-
-		#endregion
-
-		#region ICallHandler Members
-
-		public virtual object Call( string methodName, params object[] args )
-		{
-			if ( methods.Contains( methodName ) )
-			{
-				try
-				{
-					IMethod method = (IMethod)methods[methodName];
-					return method.Call( args );
-				}
-				catch( Exception exception )
-				{
-					// Save exception in case MO is running on a separate thread
-					lastException = exception;
-					throw;
-				}
-			}
-			else // methodName is not listed in methods
-                if (Strict)
-                {
-                    unexpected.Add(methodName);
-                    Assert.Fail("Unexpected call to " + methodName);
-                }
-			
-			// not listed but Strict is not specified
-			return null;
-		}
-
-		#endregion
-	
-		#region Helper Methods
-
-		private void AddExpectedCall( string methodName, object returnVal, Exception exception, object[] args )
-		{
-			IMethod method = (IMethod)methods[methodName];
-			if ( method == null )
-			{
-				method = new MockMethod( methodName );
-				methods[methodName] = method;
-			}
-
-			Type[] argTypes = MethodSignature.GetArgTypes( args );
-			MethodSignature signature = new MethodSignature( this.Name, methodName, argTypes );
-
-			method.Expect( new MockCall( signature, returnVal, exception, args ) );
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Runtime.Remoting.Proxies;
+using System.Runtime.Remoting.Messaging;
+using NUnit.Framework;
+
+namespace NUnit.Mocks
+{
+	/// <summary>
+	/// Summary description for MockObject.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class Mock : IMock
+	{
+		#region Private Fields
+
+		private string name;
+
+		private bool strict;
+
+		private IDictionary methods = new Hashtable();
+
+		private Exception lastException;
+
+        private ArrayList unexpected = new ArrayList();
+
+		#endregion
+
+		#region Properties
+
+		public Exception LastException
+		{
+			get { return lastException; }
+		}
+
+		#endregion
+
+		#region Constructors
+
+		public Mock() : this( "Mock" ) { }
+
+		public Mock( string name )
+		{
+			this.name = name;
+		}
+
+		#endregion
+
+		#region IMock Members
+
+		public string Name
+		{
+			get { return name; }
+		}
+
+		public bool Strict
+		{
+			get { return strict; }
+			set { strict = value; }
+		}
+
+		public void Expect( string methodName, params object[] args )
+		{
+			ExpectAndReturn( methodName, null, args );
+		}
+
+		public void Expect( string methodName )
+		{
+			ExpectAndReturn( methodName, null, null );
+		}
+
+		public void ExpectNoCall( string methodName )
+		{
+			methods[methodName] = new MockMethod( methodName, null, 
+				new AssertionException("Unexpected call to method " + methodName) );
+		}
+
+		public void ExpectAndReturn( string methodName, object returnVal, params object[] args )
+		{
+			AddExpectedCall( methodName, returnVal, null, args );
+		}
+
+		public void ExpectAndThrow( string methodName, Exception exception, params object[] args )
+		{
+			AddExpectedCall( methodName, null, exception, args );
+		}
+
+		public void SetReturnValue( string methodName, object returnVal )
+		{
+			methods[methodName] = new MockMethod( methodName, returnVal );
+		}
+
+		#endregion
+
+		#region IVerify Members
+
+        public virtual void Verify()
+        {
+            foreach (IMethod method in methods.Values)
+                method.Verify();
+
+            if (unexpected.Count > 0)
+                Assert.Fail("Unexpected call to " + (string)unexpected[0]);
+        }
+
+		#endregion
+
+		#region ICallHandler Members
+
+		public virtual object Call( string methodName, params object[] args )
+		{
+			if ( methods.Contains( methodName ) )
+			{
+				try
+				{
+					IMethod method = (IMethod)methods[methodName];
+					return method.Call( args );
+				}
+				catch( Exception exception )
+				{
+					// Save exception in case MO is running on a separate thread
+					lastException = exception;
+					throw;
+				}
+			}
+			else // methodName is not listed in methods
+                if (Strict)
+                {
+                    unexpected.Add(methodName);
+                    Assert.Fail("Unexpected call to " + methodName);
+                }
+			
+			// not listed but Strict is not specified
+			return null;
+		}
+
+		#endregion
+	
+		#region Helper Methods
+
+		private void AddExpectedCall( string methodName, object returnVal, Exception exception, object[] args )
+		{
+			IMethod method = (IMethod)methods[methodName];
+			if ( method == null )
+			{
+				method = new MockMethod( methodName );
+				methods[methodName] = method;
+			}
+
+			Type[] argTypes = MethodSignature.GetArgTypes( args );
+			MethodSignature signature = new MethodSignature( this.Name, methodName, argTypes );
+
+			method.Expect( new MockCall( signature, returnVal, exception, args ) );
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitMocks/mocks/MockCall.cs b/src/NUnitMocks/mocks/MockCall.cs
index 8b1378a..b693dd1 100644
--- a/src/NUnitMocks/mocks/MockCall.cs
+++ b/src/NUnitMocks/mocks/MockCall.cs
@@ -1,55 +1,55 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-using NUnit.Framework.Constraints;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// Summary description for ExpectedCall.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public class MockCall : ICall
-	{
-		private MethodSignature signature;
-		private object returnVal;
-		private Exception exception;
-		private object[] expectedArgs;
-
-//		public static object[] Any = new object[0];
-
-		public MockCall( MethodSignature signature, object  returnVal, Exception exception, params object[] args )
-		{
-			this.signature = signature;
-			this.returnVal = returnVal;
-			this.exception = exception;
-			this.expectedArgs = args;
-		}
-
-		public object Call( object[] actualArgs )
-		{
-			if ( expectedArgs != null )
-			{
-				Assert.AreEqual( expectedArgs.Length, actualArgs.Length, "Invalid argument count in call to {0}", this.signature.methodName );
-
-				for( int i = 0; i < expectedArgs.Length; i++ )
-				{
-					if ( expectedArgs[i] is IResolveConstraint )
-						Assert.That( actualArgs[i], (IResolveConstraint)expectedArgs[i] );
-					else
-						Assert.AreEqual( expectedArgs[i], actualArgs[i] );
-				}
-			}
-			
-			if ( exception != null )
-				throw exception;
-
-			return returnVal;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+using NUnit.Framework.Constraints;
+
+namespace NUnit.Mocks
+{
+	/// <summary>
+	/// Summary description for ExpectedCall.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MockCall : ICall
+	{
+		private MethodSignature signature;
+		private object returnVal;
+		private Exception exception;
+		private object[] expectedArgs;
+
+//		public static object[] Any = new object[0];
+
+		public MockCall( MethodSignature signature, object  returnVal, Exception exception, params object[] args )
+		{
+			this.signature = signature;
+			this.returnVal = returnVal;
+			this.exception = exception;
+			this.expectedArgs = args;
+		}
+
+		public object Call( object[] actualArgs )
+		{
+			if ( expectedArgs != null )
+			{
+				Assert.AreEqual( expectedArgs.Length, actualArgs.Length, "Invalid argument count in call to {0}", this.signature.methodName );
+
+				for( int i = 0; i < expectedArgs.Length; i++ )
+				{
+					if ( expectedArgs[i] is IResolveConstraint )
+						Assert.That( actualArgs[i], (IResolveConstraint)expectedArgs[i] );
+					else
+						Assert.AreEqual( expectedArgs[i], actualArgs[i] );
+				}
+			}
+			
+			if ( exception != null )
+				throw exception;
+
+			return returnVal;
+		}
+	}
+}
diff --git a/src/NUnitMocks/mocks/MockInterfaceHandler.cs b/src/NUnitMocks/mocks/MockInterfaceHandler.cs
index 6426574..679686b 100644
--- a/src/NUnitMocks/mocks/MockInterfaceHandler.cs
+++ b/src/NUnitMocks/mocks/MockInterfaceHandler.cs
@@ -1,73 +1,73 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Runtime.Remoting.Proxies;
-using System.Runtime.Remoting.Messaging;
-using System.Reflection;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// Summary description for MockInterfaceHandler.
-	/// </summary>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public class MockInterfaceHandler : RealProxy
-	{
-		private ICallHandler callHandler;
-
-		public MockInterfaceHandler( Type type, ICallHandler callHandler ) : base( type ) 
-		{ 
-			this.callHandler = callHandler;
-		}
-
-		public override IMessage Invoke( IMessage msg )
-		{
-			IMethodCallMessage call = (IMethodCallMessage)msg;
-			IMethodReturnMessage result = null; 
-
-			if ( call != null )
-			{
-				try
-				{
-					object ret = callHandler.Call( call.MethodName, call.Args );
-
-					if ( ret == null )
-					{
-						MethodInfo info = call.MethodBase as MethodInfo;
-						Type returnType = info.ReturnType;
-
-						if( returnType == typeof( System.Boolean ) ) ret = false; 
-
-						if( returnType == typeof( System.Byte    ) ) ret = (System.Byte)0;
-						if( returnType == typeof( System.SByte   ) ) ret = (System.SByte)0;
-						if( returnType == typeof( System.Decimal ) ) ret = (System.Decimal)0;
-						if( returnType == typeof( System.Double  ) ) ret = (System.Double)0;
-						if( returnType == typeof( System.Single  ) ) ret = (System.Single)0;
-						if( returnType == typeof( System.Int32   ) ) ret = (System.Int32)0;
-						if( returnType == typeof( System.UInt32  ) ) ret = (System.UInt32)0;
-						if( returnType == typeof( System.Int64   ) ) ret = (System.Int64)0;
-						if( returnType == typeof( System.UInt64  ) ) ret = (System.UInt64)0;
-						if( returnType == typeof( System.Int16   ) ) ret = (System.Int16)0;
-						if( returnType == typeof( System.UInt16  ) ) ret = (System.UInt16)0;
-
-						if( returnType == typeof( System.Char	 ) ) ret = '?';
-					}
-
-					result = new ReturnMessage( ret, null, 0, null, call );
-				} 
-				catch( Exception e )
-				{
-					result = new ReturnMessage( e, call );
-				}
-			}
-
-			return result;
-		}
-	}
-}
-
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Runtime.Remoting.Proxies;
+using System.Runtime.Remoting.Messaging;
+using System.Reflection;
+
+namespace NUnit.Mocks
+{
+	/// <summary>
+	/// Summary description for MockInterfaceHandler.
+	/// </summary>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MockInterfaceHandler : RealProxy
+	{
+		private ICallHandler callHandler;
+
+		public MockInterfaceHandler( Type type, ICallHandler callHandler ) : base( type ) 
+		{ 
+			this.callHandler = callHandler;
+		}
+
+		public override IMessage Invoke( IMessage msg )
+		{
+			IMethodCallMessage call = (IMethodCallMessage)msg;
+			IMethodReturnMessage result = null; 
+
+			if ( call != null )
+			{
+				try
+				{
+					object ret = callHandler.Call( call.MethodName, call.Args );
+
+					if ( ret == null )
+					{
+						MethodInfo info = call.MethodBase as MethodInfo;
+						Type returnType = info.ReturnType;
+
+						if( returnType == typeof( System.Boolean ) ) ret = false; 
+
+						if( returnType == typeof( System.Byte    ) ) ret = (System.Byte)0;
+						if( returnType == typeof( System.SByte   ) ) ret = (System.SByte)0;
+						if( returnType == typeof( System.Decimal ) ) ret = (System.Decimal)0;
+						if( returnType == typeof( System.Double  ) ) ret = (System.Double)0;
+						if( returnType == typeof( System.Single  ) ) ret = (System.Single)0;
+						if( returnType == typeof( System.Int32   ) ) ret = (System.Int32)0;
+						if( returnType == typeof( System.UInt32  ) ) ret = (System.UInt32)0;
+						if( returnType == typeof( System.Int64   ) ) ret = (System.Int64)0;
+						if( returnType == typeof( System.UInt64  ) ) ret = (System.UInt64)0;
+						if( returnType == typeof( System.Int16   ) ) ret = (System.Int16)0;
+						if( returnType == typeof( System.UInt16  ) ) ret = (System.UInt16)0;
+
+						if( returnType == typeof( System.Char	 ) ) ret = '?';
+					}
+
+					result = new ReturnMessage( ret, null, 0, null, call );
+				} 
+				catch( Exception e )
+				{
+					result = new ReturnMessage( e, call );
+				}
+			}
+
+			return result;
+		}
+	}
+}
+
diff --git a/src/NUnitMocks/mocks/MockMethod.cs b/src/NUnitMocks/mocks/MockMethod.cs
index f828242..fd63ceb 100644
--- a/src/NUnitMocks/mocks/MockMethod.cs
+++ b/src/NUnitMocks/mocks/MockMethod.cs
@@ -1,120 +1,120 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-
-namespace NUnit.Mocks
-{
-	/// <summary>
-	/// The MockMethod object represents one named method on a mock object.
-	/// All overloads are represented by one MockMethod. A method may return
-	/// a fixed value, throw a fixed exception or have an expected sequence
-	/// 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>
-    [Obsolete("NUnit now uses NSubstitute")]
-    public class MockMethod : IMethod
-	{
-		#region Private Fields
-
-		/// <summary>
-		/// Name of this method
-		/// </summary>
-		private string methodName;
-		
-		/// <summary>
-		/// Fixed return value
-		/// </summary>
-		private object returnVal;
-		
-		/// <summary>
-		/// Exception to be thrown
-		/// </summary>
-		private Exception exception;
-
-		/// <summary>
-		/// Expected call sequence. If null, this method has no expectations
-		/// and simply provides a fixed return value or exception.
-		/// </summary>
-		private ArrayList expectedCalls = null;
-		
-		/// <summary>
-		/// Actual sequence of calls... currently not used
-		/// </summary>
-		//private ArrayList actualCalls = null;
-
-		#endregion
-
-		#region Constructors
-
-		public MockMethod( string methodName ) 
-			: this( methodName, null, null ) { }
-
-		public MockMethod( string methodName, object returnVal ) 
-			: this( methodName, returnVal, null ) { }
-
-		public MockMethod( string methodName, object returnVal, Exception exception )
-		{
-			this.methodName = methodName;
-			this.returnVal = returnVal;
-			this.exception = exception;
-		}
-
-		#endregion
-
-		#region IMethod Members
-
-		public string Name
-		{
-			get { return methodName; }
-		}
-
-		public void Expect( ICall call )
-		{
-			if ( expectedCalls == null )
-				expectedCalls = new ArrayList();
-
-			expectedCalls.Add( call );
-		}
-
-		#endregion
-
-		#region ICall Members
-
-		public object Call( object[] args )
-		{
-			if ( expectedCalls == null )
-			{
-				if ( exception != null )
-					throw exception;
-
-				return returnVal;
-			}
-			else
-			{
-				//actualCalls.Add( new MethodCall( methodName, null, null, args ) );
-				Assert.IsTrue( expectedCalls.Count > 0, "Too many calls to " + Name );
-				MockCall mockCall = (MockCall)expectedCalls[0];
-				expectedCalls.RemoveAt( 0 );
-				return mockCall.Call( args );
-			}
-		}
-
-		#endregion
-
-		#region IVerify Members
-
-		public void Verify()
-		{
-			if ( expectedCalls != null )
-				Assert.IsTrue( expectedCalls.Count == 0, "Not all methods were called" );
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+
+namespace NUnit.Mocks
+{
+	/// <summary>
+	/// The MockMethod object represents one named method on a mock object.
+	/// All overloads are represented by one MockMethod. A method may return
+	/// a fixed value, throw a fixed exception or have an expected sequence
+	/// 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>
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class MockMethod : IMethod
+	{
+		#region Private Fields
+
+		/// <summary>
+		/// Name of this method
+		/// </summary>
+		private string methodName;
+		
+		/// <summary>
+		/// Fixed return value
+		/// </summary>
+		private object returnVal;
+		
+		/// <summary>
+		/// Exception to be thrown
+		/// </summary>
+		private Exception exception;
+
+		/// <summary>
+		/// Expected call sequence. If null, this method has no expectations
+		/// and simply provides a fixed return value or exception.
+		/// </summary>
+		private ArrayList expectedCalls = null;
+		
+		/// <summary>
+		/// Actual sequence of calls... currently not used
+		/// </summary>
+		//private ArrayList actualCalls = null;
+
+		#endregion
+
+		#region Constructors
+
+		public MockMethod( string methodName ) 
+			: this( methodName, null, null ) { }
+
+		public MockMethod( string methodName, object returnVal ) 
+			: this( methodName, returnVal, null ) { }
+
+		public MockMethod( string methodName, object returnVal, Exception exception )
+		{
+			this.methodName = methodName;
+			this.returnVal = returnVal;
+			this.exception = exception;
+		}
+
+		#endregion
+
+		#region IMethod Members
+
+		public string Name
+		{
+			get { return methodName; }
+		}
+
+		public void Expect( ICall call )
+		{
+			if ( expectedCalls == null )
+				expectedCalls = new ArrayList();
+
+			expectedCalls.Add( call );
+		}
+
+		#endregion
+
+		#region ICall Members
+
+		public object Call( object[] args )
+		{
+			if ( expectedCalls == null )
+			{
+				if ( exception != null )
+					throw exception;
+
+				return returnVal;
+			}
+			else
+			{
+				//actualCalls.Add( new MethodCall( methodName, null, null, args ) );
+				Assert.IsTrue( expectedCalls.Count > 0, "Too many calls to " + Name );
+				MockCall mockCall = (MockCall)expectedCalls[0];
+				expectedCalls.RemoveAt( 0 );
+				return mockCall.Call( args );
+			}
+		}
+
+		#endregion
+
+		#region IVerify Members
+
+		public void Verify()
+		{
+			if ( expectedCalls != null )
+				Assert.IsTrue( expectedCalls.Count == 0, "Not all methods were called" );
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitMocks/mocks/nunit.mocks.build b/src/NUnitMocks/mocks/nunit.mocks.build
index f6ded90..829cd3d 100644
--- a/src/NUnitMocks/mocks/nunit.mocks.build
+++ b/src/NUnitMocks/mocks/nunit.mocks.build
@@ -1,46 +1,46 @@
-<?xml version="1.0"?>
-<project name="NUnitMocks" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="DynamicMock.cs"/>
-        <include name="ICall.cs"/>
-        <include name="ICallHandler.cs"/>
-        <include name="IMethod.cs"/>
-        <include name="IMock.cs"/>
-        <include name="IVerify.cs"/>
-        <include name="MethodSignature.cs"/>
-        <include name="Mock.cs"/>
-        <include name="MockCall.cs"/>
-        <include name="MockInterfaceHandler.cs"/>
-        <include name="MockMethod.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.framework.dir}/nunit.mocks.dll"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="1699" if="${runtime.version>='2.0'}"/>
-      </nowarn>
-      <references basedir="${current.framework.dir}">
-        <include name="nunit.framework.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitMocks/mocks">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit.mocks.csproj"/>
-        <include name="nunit.mocks.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitMocks" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="DynamicMock.cs"/>
+        <include name="ICall.cs"/>
+        <include name="ICallHandler.cs"/>
+        <include name="IMethod.cs"/>
+        <include name="IMock.cs"/>
+        <include name="IVerify.cs"/>
+        <include name="MethodSignature.cs"/>
+        <include name="Mock.cs"/>
+        <include name="MockCall.cs"/>
+        <include name="MockInterfaceHandler.cs"/>
+        <include name="MockMethod.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.framework.dir}/nunit.mocks.dll"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="1699" if="${runtime.version>='2.0'}"/>
+      </nowarn>
+      <references basedir="${current.framework.dir}">
+        <include name="nunit.framework.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitMocks/mocks">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.mocks.csproj"/>
+        <include name="nunit.mocks.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitMocks/mocks/nunit.mocks.csproj b/src/NUnitMocks/mocks/nunit.mocks.csproj
index d3112ff..aade4ad 100644
--- a/src/NUnitMocks/mocks/nunit.mocks.csproj
+++ b/src/NUnitMocks/mocks/nunit.mocks.csproj
@@ -1,105 +1,139 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.mocks</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Mocks</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>1699</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="DynamicMock.cs" />
-    <Compile Include="ICall.cs" />
-    <Compile Include="ICallHandler.cs" />
-    <Compile Include="IMethod.cs" />
-    <Compile Include="IMock.cs" />
-    <Compile Include="IVerify.cs" />
-    <Compile Include="MethodSignature.cs" />
-    <Compile Include="Mock.cs" />
-    <Compile Include="MockCall.cs" />
-    <Compile Include="MockInterfaceHandler.cs" />
-    <Compile Include="MockMethod.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.mocks.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.mocks</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Mocks</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\framework\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>1699</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="DynamicMock.cs" />
+    <Compile Include="ICall.cs" />
+    <Compile Include="ICallHandler.cs" />
+    <Compile Include="IMethod.cs" />
+    <Compile Include="IMock.cs" />
+    <Compile Include="IVerify.cs" />
+    <Compile Include="MethodSignature.cs" />
+    <Compile Include="Mock.cs" />
+    <Compile Include="MockCall.cs" />
+    <Compile Include="MockInterfaceHandler.cs" />
+    <Compile Include="MockMethod.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.mocks.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/mocks/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitMocks/mocks/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..5d5f77c
Binary files /dev/null and b/src/NUnitMocks/mocks/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.csproj.FileListAbsolute.txt b/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..703532f
--- /dev/null
+++ b/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\framework\nunit.mocks.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\framework\nunit.mocks.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitMocks\mocks\obj\Debug\nunit.mocks.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitMocks\mocks\obj\Debug\nunit.mocks.dll
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitMocks\mocks\obj\Debug\nunit.mocks.pdb
diff --git a/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.csprojResolveAssemblyReference.cache b/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..5304b8d
Binary files /dev/null and b/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.csprojResolveAssemblyReference.cache differ
diff --git a/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.pdb b/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.pdb
new file mode 100644
index 0000000..e9c4403
Binary files /dev/null and b/src/NUnitMocks/mocks/obj/Debug/nunit.mocks.pdb differ
diff --git a/src/NUnitMocks/tests/DynamicMockTests.cs b/src/NUnitMocks/tests/DynamicMockTests.cs
index 2d53431..04b23d7 100644
--- a/src/NUnitMocks/tests/DynamicMockTests.cs
+++ b/src/NUnitMocks/tests/DynamicMockTests.cs
@@ -1,181 +1,181 @@
-// ****************************************************************
-// Copyright 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.Mocks.Tests
-{
-	/// <summary>
-	/// Summary description for DynamicMockTests.
-	/// </summary>
-	[TestFixture]
-    [Obsolete("NUnit now uses NSubstitute")]
-    public class DynamicMockTests
-	{
-		private DynamicMock mock;
-		private IStuff instance;
-
-		[SetUp]
-		public void CreateMock()
-		{
-			mock = new DynamicMock( typeof( IStuff ) );
-			instance = (IStuff)mock.MockInstance;
-		}
-
-		[Test]
-		public void MockHasDefaultName()
-		{
-			Assert.AreEqual( "MockIStuff", mock.Name );
-		}
-
-		[Test]
-		public void MockHasNonDefaultName()
-		{
-			DynamicMock mock2 = new DynamicMock( "MyMock", typeof( IStuff ) );
-			Assert.AreEqual( "MyMock", mock2.Name );
-		}
-
-		[Test]
-		public void CallMethod()
-		{
-			instance.DoSomething();
-			mock.Verify();
-		}
-
-		[Test]
-		public void CallMethodWithArgs()
-		{
-			instance.DoSomething( "hello" );
-			mock.Verify();
-		}
-
-		[Test]
-		public void ExpectedMethod()
-		{
-			mock.Expect( "DoSomething" );
-			instance.DoSomething();
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof(AssertionException) )]
-		public void ExpectedMethodNotCalled()
-		{
-			mock.Expect( "DoSomething" );
-			mock.Verify();
-		}
-
-		[Test]
-		public void RefParameter()
-		{
-			int x = 7;
-			mock.Expect( "Increment" );
-			instance.Increment( ref x );
-			mock.Verify();
-		}
-
-		[Test]
-		public void MethodWithReturnValue()
-		{
-			mock.SetReturnValue( "GetInt", 5 );
-			Assert.AreEqual( 5, instance.GetInt() );
-			mock.Verify();
-		}
-
-		[Test]
-		public void DefaultReturnValues()
-		{
-			Assert.AreEqual( 0, instance.GetInt(), "int" );
-			Assert.AreEqual( 0, instance.GetSingle(), "float" );
-			Assert.AreEqual( 0, instance.GetDouble(), "double" );
-			Assert.AreEqual( 0, instance.GetDecimal(), "decimal" );
-			Assert.AreEqual( '?', instance.GetChar(), "char" );
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof(InvalidCastException) )]
-		public void WrongReturnType()
-		{
-			mock.SetReturnValue( "GetInt", "hello" );
-			instance.GetInt();
-			mock.Verify();
-		}
-
-		[Test]
-		public void OverrideMethodOnDynamicMock()
-		{
-			DynamicMock derivedMock = new DerivedMock();
-			IStuff derivedInstance = (IStuff)derivedMock.MockInstance;
-			Assert.AreEqual( 17, derivedInstance.Add( 5, 12 ) );
-			derivedMock.Verify();
-		}
-
-		[Test, ExpectedException( typeof(ArgumentException) )]
-		public void CreateMockForNonMBRClassFails()
-		{
-			DynamicMock classMock = new DynamicMock( typeof( NonMBRClass ) );
-			instance = classMock.MockInstance as IStuff;
-		}
-
-		[Test]
-		public void CreateMockForMBRClass()
-		{
-			DynamicMock classMock = new DynamicMock( typeof( MBRClass ) );
-			MBRClass classInstance = (MBRClass)classMock.MockInstance;
-			classMock.Expect( "SomeMethod" );
-			classMock.ExpectAndReturn( "AnotherMethod", "Hello World", 5, "hello" );
-			classMock.ExpectAndReturn( "MethodWithParams", 42, new object[] { new string[] { "the", "answer" } } );
-			classInstance.SomeMethod();
-			Assert.AreEqual( "Hello World", classInstance.AnotherMethod( 5, "hello" ) );
-			Assert.AreEqual( 42, classInstance.MethodWithParams( "the", "answer" ) );
-			classMock.Verify();
-		}
-
-		#region Test Interfaces and Classes
-
-		interface IStuff
-		{
-			void DoSomething();
-			void DoSomething( string greeting );
-			int GetInt();
-			float GetSingle();
-			double GetDouble();
-			decimal GetDecimal();
-			char GetChar();
-			int Add( int a, int b );
-			void Increment( ref int n );
-		}
-
-		class DerivedMock : DynamicMock
-		{
-			public DerivedMock() : base( "Derived", typeof( IStuff ) ) { }
-
-			public override object Call( string methodName, params object[] args )
-			{
-				switch( methodName )
-				{
-					case "Add":
-						return (int)args[0] + (int)args[1];
-					default:
-						return base.Call( methodName, args );
-				}
-			}
-		}
-
-		class NonMBRClass
-		{
-		}
-
-		class MBRClass : MarshalByRefObject
-		{
-			public void SomeMethod(){ }
-			public string AnotherMethod( int a, string b ) { return b + a.ToString(); }
-			public int MethodWithParams( params string[] args ) { return args.Length; }
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 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.Mocks.Tests
+{
+	/// <summary>
+	/// Summary description for DynamicMockTests.
+	/// </summary>
+	[TestFixture]
+    [Obsolete("NUnit now uses NSubstitute")]
+    public class DynamicMockTests
+	{
+		private DynamicMock mock;
+		private IStuff instance;
+
+		[SetUp]
+		public void CreateMock()
+		{
+			mock = new DynamicMock( typeof( IStuff ) );
+			instance = (IStuff)mock.MockInstance;
+		}
+
+		[Test]
+		public void MockHasDefaultName()
+		{
+			Assert.AreEqual( "MockIStuff", mock.Name );
+		}
+
+		[Test]
+		public void MockHasNonDefaultName()
+		{
+			DynamicMock mock2 = new DynamicMock( "MyMock", typeof( IStuff ) );
+			Assert.AreEqual( "MyMock", mock2.Name );
+		}
+
+		[Test]
+		public void CallMethod()
+		{
+			instance.DoSomething();
+			mock.Verify();
+		}
+
+		[Test]
+		public void CallMethodWithArgs()
+		{
+			instance.DoSomething( "hello" );
+			mock.Verify();
+		}
+
+		[Test]
+		public void ExpectedMethod()
+		{
+			mock.Expect( "DoSomething" );
+			instance.DoSomething();
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof(AssertionException) )]
+		public void ExpectedMethodNotCalled()
+		{
+			mock.Expect( "DoSomething" );
+			mock.Verify();
+		}
+
+		[Test]
+		public void RefParameter()
+		{
+			int x = 7;
+			mock.Expect( "Increment" );
+			instance.Increment( ref x );
+			mock.Verify();
+		}
+
+		[Test]
+		public void MethodWithReturnValue()
+		{
+			mock.SetReturnValue( "GetInt", 5 );
+			Assert.AreEqual( 5, instance.GetInt() );
+			mock.Verify();
+		}
+
+		[Test]
+		public void DefaultReturnValues()
+		{
+			Assert.AreEqual( 0, instance.GetInt(), "int" );
+			Assert.AreEqual( 0, instance.GetSingle(), "float" );
+			Assert.AreEqual( 0, instance.GetDouble(), "double" );
+			Assert.AreEqual( 0, instance.GetDecimal(), "decimal" );
+			Assert.AreEqual( '?', instance.GetChar(), "char" );
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof(InvalidCastException) )]
+		public void WrongReturnType()
+		{
+			mock.SetReturnValue( "GetInt", "hello" );
+			instance.GetInt();
+			mock.Verify();
+		}
+
+		[Test]
+		public void OverrideMethodOnDynamicMock()
+		{
+			DynamicMock derivedMock = new DerivedMock();
+			IStuff derivedInstance = (IStuff)derivedMock.MockInstance;
+			Assert.AreEqual( 17, derivedInstance.Add( 5, 12 ) );
+			derivedMock.Verify();
+		}
+
+		[Test, ExpectedException( typeof(ArgumentException) )]
+		public void CreateMockForNonMBRClassFails()
+		{
+			DynamicMock classMock = new DynamicMock( typeof( NonMBRClass ) );
+			instance = classMock.MockInstance as IStuff;
+		}
+
+		[Test]
+		public void CreateMockForMBRClass()
+		{
+			DynamicMock classMock = new DynamicMock( typeof( MBRClass ) );
+			MBRClass classInstance = (MBRClass)classMock.MockInstance;
+			classMock.Expect( "SomeMethod" );
+			classMock.ExpectAndReturn( "AnotherMethod", "Hello World", 5, "hello" );
+			classMock.ExpectAndReturn( "MethodWithParams", 42, new object[] { new string[] { "the", "answer" } } );
+			classInstance.SomeMethod();
+			Assert.AreEqual( "Hello World", classInstance.AnotherMethod( 5, "hello" ) );
+			Assert.AreEqual( 42, classInstance.MethodWithParams( "the", "answer" ) );
+			classMock.Verify();
+		}
+
+		#region Test Interfaces and Classes
+
+		interface IStuff
+		{
+			void DoSomething();
+			void DoSomething( string greeting );
+			int GetInt();
+			float GetSingle();
+			double GetDouble();
+			decimal GetDecimal();
+			char GetChar();
+			int Add( int a, int b );
+			void Increment( ref int n );
+		}
+
+		class DerivedMock : DynamicMock
+		{
+			public DerivedMock() : base( "Derived", typeof( IStuff ) ) { }
+
+			public override object Call( string methodName, params object[] args )
+			{
+				switch( methodName )
+				{
+					case "Add":
+						return (int)args[0] + (int)args[1];
+					default:
+						return base.Call( methodName, args );
+				}
+			}
+		}
+
+		class NonMBRClass
+		{
+		}
+
+		class MBRClass : MarshalByRefObject
+		{
+			public void SomeMethod(){ }
+			public string AnotherMethod( int a, string b ) { return b + a.ToString(); }
+			public int MethodWithParams( params string[] args ) { return args.Length; }
+		}
+
+		#endregion
+	}
+}
diff --git a/src/NUnitMocks/tests/MockTests.cs b/src/NUnitMocks/tests/MockTests.cs
index d9480ba..b24c066 100644
--- a/src/NUnitMocks/tests/MockTests.cs
+++ b/src/NUnitMocks/tests/MockTests.cs
@@ -1,343 +1,343 @@
-// ****************************************************************
-// Copyright 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.Mocks.Tests
-{
-	/// <summary>
-	/// Summary description for MockTests.
-	/// </summary>
-    [TestFixture]
-    [Obsolete("NUnit now uses NSubstitute")]
-	public class MockTests
-	{
-		private Mock mock;
-
-		[SetUp]
-		public void SetUp()
-		{
-			mock = new Mock( "MyMock" );
-		}
-
-		[Test]
-		public void MockHasName()
-		{
-			Assert.AreEqual( "MyMock", mock.Name );
-		}
-
-		[Test]
-		public void StrictDefaultsToFalse()
-		{
-			Assert.IsFalse( mock.Strict );
-		}
-
-		[Test]
-		public void VerifyNewMock()
-		{
-			mock.Verify();
-		}
-
-		[Test]
-		public void UnexpectedCallsIgnored()
-		{
-			mock.Call( "x" );
-			mock.Call( "y", 1, 2);
-			mock.Verify();
-		}
-
-		[Test]
-		public void OneExpectation()
-		{
-			mock.Expect( "x" );
-			mock.Call( "x" );
-			mock.Verify();
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void MethodNotCalled()
-		{
-			mock.Expect( "x" );
-			mock.Verify();
-		}
-
-		[Test]
-		public void MultipleExpectations()
-		{
-			mock.Expect( "x" );
-			mock.Expect( "y", "name" );
-			mock.Expect( "z", 1, 2, 3 );
-			mock.Call( "x" );
-			mock.Call( "y", "name" );
-			mock.Call( "z", 1, 2, 3 );
-			mock.Verify();
-		}
-
-		[Test]
-		public void MultipleCallsToSameMethod()
-		{
-			mock.Expect( "method" );
-			mock.Expect( "method" );
-			mock.Expect( "method" );
-			mock.Call( "method" );
-			mock.Call( "method" );
-			mock.Call( "method" );
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof(AssertionException) )]
-		public void TooManyCalls()
-		{
-			mock.Expect( "method" );
-			mock.Expect( "method" );
-			mock.Call( "method" );
-			mock.Call( "method" );
-			mock.Call( "method" );
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof(AssertionException) )]
-		public void NotEnoughCalls()
-		{
-			mock.Expect( "method" );
-			mock.Expect( "method" );
-			mock.Expect( "method" );
-			mock.Call( "method" );
-			mock.Call( "method" );
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void RequireArguments()
-		{
-			mock.Expect("myMethod", new object[0]);
-			mock.Call("myMethod", "world", null);
-			mock.Verify();
-		}
-
-		[Test]
-		public void IgnoreArguments()
-		{
-			mock.Expect("myMethod");
-			mock.Call("myMethod", "world", null);
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void FailWithParametersSpecified()
-		{
-			mock.Expect("myMethod", "junk");
-			mock.Call("myMethod", "world", null);
-			mock.Verify();
-		}
-
-		[Test] 
-		public void CallMultipleMethodsInDifferentOrder() 
-		{
-			mock.Expect("myMethod1");
-			mock.Expect("myMethod2");
-			mock.Expect("myMethod3");
-			mock.Call("myMethod3");
-			mock.Call("myMethod1");
-			mock.Call("myMethod2");
-			mock.Verify();
-		}
-
-		[Test] 
-		public void CallMultipleMethodsSomeWithoutExpectations() 
-		{
-			mock.Expect("myMethod1");
-			mock.Expect("myMethod3");
-			mock.Expect("myMethod3");
-
-			mock.Call("myMethod2");
-			mock.Call("myMethod3");
-			mock.Call("myMethod1");
-			mock.Call("myMethod3");
-			mock.Verify();
-		}
-
-		[Test] public void ExpectAndReturn() 
-		{
-			object something = new object();
-			mock.ExpectAndReturn("myMethod", something);
-			object result = mock.Call("myMethod");
-			mock.Verify();
-			Assert.AreSame(something, result);
-		}
-
-		[Test] public void ExpectAndReturnWithArgument() 
-		{
-			object something = new object();
-			mock.ExpectAndReturn("myMethod", something, "hello" );
-			object result = mock.Call("myMethod", "hello");
-			mock.Verify();
-			Assert.AreSame(something, result);
-		}
-
-		[Test, ExpectedException(typeof(AssertionException))]
-		public void ExpectAndReturnWithWrongArgument() 
-		{
-			object something = new object();
-			mock.ExpectAndReturn( "myMethod", something, "hello" );
-			object result = mock.Call("myMethod", "bye");
-			mock.Verify();
-			Assert.AreSame(something, result);
-		}
-	
-		[Test] 
-		public void MultipleExpectAndReturn() 
-		{
-			object something = new object();
-			object anotherthing = new object();
-			int x = 3;
-			mock.ExpectAndReturn("myMethod", something);
-			mock.ExpectAndReturn("myMethod", anotherthing);
-			mock.ExpectAndReturn("myMethod", x);
-			Assert.AreSame(something, mock.Call("myMethod"));
-			Assert.AreSame(anotherthing, mock.Call("myMethod"));
-			Assert.AreEqual(x, mock.Call("myMethod"));
-			mock.Verify();
-		}
-
-		[Test] 
-		public void ExpectAndReturnNull() 
-		{
-			mock.ExpectAndReturn("myMethod", null);
-			Assert.IsNull( mock.Call("myMethod") );
-			mock.Verify();
-		}
-
-		[Test]
-		public void SetReturnValue()
-		{
-			mock.SetReturnValue( "myMethod", 5 );
-			Assert.AreEqual( 5, mock.Call( "myMethod") );
-			mock.Verify();
-		}
-
-		[Test]
-		public void SetReturnValueRepeatedCalls()
-		{
-			mock.SetReturnValue( "myMethod", 5 );
-			Assert.AreEqual( 5, mock.Call( "myMethod") );
-			Assert.AreEqual( 5, mock.Call( "myMethod") );
-			Assert.AreEqual( 5, mock.Call( "myMethod") );
-			mock.Verify();
-		}
-
-		[Test]
-		public void SetReturnValueMultipleTimesOnMultipleMethods()
-		{
-			mock.SetReturnValue( "myMethod1", "something" );
-			mock.SetReturnValue( "myMethod2", "else" );
-			Assert.AreEqual( "something", mock.Call( "myMethod1") );
-			Assert.AreEqual( "something", mock.Call( "myMethod1") );
-			Assert.AreEqual( "else", mock.Call( "myMethod2") );
-			Assert.AreEqual( "something", mock.Call( "myMethod1") );
-			Assert.AreEqual( "else", mock.Call( "myMethod2") );
-			mock.SetReturnValue( "myMethod2", "magnificent" );
-			Assert.AreEqual( "something", mock.Call( "myMethod1") );
-			Assert.AreEqual( "magnificent", mock.Call( "myMethod2") );
-			mock.Verify();
-		}
-
-		[Test]
-		public void SetReturnValueWithoutCalling()
-		{
-			mock.SetReturnValue( "hello", "goodbye" );
-			mock.Verify();
-		}
-
-		[Test, ExpectedException( typeof( System.IO.IOException ) )] 
-		public void ExpectAndThrowException()
-		{
-			mock.ExpectAndThrow( "method", new System.IO.IOException() );
-			mock.Call( "method" );
-		}
-
-		[Test, ExpectedException( typeof( AssertionException ) )]
-		public void ExpectNoCallFails()
-		{
-			mock.ExpectNoCall( "myMethod" );
-			mock.Call( "myMethod" );
-		}
-
-		[Test]
-		public void ExpectNoCallSucceeds()
-		{
-			mock.ExpectNoCall( "myMethod" );
-			mock.Call("yourMethod");
-			mock.Verify();
-		}
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void StrictMode()
-        {
-            mock.Strict = true;
-            mock.Expect("method1");
-            mock.Expect("method2");
-            mock.Call("method1");
-            mock.Call("method2");
-            mock.Call("method3");
-        }
-
-        [Test, ExpectedException(typeof(AssertionException))]
-        public void StrictMode_ExceptionsCaught()
-        {
-            mock.Strict = true;
-            mock.Expect("method1");
-            mock.Expect("method2");
-            try
-            {
-                mock.Call("method1");
-                mock.Call("method2");
-                mock.Call("method3");
-            }
-            catch(Exception)
-            {}
-
-            mock.Verify();
-        }
-
-        [Test]
-		public void ChangeFixedReturnToExpectAndReturn()
-		{
-			mock.SetReturnValue( "MyMethod", "x" );
-			Assert.AreEqual( "x", mock.Call( "MyMethod" ) );
-			Assert.AreEqual( "x", mock.Call( "MyMethod", 1, 2, 3 ) );
-			mock.ExpectAndReturn( "MyMethod", "y", 1, 2, 3 );
-			Assert.AreEqual( "y", mock.Call( "MyMethod", 1, 2, 3 ) );
-			mock.Verify();
-		}
-
-		[Test]
-		public void ChangeExpectAndReturnToFixedReturn()
-		{
-			mock.ExpectAndReturn( "MyMethod", "y", 1, 2, 3 );
-			Assert.AreEqual( "y", mock.Call( "MyMethod", 1, 2, 3 ) );
-			mock.SetReturnValue( "MyMethod", "x" );
-			Assert.AreEqual( "x", mock.Call( "MyMethod" ) );
-			Assert.AreEqual( "x", mock.Call( "MyMethod", 1, 2, 3 ) );
-			mock.Verify();
-		}
-
-		[Test]
-		public void ConstraintArgumentSucceeds()
-		{
-			mock.Expect( "MyMethod", Is.GreaterThan(10) );
-			mock.Call( "MyMethod", 42 );
-		}
-
-		[Test,ExpectedException(typeof(AssertionException))]
-		public void ConstraintArgumentThatFails()
-		{
-			mock.Expect( "MyMethod", Is.GreaterThan(10) );
-			mock.Call( "MyMethod", 8 );
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.Mocks.Tests
+{
+	/// <summary>
+	/// Summary description for MockTests.
+	/// </summary>
+    [TestFixture]
+    [Obsolete("NUnit now uses NSubstitute")]
+	public class MockTests
+	{
+		private Mock mock;
+
+		[SetUp]
+		public void SetUp()
+		{
+			mock = new Mock( "MyMock" );
+		}
+
+		[Test]
+		public void MockHasName()
+		{
+			Assert.AreEqual( "MyMock", mock.Name );
+		}
+
+		[Test]
+		public void StrictDefaultsToFalse()
+		{
+			Assert.IsFalse( mock.Strict );
+		}
+
+		[Test]
+		public void VerifyNewMock()
+		{
+			mock.Verify();
+		}
+
+		[Test]
+		public void UnexpectedCallsIgnored()
+		{
+			mock.Call( "x" );
+			mock.Call( "y", 1, 2);
+			mock.Verify();
+		}
+
+		[Test]
+		public void OneExpectation()
+		{
+			mock.Expect( "x" );
+			mock.Call( "x" );
+			mock.Verify();
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void MethodNotCalled()
+		{
+			mock.Expect( "x" );
+			mock.Verify();
+		}
+
+		[Test]
+		public void MultipleExpectations()
+		{
+			mock.Expect( "x" );
+			mock.Expect( "y", "name" );
+			mock.Expect( "z", 1, 2, 3 );
+			mock.Call( "x" );
+			mock.Call( "y", "name" );
+			mock.Call( "z", 1, 2, 3 );
+			mock.Verify();
+		}
+
+		[Test]
+		public void MultipleCallsToSameMethod()
+		{
+			mock.Expect( "method" );
+			mock.Expect( "method" );
+			mock.Expect( "method" );
+			mock.Call( "method" );
+			mock.Call( "method" );
+			mock.Call( "method" );
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof(AssertionException) )]
+		public void TooManyCalls()
+		{
+			mock.Expect( "method" );
+			mock.Expect( "method" );
+			mock.Call( "method" );
+			mock.Call( "method" );
+			mock.Call( "method" );
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof(AssertionException) )]
+		public void NotEnoughCalls()
+		{
+			mock.Expect( "method" );
+			mock.Expect( "method" );
+			mock.Expect( "method" );
+			mock.Call( "method" );
+			mock.Call( "method" );
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ) )]
+		public void RequireArguments()
+		{
+			mock.Expect("myMethod", new object[0]);
+			mock.Call("myMethod", "world", null);
+			mock.Verify();
+		}
+
+		[Test]
+		public void IgnoreArguments()
+		{
+			mock.Expect("myMethod");
+			mock.Call("myMethod", "world", null);
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ) )]
+		public void FailWithParametersSpecified()
+		{
+			mock.Expect("myMethod", "junk");
+			mock.Call("myMethod", "world", null);
+			mock.Verify();
+		}
+
+		[Test] 
+		public void CallMultipleMethodsInDifferentOrder() 
+		{
+			mock.Expect("myMethod1");
+			mock.Expect("myMethod2");
+			mock.Expect("myMethod3");
+			mock.Call("myMethod3");
+			mock.Call("myMethod1");
+			mock.Call("myMethod2");
+			mock.Verify();
+		}
+
+		[Test] 
+		public void CallMultipleMethodsSomeWithoutExpectations() 
+		{
+			mock.Expect("myMethod1");
+			mock.Expect("myMethod3");
+			mock.Expect("myMethod3");
+
+			mock.Call("myMethod2");
+			mock.Call("myMethod3");
+			mock.Call("myMethod1");
+			mock.Call("myMethod3");
+			mock.Verify();
+		}
+
+		[Test] public void ExpectAndReturn() 
+		{
+			object something = new object();
+			mock.ExpectAndReturn("myMethod", something);
+			object result = mock.Call("myMethod");
+			mock.Verify();
+			Assert.AreSame(something, result);
+		}
+
+		[Test] public void ExpectAndReturnWithArgument() 
+		{
+			object something = new object();
+			mock.ExpectAndReturn("myMethod", something, "hello" );
+			object result = mock.Call("myMethod", "hello");
+			mock.Verify();
+			Assert.AreSame(something, result);
+		}
+
+		[Test, ExpectedException(typeof(AssertionException))]
+		public void ExpectAndReturnWithWrongArgument() 
+		{
+			object something = new object();
+			mock.ExpectAndReturn( "myMethod", something, "hello" );
+			object result = mock.Call("myMethod", "bye");
+			mock.Verify();
+			Assert.AreSame(something, result);
+		}
+	
+		[Test] 
+		public void MultipleExpectAndReturn() 
+		{
+			object something = new object();
+			object anotherthing = new object();
+			int x = 3;
+			mock.ExpectAndReturn("myMethod", something);
+			mock.ExpectAndReturn("myMethod", anotherthing);
+			mock.ExpectAndReturn("myMethod", x);
+			Assert.AreSame(something, mock.Call("myMethod"));
+			Assert.AreSame(anotherthing, mock.Call("myMethod"));
+			Assert.AreEqual(x, mock.Call("myMethod"));
+			mock.Verify();
+		}
+
+		[Test] 
+		public void ExpectAndReturnNull() 
+		{
+			mock.ExpectAndReturn("myMethod", null);
+			Assert.IsNull( mock.Call("myMethod") );
+			mock.Verify();
+		}
+
+		[Test]
+		public void SetReturnValue()
+		{
+			mock.SetReturnValue( "myMethod", 5 );
+			Assert.AreEqual( 5, mock.Call( "myMethod") );
+			mock.Verify();
+		}
+
+		[Test]
+		public void SetReturnValueRepeatedCalls()
+		{
+			mock.SetReturnValue( "myMethod", 5 );
+			Assert.AreEqual( 5, mock.Call( "myMethod") );
+			Assert.AreEqual( 5, mock.Call( "myMethod") );
+			Assert.AreEqual( 5, mock.Call( "myMethod") );
+			mock.Verify();
+		}
+
+		[Test]
+		public void SetReturnValueMultipleTimesOnMultipleMethods()
+		{
+			mock.SetReturnValue( "myMethod1", "something" );
+			mock.SetReturnValue( "myMethod2", "else" );
+			Assert.AreEqual( "something", mock.Call( "myMethod1") );
+			Assert.AreEqual( "something", mock.Call( "myMethod1") );
+			Assert.AreEqual( "else", mock.Call( "myMethod2") );
+			Assert.AreEqual( "something", mock.Call( "myMethod1") );
+			Assert.AreEqual( "else", mock.Call( "myMethod2") );
+			mock.SetReturnValue( "myMethod2", "magnificent" );
+			Assert.AreEqual( "something", mock.Call( "myMethod1") );
+			Assert.AreEqual( "magnificent", mock.Call( "myMethod2") );
+			mock.Verify();
+		}
+
+		[Test]
+		public void SetReturnValueWithoutCalling()
+		{
+			mock.SetReturnValue( "hello", "goodbye" );
+			mock.Verify();
+		}
+
+		[Test, ExpectedException( typeof( System.IO.IOException ) )] 
+		public void ExpectAndThrowException()
+		{
+			mock.ExpectAndThrow( "method", new System.IO.IOException() );
+			mock.Call( "method" );
+		}
+
+		[Test, ExpectedException( typeof( AssertionException ) )]
+		public void ExpectNoCallFails()
+		{
+			mock.ExpectNoCall( "myMethod" );
+			mock.Call( "myMethod" );
+		}
+
+		[Test]
+		public void ExpectNoCallSucceeds()
+		{
+			mock.ExpectNoCall( "myMethod" );
+			mock.Call("yourMethod");
+			mock.Verify();
+		}
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void StrictMode()
+        {
+            mock.Strict = true;
+            mock.Expect("method1");
+            mock.Expect("method2");
+            mock.Call("method1");
+            mock.Call("method2");
+            mock.Call("method3");
+        }
+
+        [Test, ExpectedException(typeof(AssertionException))]
+        public void StrictMode_ExceptionsCaught()
+        {
+            mock.Strict = true;
+            mock.Expect("method1");
+            mock.Expect("method2");
+            try
+            {
+                mock.Call("method1");
+                mock.Call("method2");
+                mock.Call("method3");
+            }
+            catch(Exception)
+            {}
+
+            mock.Verify();
+        }
+
+        [Test]
+		public void ChangeFixedReturnToExpectAndReturn()
+		{
+			mock.SetReturnValue( "MyMethod", "x" );
+			Assert.AreEqual( "x", mock.Call( "MyMethod" ) );
+			Assert.AreEqual( "x", mock.Call( "MyMethod", 1, 2, 3 ) );
+			mock.ExpectAndReturn( "MyMethod", "y", 1, 2, 3 );
+			Assert.AreEqual( "y", mock.Call( "MyMethod", 1, 2, 3 ) );
+			mock.Verify();
+		}
+
+		[Test]
+		public void ChangeExpectAndReturnToFixedReturn()
+		{
+			mock.ExpectAndReturn( "MyMethod", "y", 1, 2, 3 );
+			Assert.AreEqual( "y", mock.Call( "MyMethod", 1, 2, 3 ) );
+			mock.SetReturnValue( "MyMethod", "x" );
+			Assert.AreEqual( "x", mock.Call( "MyMethod" ) );
+			Assert.AreEqual( "x", mock.Call( "MyMethod", 1, 2, 3 ) );
+			mock.Verify();
+		}
+
+		[Test]
+		public void ConstraintArgumentSucceeds()
+		{
+			mock.Expect( "MyMethod", Is.GreaterThan(10) );
+			mock.Call( "MyMethod", 42 );
+		}
+
+		[Test,ExpectedException(typeof(AssertionException))]
+		public void ConstraintArgumentThatFails()
+		{
+			mock.Expect( "MyMethod", Is.GreaterThan(10) );
+			mock.Call( "MyMethod", 8 );
+		}
+	}
+}
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests.build b/src/NUnitMocks/tests/nunit.mocks.tests.build
index 08b2c61..ab8c7c8 100644
--- a/src/NUnitMocks/tests/nunit.mocks.tests.build
+++ b/src/NUnitMocks/tests/nunit.mocks.tests.build
@@ -1,35 +1,35 @@
-<?xml version="1.0"?>
-<project name="NUnit.Mocks.Tests" default="build" basedir=".">
-
-  <patternset id="source-files">
-    <include name="AssemblyInfo.cs"/>
-    <include name="DynamicMockTests.cs"/>
-    <include name="MockTests.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library"
-       output="${current.test.dir}/nunit.mocks.tests.dll" 
-       debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.framework.dir}">
-        <include name="nunit.framework.dll"/>
-        <include name="nunit.mocks.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitMocks/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="nunit.mocks.tests.csproj"/>
-        <include name="nunit.mocks.tests.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnit.Mocks.Tests" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="AssemblyInfo.cs"/>
+    <include name="DynamicMockTests.cs"/>
+    <include name="MockTests.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library"
+       output="${current.test.dir}/nunit.mocks.tests.dll" 
+       debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.framework.dir}">
+        <include name="nunit.framework.dll"/>
+        <include name="nunit.mocks.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitMocks/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="nunit.mocks.tests.csproj"/>
+        <include name="nunit.mocks.tests.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitMocks/tests/nunit.mocks.tests.csproj b/src/NUnitMocks/tests/nunit.mocks.tests.csproj
index f307b08..85d5957 100644
--- a/src/NUnitMocks/tests/nunit.mocks.tests.csproj
+++ b/src/NUnitMocks/tests/nunit.mocks.tests.csproj
@@ -1,97 +1,131 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8667C588-1A05-4773-A9E8-272EB302B8AB}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit.mocks.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Mocks.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\mocks\nunit.mocks.csproj">
-      <Name>nunit.mocks</Name>
-      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="DynamicMockTests.cs" />
-    <Compile Include="MockTests.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nunit.mocks.tests.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8667C588-1A05-4773-A9E8-272EB302B8AB}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit.mocks.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Mocks.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\mocks\nunit.mocks.csproj">
+      <Name>nunit.mocks</Name>
+      <Project>{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="DynamicMockTests.cs" />
+    <Compile Include="MockTests.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nunit.mocks.tests.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitMocks/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitMocks/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..1f4290e
Binary files /dev/null and b/src/NUnitMocks/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.csproj.FileListAbsolute.txt b/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..efd9dad
--- /dev/null
+++ b/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.mocks.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit.mocks.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitMocks\tests\obj\Debug\nunit.mocks.tests.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitMocks\tests\obj\Debug\nunit.mocks.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitMocks\tests\obj\Debug\nunit.mocks.tests.pdb
diff --git a/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.csprojResolveAssemblyReference.cache b/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..31d6353
Binary files /dev/null and b/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.pdb b/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.pdb
new file mode 100644
index 0000000..8db3ee4
Binary files /dev/null and b/src/NUnitMocks/tests/obj/Debug/nunit.mocks.tests.pdb differ
diff --git a/src/NUnitTestServer/nunit-agent-exe/App.config b/src/NUnitTestServer/nunit-agent-exe/App.config
index 43adb3b..de2caf6 100644
--- a/src/NUnitTestServer/nunit-agent-exe/App.config
+++ b/src/NUnitTestServer/nunit-agent-exe/App.config
@@ -1,37 +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>
-    <!-- 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>
-
-  </runtime>
-  
+<?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>
+    <!-- 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>
+
+  </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
index 39b42ca..1989d10 100644
--- a/src/NUnitTestServer/nunit-agent-exe/App.v1.config
+++ b/src/NUnitTestServer/nunit-agent-exe/App.v1.config
@@ -1,77 +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>
-  
+<?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/AssemblyInfo.cs b/src/NUnitTestServer/nunit-agent-exe/AssemblyInfo.cs
index a4dcd49..fb2bd78 100644
--- a/src/NUnitTestServer/nunit-agent-exe/AssemblyInfo.cs
+++ b/src/NUnitTestServer/nunit-agent-exe/AssemblyInfo.cs
@@ -1,11 +1,11 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Reflection;
-
-[assembly: AssemblyTitle("NUnit-Agent")]
-[assembly: AssemblyDescription("")]
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Reflection;
+
+[assembly: AssemblyTitle("NUnit-Agent")]
+[assembly: AssemblyDescription("")]
diff --git a/src/NUnitTestServer/nunit-agent-exe/Program.cs b/src/NUnitTestServer/nunit-agent-exe/Program.cs
index 8929632..e140802 100644
--- a/src/NUnitTestServer/nunit-agent-exe/Program.cs
+++ b/src/NUnitTestServer/nunit-agent-exe/Program.cs
@@ -1,122 +1,122 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using System.Runtime.Remoting.Services;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using System.Diagnostics;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.Agent
-{
-	/// <summary>
-	/// Summary description for Program.
-	/// </summary>
-	public class NUnitTestAgent
-	{
-		static Logger log = InternalTrace.GetLogger(typeof(NUnitTestAgent));
-
-        static Guid AgentId;
-        static string AgencyUrl;
-        static TestAgency Agency;
-
-        /// <summary>
-        /// Channel used for communications with the agency
-        /// and with clients
-        /// </summary>
-        static TcpChannel Channel;
-
-        /// <summary>
-		/// The main entry point for the application.
-		/// </summary>
-		[STAThread]
-		public static int Main(string[] args)
-		{
-            AgentId = new Guid(args[0]);
-            AgencyUrl = args[1];
-
-#if DEBUG
-            if ( args.Length > 2 && args[2] == "--pause" )
-                System.Windows.Forms.MessageBox.Show( "Attach debugger if desired, then press OK", "NUnit-Agent");
-#endif
-
-            // Create SettingsService early so we know the trace level right at the start
-            SettingsService settingsService = new SettingsService(false);
-            InternalTrace.Initialize("nunit-agent_%p.log", (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default));
-
-			log.Info("Agent process {0} starting", Process.GetCurrentProcess().Id);
-            log.Info("Running under version {0}, {1}", 
-                Environment.Version, 
-                RuntimeFramework.CurrentFramework.DisplayName);
-
-			// Add Standard Services to ServiceManager
-            log.Info("Adding Services");
-            ServiceManager.Services.AddService(settingsService);
-            ServiceManager.Services.AddService(new ProjectService());
-			ServiceManager.Services.AddService( new DomainManager() );
-			//ServiceManager.Services.AddService( new RecentFilesService() );
-			//ServiceManager.Services.AddService( new TestLoader() );
-			ServiceManager.Services.AddService( new AddinRegistry() );
-			ServiceManager.Services.AddService( new AddinManager() );
-
-			// Initialize Services
-            log.Info("Initializing Services");
-            ServiceManager.Services.InitializeServices();
-
-            Channel = ServerUtilities.GetTcpChannel();
-
-            log.Info("Connecting to TestAgency at {0}", AgencyUrl);
-            try
-            {
-                Agency = Activator.GetObject(typeof(TestAgency), AgencyUrl) as TestAgency;
-            }
-            catch (Exception ex)
-            {
-                log.Error("Unable to connect", ex);
-            }
-
-            if (Channel != null)
-            {
-                log.Info("Starting RemoteTestAgent");
-                RemoteTestAgent agent = new RemoteTestAgent(AgentId, Agency);
-
-                try
-                {
-                    if (agent.Start())
-                    {
-                        log.Debug("Waiting for stopSignal");
-                        agent.WaitForStop();
-                        log.Debug("Stop signal received");
-                    }
-                    else
-                        log.Error("Failed to start RemoteTestAgent");
-                }
-                catch (Exception ex)
-                {
-                    log.Error("Exception in RemoteTestAgent", ex);
-                }
-
-                log.Info("Unregistering Channel");
-                try
-                {
-                    ChannelServices.UnregisterChannel(Channel);
-                }
-                catch (Exception ex)
-                {
-                    log.Error("ChannelServices.UnregisterChannel threw an exception", ex);
-                }
-            }
-
-            log.Info("Stopping all services");
-            ServiceManager.Services.StopAllServices();
-            log.Info("Agent process {0} exiting", Process.GetCurrentProcess().Id);
-            InternalTrace.Close();
-
-			return 0;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using System.Runtime.Remoting.Services;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Diagnostics;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.Agent
+{
+	/// <summary>
+	/// Summary description for Program.
+	/// </summary>
+	public class NUnitTestAgent
+	{
+		static Logger log = InternalTrace.GetLogger(typeof(NUnitTestAgent));
+
+        static Guid AgentId;
+        static string AgencyUrl;
+        static TestAgency Agency;
+
+        /// <summary>
+        /// Channel used for communications with the agency
+        /// and with clients
+        /// </summary>
+        static TcpChannel Channel;
+
+        /// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		public static int Main(string[] args)
+		{
+            AgentId = new Guid(args[0]);
+            AgencyUrl = args[1];
+
+#if DEBUG
+            if (args.Length > 2 && args[2] == "--launch-debugger")
+                Debugger.Launch();
+#endif
+
+            // Create SettingsService early so we know the trace level right at the start
+            SettingsService settingsService = new SettingsService(false);
+            InternalTrace.Initialize("nunit-agent_%p.log", (InternalTraceLevel)settingsService.GetSetting("Options.InternalTraceLevel", InternalTraceLevel.Default));
+
+			log.Info("Agent process {0} starting", Process.GetCurrentProcess().Id);
+            log.Info("Running under version {0}, {1}", 
+                Environment.Version, 
+                RuntimeFramework.CurrentFramework.DisplayName);
+
+			// Add Standard Services to ServiceManager
+            log.Info("Adding Services");
+            ServiceManager.Services.AddService(settingsService);
+            ServiceManager.Services.AddService(new ProjectService());
+			ServiceManager.Services.AddService( new DomainManager() );
+			//ServiceManager.Services.AddService( new RecentFilesService() );
+			//ServiceManager.Services.AddService( new TestLoader() );
+			ServiceManager.Services.AddService( new AddinRegistry() );
+			ServiceManager.Services.AddService( new AddinManager() );
+
+			// Initialize Services
+            log.Info("Initializing Services");
+            ServiceManager.Services.InitializeServices();
+
+            Channel = ServerUtilities.GetTcpChannel();
+
+            log.Info("Connecting to TestAgency at {0}", AgencyUrl);
+            try
+            {
+                Agency = Activator.GetObject(typeof(TestAgency), AgencyUrl) as TestAgency;
+            }
+            catch (Exception ex)
+            {
+                log.Error("Unable to connect", ex);
+            }
+
+            if (Channel != null)
+            {
+                log.Info("Starting RemoteTestAgent");
+                RemoteTestAgent agent = new RemoteTestAgent(AgentId, Agency);
+
+                try
+                {
+                    if (agent.Start())
+                    {
+                        log.Debug("Waiting for stopSignal");
+                        agent.WaitForStop();
+                        log.Debug("Stop signal received");
+                    }
+                    else
+                        log.Error("Failed to start RemoteTestAgent");
+                }
+                catch (Exception ex)
+                {
+                    log.Error("Exception in RemoteTestAgent", ex);
+                }
+
+                log.Info("Unregistering Channel");
+                try
+                {
+                    ChannelServices.UnregisterChannel(Channel);
+                }
+                catch (Exception ex)
+                {
+                    log.Error("ChannelServices.UnregisterChannel threw an exception", ex);
+                }
+            }
+
+            log.Info("Stopping all services");
+            ServiceManager.Services.StopAllServices();
+            log.Info("Agent process {0} exiting", Process.GetCurrentProcess().Id);
+            InternalTrace.Close();
+
+			return 0;
+		}
+	}
+}
diff --git a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
index c06be3c..9f2b24f 100644
--- a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
+++ b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.build
@@ -1,66 +1,66 @@
-<?xml version="1.0"?>
-<project name="NUnitAgentExe" default="build" basedir=".">
-
-  <patternset id="source-files">
-    <include name="Program.cs"/>
-    <include name="AssemblyInfo.cs"/>
-  </patternset>
-
-  <target name="build">
-
-    <csc target="winexe" 
-        output="${current.build.dir}/nunit-agent.exe"
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.lib.dir}">
-        <include name="System.Runtime.Remoting.dll"/>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-      </references>
-    </csc>
-
-    <copy file="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="${runtime.version >= '2.0'}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references basedir="${current.lib.dir}">
-        <include name="System.Runtime.Remoting.dll"/>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="nunit.core.interfaces.dll"/>
-        <include name="nunit.core.dll"/>
-        <include name="nunit.util.dll"/>
-      </references>
-    </csc>
-
-    <copy file="App.config" if="${runtime.version >= '2.0'}"
-      tofile="${current.build.dir}/nunit-agent-x86.exe.config"/>
-
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/NUnitTestServer/nunit-agent-exe">
-      <fileset>
-        <patternset refid="source-files" />
-        <include name="App.config" />
-        <include name="App.v1.config" />
-        <include name="nunit-agent.exe.csproj"/>
-        <include name="nunit-agent.exe.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NUnitAgentExe" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="Program.cs"/>
+    <include name="AssemblyInfo.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="winexe" 
+        output="${current.build.dir}/nunit-agent.exe"
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="nunit.core.interfaces.dll"/>
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+      </references>
+    </csc>
+
+    <copy file="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="${runtime.version >= '2.0'}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references basedir="${current.lib.dir}">
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="nunit.core.interfaces.dll"/>
+        <include name="nunit.core.dll"/>
+        <include name="nunit.util.dll"/>
+      </references>
+    </csc>
+
+    <copy file="App.config" if="${runtime.version >= '2.0'}"
+      tofile="${current.build.dir}/nunit-agent-x86.exe.config"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/NUnitTestServer/nunit-agent-exe">
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="App.config" />
+        <include name="App.v1.config" />
+        <include name="nunit-agent.exe.csproj"/>
+        <include name="nunit-agent.exe.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
index 2a54e7a..60e0ab6 100644
--- a/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
+++ b/src/NUnitTestServer/nunit-agent-exe/nunit-agent.exe.csproj
@@ -1,114 +1,148 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{3E469CD9-FED2-4955-AE4C-669A74CA6767}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nunit-agent</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>WinExe</OutputType>
-    <RootNamespace>NUnit.Agent</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <NoWin32Manifest>true</NoWin32Manifest>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Drawing">
-      <Name>System.Drawing</Name>
-    </Reference>
-    <Reference Include="System.Runtime.Remoting" />
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </None>
-    <None Include="nunit-agent.exe.build" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="AssemblyInfo.cs" />
-    <Compile Include="Program.cs" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E469CD9-FED2-4955-AE4C-669A74CA6767}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nunit-agent</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>NUnit.Agent</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting" />
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="nunit-agent.exe.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs" />
+    <Compile Include="Program.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/NUnitTestServer/nunit-agent-exe/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..454e878
Binary files /dev/null and b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.exe.csproj.FileListAbsolute.txt b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.exe.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..69e3b34
--- /dev/null
+++ b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.exe.csproj.FileListAbsolute.txt
@@ -0,0 +1,7 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\App.config
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\nunit-agent.exe.config
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\nunit-agent.exe
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\nunit-agent.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitTestServer\nunit-agent-exe\obj\Debug\nunit-agent.exe
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitTestServer\nunit-agent-exe\obj\Debug\nunit-agent.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\NUnitTestServer\nunit-agent-exe\obj\Debug\nunit-agent.exe.csprojResolveAssemblyReference.cache
diff --git a/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.exe.csprojResolveAssemblyReference.cache b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.exe.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..eea74be
Binary files /dev/null and b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.exe.csprojResolveAssemblyReference.cache differ
diff --git a/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.pdb b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.pdb
new file mode 100644
index 0000000..cb913a9
Binary files /dev/null and b/src/NUnitTestServer/nunit-agent-exe/obj/Debug/nunit-agent.pdb differ
diff --git a/src/PNUnit/agent/AgentConfig.cs b/src/PNUnit/agent/AgentConfig.cs
index 4d15bae..e44a4ab 100644
--- a/src/PNUnit/agent/AgentConfig.cs
+++ b/src/PNUnit/agent/AgentConfig.cs
@@ -1,34 +1,34 @@
-using System;
-using System.IO;
-using System.Xml.Serialization;
-
-
-namespace PNUnit.Agent
-{
-    [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);
-            try
-            {
-                XmlSerializer ser= new XmlSerializer(typeof(AgentConfig));
-                return (AgentConfig)ser.Deserialize(reader);
-            }
-            finally
-            {
-                reader.Close();
-            }
-        }
-    }
-
-}
+using System;
+using System.IO;
+using System.Xml.Serialization;
+
+
+namespace PNUnit.Agent
+{
+    [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);
+            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 2da8776..c1516ef 100644
--- a/src/PNUnit/agent/App.config
+++ b/src/PNUnit/agent/App.config
@@ -1,77 +1,77 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-
-  <!-- Set the level for tracing NUnit itself -->
-  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
-  <system.diagnostics>
-	  <switches>
-      <add name="NTrace" value="0" />
-	  </switches>
-  </system.diagnostics>
-  
-  <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
-    <legacyUnhandledExceptionPolicy enabled="1" />
-
-    <!-- Look for addins in the addins directory for now -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <probing privatePath="framework;lib;addins"/>
-   </assemblyBinding>
-
-    <!--
-    The following <assemblyBinding> section allows running nunit under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0
-    on a machine with only the .NET version 1.0 runtime installed.
-    If application and its tests were built for .NET 1.1 you will
-    also need to redirect system assemblies in the test config file,
-    which controls loading of the tests.
-   -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-  
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
 </configuration>
\ No newline at end of file
diff --git a/src/PNUnit/agent/AssemblyInfo.cs b/src/PNUnit/agent/AssemblyInfo.cs
index 7e0ae00..dc85784 100644
--- a/src/PNUnit/agent/AssemblyInfo.cs
+++ b/src/PNUnit/agent/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// La informaci�n general de un ensamblado se controla mediante el siguiente 
-// conjunto de atributos. Cambie estos atributos para modificar la informaci�n
-// asociada con un ensamblado.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// La informaci�n de versi�n de un ensamblado consta de los siguientes cuatro valores:
-//
-//      Versi�n principal
-//      Versi�n secundaria 
-//      Versi�n de compilaci�n
-//      Revisi�n
-//
-// Puede especificar todos los valores o usar los valores predeterminados (n�mero de versi�n de compilaci�n y de revisi�n) 
-// usando el s�mbolo '*' como se muestra a continuaci�n:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentaci�n de 
-// Microsoft .NET Framework para obtener m�s informaci�n sobre la firma de ensamblados.
-//
-// Utilice los atributos siguientes para controlar qu� clave desea utilizar para firmar. 
-//
-// Notas: 
-//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
-//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
-//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
-//       una clave.
-//   (*) Si se especifican los valores KeyFile y KeyName, tendr� 
-//       lugar el siguiente proceso:
-//       (1) Si KeyName se puede encontrar en el CSP, se utilizar� dicha clave.
-//       (2) Si KeyName no existe pero s� KeyFile, se instalar� 
-//           y utilizar� la clave de KeyFile en el CSP.
-//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
-//       Cuando se especifica KeyFile, la ubicaci�n de KeyFile debe ser
-//       relativa al directorio de resultados del proyecto, que es
-//       %Directorio del proyecto%\obj\<configuraci�n>. Por ejemplo, si KeyFile
-//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
-//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Firma retardada es una opci�n avanzada; consulte la documentaci�n de
-//       Microsoft .NET Framework para obtener m�s informaci�n.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// La informaci�n general de un ensamblado se controla mediante el siguiente 
+// conjunto de atributos. Cambie estos atributos para modificar la informaci�n
+// asociada con un ensamblado.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// La informaci�n de versi�n de un ensamblado consta de los siguientes cuatro valores:
+//
+//      Versi�n principal
+//      Versi�n secundaria 
+//      Versi�n de compilaci�n
+//      Revisi�n
+//
+// Puede especificar todos los valores o usar los valores predeterminados (n�mero de versi�n de compilaci�n y de revisi�n) 
+// usando el s�mbolo '*' como se muestra a continuaci�n:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentaci�n de 
+// Microsoft .NET Framework para obtener m�s informaci�n sobre la firma de ensamblados.
+//
+// Utilice los atributos siguientes para controlar qu� clave desea utilizar para firmar. 
+//
+// Notas: 
+//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
+//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
+//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
+//       una clave.
+//   (*) Si se especifican los valores KeyFile y KeyName, tendr� 
+//       lugar el siguiente proceso:
+//       (1) Si KeyName se puede encontrar en el CSP, se utilizar� dicha clave.
+//       (2) Si KeyName no existe pero s� KeyFile, se instalar� 
+//           y utilizar� la clave de KeyFile en el CSP.
+//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
+//       Cuando se especifica KeyFile, la ubicaci�n de KeyFile debe ser
+//       relativa al directorio de resultados del proyecto, que es
+//       %Directorio del proyecto%\obj\<configuraci�n>. Por ejemplo, si KeyFile
+//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
+//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Firma retardada es una opci�n avanzada; consulte la documentaci�n de
+//       Microsoft .NET Framework para obtener m�s informaci�n.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/agent/PNUnitTestRunner.cs b/src/PNUnit/agent/PNUnitTestRunner.cs
index 4225347..4af3d27 100644
--- a/src/PNUnit/agent/PNUnitTestRunner.cs
+++ b/src/PNUnit/agent/PNUnitTestRunner.cs
@@ -1,544 +1,544 @@
-using System;
-using System.IO;
-using System.Threading;
-using System.Collections;
-using System.Collections.Specialized;
-using System.Diagnostics;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Reflection;
-using System.Resources;
-
-
-using PNUnit.Framework;
-
-using NUnit.Core;
-using NUnit.Util;
-
-using log4net;
-
-namespace PNUnit.Agent
-{
-    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;
-        }
-
-        public void Run()
-        {
-            log.Debug("Spawning a new thread");
-            Thread thread = new Thread(new ThreadStart(ThreadProc));
-            thread.Start();
-        }
-
-        private static Queue mFreeDomains = new Queue();
-
-        private void ThreadProc()
-        {
-            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/////////////////////////");
-
-                mPNUnitTestInfo.Services.NotifyResult(
-                    mPNUnitTestInfo.TestName, BuildResult(result, consoleAccess, mPNUnitTestInfo));
-
-                log.Debug("////////////////////////////////////////Results NOTIFIED/////////////////////////");
-                result = null;
-
-                ReleaseDomain(testDomain);
-            }
-        }
-
-        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);
-
-                        mPNUnitTestInfo.Services.NotifyResult(
-                            mPNUnitTestInfo.TestName, testResult);
-
-                        return null;
-                    }
-
-                    log.Debug("Test loaded, going to set CurrentDirectory");
-
-                    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
-                    = 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)
-        {
-            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)
-            {
-            }
-
-            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");
-                }
-
-
-                currentTestName = string.Empty;
-            }
-
-            public void TestStarted(TestMethod testCase)
-            {
-                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
-            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;
-        }
-
-    }
-}
+using System;
+using System.IO;
+using System.Threading;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Diagnostics;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Reflection;
+using System.Resources;
+
+
+using PNUnit.Framework;
+
+using NUnit.Core;
+using NUnit.Util;
+
+using log4net;
+
+namespace PNUnit.Agent
+{
+    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;
+        }
+
+        public void Run()
+        {
+            log.Debug("Spawning a new thread");
+            Thread thread = new Thread(new ThreadStart(ThreadProc));
+            thread.Start();
+        }
+
+        private static Queue mFreeDomains = new Queue();
+
+        private void ThreadProc()
+        {
+            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/////////////////////////");
+
+                mPNUnitTestInfo.Services.NotifyResult(
+                    mPNUnitTestInfo.TestName, BuildResult(result, consoleAccess, mPNUnitTestInfo));
+
+                log.Debug("////////////////////////////////////////Results NOTIFIED/////////////////////////");
+                result = null;
+
+                ReleaseDomain(testDomain);
+            }
+        }
+
+        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);
+
+                        mPNUnitTestInfo.Services.NotifyResult(
+                            mPNUnitTestInfo.TestName, testResult);
+
+                        return null;
+                    }
+
+                    log.Debug("Test loaded, going to set CurrentDirectory");
+
+                    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
+                    = 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)
+        {
+            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)
+            {
+            }
+
+            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");
+                }
+
+
+                currentTestName = string.Empty;
+            }
+
+            public void TestStarted(TestMethod testCase)
+            {
+                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
+            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 2da8776..c1516ef 100644
--- a/src/PNUnit/agent/Ship.config
+++ b/src/PNUnit/agent/Ship.config
@@ -1,77 +1,77 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-
-  <!-- Set the level for tracing NUnit itself -->
-  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
-  <system.diagnostics>
-	  <switches>
-      <add name="NTrace" value="0" />
-	  </switches>
-  </system.diagnostics>
-  
-  <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
-    <legacyUnhandledExceptionPolicy enabled="1" />
-
-    <!-- Look for addins in the addins directory for now -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <probing privatePath="framework;lib;addins"/>
-   </assemblyBinding>
-
-    <!--
-    The following <assemblyBinding> section allows running nunit under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0
-    on a machine with only the .NET version 1.0 runtime installed.
-    If application and its tests were built for .NET 1.1 you will
-    also need to redirect system assemblies in the test config file,
-    which controls loading of the tests.
-   -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-  
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
 </configuration>
\ No newline at end of file
diff --git a/src/PNUnit/agent/agent.cs b/src/PNUnit/agent/agent.cs
index 0791f61..22e255d 100644
--- a/src/PNUnit/agent/agent.cs
+++ b/src/PNUnit/agent/agent.cs
@@ -1,256 +1,256 @@
-using System;
-using System.IO;
-using System.Collections;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using System.Runtime.Serialization.Formatters;
-using System.Reflection;
-using System.Threading;
-
-using log4net;
-using log4net.Config;
-
-using PNUnit.Framework;
-
-using NUnit.Util;
-
-namespace PNUnit.Agent
-{
-    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());
-            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;
-            }
-
-            // 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);
-#endif
-            }
-            catch (Exception e)
-            {
-                log.InfoFormat("Can't register channel.\n{0}", e.Message);
-                return;
-            }
-        }
-
-        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;
-                    }
-                }
-            }
-
-            //RemotingServices.Disconnect(this);
-        }
-
-        private void FreeMemory()
-        {
-            GC.GetTotalMemory(true);
-        }
-    }
-
-}
+using System;
+using System.IO;
+using System.Collections;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Runtime.Serialization.Formatters;
+using System.Reflection;
+using System.Threading;
+
+using log4net;
+using log4net.Config;
+
+using PNUnit.Framework;
+
+using NUnit.Util;
+
+namespace PNUnit.Agent
+{
+    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());
+            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;
+            }
+
+            // 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);
+#endif
+            }
+            catch (Exception e)
+            {
+                log.InfoFormat("Can't register channel.\n{0}", e.Message);
+                return;
+            }
+        }
+
+        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;
+                    }
+                }
+            }
+
+            //RemotingServices.Disconnect(this);
+        }
+
+        private void FreeMemory()
+        {
+            GC.GetTotalMemory(true);
+        }
+    }
+
+}
diff --git a/src/PNUnit/agent/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/PNUnit/agent/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..650c6f9
Binary files /dev/null and b/src/PNUnit/agent/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/PNUnit/agent/obj/Debug/pnunit-agent.csproj.FileListAbsolute.txt b/src/PNUnit/agent/obj/Debug/pnunit-agent.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..e766246
--- /dev/null
+++ b/src/PNUnit/agent/obj/Debug/pnunit-agent.csproj.FileListAbsolute.txt
@@ -0,0 +1,6 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit-agent.exe.config
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit-agent.exe
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit-agent.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\agent\obj\Debug\pnunit-agent.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\agent\obj\Debug\pnunit-agent.exe
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\agent\obj\Debug\pnunit-agent.pdb
diff --git a/src/PNUnit/agent/obj/Debug/pnunit-agent.csprojResolveAssemblyReference.cache b/src/PNUnit/agent/obj/Debug/pnunit-agent.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..2231e07
Binary files /dev/null and b/src/PNUnit/agent/obj/Debug/pnunit-agent.csprojResolveAssemblyReference.cache differ
diff --git a/src/PNUnit/agent/obj/Debug/pnunit-agent.pdb b/src/PNUnit/agent/obj/Debug/pnunit-agent.pdb
new file mode 100644
index 0000000..09d315b
Binary files /dev/null and b/src/PNUnit/agent/obj/Debug/pnunit-agent.pdb differ
diff --git a/src/PNUnit/agent/pnunit-agent.build b/src/PNUnit/agent/pnunit-agent.build
index 89a0796..c674d91 100644
--- a/src/PNUnit/agent/pnunit-agent.build
+++ b/src/PNUnit/agent/pnunit-agent.build
@@ -1,48 +1,48 @@
-<?xml version="1.0"?>
-<project name="PNUnitAgent" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="agent.cs"/>
-        <include name="AgentConfig.cs"/>
-        <include name="AssemblyInfo.cs"/>
-        <include name="PNUnitTestRunner.cs"/>
-  </patternset>
-
-  <target name="build">
-
-    <csc target="exe"
-        output="${current.build.dir}/pnunit-agent.exe"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources basedir=".">
-        <patternset refid="source-files"/>
-      </sources>
-      <references>
-        <include name="System.Runtime.Remoting.dll"/>
-	<include name="${current.framework.dir}/pnunit.framework.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-        <include name="${current.lib.dir}/log4net.dll"/>
-      </references>
-    </csc>
-
-    <copy file="Ship.config"
-      tofile="${current.build.dir}/pnunit-agent.exe.config"/>
-
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/PNUnit/agent">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="App.ico"/>
-        <include name="App.config"/>
-        <include name="Ship.config"/>
-        <include name="pnunit-agent.csproj"/>
-        <include name="pnunit-agent.build"/>
-      </fileset>
-    </copy>
-  </target>
-
-</project>
+<?xml version="1.0"?>
+<project name="PNUnitAgent" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="agent.cs"/>
+        <include name="AgentConfig.cs"/>
+        <include name="AssemblyInfo.cs"/>
+        <include name="PNUnitTestRunner.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="exe"
+        output="${current.build.dir}/pnunit-agent.exe"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="System.Runtime.Remoting.dll"/>
+	<include name="${current.framework.dir}/pnunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+        <include name="${current.lib.dir}/log4net.dll"/>
+      </references>
+    </csc>
+
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/pnunit-agent.exe.config"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/agent">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+        <include name="pnunit-agent.csproj"/>
+        <include name="pnunit-agent.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
diff --git a/src/PNUnit/agent/pnunit-agent.csproj b/src/PNUnit/agent/pnunit-agent.csproj
index 0af35b8..eddb59f 100644
--- a/src/PNUnit/agent/pnunit-agent.csproj
+++ b/src/PNUnit/agent/pnunit-agent.csproj
@@ -1,128 +1,162 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <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>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Exe</OutputType>
-    <RootNamespace>agent</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>0.0</OldToolsVersion>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <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;CLR_2_0,NET_2_0,CS_3_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\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Runtime.Remoting" />
-    <Reference Include="System.Xml" />
-    <Reference Include="log4net">
-      <HintPath>..\..\..\lib\log4net.dll</HintPath>
-    </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">
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Name>nunit.util.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Name>nunit.core.interfaces.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
-      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
-      <Name>pnunit.framework</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="App.config" />
-    <None Include="pnunit-agent.build" />
-    <None Include="Ship.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <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>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>agent</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <SccAuxPath>
+    </SccAuxPath>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <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>
+  </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">
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Name>nunit.util.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
+      <Name>pnunit.framework</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="pnunit-agent.build" />
+    <None Include="Ship.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/PNUnit/launcher/App.config b/src/PNUnit/launcher/App.config
index 2da8776..c1516ef 100644
--- a/src/PNUnit/launcher/App.config
+++ b/src/PNUnit/launcher/App.config
@@ -1,77 +1,77 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-
-  <!-- Set the level for tracing NUnit itself -->
-  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
-  <system.diagnostics>
-	  <switches>
-      <add name="NTrace" value="0" />
-	  </switches>
-  </system.diagnostics>
-  
-  <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
-    <legacyUnhandledExceptionPolicy enabled="1" />
-
-    <!-- Look for addins in the addins directory for now -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <probing privatePath="framework;lib;addins"/>
-   </assemblyBinding>
-
-    <!--
-    The following <assemblyBinding> section allows running nunit under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0
-    on a machine with only the .NET version 1.0 runtime installed.
-    If application and its tests were built for .NET 1.1 you will
-    also need to redirect system assemblies in the test config file,
-    which controls loading of the tests.
-   -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-  
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
 </configuration>
\ No newline at end of file
diff --git a/src/PNUnit/launcher/AssemblyInfo.cs b/src/PNUnit/launcher/AssemblyInfo.cs
index 7e0ae00..dc85784 100644
--- a/src/PNUnit/launcher/AssemblyInfo.cs
+++ b/src/PNUnit/launcher/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// La informaci�n general de un ensamblado se controla mediante el siguiente 
-// conjunto de atributos. Cambie estos atributos para modificar la informaci�n
-// asociada con un ensamblado.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// La informaci�n de versi�n de un ensamblado consta de los siguientes cuatro valores:
-//
-//      Versi�n principal
-//      Versi�n secundaria 
-//      Versi�n de compilaci�n
-//      Revisi�n
-//
-// Puede especificar todos los valores o usar los valores predeterminados (n�mero de versi�n de compilaci�n y de revisi�n) 
-// usando el s�mbolo '*' como se muestra a continuaci�n:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentaci�n de 
-// Microsoft .NET Framework para obtener m�s informaci�n sobre la firma de ensamblados.
-//
-// Utilice los atributos siguientes para controlar qu� clave desea utilizar para firmar. 
-//
-// Notas: 
-//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
-//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
-//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
-//       una clave.
-//   (*) Si se especifican los valores KeyFile y KeyName, tendr� 
-//       lugar el siguiente proceso:
-//       (1) Si KeyName se puede encontrar en el CSP, se utilizar� dicha clave.
-//       (2) Si KeyName no existe pero s� KeyFile, se instalar� 
-//           y utilizar� la clave de KeyFile en el CSP.
-//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
-//       Cuando se especifica KeyFile, la ubicaci�n de KeyFile debe ser
-//       relativa al directorio de resultados del proyecto, que es
-//       %Directorio del proyecto%\obj\<configuraci�n>. Por ejemplo, si KeyFile
-//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
-//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Firma retardada es una opci�n avanzada; consulte la documentaci�n de
-//       Microsoft .NET Framework para obtener m�s informaci�n.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// La informaci�n general de un ensamblado se controla mediante el siguiente 
+// conjunto de atributos. Cambie estos atributos para modificar la informaci�n
+// asociada con un ensamblado.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// La informaci�n de versi�n de un ensamblado consta de los siguientes cuatro valores:
+//
+//      Versi�n principal
+//      Versi�n secundaria 
+//      Versi�n de compilaci�n
+//      Revisi�n
+//
+// Puede especificar todos los valores o usar los valores predeterminados (n�mero de versi�n de compilaci�n y de revisi�n) 
+// usando el s�mbolo '*' como se muestra a continuaci�n:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentaci�n de 
+// Microsoft .NET Framework para obtener m�s informaci�n sobre la firma de ensamblados.
+//
+// Utilice los atributos siguientes para controlar qu� clave desea utilizar para firmar. 
+//
+// Notas: 
+//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
+//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
+//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
+//       una clave.
+//   (*) Si se especifican los valores KeyFile y KeyName, tendr� 
+//       lugar el siguiente proceso:
+//       (1) Si KeyName se puede encontrar en el CSP, se utilizar� dicha clave.
+//       (2) Si KeyName no existe pero s� KeyFile, se instalar� 
+//           y utilizar� la clave de KeyFile en el CSP.
+//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
+//       Cuando se especifica KeyFile, la ubicaci�n de KeyFile debe ser
+//       relativa al directorio de resultados del proyecto, que es
+//       %Directorio del proyecto%\obj\<configuraci�n>. Por ejemplo, si KeyFile
+//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
+//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Firma retardada es una opci�n avanzada; consulte la documentaci�n de
+//       Microsoft .NET Framework para obtener m�s informaci�n.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/launcher/Barrier.cs b/src/PNUnit/launcher/Barrier.cs
index 42e4571..b81f355 100644
--- a/src/PNUnit/launcher/Barrier.cs
+++ b/src/PNUnit/launcher/Barrier.cs
@@ -1,59 +1,59 @@
-using System;
-using System.Threading;
-
-namespace PNUnit.Launcher
-{
-    public class Barrier
-    {
-        public int mCount;
-        public int mMaxCount;
-        private Object mLock = new Object();
-        private string mName;
-
-        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 )
-                {
-                    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);
-                }
-            }
-        }
-    }
-}
+using System;
+using System.Threading;
+
+namespace PNUnit.Launcher
+{
+    public class Barrier
+    {
+        public int mCount;
+        public int mMaxCount;
+        private Object mLock = new Object();
+        private string mName;
+
+        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 )
+                {
+                    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
index 202f6da..42c2853 100644
--- a/src/PNUnit/launcher/MessageQueue.cs
+++ b/src/PNUnit/launcher/MessageQueue.cs
@@ -1,185 +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);
-                }
-            }
-        }
-    }    
-}
+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 75e0aa5..2424139 100644
--- a/src/PNUnit/launcher/Runner.cs
+++ b/src/PNUnit/launcher/Runner.cs
@@ -1,361 +1,361 @@
-using System;
-using System.Collections;
-using System.Threading;
-
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Lifetime;
-
-using log4net;
-
-using NUnit.Core;
-
-using PNUnit.Framework;
-
-namespace PNUnit.Launcher
-{
-    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
-    }
-}
+using System;
+using System.Collections;
+using System.Threading;
+
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Lifetime;
+
+using log4net;
+
+using NUnit.Core;
+
+using PNUnit.Framework;
+
+namespace PNUnit.Launcher
+{
+    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 2da8776..c1516ef 100644
--- a/src/PNUnit/launcher/Ship.config
+++ b/src/PNUnit/launcher/Ship.config
@@ -1,77 +1,77 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-
-  <!-- Set the level for tracing NUnit itself -->
-  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
-  <system.diagnostics>
-	  <switches>
-      <add name="NTrace" value="0" />
-	  </switches>
-  </system.diagnostics>
-  
-  <runtime>
-    <!-- We need this so test exceptions don't crash NUnit -->
-    <legacyUnhandledExceptionPolicy enabled="1" />
-
-    <!-- Look for addins in the addins directory for now -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <probing privatePath="framework;lib;addins"/>
-   </assemblyBinding>
-
-    <!--
-    The following <assemblyBinding> section allows running nunit under 
-    .NET 1.0 by redirecting assemblies. The appliesTo attribute
-    causes the section to be ignored except under .NET 1.0
-    on a machine with only the .NET version 1.0 runtime installed.
-    If application and its tests were built for .NET 1.1 you will
-    also need to redirect system assemblies in the test config file,
-    which controls loading of the tests.
-   -->
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
-			appliesTo="v1.0.3705">
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Data" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Drawing" 
-                          publicKeyToken="b03f5f7f11d50a3a" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Windows.Forms" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-      <dependentAssembly> 
-        <assemblyIdentity name="System.Xml" 
-                          publicKeyToken="b77a5c561934e089" 
-                          culture="neutral"/>
-        <bindingRedirect  oldVersion="1.0.5000.0" 
-                          newVersion="1.0.3300.0"/>
-      </dependentAssembly>
-
-    </assemblyBinding>
-  
-  </runtime>
-  
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+
+  <!-- Set the level for tracing NUnit itself -->
+  <!-- 0=Off 1=Error 2=Warning 3=Info 4=Debug -->
+  <system.diagnostics>
+	  <switches>
+      <add name="NTrace" value="0" />
+	  </switches>
+  </system.diagnostics>
+  
+  <runtime>
+    <!-- We need this so test exceptions don't crash NUnit -->
+    <legacyUnhandledExceptionPolicy enabled="1" />
+
+    <!-- Look for addins in the addins directory for now -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <probing privatePath="framework;lib;addins"/>
+   </assemblyBinding>
+
+    <!--
+    The following <assemblyBinding> section allows running nunit under 
+    .NET 1.0 by redirecting assemblies. The appliesTo attribute
+    causes the section to be ignored except under .NET 1.0
+    on a machine with only the .NET version 1.0 runtime installed.
+    If application and its tests were built for .NET 1.1 you will
+    also need to redirect system assemblies in the test config file,
+    which controls loading of the tests.
+   -->
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
+			appliesTo="v1.0.3705">
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Data" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Drawing" 
+                          publicKeyToken="b03f5f7f11d50a3a" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Windows.Forms" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+      <dependentAssembly> 
+        <assemblyIdentity name="System.Xml" 
+                          publicKeyToken="b77a5c561934e089" 
+                          culture="neutral"/>
+        <bindingRedirect  oldVersion="1.0.5000.0" 
+                          newVersion="1.0.3300.0"/>
+      </dependentAssembly>
+
+    </assemblyBinding>
+  
+  </runtime>
+  
 </configuration>
\ No newline at end of file
diff --git a/src/PNUnit/launcher/TestConf.cs b/src/PNUnit/launcher/TestConf.cs
index 78a5723..d8508c1 100644
--- a/src/PNUnit/launcher/TestConf.cs
+++ b/src/PNUnit/launcher/TestConf.cs
@@ -1,207 +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 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[];
-        }
-    }
-
-}
+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 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 7e42e41..90b4240 100644
--- a/src/PNUnit/launcher/launcher.cs
+++ b/src/PNUnit/launcher/launcher.cs
@@ -1,550 +1,550 @@
-using System;
-using System.Collections;
-using System.IO;
-using System.Runtime.Remoting;
-using System.Runtime.Remoting.Channels;
-using System.Runtime.Remoting.Channels.Tcp;
-using System.Runtime.Serialization.Formatters;
-
-using NUnit.Core;
-
-using PNUnit.Framework;
-
-using log4net;
-using log4net.Config;
-
-
-namespace PNUnit.Launcher
-{
-    class Launcher
-    {
-        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);
-#endif
-        }
-
-
-        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);
-
-                    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;
-        }
-    }
+using System;
+using System.Collections;
+using System.IO;
+using System.Runtime.Remoting;
+using System.Runtime.Remoting.Channels;
+using System.Runtime.Remoting.Channels.Tcp;
+using System.Runtime.Serialization.Formatters;
+
+using NUnit.Core;
+
+using PNUnit.Framework;
+
+using log4net;
+using log4net.Config;
+
+
+namespace PNUnit.Launcher
+{
+    class Launcher
+    {
+        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);
+#endif
+        }
+
+
+        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);
+
+                    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/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/PNUnit/launcher/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..88bd55f
Binary files /dev/null and b/src/PNUnit/launcher/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/PNUnit/launcher/obj/Debug/pnunit-launcher.csproj.FileListAbsolute.txt b/src/PNUnit/launcher/obj/Debug/pnunit-launcher.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..1373356
--- /dev/null
+++ b/src/PNUnit/launcher/obj/Debug/pnunit-launcher.csproj.FileListAbsolute.txt
@@ -0,0 +1,6 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit-launcher.exe.config
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit-launcher.exe
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit-launcher.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\launcher\obj\Debug\pnunit-launcher.exe
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\launcher\obj\Debug\pnunit-launcher.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\launcher\obj\Debug\pnunit-launcher.csprojResolveAssemblyReference.cache
diff --git a/src/PNUnit/launcher/obj/Debug/pnunit-launcher.csprojResolveAssemblyReference.cache b/src/PNUnit/launcher/obj/Debug/pnunit-launcher.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..4ed0881
Binary files /dev/null and b/src/PNUnit/launcher/obj/Debug/pnunit-launcher.csprojResolveAssemblyReference.cache differ
diff --git a/src/PNUnit/launcher/obj/Debug/pnunit-launcher.pdb b/src/PNUnit/launcher/obj/Debug/pnunit-launcher.pdb
new file mode 100644
index 0000000..145c32a
Binary files /dev/null and b/src/PNUnit/launcher/obj/Debug/pnunit-launcher.pdb differ
diff --git a/src/PNUnit/launcher/pnunit-launcher.build b/src/PNUnit/launcher/pnunit-launcher.build
index 91305fa..7a9b231 100644
--- a/src/PNUnit/launcher/pnunit-launcher.build
+++ b/src/PNUnit/launcher/pnunit-launcher.build
@@ -1,48 +1,48 @@
-<?xml version="1.0"?>
-<project name="PNUnitLauncher" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="Barrier.cs"/>
-        <include name="launcher.cs"/>
-	<include name="MessageQueue.cs"/>
-        <include name="Runner.cs"/>
-        <include name="TestConf.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="exe"
-        output="${current.build.dir}/pnunit-launcher.exe"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources basedir=".">
-        <patternset refid="source-files"/>
-      </sources>
-      <references>
-        <include name="System.Runtime.Remoting.dll"/>
-        <include name="${current.framework.dir}/pnunit.framework.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/log4net.dll"/>
-      </references>
-    </csc>
-
-    <copy file="Ship.config"
-      tofile="${current.build.dir}/pnunit-launcher.exe.config"/>
-
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/PNUnit/launcher">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="App.ico"/>
-        <include name="App.config"/>
-        <include name="Ship.config"/>
-        <include name="pnunit-launcher.csproj"/>
-        <include name="pnunit-launcher.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="PNUnitLauncher" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Barrier.cs"/>
+        <include name="launcher.cs"/>
+	<include name="MessageQueue.cs"/>
+        <include name="Runner.cs"/>
+        <include name="TestConf.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="exe"
+        output="${current.build.dir}/pnunit-launcher.exe"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="System.Runtime.Remoting.dll"/>
+        <include name="${current.framework.dir}/pnunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/log4net.dll"/>
+      </references>
+    </csc>
+
+    <copy file="Ship.config"
+      tofile="${current.build.dir}/pnunit-launcher.exe.config"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/launcher">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="App.ico"/>
+        <include name="App.config"/>
+        <include name="Ship.config"/>
+        <include name="pnunit-launcher.csproj"/>
+        <include name="pnunit-launcher.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/PNUnit/launcher/pnunit-launcher.csproj b/src/PNUnit/launcher/pnunit-launcher.csproj
index 6605834..fe76c1e 100644
--- a/src/PNUnit/launcher/pnunit-launcher.csproj
+++ b/src/PNUnit/launcher/pnunit-launcher.csproj
@@ -1,130 +1,164 @@
-<?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.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <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>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Exe</OutputType>
-    <RootNamespace>launcher</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>0.0</OldToolsVersion>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <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;CLR_2_0,NET_2_0,CS_3_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\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <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">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Name>nunit.core.interfaces.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
-      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
-      <Name>pnunit.framework</Name>
-    </ProjectReference>
-    <Reference Include="log4net">
-      <HintPath>..\..\..\lib\log4net.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <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>
-    <None Include="App.config" />
-    <None Include="pnunit-launcher.build" />
-    <None Include="Ship.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <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>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>launcher</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <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">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Project>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</Project>
+      <Name>pnunit.framework</Name>
+    </ProjectReference>
+    <Reference Include="log4net">
+      <HintPath>..\..\..\lib\log4net.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <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>
+    <None Include="App.config" />
+    <None Include="pnunit-launcher.build" />
+    <None Include="Ship.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/PNUnit/pnunit.framework/AssemblyInfo.cs b/src/PNUnit/pnunit.framework/AssemblyInfo.cs
index 7e0ae00..dc85784 100644
--- a/src/PNUnit/pnunit.framework/AssemblyInfo.cs
+++ b/src/PNUnit/pnunit.framework/AssemblyInfo.cs
@@ -1,58 +1,58 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// La informaci�n general de un ensamblado se controla mediante el siguiente 
-// conjunto de atributos. Cambie estos atributos para modificar la informaci�n
-// asociada con un ensamblado.
-//
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-//
-// La informaci�n de versi�n de un ensamblado consta de los siguientes cuatro valores:
-//
-//      Versi�n principal
-//      Versi�n secundaria 
-//      Versi�n de compilaci�n
-//      Revisi�n
-//
-// Puede especificar todos los valores o usar los valores predeterminados (n�mero de versi�n de compilaci�n y de revisi�n) 
-// usando el s�mbolo '*' como se muestra a continuaci�n:
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentaci�n de 
-// Microsoft .NET Framework para obtener m�s informaci�n sobre la firma de ensamblados.
-//
-// Utilice los atributos siguientes para controlar qu� clave desea utilizar para firmar. 
-//
-// Notas: 
-//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
-//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
-//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
-//       una clave.
-//   (*) Si se especifican los valores KeyFile y KeyName, tendr� 
-//       lugar el siguiente proceso:
-//       (1) Si KeyName se puede encontrar en el CSP, se utilizar� dicha clave.
-//       (2) Si KeyName no existe pero s� KeyFile, se instalar� 
-//           y utilizar� la clave de KeyFile en el CSP.
-//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
-//       Cuando se especifica KeyFile, la ubicaci�n de KeyFile debe ser
-//       relativa al directorio de resultados del proyecto, que es
-//       %Directorio del proyecto%\obj\<configuraci�n>. Por ejemplo, si KeyFile
-//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
-//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Firma retardada es una opci�n avanzada; consulte la documentaci�n de
-//       Microsoft .NET Framework para obtener m�s informaci�n.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// La informaci�n general de un ensamblado se controla mediante el siguiente 
+// conjunto de atributos. Cambie estos atributos para modificar la informaci�n
+// asociada con un ensamblado.
+//
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// La informaci�n de versi�n de un ensamblado consta de los siguientes cuatro valores:
+//
+//      Versi�n principal
+//      Versi�n secundaria 
+//      Versi�n de compilaci�n
+//      Revisi�n
+//
+// Puede especificar todos los valores o usar los valores predeterminados (n�mero de versi�n de compilaci�n y de revisi�n) 
+// usando el s�mbolo '*' como se muestra a continuaci�n:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// Si desea firmar el ensamblado, debe especificar una clave para su uso. Consulte la documentaci�n de 
+// Microsoft .NET Framework para obtener m�s informaci�n sobre la firma de ensamblados.
+//
+// Utilice los atributos siguientes para controlar qu� clave desea utilizar para firmar. 
+//
+// Notas: 
+//   (*) Si no se especifica ninguna clave, el ensamblado no se firma.
+//   (*) KeyName se refiere a una clave instalada en el Proveedor de servicios
+//       de cifrado (CSP) en el equipo. KeyFile se refiere a un archivo que contiene
+//       una clave.
+//   (*) Si se especifican los valores KeyFile y KeyName, tendr� 
+//       lugar el siguiente proceso:
+//       (1) Si KeyName se puede encontrar en el CSP, se utilizar� dicha clave.
+//       (2) Si KeyName no existe pero s� KeyFile, se instalar� 
+//           y utilizar� la clave de KeyFile en el CSP.
+//   (*) Para crear KeyFile, puede ejecutar la utilidad sn.exe (Strong Name).
+//       Cuando se especifica KeyFile, la ubicaci�n de KeyFile debe ser
+//       relativa al directorio de resultados del proyecto, que es
+//       %Directorio del proyecto%\obj\<configuraci�n>. Por ejemplo, si KeyFile
+//       se encuentra en el directorio del proyecto, el atributo AssemblyKeyFile se especifica 
+//       como [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Firma retardada es una opci�n avanzada; consulte la documentaci�n de
+//       Microsoft .NET Framework para obtener m�s informaci�n.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/pnunit.framework/Interfaces.cs b/src/PNUnit/pnunit.framework/Interfaces.cs
index 87dda7a..719ae39 100644
--- a/src/PNUnit/pnunit.framework/Interfaces.cs
+++ b/src/PNUnit/pnunit.framework/Interfaces.cs
@@ -1,147 +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; } }
-    }
-
-
-}
-
+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; } }
+    }
+
+
+}
+
diff --git a/src/PNUnit/pnunit.framework/PNUnitServices.cs b/src/PNUnit/pnunit.framework/PNUnitServices.cs
index ab469ae..a4f40ec 100644
--- a/src/PNUnit/pnunit.framework/PNUnitServices.cs
+++ b/src/PNUnit/pnunit.framework/PNUnitServices.cs
@@ -1,180 +1,180 @@
-using System;
-
-namespace PNUnit.Framework
-{
-    [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 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];
-        }
-    }
-}
+using System;
+
+namespace PNUnit.Framework
+{
+    [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 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/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/PNUnit/pnunit.framework/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..ca6fe5f
Binary files /dev/null and b/src/PNUnit/pnunit.framework/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.csproj.FileListAbsolute.txt b/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..294610b
--- /dev/null
+++ b/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit.framework.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit.framework.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\pnunit.framework\obj\Debug\pnunit.framework.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\pnunit.framework\obj\Debug\pnunit.framework.dll
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\pnunit.framework\obj\Debug\pnunit.framework.pdb
diff --git a/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.csprojResolveAssemblyReference.cache b/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..e8bffdb
Binary files /dev/null and b/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.csprojResolveAssemblyReference.cache differ
diff --git a/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.pdb b/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.pdb
new file mode 100644
index 0000000..5b97b81
Binary files /dev/null and b/src/PNUnit/pnunit.framework/obj/Debug/pnunit.framework.pdb differ
diff --git a/src/PNUnit/pnunit.framework/pnunit.framework.build b/src/PNUnit/pnunit.framework/pnunit.framework.build
index 4e7096e..6a5f914 100644
--- a/src/PNUnit/pnunit.framework/pnunit.framework.build
+++ b/src/PNUnit/pnunit.framework/pnunit.framework.build
@@ -1,41 +1,41 @@
-<?xml version="1.0"?>
-<project name="PNUnitFramework" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="Interfaces.cs"/>
-        <include name="PNUnitServices.cs"/>
-  </patternset>
-
-  <target name="build">
-
-    <csc target="library"
-        output="${current.framework.dir}/pnunit.framework.dll"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources basedir=".">
-        <patternset refid="source-files"/>
-      </sources>
-      <references>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-      </references>
-    </csc>
-
-    <!-- Needed in base dir by pnunit tests -->
-    <copy file="${current.framework.dir}/pnunit.framework.dll"
-      todir="${current.build.dir}"/>
-
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/PNUnit/pnunit.framework">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="pnunit.framework.csproj"/>
-        <include name="pnunit.framework.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="PNUnitFramework" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Interfaces.cs"/>
+        <include name="PNUnitServices.cs"/>
+  </patternset>
+
+  <target name="build">
+
+    <csc target="library"
+        output="${current.framework.dir}/pnunit.framework.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+      </references>
+    </csc>
+
+    <!-- Needed in base dir by pnunit tests -->
+    <copy file="${current.framework.dir}/pnunit.framework.dll"
+      todir="${current.build.dir}"/>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/pnunit.framework">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="pnunit.framework.csproj"/>
+        <include name="pnunit.framework.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/PNUnit/pnunit.framework/pnunit.framework.csproj b/src/PNUnit/pnunit.framework/pnunit.framework.csproj
index 5b8d9e3..1d69a0b 100644
--- a/src/PNUnit/pnunit.framework/pnunit.framework.csproj
+++ b/src/PNUnit/pnunit.framework/pnunit.framework.csproj
@@ -1,112 +1,134 @@
-<?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>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</ProjectGuid>
-    <SccProjectName>
-    </SccProjectName>
-    <SccLocalPath>
-    </SccLocalPath>
-    <SccProvider>
-    </SccProvider>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>pnunit.framework</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>pnunit.framework</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>0.0</OldToolsVersion>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-    <SccAuxPath>
-    </SccAuxPath>
-  </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" />
-    <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">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Name>nunit.core.interfaces.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="pnunit.framework.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5261ABA1-98E6-4603-A4F0-59CAC307AC68}</ProjectGuid>
+    <SccProjectName>
+    </SccProjectName>
+    <SccLocalPath>
+    </SccLocalPath>
+    <SccProvider>
+    </SccProvider>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>pnunit.framework</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>pnunit.framework</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <SccAuxPath>
+    </SccAuxPath>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <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>
+    <None Include="pnunit.framework.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Name>nunit.core.interfaces.dll</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </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/tests/AssemblyInfo.cs b/src/PNUnit/tests/AssemblyInfo.cs
index e6f9900..1b87d51 100644
--- a/src/PNUnit/tests/AssemblyInfo.cs
+++ b/src/PNUnit/tests/AssemblyInfo.cs
@@ -1,19 +1,19 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-[assembly: AssemblyTitle("")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("")]
-[assembly: AssemblyCopyright("")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]		
-
-
-[assembly: AssemblyVersion("1.0.*")]
-
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: AssemblyTitle("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/PNUnit/tests/Cmp.cs b/src/PNUnit/tests/Cmp.cs
index ff9412a..d3618f3 100644
--- a/src/PNUnit/tests/Cmp.cs
+++ b/src/PNUnit/tests/Cmp.cs
@@ -1,15 +1,15 @@
-using System;
-
-namespace TestLibraries
-{
-
-	public class Cmp
-	{
-		public static int Add(int a, int b)
-		{
-			int result;
-			result = a + b;
-			return result;
-		}
-	}
-}
+using System;
+
+namespace TestLibraries
+{
+
+	public class Cmp
+	{
+		public static int Add(int a, int b)
+		{
+			int result;
+			result = a + b;
+			return result;
+		}
+	}
+}
diff --git a/src/PNUnit/tests/ParallelExamples.cs b/src/PNUnit/tests/ParallelExamples.cs
index a1b00f5..0a3c350 100644
--- a/src/PNUnit/tests/ParallelExamples.cs
+++ b/src/PNUnit/tests/ParallelExamples.cs
@@ -1,143 +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()));
-        }
-    }
-}
+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 3483971..8bd5724 100644
--- a/src/PNUnit/tests/Testing.cs
+++ b/src/PNUnit/tests/Testing.cs
@@ -1,46 +1,46 @@
-using System;
-using System.Threading;
-
-using NUnit.Framework;
-
-using PNUnit.Framework;
-
-namespace TestLibraries
-{
-	
-	[TestFixture]
-	public class Testing
-	{
-		[Test]
-		public void EqualTo19()
-		{
-			Assert.AreEqual(19, Cmp.Add(15,4));
-		}
-
-
-		[Test, Explicit("PNUnit Test")]
-		public void Server()
-		{
-			PNUnitServices.Get().InitBarrier("BARRIER", 1);
-			PNUnitServices.Get().WriteLine("Server started");
-
-			Thread.Sleep(10000);
-
-			PNUnitServices.Get().EnterBarrier("BARRIER");                
-			Assert.IsTrue(false, "The test failed");        
-		}
-
-		[Test, Explicit("PNUnit Test")]
-		public void Client()
-		{   
-			PNUnitServices.Get().WriteLine("The client should wait until the server starts");
-			PNUnitServices.Get().InitBarrier("BARRIER", 1);                
-			
-			PNUnitServices.Get().EnterBarrier("BARRIER");
-
-			Console.WriteLine("Server should be started now");
-			Assert.IsTrue(true, "The test failed");                
-
-		}
-	}
-}
+using System;
+using System.Threading;
+
+using NUnit.Framework;
+
+using PNUnit.Framework;
+
+namespace TestLibraries
+{
+	
+	[TestFixture]
+	public class Testing
+	{
+		[Test]
+		public void EqualTo19()
+		{
+			Assert.AreEqual(19, Cmp.Add(15,4));
+		}
+
+
+		[Test, Explicit("PNUnit Test")]
+		public void Server()
+		{
+			PNUnitServices.Get().InitBarrier("BARRIER", 1);
+			PNUnitServices.Get().WriteLine("Server started");
+
+			Thread.Sleep(10000);
+
+			PNUnitServices.Get().EnterBarrier("BARRIER");                
+			Assert.IsTrue(false, "The test failed");        
+		}
+
+		[Test, Explicit("PNUnit Test")]
+		public void Client()
+		{   
+			PNUnitServices.Get().WriteLine("The client should wait until the server starts");
+			PNUnitServices.Get().InitBarrier("BARRIER", 1);                
+			
+			PNUnitServices.Get().EnterBarrier("BARRIER");
+
+			Console.WriteLine("Server should be started now");
+			Assert.IsTrue(true, "The test failed");                
+
+		}
+	}
+}
diff --git a/src/PNUnit/tests/agent.conf b/src/PNUnit/tests/agent.conf
index b4cf550..ddbcd8e 100644
--- a/src/PNUnit/tests/agent.conf
+++ b/src/PNUnit/tests/agent.conf
@@ -1,4 +1,4 @@
-<AgentConfig>
-  <Port>8080</Port>
-  <PathToAssemblies>.</PathToAssemblies>
+<AgentConfig>
+  <Port>8080</Port>
+  <PathToAssemblies>.</PathToAssemblies>
 </AgentConfig>
\ No newline at end of file
diff --git a/src/PNUnit/tests/agent.log.conf b/src/PNUnit/tests/agent.log.conf
index 6a9ced8..b5bcd9d 100644
--- a/src/PNUnit/tests/agent.log.conf
+++ b/src/PNUnit/tests/agent.log.conf
@@ -1,18 +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>
+<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
index 6a9ced8..b5bcd9d 100644
--- a/src/PNUnit/tests/launcher.log.conf
+++ b/src/PNUnit/tests/launcher.log.conf
@@ -1,18 +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>
+<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/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/PNUnit/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..54f9c87
Binary files /dev/null and b/src/PNUnit/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/PNUnit/tests/obj/Debug/pnunit.tests.csproj.FileListAbsolute.txt b/src/PNUnit/tests/obj/Debug/pnunit.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..247d44c
--- /dev/null
+++ b/src/PNUnit/tests/obj/Debug/pnunit.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,10 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\agent.conf
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\agent.log.conf
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\launcher.log.conf
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\runpnunit.bat
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\test.conf
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\pnunit.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\tests\obj\Debug\pnunit.tests.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\tests\obj\Debug\pnunit.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\PNUnit\tests\obj\Debug\pnunit.tests.pdb
diff --git a/src/PNUnit/tests/obj/Debug/pnunit.tests.csprojResolveAssemblyReference.cache b/src/PNUnit/tests/obj/Debug/pnunit.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..0ed334f
Binary files /dev/null and b/src/PNUnit/tests/obj/Debug/pnunit.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/PNUnit/tests/obj/Debug/pnunit.tests.pdb b/src/PNUnit/tests/obj/Debug/pnunit.tests.pdb
new file mode 100644
index 0000000..dfdcc11
Binary files /dev/null and b/src/PNUnit/tests/obj/Debug/pnunit.tests.pdb differ
diff --git a/src/PNUnit/tests/pnunit.tests.build b/src/PNUnit/tests/pnunit.tests.build
index 8db1fb0..d0b68d7 100644
--- a/src/PNUnit/tests/pnunit.tests.build
+++ b/src/PNUnit/tests/pnunit.tests.build
@@ -1,45 +1,45 @@
-<?xml version="1.0"?>
-<project name="PNUnitTests" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="AssemblyInfo.cs"/>
-        <include name="Cmp.cs"/>
-        <include name="Testing.cs"/>
-    <include name="ParallelExamples.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library"
-        output="${current.build.dir}/pnunit.tests.dll"
-        debug="${build.debug}" 
-        define="${build.defines}">
-      <sources basedir=".">
-        <patternset refid="source-files"/>
-      </sources>
-      <references>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.framework.dir}/pnunit.framework.dll"/>
-      </references>
-    </csc>
-
-    <copy todir="${current.build.dir}">
-      <fileset>
-        <include name="*.conf"/>
-        <include name="runpnunit.bat"/>
-      </fileset>
-    </copy>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/PNUnit/tests">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="pnunit.tests.csproj"/>
-        <include name="pnunit.tests.build"/>
-        <include name="*.conf"/>
-        <include name="runpnunit.bat"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="PNUnitTests" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="AssemblyInfo.cs"/>
+        <include name="Cmp.cs"/>
+        <include name="Testing.cs"/>
+    <include name="ParallelExamples.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library"
+        output="${current.build.dir}/pnunit.tests.dll"
+        debug="${build.debug}" 
+        define="${build.defines}">
+      <sources basedir=".">
+        <patternset refid="source-files"/>
+      </sources>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/pnunit.framework.dll"/>
+      </references>
+    </csc>
+
+    <copy todir="${current.build.dir}">
+      <fileset>
+        <include name="*.conf"/>
+        <include name="runpnunit.bat"/>
+      </fileset>
+    </copy>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/PNUnit/tests">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="pnunit.tests.csproj"/>
+        <include name="pnunit.tests.build"/>
+        <include name="*.conf"/>
+        <include name="runpnunit.bat"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/PNUnit/tests/pnunit.tests.csproj b/src/PNUnit/tests/pnunit.tests.csproj
index 6abbd7c..4134405 100644
--- a/src/PNUnit/tests/pnunit.tests.csproj
+++ b/src/PNUnit/tests/pnunit.tests.csproj
@@ -1,117 +1,151 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{319B9238-76BE-4335-9B4D-F8E43C4B124F}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>pnunit.tests</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>TestLibraries</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
-      <Name>pnunit.framework</Name>
-      <Project>{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>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{319B9238-76BE-4335-9B4D-F8E43C4B124F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>pnunit.tests</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>TestLibraries</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\pnunit.framework\pnunit.framework.csproj">
+      <Name>pnunit.framework</Name>
+      <Project>{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>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </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/tests/runpnunit.bat b/src/PNUnit/tests/runpnunit.bat
index f41cb5a..43b3a69 100644
--- a/src/PNUnit/tests/runpnunit.bat
+++ b/src/PNUnit/tests/runpnunit.bat
@@ -1,3 +1,3 @@
-start pnunit-agent 8080 .
-start pnunit-agent 8081 .
-pnunit-launcher test.conf
+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
index 63cc7bd..ce825eb 100644
--- a/src/PNUnit/tests/test.conf
+++ b/src/PNUnit/tests/test.conf
@@ -1,82 +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>
+
+  <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
index ed51007..b3d77c0 100644
--- a/src/ProjectEditor/editor/AboutBox.Designer.cs
+++ b/src/ProjectEditor/editor/AboutBox.Designer.cs
@@ -1,190 +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;
-    }
-}
+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
index 0ff4317..beb915e 100644
--- a/src/ProjectEditor/editor/AboutBox.cs
+++ b/src/ProjectEditor/editor/AboutBox.cs
@@ -1,109 +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
-    }
-}
+// ****************************************************************
+// 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
index a676f57..4803ff0 100644
--- a/src/ProjectEditor/editor/AboutBox.resx
+++ b/src/ProjectEditor/editor/AboutBox.resx
@@ -1,610 +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>
+<?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/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs
index ea62d2e..8967484 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.Designer.cs
@@ -1,128 +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;
-
-    }
-}
+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
index 71b1ac5..e3b1e66 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.cs
@@ -1,99 +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; }
-    }
-}
+// ****************************************************************
+// 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/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.resx b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.resx
index ff31a6d..19dc0dd 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.resx
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationDialog.resx
@@ -1,120 +1,120 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
 </root>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs
index 88095f7..6b1ac1a 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/AddConfigurationPresenter.cs
@@ -1,63 +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();
-            };
-        }
-    }
-}
+// ****************************************************************
+// 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
index c351af4..e71dcc7 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditor.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditor.cs
@@ -1,132 +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
-    }
-}
+// ****************************************************************
+// 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
index 903000c..3a4eeb4 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.Designer.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.Designer.cs
@@ -1,139 +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;
-
-    }
-}
+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
index 3e0e440..7dfc689 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.cs
@@ -1,102 +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
-    }
-}
+// ****************************************************************
+// 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
index 262d09c..6628300 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.resx
+++ b/src/ProjectEditor/editor/ConfigurationEditor/ConfigurationEditorView.resx
@@ -1,146 +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>
+<?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
index 79e1a92..f183826 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/IConfigurationEditorView.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/IConfigurationEditorView.cs
@@ -1,24 +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; }
-    }
-}
+// ****************************************************************
+// 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
index 19d2859..37a1f3b 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.Designer.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.Designer.cs
@@ -1,84 +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;
-
-    }
-}
+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
index b351ed0..c55c43f 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.cs
@@ -1,75 +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; }
-    }
-}
+// ****************************************************************
+// 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/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.resx b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.resx
index 15057b2..72365f0 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.resx
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationDialog.resx
@@ -1,157 +1,157 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 1.3
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">1.3</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1">this is my long string</data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        [base64 mime encoded serialized .NET Framework object]
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        [base64 mime encoded string representing a byte array form of the .NET Framework object]
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used forserialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>1.3</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="configurationNameTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="configurationNameTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="configurationNameTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
-  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>(Default)</value>
-  </data>
-  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>False</value>
-  </data>
-  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>8, 8</value>
-  </data>
-  <data name="$this.Name">
-    <value>RenameConfigurationDialog</value>
-  </data>
-  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>80</value>
-  </data>
-  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </data>
-  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>Private</value>
-  </data>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="configurationNameTextBox.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="configurationNameTextBox.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="configurationNameTextBox.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="okButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="okButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cancelButton.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cancelButton.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>RenameConfigurationDialog</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs
index af7c222..1f69420 100644
--- a/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs
+++ b/src/ProjectEditor/editor/ConfigurationEditor/RenameConfigurationPresenter.cs
@@ -1,49 +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;
-            };
-        }
-    }
-}
+// ****************************************************************
+// 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
index 77e0d8b..e5ca063 100644
--- a/src/ProjectEditor/editor/Delegates.cs
+++ b/src/ProjectEditor/editor/Delegates.cs
@@ -1,16 +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();
-}
+// ****************************************************************
+// 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
index 9f664d3..7f5681f 100644
--- a/src/ProjectEditor/editor/IDialog.cs
+++ b/src/ProjectEditor/editor/IDialog.cs
@@ -1,21 +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();
-    }
-}
+// ****************************************************************
+// 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
index 7433612..26f12a9 100644
--- a/src/ProjectEditor/editor/IView.cs
+++ b/src/ProjectEditor/editor/IView.cs
@@ -1,29 +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; }
-    }
-}
+// ****************************************************************
+// 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
index f969c61..13ad362 100644
--- a/src/ProjectEditor/editor/Main/IMainView.cs
+++ b/src/ProjectEditor/editor/Main/IMainView.cs
@@ -1,48 +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
-    }
-}
+// ****************************************************************
+// 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
index 4fb556c..94c5023 100644
--- a/src/ProjectEditor/editor/Main/IProjectDocument.cs
+++ b/src/ProjectEditor/editor/Main/IProjectDocument.cs
@@ -1,61 +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
-    }
-}
+// ****************************************************************
+// 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
index 58dd885..18337fb 100644
--- a/src/ProjectEditor/editor/Main/MainForm.Designer.cs
+++ b/src/ProjectEditor/editor/Main/MainForm.Designer.cs
@@ -1,290 +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;
-    }
+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
index dc4a363..a105d51 100644
--- a/src/ProjectEditor/editor/Main/MainForm.cs
+++ b/src/ProjectEditor/editor/Main/MainForm.cs
@@ -1,146 +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
-    }
-}
+// ****************************************************************
+// 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
index d566032..a965500 100644
--- a/src/ProjectEditor/editor/Main/MainForm.resx
+++ b/src/ProjectEditor/editor/Main/MainForm.resx
@@ -1,170 +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>
+<?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
index cb20947..7c41edd 100644
--- a/src/ProjectEditor/editor/Main/MainPresenter.cs
+++ b/src/ProjectEditor/editor/Main/MainPresenter.cs
@@ -1,210 +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
-    }
-}
+// ****************************************************************
+// 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
index 1832644..7389679 100644
--- a/src/ProjectEditor/editor/Main/ProjectDocument.cs
+++ b/src/ProjectEditor/editor/Main/ProjectDocument.cs
@@ -1,373 +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
-    }
-}
+// ****************************************************************
+// 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
index 6b8d0b8..a56fe46 100644
--- a/src/ProjectEditor/editor/PathUtils.cs
+++ b/src/ProjectEditor/editor/PathUtils.cs
@@ -1,256 +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
-	}
-}
+// ****************************************************************
+// 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
index 4384247..f4edb70 100644
--- a/src/ProjectEditor/editor/Program.cs
+++ b/src/ProjectEditor/editor/Program.cs
@@ -1,63 +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);
-        }
-    }
-}
+// ****************************************************************
+// 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
index 4c1ae7f..a964902 100644
--- a/src/ProjectEditor/editor/Properties/AssemblyInfo.cs
+++ b/src/ProjectEditor/editor/Properties/AssemblyInfo.cs
@@ -1,36 +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")]
+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
index 23373de..e353680 100644
--- a/src/ProjectEditor/editor/PropertyEditor/AssemblyList.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/AssemblyList.cs
@@ -1,95 +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
-    }
-}
+// ****************************************************************
+// 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
index a7862d2..ab01926 100644
--- a/src/ProjectEditor/editor/PropertyEditor/ConfigList.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/ConfigList.cs
@@ -1,124 +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
-    }
-}
+// ****************************************************************
+// 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
index 16bfbbd..6560301 100644
--- a/src/ProjectEditor/editor/PropertyEditor/IProjectConfig.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/IProjectConfig.cs
@@ -1,31 +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; }
-    }
-}
+// ****************************************************************
+// 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
index 652a743..c982a5e 100644
--- a/src/ProjectEditor/editor/PropertyEditor/IProjectModel.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/IProjectModel.cs
@@ -1,39 +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
-    }
-}
+// ****************************************************************
+// 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
index 75a64a9..2933526 100644
--- a/src/ProjectEditor/editor/PropertyEditor/IPropertyView.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/IPropertyView.cs
@@ -1,61 +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
-    }
-}
+// ****************************************************************
+// 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
index 32b7c4f..c3c60b6 100644
--- a/src/ProjectEditor/editor/PropertyEditor/ProjectConfig.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/ProjectConfig.cs
@@ -1,185 +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
-    }
-}
+// ****************************************************************
+// 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
index 25e62fe..4b1af44 100644
--- a/src/ProjectEditor/editor/PropertyEditor/ProjectModel.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/ProjectModel.cs
@@ -1,140 +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
-    }
-}
+// ****************************************************************
+// 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
index 3b0214e..667cc86 100644
--- a/src/ProjectEditor/editor/PropertyEditor/PropertyPresenter.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyPresenter.cs
@@ -1,493 +1,488 @@
-// ****************************************************************
-// 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
-    }
-}
+// ****************************************************************
+// 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.EffectiveBasePath, view.ApplicationBase.Text);
+                    if (PathUtils.SamePath(model.EffectiveBasePath, 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))
+                    selectedConfig.ConfigurationFile = view.ConfigurationFile.Text;
+            }
+        }
+
+        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
index 92511ba..786e717 100644
--- a/src/ProjectEditor/editor/PropertyEditor/PropertyView.Designer.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyView.Designer.cs
@@ -1,563 +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;
-
-    }
-}
+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
index 5de4895..f87d2dd 100644
--- a/src/ProjectEditor/editor/PropertyEditor/PropertyView.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyView.cs
@@ -1,236 +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
-    }
-}
+// ****************************************************************
+// 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
index 28331e0..f8d15de 100644
--- a/src/ProjectEditor/editor/PropertyEditor/PropertyView.resx
+++ b/src/ProjectEditor/editor/PropertyEditor/PropertyView.resx
@@ -1,145 +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>
+<?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
index 4891394..6773fb9 100644
--- a/src/ProjectEditor/editor/PropertyEditor/RuntimeFramework.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/RuntimeFramework.cs
@@ -1,141 +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
-    }
-}
+// ****************************************************************
+// 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
index 4bb93be..32d46dc 100644
--- a/src/ProjectEditor/editor/PropertyEditor/VSProject.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/VSProject.cs
@@ -1,328 +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
-	}
-}
+// ****************************************************************
+// 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
index ba70662..65cbff2 100644
--- a/src/ProjectEditor/editor/PropertyEditor/VSProjectConfig.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/VSProjectConfig.cs
@@ -1,39 +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; }
-		}
-	}
-}
+// ****************************************************************
+// 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
index ef6547b..82101c4 100644
--- a/src/ProjectEditor/editor/PropertyEditor/VSProjectConfigCollection.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/VSProjectConfigCollection.cs
@@ -1,48 +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;
-		}
-	}
-}
+// ****************************************************************
+// 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
index 02d0385..c8bfaad 100644
--- a/src/ProjectEditor/editor/PropertyEditor/XmlHelper.cs
+++ b/src/ProjectEditor/editor/PropertyEditor/XmlHelper.cs
@@ -1,118 +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
-    }
-}
+// ****************************************************************
+// 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
index ef8c2ee..a5e41f2 100644
--- a/src/ProjectEditor/editor/ViewElements/ButtonElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/ButtonElement.cs
@@ -1,31 +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;
-    }
-}
+// ****************************************************************
+// 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
index 01d7fd8..25ee11f 100644
--- a/src/ProjectEditor/editor/ViewElements/ComboBoxElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/ComboBoxElement.cs
@@ -1,93 +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;
-    }
-}
+// ****************************************************************
+// 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
index 3685fef..1fc3324 100644
--- a/src/ProjectEditor/editor/ViewElements/ControlElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/ControlElement.cs
@@ -1,50 +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; }
-        }
-    }
-}
+// ****************************************************************
+// 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
index e551242..fca9dc1 100644
--- a/src/ProjectEditor/editor/ViewElements/DialogManager.cs
+++ b/src/ProjectEditor/editor/ViewElements/DialogManager.cs
@@ -1,70 +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
-    }
-}
+// ****************************************************************
+// 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
index 89806f9..dc8a99a 100644
--- a/src/ProjectEditor/editor/ViewElements/IComboBox.cs
+++ b/src/ProjectEditor/editor/ViewElements/IComboBox.cs
@@ -1,33 +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;
-    }
-}
+// ****************************************************************
+// 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
index 981456c..b96431f 100644
--- a/src/ProjectEditor/editor/ViewElements/ICommand.cs
+++ b/src/ProjectEditor/editor/ViewElements/ICommand.cs
@@ -1,20 +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;
-    }
-}
+// ****************************************************************
+// 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
index e6ce471..8a0c34f 100644
--- a/src/ProjectEditor/editor/ViewElements/IDialogManager.cs
+++ b/src/ProjectEditor/editor/ViewElements/IDialogManager.cs
@@ -1,19 +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);
-    }
-}
+// ****************************************************************
+// 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
index a51f455..5f0ca56 100644
--- a/src/ProjectEditor/editor/ViewElements/IMessageDisplay.cs
+++ b/src/ProjectEditor/editor/ViewElements/IMessageDisplay.cs
@@ -1,18 +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);
-    }
-}
+// ****************************************************************
+// 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
index 6a4e42f..db558d4 100644
--- a/src/ProjectEditor/editor/ViewElements/ISelection.cs
+++ b/src/ProjectEditor/editor/ViewElements/ISelection.cs
@@ -1,23 +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;
-    }
-}
+// ****************************************************************
+// 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
index 591d172..62074c9 100644
--- a/src/ProjectEditor/editor/ViewElements/ISelectionList.cs
+++ b/src/ProjectEditor/editor/ViewElements/ISelectionList.cs
@@ -1,28 +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; }
-    }
-}
+// ****************************************************************
+// 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
index 3b482a6..924fff9 100644
--- a/src/ProjectEditor/editor/ViewElements/ITextElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/ITextElement.cs
@@ -1,31 +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;
-    }
-}
+// ****************************************************************
+// 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
index fbfa5f8..5a4fb84 100644
--- a/src/ProjectEditor/editor/ViewElements/IViewElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/IViewElement.cs
@@ -1,28 +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; }
-    }
-}
+// ****************************************************************
+// 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
index 5e73df2..00bf1e4 100644
--- a/src/ProjectEditor/editor/ViewElements/ListBoxElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/ListBoxElement.cs
@@ -1,62 +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;
-    }
-}
+// ****************************************************************
+// 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
index 239ac73..71989fd 100644
--- a/src/ProjectEditor/editor/ViewElements/MenuElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/MenuElement.cs
@@ -1,47 +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; }
-        }
-    }
-}
+// ****************************************************************
+// 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
index 89eef78..aa775da 100644
--- a/src/ProjectEditor/editor/ViewElements/MessageDisplay.cs
+++ b/src/ProjectEditor/editor/ViewElements/MessageDisplay.cs
@@ -1,31 +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;
-        }
-    }
+// ****************************************************************
+// 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
index ec394c0..05a8e45 100644
--- a/src/ProjectEditor/editor/ViewElements/RadioButtonGroup.cs
+++ b/src/ProjectEditor/editor/ViewElements/RadioButtonGroup.cs
@@ -1,71 +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;
-    }
-}
+// ****************************************************************
+// 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
index 94e0066..3177fb9 100644
--- a/src/ProjectEditor/editor/ViewElements/TextElement.cs
+++ b/src/ProjectEditor/editor/ViewElements/TextElement.cs
@@ -1,47 +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;
-    }
-}
+// ****************************************************************
+// 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
index 64bc3a1..333ed2d 100644
--- a/src/ProjectEditor/editor/XmlEditor/IXmlView.cs
+++ b/src/ProjectEditor/editor/XmlEditor/IXmlView.cs
@@ -1,48 +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();
-
-        
-    }
-}
+// ****************************************************************
+// 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
index 47b56a6..cfcd7c0 100644
--- a/src/ProjectEditor/editor/XmlEditor/XmlPresenter.cs
+++ b/src/ProjectEditor/editor/XmlEditor/XmlPresenter.cs
@@ -1,85 +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;
-        }
-    }
-}
+// ****************************************************************
+// 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
index b7e45fc..6ef40a9 100644
--- a/src/ProjectEditor/editor/XmlEditor/XmlView.Designer.cs
+++ b/src/ProjectEditor/editor/XmlEditor/XmlView.Designer.cs
@@ -1,79 +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;
-    }
-}
+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
index 9f8d401..ed210e3 100644
--- a/src/ProjectEditor/editor/XmlEditor/XmlView.cs
+++ b/src/ProjectEditor/editor/XmlEditor/XmlView.cs
@@ -1,100 +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
-    }
-}
+// ****************************************************************
+// 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/ProjectEditor/editor/XmlEditor/XmlView.resx b/src/ProjectEditor/editor/XmlEditor/XmlView.resx
index ff31a6d..19dc0dd 100644
--- a/src/ProjectEditor/editor/XmlEditor/XmlView.resx
+++ b/src/ProjectEditor/editor/XmlEditor/XmlView.resx
@@ -1,120 +1,120 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
 </root>
\ No newline at end of file
diff --git a/src/ProjectEditor/editor/nunit-editor.build b/src/ProjectEditor/editor/nunit-editor.build
index e07b74e..6553de3 100644
--- a/src/ProjectEditor/editor/nunit-editor.build
+++ b/src/ProjectEditor/editor/nunit-editor.build
@@ -1,108 +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>
-
+<?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
index dc70f01..d079a41 100644
--- a/src/ProjectEditor/editor/nunit-editor.csproj
+++ b/src/ProjectEditor/editor/nunit-editor.csproj
@@ -1,172 +1,210 @@
-<?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>
-  -->
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" 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>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </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
index 1d541f6..bc2d395 100644
--- a/src/ProjectEditor/tests/Model/AssemblyListTests.cs
+++ b/src/ProjectEditor/tests/Model/AssemblyListTests.cs
@@ -1,136 +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 );
-        }
-	}
-}
+// ****************************************************************
+// 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
index 071b4e9..8e7ed99 100644
--- a/src/ProjectEditor/tests/Model/NUnitProjectSave.cs
+++ b/src/ProjectEditor/tests/Model/NUnitProjectSave.cs
@@ -1,133 +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));
-        }
-    }
-}
+// ****************************************************************
+// 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
index e81629e..81a0289 100644
--- a/src/ProjectEditor/tests/Model/ProjectCreationTests.cs
+++ b/src/ProjectEditor/tests/Model/ProjectCreationTests.cs
@@ -1,153 +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);
-        }
-    }
-}
+// ****************************************************************
+// 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
index d5e3d31..0e7a089 100644
--- a/src/ProjectEditor/tests/Model/ProjectDocumentTests.cs
+++ b/src/ProjectEditor/tests/Model/ProjectDocumentTests.cs
@@ -1,72 +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);
-        }
-
-    }
-}
+// ****************************************************************
+// 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
index a4925a2..93bdbc0 100644
--- a/src/ProjectEditor/tests/Model/ProjectModelChangeTests.cs
+++ b/src/ProjectEditor/tests/Model/ProjectModelChangeTests.cs
@@ -1,140 +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);
-        }
-    }
-}
+// ****************************************************************
+// 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
index 80cb531..96d3eac 100644
--- a/src/ProjectEditor/tests/Model/ProjectModelLoadtests.cs
+++ b/src/ProjectEditor/tests/Model/ProjectModelLoadtests.cs
@@ -1,193 +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]);
-        }
-    }
-}
+// ****************************************************************
+// 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
index 5199fe0..8fa6d66 100644
--- a/src/ProjectEditor/tests/NUnitProjectXml.cs
+++ b/src/ProjectEditor/tests/NUnitProjectXml.cs
@@ -1,58 +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>";
-    }
-}
+// ****************************************************************
+// 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
index 50e5516..8492b83 100644
--- a/src/ProjectEditor/tests/Presenters/AddConfigurationPresenterTests.cs
+++ b/src/ProjectEditor/tests/Presenters/AddConfigurationPresenterTests.cs
@@ -1,86 +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));
-        }
-    }
-}
+// ****************************************************************
+// 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 || NET_4_5
+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
index c8646e7..1f93892 100644
--- a/src/ProjectEditor/tests/Presenters/ConfigurationEditorTests.cs
+++ b/src/ProjectEditor/tests/Presenters/ConfigurationEditorTests.cs
@@ -1,152 +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
+// ****************************************************************
+// 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 || NET_4_5
+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
index 678104e..ed76033 100644
--- a/src/ProjectEditor/tests/Presenters/MainPresenterTests.cs
+++ b/src/ProjectEditor/tests/Presenters/MainPresenterTests.cs
@@ -1,209 +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
+// ****************************************************************
+// 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 || NET_4_5
+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.Contains(NONEXISTENT_PROJECT)));
+
+            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
index 9c57058..291e5b4 100644
--- a/src/ProjectEditor/tests/Presenters/PropertyPresenterTests.cs
+++ b/src/ProjectEditor/tests/Presenters/PropertyPresenterTests.cs
@@ -1,267 +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
+// ****************************************************************
+// 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 || NET_4_5
+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
index 614cb31..56fc6ac 100644
--- a/src/ProjectEditor/tests/Presenters/RenameConfigurationPresenterTests.cs
+++ b/src/ProjectEditor/tests/Presenters/RenameConfigurationPresenterTests.cs
@@ -1,96 +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
+// ****************************************************************
+// 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 || NET_4_5
+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
index 114ea17..c92bea5 100644
--- a/src/ProjectEditor/tests/Presenters/SelectionStub.cs
+++ b/src/ProjectEditor/tests/Presenters/SelectionStub.cs
@@ -1,151 +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
+// ****************************************************************
+// 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 || NET_4_5
+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
index be51ea9..98362e7 100644
--- a/src/ProjectEditor/tests/Presenters/XmlPresenterTests.cs
+++ b/src/ProjectEditor/tests/Presenters/XmlPresenterTests.cs
@@ -1,64 +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
+// ****************************************************************
+// 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 || NET_4_5
+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
index 07cff91..d04cc66 100644
--- a/src/ProjectEditor/tests/Properties/AssemblyInfo.cs
+++ b/src/ProjectEditor/tests/Properties/AssemblyInfo.cs
@@ -1,36 +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")]
+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
index ad1156a..dcbb9e8 100644
--- a/src/ProjectEditor/tests/Views/AddConfigurationDialogTests.cs
+++ b/src/ProjectEditor/tests/Views/AddConfigurationDialogTests.cs
@@ -1,89 +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);
-        }
-	}
-}
+// ****************************************************************
+// 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
index 013b370..1c141f9 100644
--- a/src/ProjectEditor/tests/Views/ConfigurationEditorViewTests.cs
+++ b/src/ProjectEditor/tests/Views/ConfigurationEditorViewTests.cs
@@ -1,27 +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);
-        }
-    }
-}
+// ****************************************************************
+// 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
index 5c85bd2..6554cb8 100644
--- a/src/ProjectEditor/tests/Views/PropertyViewTests.cs
+++ b/src/ProjectEditor/tests/Views/PropertyViewTests.cs
@@ -1,30 +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);
-                }
-            }
-        }
-    }
-}
+// ****************************************************************
+// 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
index a60e6e6..fa91ca6 100644
--- a/src/ProjectEditor/tests/nunit-editor.tests.build
+++ b/src/ProjectEditor/tests/nunit-editor.tests.build
@@ -1,63 +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>
-
+<?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
index 850da0a..bd8fbde 100644
--- a/src/ProjectEditor/tests/nunit-editor.tests.csproj
+++ b/src/ProjectEditor/tests/nunit-editor.tests.csproj
@@ -1,96 +1,134 @@
-<?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>
-  -->
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" 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>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </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/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/ProjectEditor/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..b09b646
Binary files /dev/null and b/src/ProjectEditor/tests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.csproj.FileListAbsolute.txt b/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..f491df2
--- /dev/null
+++ b/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit-editor.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nunit-editor.tests.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\ProjectEditor\tests\obj\Debug\nunit-editor.tests.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\ProjectEditor\tests\obj\Debug\nunit-editor.tests.dll
+D:\Dev\NUnit\nunit-2.6\work\src\ProjectEditor\tests\obj\Debug\nunit-editor.tests.pdb
diff --git a/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.csprojResolveAssemblyReference.cache b/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..5ff8a84
Binary files /dev/null and b/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.csprojResolveAssemblyReference.cache differ
diff --git a/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.pdb b/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.pdb
new file mode 100644
index 0000000..51b374b
Binary files /dev/null and b/src/ProjectEditor/tests/obj/Debug/nunit-editor.tests.pdb differ
diff --git a/src/ProjectEditor/tests/resources/BadProject.nunit b/src/ProjectEditor/tests/resources/BadProject.nunit
index 1f2408f..9004164 100644
--- a/src/ProjectEditor/tests/resources/BadProject.nunit
+++ b/src/ProjectEditor/tests/resources/BadProject.nunit
@@ -1,25 +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>
+  <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
index a9082d2..71ad149 100644
--- a/src/ProjectEditor/tests/resources/NUnitTests.nunit
+++ b/src/ProjectEditor/tests/resources/NUnitTests.nunit
@@ -1,25 +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>
+  <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/nunit20under21.config b/src/nunit20under21.config
index abe0c3a..271d15c 100644
--- a/src/nunit20under21.config
+++ b/src/nunit20under21.config
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8" ?> 
-<configuration>
-  
-  <!--  
-    In order to run NUnit 2.0 tests under NUnit 2.1, the test
-    configuration must include a redirect that instructs the 
-    runtime to use the NUnit 2.1 framework. You may copy the
-    section below into your test config file, or use this
-    file in it's entirety. 
-    
-    Note that additional redirects could be required if you
-    are running under a different version of the CLR than
-    the one for which your tests were built.
-  -->
-
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="nunit.framework"
-                          publicKeyToken="96d09a1eb7f44a77"
-                          culture="Neutral" />
-        <bindingRedirect oldVersion="2.0.6.0" newVersion="2.1.4.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-
-</configuration>
+<?xml version="1.0" encoding="utf-8" ?> 
+<configuration>
+  
+  <!--  
+    In order to run NUnit 2.0 tests under NUnit 2.1, the test
+    configuration must include a redirect that instructs the 
+    runtime to use the NUnit 2.1 framework. You may copy the
+    section below into your test config file, or use this
+    file in it's entirety. 
+    
+    Note that additional redirects could be required if you
+    are running under a different version of the CLR than
+    the one for which your tests were built.
+  -->
+
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="nunit.framework"
+                          publicKeyToken="96d09a1eb7f44a77"
+                          culture="Neutral" />
+        <bindingRedirect oldVersion="2.0.6.0" newVersion="2.1.4.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+
+</configuration>
diff --git a/src/nunit20under22.config b/src/nunit20under22.config
index dc58da5..2e2e7fd 100644
--- a/src/nunit20under22.config
+++ b/src/nunit20under22.config
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8" ?> 
-<configuration>
-  
-  <!--  
-    In order to run NUnit 2.0 or 2.1 tests under NUnit 2.2, the 
-    test configuration must include a redirect that instructs the 
-    runtime to use the NUnit 2.2 framework. You may copy the
-    section below into your test config file, or use this
-    file in it's entirety. 
-    
-    Note that additional redirects could be required if you
-    are running under a different version of the CLR than
-    the one for which your tests were built.
-  -->
-
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="nunit.framework"
-                          publicKeyToken="96d09a1eb7f44a77"
-                          culture="Neutral" />
-        <bindingRedirect oldVersion="2.0.6.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-
-</configuration>
+<?xml version="1.0" encoding="utf-8" ?> 
+<configuration>
+  
+  <!--  
+    In order to run NUnit 2.0 or 2.1 tests under NUnit 2.2, the 
+    test configuration must include a redirect that instructs the 
+    runtime to use the NUnit 2.2 framework. You may copy the
+    section below into your test config file, or use this
+    file in it's entirety. 
+    
+    Note that additional redirects could be required if you
+    are running under a different version of the CLR than
+    the one for which your tests were built.
+  -->
+
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="nunit.framework"
+                          publicKeyToken="96d09a1eb7f44a77"
+                          culture="Neutral" />
+        <bindingRedirect oldVersion="2.0.6.0" newVersion="2.2.0.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+
+</configuration>
diff --git a/src/nunit21under22.config b/src/nunit21under22.config
index eff1e5e..1ccb8cb 100644
--- a/src/nunit21under22.config
+++ b/src/nunit21under22.config
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8" ?> 
-<configuration>
-  
-  <!--  
-    In order to run NUnit 2.0 or 2.1 tests under NUnit 2.2, the 
-    test configuration must include a redirect that instructs the 
-    runtime to use the NUnit 2.2 framework. You may copy the
-    section below into your test config file, or use this
-    file in it's entirety. 
-    
-    Note that additional redirects could be required if you
-    are running under a different version of the CLR than
-    the one for which your tests were built.
-  -->
-
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="nunit.framework"
-                          publicKeyToken="96d09a1eb7f44a77"
-                          culture="Neutral" />
-        <bindingRedirect oldVersion="2.1.4.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-
-</configuration>
+<?xml version="1.0" encoding="utf-8" ?> 
+<configuration>
+  
+  <!--  
+    In order to run NUnit 2.0 or 2.1 tests under NUnit 2.2, the 
+    test configuration must include a redirect that instructs the 
+    runtime to use the NUnit 2.2 framework. You may copy the
+    section below into your test config file, or use this
+    file in it's entirety. 
+    
+    Note that additional redirects could be required if you
+    are running under a different version of the CLR than
+    the one for which your tests were built.
+  -->
+
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="nunit.framework"
+                          publicKeyToken="96d09a1eb7f44a77"
+                          culture="Neutral" />
+        <bindingRedirect oldVersion="2.1.4.0" newVersion="2.2.0.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+
+</configuration>
diff --git a/src/tests/mock-assembly/MockAssembly.cs b/src/tests/mock-assembly/MockAssembly.cs
index fb7eb1e..452db82 100644
--- a/src/tests/mock-assembly/MockAssembly.cs
+++ b/src/tests/mock-assembly/MockAssembly.cs
@@ -1,306 +1,304 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-using System;
-using NUnit.Framework;
-using NUnit.Core;
-
-namespace NUnit.Tests
-{
-	namespace Assemblies
-	{
-		/// <summary>
-		/// Constant definitions for the mock-assembly dll.
-		/// </summary>
-		public class MockAssembly
-        {
-#if CLR_2_0 || CLR_4_0
-            public static int Classes = 9;
-#else
-            public static int Classes = 8;
-#endif
-            public static int NamespaceSuites = 6; // assembly, NUnit, Tests, Assemblies, Singletons, TestAssembly
-
-			public static int Tests = MockTestFixture.Tests 
-						+ Singletons.OneTestCase.Tests 
-						+ TestAssembly.MockTestFixture.Tests 
-						+ IgnoredFixture.Tests
-						+ ExplicitFixture.Tests
-						+ BadFixture.Tests
-						+ FixtureWithTestCases.Tests
-						+ ParameterizedFixture.Tests
-						+ GenericFixtureConstants.Tests;
-			
-            public static int Suites = MockTestFixture.Suites 
-						+ Singletons.OneTestCase.Suites
-						+ TestAssembly.MockTestFixture.Suites 
-						+ IgnoredFixture.Suites
-						+ ExplicitFixture.Suites
-						+ BadFixture.Suites
-						+ FixtureWithTestCases.Suites
-						+ ParameterizedFixture.Suites
-						+ GenericFixtureConstants.Suites
-						+ NamespaceSuites;
-			
-			public static readonly int Nodes = Tests + Suites;
-			
-			public static int ExplicitFixtures = 1;
-			public static int SuitesRun = Suites - ExplicitFixtures;
-
-			public static int Ignored = MockTestFixture.Ignored + IgnoredFixture.Tests;
-			public static int Explicit = MockTestFixture.Explicit + ExplicitFixture.Tests;
-			public static int NotRunnable = MockTestFixture.NotRunnable + BadFixture.Tests;
-			public static int NotRun = Ignored + Explicit + NotRunnable;
-		    public static int TestsRun = Tests - NotRun;
-			public static int ResultCount = Tests - Explicit;
-
-			public static int Errors = MockTestFixture.Errors;
-            public static int Failures = MockTestFixture.Failures;
-			public static int ErrorsAndFailures = Errors + Failures;
-
-			public static int Categories = MockTestFixture.Categories;
-
-            public static string AssemblyPath = AssemblyHelper.GetAssemblyPath(typeof(MockAssembly));
-		}
-
-		public class MockSuite
-		{
-			[Suite]
-			public static TestSuite Suite
-			{
-				get
-				{
-					return new TestSuite( "MockSuite" );
-				}
-			}
-		}
-
-		[TestFixture(Description="Fake Test Fixture")]
-		[Category("FixtureCategory")]
-		public class MockTestFixture
-		{
-			public static readonly int Tests = 11;
-			public static readonly int Suites = 1;
-
-			public static readonly int Ignored = 1;
-			public static readonly int Explicit = 1;
-			public static readonly int NotRunnable = 2;
-			public static readonly int NotRun = Ignored + Explicit + NotRunnable;
-		    public static readonly int TestsRun = Tests - NotRun;
-			public static readonly int ResultCount = Tests - Explicit;
-
-            public static readonly int Failures = 1;
-            public static readonly int Errors = 1;
-			public static readonly int ErrorsAndFailures = Errors + Failures;
-
-			public static readonly int Categories = 5;
-		    public static readonly int MockCategoryTests = 2;
-
-			[Test(Description="Mock Test #1")]
-			public void MockTest1()
-			{}
-
-			[Test]
-			[Category("MockCategory")]
-			[Property("Severity","Critical")]
-            [Description("This is a really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really long description")]
-            public void MockTest2()
-			{}
-
-			[Test]
-			[Category("MockCategory")]
-			[Category("AnotherCategory")]
-			public void MockTest3()
-            { Assert.Pass("Succeeded!"); }
-
-            [Test]
-            protected static void MockTest5()
-            {}
-
-            [Test]
-            public void FailingTest()
-            {
-                Assert.Fail("Intentional failure");
-            }
-
-		    [Test, Property("TargetMethod", "SomeClassName"), Property("Size", 5), /*Property("TargetType", typeof( System.Threading.Thread ))*/]
-			public void TestWithManyProperties()
-			{}
-
-			[Test]
-			[Ignore("ignoring this test method for now")]
-			[Category("Foo")]
-			public void MockTest4()
-			{}
-
-			[Test, Explicit]
-			[Category( "Special" )]
-			public void ExplicitlyRunTest()
-			{}
-
-			[Test]
-			public void NotRunnableTest( int a, int b)
-			{
-			}
-
-            [Test]
-            public void InconclusiveTest()
-            {
-                Assert.Inconclusive("No valid data");
-            }
-
-            [Test]
-            public void TestWithException()
-            {
-                MethodThrowsException();
-            }
-
-            private void MethodThrowsException()
-            {
-                throw new ApplicationException("Intentional Exception");
-            }
-		}
-	}
-
-	namespace Singletons
-	{
-		[TestFixture]
-		public class OneTestCase
-		{
-			public static readonly int Tests = 1;
-			public static readonly int Suites = 1;		
-
-			[Test]
-			public virtual void TestCase() 
-			{}
-		}
-	}
-
-	namespace TestAssembly
-	{
-		[TestFixture]
-		public class MockTestFixture
-		{
-			public static readonly int Tests = 1;
-			public static readonly int Suites = 1;
-
-			[Test]
-			public void MyTest()
-			{
-			}
-		}
-	}
-
-	[TestFixture, Ignore]
-	public class IgnoredFixture
-	{
-		public static readonly int Tests = 3;
-		public static readonly int Suites = 1;
-
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-		
-		[Test]
-		public void Test3() { }
-	}
-
-	[TestFixture,Explicit]
-	public class ExplicitFixture
-	{
-		public static readonly int Tests = 2;
-		public static readonly int Suites = 1;
-        public static readonly int Nodes = Tests + Suites;
-
-		[Test]
-		public void Test1() { }
-
-		[Test]
-		public void Test2() { }
-	}
-
-	[TestFixture]
-	public class BadFixture
-	{
-		public static readonly int Tests = 1;
-		public static readonly int Suites = 1;
-
-		public BadFixture(int val) { }
-
-		[Test]
-		public void SomeTest() { }
-	}
-	
-	[TestFixture]
-	public class FixtureWithTestCases
-    {
-#if 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;
-		public static readonly int Suites = 2;
-#endif
-		
-		[TestCase(2, 2, Result=4)]
-		[TestCase(9, 11, Result=20)]
-		public int MethodWithParameters(int x, int y)
-		{
-			return x+y;
-        }
-
-#if CLR_2_0 || CLR_4_0
-        [TestCase(2, 4)]
-		[TestCase(9.2, 11.7)]
-		public void GenericMethod<T>(T x, T y)
-		{
-		}
-#endif
-	}
-	
-	[TestFixture(5)]
-	[TestFixture(42)]
-	public class ParameterizedFixture
-	{
-		public static readonly int Tests = 4;
-		public static readonly int Suites = 3;
-
-		public ParameterizedFixture(int num) { }
-		
-		[Test]
-		public void Test1() { }
-		
-		[Test]
-		public void Test2() { }
-	}
-	
-	public class GenericFixtureConstants
-    {
-#if 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 CLR_2_0 || CLR_4_0
-    [TestFixture(5)]
-	[TestFixture(11.5)]
-	public class GenericFixture<T>
-	{
-		public GenericFixture(T num){ }
-		
-		[Test]
-		public void Test1() { }
-		
-		[Test]
-		public void Test2() { }
-	}
-#endif
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+using System;
+using NUnit.Framework;
+using NUnit.Core;
+
+namespace NUnit.Tests
+{
+	namespace Assemblies
+	{
+		/// <summary>
+		/// Constant definitions for the mock-assembly dll.
+		/// </summary>
+		public class MockAssembly
+        {
+#if CLR_2_0 || CLR_4_0
+            public static int Classes = 9;
+#else
+            public static int Classes = 8;
+#endif
+            public static int NamespaceSuites = 6; // assembly, NUnit, Tests, Assemblies, Singletons, TestAssembly
+
+			public static int Tests = MockTestFixture.Tests 
+						+ Singletons.OneTestCase.Tests 
+						+ TestAssembly.MockTestFixture.Tests 
+						+ IgnoredFixture.Tests
+						+ ExplicitFixture.Tests
+						+ BadFixture.Tests
+						+ FixtureWithTestCases.Tests
+						+ ParameterizedFixture.Tests
+						+ GenericFixtureConstants.Tests;
+			
+            public static int Suites = MockTestFixture.Suites 
+						+ Singletons.OneTestCase.Suites
+						+ TestAssembly.MockTestFixture.Suites 
+						+ IgnoredFixture.Suites
+						+ ExplicitFixture.Suites
+						+ BadFixture.Suites
+						+ FixtureWithTestCases.Suites
+						+ ParameterizedFixture.Suites
+						+ GenericFixtureConstants.Suites
+						+ NamespaceSuites;
+			
+			public static readonly int Nodes = Tests + Suites;
+			
+			public static int ExplicitFixtures = 1;
+			public static int SuitesRun = Suites - ExplicitFixtures;
+
+			public static int Ignored = MockTestFixture.Ignored + IgnoredFixture.Tests;
+			public static int Explicit = MockTestFixture.Explicit + ExplicitFixture.Tests;
+			public static int NotRunnable = MockTestFixture.NotRunnable + BadFixture.Tests;
+			public static int NotRun = Ignored + Explicit + NotRunnable;
+		    public static int TestsRun = Tests - NotRun;
+			public static int ResultCount = Tests - Explicit;
+
+			public static int Errors = MockTestFixture.Errors;
+            public static int Failures = MockTestFixture.Failures;
+
+			public static int Categories = MockTestFixture.Categories;
+
+            public static string AssemblyPath = AssemblyHelper.GetAssemblyPath(typeof(MockAssembly));
+		}
+
+		public class MockSuite
+		{
+			[Suite]
+			public static TestSuite Suite
+			{
+				get
+				{
+					return new TestSuite( "MockSuite" );
+				}
+			}
+		}
+
+		[TestFixture(Description="Fake Test Fixture")]
+		[Category("FixtureCategory")]
+		public class MockTestFixture
+		{
+			public static readonly int Tests = 11;
+			public static readonly int Suites = 1;
+
+			public static readonly int Ignored = 1;
+			public static readonly int Explicit = 1;
+			public static readonly int NotRunnable = 2;
+			public static readonly int NotRun = Ignored + Explicit + NotRunnable;
+		    public static readonly int TestsRun = Tests - NotRun;
+			public static readonly int ResultCount = Tests - Explicit;
+
+            public static readonly int Failures = 1;
+            public static readonly int Errors = 1;
+
+			public static readonly int Categories = 5;
+		    public static readonly int MockCategoryTests = 2;
+
+			[Test(Description="Mock Test #1")]
+			public void MockTest1()
+			{}
+
+			[Test]
+			[Category("MockCategory")]
+			[Property("Severity","Critical")]
+            [Description("This is a really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really, really long description")]
+            public void MockTest2()
+			{}
+
+			[Test]
+			[Category("MockCategory")]
+			[Category("AnotherCategory")]
+			public void MockTest3()
+            { Assert.Pass("Succeeded!"); }
+
+            [Test]
+            protected static void MockTest5()
+            {}
+
+            [Test]
+            public void FailingTest()
+            {
+                Assert.Fail("Intentional failure");
+            }
+
+		    [Test, Property("TargetMethod", "SomeClassName"), Property("Size", 5), /*Property("TargetType", typeof( System.Threading.Thread ))*/]
+			public void TestWithManyProperties()
+			{}
+
+			[Test]
+			[Ignore("ignoring this test method for now")]
+			[Category("Foo")]
+			public void MockTest4()
+			{}
+
+			[Test, Explicit]
+			[Category( "Special" )]
+			public void ExplicitlyRunTest()
+			{}
+
+			[Test]
+			public void NotRunnableTest( int a, int b)
+			{
+			}
+
+            [Test]
+            public void InconclusiveTest()
+            {
+                Assert.Inconclusive("No valid data");
+            }
+
+            [Test]
+            public void TestWithException()
+            {
+                MethodThrowsException();
+            }
+
+            private void MethodThrowsException()
+            {
+                throw new ApplicationException("Intentional Exception");
+            }
+		}
+	}
+
+	namespace Singletons
+	{
+		[TestFixture]
+		public class OneTestCase
+		{
+			public static readonly int Tests = 1;
+			public static readonly int Suites = 1;		
+
+			[Test]
+			public virtual void TestCase() 
+			{}
+		}
+	}
+
+	namespace TestAssembly
+	{
+		[TestFixture]
+		public class MockTestFixture
+		{
+			public static readonly int Tests = 1;
+			public static readonly int Suites = 1;
+
+			[Test]
+			public void MyTest()
+			{
+			}
+		}
+	}
+
+	[TestFixture, Ignore]
+	public class IgnoredFixture
+	{
+		public static readonly int Tests = 3;
+		public static readonly int Suites = 1;
+
+		[Test]
+		public void Test1() { }
+
+		[Test]
+		public void Test2() { }
+		
+		[Test]
+		public void Test3() { }
+	}
+
+	[TestFixture,Explicit]
+	public class ExplicitFixture
+	{
+		public static readonly int Tests = 2;
+		public static readonly int Suites = 1;
+        public static readonly int Nodes = Tests + Suites;
+
+		[Test]
+		public void Test1() { }
+
+		[Test]
+		public void Test2() { }
+	}
+
+	[TestFixture]
+	public class BadFixture
+	{
+		public static readonly int Tests = 1;
+		public static readonly int Suites = 1;
+
+		public BadFixture(int val) { }
+
+		[Test]
+		public void SomeTest() { }
+	}
+	
+	[TestFixture]
+	public class FixtureWithTestCases
+    {
+#if 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;
+		public static readonly int Suites = 2;
+#endif
+		
+		[TestCase(2, 2, Result=4)]
+		[TestCase(9, 11, Result=20)]
+		public int MethodWithParameters(int x, int y)
+		{
+			return x+y;
+        }
+
+#if CLR_2_0 || CLR_4_0
+        [TestCase(2, 4)]
+		[TestCase(9.2, 11.7)]
+		public void GenericMethod<T>(T x, T y)
+		{
+		}
+#endif
+	}
+	
+	[TestFixture(5)]
+	[TestFixture(42)]
+	public class ParameterizedFixture
+	{
+		public static readonly int Tests = 4;
+		public static readonly int Suites = 3;
+
+		public ParameterizedFixture(int num) { }
+		
+		[Test]
+		public void Test1() { }
+		
+		[Test]
+		public void Test2() { }
+	}
+	
+	public class GenericFixtureConstants
+    {
+#if 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 CLR_2_0 || CLR_4_0
+    [TestFixture(5)]
+	[TestFixture(11.5)]
+	public class GenericFixture<T>
+	{
+		public GenericFixture(T num){ }
+		
+		[Test]
+		public void Test1() { }
+		
+		[Test]
+		public void Test2() { }
+	}
+#endif
+}
diff --git a/src/tests/mock-assembly/mock-assembly.build b/src/tests/mock-assembly/mock-assembly.build
index 7ec6c1e..7b574ea 100644
--- a/src/tests/mock-assembly/mock-assembly.build
+++ b/src/tests/mock-assembly/mock-assembly.build
@@ -1,30 +1,30 @@
-<?xml version="1.0"?>
-<project name="MockAssembly" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-      output="${current.test.dir}/mock-assembly.dll" 
-      debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="MockAssembly.cs"/>
-        <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"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/tests/mock-assembly">
-      <fileset>
-        <include name="MockAssembly.cs"/>
-        <include name="mock-assembly.csproj"/>
-        <include name="mock-assembly.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="MockAssembly" default="build" basedir=".">
+
+  <target name="build">
+    <csc target="library" 
+      output="${current.test.dir}/mock-assembly.dll" 
+      debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <include name="MockAssembly.cs"/>
+        <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"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/tests/mock-assembly">
+      <fileset>
+        <include name="MockAssembly.cs"/>
+        <include name="mock-assembly.csproj"/>
+        <include name="mock-assembly.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/tests/mock-assembly/mock-assembly.csproj b/src/tests/mock-assembly/mock-assembly.csproj
index 3e35378..4bf1863 100644
--- a/src/tests/mock-assembly/mock-assembly.csproj
+++ b/src/tests/mock-assembly/mock-assembly.csproj
@@ -1,101 +1,135 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>mock-assembly</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.Tests</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Name>nunit.framework.dll</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="MockAssembly.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="mock-assembly.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2E368281-3BA8-4050-B05E-0E0E43F8F446}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>mock-assembly</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.Tests</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="MockAssembly.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="mock-assembly.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/tests/mock-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/tests/mock-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..a9e9883
Binary files /dev/null and b/src/tests/mock-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/tests/mock-assembly/obj/Debug/mock-assembly.csproj.FileListAbsolute.txt b/src/tests/mock-assembly/obj/Debug/mock-assembly.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..7489b00
--- /dev/null
+++ b/src/tests/mock-assembly/obj/Debug/mock-assembly.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\mock-assembly.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\mock-assembly.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\mock-assembly\obj\Debug\mock-assembly.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\mock-assembly\obj\Debug\mock-assembly.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\mock-assembly\obj\Debug\mock-assembly.csprojResolveAssemblyReference.cache
diff --git a/src/tests/mock-assembly/obj/Debug/mock-assembly.csprojResolveAssemblyReference.cache b/src/tests/mock-assembly/obj/Debug/mock-assembly.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..d2ed3a4
Binary files /dev/null and b/src/tests/mock-assembly/obj/Debug/mock-assembly.csprojResolveAssemblyReference.cache differ
diff --git a/src/tests/mock-assembly/obj/Debug/mock-assembly.pdb b/src/tests/mock-assembly/obj/Debug/mock-assembly.pdb
new file mode 100644
index 0000000..5e122ae
Binary files /dev/null and b/src/tests/mock-assembly/obj/Debug/mock-assembly.pdb differ
diff --git a/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs b/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs
index d16c8b4..8adb870 100644
--- a/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs
+++ b/src/tests/nonamespace-assembly/NoNamespaceTestFixture.cs
@@ -1,30 +1,30 @@
-// ****************************************************************
-// 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 NUnit.Framework;
-
-[TestFixture]
-public class NoNamespaceTestFixture
-{
-	public static readonly int Tests = 3;
-
-    public static readonly string AssemblyPath = NUnit.Core.AssemblyHelper.GetAssemblyPath(typeof(NoNamespaceTestFixture));
-
-	[Test]
-	public void Test1()
-	{
-	}
-
-	[Test]
-	public void Test2()
-	{
-	}
-
-	[Test]
-	public void Test3()
-	{
-	}
-}
+// ****************************************************************
+// 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 NUnit.Framework;
+
+[TestFixture]
+public class NoNamespaceTestFixture
+{
+	public static readonly int Tests = 3;
+
+    public static readonly string AssemblyPath = NUnit.Core.AssemblyHelper.GetAssemblyPath(typeof(NoNamespaceTestFixture));
+
+	[Test]
+	public void Test1()
+	{
+	}
+
+	[Test]
+	public void Test2()
+	{
+	}
+
+	[Test]
+	public void Test3()
+	{
+	}
+}
diff --git a/src/tests/nonamespace-assembly/nonamespace-assembly.build b/src/tests/nonamespace-assembly/nonamespace-assembly.build
index 2be92ca..17aa150 100644
--- a/src/tests/nonamespace-assembly/nonamespace-assembly.build
+++ b/src/tests/nonamespace-assembly/nonamespace-assembly.build
@@ -1,29 +1,29 @@
-<?xml version="1.0"?>
-<project name="NoNamespaceAssembly" default="build" basedir=".">
-
-  <target name="build">
-    <csc target="library" 
-       output="${current.test.dir}/nonamespace-assembly.dll" 
-       debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <include name="NoNamespaceTestFixture.cs"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/tests/nonamespace-assembly">
-      <fileset>
-        <include name="NoNamespaceTestFixture.cs"/>
-        <include name="nonamespace-assembly.csproj"/>
-        <include name="nonamespace-assembly.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="NoNamespaceAssembly" default="build" basedir=".">
+
+  <target name="build">
+    <csc target="library" 
+       output="${current.test.dir}/nonamespace-assembly.dll" 
+       debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <include name="NoNamespaceTestFixture.cs"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/tests/nonamespace-assembly">
+      <fileset>
+        <include name="NoNamespaceTestFixture.cs"/>
+        <include name="nonamespace-assembly.csproj"/>
+        <include name="nonamespace-assembly.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/tests/nonamespace-assembly/nonamespace-assembly.csproj b/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
index 02859a8..c940edf 100644
--- a/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
+++ b/src/tests/nonamespace-assembly/nonamespace-assembly.csproj
@@ -1,96 +1,130 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>nonamespace-assembly</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>nonamespace_assembly</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Name>nunit.core.dll</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="NoNamespaceTestFixture.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="nonamespace-assembly.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>nonamespace-assembly</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>nonamespace_assembly</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </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>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Name>nunit.core.dll</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="NoNamespaceTestFixture.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="nonamespace-assembly.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/tests/nonamespace-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/tests/nonamespace-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..7c51ba9
Binary files /dev/null and b/src/tests/nonamespace-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.csproj.FileListAbsolute.txt b/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..71505fe
--- /dev/null
+++ b/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nonamespace-assembly.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\nonamespace-assembly.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\nonamespace-assembly\obj\Debug\nonamespace-assembly.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\tests\nonamespace-assembly\obj\Debug\nonamespace-assembly.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\nonamespace-assembly\obj\Debug\nonamespace-assembly.pdb
diff --git a/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.csprojResolveAssemblyReference.cache b/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..155cde0
Binary files /dev/null and b/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.csprojResolveAssemblyReference.cache differ
diff --git a/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.pdb b/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.pdb
new file mode 100644
index 0000000..75dc88b
Binary files /dev/null and b/src/tests/nonamespace-assembly/obj/Debug/nonamespace-assembly.pdb differ
diff --git a/src/tests/test-assembly-net45/AsyncDummyFixture.cs b/src/tests/test-assembly-net45/AsyncDummyFixture.cs
new file mode 100644
index 0000000..d79f543
--- /dev/null
+++ b/src/tests/test-assembly-net45/AsyncDummyFixture.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Threading.Tasks;
+using NUnit.Framework;
+
+namespace test_assembly_net45
+{
+	public class AsyncDummyFixture
+	{
+		[Test]
+		public async void AsyncVoidTest()
+		{
+            await Task.Yield();
+		}
+
+		[Test]
+		public async Task AsyncTaskTest()
+		{
+			await Task.Yield();
+		}
+
+		[Test]
+		public async Task<int> AsyncTaskTTest()
+		{
+			return await Task.FromResult(1);
+		}
+
+		[TestCase]
+		public async void AsyncVoidTestCaseWithoutResultCheck()
+		{
+			await Task.Run(() => 1);
+		}
+
+		[TestCase]
+		public async Task AsyncTaskTestCaseWithoutResultCheck()
+		{
+			await Task.Run(() => 1);
+		}
+
+		[TestCase]
+		public async Task<int> AsyncTaskTTestCaseWithoutResultCheck()
+		{
+			return await Task.Run(() => 1);
+		}
+
+		[TestCase(Result = 1)]
+		public async void AsyncVoidTestCaseWithResultCheck()
+		{
+			await Task.Run(() => 1);
+		}
+
+		[TestCase(Result = 1)]
+		public async Task AsyncTaskTestCaseWithResultCheck()
+		{
+			await Task.Run(() => 1);
+		}
+
+		[TestCase(Result = 1)]
+		public async Task<int> AsyncTaskTTestCaseWithResultCheck()
+		{
+			return await Task.Run(() => 1);
+		}
+
+		[TestCase(ExpectedException = typeof(Exception))]
+		public async Task<int> AsyncTaskTTestCaseExpectedExceptionWithoutResultCheck()
+		{
+			return await Throw();
+		}
+
+		private async Task<int> Throw()
+		{
+			return await Task.Run(() =>
+			{
+				throw new InvalidOperationException();
+				return 1;
+			});
+		}
+
+		[Test]
+		public Task<int> NonAsyncTaskWithResult()
+		{
+			return Task.FromResult(1);
+		}
+
+		[Test]
+		public Task NonAsyncTask()
+		{
+			return Task.Delay(0);
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/tests/test-assembly-net45/AsyncRealFixture.cs b/src/tests/test-assembly-net45/AsyncRealFixture.cs
new file mode 100644
index 0000000..af9418d
--- /dev/null
+++ b/src/tests/test-assembly-net45/AsyncRealFixture.cs
@@ -0,0 +1,298 @@
+using System;
+using System.Threading.Tasks;
+using NUnit.Framework;
+
+namespace test_assembly_net45
+{
+	public class AsyncRealFixture
+	{
+		[Test]
+		public async void VoidTestSuccess()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(1, result);
+		}
+
+		[Test]
+		public async void VoidTestFailure()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(2, result);
+		}
+
+		[Test]
+		public async void VoidTestError()
+		{
+			await ThrowException();
+
+			Assert.Fail("Should never get here");
+		}
+
+		[Test]
+		[ExpectedException(typeof(InvalidOperationException))]
+		public async void VoidTestExpectedException()
+		{
+			await ThrowException();
+		}
+
+		[Test]
+		public async Task TaskTestSuccess()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(1, result);
+		}
+
+		[Test]
+		public async Task TaskTestFailure()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(2, result);
+		}
+
+		[Test]
+		public async Task TaskTestError()
+		{
+			await ThrowException();
+
+			Assert.Fail("Should never get here");
+		}
+
+		[Test]
+		[ExpectedException(typeof(InvalidOperationException))]
+		public async Task TaskTestExpectedException()
+		{
+			await ThrowException();
+		}
+
+		[TestCase(Result = 1)]
+		public async Task<int> TaskTTestCaseWithResultCheckSuccess()
+		{
+			return await ReturnOne();
+		}
+
+		[TestCase(Result = 2)]
+		public async Task<int> TaskTTestCaseWithResultCheckFailure()
+		{
+			return await ReturnOne();
+		}
+
+		[TestCase(Result = 0)]
+		public async Task<int> TaskTTestCaseWithResultCheckError()
+		{
+			return await ThrowException();
+		}
+
+		[TestCase(Result = null)]
+		public async Task<object> TaskTTestCaseWithResultCheckSuccessReturningNull()
+		{
+			return await Task.Run(() => (object)null);
+		}
+
+		[TestCase(ExpectedException = typeof(InvalidOperationException))]
+		public async Task<object> TaskTTestCaseWithoutResultCheckExpectedExceptionSuccess()
+		{
+			return await ThrowException();
+		}
+
+		[Test]
+		public async void Yield()
+		{
+			await Task.Yield();
+		}
+
+		[Test]
+		public async void NestedVoidTestSuccess()
+		{
+			var result = await Task.Run(async () => await ReturnOne());
+
+			Assert.AreEqual(1, result);
+		}
+
+		[Test]
+		public async void NestedVoidTestFailure()
+		{
+			var result = await Task.Run(async () => await ReturnOne());
+
+			Assert.AreEqual(2, result);
+		}
+
+		[Test]
+		public async void NestedVoidTestError()
+		{
+			await Task.Run(async () => await ThrowException());
+
+			Assert.Fail("Should not get here");
+		}
+
+		[Test]
+		public async Task NestedTaskTestSuccess()
+		{
+			var result = await Task.Run(async () => await ReturnOne());
+
+			Assert.AreEqual(1, result);
+		}
+
+		[Test]
+		public async Task NestedTaskTestFailure()
+		{
+			var result = await Task.Run(async () => await ReturnOne());
+
+			Assert.AreEqual(2, result);
+		}
+
+		[Test]
+		public async Task NestedTaskTestError()
+		{
+			await Task.Run(async () => await ThrowException());
+
+			Assert.Fail("Should never get here");
+		}
+
+		[Test]
+		public async void VoidTestMultipleSuccess()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(await ReturnOne(), result);
+		}
+
+		[Test]
+		public async void VoidTestMultipleFailure()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(await ReturnOne() + 1, result);
+		}
+
+		[Test]
+		public async void VoidTestMultipleError()
+		{
+			await ReturnOne();
+			await ThrowException();
+
+			Assert.Fail("Should never get here");
+		}
+
+		[Test]
+		public async Task TaskTestMultipleSuccess()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(await ReturnOne(), result);
+		}
+
+		[Test]
+		public async Task TaskTestMultipleFailure()
+		{
+			var result = await ReturnOne();
+
+			Assert.AreEqual(await ReturnOne() + 1, result);
+		}
+
+		[Test]
+		public async Task TaskTestMultipleError()
+		{
+			await ReturnOne();
+			await ThrowException();
+
+			Assert.Fail("Should never get here");
+		}
+
+		[Test]
+		public async void VoidCheckTestContextAcrossTasks()
+		{
+			var testName = await GetTestNameFromContext();
+
+			Assert.IsNotNull(testName);
+			Assert.AreEqual(testName, TestContext.CurrentContext.Test.Name);
+		}
+
+		[Test]
+		public async Task TaskCheckTestContextAcrossTasks()
+		{
+			var testName = await GetTestNameFromContext();
+
+			Assert.IsNotNull(testName);
+			Assert.AreEqual(testName, TestContext.CurrentContext.Test.Name);
+		}
+
+		[Test]
+		public async void VoidCheckTestContextWithinTestBody()
+		{
+			var testName = TestContext.CurrentContext.Test.Name;
+
+			await ReturnOne();
+
+			Assert.IsNotNull(testName);
+			Assert.AreEqual(testName, TestContext.CurrentContext.Test.Name);
+		}
+
+		[Test]
+		public async Task TaskCheckTestContextWithinTestBody()
+		{
+			var testName = TestContext.CurrentContext.Test.Name;
+
+			await ReturnOne();
+
+			Assert.IsNotNull(testName);
+			Assert.AreEqual(testName, TestContext.CurrentContext.Test.Name);
+		}
+
+		[Test]
+		[ExpectedException(typeof(InvalidOperationException))]
+		public async void VoidAsyncVoidChildCompletingEarlierThanTest()
+		{
+			AsyncVoidMethod();
+
+			await ThrowExceptionIn(TimeSpan.FromSeconds(1));
+		}
+
+		[Test]
+		[ExpectedException(typeof(InvalidOperationException))]
+		public async void VoidAsyncVoidChildThrowingImmediately()
+		{
+			AsyncVoidThrowException();
+
+			await Task.Run(() => Assert.Fail("Should never invoke this"));
+		}
+
+		private static async void AsyncVoidThrowException()
+		{
+			await Task.Run(() => { throw new InvalidOperationException(); });
+		}
+
+		private static async Task ThrowExceptionIn(TimeSpan delay)
+		{
+			await Task.Delay(delay);
+			throw new InvalidOperationException();
+		}
+
+		private static async void AsyncVoidMethod()
+		{
+			await Task.Yield();
+		}
+
+		private static Task<string> GetTestNameFromContext()
+		{
+			return Task.Run(() => TestContext.CurrentContext.Test.Name);
+		}
+
+		private static Task<int> ReturnOne()
+		{
+			return Task.Run(() => 1);
+		}
+
+		private static Task<int> ThrowException()
+		{
+			return Task.Run(() =>
+			{
+				throw new InvalidOperationException();
+				return 1;
+			});
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/tests/test-assembly-net45/bin/Debug/nunit.framework.pdb b/src/tests/test-assembly-net45/bin/Debug/nunit.framework.pdb
new file mode 100644
index 0000000..b485c6f
Binary files /dev/null and b/src/tests/test-assembly-net45/bin/Debug/nunit.framework.pdb differ
diff --git a/src/tests/test-assembly-net45/bin/Debug/nunit.framework.xml b/src/tests/test-assembly-net45/bin/Debug/nunit.framework.xml
new file mode 100644
index 0000000..d08d602
--- /dev/null
+++ b/src/tests/test-assembly-net45/bin/Debug/nunit.framework.xml
@@ -0,0 +1,10960 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>nunit.framework</name>
+    </assembly>
+    <members>
+        <member name="T:NUnit.Framework.TestDelegate">
+            <summary>
+            Delegate used by tests that execute code and
+            capture any thrown exception.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Assert">
+            <summary>
+            The Assert class contains a collection of static methods that
+            implement the most common assertions used in NUnit.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.#ctor">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Equals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ReferenceEquals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Pass(System.String,System.Object[])">
+            <summary>
+            Throws a <see cref="T:NUnit.Framework.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="T:NUnit.Framework.AssertionException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Pass(System.String)">
+            <summary>
+            Throws a <see cref="T:NUnit.Framework.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="T:NUnit.Framework.AssertionException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Pass">
+            <summary>
+            Throws a <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Fail(System.String,System.Object[])">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.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="T:NUnit.Framework.AssertionException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Fail(System.String)">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.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="T:NUnit.Framework.AssertionException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Fail">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.AssertionException"/>. 
+            This is used by the other Assert functions. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Ignore(System.String,System.Object[])">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.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="T:NUnit.Framework.AssertionException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Ignore(System.String)">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.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="T:NUnit.Framework.AssertionException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Ignore">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.IgnoreException"/>. 
+            This causes the test to be reported as ignored. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Inconclusive(System.String,System.Object[])">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.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="T:NUnit.Framework.InconclusiveException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Inconclusive(System.String)">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.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="T:NUnit.Framework.InconclusiveException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Inconclusive">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.InconclusiveException"/>. 
+            This causes the test to be reported as Inconclusive. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual 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 to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual 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 to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.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="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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.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="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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint)">
+            <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 to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <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 to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <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 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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <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="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <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="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <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="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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <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 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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate,System.String)">
+            <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 TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate)">
+            <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 TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expectedExceptionType">The exception Type expected</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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expectedExceptionType">The exception Type expected</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expectedExceptionType">The exception Type expected</param>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <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 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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate,System.String)">
+            <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 TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate)">
+            <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 TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws an exception when called
+            and returns it.
+            </summary>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate does not throw an exception
+            </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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate does not throw an exception.
+            </summary>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate does not throw an exception.
+            </summary>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.True(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.True(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.True(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsTrue(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsTrue(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsTrue(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.False(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.False(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.False(System.Boolean)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsFalse(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsFalse(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsFalse(System.Boolean)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.NotNull(System.Object,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.NotNull(System.Object,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.NotNull(System.Object)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNull(System.Object,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNull(System.Object,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNull(System.Object)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Null(System.Object,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Null(System.Object,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Null(System.Object)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNull(System.Object,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNull(System.Object,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNull(System.Object)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that two ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that two ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that two ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that two longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that two longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that two longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that two unsigned ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that two unsigned ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that two unsigned longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that two unsigned longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that two decimals are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that two decimals are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that two decimals are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double)">
+            <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="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double)">
+            <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="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object)">
+            <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="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that two ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that two ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that two ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that two longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that two longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that two longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that two unsigned ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that two unsigned ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that two unsigned longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that two unsigned longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that two decimals are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that two decimals are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that two decimals are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that two floats are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that two floats are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Single,System.Single)">
+            <summary>
+            Verifies that two floats are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that two doubles are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that two doubles are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Double,System.Double)">
+            <summary>
+            Verifies that two doubles are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object)">
+            <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="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreSame(System.Object,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that two objects refer to the same object. If they
+            are not the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreSame(System.Object,System.Object,System.String)">
+            <summary>
+            Asserts that two objects refer to the same object. If they
+            are not the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreSame(System.Object,System.Object)">
+            <summary>
+            Asserts that two objects refer to the same object. If they
+            are not the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that two objects do not refer to the same object. If they
+            are the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object,System.String)">
+            <summary>
+            Asserts that two objects do not refer to the same object. If they
+            are the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object)">
+            <summary>
+            Asserts that two objects do not refer to the same object. If they
+            are the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Double,System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Double,System.String)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Double)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double},System.String,System.Object[])">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double},System.String)">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double})">
+            <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="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is empty - that is equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is empty - that is equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.String)">
+            <summary>
+            Assert that a string is empty - that is equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is not empty - that is not equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is not empty - that is not equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNullOrEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is either null or equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNullOrEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is either null or equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNullOrEmpty(System.String)">
+            <summary>
+            Assert that a string is either null or equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNullOrEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is not null or empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNullOrEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is not null or empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNullOrEmpty(System.String)">
+            <summary>
+            Assert that a string is not null or empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOfType(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOfType(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOfType(System.Type,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOfType(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOfType(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOfType(System.Type,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is contained in a list.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The list to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection,System.String)">
+            <summary>
+            Asserts that an object is contained in a list.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The list to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AssertDoublesAreEqual(System.Double,System.Double,System.Double,System.String,System.Object[])">
+            <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>
+        </member>
+        <member name="P:NUnit.Framework.Assert.Counter">
+            <summary>
+            Gets the number of assertions executed so far and 
+            resets the counter to zero.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.AssertionHelper">
+            <summary>
+            AssertionHelper is an optional base class for user tests,
+            allowing the use of shorter names for constraints and
+            asserts and avoiding conflict with the definition of 
+            <see cref="T:NUnit.Framework.Is"/>, from which it inherits much of its
+            behavior, in certain mock object frameworks.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintFactory">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Exactly(System.Int32)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Property(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Attribute(System.Type)">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Attribute``1">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.EqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests two items for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SameAs(System.Object)">
+            <summary>
+            Returns a constraint that tests that two references are the same object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.GreaterThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.GreaterThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AtLeast(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.LessThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.LessThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AtMost(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.TypeOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.TypeOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOfType(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOfType``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableFrom(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableFrom``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableTo(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableTo``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.EquivalentTo(System.Collections.IEnumerable)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SubsetOf(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a subset of the collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Member(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Contains(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Contains(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringContaining(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.ContainsSubstring(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotContain(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StartsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringStarting(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotStartWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.EndsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringEnding(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotEndWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Matches(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringMatching(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotMatch(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value matches the pattern supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SamePath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same as an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SubPath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SamePathOrUnder(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InRange``1(``0,``0)">
+            <summary>
+            Returns a constraint that tests whether the actual value falls 
+            within a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Not">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.No">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Some">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if at least one of them succeeds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.None">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them fail.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Length">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Length property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Count">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Count property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Message">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Message property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.InnerException">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the InnerException property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Null">
+            <summary>
+            Returns a constraint that tests for null
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.True">
+            <summary>
+            Returns a constraint that tests for True
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.False">
+            <summary>
+            Returns a constraint that tests for False
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Positive">
+            <summary>
+            Returns a constraint that tests for a positive value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Negative">
+            <summary>
+            Returns a constraint that tests for a negative value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.NaN">
+            <summary>
+            Returns a constraint that tests for NaN
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Empty">
+            <summary>
+            Returns a constraint that tests for empty
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Unique">
+            <summary>
+            Returns a constraint that tests whether a collection 
+            contains all unique items.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.BinarySerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in binary format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.XmlSerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in xml format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Ordered">
+            <summary>
+            Returns a constraint that tests whether a collection is ordered
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. Works
+            identically to Assert.That.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. Works
+            identically to Assert.That.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message to be displayed in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. Works
+            identically to Assert.That.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message to be displayed in case of failure</param>
+            <param name="args">Arguments to use in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>. Works Identically to 
+            <see cref="M:NUnit.Framework.Assert.That(System.Boolean,System.String,System.Object[])"/>.
+            </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>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>. Works Identically to
+            <see cref="M:NUnit.Framework.Assert.That(System.Boolean,System.String)"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>. Works Identically to <see cref="M:NUnit.Framework.Assert.That(System.Boolean)"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.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="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>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(``0@,NUnit.Framework.Constraints.IResolveConstraint)">
+            <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 to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <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 to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <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 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>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Map(System.Collections.ICollection)">
+            <summary>
+            Returns a ListMapper based on a collection.
+            </summary>
+            <param name="original">The original collection</param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Assume">
+            <summary>
+            Provides static methods to express the assumptions
+            that must be met for a test to give a meaningful
+            result. If an assumption is not met, the test
+            should produce an inconclusive result.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assume.Equals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assume.ReferenceEquals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.InconclusiveException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.InconclusiveException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the 
+            method throws an <see cref="T:NUnit.Framework.InconclusiveException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.ActionTargets">
+            <summary>
+            The different targets a test action attribute can be applied to
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ActionTargets.Default">
+            <summary>
+            Default target, which is determined by where the action attribute is attached
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ActionTargets.Test">
+            <summary>
+            Target a individual test case
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ActionTargets.Suite">
+            <summary>
+            Target a suite of test cases
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.AsyncInvocationRegion.WaitForPendingOperationsToComplete(System.Object)">
+            <summary>
+            Waits for pending asynchronous operations to complete, if appropriate,
+            and returns a proper result of the invocation by unwrapping task results
+            </summary>
+            <param name="invocationResult">The raw result of the method invocation</param>
+            <returns>The unwrapped result, if necessary</returns>
+        </member>
+        <member name="T:NUnit.Framework.CategoryAttribute">
+            <summary>
+            Attribute used to apply a category to a test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.CategoryAttribute.categoryName">
+            <summary>
+            The name of the category
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CategoryAttribute.#ctor(System.String)">
+            <summary>
+            Construct attribute for a given category based on
+            a name. The name may not contain the characters ',',
+            '+', '-' or '!'. However, this is not checked in the
+            constructor since it would cause an error to arise at
+            as the test was loaded without giving a clear indication
+            of where the problem is located. The error is handled
+            in NUnitFramework.cs by marking the test as not
+            runnable.
+            </summary>
+            <param name="name">The name of the category</param>
+        </member>
+        <member name="M:NUnit.Framework.CategoryAttribute.#ctor">
+            <summary>
+            Protected constructor uses the Type name as the name
+            of the category.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.CategoryAttribute.Name">
+            <summary>
+            The name of the category
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DatapointAttribute">
+            <summary>
+            Used to mark a field for use as a datapoint when executing a theory
+            within the same fixture that requires an argument of the field's Type.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DatapointsAttribute">
+            <summary>
+            Used to mark an array as containing a set of datapoints to be used
+            executing a theory within the same fixture that requires an argument 
+            of the Type of the array elements.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DescriptionAttribute">
+            <summary>
+            Attribute used to provide descriptive text about a 
+            test case or fixture.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.DescriptionAttribute.#ctor(System.String)">
+            <summary>
+            Construct the attribute
+            </summary>
+            <param name="description">Text describing the test</param>
+        </member>
+        <member name="P:NUnit.Framework.DescriptionAttribute.Description">
+            <summary>
+            Gets the test description
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.MessageMatch">
+            <summary>
+            Enumeration indicating how the expected message parameter is to be used
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.Exact">
+            Expect an exact match
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.Contains">
+            Expect a message containing the parameter string
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.Regex">
+            Match the regular expression provided as a parameter
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.StartsWith">
+            Expect a message that starts with the parameter string
+        </member>
+        <member name="T:NUnit.Framework.ExpectedExceptionAttribute">
+            <summary>
+            ExpectedExceptionAttribute
+            </summary>
+            
+        </member>
+        <member name="M:NUnit.Framework.ExpectedExceptionAttribute.#ctor">
+            <summary>
+            Constructor for a non-specific exception
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ExpectedExceptionAttribute.#ctor(System.Type)">
+            <summary>
+            Constructor for a given type of exception
+            </summary>
+            <param name="exceptionType">The type of the expected exception</param>
+        </member>
+        <member name="M:NUnit.Framework.ExpectedExceptionAttribute.#ctor(System.String)">
+            <summary>
+            Constructor for a given exception name
+            </summary>
+            <param name="exceptionName">The full name of the expected exception</param>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.ExpectedException">
+            <summary>
+            Gets or sets the expected exception type
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.ExpectedExceptionName">
+            <summary>
+            Gets or sets the full Type name of the expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.ExpectedMessage">
+            <summary>
+            Gets or sets the expected message text
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.UserMessage">
+            <summary>
+            Gets or sets the user message displayed in case of failure
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.MatchType">
+            <summary>
+             Gets or sets the type of match to be performed on the expected message
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.Handler">
+            <summary>
+             Gets the name of a method to be used as an exception handler
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ExplicitAttribute">
+            <summary>
+            ExplicitAttribute marks a test or test fixture so that it will
+            only be run if explicitly executed from the gui or command line
+            or if it is included by use of a filter. The test will not be
+            run simply because an enclosing suite is run.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ExplicitAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ExplicitAttribute.#ctor(System.String)">
+            <summary>
+            Constructor with a reason
+            </summary>
+            <param name="reason">The reason test is marked explicit</param>
+        </member>
+        <member name="P:NUnit.Framework.ExplicitAttribute.Reason">
+            <summary>
+            The reason test is marked explicit
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IgnoreAttribute">
+            <summary>
+            Attribute used to mark a test that is to be ignored.
+            Ignored tests result in a warning message when the
+            tests are run.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreAttribute.#ctor">
+            <summary>
+            Constructs the attribute without giving a reason 
+            for ignoring the test.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreAttribute.#ctor(System.String)">
+            <summary>
+            Constructs the attribute giving a reason for ignoring the test
+            </summary>
+            <param name="reason">The reason for ignoring the test</param>
+        </member>
+        <member name="P:NUnit.Framework.IgnoreAttribute.Reason">
+            <summary>
+            The reason for ignoring a test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IncludeExcludeAttribute">
+            <summary>
+            Abstract base for Attributes that are used to include tests
+            in the test run based on environmental settings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IncludeExcludeAttribute.#ctor">
+            <summary>
+            Constructor with no included items specified, for use
+            with named property syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IncludeExcludeAttribute.#ctor(System.String)">
+            <summary>
+            Constructor taking one or more included items
+            </summary>
+            <param name="include">Comma-delimited list of included items</param>
+        </member>
+        <member name="P:NUnit.Framework.IncludeExcludeAttribute.Include">
+            <summary>
+            Name of the item that is needed in order for
+            a test to run. Multiple itemss may be given,
+            separated by a comma.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.IncludeExcludeAttribute.Exclude">
+            <summary>
+            Name of the item to be excluded. Multiple items
+            may be given, separated by a comma.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.IncludeExcludeAttribute.Reason">
+            <summary>
+            The reason for including or excluding the test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.PlatformAttribute">
+            <summary>
+            PlatformAttribute is used to mark a test fixture or an
+            individual method as applying to a particular platform only.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PlatformAttribute.#ctor">
+            <summary>
+            Constructor with no platforms specified, for use
+            with named property syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PlatformAttribute.#ctor(System.String)">
+            <summary>
+            Constructor taking one or more platforms
+            </summary>
+            <param name="platforms">Comma-deliminted list of platforms</param>
+        </member>
+        <member name="T:NUnit.Framework.CultureAttribute">
+            <summary>
+            CultureAttribute is used to mark a test fixture or an
+            individual method as applying to a particular Culture only.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CultureAttribute.#ctor">
+            <summary>
+            Constructor with no cultures specified, for use
+            with named property syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CultureAttribute.#ctor(System.String)">
+            <summary>
+            Constructor taking one or more cultures
+            </summary>
+            <param name="cultures">Comma-deliminted list of cultures</param>
+        </member>
+        <member name="T:NUnit.Framework.CombinatorialAttribute">
+            <summary>
+            Marks a test to use a combinatorial join of any argument data 
+            provided. NUnit will create a test case for every combination of 
+            the arguments provided. This can result in a large number of test
+            cases and so should be used judiciously. This is the default join
+            type, so the attribute need not be used except as documentation.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.PropertyAttribute">
+            <summary>
+            PropertyAttribute is used to attach information to a test as a name/value pair..
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Construct a PropertyAttribute with a name and string value
+            </summary>
+            <param name="propertyName">The name of the property</param>
+            <param name="propertyValue">The property value</param>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.Int32)">
+            <summary>
+            Construct a PropertyAttribute with a name and int value
+            </summary>
+            <param name="propertyName">The name of the property</param>
+            <param name="propertyValue">The property value</param>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.Double)">
+            <summary>
+            Construct a PropertyAttribute with a name and double value
+            </summary>
+            <param name="propertyName">The name of the property</param>
+            <param name="propertyValue">The property value</param>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor">
+            <summary>
+            Constructor for derived classes that set the
+            property dictionary directly.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.Object)">
+            <summary>
+            Constructor for use by derived classes that use the
+            name of the type as the property name. Derived classes
+            must ensure that the Type of the property value is
+            a standard type supported by the BCL. Any custom
+            types will cause a serialization Exception when
+            in the client.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.PropertyAttribute.Properties">
+            <summary>
+            Gets the property dictionary for this attribute
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CombinatorialAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.PairwiseAttribute">
+            <summary>
+            Marks a test to use pairwise join of any argument data provided. 
+            NUnit will attempt too excercise every pair of argument values at 
+            least once, using as small a number of test cases as it can. With
+            only two arguments, this is the same as a combinatorial join.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PairwiseAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SequentialAttribute">
+            <summary>
+            Marks a test to use a sequential join of any argument data
+            provided. NUnit will use arguements for each parameter in
+            sequence, generating test cases up to the largest number
+            of argument values provided and using null for any arguments
+            for which it runs out of values. Normally, this should be
+            used with the same number of arguments for each parameter.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SequentialAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.MaxTimeAttribute">
+            <summary>
+            Summary description for MaxTimeAttribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.MaxTimeAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a MaxTimeAttribute, given a time in milliseconds.
+            </summary>
+            <param name="milliseconds">The maximum elapsed time in milliseconds</param>
+        </member>
+        <member name="T:NUnit.Framework.RandomAttribute">
+            <summary>
+            RandomAttribute is used to supply a set of random values
+            to a single parameter of a parameterized test.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ValuesAttribute">
+            <summary>
+            ValuesAttribute is used to provide literal arguments for
+            an individual parameter of a test.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ParameterDataAttribute">
+            <summary>
+            Abstract base class for attributes that apply to parameters 
+            and supply data for the parameter.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ParameterDataAttribute.GetData(System.Reflection.ParameterInfo)">
+            <summary>
+            Gets the data to be provided to the specified parameter
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ValuesAttribute.data">
+            <summary>
+            The collection of data to be returned. Must
+            be set by any derived attribute classes.
+            We use an object[] so that the individual
+            elements may have their type changed in GetData
+            if necessary.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object)">
+            <summary>
+            Construct with one argument
+            </summary>
+            <param name="arg1"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object,System.Object)">
+            <summary>
+            Construct with two arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object,System.Object,System.Object)">
+            <summary>
+            Construct with three arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <param name="arg3"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object[])">
+            <summary>
+            Construct with an array of arguments
+            </summary>
+            <param name="args"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.GetData(System.Reflection.ParameterInfo)">
+            <summary>
+            Get the collection of values to be used as arguments
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a set of doubles from 0.0 to 1.0,
+            specifying only the count.
+            </summary>
+            <param name="count"></param>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.#ctor(System.Double,System.Double,System.Int32)">
+            <summary>
+            Construct a set of doubles from min to max
+            </summary>
+            <param name="min"></param>
+            <param name="max"></param>
+            <param name="count"></param>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.#ctor(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Construct a set of ints from min to max
+            </summary>
+            <param name="min"></param>
+            <param name="max"></param>
+            <param name="count"></param>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.GetData(System.Reflection.ParameterInfo)">
+            <summary>
+            Get the collection of values to be used as arguments
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.RangeAttribute">
+            <summary>
+            RangeAttribute is used to supply a range of values to an
+            individual parameter of a parameterized test.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Construct a range of ints using default step of 1
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Construct a range of ints specifying the step size 
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Int64,System.Int64,System.Int64)">
+            <summary>
+            Construct a range of longs
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Double,System.Double,System.Double)">
+            <summary>
+            Construct a range of doubles
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Single,System.Single,System.Single)">
+            <summary>
+            Construct a range of floats
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="T:NUnit.Framework.RepeatAttribute">
+            <summary>
+            RepeatAttribute may be applied to test case in order
+            to run it multiple times.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RepeatAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a RepeatAttribute
+            </summary>
+            <param name="count">The number of times to run the test</param>
+        </member>
+        <member name="T:NUnit.Framework.RequiredAddinAttribute">
+            <summary>
+            RequiredAddinAttribute may be used to indicate the names of any addins
+            that must be present in order to run some or all of the tests in an
+            assembly. If the addin is not loaded, the entire assembly is marked
+            as NotRunnable.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiredAddinAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:RequiredAddinAttribute"/> class.
+            </summary>
+            <param name="requiredAddin">The required addin.</param>
+        </member>
+        <member name="P:NUnit.Framework.RequiredAddinAttribute.RequiredAddin">
+            <summary>
+            Gets the name of required addin.
+            </summary>
+            <value>The required addin name.</value>
+        </member>
+        <member name="T:NUnit.Framework.SetCultureAttribute">
+            <summary>
+            Summary description for SetCultureAttribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SetCultureAttribute.#ctor(System.String)">
+            <summary>
+            Construct given the name of a culture
+            </summary>
+            <param name="culture"></param>
+        </member>
+        <member name="T:NUnit.Framework.SetUICultureAttribute">
+            <summary>
+            Summary description for SetUICultureAttribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SetUICultureAttribute.#ctor(System.String)">
+            <summary>
+            Construct given the name of a culture
+            </summary>
+            <param name="culture"></param>
+        </member>
+        <member name="T:NUnit.Framework.SetUpAttribute">
+            <summary>
+            SetUpAttribute is used in a TestFixture to identify a method
+            that is called immediately before each test is run. It is 
+            also used in a SetUpFixture to identify the method that is
+            called once, before any of the subordinate tests are run.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SetUpFixtureAttribute">
+            <summary>
+            Attribute used to mark a class that contains one-time SetUp 
+            and/or TearDown methods that apply to all the tests in a
+            namespace or an assembly.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SuiteAttribute">
+            <summary>
+            Attribute used to mark a static (shared in VB) property
+            that returns a list of tests.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TearDownAttribute">
+            <summary>
+            Attribute used in a TestFixture to identify a method that is 
+            called immediately after each test is run. It is also used
+            in a SetUpFixture to identify the method that is called once,
+            after all subordinate tests have run. In either case, the method 
+            is guaranteed to be called, even if an exception is thrown.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestActionAttribute">
+            <summary>
+            Provide actions to execute before and after tests.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ITestAction">
+            <summary>
+            When implemented by an attribute, this interface implemented to provide actions to execute before and after tests.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ITestAction.BeforeTest(NUnit.Framework.TestDetails)">
+            <summary>
+            Executed before each test is run
+            </summary>
+            <param name="testDetails">Provides details about the test that is going to be run.</param>
+        </member>
+        <member name="M:NUnit.Framework.ITestAction.AfterTest(NUnit.Framework.TestDetails)">
+            <summary>
+            Executed after each test is run
+            </summary>
+            <param name="testDetails">Provides details about the test that has just been run.</param>
+        </member>
+        <member name="P:NUnit.Framework.ITestAction.Targets">
+            <summary>
+            Provides the target for the action attribute
+            </summary>
+            <returns>The target for the action attribute</returns>
+        </member>
+        <member name="T:NUnit.Framework.TestAttribute">
+            <summary>
+            Adding this attribute to a method within a <seealso cref="T:NUnit.Framework.TestFixtureAttribute"/> 
+            class makes the method callable from the NUnit test runner. There is a property 
+            called Description which is optional which you can provide a more detailed test
+            description. This class cannot be inherited.
+            </summary>
+            
+            <example>
+            [TestFixture]
+            public class Fixture
+            {
+              [Test]
+              public void MethodToTest()
+              {}
+              
+              [Test(Description = "more detailed description")]
+              publc void TestDescriptionMethod()
+              {}
+            }
+            </example>
+            
+        </member>
+        <member name="P:NUnit.Framework.TestAttribute.Description">
+            <summary>
+            Descriptive text for this test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestCaseAttribute">
+            <summary>
+            TestCaseAttribute is used to mark parameterized test cases
+            and provide them with their arguments.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ITestCaseData">
+            <summary>
+            The ITestCaseData interface is implemented by a class
+            that is able to return complete testcases for use by
+            a parameterized test method.
+            
+            NOTE: This interface is used in both the framework
+            and the core, even though that results in two different
+            types. However, sharing the source code guarantees that
+            the various implementations will be compatible and that
+            the core is able to reflect successfully over the
+            framework implementations of ITestCaseData.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Arguments">
+            <summary>
+            Gets the argument list to be provided to the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Result">
+            <summary>
+            Gets the expected result
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.HasExpectedResult">
+            <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>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.ExpectedException">
+            <summary>
+             Gets the expected exception Type
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.ExpectedExceptionName">
+            <summary>
+            Gets the FullName of the expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.TestName">
+            <summary>
+            Gets the name to be used for the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Description">
+            <summary>
+            Gets the description of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Ignored">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is ignored.
+            </summary>
+            <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Explicit">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is explicit.
+            </summary>
+            <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.IgnoreReason">
+            <summary>
+            Gets the ignore reason.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object[])">
+            <summary>
+            Construct a TestCaseAttribute with a list of arguments.
+            This constructor is not CLS-Compliant
+            </summary>
+            <param name="arguments"></param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object)">
+            <summary>
+            Construct a TestCaseAttribute with a single argument
+            </summary>
+            <param name="arg"></param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object,System.Object)">
+            <summary>
+            Construct a TestCaseAttribute with a two arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object,System.Object,System.Object)">
+            <summary>
+            Construct a TestCaseAttribute with a three arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <param name="arg3"></param>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Arguments">
+            <summary>
+            Gets the list of arguments to a test case
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Result">
+            <summary>
+            Gets or sets the expected result. Use
+            ExpectedResult by preference.
+            </summary>
+            <value>The result.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedResult">
+            <summary>
+            Gets or sets the expected result.
+            </summary>
+            <value>The result.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.HasExpectedResult">
+            <summary>
+            Gets a flag indicating whether an expected
+            result has been set.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Categories">
+            <summary>
+            Gets a list of categories associated with this test;
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Category">
+            <summary>
+            Gets or sets the category associated with this test.
+            May be a single category or a comma-separated list.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedException">
+            <summary>
+            Gets or sets the expected exception.
+            </summary>
+            <value>The expected exception.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedExceptionName">
+            <summary>
+            Gets or sets the name the expected exception.
+            </summary>
+            <value>The expected name of the exception.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedMessage">
+            <summary>
+            Gets or sets the expected message of the expected exception
+            </summary>
+            <value>The expected message of the exception.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.MatchType">
+            <summary>
+             Gets or sets the type of match to be performed on the expected message
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Description">
+            <summary>
+            Gets or sets the description.
+            </summary>
+            <value>The description.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.TestName">
+            <summary>
+            Gets or sets the name of the test.
+            </summary>
+            <value>The name of the test.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Ignore">
+            <summary>
+            Gets or sets the ignored status of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Ignored">
+            <summary>
+            Gets or sets the ignored status of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Explicit">
+            <summary>
+            Gets or sets the explicit status of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Reason">
+            <summary>
+            Gets or sets the reason for not running the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.IgnoreReason">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.TestCaseSourceAttribute">
+            <summary>
+            FactoryAttribute indicates the source to be used to
+            provide test cases for a test method.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.String)">
+            <summary>
+            Construct with the name of the data source, which must
+            be a property, field or method of the test class itself.
+            </summary>
+            <param name="sourceName">An array of the names of the factories that will provide data</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type)">
+            <summary>
+            Construct with a Type, which must implement IEnumerable
+            </summary>
+            <param name="sourceType">The Type that will provide data</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type,System.String)">
+            <summary>
+            Construct with a Type and name.
+            that don't support params arrays.
+            </summary>
+            <param name="sourceType">The Type that will provide data</param>
+            <param name="sourceName">The name of the method, property or field that will provide data</param>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseSourceAttribute.SourceName">
+            <summary>
+            The name of a the method, property or fiend to be used as a source
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseSourceAttribute.SourceType">
+            <summary>
+            A Type to be used as a source
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseSourceAttribute.Category">
+            <summary>
+            Gets or sets the category associated with this test.
+            May be a single category or a comma-separated list.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestFixtureAttribute">
+            <example>
+            [TestFixture]
+            public class ExampleClass 
+            {}
+            </example>
+        </member>
+        <member name="M:NUnit.Framework.TestFixtureAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestFixtureAttribute.#ctor(System.Object[])">
+            <summary>
+            Construct with a object[] representing a set of arguments. 
+            In .NET 2.0, the arguments may later be separated into
+            type arguments and constructor arguments.
+            </summary>
+            <param name="arguments"></param>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Description">
+            <summary>
+            Descriptive text for this fixture
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Category">
+            <summary>
+            Gets and sets the category for this fixture.
+            May be a comma-separated list of categories.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Categories">
+            <summary>
+            Gets a list of categories for this fixture
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Arguments">
+            <summary>
+            The arguments originally provided to the attribute
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Ignore">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:NUnit.Framework.TestFixtureAttribute"/> should be ignored.
+            </summary>
+            <value><c>true</c> if ignore; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.IgnoreReason">
+            <summary>
+            Gets or sets the ignore reason. May set Ignored as a side effect.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.TypeArgs">
+            <summary>
+            Get or set the type arguments. If not set
+            explicitly, any leading arguments that are
+            Types are taken as type arguments.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestFixtureSetUpAttribute">
+            <summary>
+            Attribute used to identify a method that is 
+            called before any tests in a fixture are run.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestFixtureTearDownAttribute">
+            <summary>
+            Attribute used to identify a method that is called after
+            all the tests in a fixture have run. The method is 
+            guaranteed to be called, even if an exception is thrown.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TheoryAttribute">
+            <summary>
+            Adding this attribute to a method within a <seealso cref="T:NUnit.Framework.TestFixtureAttribute"/> 
+            class makes the method callable from the NUnit test runner. There is a property 
+            called Description which is optional which you can provide a more detailed test
+            description. This class cannot be inherited.
+            </summary>
+            
+            <example>
+            [TestFixture]
+            public class Fixture
+            {
+              [Test]
+              public void MethodToTest()
+              {}
+              
+              [Test(Description = "more detailed description")]
+              publc void TestDescriptionMethod()
+              {}
+            }
+            </example>
+            
+        </member>
+        <member name="T:NUnit.Framework.TimeoutAttribute">
+            <summary>
+            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.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TimeoutAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a TimeoutAttribute given a time in milliseconds
+            </summary>
+            <param name="timeout">The timeout value in milliseconds</param>
+        </member>
+        <member name="T:NUnit.Framework.RequiresSTAAttribute">
+            <summary>
+            Marks a test that must run in the STA, causing it
+            to run in a separate thread if necessary.
+            
+            On methods, you may also use STAThreadAttribute
+            to serve the same purpose.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresSTAAttribute.#ctor">
+            <summary>
+            Construct a RequiresSTAAttribute
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.RequiresMTAAttribute">
+            <summary>
+            Marks a test that must run in the MTA, causing it
+            to run in a separate thread if necessary.
+            
+            On methods, you may also use MTAThreadAttribute
+            to serve the same purpose.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresMTAAttribute.#ctor">
+            <summary>
+            Construct a RequiresMTAAttribute
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.RequiresThreadAttribute">
+            <summary>
+            Marks a test that must run on a separate thread.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresThreadAttribute.#ctor">
+            <summary>
+            Construct a RequiresThreadAttribute
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresThreadAttribute.#ctor(System.Threading.ApartmentState)">
+            <summary>
+            Construct a RequiresThreadAttribute, specifying the apartment
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ValueSourceAttribute">
+            <summary>
+            ValueSourceAttribute indicates the source to be used to
+            provide data for one parameter of a test method.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ValueSourceAttribute.#ctor(System.String)">
+            <summary>
+            Construct with the name of the factory - for use with languages
+            that don't support params arrays.
+            </summary>
+            <param name="sourceName">The name of the data source to be used</param>
+        </member>
+        <member name="M:NUnit.Framework.ValueSourceAttribute.#ctor(System.Type,System.String)">
+            <summary>
+            Construct with a Type and name - for use with languages
+            that don't support params arrays.
+            </summary>
+            <param name="sourceType">The Type that will provide data</param>
+            <param name="sourceName">The name of the method, property or field that will provide data</param>
+        </member>
+        <member name="P:NUnit.Framework.ValueSourceAttribute.SourceName">
+            <summary>
+            The name of a the method, property or fiend to be used as a source
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ValueSourceAttribute.SourceType">
+            <summary>
+            A Type to be used as a source
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.CollectionAssert">
+            <summary>
+            A set of Assert methods operationg on one or more collections
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Equals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.ReferenceEquals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type)">
+            <summary>
+            Asserts that all items contained in collection are of the type specified by expectedType.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type,System.String)">
+            <summary>
+            Asserts that all items contained in collection are of the type specified by expectedType.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type,System.String,System.Object[])">
+            <summary>
+            Asserts that all items contained in collection are of the type specified by expectedType.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="expectedType">System.Type that all objects in collection must be instances of</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable)">
+            <summary>
+            Asserts that all items contained in collection are not equal to null.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that all items contained in collection are not equal to null.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that all items contained in collection are not equal to null.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable)">
+            <summary>
+            Ensures that every object contained in collection exists within the collection
+            once and only once.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Ensures that every object contained in collection exists within the collection
+            once and only once.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Ensures that every object contained in collection exists within the collection
+            once and only once.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are not equivalent.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are not equivalent.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are not equivalent.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object)">
+            <summary>
+            Asserts that collection contains actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object to be found within collection</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object,System.String)">
+            <summary>
+            Asserts that collection contains actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object to be found within collection</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that collection contains actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object to be found within collection</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object)">
+            <summary>
+            Asserts that collection does not contain actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object that cannot exist within collection</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object,System.String)">
+            <summary>
+            Asserts that collection does not contain actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object that cannot exist within collection</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that collection does not contain actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object that cannot exist within collection</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that superset is not a subject of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that superset is not a subject of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that superset is not a subject of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that superset is a subset of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that superset is a subset of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that superset is a subset of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</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>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array,list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array,list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="comparer">A custom comparer to perform the comparisons</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer,System.String)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="comparer">A custom comparer to perform the comparisons</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="comparer">A custom comparer to perform the comparisons</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AllItemsConstraint">
+            <summary>
+            AllItemsConstraint applies another constraint to each
+            item in a collection, succeeding if they all succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PrefixConstraint">
+            <summary>
+            Abstract base class used for prefixes
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Constraint">
+            <summary>
+            The Constraint class is the base of all built-in constraints
+            within NUnit. It provides the operator overloads used to combine 
+            constraints.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.IResolveConstraint">
+            <summary>
+            The IConstraintExpression interface is implemented by all
+            complete and resolvable constraints and expressions.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.IResolveConstraint.Resolve">
+            <summary>
+            Return the top-level constraint for this expression
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.UNSET">
+            <summary>
+            Static UnsetObject used to detect derived constraints
+            failing to set the actual value.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.actual">
+            <summary>
+            The actual value being tested against a constraint
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.displayName">
+            <summary>
+            The display name of this Constraint for use by ToString()
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.argcnt">
+            <summary>
+            Argument fields used by ToString();
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.builder">
+            <summary>
+            The builder holding this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.#ctor">
+            <summary>
+            Construct a constraint with no arguments
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.#ctor(System.Object)">
+            <summary>
+            Construct a constraint with one argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.#ctor(System.Object,System.Object)">
+            <summary>
+            Construct a constraint with two arguments
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.SetBuilder(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Sets the ConstraintBuilder holding this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.WriteMessageTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the failure message to the MessageWriter provided
+            as an argument. The default implementation simply passes
+            the constraint and the actual value to the writer, which
+            then displays the constraint description and the value.
+            
+            Constraints that need to provide additional details,
+            such as where the error occured can override this.
+            </summary>
+            <param name="writer">The MessageWriter on which to display the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.Matches``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})">
+            <summary>
+            Test whether the constraint is satisfied by an
+            ActualValueDelegate that returns the value to be tested.
+            The default implementation simply evaluates the delegate
+            but derived classes may override it to provide for delayed 
+            processing.
+            </summary>
+            <param name="del">An <see cref="T:NUnit.Framework.Constraints.ActualValueDelegate`1"/></param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.Matches``1(``0@)">
+            <summary>
+            Test whether the constraint is satisfied by a given reference.
+            The default implementation simply dereferences the value but
+            derived classes may override it to provide for delayed processing.
+            </summary>
+            <param name="actual">A reference to the value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.ToString">
+            <summary>
+            Default override of ToString returns the constraint DisplayName
+            followed by any arguments within angle brackets.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.op_BitwiseAnd(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.op_BitwiseOr(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.op_LogicalNot(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied if the 
+            argument constraint is not satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.After(System.Int32)">
+            <summary>
+            Returns a DelayedConstraint with the specified delay time.
+            </summary>
+            <param name="delayInMilliseconds">The delay in milliseconds.</param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.After(System.Int32,System.Int32)">
+            <summary>
+            Returns a DelayedConstraint with the specified delay time
+            and polling interval.
+            </summary>
+            <param name="delayInMilliseconds">The delay in milliseconds.</param>
+            <param name="pollingInterval">The interval at which to test the constraint.</param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.DisplayName">
+            <summary>
+            The display name of this Constraint for use by ToString().
+            The default value is the name of the constraint with
+            trailing "Constraint" removed. Derived classes may set
+            this to another name in their constructors.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.And">
+            <summary>
+            Returns a ConstraintExpression by appending And
+            to the current constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.With">
+            <summary>
+            Returns a ConstraintExpression by appending And
+            to the current constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.Or">
+            <summary>
+            Returns a ConstraintExpression by appending Or
+            to the current constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Constraint.UnsetObject">
+            <summary>
+            Class used to detect any derived constraints
+            that fail to set the actual value in their
+            Matches override.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.PrefixConstraint.baseConstraint">
+            <summary>
+            The base constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PrefixConstraint.#ctor(NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Construct given a base constraint
+            </summary>
+            <param name="resolvable"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllItemsConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct an AllItemsConstraint on top of an existing constraint
+            </summary>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllItemsConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            failing if any item fails.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllItemsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AndConstraint">
+            <summary>
+            AndConstraint succeeds only if both members succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BinaryConstraint">
+            <summary>
+            BinaryConstraint is the abstract base of all constraints
+            that combine two other constraints in some fashion.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.BinaryConstraint.left">
+            <summary>
+            The first constraint being combined
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.BinaryConstraint.right">
+            <summary>
+            The second constraint being combined
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinaryConstraint.#ctor(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct a BinaryConstraint from two other constraints
+            </summary>
+            <param name="left">The first constraint</param>
+            <param name="right">The second constraint</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.#ctor(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Create an AndConstraint from two other constraints
+            </summary>
+            <param name="left">The first constraint</param>
+            <param name="right">The second constraint</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.Matches(System.Object)">
+            <summary>
+            Apply both member constraints to an actual value, succeeding 
+            succeeding only if both of them succeed.
+            </summary>
+            <param name="actual">The actual value</param>
+            <returns>True if the constraints both succeeded</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description for this contraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to receive the description</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AssignableFromConstraint">
+            <summary>
+            AssignableFromConstraint is used to test that an object
+            can be assigned from a given Type.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.TypeConstraint">
+            <summary>
+            TypeConstraint is the abstract base for constraints
+            that take a Type as their expected value.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.TypeConstraint.expectedType">
+            <summary>
+            The expected Type used by the constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.TypeConstraint.#ctor(System.Type)">
+            <summary>
+            Construct a TypeConstraint for a given Type
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.TypeConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. TypeConstraints override this method to write
+            the name of the type.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableFromConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an AssignableFromConstraint for the type provided
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableFromConstraint.Matches(System.Object)">
+            <summary>
+            Test whether an object can be assigned from the specified type
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableFromConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AssignableToConstraint">
+            <summary>
+            AssignableToConstraint is used to test that an object
+            can be assigned to a given Type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableToConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an AssignableToConstraint for the type provided
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableToConstraint.Matches(System.Object)">
+            <summary>
+            Test whether an object can be assigned to the specified type
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableToConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AttributeConstraint">
+            <summary>
+            AttributeConstraint tests that a specified attribute is present
+            on a Type or other provider and that the value of the attribute
+            satisfies some other constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.#ctor(System.Type,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Constructs an AttributeConstraint for a specified attriute
+            Type and base constraint.
+            </summary>
+            <param name="type"></param>
+            <param name="baseConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.Matches(System.Object)">
+            <summary>
+            Determines whether the Type or other provider has the 
+            expected attribute and if its value matches the
+            additional constraint specified.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes a description of the attribute to the specified writer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes the actual value supplied to the specified writer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.GetStringRepresentation">
+            <summary>
+            Returns a string representation of the constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AttributeExistsConstraint">
+            <summary>
+            AttributeExistsConstraint tests for the presence of a
+            specified attribute on  a Type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeExistsConstraint.#ctor(System.Type)">
+            <summary>
+            Constructs an AttributeExistsConstraint for a specific attribute Type
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeExistsConstraint.Matches(System.Object)">
+            <summary>
+            Tests whether the object provides the expected attribute.
+            </summary>
+            <param name="actual">A Type, MethodInfo, or other ICustomAttributeProvider</param>
+            <returns>True if the expected attribute is present, otherwise false</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeExistsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes the description of the constraint to the specified writer
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BasicConstraint">
+            <summary>
+            BasicConstraint is the abstract base for constraints that
+            perform a simple comparison to a constant value.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BasicConstraint.#ctor(System.Object,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:BasicConstraint"/> class.
+            </summary>
+            <param name="expected">The expected.</param>
+            <param name="description">The description.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BasicConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BasicConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionConstraint">
+            <summary>
+            CollectionConstraint is the abstract base class for
+            constraints that operate on collections.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.#ctor">
+            <summary>
+            Construct an empty CollectionConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.#ctor(System.Object)">
+            <summary>
+            Construct a CollectionConstraint
+            </summary>
+            <param name="arg"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.IsEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Determines whether the specified enumerable is empty.
+            </summary>
+            <param name="enumerable">The enumerable.</param>
+            <returns>
+            	<c>true</c> if the specified enumerable is empty; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Protected method to be implemented by derived classes
+            </summary>
+            <param name="collection"></param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionContainsConstraint">
+            <summary>
+            CollectionContainsConstraint is used to test whether a collection
+            contains an expected object as a member.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionItemsEqualConstraint">
+            <summary>
+            CollectionItemsEqualConstraint is the abstract base class for all
+            collection constraints that apply some notion of item equality
+            as a part of their operation.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.#ctor">
+            <summary>
+            Construct an empty CollectionConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.#ctor(System.Object)">
+            <summary>
+            Construct a CollectionConstraint
+            </summary>
+            <param name="arg"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(NUnit.Framework.Constraints.EqualityAdapter)">
+            <summary>
+            Flag the constraint to use the supplied EqualityAdapter.
+            NOTE: For internal use only.
+            </summary>
+            <param name="adapter">The EqualityAdapter to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Flag the constraint to use the supplied Comparison object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(System.Collections.IEqualityComparer)">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.ItemsEqual(System.Object,System.Object)">
+            <summary>
+            Compares two collection members for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Tally(System.Collections.IEnumerable)">
+            <summary>
+            Return a new CollectionTally for use in making tests
+            </summary>
+            <param name="c">The collection to be included in the tally</param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.IgnoreCase">
+            <summary>
+            Flag the constraint to ignore case and return self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionContainsConstraint.#ctor(System.Object)">
+            <summary>
+            Construct a CollectionContainsConstraint
+            </summary>
+            <param name="expected"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionContainsConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether the expected item is contained in the collection
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionContainsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a descripton of the constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionEquivalentConstraint">
+            <summary>
+            CollectionEquivalentCOnstraint is used to determine whether two
+            collections are equivalent.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Construct a CollectionEquivalentConstraint
+            </summary>
+            <param name="expected"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether two collections are equivalent
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionSubsetConstraint">
+            <summary>
+            CollectionSubsetConstraint is used to determine whether
+            one collection is a subset of another
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionSubsetConstraint.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Construct a CollectionSubsetConstraint
+            </summary>
+            <param name="expected">The collection that the actual value is expected to be a subset of</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionSubsetConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether the actual collection is a subset of 
+            the expected collection provided.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionSubsetConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionTally">
+            <summary>
+            CollectionTally counts (tallies) the number of
+            occurences of each object in one or more enumerations.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionTally.#ctor(NUnit.Framework.Constraints.NUnitEqualityComparer,System.Collections.IEnumerable)">
+            <summary>
+            Construct a CollectionTally object from a comparer and a collection
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionTally.TryRemove(System.Object)">
+            <summary>
+            Try to remove an object from the tally
+            </summary>
+            <param name="o">The object to remove</param>
+            <returns>True if successful, false if the object was not found</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionTally.TryRemove(System.Collections.IEnumerable)">
+            <summary>
+            Try to remove a set of objects from the tally
+            </summary>
+            <param name="c">The objects to remove</param>
+            <returns>True if successful, false if any object was not found</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.CollectionTally.Count">
+            <summary>
+            The number of objects remaining in the tally
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ComparisonAdapter">
+            <summary>
+            ComparisonAdapter class centralizes all comparisons of
+            values in NUnit, adapting to the use of any provided
+            IComparer, IComparer<T> or Comparison<T>
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.For(System.Collections.IComparer)">
+            <summary>
+            Returns a ComparisonAdapter that wraps an IComparer
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.For``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Returns a ComparisonAdapter that wraps an IComparer<T>
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.For``1(System.Comparison{``0})">
+            <summary>
+            Returns a ComparisonAdapter that wraps a Comparison<T>
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two objects
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ComparisonAdapter.Default">
+            <summary>
+            Gets the default ComparisonAdapter, which wraps an
+            NUnitComparer object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter.#ctor(System.Collections.IComparer)">
+            <summary>
+            Construct a ComparisonAdapter for an IComparer
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two objects
+            </summary>
+            <param name="expected"></param>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.DefaultComparisonAdapter.#ctor">
+            <summary>
+            Construct a default ComparisonAdapter
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1">
+            <summary>
+            ComparisonAdapter<T> extends ComparisonAdapter and
+            allows use of an IComparer<T> or Comparison<T>
+            to actually perform the comparison.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1.#ctor(System.Collections.Generic.IComparer{`0})">
+            <summary>
+            Construct a ComparisonAdapter for an IComparer<T>
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1.Compare(System.Object,System.Object)">
+            <summary>
+            Compare a Type T to an object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparisonAdapterForComparison`1.#ctor(System.Comparison{`0})">
+            <summary>
+            Construct a ComparisonAdapter for a Comparison<T>
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparisonAdapterForComparison`1.Compare(System.Object,System.Object)">
+            <summary>
+            Compare a Type T to an object
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ComparisonConstraint">
+            <summary>
+            Abstract base class for constraints that compare values to
+            determine if one is greater than, equal to or less than
+            the other. This class supplies the Using modifiers.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ComparisonConstraint.comparer">
+            <summary>
+            ComparisonAdapter to be used in making the comparison
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.#ctor(System.Object,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Modifies the constraint to use an IComparer and returns self
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Modifies the constraint to use an IComparer<T> and returns self
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Modifies the constraint to use a Comparison<T> and returns self
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ActualValueDelegate`1">
+            <summary>
+            Delegate used to delay evaluation of the actual value
+            to be used in evaluating a constraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintBuilder">
+            <summary>
+            ConstraintBuilder maintains the stacks that are used in
+            processing a ConstraintExpression. An OperatorStack
+            is used to hold operators that are waiting for their
+            operands to be reognized. a ConstraintStack holds 
+            input constraints as well as the results of each
+            operator applied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintBuilder"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.Append(NUnit.Framework.Constraints.ConstraintOperator)">
+            <summary>
+            Appends the specified operator to the expression by first
+            reducing the operator stack and then pushing the new
+            operator on the stack.
+            </summary>
+            <param name="op">The operator to push.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.Append(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Appends the specified constraint to the expresson by pushing
+            it on the constraint stack.
+            </summary>
+            <param name="constraint">The constraint to push.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.SetTopOperatorRightContext(System.Object)">
+            <summary>
+            Sets the top operator right context.
+            </summary>
+            <param name="rightContext">The right context.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ReduceOperatorStack(System.Int32)">
+            <summary>
+            Reduces the operator stack until the topmost item
+            precedence is greater than or equal to the target precedence.
+            </summary>
+            <param name="targetPrecedence">The target precedence.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.Resolve">
+            <summary>
+            Resolves this instance, returning a Constraint. If the builder
+            is not currently in a resolvable state, an exception is thrown.
+            </summary>
+            <returns>The resolved constraint</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.IsResolvable">
+            <summary>
+            Gets a value indicating whether this instance is resolvable.
+            </summary>
+            <value>
+            	<c>true</c> if this instance is resolvable; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack">
+            <summary>
+            OperatorStack is a type-safe stack for holding ConstraintOperators
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:OperatorStack"/> class.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Push(NUnit.Framework.Constraints.ConstraintOperator)">
+            <summary>
+            Pushes the specified operator onto the stack.
+            </summary>
+            <param name="op">The op.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Pop">
+            <summary>
+            Pops the topmost operator from the stack.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Empty">
+            <summary>
+            Gets a value indicating whether this <see cref="T:OpStack"/> is empty.
+            </summary>
+            <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Top">
+            <summary>
+            Gets the topmost operator without modifying the stack.
+            </summary>
+            <value>The top.</value>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack">
+            <summary>
+            ConstraintStack is a type-safe stack for holding Constraints
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintStack"/> class.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Push(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Pushes the specified constraint. As a side effect,
+            the constraint's builder field is set to the 
+            ConstraintBuilder owning this stack.
+            </summary>
+            <param name="constraint">The constraint.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Pop">
+            <summary>
+            Pops this topmost constrait from the stack.
+            As a side effect, the constraint's builder
+            field is set to null.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Empty">
+            <summary>
+            Gets a value indicating whether this <see cref="T:ConstraintStack"/> is empty.
+            </summary>
+            <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Top">
+            <summary>
+            Gets the topmost constraint without modifying the stack.
+            </summary>
+            <value>The topmost constraint</value>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintExpression">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintExpressionBase">
+            <summary>
+            ConstraintExpressionBase is the abstract base class for the 
+            ConstraintExpression class, which represents a 
+            compound constraint in the process of being constructed 
+            from a series of syntactic elements.
+            
+            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>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ConstraintExpressionBase.builder">
+            <summary>
+            The ConstraintBuilder holding the elements recognized so far
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> 
+            class passing in a ConstraintBuilder, which may be pre-populated.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.ToString">
+            <summary>
+            Returns a string representation of the expression as it
+            currently stands. This should only be used for testing,
+            since it has the side-effect of resolving the expression.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.Append(NUnit.Framework.Constraints.ConstraintOperator)">
+            <summary>
+            Appends an operator to the expression and returns the
+            resulting expression itself.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.Append(NUnit.Framework.Constraints.SelfResolvingOperator)">
+            <summary>
+            Appends a self-resolving operator to the expression and
+            returns a new ResolvableConstraintExpression.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.Append(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Appends a constraint to the expression and returns that
+            constraint, which is associated with the current state
+            of the expression being built.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpression"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Exactly(System.Int32)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Property(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Attribute(System.Type)">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Attribute``1">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Matches(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns the constraint provided as an argument - used to allow custom
+            custom constraints to easily participate in the syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Matches``1(System.Predicate{``0})">
+            <summary>
+            Returns the constraint provided as an argument - used to allow custom
+            custom constraints to easily participate in the syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.EqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests two items for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SameAs(System.Object)">
+            <summary>
+            Returns a constraint that tests that two references are the same object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.GreaterThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.GreaterThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AtLeast(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.LessThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.LessThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AtMost(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.TypeOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.TypeOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOfType(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOfType``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableFrom(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableFrom``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableTo(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableTo``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.EquivalentTo(System.Collections.IEnumerable)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SubsetOf(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a subset of the collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Member(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Contains(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Contains(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringContaining(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.ContainsSubstring(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StartsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringStarting(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.EndsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringEnding(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Matches(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringMatching(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SamePath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same as an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SubPath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SamePathOrUnder(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InRange``1(``0,``0)">
+            <summary>
+            Returns a constraint that tests whether the actual value falls 
+            within a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Not">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.No">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Some">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if at least one of them succeeds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.None">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them fail.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Length">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Length property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Count">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Count property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Message">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Message property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.InnerException">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the InnerException property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.With">
+            <summary>
+            With is currently a NOP - reserved for future use.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Null">
+            <summary>
+            Returns a constraint that tests for null
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.True">
+            <summary>
+            Returns a constraint that tests for True
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.False">
+            <summary>
+            Returns a constraint that tests for False
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Positive">
+            <summary>
+            Returns a constraint that tests for a positive value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Negative">
+            <summary>
+            Returns a constraint that tests for a negative value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.NaN">
+            <summary>
+            Returns a constraint that tests for NaN
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Empty">
+            <summary>
+            Returns a constraint that tests for empty
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Unique">
+            <summary>
+            Returns a constraint that tests whether a collection 
+            contains all unique items.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.BinarySerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in binary format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.XmlSerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in xml format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Ordered">
+            <summary>
+            Returns a constraint that tests whether a collection is ordered
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ContainsConstraint">
+            <summary>
+            ContainsConstraint tests a whether a string contains a substring
+            or a collection contains an object. It postpones the decision of
+            which test to use until the type of the actual argument is known.
+            This allows testing whether a string is contained in a collection
+            or as a substring of another string using the same syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.ContainsConstraint"/> class.
+            </summary>
+            <param name="expected">The expected.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Flag the constraint to use the supplied Comparison object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using(System.Collections.IEqualityComparer)">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ContainsConstraint.IgnoreCase">
+            <summary>
+            Flag the constraint to ignore case and return self.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.DelayedConstraint">
+            <summary>
+             Applies a delay to the match so that a match can be evaluated in the future.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.#ctor(NUnit.Framework.Constraints.Constraint,System.Int32)">
+            <summary>
+             Creates a new DelayedConstraint
+            </summary>
+            <param name="baseConstraint">The inner constraint two decorate</param>
+            <param name="delayInMilliseconds">The time interval after which the match is performed</param>
+            <exception cref="T:System.InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.#ctor(NUnit.Framework.Constraints.Constraint,System.Int32,System.Int32)">
+            <summary>
+             Creates a new DelayedConstraint
+            </summary>
+            <param name="baseConstraint">The inner constraint two decorate</param>
+            <param name="delayInMilliseconds">The time interval after which the match is performed</param>
+            <param name="pollingInterval">The time interval used for polling</param>
+            <exception cref="T:System.InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for if the base constraint fails, false if it succeeds</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.Matches``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})">
+            <summary>
+            Test whether the constraint is satisfied by a delegate
+            </summary>
+            <param name="del">The delegate whose value is to be tested</param>
+            <returns>True for if the base constraint fails, false if it succeeds</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.Matches``1(``0@)">
+            <summary>
+            Test whether the constraint is satisfied by a given reference.
+            Overridden to wait for the specified delay period before
+            calling the base constraint with the dereferenced value.
+            </summary>
+            <param name="actual">A reference to the value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a MessageWriter.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyCollectionConstraint">
+            <summary>
+            EmptyCollectionConstraint tests whether a collection is empty. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyCollectionConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Check that the collection is empty
+            </summary>
+            <param name="collection"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyCollectionConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyConstraint">
+            <summary>
+            EmptyConstraint tests a whether a string or collection is empty,
+            postponing the decision about which test is applied until the
+            type of the actual argument is known.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyDirectoryConstraint">
+            <summary>
+            EmptyDirectoryConstraint is used to test that a directory is empty
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyStringConstraint">
+            <summary>
+            EmptyStringConstraint tests whether a string is empty.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyStringConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyStringConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EndsWithConstraint">
+            <summary>
+            EndsWithConstraint can test whether a string ends
+            with an expected substring.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.StringConstraint">
+            <summary>
+            StringConstraint is the abstract base for constraints
+            that operate on strings. It supports the IgnoreCase
+            modifier for string operations.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.StringConstraint.expected">
+            <summary>
+            The expected value
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.StringConstraint.caseInsensitive">
+            <summary>
+            Indicates whether tests should be case-insensitive
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StringConstraint.#ctor(System.String)">
+            <summary>
+            Constructs a StringConstraint given an expected value
+            </summary>
+            <param name="expected">The expected value</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StringConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StringConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given string
+            </summary>
+            <param name="actual">The string to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.StringConstraint.IgnoreCase">
+            <summary>
+            Modify the constraint to ignore case in matching.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EndsWithConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:EndsWithConstraint"/> class.
+            </summary>
+            <param name="expected">The expected string</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EndsWithConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is matched by the actual value.
+            This is a template method, which calls the IsMatch method
+            of the derived class.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EndsWithConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualConstraint">
+            <summary>
+            EqualConstraint is able to compare an actual value with the
+            expected value provided in its constructor. Two objects are 
+            considered equal if both are null, or if both have the same 
+            value. NUnit has special semantics for some object types.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.EqualConstraint.clipStrings">
+            <summary>
+            If true, strings in error messages will be clipped
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.EqualConstraint.comparer">
+            <summary>
+            NUnitEqualityComparer used to test equality.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.EqualConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Within(System.Object)">
+            <summary>
+            Flag the constraint to use a tolerance when determining equality.
+            </summary>
+            <param name="amount">Tolerance value to be used</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Comparer(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Flag the constraint to use the supplied Comparison object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using(System.Collections.IEqualityComparer)">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.WriteMessageTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a failure message. Overridden to provide custom 
+            failure messages for EqualConstraint.
+            </summary>
+            <param name="writer">The MessageWriter to write to</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write description of this constraint
+            </summary>
+            <param name="writer">The MessageWriter to write to</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayCollectionDifferences(NUnit.Framework.Constraints.MessageWriter,System.Collections.ICollection,System.Collections.ICollection,System.Int32)">
+            <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="actual">The actual collection</param>
+            <param name="depth">The depth of this failure in a set of nested collections</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayTypesAndSizes(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,System.Int32)">
+            <summary>
+            Displays a single line showing the types and sizes of the expected
+            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="actual">The actual collection or array</param>
+            <param name="indent">The indentation level for the message line</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayFailurePoint(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,NUnit.Framework.Constraints.FailurePoint,System.Int32)">
+            <summary>
+            Displays a single line showing the point in the expected and actual
+            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="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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayEnumerableDifferences(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,System.Int32)">
+            <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>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.IgnoreCase">
+            <summary>
+            Flag the constraint to ignore case and return self.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.NoClip">
+            <summary>
+            Flag the constraint to suppress string clipping 
+            and return self.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.AsCollection">
+            <summary>
+            Flag the constraint to compare arrays as collections
+            and return self.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Ulps">
+            <summary>
+            Switches the .Within() modifier to interpret its tolerance as
+            a distance in representable values (see remarks).
+            </summary>
+            <returns>Self.</returns>
+            <remarks>
+            Ulp stands for "unit in the last place" and describes the minimum
+            amount a given value can change. For any integers, an ulp is 1 whole
+            digit. For floating point values, the accuracy of which is better
+            for smaller numbers and worse for larger numbers, an ulp depends
+            on the size of the number. Using ulps for comparison of floating
+            point results instead of fixed tolerances is safer because it will
+            automatically compensate for the added inaccuracy of larger numbers.
+            </remarks>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Percent">
+            <summary>
+            Switches the .Within() modifier to interpret its tolerance as
+            a percentage that the actual values is allowed to deviate from
+            the expected value.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Days">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in days.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Hours">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in hours.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Minutes">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in minutes.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Seconds">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in seconds.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Milliseconds">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in milliseconds.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Ticks">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in clock ticks.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapter">
+            <summary>
+            EqualityAdapter class handles all equality comparisons
+            that use an IEqualityComparer, IEqualityComparer<T>
+            or a ComparisonAdapter.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.AreEqual(System.Object,System.Object)">
+            <summary>
+            Compares two objects, returning true if they are equal
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.CanCompare(System.Object,System.Object)">
+            <summary>
+            Returns true if the two objects can be compared by this adapter.
+            The base adapter cannot handle IEnumerables except for strings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For(System.Collections.IComparer)">
+            <summary>
+            Returns an EqualityAdapter that wraps an IComparer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For(System.Collections.IEqualityComparer)">
+            <summary>
+            Returns an EqualityAdapter that wraps an IEqualityComparer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Returns an EqualityAdapter that wraps an IEqualityComparer<T>.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Returns an EqualityAdapter that wraps an IComparer<T>.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Comparison{``0})">
+            <summary>
+            Returns an EqualityAdapter that wraps a Comparison<T>.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapter.ComparerAdapter">
+            <summary>
+            EqualityAdapter that wraps an IComparer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.GenericEqualityAdapter`1.CanCompare(System.Object,System.Object)">
+            <summary>
+            Returns true if the two objects can be compared by this adapter.
+            Generic adapter requires objects of the specified type.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapter.ComparerAdapter`1">
+            <summary>
+            EqualityAdapter that wraps an IComparer.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapterList">
+            <summary>
+            EqualityAdapterList represents a list of EqualityAdapters
+            in a common class across platforms.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExactCountConstraint">
+            <summary>
+            ExactCountConstraint applies another constraint to each
+            item in a collection, succeeding only if a specified
+            number of items succeed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountConstraint.#ctor(System.Int32,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct an ExactCountConstraint on top of an existing constraint
+            </summary>
+            <param name="expectedCount"></param>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExactTypeConstraint">
+            <summary>
+            ExactTypeConstraint is used to test that an object
+            is of the exact type provided in the constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactTypeConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an ExactTypeConstraint for a given Type
+            </summary>
+            <param name="type">The expected Type.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactTypeConstraint.Matches(System.Object)">
+            <summary>
+            Test that an object is of the exact type specified
+            </summary>
+            <param name="actual">The actual value.</param>
+            <returns>True if the tested object is of the exact type provided, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactTypeConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExceptionTypeConstraint">
+            <summary>
+            ExceptionTypeConstraint is a special version of ExactTypeConstraint
+            used to provided detailed info about the exception thrown in
+            an error message.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExceptionTypeConstraint.#ctor(System.Type)">
+            <summary>
+            Constructs an ExceptionTypeConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExceptionTypeConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FailurePoint">
+            <summary>
+            FailurePoint class represents one point of failure
+            in an equality test.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.Position">
+            <summary>
+            The location of the failure
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ExpectedValue">
+            <summary>
+            The expected value
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ActualValue">
+            <summary>
+            The actual value
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ExpectedHasData">
+            <summary>
+            Indicates whether the expected value is valid
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ActualHasData">
+            <summary>
+            Indicates whether the actual value is valid
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FailurePointList">
+            <summary>
+            FailurePointList represents a set of FailurePoints
+            in a cross-platform way.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FalseConstraint">
+            <summary>
+            FalseConstraint tests that the actual value is false
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FalseConstraint.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:FalseConstraint"/> class.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FloatingPointNumerics">
+            <summary>Helper routines for working with floating point numbers</summary>
+            <remarks>
+              <para>
+                The floating point comparison code is based on this excellent article:
+                http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
+              </para>
+              <para>
+                "ULP" means Unit in the Last Place and in the context of this library refers to
+                the distance between two adjacent floating point numbers. IEEE floating point
+                numbers can only represent a finite subset of natural numbers, with greater
+                accuracy for smaller numbers and lower accuracy for very large numbers.
+              </para>
+              <para>
+                If a comparison is allowed "2 ulps" of deviation, that means the values are
+                allowed to deviate by up to 2 adjacent floating point values, which might be
+                as low as 0.0000001 for small numbers or as high as 10.0 for large numbers.
+              </para>
+            </remarks>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.AreAlmostEqualUlps(System.Single,System.Single,System.Int32)">
+            <summary>Compares two floating point values for equality</summary>
+            <param name="left">First floating point value to be compared</param>
+            <param name="right">Second floating point value t be compared</param>
+            <param name="maxUlps">
+              Maximum number of representable floating point values that are allowed to
+              be between the left and the right floating point values
+            </param>
+            <returns>True if both numbers are equal or close to being equal</returns>
+            <remarks>
+              <para>
+                Floating point values can only represent a finite subset of natural numbers.
+                For example, the values 2.00000000 and 2.00000024 can be stored in a float,
+                but nothing inbetween them.
+              </para>
+              <para>
+                This comparison will count how many possible floating point values are between
+                the left and the right number. If the number of possible values between both
+                numbers is less than or equal to maxUlps, then the numbers are considered as
+                being equal.
+              </para>
+              <para>
+                Implementation partially follows the code outlined here:
+                http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+              </para>
+            </remarks>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.AreAlmostEqualUlps(System.Double,System.Double,System.Int64)">
+            <summary>Compares two double precision floating point values for equality</summary>
+            <param name="left">First double precision floating point value to be compared</param>
+            <param name="right">Second double precision floating point value t be compared</param>
+            <param name="maxUlps">
+              Maximum number of representable double precision floating point values that are
+              allowed to be between the left and the right double precision floating point values
+            </param>
+            <returns>True if both numbers are equal or close to being equal</returns>
+            <remarks>
+              <para>
+                Double precision floating point values can only represent a limited series of
+                natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004
+                can be stored in a double, but nothing inbetween them.
+              </para>
+              <para>
+                This comparison will count how many possible double precision floating point
+                values are between the left and the right number. If the number of possible
+                values between both numbers is less than or equal to maxUlps, then the numbers
+                are considered as being equal.
+              </para>
+              <para>
+                Implementation partially follows the code outlined here:
+                http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+              </para>
+            </remarks>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsInt(System.Single)">
+            <summary>
+              Reinterprets the memory contents of a floating point value as an integer value
+            </summary>
+            <param name="value">
+              Floating point value whose memory contents to reinterpret
+            </param>
+            <returns>
+              The memory contents of the floating point value interpreted as an integer
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsLong(System.Double)">
+            <summary>
+              Reinterprets the memory contents of a double precision floating point
+              value as an integer value
+            </summary>
+            <param name="value">
+              Double precision floating point value whose memory contents to reinterpret
+            </param>
+            <returns>
+              The memory contents of the double precision floating point value
+              interpreted as an integer
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsFloat(System.Int32)">
+            <summary>
+              Reinterprets the memory contents of an integer as a floating point value
+            </summary>
+            <param name="value">Integer value whose memory contents to reinterpret</param>
+            <returns>
+              The memory contents of the integer value interpreted as a floating point value
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsDouble(System.Int64)">
+            <summary>
+              Reinterprets the memory contents of an integer value as a double precision
+              floating point value
+            </summary>
+            <param name="value">Integer whose memory contents to reinterpret</param>
+            <returns>
+              The memory contents of the integer interpreted as a double precision
+              floating point value
+            </returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion">
+            <summary>Union of a floating point variable and an integer</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.Float">
+            <summary>The union's value as a floating point variable</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.Int">
+            <summary>The union's value as an integer</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.UInt">
+            <summary>The union's value as an unsigned integer</summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion">
+            <summary>Union of a double precision floating point variable and a long</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.Double">
+            <summary>The union's value as a double precision floating point variable</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.Long">
+            <summary>The union's value as a long</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.ULong">
+            <summary>The union's value as an unsigned long</summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.GreaterThanConstraint">
+            <summary>
+            Tests whether a value is greater than the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.GreaterThanConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:GreaterThanConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint">
+            <summary>
+            Tests whether a value is greater than or equal to the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:GreaterThanOrEqualConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.InstanceOfTypeConstraint">
+            <summary>
+            InstanceOfTypeConstraint is used to test that an object
+            is of the same type provided or derived from it.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an InstanceOfTypeConstraint for the type provided
+            </summary>
+            <param name="type">The expected Type</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.Matches(System.Object)">
+            <summary>
+            Test whether an object is of the specified type or a derived type
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True if the object is of the provided type or derives from it, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.LessThanConstraint">
+            <summary>
+            Tests whether a value is less than the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.LessThanConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:LessThanConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.LessThanOrEqualConstraint">
+            <summary>
+            Tests whether a value is less than or equal to the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.LessThanOrEqualConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:LessThanOrEqualConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.MessageWriter">
+            <summary>
+            MessageWriter is the abstract base for classes that write
+            constraint descriptions and messages in some form. The
+            class has separate methods for writing various components
+            of a message, allowing implementations to tailor the
+            presentation as needed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.#ctor">
+            <summary>
+            Construct a MessageWriter given a culture
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteMessageLine(System.String,System.Object[])">
+            <summary>
+            Method to write single line  message with optional args, usually
+            written to precede the general failure message.
+            </summary>
+            <param name="message">The message to be written</param>
+            <param name="args">Any arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteMessageLine(System.Int32,System.String,System.Object[])">
+            <summary>
+            Method to write single line  message with optional args, usually
+            written to precede the general failure message, at a givel 
+            indentation level.
+            </summary>
+            <param name="level">The indentation level of the message</param>
+            <param name="message">The message to be written</param>
+            <param name="args">Any arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Display Expected and Actual lines for a constraint. This
+            is called by MessageWriter's default implementation of 
+            WriteMessageTo and provides the generic two-line display. 
+            </summary>
+            <param name="constraint">The constraint that failed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(System.Object,System.Object)">
+            <summary>
+            Display Expected and Actual lines for given values. This
+            method may be called by constraints that need more control over
+            the display of actual and expected values than is provided
+            by the default implementation.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance)">
+            <summary>
+            Display Expected and Actual lines for given values, including
+            a tolerance value on the Expected line.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+            <param name="tolerance">The tolerance within which the test was made</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayStringDifferences(System.String,System.String,System.Int32,System.Boolean,System.Boolean)">
+            <summary>
+            Display the expected and actual string values on separate lines.
+            If the mismatch parameter is >=0, an additional line is displayed
+            line containing a caret that points to the mismatch point.
+            </summary>
+            <param name="expected">The expected string value</param>
+            <param name="actual">The actual string value</param>
+            <param name="mismatch">The point at which the strings don't match or -1</param>
+            <param name="ignoreCase">If true, case is ignored in locating the point where the strings differ</param>
+            <param name="clipping">If true, the strings should be clipped to fit the line</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteConnector(System.String)">
+            <summary>
+            Writes the text for a connector.
+            </summary>
+            <param name="connector">The connector.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WritePredicate(System.String)">
+            <summary>
+            Writes the text for a predicate.
+            </summary>
+            <param name="predicate">The predicate.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteExpectedValue(System.Object)">
+            <summary>
+            Writes the text for an expected value.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteModifier(System.String)">
+            <summary>
+            Writes the text for a modifier
+            </summary>
+            <param name="modifier">The modifier.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteActualValue(System.Object)">
+            <summary>
+            Writes the text for an actual value.
+            </summary>
+            <param name="actual">The actual value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteValue(System.Object)">
+            <summary>
+            Writes the text for a generalized value.
+            </summary>
+            <param name="val">The value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteCollectionElements(System.Collections.IEnumerable,System.Int32,System.Int32)">
+            <summary>
+            Writes the text for a collection value,
+            starting at a particular point, to a max length
+            </summary>
+            <param name="collection">The collection containing elements to write.</param>
+            <param name="start">The starting point of the elements to write</param>
+            <param name="max">The maximum number of elements to write</param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.MessageWriter.MaxLineLength">
+            <summary>
+            Abstract method to get the max line length
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.MsgUtils">
+            <summary>
+            Static methods used in creating messages
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.MsgUtils.ELLIPSIS">
+            <summary>
+            Static string used when strings are clipped
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.GetTypeRepresentation(System.Object)">
+            <summary>
+            Returns the representation of a type as used in NUnitLite.
+            This is the same as Type.ToString() except for arrays,
+            which are displayed with their declared sizes.
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.EscapeControlChars(System.String)">
+            <summary>
+            Converts any control characters in a string 
+            to their escaped representation.
+            </summary>
+            <param name="s">The string to be converted</param>
+            <returns>The converted string</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.GetArrayIndicesAsString(System.Int32[])">
+            <summary>
+            Return the a string representation for a set of indices into an array
+            </summary>
+            <param name="indices">Array of indices for which a string is needed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.GetArrayIndicesFromCollectionIndex(System.Collections.IEnumerable,System.Int32)">
+            <summary>
+            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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.ClipString(System.String,System.Int32,System.Int32)">
+            <summary>
+            Clip a string to a given length, starting at a particular offset, returning the clipped
+            string with ellipses representing the removed parts
+            </summary>
+            <param name="s">The string to be clipped</param>
+            <param name="maxStringLength">The maximum permitted length of the result string</param>
+            <param name="clipStart">The point at which to start clipping</param>
+            <returns>The clipped string</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.ClipExpectedAndActual(System.String@,System.String@,System.Int32,System.Int32)">
+            <summary>
+            Clip the expected and actual strings in a coordinated fashion, 
+            so that they may be displayed together.
+            </summary>
+            <param name="expected"></param>
+            <param name="actual"></param>
+            <param name="maxDisplayLength"></param>
+            <param name="mismatch"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.FindMismatchPosition(System.String,System.String,System.Int32,System.Boolean)">
+            <summary>
+            Shows the position two strings start to differ.  Comparison 
+            starts at the start index.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="istart">The index in the strings at which comparison should start</param>
+            <param name="ignoreCase">Boolean indicating whether case should be ignored</param>
+            <returns>-1 if no mismatch found, or the index where mismatch found</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NaNConstraint">
+            <summary>
+            NaNConstraint tests that the actual value is a double or float NaN
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NaNConstraint.Matches(System.Object)">
+            <summary>
+            Test that the actual value is an NaN
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NaNConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a specified writer
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NoItemConstraint">
+            <summary>
+            NoItemConstraint applies another constraint to each
+            item in a collection, failing if any of them succeeds.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoItemConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct a NoItemConstraint on top of an existing constraint
+            </summary>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoItemConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            failing if any item fails.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoItemConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NotConstraint">
+            <summary>
+            NotConstraint negates the effect of some other constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.NotConstraint"/> class.
+            </summary>
+            <param name="baseConstraint">The base constraint to be negated.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for if the base constraint fails, false if it succeeds</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a MessageWriter.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NullConstraint">
+            <summary>
+            NullConstraint tests that the actual value is null
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullConstraint.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:NullConstraint"/> class.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NullOrEmptyStringConstraint">
+            <summary>
+            NullEmptyStringConstraint tests whether a string is either null or empty.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullOrEmptyStringConstraint.#ctor">
+            <summary>
+            Constructs a new NullOrEmptyStringConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullOrEmptyStringConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullOrEmptyStringConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Numerics">
+            <summary>
+            The Numerics class contains common operations on numeric values.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.IsNumericType(System.Object)">
+            <summary>
+            Checks the type of the object, returning true if
+            the object is a numeric type.
+            </summary>
+            <param name="obj">The object to check</param>
+            <returns>true if the object is a numeric type</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.IsFloatingPointNumeric(System.Object)">
+            <summary>
+            Checks the type of the object, returning true if
+            the object is a floating point numeric type.
+            </summary>
+            <param name="obj">The object to check</param>
+            <returns>true if the object is a floating point numeric type</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.IsFixedPointNumeric(System.Object)">
+            <summary>
+            Checks the type of the object, returning true if
+            the object is a fixed point numeric type.
+            </summary>
+            <param name="obj">The object to check</param>
+            <returns>true if the object is a fixed point numeric type</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Test two numeric values for equality, performing the usual numeric 
+            conversions and using a provided or default tolerance. If the tolerance 
+            provided is Empty, this method may set it to a default tolerance.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="tolerance">A reference to the tolerance in effect</param>
+            <returns>True if the values are equal</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.Compare(System.Object,System.Object)">
+            <summary>
+            Compare two numeric values, performing the usual numeric conversions.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <returns>The relationship of the values to each other</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitComparer">
+            <summary>
+            NUnitComparer encapsulates NUnit's default behavior
+            in comparing two objects.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitComparer.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two objects
+            </summary>
+            <param name="x"></param>
+            <param name="y"></param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitComparer.Default">
+            <summary>
+            Returns the default NUnitComparer.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitComparer`1">
+            <summary>
+            Generic version of NUnitComparer
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitComparer`1.Compare(`0,`0)">
+            <summary>
+            Compare two objects of the same type
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitEqualityComparer">
+            <summary>
+            NUnitEqualityComparer encapsulates NUnit's handling of
+            equality tests between objects.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.INUnitEqualityComparer">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.INUnitEqualityComparer.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)">
+            <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>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.caseInsensitive">
+            <summary>
+            If true, all string comparisons will ignore case
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.compareAsCollection">
+            <summary>
+            If true, arrays will be treated as collections, allowing
+            those of different dimensions to be compared
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.externalComparers">
+            <summary>
+            Comparison objects used in comparisons for some constraints.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.failurePoints">
+            <summary>
+            List of points at which a failure occured.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.recursionDetector">
+            <summary>
+            RecursionDetector used to check for recursion when
+            evaluating self-referencing enumerables.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Compares two objects for equality within a tolerance, setting
+            the tolerance to the actual tolerance used if an empty
+            tolerance is supplied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.ArraysEqual(System.Array,System.Array,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Helper method to compare two arrays
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.DirectoriesEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Method to compare two DirectoryInfo objects
+            </summary>
+            <param name="expected">first directory to compare</param>
+            <param name="actual">second directory to compare</param>
+            <returns>true if equivalent, false if not</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.Default">
+            <summary>
+            Returns the default NUnitEqualityComparer
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.IgnoreCase">
+            <summary>
+            Gets and sets a flag indicating whether case should
+            be ignored in determining equality.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.CompareAsCollection">
+            <summary>
+            Gets and sets a flag indicating that arrays should be
+            compared as collections, without regard to their shape.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.ExternalComparers">
+            <summary>
+            Gets the list of external comparers to be used to
+            test for equality. They are applied to members of
+            collections, in place of NUnit's own logic.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoints">
+            <summary>
+            Gets the list of failure points for the last Match performed.
+            The list consists of objects to be interpreted by the caller.
+            This generally means that the caller may only make use of
+            objects it has placed on the list at a particular depthy.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitEqualityComparer.RecursionDetector">
+            <summary>
+            RecursionDetector detects when a comparison
+            between two enumerables has reached a point
+            where the same objects that were previously
+            compared are again being compared. This allows
+            the caller to stop the comparison if desired.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.RecursionDetector.CheckRecursion(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Check whether two objects have previously
+            been compared, returning true if they have.
+            The two objects are remembered, so that a
+            second call will always return true.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AllOperator">
+            <summary>
+            Represents a constraint that succeeds if all the 
+            members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionOperator">
+            <summary>
+            Abstract base for operators that indicate how to
+            apply a constraint to items in a collection.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PrefixOperator">
+            <summary>
+            PrefixOperator takes a single constraint and modifies
+            it's action in some way.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintOperator">
+            <summary>
+            The ConstraintOperator class is used internally by a
+            ConstraintBuilder to represent an operator that 
+            modifies or combines constraints. 
+            
+            Constraint operators use left and right precedence
+            values to determine whether the top operator on the
+            stack should be reduced before pushing a new operator.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ConstraintOperator.left_precedence">
+            <summary>
+            The precedence value used when the operator
+            is about to be pushed to the stack.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ConstraintOperator.right_precedence">
+            <summary>
+            The precedence value used when the operator
+            is on the top of the stack.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.LeftContext">
+            <summary>
+            The syntax element preceding this operator
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.RightContext">
+            <summary>
+            The syntax element folowing this operator
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.LeftPrecedence">
+            <summary>
+            The precedence value used when the operator
+            is about to be pushed to the stack.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.RightPrecedence">
+            <summary>
+            The precedence value used when the operator
+            is on the top of the stack.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PrefixOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PrefixOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns the constraint created by applying this
+            prefix to another constraint.
+            </summary>
+            <param name="constraint"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOperator.#ctor">
+            <summary>
+            Constructs a CollectionOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            they all succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AndOperator">
+            <summary>
+            Operator that requires both it's arguments to succeed
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BinaryOperator">
+            <summary>
+            Abstract base class for all binary operators
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinaryOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinaryOperator.ApplyOperator(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Abstract method that produces a constraint by applying
+            the operator to its left and right constraint arguments.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.BinaryOperator.LeftPrecedence">
+            <summary>
+            Gets the left precedence of the operator
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.BinaryOperator.RightPrecedence">
+            <summary>
+            Gets the right precedence of the operator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndOperator.#ctor">
+            <summary>
+            Construct an AndOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndOperator.ApplyOperator(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Apply the operator to produce an AndConstraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AttributeOperator">
+            <summary>
+            Operator that tests for the presence of a particular attribute
+            on a type and optionally applies further tests to the attribute.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SelfResolvingOperator">
+            <summary>
+            Abstract base class for operators that are able to reduce to a 
+            constraint whether or not another syntactic element follows.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeOperator.#ctor(System.Type)">
+            <summary>
+            Construct an AttributeOperator for a particular Type
+            </summary>
+            <param name="type">The Type of attribute tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionOrderedConstraint">
+            <summary>
+            CollectionOrderedConstraint is used to test whether a collection is ordered.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.#ctor">
+            <summary>
+            Construct a CollectionOrderedConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Modifies the constraint to use an IComparer and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Modifies the constraint to use an IComparer<T> and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Modifies the constraint to use a Comparison<T> and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.By(System.String)">
+            <summary>
+            Modifies the constraint to test ordering by the value of
+            a specified property and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether the collection is ordered
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of the constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.CollectionOrderedConstraint.Descending">
+            <summary>
+             If used performs a reverse comparison
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExactCountOperator">
+            <summary>
+            Represents a constraint that succeeds if the specified 
+            count of members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountOperator.#ctor(System.Int32)">
+            <summary>
+            Construct an ExactCountOperator for a specified count
+            </summary>
+            <param name="expectedCount">The expected count</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            none of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NoneOperator">
+            <summary>
+            Represents a constraint that succeeds if none of the 
+            members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoneOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            none of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NotOperator">
+            <summary>
+            Negates the test of the constraint it wraps.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotOperator.#ctor">
+            <summary>
+            Constructs a new NotOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a NotConstraint applied to its argument.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.OrOperator">
+            <summary>
+            Operator that requires at least one of it's arguments to succeed
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrOperator.#ctor">
+            <summary>
+            Construct an OrOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrOperator.ApplyOperator(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Apply the operator to produce an OrConstraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PropOperator">
+            <summary>
+            Operator used to test for the presence of a named Property
+            on an object and optionally apply further tests to the
+            value of that property.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropOperator.#ctor(System.String)">
+            <summary>
+            Constructs a PropOperator for a particular named property
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.PropOperator.Name">
+            <summary>
+            Gets the name of the property to which the operator applies
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ThrowsOperator">
+            <summary>
+            Operator that tests that an exception is thrown and
+            optionally applies further tests to the exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsOperator.#ctor">
+            <summary>
+            Construct a ThrowsOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.WithOperator">
+            <summary>
+            Represents a constraint that simply wraps the
+            constraint provided as an argument, without any
+            further functionality, but which modifes the
+            order of evaluation because of its precedence.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.WithOperator.#ctor">
+            <summary>
+            Constructor for the WithOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.WithOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that wraps its argument
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.OrConstraint">
+            <summary>
+            OrConstraint succeeds if either member succeeds
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrConstraint.#ctor(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Create an OrConstraint from two other constraints
+            </summary>
+            <param name="left">The first constraint</param>
+            <param name="right">The second constraint</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrConstraint.Matches(System.Object)">
+            <summary>
+            Apply the member constraints to an actual value, succeeding 
+            succeeding as soon as one of them succeeds.
+            </summary>
+            <param name="actual">The actual value</param>
+            <returns>True if either constraint succeeded</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description for this contraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to receive the description</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PathConstraint">
+            <summary>
+            PathConstraint serves as the abstract base of constraints
+            that operate on paths and provides several helper methods.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.PathConstraint.expectedPath">
+            <summary>
+            The expected path used in the constraint
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.PathConstraint.caseInsensitive">
+            <summary>
+            Flag indicating whether a caseInsensitive comparison should be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.#ctor(System.String)">
+            <summary>
+            Construct a PathConstraint for a give expected path
+            </summary>
+            <param name="expectedPath">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Returns true if the expected path and actual path match
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.Canonicalize(System.String)">
+            <summary>
+            Transform the provided path to its canonical form so that it 
+            may be more easily be compared with other paths.
+            </summary>
+            <param name="path">The original path</param>
+            <returns>The path in canonical form</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.IsSubPath(System.String,System.String,System.Boolean)">
+            <summary>
+            Test whether one path in canonical form is under another.
+            </summary>
+            <param name="path1">The first path - supposed to be the parent path</param>
+            <param name="path2">The second path - supposed to be the child path</param>
+            <param name="ignoreCase">Indicates whether case should be ignored</param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.PathConstraint.IgnoreCase">
+            <summary>
+            Modifies the current instance to be case-insensitve
+            and returns it.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.PathConstraint.RespectCase">
+            <summary>
+            Modifies the current instance to be case-sensitve
+            and returns it.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PredicateConstraint`1">
+            <summary>
+            Predicate constraint wraps a Predicate in a constraint,
+            returning success if the predicate is true.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PredicateConstraint`1.#ctor(System.Predicate{`0})">
+            <summary>
+            Construct a PredicateConstraint from a predicate
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PredicateConstraint`1.Matches(System.Object)">
+            <summary>
+            Determines whether the predicate succeeds when applied
+            to the actual value.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PredicateConstraint`1.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes the description to a MessageWriter
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PropertyConstraint">
+            <summary>
+            PropertyConstraint extracts a named property and uses
+            its value as the actual value for a chained constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.#ctor(System.String,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Initializes a new instance of the <see cref="T:PropertyConstraint"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="baseConstraint">The constraint to apply to the property.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PropertyExistsConstraint">
+            <summary>
+            PropertyExistsConstraint tests that a named property
+            exists on the object provided through Match.
+            
+            Originally, PropertyConstraint provided this feature
+            in addition to making optional tests on the vaue
+            of the property. The two constraints are now separate.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:PropertyExistConstraint"/> class.
+            </summary>
+            <param name="name">The name of the property.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the property exists for a given object
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.RangeConstraint`1">
+            <summary>
+            RangeConstraint tests whether two values are within a 
+            specified range.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RangeConstraint`1.#ctor(`0,`0)">
+            <summary>
+            Initializes a new instance of the <see cref="T:RangeConstraint"/> class.
+            </summary>
+            <param name="from">From.</param>
+            <param name="to">To.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RangeConstraint`1.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RangeConstraint`1.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.RegexConstraint">
+            <summary>
+            RegexConstraint can test whether a string matches
+            the pattern provided.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RegexConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:RegexConstraint"/> class.
+            </summary>
+            <param name="pattern">The pattern.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RegexConstraint.Matches(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RegexConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ResolvableConstraintExpression">
+            <summary>
+            ResolvableConstraintExpression is used to represent a compound
+            constraint being constructed at a point where the last operator
+            may either terminate the expression or may have additional 
+            qualifying constraints added to it. 
+            
+            It is used, for example, for a Property element or for
+            an Exception element, either of which may be optionally
+            followed by constraints that apply to the property or 
+            exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.#ctor">
+            <summary>
+            Create a new instance of ResolvableConstraintExpression
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Create a new instance of ResolvableConstraintExpression,
+            passing in a pre-populated ConstraintBuilder.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.NUnit#Framework#Constraints#IResolveConstraint#Resolve">
+            <summary>
+            Resolve the current expression to a Constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseAnd(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseAnd(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseAnd(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseOr(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseOr(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseOr(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_LogicalNot(NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied if the 
+            argument constraint is not satisfied.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ResolvableConstraintExpression.And">
+            <summary>
+            Appends an And Operator to the expression
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ResolvableConstraintExpression.Or">
+            <summary>
+            Appends an Or operator to the expression.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ReusableConstraint">
+            <summary>
+            ReusableConstraint wraps a constraint expression after 
+            resolving it so that it can be reused consistently.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.#ctor(NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Construct a ReusableConstraint from a constraint expression
+            </summary>
+            <param name="c">The expression to be resolved and reused</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.op_Implicit(NUnit.Framework.Constraints.Constraint)~NUnit.Framework.Constraints.ReusableConstraint">
+            <summary>
+            Converts a constraint to a ReusableConstraint
+            </summary>
+            <param name="c">The constraint to be converted</param>
+            <returns>A ReusableConstraint</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.ToString">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns>A string representing the constraint</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.Resolve">
+            <summary>
+            Resolves the ReusableConstraint by returning the constraint
+            that it originally wrapped.
+            </summary>
+            <returns>A resolved constraint</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SameAsConstraint">
+            <summary>
+            SameAsConstraint tests whether an object is identical to
+            the object passed to its constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SameAsConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SameAsConstraint"/> class.
+            </summary>
+            <param name="expected">The expected object.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SameAsConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SameAsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SamePathConstraint">
+            <summary>
+            Summary description for SamePathConstraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SamePathConstraint"/> class.
+            </summary>
+            <param name="expected">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="expectedPath">The expected path</param>
+            <param name="actualPath">The actual path</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SamePathOrUnderConstraint">
+            <summary>
+            SamePathOrUnderConstraint tests that one path is under another
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SamePathOrUnderConstraint"/> class.
+            </summary>
+            <param name="expected">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="expectedPath">The expected path</param>
+            <param name="actualPath">The actual path</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BinarySerializableConstraint">
+            <summary>
+            BinarySerializableConstraint tests whether 
+            an object is serializable in binary format.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SomeOperator">
+            <summary>
+            Represents a constraint that succeeds if any of the 
+            members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            any of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SomeItemsConstraint">
+            <summary>
+            SomeItemsConstraint applies another constraint to each
+            item in a collection, succeeding if any of them succeeds.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeItemsConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct a SomeItemsConstraint on top of an existing constraint
+            </summary>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeItemsConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            succeeding if any item succeeds.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeItemsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.StartsWithConstraint">
+            <summary>
+            StartsWithConstraint can test whether a string starts
+            with an expected substring.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StartsWithConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:StartsWithConstraint"/> class.
+            </summary>
+            <param name="expected">The expected string</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StartsWithConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is matched by the actual value.
+            This is a template method, which calls the IsMatch method
+            of the derived class.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StartsWithConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SubPathConstraint">
+            <summary>
+            SubPathConstraint tests that the actual path is under the expected path
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubPathConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SubPathConstraint"/> class.
+            </summary>
+            <param name="expected">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubPathConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="expectedPath">The expected path</param>
+            <param name="actualPath">The actual path</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubPathConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SubstringConstraint">
+            <summary>
+            SubstringConstraint can test whether a string contains
+            the expected substring.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubstringConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SubstringConstraint"/> class.
+            </summary>
+            <param name="expected">The expected.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubstringConstraint.Matches(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubstringConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ThrowsConstraint">
+            <summary>
+            ThrowsConstraint is used to test the exception thrown by 
+            a delegate by applying a constraint to it.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.ThrowsConstraint"/> class,
+            using a constraint to be applied to the exception.
+            </summary>
+            <param name="baseConstraint">A constraint to apply to the caught exception.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.Matches(System.Object)">
+            <summary>
+            Executes the code of the delegate and captures any exception.
+            If a non-null base constraint was provided, it applies that
+            constraint to the exception.
+            </summary>
+            <param name="actual">A delegate representing the code to be tested</param>
+            <returns>True if an exception is thrown and the constraint succeeds, otherwise false</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.Matches``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})">
+            <summary>
+            Converts an ActualValueDelegate to a TestDelegate
+            before calling the primary overload.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ThrowsConstraint.ActualException">
+            <summary>
+            Get the actual exception thrown - used by Assert.Throws.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ThrowsNothingConstraint">
+            <summary>
+            ThrowsNothingConstraint tests that a delegate does not
+            throw an exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsNothingConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True if no exception is thrown, otherwise false</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsNothingConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsNothingConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. Overridden in ThrowsNothingConstraint to write 
+            information about the exception that was actually caught.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Tolerance">
+            <summary>
+            The Tolerance class generalizes the notion of a tolerance
+            within which an equality test succeeds. Normally, it is
+            used with numeric types, but it can be used with any
+            type that supports taking a difference between two 
+            objects and comparing that difference to a value.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Tolerance.#ctor(System.Object)">
+            <summary>
+            Constructs a linear tolerance of a specdified amount
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Tolerance.#ctor(System.Object,NUnit.Framework.Constraints.ToleranceMode)">
+            <summary>
+            Constructs a tolerance given an amount and ToleranceMode
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Tolerance.CheckLinearAndNumeric">
+            <summary>
+            Tests that the current Tolerance is linear with a 
+            numeric value, throwing an exception if it is not.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Empty">
+            <summary>
+            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>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Zero">
+            <summary>
+            Returns a zero Tolerance object, equivalent to 
+            specifying an exact match.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Mode">
+            <summary>
+            Gets the ToleranceMode for the current Tolerance
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Value">
+            <summary>
+            Gets the value of the current Tolerance instance.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Percent">
+            <summary>
+            Returns a new tolerance, using the current amount as a percentage.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Ulps">
+            <summary>
+            Returns a new tolerance, using the current amount in Ulps.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Days">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of days.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Hours">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of hours.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Minutes">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of minutes.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Seconds">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of seconds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Milliseconds">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of milliseconds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Ticks">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of clock ticks.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.IsEmpty">
+            <summary>
+            Returns true if the current tolerance is empty.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ToleranceMode">
+            <summary>
+            Modes in which the tolerance value for a comparison can be interpreted.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.None">
+            <summary>
+            The tolerance was created with a value, without specifying 
+            how the value would be used. This is used to prevent setting
+            the mode more than once and is generally changed to Linear
+            upon execution of the test.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.Linear">
+            <summary>
+            The tolerance is used as a numeric range within which
+            two compared values are considered to be equal.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.Percent">
+            <summary>
+            Interprets the tolerance as the percentage by which
+            the two compared values my deviate from each other.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.Ulps">
+            <summary>
+            Compares two values based in their distance in
+            representable numbers.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.TrueConstraint">
+            <summary>
+            TrueConstraint tests that the actual value is true
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.TrueConstraint.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:TrueConstraint"/> class.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.UniqueItemsConstraint">
+            <summary>
+            UniqueItemsConstraint tests whether all the items in a 
+            collection are unique.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.UniqueItemsConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Check that all items are unique.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.UniqueItemsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.XmlSerializableConstraint">
+            <summary>
+            XmlSerializableConstraint tests whether 
+            an object is serializable in XML format.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.Matches(System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Contains">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Contains.Item(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Contains.Substring(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DirectoryAssert">
+            <summary>
+            Summary description for DirectoryAssert
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.Equals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.ReferenceEquals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.#ctor">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.String,System.String,System.String)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.String,System.String)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.String,System.String)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.String,System.String)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.String)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.String,System.String)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.String)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.String,System.String,System.String)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.String,System.String)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.String,System.String,System.String)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.String,System.String)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="T:NUnit.Framework.AssertionException">
+            <summary>
+            Thrown when an assertion failed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.AssertionException.#ctor(System.String)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IgnoreException">
+            <summary>
+            Thrown when an assertion failed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreException.#ctor(System.String)">
+            <param name="message"></param>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.InconclusiveException">
+            <summary>
+            Thrown when a test executes inconclusively.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.InconclusiveException.#ctor(System.String)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+        </member>
+        <member name="M:NUnit.Framework.InconclusiveException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.InconclusiveException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SuccessException">
+            <summary>
+            Thrown when an assertion failed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SuccessException.#ctor(System.String)">
+            <param name="message"></param>
+        </member>
+        <member name="M:NUnit.Framework.SuccessException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.SuccessException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.FileAssert">
+            <summary>
+            Summary description for FileAssert.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.Equals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.ReferenceEquals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.#ctor">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream,System.String,System.Object[])">
+            <summary>
+            Verifies that two Streams are equal.  Two Streams are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream,System.String)">
+            <summary>
+            Verifies that two Streams are equal.  Two Streams are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream)">
+            <summary>
+            Verifies that two Streams are equal.  Two Streams are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo,System.String,System.Object[])">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo,System.String)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String,System.String)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream,System.String,System.Object[])">
+            <summary>
+            Asserts that two Streams are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to be displayed when the two Stream are the same.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream,System.String)">
+            <summary>
+            Asserts that two Streams are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to be displayed when the Streams are the same.</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream)">
+            <summary>
+            Asserts that two Streams are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo,System.String)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+        </member>
+        <member name="T:NUnit.Framework.GlobalSettings">
+            <summary>
+            GlobalSettings is a place for setting default values used
+            by the framework in performing asserts.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.GlobalSettings.DefaultFloatingPointTolerance">
+            <summary>
+            Default tolerance for floating point equality
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Guard">
+            <summary>
+            Class used to guard against unexpected argument values
+            by throwing an appropriate exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Guard.ArgumentNotNull(System.Object,System.String)">
+            <summary>
+            Throws an exception if an argument is null
+            </summary>
+            <param name="value">The value to be tested</param>
+            <param name="name">The name of the argument</param>
+        </member>
+        <member name="M:NUnit.Framework.Guard.ArgumentNotNullOrEmpty(System.String,System.String)">
+            <summary>
+            Throws an exception if a string argument is null or empty
+            </summary>
+            <param name="value">The value to be tested</param>
+            <param name="name">The name of the argument</param>
+        </member>
+        <member name="T:NUnit.Framework.Has">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Exactly(System.Int32)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Has.Property(System.String)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Has.Attribute(System.Type)">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Attribute``1">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Member(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.No">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Some">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if at least one of them succeeds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.None">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them fail.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Length">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Length property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Count">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Count property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Message">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Message property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.InnerException">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the InnerException property of the object being tested.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.INUnitEqualityComparer`1">
+            <summary>
+            
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="M:NUnit.Framework.INUnitEqualityComparer`1.AreEqual(`0,`0,NUnit.Framework.Constraints.Tolerance@)">
+            <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>
+        </member>
+        <member name="T:NUnit.Framework.IExpectException">
+            <summary>
+            Interface implemented by a user fixture in order to
+            validate any expected exceptions. It is only called
+            for test methods marked with the ExpectedException
+            attribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IExpectException.HandleException(System.Exception)">
+            <summary>
+            Method to handle an expected exception
+            </summary>
+            <param name="ex">The exception to be handled</param>
+        </member>
+        <member name="T:NUnit.Framework.TestDetails">
+            <summary>
+            Provides details about a test
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestDetails.#ctor(System.Object,System.Reflection.MethodInfo,System.String,System.String,System.Boolean)">
+            <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>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.Fixture">
+            <summary>
+             The fixture that the test is a member of, if available.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.Method">
+            <summary>
+            The method that implements the test, if available.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.FullName">
+            <summary>
+            The full name of the test.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.Type">
+            <summary>
+            A string representing the type of test, e.g. "Test Case".
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.IsSuite">
+            <summary>
+            Indicates if the test represents a suite of tests.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Is">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.EqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests two items for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SameAs(System.Object)">
+            <summary>
+            Returns a constraint that tests that two references are the same object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.GreaterThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.GreaterThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AtLeast(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.LessThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.LessThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AtMost(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.TypeOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.TypeOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOfType(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOfType``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableFrom(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableFrom``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableTo(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableTo``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.EquivalentTo(System.Collections.IEnumerable)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.Is.SubsetOf(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a subset of the collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringContaining(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringStarting(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringEnding(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringMatching(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SamePath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same as an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SubPath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SamePathOrUnder(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InRange``1(``0,``0)">
+            <summary>
+            Returns a constraint that tests whether the actual value falls 
+            within a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Not">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Null">
+            <summary>
+            Returns a constraint that tests for null
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.True">
+            <summary>
+            Returns a constraint that tests for True
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.False">
+            <summary>
+            Returns a constraint that tests for False
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Positive">
+            <summary>
+            Returns a constraint that tests for a positive value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Negative">
+            <summary>
+            Returns a constraint that tests for a negative value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.NaN">
+            <summary>
+            Returns a constraint that tests for NaN
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Empty">
+            <summary>
+            Returns a constraint that tests for empty
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Unique">
+            <summary>
+            Returns a constraint that tests whether a collection 
+            contains all unique items.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.BinarySerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in binary format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.XmlSerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in xml format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Ordered">
+            <summary>
+            Returns a constraint that tests whether a collection is ordered
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Iz">
+            <summary>
+            The Iz class is a synonym for Is intended for use in VB,
+            which regards Is as a keyword.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.List">
+            <summary>
+            The List class is a helper class with properties and methods
+            that supply a number of constraints used with lists and collections.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.List.Map(System.Collections.ICollection)">
+            <summary>
+            List.Map returns a ListMapper, which can be used to map
+            the original collection to another collection.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.ListMapper">
+            <summary>
+            ListMapper is used to transform a collection used as an actual argument
+            producing another collection to be used in the assertion.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ListMapper.#ctor(System.Collections.ICollection)">
+            <summary>
+            Construct a ListMapper based on a collection
+            </summary>
+            <param name="original">The collection to be transformed</param>
+        </member>
+        <member name="M:NUnit.Framework.ListMapper.Property(System.String)">
+            <summary>
+            Produces a collection containing all the values of a property
+            </summary>
+            <param name="name">The collection of property values</param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Randomizer">
+            <summary>
+            Randomizer returns a set of random values in a repeatable
+            way, to allow re-running of tests if necessary.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetRandomizer(System.Reflection.MemberInfo)">
+            <summary>
+            Get a randomizer for a particular member, returning
+            one that has already been created if it exists.
+            This ensures that the same values are generated
+            each time the tests are reloaded.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetRandomizer(System.Reflection.ParameterInfo)">
+            <summary>
+            Get a randomizer for a particular parameter, returning
+            one that has already been created if it exists.
+            This ensures that the same values are generated
+            each time the tests are reloaded.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.#ctor">
+            <summary>
+            Construct a randomizer using a random seed
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.#ctor(System.Int32)">
+            <summary>
+            Construct a randomizer using a specified seed
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetDoubles(System.Int32)">
+            <summary>
+            Return an array of random doubles between 0.0 and 1.0.
+            </summary>
+            <param name="count"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetDoubles(System.Double,System.Double,System.Int32)">
+            <summary>
+            Return an array of random doubles with values in a specified range.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetInts(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Return an array of random ints with values in a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Randomizer.RandomSeed">
+            <summary>
+            Get a random seed for use in creating a randomizer.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SpecialValue">
+            <summary>
+            The SpecialValue enum is used to represent TestCase arguments
+            that cannot be used as arguments to an Attribute.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.SpecialValue.Null">
+            <summary>
+            Null represents a null value, which cannot be used as an 
+            argument to an attribute under .NET 1.x
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.StringAssert">
+            <summary>
+            Basic Asserts on strings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Equals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.ReferenceEquals(System.Object,System.Object)">
+            <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>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Contains(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Contains(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Contains(System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string is not found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string starts with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string starts with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String)">
+            <summary>
+            Asserts that a string starts with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string does not start with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string does not start with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String)">
+            <summary>
+            Asserts that a string does not start with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string ends with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string ends with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String)">
+            <summary>
+            Asserts that a string ends with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string does not end with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string does not end with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String)">
+            <summary>
+            Asserts that a string does not end with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two strings are equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two strings are equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String)">
+            <summary>
+            Asserts that two strings are equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two strings are not equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two strings are Notequal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String)">
+            <summary>
+            Asserts that two strings are not equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string matches an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be matched</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string matches an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be matched</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String)">
+            <summary>
+            Asserts that a string matches an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be matched</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string does not match an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be used</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string does not match an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be used</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String)">
+            <summary>
+            Asserts that a string does not match an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be used</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="T:NUnit.Framework.TestCaseData">
+            <summary>
+            The TestCaseData class represents a set of arguments
+            and other parameter info to be used for a parameterized
+            test case. It provides a number of instance modifiers
+            for use in initializing the test case.
+            
+            Note: Instance modifiers are getters that return
+            the same instance after modifying it's state.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.arguments">
+            <summary>
+            The argument list to be provided to the test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.expectedResult">
+            <summary>
+            The expected result to be returned
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.hasExpectedResult">
+            <summary>
+            Set to true if this has an expected result
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.expectedExceptionType">
+            <summary>
+             The expected exception Type
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.expectedExceptionName">
+            <summary>
+            The FullName of the expected exception
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.testName">
+            <summary>
+            The name to be used for the test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.description">
+            <summary>
+            The description of the test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.properties">
+            <summary>
+            A dictionary of properties, used to add information
+            to tests without requiring the class to change.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.isIgnored">
+            <summary>
+            If true, indicates that the test case is to be ignored
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.isExplicit">
+            <summary>
+            If true, indicates that the test case is marked explicit
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.ignoreReason">
+            <summary>
+            The reason for ignoring a test case
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="args">The arguments.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="arg">The argument.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="arg1">The first argument.</param>
+            <param name="arg2">The second argument.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object,System.Object,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="arg1">The first argument.</param>
+            <param name="arg2">The second argument.</param>
+            <param name="arg3">The third argument.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Returns(System.Object)">
+            <summary>
+            Sets the expected result for the test
+            </summary>
+            <param name="result">The expected result</param>
+            <returns>A modified TestCaseData</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Throws(System.Type)">
+            <summary>
+            Sets the expected exception type for the test
+            </summary>
+            <param name="exceptionType">Type of the expected exception.</param>
+            <returns>The modified TestCaseData instance</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Throws(System.String)">
+            <summary>
+            Sets the expected exception type for the test
+            </summary>
+            <param name="exceptionName">FullName of the expected exception.</param>
+            <returns>The modified TestCaseData instance</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetName(System.String)">
+            <summary>
+            Sets the name of the test case
+            </summary>
+            <returns>The modified TestCaseData instance</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetDescription(System.String)">
+            <summary>
+            Sets the description for the test case
+            being constructed.
+            </summary>
+            <param name="description">The description.</param>
+            <returns>The modified TestCaseData instance.</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetCategory(System.String)">
+            <summary>
+            Applies a category to the test
+            </summary>
+            <param name="category"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.String)">
+            <summary>
+            Applies a named property to the test
+            </summary>
+            <param name="propName"></param>
+            <param name="propValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.Int32)">
+            <summary>
+            Applies a named property to the test
+            </summary>
+            <param name="propName"></param>
+            <param name="propValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.Double)">
+            <summary>
+            Applies a named property to the test
+            </summary>
+            <param name="propName"></param>
+            <param name="propValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Ignore">
+            <summary>
+            Ignores this TestCase.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Ignore(System.String)">
+            <summary>
+            Ignores this TestCase, specifying the reason.
+            </summary>
+            <param name="reason">The reason.</param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.MakeExplicit">
+            <summary>
+            Marks this TestCase as Explicit
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.MakeExplicit(System.String)">
+            <summary>
+            Marks this TestCase as Explicit, specifying the reason.
+            </summary>
+            <param name="reason">The reason.</param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Arguments">
+            <summary>
+            Gets the argument list to be provided to the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Result">
+            <summary>
+            Gets the expected result
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.HasExpectedResult">
+            <summary>
+            Returns true if the result has been set
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.ExpectedException">
+            <summary>
+             Gets the expected exception Type
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.ExpectedExceptionName">
+            <summary>
+            Gets the FullName of the expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.TestName">
+            <summary>
+            Gets the name to be used for the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Description">
+            <summary>
+            Gets the description of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Ignored">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is ignored.
+            </summary>
+            <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Explicit">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is explicit.
+            </summary>
+            <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.IgnoreReason">
+            <summary>
+            Gets the ignore reason.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Categories">
+            <summary>
+            Gets a list of categories associated with this test.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Properties">
+            <summary>
+            Gets the property dictionary for this test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestContext">
+            <summary>
+            Provide the context information of the current test
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestContext.#ctor(System.Collections.IDictionary)">
+            <summary>
+            Constructs a TestContext using the provided context dictionary
+            </summary>
+            <param name="context">A context dictionary</param>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.CurrentContext">
+            <summary>
+            Get the current test context. This is created
+            as needed. The user may save the context for
+            use within a test, but it should not be used
+            outside the test for which it is created.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.Test">
+            <summary>
+            Gets a TestAdapter representing the currently executing test in this context.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.Result">
+            <summary>
+            Gets a ResultAdapter representing the current result for the test 
+            executing in this context.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestDirectory">
+            <summary>
+            Gets the directory containing the current test assembly.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.WorkDirectory">
+            <summary>
+            Gets the directory to be used for outputing files created
+            by this test run.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestContext.TestAdapter">
+            <summary>
+            TestAdapter adapts a Test for consumption by
+            the user test code.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestContext.TestAdapter.#ctor(System.Collections.IDictionary)">
+            <summary>
+            Constructs a TestAdapter for this context
+            </summary>
+            <param name="context">The context dictionary</param>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestAdapter.Name">
+            <summary>
+            The name of the test.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestAdapter.FullName">
+            <summary>
+            The FullName of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestAdapter.Properties">
+            <summary>
+            The properties of the test.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestContext.ResultAdapter">
+            <summary>
+            ResultAdapter adapts a TestResult for consumption by
+            the user test code.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestContext.ResultAdapter.#ctor(System.Collections.IDictionary)">
+            <summary>
+            Construct a ResultAdapter for a context
+            </summary>
+            <param name="context">The context holding the result</param>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.ResultAdapter.State">
+            <summary>
+            The TestState of current test. This maps to the ResultState
+            used in nunit.core and is subject to change in the future.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.ResultAdapter.Status">
+            <summary>
+            The TestStatus of current test. This enum will be used
+            in future versions of NUnit and so is to be preferred
+            to the TestState value.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestState">
+            <summary>
+            The ResultState enum indicates the result of running a test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Inconclusive">
+            <summary>
+            The result is inconclusive
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.NotRunnable">
+            <summary>
+            The test was not runnable.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Skipped">
+            <summary>
+            The test has been skipped. 
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Ignored">
+            <summary>
+            The test has been ignored.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Success">
+            <summary>
+            The test succeeded
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Failure">
+            <summary>
+            The test failed
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Error">
+            <summary>
+            The test encountered an unexpected exception
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Cancelled">
+            <summary>
+            The test was cancelled by the user
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestStatus">
+            <summary>
+            The TestStatus enum indicates the result of running a test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Inconclusive">
+            <summary>
+            The test was inconclusive
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Skipped">
+            <summary>
+            The test has skipped 
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Passed">
+            <summary>
+            The test succeeded
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Failed">
+            <summary>
+            The test failed
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Text">
+            <summary>
+            Helper class with static methods used to supply constraints
+            that operate on strings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.Contains(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotContain(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.StartsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotStartWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.EndsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotEndWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.Matches(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the Regex pattern supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotMatch(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value matches the pattern supplied as an argument.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Text.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TextMessageWriter">
+            <summary>
+            TextMessageWriter writes constraint descriptions and messages
+            in displayable form as a text stream. It tailors the display
+            of individual message components to form the standard message
+            format of NUnit assertion failure messages.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TextMessageWriter.Pfx_Expected">
+            <summary>
+            Prefix used for the expected value line of a message
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TextMessageWriter.Pfx_Actual">
+            <summary>
+            Prefix used for the actual value line of a message
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TextMessageWriter.PrefixLength">
+            <summary>
+            Length of a message prefix
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.#ctor">
+            <summary>
+            Construct a TextMessageWriter
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.#ctor(System.String,System.Object[])">
+            <summary>
+            Construct a TextMessageWriter, specifying a user message
+            and optional formatting arguments.
+            </summary>
+            <param name="userMessage"></param>
+            <param name="args"></param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteMessageLine(System.Int32,System.String,System.Object[])">
+            <summary>
+            Method to write single line  message with optional args, usually
+            written to precede the general failure message, at a givel 
+            indentation level.
+            </summary>
+            <param name="level">The indentation level of the message</param>
+            <param name="message">The message to be written</param>
+            <param name="args">Any arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayDifferences(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Display Expected and Actual lines for a constraint. This
+            is called by MessageWriter's default implementation of 
+            WriteMessageTo and provides the generic two-line display. 
+            </summary>
+            <param name="constraint">The constraint that failed</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayDifferences(System.Object,System.Object)">
+            <summary>
+            Display Expected and Actual lines for given values. This
+            method may be called by constraints that need more control over
+            the display of actual and expected values than is provided
+            by the default implementation.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayDifferences(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance)">
+            <summary>
+            Display Expected and Actual lines for given values, including
+            a tolerance value on the expected line.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+            <param name="tolerance">The tolerance within which the test was made</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayStringDifferences(System.String,System.String,System.Int32,System.Boolean,System.Boolean)">
+            <summary>
+            Display the expected and actual string values on separate lines.
+            If the mismatch parameter is >=0, an additional line is displayed
+            line containing a caret that points to the mismatch point.
+            </summary>
+            <param name="expected">The expected string value</param>
+            <param name="actual">The actual string value</param>
+            <param name="mismatch">The point at which the strings don't match or -1</param>
+            <param name="ignoreCase">If true, case is ignored in string comparisons</param>
+            <param name="clipping">If true, clip the strings to fit the max line length</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteConnector(System.String)">
+            <summary>
+            Writes the text for a connector.
+            </summary>
+            <param name="connector">The connector.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WritePredicate(System.String)">
+            <summary>
+            Writes the text for a predicate.
+            </summary>
+            <param name="predicate">The predicate.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteModifier(System.String)">
+            <summary>
+            Write the text for a modifier.
+            </summary>
+            <param name="modifier">The modifier.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedValue(System.Object)">
+            <summary>
+            Writes the text for an expected value.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteActualValue(System.Object)">
+            <summary>
+            Writes the text for an actual value.
+            </summary>
+            <param name="actual">The actual value.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteValue(System.Object)">
+            <summary>
+            Writes the text for a generalized value.
+            </summary>
+            <param name="val">The value.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteCollectionElements(System.Collections.IEnumerable,System.Int32,System.Int32)">
+            <summary>
+            Writes the text for a collection value,
+            starting at a particular point, to a max length
+            </summary>
+            <param name="collection">The collection containing elements to write.</param>
+            <param name="start">The starting point of the elements to write</param>
+            <param name="max">The maximum number of elements to write</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedLine(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Write the generic 'Expected' line for a constraint
+            </summary>
+            <param name="constraint">The constraint that failed</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedLine(System.Object)">
+            <summary>
+            Write the generic 'Expected' line for a given value
+            </summary>
+            <param name="expected">The expected value</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedLine(System.Object,NUnit.Framework.Constraints.Tolerance)">
+            <summary>
+            Write the generic 'Expected' line for a given value
+            and tolerance.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="tolerance">The tolerance within which the test was made</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteActualLine(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Write the generic 'Actual' line for a constraint
+            </summary>
+            <param name="constraint">The constraint for which the actual value is to be written</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteActualLine(System.Object)">
+            <summary>
+            Write the generic 'Actual' line for a given value
+            </summary>
+            <param name="actual">The actual value causing a failure</param>
+        </member>
+        <member name="P:NUnit.Framework.TextMessageWriter.MaxLineLength">
+            <summary>
+            Gets or sets the maximum line length for this writer
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Throws">
+            <summary>
+            Helper class with properties and methods that supply
+            constraints that operate on exceptions.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.TypeOf(System.Type)">
+            <summary>
+            Creates a constraint specifying the exact type of exception expected
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.TypeOf``1">
+            <summary>
+            Creates a constraint specifying the exact type of exception expected
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.InstanceOf(System.Type)">
+            <summary>
+            Creates a constraint specifying the type of exception expected
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.InstanceOf``1">
+            <summary>
+            Creates a constraint specifying the type of exception expected
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.Exception">
+            <summary>
+            Creates a constraint specifying an expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.InnerException">
+            <summary>
+            Creates a constraint specifying an exception with a given InnerException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.TargetInvocationException">
+            <summary>
+            Creates a constraint specifying an expected TargetInvocationException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.ArgumentException">
+            <summary>
+            Creates a constraint specifying an expected TargetInvocationException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.InvalidOperationException">
+            <summary>
+            Creates a constraint specifying an expected TargetInvocationException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.Nothing">
+            <summary>
+            Creates a constraint specifying that no exception is thrown
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/src/tests/test-assembly-net45/bin/Debug/test-assembly-net45.pdb b/src/tests/test-assembly-net45/bin/Debug/test-assembly-net45.pdb
new file mode 100644
index 0000000..835d4d3
Binary files /dev/null and b/src/tests/test-assembly-net45/bin/Debug/test-assembly-net45.pdb differ
diff --git a/src/tests/test-assembly-net45/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/tests/test-assembly-net45/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..27de466
Binary files /dev/null and b/src/tests/test-assembly-net45/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/tests/test-assembly-net45/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/src/tests/test-assembly-net45/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/tests/test-assembly-net45/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/src/tests/test-assembly-net45/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/tests/test-assembly-net45/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/src/tests/test-assembly-net45/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.csproj.FileListAbsolute.txt b/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..9250bcd
--- /dev/null
+++ b/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.csproj.FileListAbsolute.txt
@@ -0,0 +1,8 @@
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\bin\Debug\test-assembly-net45.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\bin\Debug\test-assembly-net45.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\bin\Debug\nunit.framework.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\bin\Debug\nunit.framework.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\bin\Debug\nunit.framework.xml
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\obj\Debug\test-assembly-net45.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\obj\Debug\test-assembly-net45.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly-net45\obj\Debug\test-assembly-net45.pdb
diff --git a/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.csprojResolveAssemblyReference.cache b/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..22c61ce
Binary files /dev/null and b/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.csprojResolveAssemblyReference.cache differ
diff --git a/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.pdb b/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.pdb
new file mode 100644
index 0000000..835d4d3
Binary files /dev/null and b/src/tests/test-assembly-net45/obj/Debug/test-assembly-net45.pdb differ
diff --git a/src/tests/test-assembly-net45/test-assembly-net45.build b/src/tests/test-assembly-net45/test-assembly-net45.build
new file mode 100644
index 0000000..578da00
--- /dev/null
+++ b/src/tests/test-assembly-net45/test-assembly-net45.build
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<project name="TestAssembly" default="build" basedir=".">
+
+  <patternset id="source-files">
+    <include name="AsyncDummyFixture.cs"/>
+    <include name="AsyncRealFixture.cs"/>
+  </patternset>
+
+  <target name="build" if="${runtime.version >= '2.0'}">
+
+    <echo message=".NET 4.5 is not installed - skipping test-assembly-net45"
+	unless="${framework::exists('net-4.5')}"/>
+
+    <if test="${framework::exists('net-4.5')}">
+
+      <property name="previousFramework" value="${nant.settings.currentframework}"/>
+      <property name="nant.settings.currentframework" value="net-4.5"/>
+
+      <csc target="library" 
+          output="${current.test.dir}/test-assembly-net45.dll" 
+          debug="${build.debug}" define="${build.defines}">
+        <sources>
+          <patternset refid="source-files"/>
+          <include name="../../GeneratedAssemblyInfo.cs"/>
+        </sources>
+        <nowarn>
+          <warning number="618,672"/>
+        </nowarn>
+        <references>
+          <include name="${current.framework.dir}/nunit.framework.dll"/>
+        </references>
+      </csc>
+
+      <property name="nant.settings.currentframework" value="${previousFramework}"/>
+
+    </if>
+
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/tests/test-assembly-net45">
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="test-assembly-net45.csproj"/>
+        <include name="test-assembly-net45.build"/>
+      </fileset>
+    </copy>
+  </target>
+
+</project>
\ No newline at end of file
diff --git a/src/tests/test-assembly-net45/test-assembly-net45.csproj b/src/tests/test-assembly-net45/test-assembly-net45.csproj
new file mode 100644
index 0000000..57f54de
--- /dev/null
+++ b/src/tests/test-assembly-net45/test-assembly-net45.csproj
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{74CCEAEA-CDBF-4FE0-BF0D-914C3C44ECE9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>test_assembly_net45</RootNamespace>
+    <AssemblyName>test-assembly-net45</AssemblyName>
+    <TargetFrameworkVersion>v4.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>TRACE;DEBUG;CLR_4_0,NET_4_5,CS_5_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_4_0,NET_4_5,CS_5_0</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="AsyncDummyFixture.cs" />
+    <Compile Include="AsyncRealFixture.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="test-assembly-net45.build">
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+      <Name>nunit.framework.dll</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </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/tests/test-assembly/ActionAttributeExceptionFixture.cs b/src/tests/test-assembly/ActionAttributeExceptionFixture.cs
index 813640c..a9ff747 100644
--- a/src/tests/test-assembly/ActionAttributeExceptionFixture.cs
+++ b/src/tests/test-assembly/ActionAttributeExceptionFixture.cs
@@ -1,86 +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; }
-        }
-    }
-}
+// ****************************************************************
+// 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
index b614e49..f3da5ce 100644
--- a/src/tests/test-assembly/ActionAttributeFixture.cs
+++ b/src/tests/test-assembly/ActionAttributeFixture.cs
@@ -1,138 +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
+// ****************************************************************
+// 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/AttributeDescriptionTests.cs b/src/tests/test-assembly/AttributeDescriptionTests.cs
index e7153e1..0913a5c 100644
--- a/src/tests/test-assembly/AttributeDescriptionTests.cs
+++ b/src/tests/test-assembly/AttributeDescriptionTests.cs
@@ -1,28 +1,28 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.AttributeDescriptionFixture
-{
-	[TestFixture(Description = "Fixture Description")]
-	public class MockFixture
-	{
-		[Test(Description = "Test Description")]
-		public void Method()
-		{}
-
-		[Test]
-		public void NoDescriptionMethod()
-		{}
-
-        [Test]
-        [Description("Separate Description")]
-        public void SeparateDescriptionMethod()
-        { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.AttributeDescriptionFixture
+{
+	[TestFixture(Description = "Fixture Description")]
+	public class MockFixture
+	{
+		[Test(Description = "Test Description")]
+		public void Method()
+		{}
+
+		[Test]
+		public void NoDescriptionMethod()
+		{}
+
+        [Test]
+        [Description("Separate Description")]
+        public void SeparateDescriptionMethod()
+        { }
+	}
+}
diff --git a/src/tests/test-assembly/AttributeInheritance.cs b/src/tests/test-assembly/AttributeInheritance.cs
index ceabbbe..b6403b1 100644
--- a/src/tests/test-assembly/AttributeInheritance.cs
+++ b/src/tests/test-assembly/AttributeInheritance.cs
@@ -1,61 +1,61 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-	// Sample Test from a post by Scott Bellware
-
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
-	class ConcernAttribute : TestFixtureAttribute
-	{
-		public Type typeOfConcern;
-
-		public ConcernAttribute( Type typeOfConcern )
-		{
-			this.typeOfConcern = typeOfConcern;
-		}
-	}
-
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	class SpecAttribute : TestAttribute
-	{
-	}
-
-	/// <summary>
-	/// Summary description for AttributeInheritance.
-	/// </summary>
-	[Concern(typeof(NUnit.Core.TestRunner))]
-	public class When_collecting_test_fixtures
-	{
-		[Spec]
-		public void should_include_classes_with_an_attribute_derived_from_TestFixtureAttribute()
-		{
-		}
-	}
-
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
-    class NYIAttribute : IgnoreAttribute
-    {
-        public NYIAttribute() : base("Not yet implemented") { }
-    }
-
-    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
-    class WorkInProcessAttribute : ExplicitAttribute
-    {
-        public WorkInProcessAttribute() : base("Work in progress") { }
-    }
-
-    public class AttributeInheritanceFixture
-    {
-        [Test, WorkInProcess]
-        public void ShouldBeExplicit() { }
-
-        [Test, NYI]
-        public void ShouldBeIgnored() { }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	// Sample Test from a post by Scott Bellware
+
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
+	class ConcernAttribute : TestFixtureAttribute
+	{
+		public Type typeOfConcern;
+
+		public ConcernAttribute( Type typeOfConcern )
+		{
+			this.typeOfConcern = typeOfConcern;
+		}
+	}
+
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
+	class SpecAttribute : TestAttribute
+	{
+	}
+
+	/// <summary>
+	/// Summary description for AttributeInheritance.
+	/// </summary>
+	[Concern(typeof(NUnit.Core.TestRunner))]
+	public class When_collecting_test_fixtures
+	{
+		[Spec]
+		public void should_include_classes_with_an_attribute_derived_from_TestFixtureAttribute()
+		{
+		}
+	}
+
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
+    class NYIAttribute : IgnoreAttribute
+    {
+        public NYIAttribute() : base("Not yet implemented") { }
+    }
+
+    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
+    class WorkInProcessAttribute : ExplicitAttribute
+    {
+        public WorkInProcessAttribute() : base("Work in progress") { }
+    }
+
+    public class AttributeInheritanceFixture
+    {
+        [Test, WorkInProcess]
+        public void ShouldBeExplicit() { }
+
+        [Test, NYI]
+        public void ShouldBeIgnored() { }
+    }
+}
diff --git a/src/tests/test-assembly/CategoryAttributeTests.cs b/src/tests/test-assembly/CategoryAttributeTests.cs
index e9c070c..5ba0c73 100644
--- a/src/tests/test-assembly/CategoryAttributeTests.cs
+++ b/src/tests/test-assembly/CategoryAttributeTests.cs
@@ -1,33 +1,33 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.CategoryAttributeTests
-{
-	[TestFixture, InheritableCategory("MyCategory")]
-	public abstract class AbstractBase { }
-	
-	[TestFixture, Category( "DataBase" )]
-	public class FixtureWithCategories : AbstractBase
-	{
-		[Test, Category("Long")]
-		public void Test1() { }
-
-		[Test, Critical]
-		public void Test2() { }
-	}
-	
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
-	public class CriticalAttribute : CategoryAttribute { }
-	
-	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true, Inherited=true)]
-	public class InheritableCategoryAttribute : CategoryAttribute
-	{ 
-		public InheritableCategoryAttribute(string name) : base(name) { }
-	}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.CategoryAttributeTests
+{
+	[TestFixture, InheritableCategory("MyCategory")]
+	public abstract class AbstractBase { }
+	
+	[TestFixture, Category( "DataBase" )]
+	public class FixtureWithCategories : AbstractBase
+	{
+		[Test, Category("Long")]
+		public void Test1() { }
+
+		[Test, Critical]
+		public void Test2() { }
+	}
+	
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
+	public class CriticalAttribute : CategoryAttribute { }
+	
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true, Inherited=true)]
+	public class InheritableCategoryAttribute : CategoryAttribute
+	{ 
+		public InheritableCategoryAttribute(string name) : base(name) { }
+	}
 }
\ No newline at end of file
diff --git a/src/tests/test-assembly/ConsoleRunnerTest.cs b/src/tests/test-assembly/ConsoleRunnerTest.cs
index e7a63fa..1227d61 100644
--- a/src/tests/test-assembly/ConsoleRunnerTest.cs
+++ b/src/tests/test-assembly/ConsoleRunnerTest.cs
@@ -1,67 +1,67 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.ConsoleRunnerTest
-{
-	[TestFixture]
-	public class SuccessTest
-	{
-		public static readonly int Tests = 1;
-
-		[Test]
-		public void Success()
-		{}
-	}
-		
-	[TestFixture] 
-	public class FailureTest
-	{
-		[Test]
-		public void Fail()
-		{
-			Assert.Fail();
-		}
-	}
-
-	[TestFixture] 
-	public class MultiFailureTest
-	{
-		[Test] public void Fail1() { Assert.Fail(); }
-		[Test] public void Fail2() { Assert.Fail(); }
-		[Test] public void Fail3() { Assert.Fail(); }
-	}
-
-	[TestFixture]
-	public class Bug1073539Fixture
-	{
-		[Test]
-		public void TestCaseMessageOutput()
-		{
-			//Test with lower 128 characters that are common across Windows code pages.
-			byte[] encodedBytes = new byte[255];
-			byte y = 0;
-			for(int x = 0 ; x < 255 ; x++)
-			{
-				encodedBytes[x] = y++;
-			}
-			string specialString = System.Text.Encoding.Default.GetString(encodedBytes);
-			throw new ApplicationException("Will I break NUnit XML " + specialString);
-		}
-	}
-
-	[TestFixture]
-	public class Bug1311644Fixture
-	{
-		[Test]
-		public void TestCaseAssertMessageOutput()
-		{
-			Assert.AreEqual(new char[] {(char)0}, new char[] {' '});
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.ConsoleRunnerTest
+{
+	[TestFixture]
+	public class SuccessTest
+	{
+		public static readonly int Tests = 1;
+
+		[Test]
+		public void Success()
+		{}
+	}
+		
+	[TestFixture] 
+	public class FailureTest
+	{
+		[Test]
+		public void Fail()
+		{
+			Assert.Fail();
+		}
+	}
+
+	[TestFixture] 
+	public class MultiFailureTest
+	{
+		[Test] public void Fail1() { Assert.Fail(); }
+		[Test] public void Fail2() { Assert.Fail(); }
+		[Test] public void Fail3() { Assert.Fail(); }
+	}
+
+	[TestFixture]
+	public class Bug1073539Fixture
+	{
+		[Test]
+		public void TestCaseMessageOutput()
+		{
+			//Test with lower 128 characters that are common across Windows code pages.
+			byte[] encodedBytes = new byte[255];
+			byte y = 0;
+			for(int x = 0 ; x < 255 ; x++)
+			{
+				encodedBytes[x] = y++;
+			}
+			string specialString = System.Text.Encoding.Default.GetString(encodedBytes);
+			throw new ApplicationException("Will I break NUnit XML " + specialString);
+		}
+	}
+
+	[TestFixture]
+	public class Bug1311644Fixture
+	{
+		[Test]
+		public void TestCaseAssertMessageOutput()
+		{
+			Assert.AreEqual(new char[] {(char)0}, new char[] {' '});
+		}
+	}
+}
diff --git a/src/tests/test-assembly/CultureAttributeTests.cs b/src/tests/test-assembly/CultureAttributeTests.cs
index 66b7060..557b75f 100644
--- a/src/tests/test-assembly/CultureAttributeTests.cs
+++ b/src/tests/test-assembly/CultureAttributeTests.cs
@@ -1,31 +1,31 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.CultureAttributeTests
-{
-	[TestFixture, Culture( "en,fr,de" )]
-	public class FixtureWithCultureAttribute
-	{
-		[Test, Culture("en,de")]
-		public void EnglishAndGermanTest() { }
-
-		[Test, Culture("fr")]
-		public void FrenchTest() { }
-
-		[Test, Culture("fr-CA")]
-		public void FrenchCanadaTest() { }
-	}
-
-	[TestFixture]
-	public class InvalidCultureFixture
-	{
-		[Test,SetCulture("xx-XX")]
-		public void InvalidCultureSet() { }
-	}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.CultureAttributeTests
+{
+	[TestFixture, Culture( "en,fr,de" )]
+	public class FixtureWithCultureAttribute
+	{
+		[Test, Culture("en,de")]
+		public void EnglishAndGermanTest() { }
+
+		[Test, Culture("fr")]
+		public void FrenchTest() { }
+
+		[Test, Culture("fr-CA")]
+		public void FrenchCanadaTest() { }
+	}
+
+	[TestFixture]
+	public class InvalidCultureFixture
+	{
+		[Test,SetCulture("xx-XX")]
+		public void InvalidCultureSet() { }
+	}
 }
\ No newline at end of file
diff --git a/src/tests/test-assembly/DatapointFixture.cs b/src/tests/test-assembly/DatapointFixture.cs
index 321e9db..71ffce8 100644
--- a/src/tests/test-assembly/DatapointFixture.cs
+++ b/src/tests/test-assembly/DatapointFixture.cs
@@ -1,109 +1,109 @@
-// ****************************************************************
-// 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 CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-
-namespace NUnit.TestData.DatapointFixture
-{
-    public abstract class SquareRootTest
-    {
-        [Theory]
-        public void SqrtTimesItselfGivesOriginal(double num)
-        {
-            Assume.That(num >= 0.0 && num < double.MaxValue);
-
-            double sqrt = Math.Sqrt(num);
-
-            Assert.That(sqrt >= 0.0);
-            Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
-        }
-    }
-
-    public class SquareRootTest_Field_Double : SquareRootTest
-    {
-        [Datapoint]
-        public double zero = 0;
-
-        [Datapoint]
-        public double positive = 1;
-
-        [Datapoint]
-        public double negative = -1;
-
-        [Datapoint]
-        public double max = double.MaxValue;
-
-        [Datapoint]
-        public double infinity = double.PositiveInfinity;
-    }
-
-    public class SquareRootTest_Field_ArrayOfDouble : SquareRootTest
-    {
-        [Datapoints]
-        public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
-    }
-
-#if CS_3_0 || CS_4_0
-    public class SquareRootTest_Field_IEnumerableOfDouble : SquareRootTest
-    {
-        [Datapoints]
-        public IEnumerable<double> values = new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
-    }
-
-    public class SquareRootTest_Property_IEnumerableOfDouble : SquareRootTest
-    {
-        [Datapoints]
-        public IEnumerable<double> Values
-        {
-            get { return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity }; }
-        }
-    }
-
-    public class SquareRootTest_Method_IEnumerableOfDouble : SquareRootTest
-    {
-        [Datapoints]
-        public IEnumerable<double> GetValues()
-        {
-            return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
-        }
-    }
-
-    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
-    {
-        [Datapoints]
-        public double[] Values
-        {
-            get { return new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity }; }
-        }
-    }
-
-    public class SquareRootTest_Method_ArrayOfDouble : SquareRootTest
-    {
-        [Datapoints]
-        public double[] GetValues()
-        {
-            return new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
-        }
-    }
-}
+// ****************************************************************
+// 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 CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+
+namespace NUnit.TestData.DatapointFixture
+{
+    public abstract class SquareRootTest
+    {
+        [Theory]
+        public void SqrtTimesItselfGivesOriginal(double num)
+        {
+            Assume.That(num >= 0.0 && num < double.MaxValue);
+
+            double sqrt = Math.Sqrt(num);
+
+            Assert.That(sqrt >= 0.0);
+            Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001));
+        }
+    }
+
+    public class SquareRootTest_Field_Double : SquareRootTest
+    {
+        [Datapoint]
+        public double zero = 0;
+
+        [Datapoint]
+        public double positive = 1;
+
+        [Datapoint]
+        public double negative = -1;
+
+        [Datapoint]
+        public double max = double.MaxValue;
+
+        [Datapoint]
+        public double infinity = double.PositiveInfinity;
+    }
+
+    public class SquareRootTest_Field_ArrayOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public double[] values = new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+    }
+
+#if CS_3_0 || CS_4_0 || CS_5_0
+    public class SquareRootTest_Field_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> values = new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+    }
+
+    public class SquareRootTest_Property_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> Values
+        {
+            get { return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity }; }
+        }
+    }
+
+    public class SquareRootTest_Method_IEnumerableOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public IEnumerable<double> GetValues()
+        {
+            return new List<double> { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+        }
+    }
+
+    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
+    {
+        [Datapoints]
+        public double[] Values
+        {
+            get { return new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity }; }
+        }
+    }
+
+    public class SquareRootTest_Method_ArrayOfDouble : SquareRootTest
+    {
+        [Datapoints]
+        public double[] GetValues()
+        {
+            return new double[] { 0.0, 1.0, -1.0, double.MaxValue, double.PositiveInfinity };
+        }
+    }
+}
diff --git a/src/tests/test-assembly/DirectoryChangeFixture.cs b/src/tests/test-assembly/DirectoryChangeFixture.cs
index 20a3f35..57ce60f 100644
--- a/src/tests/test-assembly/DirectoryChangeFixture.cs
+++ b/src/tests/test-assembly/DirectoryChangeFixture.cs
@@ -1,22 +1,22 @@
-// ****************************************************************
-// Copyright 2010, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.IO;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-	public class DirectoryChangeFixture
-	{
-		[Test]
-		public void ChangeCurrentDirectory()
-		{
-			Environment.CurrentDirectory = Path.GetTempPath();
-		}
-	}
-}
-
+// ****************************************************************
+// Copyright 2010, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.IO;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	public class DirectoryChangeFixture
+	{
+		[Test]
+		public void ChangeCurrentDirectory()
+		{
+			Environment.CurrentDirectory = Path.GetTempPath();
+		}
+	}
+}
+
diff --git a/src/tests/test-assembly/ExpectExceptionTest.cs b/src/tests/test-assembly/ExpectExceptionTest.cs
index cb841de..c450123 100644
--- a/src/tests/test-assembly/ExpectExceptionTest.cs
+++ b/src/tests/test-assembly/ExpectExceptionTest.cs
@@ -1,245 +1,245 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.ExpectExceptionTest
-{
-	[TestFixture]
-	public class BaseException
-	{
-		[Test]
-		[ExpectedException(typeof(ArgumentException))]
-		public void BaseExceptionTest()
-		{
-			throw new Exception();
-		}
-	}
-
-	[TestFixture]
-	public class DerivedException
-	{
-		[Test]
-		[ExpectedException(typeof(Exception))]
-		public void DerivedExceptionTest()
-		{
-			throw new ArgumentException();
-		}
-	}
-
-	[TestFixture]
-	public class MismatchedException
-	{
-        [Test]
-        [ExpectedException(typeof(ArgumentException))]
-        public void MismatchedExceptionType()
-        {
-            throw new ArgumentOutOfRangeException();
-        }
-
-        [Test]
-        [ExpectedException(ExpectedException=typeof(ArgumentException))]
-        public void MismatchedExceptionTypeAsNamedParameter()
-        {
-            throw new ArgumentOutOfRangeException();
-        }
-
-        [Test]
-		[ExpectedException(typeof(ArgumentException), UserMessage="custom message")]
-		public void MismatchedExceptionTypeWithUserMessage()
-		{
-			throw new ArgumentOutOfRangeException();
-		}
-
-		[Test]
-		[ExpectedException("System.ArgumentException")]
-		public void MismatchedExceptionName()
-		{
-			throw new ArgumentOutOfRangeException();
-		}
-
-		[Test]
-		[ExpectedException("System.ArgumentException", UserMessage="custom message")]
-		public void MismatchedExceptionNameWithUserMessage()
-		{
-			throw new ArgumentOutOfRangeException();
-		}
-	}
-
-	[TestFixture]
-	public class SetUpExceptionTests  
-	{
-		[SetUp]
-		public void Init()
-		{
-			throw new ArgumentException("SetUp Exception");
-		}
-
-		[Test]
-		[ExpectedException(typeof(ArgumentException))]
-		public void Test() 
-		{
-		}
-	}
-
-	[TestFixture]
-	public class TearDownExceptionTests
-	{
-		[TearDown]
-		public void CleanUp()
-		{
-			throw new ArgumentException("TearDown Exception");
-		}
-
-		[Test]
-		[ExpectedException(typeof(ArgumentException))]
-		public void Test() 
-		{}
-	}
-
-	[TestFixture]
-	public class TestThrowsExceptionFixture
-	{
-		[Test]
-		public void TestThrow()
-		{
-			throw new Exception();
-		}
-	}
-
-	[TestFixture]
-	public class TestDoesNotThrowExceptionFixture
-	{
-		[Test, ExpectedException("System.ArgumentException")]
-		public void TestDoesNotThrowExceptionName()
-		{
-		}
-
-		[Test, ExpectedException("System.ArgumentException", UserMessage="custom message")]
-		public void TestDoesNotThrowExceptionNameWithUserMessage()
-		{
-		}
-
-		[Test, ExpectedException( typeof( System.ArgumentException ) )]
-		public void TestDoesNotThrowExceptionType()
-		{
-		}
-
-		[Test, ExpectedException( typeof( System.ArgumentException ), UserMessage="custom message" )]
-		public void TestDoesNotThrowExceptionTypeWithUserMessage()
-		{
-		}
-
-		[Test, ExpectedException]
-		public void TestDoesNotThrowUnspecifiedException()
-		{
-		}
-
-		[Test, ExpectedException( UserMessage="custom message" )]
-		public void TestDoesNotThrowUnspecifiedExceptionWithUserMessage()
-		{
-		}
-	}
-
-	[TestFixture]
-	public class TestThrowsExceptionWithRightMessage
-	{
-		[Test]
-		[ExpectedException(typeof(Exception), ExpectedMessage="the message")]
-		public void TestThrow()
-		{
-			throw new Exception("the message");
-		}
-	}
-
-	[TestFixture]
-	public class TestThrowsArgumentOutOfRangeException
-	{
-		[Test]
-		[ExpectedException(typeof(ArgumentOutOfRangeException)) ]
-		public void TestThrow()
-		{
-			throw new ArgumentOutOfRangeException("param", "actual value", "the message");
-		}
-	}
-
-	[TestFixture]
-	public class TestThrowsExceptionWithWrongMessage
-	{
-		[Test]
-		[ExpectedException(typeof(Exception), ExpectedMessage="not the message")]
-		public void TestThrow()
-		{
-			throw new Exception("the message");
-		}
-
-		[Test]
-		[ExpectedException( typeof(Exception), ExpectedMessage="not the message", UserMessage="custom message" )]
-		public void TestThrowWithUserMessage()
-		{
-			throw new Exception("the message");
-		}
-	}
-
-	[TestFixture]
-	public class TestAssertsBeforeThrowingException
-	{
-		[Test]
-		[ExpectedException(typeof(Exception))]
-		public void TestAssertFail()
-		{
-			Assert.Fail( "private message" );
-		}
-	}
-
-    [TestFixture]
-    public class ExceptionHandlerCalledClass : IExpectException
-    {
-        public bool HandlerCalled = false;
-        public bool AlternateHandlerCalled = false;
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void ThrowsArgumentException()
-        {
-            throw new ArgumentException();
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
-        public void ThrowsArgumentException_AlternateHandler()
-        {
-            throw new ArgumentException();
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException))]
-        public void ThrowsApplicationException()
-        {
-            throw new ApplicationException();
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
-        public void ThrowsApplicationException_AlternateHandler()
-        {
-            throw new ApplicationException();
-        }
-
-        [Test, ExpectedException(typeof(ArgumentException), Handler = "DeliberatelyMissingHandler")]
-        public void MethodWithBadHandler()
-        {
-            throw new ArgumentException();
-        }
-
-        public void HandleException(Exception ex)
-        {
-            HandlerCalled = true;
-        }
-
-        public void AlternateExceptionHandler(Exception ex)
-        {
-            AlternateHandlerCalled = true;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.ExpectExceptionTest
+{
+	[TestFixture]
+	public class BaseException
+	{
+		[Test]
+		[ExpectedException(typeof(ArgumentException))]
+		public void BaseExceptionTest()
+		{
+			throw new Exception();
+		}
+	}
+
+	[TestFixture]
+	public class DerivedException
+	{
+		[Test]
+		[ExpectedException(typeof(Exception))]
+		public void DerivedExceptionTest()
+		{
+			throw new ArgumentException();
+		}
+	}
+
+	[TestFixture]
+	public class MismatchedException
+	{
+        [Test]
+        [ExpectedException(typeof(ArgumentException))]
+        public void MismatchedExceptionType()
+        {
+            throw new ArgumentOutOfRangeException();
+        }
+
+        [Test]
+        [ExpectedException(ExpectedException=typeof(ArgumentException))]
+        public void MismatchedExceptionTypeAsNamedParameter()
+        {
+            throw new ArgumentOutOfRangeException();
+        }
+
+        [Test]
+		[ExpectedException(typeof(ArgumentException), UserMessage="custom message")]
+		public void MismatchedExceptionTypeWithUserMessage()
+		{
+			throw new ArgumentOutOfRangeException();
+		}
+
+		[Test]
+		[ExpectedException("System.ArgumentException")]
+		public void MismatchedExceptionName()
+		{
+			throw new ArgumentOutOfRangeException();
+		}
+
+		[Test]
+		[ExpectedException("System.ArgumentException", UserMessage="custom message")]
+		public void MismatchedExceptionNameWithUserMessage()
+		{
+			throw new ArgumentOutOfRangeException();
+		}
+	}
+
+	[TestFixture]
+	public class SetUpExceptionTests  
+	{
+		[SetUp]
+		public void Init()
+		{
+			throw new ArgumentException("SetUp Exception");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentException))]
+		public void Test() 
+		{
+		}
+	}
+
+	[TestFixture]
+	public class TearDownExceptionTests
+	{
+		[TearDown]
+		public void CleanUp()
+		{
+			throw new ArgumentException("TearDown Exception");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentException))]
+		public void Test() 
+		{}
+	}
+
+	[TestFixture]
+	public class TestThrowsExceptionFixture
+	{
+		[Test]
+		public void TestThrow()
+		{
+			throw new Exception();
+		}
+	}
+
+	[TestFixture]
+	public class TestDoesNotThrowExceptionFixture
+	{
+		[Test, ExpectedException("System.ArgumentException")]
+		public void TestDoesNotThrowExceptionName()
+		{
+		}
+
+		[Test, ExpectedException("System.ArgumentException", UserMessage="custom message")]
+		public void TestDoesNotThrowExceptionNameWithUserMessage()
+		{
+		}
+
+		[Test, ExpectedException( typeof( System.ArgumentException ) )]
+		public void TestDoesNotThrowExceptionType()
+		{
+		}
+
+		[Test, ExpectedException( typeof( System.ArgumentException ), UserMessage="custom message" )]
+		public void TestDoesNotThrowExceptionTypeWithUserMessage()
+		{
+		}
+
+		[Test, ExpectedException]
+		public void TestDoesNotThrowUnspecifiedException()
+		{
+		}
+
+		[Test, ExpectedException( UserMessage="custom message" )]
+		public void TestDoesNotThrowUnspecifiedExceptionWithUserMessage()
+		{
+		}
+	}
+
+	[TestFixture]
+	public class TestThrowsExceptionWithRightMessage
+	{
+		[Test]
+		[ExpectedException(typeof(Exception), ExpectedMessage="the message")]
+		public void TestThrow()
+		{
+			throw new Exception("the message");
+		}
+	}
+
+	[TestFixture]
+	public class TestThrowsArgumentOutOfRangeException
+	{
+		[Test]
+		[ExpectedException(typeof(ArgumentOutOfRangeException)) ]
+		public void TestThrow()
+		{
+			throw new ArgumentOutOfRangeException("param", "actual value", "the message");
+		}
+	}
+
+	[TestFixture]
+	public class TestThrowsExceptionWithWrongMessage
+	{
+		[Test]
+		[ExpectedException(typeof(Exception), ExpectedMessage="not the message")]
+		public void TestThrow()
+		{
+			throw new Exception("the message");
+		}
+
+		[Test]
+		[ExpectedException( typeof(Exception), ExpectedMessage="not the message", UserMessage="custom message" )]
+		public void TestThrowWithUserMessage()
+		{
+			throw new Exception("the message");
+		}
+	}
+
+	[TestFixture]
+	public class TestAssertsBeforeThrowingException
+	{
+		[Test]
+		[ExpectedException(typeof(Exception))]
+		public void TestAssertFail()
+		{
+			Assert.Fail( "private message" );
+		}
+	}
+
+    [TestFixture]
+    public class ExceptionHandlerCalledClass : IExpectException
+    {
+        public bool HandlerCalled = false;
+        public bool AlternateHandlerCalled = false;
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void ThrowsArgumentException()
+        {
+            throw new ArgumentException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
+        public void ThrowsArgumentException_AlternateHandler()
+        {
+            throw new ArgumentException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException))]
+        public void ThrowsApplicationException()
+        {
+            throw new ApplicationException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException), Handler = "AlternateExceptionHandler")]
+        public void ThrowsApplicationException_AlternateHandler()
+        {
+            throw new ApplicationException();
+        }
+
+        [Test, ExpectedException(typeof(ArgumentException), Handler = "DeliberatelyMissingHandler")]
+        public void MethodWithBadHandler()
+        {
+            throw new ArgumentException();
+        }
+
+        public void HandleException(Exception ex)
+        {
+            HandlerCalled = true;
+        }
+
+        public void AlternateExceptionHandler(Exception ex)
+        {
+            AlternateHandlerCalled = true;
+        }
+    }
+}
diff --git a/src/tests/test-assembly/FailFixtureTests.cs b/src/tests/test-assembly/FailFixtureTests.cs
index c3c715a..fe4449a 100644
--- a/src/tests/test-assembly/FailFixtureTests.cs
+++ b/src/tests/test-assembly/FailFixtureTests.cs
@@ -1,81 +1,81 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.FailFixture
-{
-	[TestFixture]
-	public class VerifyFailThrowsException
-	{
-		public static string failureMessage = "This should call fail";
-
-		[Test]
-		public void CallAssertFail()
-		{
-			Assert.Fail(failureMessage);
-		}
-	}
-
-	[TestFixture]
-	public class VerifyTestResultRecordsInnerExceptions
-	{
-		[Test]
-		public void ThrowInnerException()
-		{
-			throw new Exception("Outer Exception", new Exception("Inner Exception"));
-		}
-	}
-
-	[TestFixture]
-	public class BadStackTraceFixture
-	{
-		[Test]
-		public void TestFailure()
-		{
-			throw new ExceptionWithBadStackTrace("thrown by me");
-		}
-	}
-
-	public class ExceptionWithBadStackTrace : Exception
-	{
-		public ExceptionWithBadStackTrace( string message )
-			: base( message ) { }
-
-		public override string StackTrace
-		{
-			get
-			{
-				throw new InvalidOperationException( "Simulated failure getting stack trace" );
-			}
-		}
-	}
-
-	[TestFixture]
-	public class CustomExceptionFixture
-	{
-		[Test]
-		public void ThrowCustomException()
-		{
-			throw new CustomException( "message", new CustomType() );
-		}
-
-		private class CustomType
-		{
-		}
-
-		private class CustomException : Exception
-		{
-			public CustomType custom;
-
-			public CustomException( string msg, CustomType custom ) : base( msg )
-			{
-				this.custom = custom;
-			}
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.FailFixture
+{
+	[TestFixture]
+	public class VerifyFailThrowsException
+	{
+		public static string failureMessage = "This should call fail";
+
+		[Test]
+		public void CallAssertFail()
+		{
+			Assert.Fail(failureMessage);
+		}
+	}
+
+	[TestFixture]
+	public class VerifyTestResultRecordsInnerExceptions
+	{
+		[Test]
+		public void ThrowInnerException()
+		{
+			throw new Exception("Outer Exception", new Exception("Inner Exception"));
+		}
+	}
+
+	[TestFixture]
+	public class BadStackTraceFixture
+	{
+		[Test]
+		public void TestFailure()
+		{
+			throw new ExceptionWithBadStackTrace("thrown by me");
+		}
+	}
+
+	public class ExceptionWithBadStackTrace : Exception
+	{
+		public ExceptionWithBadStackTrace( string message )
+			: base( message ) { }
+
+		public override string StackTrace
+		{
+			get
+			{
+				throw new InvalidOperationException( "Simulated failure getting stack trace" );
+			}
+		}
+	}
+
+	[TestFixture]
+	public class CustomExceptionFixture
+	{
+		[Test]
+		public void ThrowCustomException()
+		{
+			throw new CustomException( "message", new CustomType() );
+		}
+
+		private class CustomType
+		{
+		}
+
+		private class CustomException : Exception
+		{
+			public CustomType custom;
+
+			public CustomException( string msg, CustomType custom ) : base( msg )
+			{
+				this.custom = custom;
+			}
+		}
+	}
+}
diff --git a/src/tests/test-assembly/FixtureSetUpTearDownTests.cs b/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
index 871869c..2976394 100644
--- a/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
+++ b/src/tests/test-assembly/FixtureSetUpTearDownTests.cs
@@ -1,343 +1,343 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.FixtureSetUpTearDown
-{
-    [TestFixture]
-    public class SetUpAndTearDownFixture
-    {
-        public int setUpCount = 0;
-        public int tearDownCount = 0;
-
-        [TestFixtureSetUp]
-        public virtual void Init()
-        {
-            setUpCount++;
-        }
-
-        [TestFixtureTearDown]
-        public virtual void Destroy()
-        {
-            tearDownCount++;
-        }
-
-        [Test]
-        public void Success() { }
-
-        [Test]
-        public void EvenMoreSuccess() { }
-    }
-
-    [TestFixture, Explicit]
-	public class ExplicitSetUpAndTearDownFixture
-	{
-		public int setUpCount = 0;
-		public int tearDownCount = 0;
-
-		[TestFixtureSetUp]
-		public virtual void Init()
-		{
-			setUpCount++;
-		}
-
-		[TestFixtureTearDown]
-		public virtual void Destroy()
-		{
-			tearDownCount++;
-		}
-
-		[Test]
-		public void Success(){}
-
-		[Test]
-		public void EvenMoreSuccess(){}
-	}
-
-	[TestFixture]
-	public class InheritSetUpAndTearDown : SetUpAndTearDownFixture
-	{
-		[Test]
-		public void AnotherTest(){}
-
-		[Test]
-		public void YetAnotherTest(){}
-	}
-
-	[TestFixture]
-	public class DefineInheritSetUpAndTearDown : SetUpAndTearDownFixture
-	{
-        public int derivedSetUpCount;
-        public int derivedTearDownCount;
-
-        [TestFixtureSetUp]
-        public override void Init()
-        {
-            derivedSetUpCount++;
-        }
-
-        [TestFixtureTearDown]
-        public override void Destroy()
-        {
-            derivedTearDownCount++;
-        }
-
-        [Test]
-        public void AnotherTest() { }
-
-        [Test]
-        public void YetAnotherTest() { }
-    }
-
-    [TestFixture]
-    public class DerivedSetUpAndTearDownFixture : SetUpAndTearDownFixture
-    {
-        public int derivedSetUpCount;
-        public int derivedTearDownCount;
-
-        public bool baseSetUpCalledFirst;
-        public bool baseTearDownCalledLast;
-
-        [TestFixtureSetUp]
-        public void Init2()
-        {
-            derivedSetUpCount++;
-            baseSetUpCalledFirst = this.setUpCount > 0;
-        }
-
-        [TestFixtureTearDown]
-        public void Destroy2()
-        {
-            derivedTearDownCount++;
-            baseTearDownCalledLast = this.tearDownCount == 0;
-        }
-
-        [Test]
-        public void AnotherTest() { }
-
-        [Test]
-        public void YetAnotherTest() { }
-    }
-
-    [TestFixture]
-    public class StaticSetUpAndTearDownFixture
-    {
-        public static int setUpCount = 0;
-        public static int tearDownCount = 0;
-
-        [TestFixtureSetUp]
-        public static void Init()
-        {
-            setUpCount++;
-        }
-
-        [TestFixtureTearDown]
-        public static void Destroy()
-        {
-            tearDownCount++;
-        }
-    }
-
-    [TestFixture]
-    public class DerivedStaticSetUpAndTearDownFixture : StaticSetUpAndTearDownFixture
-    {
-        public static int derivedSetUpCount;
-        public static int derivedTearDownCount;
-
-        public static bool baseSetUpCalledFirst;
-        public static bool baseTearDownCalledLast;
-
-
-        [TestFixtureSetUp]
-        public static void Init2()
-        {
-            derivedSetUpCount++;
-            baseSetUpCalledFirst = setUpCount > 0;
-        }
-
-        [TestFixtureTearDown]
-        public static void Destroy2()
-        {
-            derivedTearDownCount++;
-            baseTearDownCalledLast = tearDownCount == 0;
-        }
-    }
-
-#if CLR_2_0 || CLR_4_0
-    [TestFixture]
-    public static class StaticClassSetUpAndTearDownFixture
-    {
-        public static int setUpCount = 0;
-        public static int tearDownCount = 0;
-
-        [TestFixtureSetUp]
-        public static void Init()
-        {
-            setUpCount++;
-        }
-
-        [TestFixtureTearDown]
-        public static void Destroy()
-        {
-            tearDownCount++;
-        }
-    }
-#endif
-    
-    [TestFixture]
-	public class MisbehavingFixture 
-	{
-		public bool blowUpInSetUp = false;
-		public bool blowUpInTearDown = false;
-
-		public int setUpCount = 0;
-		public int tearDownCount = 0;
-
-		public void Reinitialize()
-		{
-			setUpCount = 0;
-			tearDownCount = 0;
-
-			blowUpInSetUp = false;
-			blowUpInTearDown = false;
-		}
-
-		[TestFixtureSetUp]
-		public void BlowUpInSetUp() 
-		{
-			setUpCount++;
-			if (blowUpInSetUp)
-				throw new Exception("This was thrown from fixture setup");
-		}
-
-		[TestFixtureTearDown]
-		public void BlowUpInTearDown()
-		{
-			tearDownCount++;
-			if ( blowUpInTearDown )
-				throw new Exception("This was thrown from fixture teardown");
-		}
-
-		[Test]
-		public void nothingToTest() 
-		{
-		}
-	}
-
-	[TestFixture]
-	public class ExceptionInConstructor
-	{
-		public ExceptionInConstructor()
-		{
-			throw new Exception( "This was thrown in constructor" );
-		}
-
-		[Test]
-		public void nothingToTest()
-		{
-		}
-	}
-
-	[TestFixture]
-	public class IgnoreInFixtureSetUp
-	{
-		[TestFixtureSetUp]
-		public void SetUpCallsIgnore() 
-		{
-			Assert.Ignore( "TestFixtureSetUp called Ignore" );
-		}
-
-		[Test]
-		public void nothingToTest() 
-		{
-		}
-	}
-
-	[TestFixture]
-	public class SetUpAndTearDownWithTestInName
-	{
-		public int setUpCount = 0;
-		public int tearDownCount = 0;
-
-		[TestFixtureSetUp]
-		public virtual void TestFixtureSetUp()
-		{
-			setUpCount++;
-		}
-
-		[TestFixtureTearDown]
-		public virtual void TestFixtureTearDown()
-		{
-			tearDownCount++;
-		}
-
-		[Test]
-		public void Success(){}
-
-		[Test]
-		public void EvenMoreSuccess(){}
-	}
-
-	[TestFixture, Ignore( "Do Not Run This" )]
-	public class IgnoredFixture
-	{
-		public bool setupCalled = false;
-		public bool teardownCalled = false;
-
-		[TestFixtureSetUp]
-		public virtual void ShouldNotRun()
-		{
-			setupCalled = true;
-		}
-
-		[TestFixtureTearDown]
-		public virtual void NeitherShouldThis()
-		{
-			teardownCalled = true;
-		}
-
-		[Test]
-		public void Success(){}
-
-		[Test]
-		public void EvenMoreSuccess(){}
-	}
-
-	[TestFixture]
-	public class FixtureWithNoTests
-	{
-		public bool setupCalled = false;
-		public bool teardownCalled = false;
-
-		[TestFixtureSetUp]
-		public virtual void Init()
-		{
-			setupCalled = true;
-		}
-
-		[TestFixtureTearDown]
-		public virtual void Destroy()
-		{
-			teardownCalled = true;
-		}
-	}
-
-    [TestFixture]
-    public class DisposableFixture : IDisposable
-    {
-        public bool disposeCalled = false;
-
-        [Test]
-        public void OneTest() { }
-
-        public void Dispose()
-        {
-            disposeCalled = true;
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.FixtureSetUpTearDown
+{
+    [TestFixture]
+    public class SetUpAndTearDownFixture
+    {
+        public int setUpCount = 0;
+        public int tearDownCount = 0;
+
+        [TestFixtureSetUp]
+        public virtual void Init()
+        {
+            setUpCount++;
+        }
+
+        [TestFixtureTearDown]
+        public virtual void Destroy()
+        {
+            tearDownCount++;
+        }
+
+        [Test]
+        public void Success() { }
+
+        [Test]
+        public void EvenMoreSuccess() { }
+    }
+
+    [TestFixture, Explicit]
+	public class ExplicitSetUpAndTearDownFixture
+	{
+		public int setUpCount = 0;
+		public int tearDownCount = 0;
+
+		[TestFixtureSetUp]
+		public virtual void Init()
+		{
+			setUpCount++;
+		}
+
+		[TestFixtureTearDown]
+		public virtual void Destroy()
+		{
+			tearDownCount++;
+		}
+
+		[Test]
+		public void Success(){}
+
+		[Test]
+		public void EvenMoreSuccess(){}
+	}
+
+	[TestFixture]
+	public class InheritSetUpAndTearDown : SetUpAndTearDownFixture
+	{
+		[Test]
+		public void AnotherTest(){}
+
+		[Test]
+		public void YetAnotherTest(){}
+	}
+
+	[TestFixture]
+	public class DefineInheritSetUpAndTearDown : SetUpAndTearDownFixture
+	{
+        public int derivedSetUpCount;
+        public int derivedTearDownCount;
+
+        [TestFixtureSetUp]
+        public override void Init()
+        {
+            derivedSetUpCount++;
+        }
+
+        [TestFixtureTearDown]
+        public override void Destroy()
+        {
+            derivedTearDownCount++;
+        }
+
+        [Test]
+        public void AnotherTest() { }
+
+        [Test]
+        public void YetAnotherTest() { }
+    }
+
+    [TestFixture]
+    public class DerivedSetUpAndTearDownFixture : SetUpAndTearDownFixture
+    {
+        public int derivedSetUpCount;
+        public int derivedTearDownCount;
+
+        public bool baseSetUpCalledFirst;
+        public bool baseTearDownCalledLast;
+
+        [TestFixtureSetUp]
+        public void Init2()
+        {
+            derivedSetUpCount++;
+            baseSetUpCalledFirst = this.setUpCount > 0;
+        }
+
+        [TestFixtureTearDown]
+        public void Destroy2()
+        {
+            derivedTearDownCount++;
+            baseTearDownCalledLast = this.tearDownCount == 0;
+        }
+
+        [Test]
+        public void AnotherTest() { }
+
+        [Test]
+        public void YetAnotherTest() { }
+    }
+
+    [TestFixture]
+    public class StaticSetUpAndTearDownFixture
+    {
+        public static int setUpCount = 0;
+        public static int tearDownCount = 0;
+
+        [TestFixtureSetUp]
+        public static void Init()
+        {
+            setUpCount++;
+        }
+
+        [TestFixtureTearDown]
+        public static void Destroy()
+        {
+            tearDownCount++;
+        }
+    }
+
+    [TestFixture]
+    public class DerivedStaticSetUpAndTearDownFixture : StaticSetUpAndTearDownFixture
+    {
+        public static int derivedSetUpCount;
+        public static int derivedTearDownCount;
+
+        public static bool baseSetUpCalledFirst;
+        public static bool baseTearDownCalledLast;
+
+
+        [TestFixtureSetUp]
+        public static void Init2()
+        {
+            derivedSetUpCount++;
+            baseSetUpCalledFirst = setUpCount > 0;
+        }
+
+        [TestFixtureTearDown]
+        public static void Destroy2()
+        {
+            derivedTearDownCount++;
+            baseTearDownCalledLast = tearDownCount == 0;
+        }
+    }
+
+#if CLR_2_0 || CLR_4_0
+    [TestFixture]
+    public static class StaticClassSetUpAndTearDownFixture
+    {
+        public static int setUpCount = 0;
+        public static int tearDownCount = 0;
+
+        [TestFixtureSetUp]
+        public static void Init()
+        {
+            setUpCount++;
+        }
+
+        [TestFixtureTearDown]
+        public static void Destroy()
+        {
+            tearDownCount++;
+        }
+    }
+#endif
+    
+    [TestFixture]
+	public class MisbehavingFixture 
+	{
+		public bool blowUpInSetUp = false;
+		public bool blowUpInTearDown = false;
+
+		public int setUpCount = 0;
+		public int tearDownCount = 0;
+
+		public void Reinitialize()
+		{
+			setUpCount = 0;
+			tearDownCount = 0;
+
+			blowUpInSetUp = false;
+			blowUpInTearDown = false;
+		}
+
+		[TestFixtureSetUp]
+		public void BlowUpInSetUp() 
+		{
+			setUpCount++;
+			if (blowUpInSetUp)
+				throw new Exception("This was thrown from fixture setup");
+		}
+
+		[TestFixtureTearDown]
+		public void BlowUpInTearDown()
+		{
+			tearDownCount++;
+			if ( blowUpInTearDown )
+				throw new Exception("This was thrown from fixture teardown");
+		}
+
+		[Test]
+		public void nothingToTest() 
+		{
+		}
+	}
+
+	[TestFixture]
+	public class ExceptionInConstructor
+	{
+		public ExceptionInConstructor()
+		{
+			throw new Exception( "This was thrown in constructor" );
+		}
+
+		[Test]
+		public void nothingToTest()
+		{
+		}
+	}
+
+	[TestFixture]
+	public class IgnoreInFixtureSetUp
+	{
+		[TestFixtureSetUp]
+		public void SetUpCallsIgnore() 
+		{
+			Assert.Ignore( "TestFixtureSetUp called Ignore" );
+		}
+
+		[Test]
+		public void nothingToTest() 
+		{
+		}
+	}
+
+	[TestFixture]
+	public class SetUpAndTearDownWithTestInName
+	{
+		public int setUpCount = 0;
+		public int tearDownCount = 0;
+
+		[TestFixtureSetUp]
+		public virtual void TestFixtureSetUp()
+		{
+			setUpCount++;
+		}
+
+		[TestFixtureTearDown]
+		public virtual void TestFixtureTearDown()
+		{
+			tearDownCount++;
+		}
+
+		[Test]
+		public void Success(){}
+
+		[Test]
+		public void EvenMoreSuccess(){}
+	}
+
+	[TestFixture, Ignore( "Do Not Run This" )]
+	public class IgnoredFixture
+	{
+		public bool setupCalled = false;
+		public bool teardownCalled = false;
+
+		[TestFixtureSetUp]
+		public virtual void ShouldNotRun()
+		{
+			setupCalled = true;
+		}
+
+		[TestFixtureTearDown]
+		public virtual void NeitherShouldThis()
+		{
+			teardownCalled = true;
+		}
+
+		[Test]
+		public void Success(){}
+
+		[Test]
+		public void EvenMoreSuccess(){}
+	}
+
+	[TestFixture]
+	public class FixtureWithNoTests
+	{
+		public bool setupCalled = false;
+		public bool teardownCalled = false;
+
+		[TestFixtureSetUp]
+		public virtual void Init()
+		{
+			setupCalled = true;
+		}
+
+		[TestFixtureTearDown]
+		public virtual void Destroy()
+		{
+			teardownCalled = true;
+		}
+	}
+
+    [TestFixture]
+    public class DisposableFixture : IDisposable
+    {
+        public bool disposeCalled = false;
+
+        [Test]
+        public void OneTest() { }
+
+        public void Dispose()
+        {
+            disposeCalled = true;
+        }
+    }
+}
diff --git a/src/tests/test-assembly/IgnoreFixtureTests.cs b/src/tests/test-assembly/IgnoreFixtureTests.cs
index f96ebd3..6041698 100644
--- a/src/tests/test-assembly/IgnoreFixtureTests.cs
+++ b/src/tests/test-assembly/IgnoreFixtureTests.cs
@@ -1,67 +1,67 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.IgnoreFixture
-{
-	[TestFixture]
-	public class IgnoredTestCaseFixture
-	{
-        [Test]
-        public void CallsIgnore()
-        {
-            Assert.Ignore("Ignore me");
-        }
-
-        [Test, ExpectedException(typeof(InvalidOperationException))]
-        public void CallsIgnoreWithExpectedException()
-        {
-            Assert.Ignore("Ignore me");
-        }
-    }
-
-	[TestFixture]
-	public class IgnoredTestSuiteFixture
-	{
-		[TestFixtureSetUp]
-		public void FixtureSetUp()
-		{
-			Assert.Ignore("Ignore this fixture");
-		}
-
-		[Test]
-		public void ATest()
-		{
-		}
-
-		[Test]
-		public void AnotherTest()
-		{
-		}
-	}
-
-	[TestFixture]
-	public class IgnoreInSetUpFixture
-	{
-		[SetUp]
-		public void SetUp()
-		{
-			Assert.Ignore( "Ignore this test" );
-		}
-
-		[Test]
-		public void Test1()
-		{
-		}
-
-		[Test]
-		public void Test2()
-		{
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.IgnoreFixture
+{
+	[TestFixture]
+	public class IgnoredTestCaseFixture
+	{
+        [Test]
+        public void CallsIgnore()
+        {
+            Assert.Ignore("Ignore me");
+        }
+
+        [Test, ExpectedException(typeof(InvalidOperationException))]
+        public void CallsIgnoreWithExpectedException()
+        {
+            Assert.Ignore("Ignore me");
+        }
+    }
+
+	[TestFixture]
+	public class IgnoredTestSuiteFixture
+	{
+		[TestFixtureSetUp]
+		public void FixtureSetUp()
+		{
+			Assert.Ignore("Ignore this fixture");
+		}
+
+		[Test]
+		public void ATest()
+		{
+		}
+
+		[Test]
+		public void AnotherTest()
+		{
+		}
+	}
+
+	[TestFixture]
+	public class IgnoreInSetUpFixture
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			Assert.Ignore( "Ignore this test" );
+		}
+
+		[Test]
+		public void Test1()
+		{
+		}
+
+		[Test]
+		public void Test2()
+		{
+		}
+	}
+}
diff --git a/src/tests/test-assembly/LegacySuiteData.cs b/src/tests/test-assembly/LegacySuiteData.cs
index 047faba..73d028b 100644
--- a/src/tests/test-assembly/LegacySuiteData.cs
+++ b/src/tests/test-assembly/LegacySuiteData.cs
@@ -1,63 +1,63 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Framework;
-using NUnit.Core;
-
-namespace NUnit.TestData.LegacySuiteData
-{
-	public class Suite
-	{
-		[Suite]
-		public static TestSuite MockSuite
-		{
-			get 
-			{
-				TestSuite testSuite = new TestSuite("TestSuite");
-				return testSuite;
-			}
-		}
-	}
-
-	class NonConformingSuite
-	{
-		[Suite]
-		public static int Integer
-		{
-			get 
-			{
-				return 5;
-			}
-		}
-	}
-
-    public class LegacySuiteReturningFixtureWithArguments
-    {
-        [Suite]
-        public static IEnumerable Suite
-        {
-            get
-            {
-                ArrayList suite = new ArrayList();
-                suite.Add(new TestClass(5));
-                return suite;
-            }
-        }
-
-        [TestFixture]
-        public class TestClass
-        {
-            public int num;
-
-            public TestClass(int num)
-            {
-                this.num = num;
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Framework;
+using NUnit.Core;
+
+namespace NUnit.TestData.LegacySuiteData
+{
+	public class Suite
+	{
+		[Suite]
+		public static TestSuite MockSuite
+		{
+			get 
+			{
+				TestSuite testSuite = new TestSuite("TestSuite");
+				return testSuite;
+			}
+		}
+	}
+
+	class NonConformingSuite
+	{
+		[Suite]
+		public static int Integer
+		{
+			get 
+			{
+				return 5;
+			}
+		}
+	}
+
+    public class LegacySuiteReturningFixtureWithArguments
+    {
+        [Suite]
+        public static IEnumerable Suite
+        {
+            get
+            {
+                ArrayList suite = new ArrayList();
+                suite.Add(new TestClass(5));
+                return suite;
+            }
+        }
+
+        [TestFixture]
+        public class TestClass
+        {
+            public int num;
+
+            public TestClass(int num)
+            {
+                this.num = num;
+            }
+        }
+    }
+}
diff --git a/src/tests/test-assembly/MaxTimeFixture.cs b/src/tests/test-assembly/MaxTimeFixture.cs
index 43207a0..50a69e3 100644
--- a/src/tests/test-assembly/MaxTimeFixture.cs
+++ b/src/tests/test-assembly/MaxTimeFixture.cs
@@ -1,42 +1,42 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-    [TestFixture]
-    public class MaxTimeFixture
-    {
-        [Test, MaxTime(1)]
-        public void MaxTimeExceeded()
-        {
-            System.Threading.Thread.Sleep(20);
-        }
-    }
-
-    [TestFixture]
-    public class MaxTimeFixtureWithFailure
-    {
-        [Test, MaxTime(1)]
-        public void MaxTimeExceeded()
-        {
-            System.Threading.Thread.Sleep(20);
-            Assert.Fail("Intentional Failure");
-        }
-    }
-
-    [TestFixture]
-    public class MaxTimeFixtureWithError
-    {
-        [Test, MaxTime(1)]
-        public void MaxTimeExceeded()
-        {
-            System.Threading.Thread.Sleep(20);
-            throw new Exception("Exception message");
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class MaxTimeFixture
+    {
+        [Test, MaxTime(1)]
+        public void MaxTimeExceeded()
+        {
+            System.Threading.Thread.Sleep(20);
+        }
+    }
+
+    [TestFixture]
+    public class MaxTimeFixtureWithFailure
+    {
+        [Test, MaxTime(1)]
+        public void MaxTimeExceeded()
+        {
+            System.Threading.Thread.Sleep(20);
+            Assert.Fail("Intentional Failure");
+        }
+    }
+
+    [TestFixture]
+    public class MaxTimeFixtureWithError
+    {
+        [Test, MaxTime(1)]
+        public void MaxTimeExceeded()
+        {
+            System.Threading.Thread.Sleep(20);
+            throw new Exception("Exception message");
+        }
+    }
+}
diff --git a/src/tests/test-assembly/ParameterizedTestFixture.cs b/src/tests/test-assembly/ParameterizedTestFixture.cs
index bc1fae5..b84e822 100644
--- a/src/tests/test-assembly/ParameterizedTestFixture.cs
+++ b/src/tests/test-assembly/ParameterizedTestFixture.cs
@@ -1,36 +1,36 @@
-// ****************************************************************
-// 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
-{
-    [TestFixture(1)]
-    [TestFixture(2)]
-    public class ParameterizedTestFixture
-    {
-        [Test]
-        public void MethodWithoutParams()
-        {
-        }
-
-        [TestCase(10,20)]
-        public void MethodWithParams(int x, int y)
-        {
-        }
-    }
-
-    [TestFixture(Category = "XYZ")]
-    public class TestFixtureWithSingleCategory
-    {
-    }
-
-    [TestFixture(Category = "X,Y,Z")]
-    public class TestFixtureWithMultipleCategories
-    {
-    }
-}
+// ****************************************************************
+// 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
+{
+    [TestFixture(1)]
+    [TestFixture(2)]
+    public class ParameterizedTestFixture
+    {
+        [Test]
+        public void MethodWithoutParams()
+        {
+        }
+
+        [TestCase(10,20)]
+        public void MethodWithParams(int x, int y)
+        {
+        }
+    }
+
+    [TestFixture(Category = "XYZ")]
+    public class TestFixtureWithSingleCategory
+    {
+    }
+
+    [TestFixture(Category = "X,Y,Z")]
+    public class TestFixtureWithMultipleCategories
+    {
+    }
+}
diff --git a/src/tests/test-assembly/PropertyAttributeTests.cs b/src/tests/test-assembly/PropertyAttributeTests.cs
index 807ef53..add484f 100644
--- a/src/tests/test-assembly/PropertyAttributeTests.cs
+++ b/src/tests/test-assembly/PropertyAttributeTests.cs
@@ -1,30 +1,30 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.PropertyAttributeTests
-{
-	[TestFixture, Property("ClassUnderTest","SomeClass" )]
-	public class FixtureWithProperties
-	{
-		[Test, Property("user","Charlie")]
-		public void Test1() { }
-
-		[Test, Property("X",10.0), Property("Y",17.0)]
-		public void Test2() { }
-
-		[Test, Priority(5)]
-		public void Test3() { }
-	}
-
-	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
-	public class PriorityAttribute : PropertyAttribute
-	{
-		public PriorityAttribute( int level ) : base( level ) { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.PropertyAttributeTests
+{
+	[TestFixture, Property("ClassUnderTest","SomeClass" )]
+	public class FixtureWithProperties
+	{
+		[Test, Property("user","Charlie")]
+		public void Test1() { }
+
+		[Test, Property("X",10.0), Property("Y",17.0)]
+		public void Test2() { }
+
+		[Test, Priority(5)]
+		public void Test3() { }
+	}
+
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
+	public class PriorityAttribute : PropertyAttribute
+	{
+		public PriorityAttribute( int level ) : base( level ) { }
+	}
+}
diff --git a/src/tests/test-assembly/RepeatedTestFixtureTests.cs b/src/tests/test-assembly/RepeatedTestFixtureTests.cs
index a2936a9..2f61418 100644
--- a/src/tests/test-assembly/RepeatedTestFixtureTests.cs
+++ b/src/tests/test-assembly/RepeatedTestFixtureTests.cs
@@ -1,117 +1,117 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.RepeatedTestFixture
-{
-	[TestFixture]
-	public class RepeatingTestsBase
-	{
-		private int fixtureSetupCount;
-		private int fixtureTeardownCount;
-		private int setupCount;
-		private int teardownCount;
-		protected int count;
-
-		[TestFixtureSetUp]
-		public void FixtureSetUp()
-		{
-			fixtureSetupCount++;
-		}
-
-		[TestFixtureTearDown]
-		public void FixtureTearDown()
-		{
-			fixtureTeardownCount++;
-		}
-
-		[SetUp]
-		public void SetUp()
-		{
-			setupCount++;
-		}
-
-		[TearDown]
-		public void TearDown()
-		{
-			teardownCount++;
-		}
-
-		public int FixtureSetupCount
-		{
-			get { return fixtureSetupCount; }
-		}
-		public int FixtureTeardownCount
-		{
-			get { return fixtureTeardownCount; }
-		}
-		public int SetupCount
-		{
-			get { return setupCount; }
-		}
-		public int TeardownCount
-		{
-			get { return teardownCount; }
-		}
-		public int Count
-		{
-			get { return count; }
-		}
-	}
-
-	public class RepeatSuccessFixture : RepeatingTestsBase
-	{
-		[Test, Repeat(3)]
-		public void RepeatSuccess()
-		{
-			count++;
-			Assert.IsTrue (true);
-		}
-	}
-
-	public class RepeatFailOnFirstFixture : RepeatingTestsBase
-	{
-		[Test, Repeat(3)]
-		public void RepeatFailOnFirst()
-		{
-			count++;
-			Assert.IsFalse (true);
-		}
-	}
-
-	public class RepeatFailOnThirdFixture : RepeatingTestsBase
-	{
-		[Test, Repeat(3)]
-		public void RepeatFailOnThird()
-		{
-			count++;
-
-			if (count == 3)
-				Assert.IsTrue (false);
-		}
-	}
-
-    public class RepeatedTestWithIgnore : RepeatingTestsBase
-    {
-        [Test, Repeat(3), Ignore("Ignore this test")]
-        public void RepeatShouldIgnore()
-        {
-            Assert.Fail("Ignored test executed");
-        }
-    }
-
-    public class RepeatedTestWithCategory : RepeatingTestsBase
-    {
-        [Test, Repeat(3), Category("SAMPLE")]
-        public void TestWithCategory()
-        {
-            count++;
-            Assert.IsTrue(true);
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.RepeatedTestFixture
+{
+	[TestFixture]
+	public class RepeatingTestsBase
+	{
+		private int fixtureSetupCount;
+		private int fixtureTeardownCount;
+		private int setupCount;
+		private int teardownCount;
+		protected int count;
+
+		[TestFixtureSetUp]
+		public void FixtureSetUp()
+		{
+			fixtureSetupCount++;
+		}
+
+		[TestFixtureTearDown]
+		public void FixtureTearDown()
+		{
+			fixtureTeardownCount++;
+		}
+
+		[SetUp]
+		public void SetUp()
+		{
+			setupCount++;
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			teardownCount++;
+		}
+
+		public int FixtureSetupCount
+		{
+			get { return fixtureSetupCount; }
+		}
+		public int FixtureTeardownCount
+		{
+			get { return fixtureTeardownCount; }
+		}
+		public int SetupCount
+		{
+			get { return setupCount; }
+		}
+		public int TeardownCount
+		{
+			get { return teardownCount; }
+		}
+		public int Count
+		{
+			get { return count; }
+		}
+	}
+
+	public class RepeatSuccessFixture : RepeatingTestsBase
+	{
+		[Test, Repeat(3)]
+		public void RepeatSuccess()
+		{
+			count++;
+			Assert.IsTrue (true);
+		}
+	}
+
+	public class RepeatFailOnFirstFixture : RepeatingTestsBase
+	{
+		[Test, Repeat(3)]
+		public void RepeatFailOnFirst()
+		{
+			count++;
+			Assert.IsFalse (true);
+		}
+	}
+
+	public class RepeatFailOnThirdFixture : RepeatingTestsBase
+	{
+		[Test, Repeat(3)]
+		public void RepeatFailOnThird()
+		{
+			count++;
+
+			if (count == 3)
+				Assert.IsTrue (false);
+		}
+	}
+
+    public class RepeatedTestWithIgnore : RepeatingTestsBase
+    {
+        [Test, Repeat(3), Ignore("Ignore this test")]
+        public void RepeatShouldIgnore()
+        {
+            Assert.Fail("Ignored test executed");
+        }
+    }
+
+    public class RepeatedTestWithCategory : RepeatingTestsBase
+    {
+        [Test, Repeat(3), Category("SAMPLE")]
+        public void TestWithCategory()
+        {
+            count++;
+            Assert.IsTrue(true);
+        }
+    }
+}
diff --git a/src/tests/test-assembly/SetUpTest.cs b/src/tests/test-assembly/SetUpTest.cs
index 90c837e..c5893e8 100644
--- a/src/tests/test-assembly/SetUpTest.cs
+++ b/src/tests/test-assembly/SetUpTest.cs
@@ -1,175 +1,175 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.SetUpTest
-{
-	[TestFixture]
-	public class SetUpAndTearDownFixture
-	{
-        public bool wasSetUpCalled;
-        public bool wasTearDownCalled;
-
-        [SetUp]
-        public virtual void Init()
-        {
-            wasSetUpCalled = true;
-        }
-
-        [TearDown]
-        public virtual void Destroy()
-        {
-            wasTearDownCalled = true;
-        }
-
-        [Test]
-        public void Success() { }
-    }
-
-
-	[TestFixture]
-	public class SetUpAndTearDownCounterFixture
-	{
-		public int setUpCounter;
-		public int tearDownCounter;
-
-		[SetUp]
-		public virtual void Init()
-		{
-			setUpCounter++;
-		}
-
-		[TearDown]
-		public virtual void Destroy()
-		{
-			tearDownCounter++;
-		}
-
-		[Test]
-		public void TestOne(){}
-
-		[Test]
-		public void TestTwo(){}
-
-		[Test]
-		public void TestThree(){}
-	}
-		
-	[TestFixture]
-	public class InheritSetUpAndTearDown : SetUpAndTearDownFixture
-	{
-		[Test]
-		public void AnotherTest(){}
-	}
-
-	[TestFixture]
-	public class DefineInheritSetUpAndTearDown : SetUpAndTearDownFixture
-	{
-		public bool derivedSetUpCalled;
-		public bool derivedTearDownCalled;
-
-		[SetUp]
-		public override void Init()
-		{
-			derivedSetUpCalled = true;
-		}
-
-		[TearDown]
-		public override void Destroy()
-		{
-			derivedTearDownCalled = true;
-		}
-
-		[Test]
-		public void AnotherTest(){}
-	}
-
-    public class MultipleSetUpTearDownFixture
-    {
-        public bool wasSetUp1Called;
-        public bool wasSetUp2Called;
-        public bool wasSetUp3Called;
-        public bool wasTearDown1Called;
-        public bool wasTearDown2Called;
-
-        [SetUp]
-        public virtual void Init1()
-        {
-            wasSetUp1Called = true;
-        }
-        [SetUp]
-        public virtual void Init2()
-        {
-            wasSetUp2Called = true;
-        }
-        [SetUp]
-        public virtual void Init3()
-        {
-            wasSetUp3Called = true;
-        }
-
-        [TearDown]
-        public virtual void TearDown1()
-        {
-            wasTearDown1Called = true;
-        }
-        [TearDown]
-        public virtual void TearDown2()
-        {
-            wasTearDown2Called = true;
-        }
-
-        [Test]
-        public void Success() { }
-    }
-
-    [TestFixture]
-    public class DerivedClassWithSeparateSetUp : SetUpAndTearDownFixture
-    {
-        public bool wasDerivedSetUpCalled;
-        public bool wasDerivedTearDownCalled;
-        public bool wasBaseSetUpCalledFirst;
-        public bool wasBaseTearDownCalledLast;
-
-        [SetUp]
-        public void DerivedInit()
-        {
-            wasDerivedSetUpCalled = true;
-            wasBaseSetUpCalledFirst = wasSetUpCalled;
-        }
-
-        [TearDown]
-        public void DerivedTearDown()
-        {
-            wasDerivedTearDownCalled = true;
-            wasBaseTearDownCalledLast = !wasTearDownCalled;
-        }
-    }
-
-    [TestFixture]
-    public class SetupAndTearDownExceptionFixture
-    {
-        public Exception setupException;
-        public Exception tearDownException;
-
-        [SetUp] 
-        public void SetUp()
-        {
-            if (setupException != null) throw setupException;
-        }
-
-        [TearDown]
-        public void TearDown()
-        {
-            if (tearDownException!=null) throw tearDownException;
-        }
-
-        [Test]
-        public void TestOne() {}
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.SetUpTest
+{
+	[TestFixture]
+	public class SetUpAndTearDownFixture
+	{
+        public bool wasSetUpCalled;
+        public bool wasTearDownCalled;
+
+        [SetUp]
+        public virtual void Init()
+        {
+            wasSetUpCalled = true;
+        }
+
+        [TearDown]
+        public virtual void Destroy()
+        {
+            wasTearDownCalled = true;
+        }
+
+        [Test]
+        public void Success() { }
+    }
+
+
+	[TestFixture]
+	public class SetUpAndTearDownCounterFixture
+	{
+		public int setUpCounter;
+		public int tearDownCounter;
+
+		[SetUp]
+		public virtual void Init()
+		{
+			setUpCounter++;
+		}
+
+		[TearDown]
+		public virtual void Destroy()
+		{
+			tearDownCounter++;
+		}
+
+		[Test]
+		public void TestOne(){}
+
+		[Test]
+		public void TestTwo(){}
+
+		[Test]
+		public void TestThree(){}
+	}
+		
+	[TestFixture]
+	public class InheritSetUpAndTearDown : SetUpAndTearDownFixture
+	{
+		[Test]
+		public void AnotherTest(){}
+	}
+
+	[TestFixture]
+	public class DefineInheritSetUpAndTearDown : SetUpAndTearDownFixture
+	{
+		public bool derivedSetUpCalled;
+		public bool derivedTearDownCalled;
+
+		[SetUp]
+		public override void Init()
+		{
+			derivedSetUpCalled = true;
+		}
+
+		[TearDown]
+		public override void Destroy()
+		{
+			derivedTearDownCalled = true;
+		}
+
+		[Test]
+		public void AnotherTest(){}
+	}
+
+    public class MultipleSetUpTearDownFixture
+    {
+        public bool wasSetUp1Called;
+        public bool wasSetUp2Called;
+        public bool wasSetUp3Called;
+        public bool wasTearDown1Called;
+        public bool wasTearDown2Called;
+
+        [SetUp]
+        public virtual void Init1()
+        {
+            wasSetUp1Called = true;
+        }
+        [SetUp]
+        public virtual void Init2()
+        {
+            wasSetUp2Called = true;
+        }
+        [SetUp]
+        public virtual void Init3()
+        {
+            wasSetUp3Called = true;
+        }
+
+        [TearDown]
+        public virtual void TearDown1()
+        {
+            wasTearDown1Called = true;
+        }
+        [TearDown]
+        public virtual void TearDown2()
+        {
+            wasTearDown2Called = true;
+        }
+
+        [Test]
+        public void Success() { }
+    }
+
+    [TestFixture]
+    public class DerivedClassWithSeparateSetUp : SetUpAndTearDownFixture
+    {
+        public bool wasDerivedSetUpCalled;
+        public bool wasDerivedTearDownCalled;
+        public bool wasBaseSetUpCalledFirst;
+        public bool wasBaseTearDownCalledLast;
+
+        [SetUp]
+        public void DerivedInit()
+        {
+            wasDerivedSetUpCalled = true;
+            wasBaseSetUpCalledFirst = wasSetUpCalled;
+        }
+
+        [TearDown]
+        public void DerivedTearDown()
+        {
+            wasDerivedTearDownCalled = true;
+            wasBaseTearDownCalledLast = !wasTearDownCalled;
+        }
+    }
+
+    [TestFixture]
+    public class SetupAndTearDownExceptionFixture
+    {
+        public Exception setupException;
+        public Exception tearDownException;
+
+        [SetUp] 
+        public void SetUp()
+        {
+            if (setupException != null) throw setupException;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            if (tearDownException!=null) throw tearDownException;
+        }
+
+        [Test]
+        public void TestOne() {}
+    }
+}
diff --git a/src/tests/test-assembly/SetupFixtureTests.cs b/src/tests/test-assembly/SetupFixtureTests.cs
index d9c7d3d..1dd9849 100644
--- a/src/tests/test-assembly/SetupFixtureTests.cs
+++ b/src/tests/test-assembly/SetupFixtureTests.cs
@@ -1,510 +1,510 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Text;
-using NUnit.Framework;
-
-namespace NUnit.TestUtilities
-{
-    /// <summary>
-    /// A helper to Verify that Setup/Teardown 'events' occur, and that they are in the correct order...
-    /// </summary>
-    public class SimpleEventRecorder
-    {
-        private static System.Collections.Queue _events;
-
-        /// <summary>
-        /// Initializes the <see cref="T:EventRegistrar"/> 'static' class.
-        /// </summary>
-        static SimpleEventRecorder()
-        {
-            _events = new System.Collections.Queue();
-        }
-
-        /// <summary>
-        /// Registers an event.
-        /// </summary>
-        /// <param name="evnt">The event to register.</param>
-        public static void RegisterEvent(string evnt)
-        {
-            _events.Enqueue(evnt);
-        }
-
-
-        /// <summary>
-        /// Verifies the specified expected events occurred and that they occurred in the specified order.
-        /// </summary>
-        /// <param name="expectedEvents">The expected events.</param>
-        public static void Verify(params string[] expectedEvents)
-        {
-            foreach (string expected in expectedEvents)
-            {
-                string actual = _events.Count > 0 ? _events.Dequeue() as string : null;
-				Assert.AreEqual( expected, actual );
-            }
-        }
-
-        /// <summary>
-        /// Clears any unverified events.
-        /// </summary>
-        public static void Clear()
-        {
-            _events.Clear();
-        }
-    }
-}
-
-namespace NUnit.TestData.SetupFixture
-{
-    namespace Namespace1
-    {
-        #region SomeTestFixture
-        [TestFixture]
-        public class SomeTestFixture
-        {
-            [TestFixtureSetUp]
-            public void FixtureSetup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-            }
-
-            [SetUp]
-            public void Setup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-            }
-
-            [Test]
-            public void Test()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-            }
-
-            [TearDown]
-            public void TearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-            }
-
-            [TestFixtureTearDown]
-            public void FixtureTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-            }
-        }
-        #endregion SomeTestFixture
-
-        [SetUpFixture]
-        public class NUnitNamespaceSetUpFixture
-        {
-            [SetUp]
-            public void DoNamespaceSetUp()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
-            }
-
-            [TearDown]
-            public void DoNamespaceTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
-            }
-        }
-    }
-
-    namespace Namespace2
-    {
-
-        #region SomeTestFixture
-        /// <summary>
-        /// Summary description for SetUpFixtureTests.
-        /// </summary>
-        [TestFixture]
-        public class SomeTestFixture
-        {
-
-
-            [TestFixtureSetUp]
-            public void FixtureSetup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-            }
-
-            [SetUp]
-            public void Setup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-            }
-
-            [Test]
-            public void Test()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-            }
-
-            [TearDown]
-            public void TearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-            }
-
-            [TestFixtureTearDown]
-            public void FixtureTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-            }
-        }
-        #endregion SomeTestFixture
-
-        #region SomeTestFixture2
-        [TestFixture]
-        public class SomeTestFixture2
-        {
-
-
-            [TestFixtureSetUp]
-            public void FixtureSetup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-            }
-
-            [SetUp]
-            public void Setup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-            }
-
-            [Test]
-            public void Test()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-            }
-
-            [TearDown]
-            public void TearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-            }
-
-            [TestFixtureTearDown]
-            public void FixtureTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-            }
-        }
-        #endregion SomeTestFixture2
-
-        [SetUpFixture]
-        public class NUnitNamespaceSetUpFixture
-        {
-            [SetUp]
-            public void DoNamespaceSetUp()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
-            }
-
-            [TearDown]
-            public void DoNamespaceTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
-            }
-        }
-    }
-
-    namespace Namespace3
-    {
-        namespace SubNamespace
-        {
-
-
-            #region SomeTestFixture
-            [TestFixture]
-            public class SomeTestFixture
-            {
-                [TestFixtureSetUp]
-                public void FixtureSetup()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-                }
-
-                [SetUp]
-                public void Setup()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-                }
-
-                [Test]
-                public void Test()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-                }
-
-                [TearDown]
-                public void TearDown()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-                }
-
-                [TestFixtureTearDown]
-                public void FixtureTearDown()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-                }
-            }
-            #endregion SomeTestFixture
-
-            [SetUpFixture]
-            public class NUnitNamespaceSetUpFixture
-            {
-                [SetUp]
-                public void DoNamespaceSetUp()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("SubNamespaceSetup");
-                }
-
-                [TearDown]
-                public void DoNamespaceTearDown()
-                {
-                    TestUtilities.SimpleEventRecorder.RegisterEvent("SubNamespaceTearDown");
-                }
-            }
-
-        }
-
-
-        #region SomeTestFixture
-        [TestFixture]
-        public class SomeTestFixture
-        {
-            [TestFixtureSetUp]
-            public void FixtureSetup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-            }
-
-            [SetUp]
-            public void Setup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-            }
-
-            [Test]
-            public void Test()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-            }
-
-            [TearDown]
-            public void TearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-            }
-
-            [TestFixtureTearDown]
-            public void FixtureTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-            }
-        }
-        #endregion SomeTestFixture
-
-        [SetUpFixture]
-        public class NUnitNamespaceSetUpFixture
-        {
-            [SetUp]
-            public static void DoNamespaceSetUp()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
-            }
-
-            [TearDown]
-            public void DoNamespaceTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
-            }
-        }
-    }
-
-    namespace Namespace4
-    {
-        #region SomeTestFixture
-        [TestFixture]
-        public class SomeTestFixture
-        {
-            [TestFixtureSetUp]
-            public void FixtureSetup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-            }
-
-            [SetUp]
-            public void Setup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-            }
-
-            [Test]
-            public void Test()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-            }
-
-            [TearDown]
-            public void TearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-            }
-
-            [TestFixtureTearDown]
-            public void FixtureTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-            }
-        }
-        #endregion SomeTestFixture
-
-        [SetUpFixture]
-        public class NUnitNamespaceSetUpFixture
-        {
-            [SetUp]
-            public void DoNamespaceSetUp()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
-            }
-
-            [TearDown]
-            public void DoNamespaceTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
-            }
-        }
-
-        [SetUpFixture]
-        public class NUnitNamespaceSetUpFixture2
-        {
-            [SetUp]
-            public void DoNamespaceSetUp()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup2");
-            }
-
-            [TearDown]
-            public void DoNamespaceTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown2");
-            }
-        }
-    }
-
-	namespace Namespace5
-	{
-		[SetUpFixture]
-		public class CurrentDirectoryRecordingSetUpFixture
-		{
-			[SetUp]
-			public void DoSetUp()
-			{
-				TestUtilities.SimpleEventRecorder.RegisterEvent("SetUp:" + Environment.CurrentDirectory);
-			}
-
-			[TearDown]
-			public void DoTearDown()
-			{
-				TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown:" + Environment.CurrentDirectory);
-			}
-		}
-
-		[TestFixture]
-		public class SomeFixture
-		{
-			[Test]
-			public void SomeMethod() { }				
-		}
-	}
-
-    namespace Namespace5
-    {
-        #region SomeTestFixture
-        [TestFixture]
-        public class SomeTestFixture
-        {
-            [TestFixtureSetUp]
-            public void FixtureSetup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
-            }
-
-            [SetUp]
-            public void Setup()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
-            }
-
-            [Test]
-            public void Test()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-            }
-
-            [TearDown]
-            public void TearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
-            }
-
-            [TestFixtureTearDown]
-            public void FixtureTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
-            }
-        }
-        #endregion SomeTestFixture
-
-        [SetUpFixture]
-        public class NUnitNamespaceSetUpFixture
-        {
-            [SetUp]
-            public static void DoNamespaceSetUp()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
-            }
-
-            [TearDown]
-            public static void DoNamespaceTearDown()
-            {
-                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
-            }
-        }
-    }
-}
-#region NoNamespaceSetupFixture
-[SetUpFixture]
-public class NoNamespaceSetupFixture
-{
-    [SetUp]
-    public void DoNamespaceSetUp()
-    {
-        NUnit.TestUtilities.SimpleEventRecorder.RegisterEvent("RootNamespaceSetup");
-    }
-
-    [TearDown]
-    public void DoNamespaceTearDown()
-    {
-        NUnit.TestUtilities.SimpleEventRecorder.RegisterEvent("RootNamespaceTearDown");
-    }
-}
-
-[TestFixture]
-public class SomeTestFixture
-{
-    [Test]
-    public void Test()
-    {
-        NUnit.TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
-    }
-}
-#endregion NoNamespaceSetupFixture
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Text;
+using NUnit.Framework;
+
+namespace NUnit.TestUtilities
+{
+    /// <summary>
+    /// A helper to Verify that Setup/Teardown 'events' occur, and that they are in the correct order...
+    /// </summary>
+    public class SimpleEventRecorder
+    {
+        private static System.Collections.Queue _events;
+
+        /// <summary>
+        /// Initializes the <see cref="T:EventRegistrar"/> 'static' class.
+        /// </summary>
+        static SimpleEventRecorder()
+        {
+            _events = new System.Collections.Queue();
+        }
+
+        /// <summary>
+        /// Registers an event.
+        /// </summary>
+        /// <param name="evnt">The event to register.</param>
+        public static void RegisterEvent(string evnt)
+        {
+            _events.Enqueue(evnt);
+        }
+
+
+        /// <summary>
+        /// Verifies the specified expected events occurred and that they occurred in the specified order.
+        /// </summary>
+        /// <param name="expectedEvents">The expected events.</param>
+        public static void Verify(params string[] expectedEvents)
+        {
+            foreach (string expected in expectedEvents)
+            {
+                string actual = _events.Count > 0 ? _events.Dequeue() as string : null;
+				Assert.AreEqual( expected, actual );
+            }
+        }
+
+        /// <summary>
+        /// Clears any unverified events.
+        /// </summary>
+        public static void Clear()
+        {
+            _events.Clear();
+        }
+    }
+}
+
+namespace NUnit.TestData.SetupFixture
+{
+    namespace Namespace1
+    {
+        #region SomeTestFixture
+        [TestFixture]
+        public class SomeTestFixture
+        {
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture
+        {
+            [SetUp]
+            public void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
+            }
+
+            [TearDown]
+            public void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
+            }
+        }
+    }
+
+    namespace Namespace2
+    {
+
+        #region SomeTestFixture
+        /// <summary>
+        /// Summary description for SetUpFixtureTests.
+        /// </summary>
+        [TestFixture]
+        public class SomeTestFixture
+        {
+
+
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture
+
+        #region SomeTestFixture2
+        [TestFixture]
+        public class SomeTestFixture2
+        {
+
+
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture2
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture
+        {
+            [SetUp]
+            public void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
+            }
+
+            [TearDown]
+            public void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
+            }
+        }
+    }
+
+    namespace Namespace3
+    {
+        namespace SubNamespace
+        {
+
+
+            #region SomeTestFixture
+            [TestFixture]
+            public class SomeTestFixture
+            {
+                [TestFixtureSetUp]
+                public void FixtureSetup()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+                }
+
+                [SetUp]
+                public void Setup()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+                }
+
+                [Test]
+                public void Test()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+                }
+
+                [TearDown]
+                public void TearDown()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+                }
+
+                [TestFixtureTearDown]
+                public void FixtureTearDown()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+                }
+            }
+            #endregion SomeTestFixture
+
+            [SetUpFixture]
+            public class NUnitNamespaceSetUpFixture
+            {
+                [SetUp]
+                public void DoNamespaceSetUp()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("SubNamespaceSetup");
+                }
+
+                [TearDown]
+                public void DoNamespaceTearDown()
+                {
+                    TestUtilities.SimpleEventRecorder.RegisterEvent("SubNamespaceTearDown");
+                }
+            }
+
+        }
+
+
+        #region SomeTestFixture
+        [TestFixture]
+        public class SomeTestFixture
+        {
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture
+        {
+            [SetUp]
+            public static void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
+            }
+
+            [TearDown]
+            public void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
+            }
+        }
+    }
+
+    namespace Namespace4
+    {
+        #region SomeTestFixture
+        [TestFixture]
+        public class SomeTestFixture
+        {
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture
+        {
+            [SetUp]
+            public void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
+            }
+
+            [TearDown]
+            public void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
+            }
+        }
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture2
+        {
+            [SetUp]
+            public void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup2");
+            }
+
+            [TearDown]
+            public void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown2");
+            }
+        }
+    }
+
+	namespace Namespace5
+	{
+		[SetUpFixture]
+		public class CurrentDirectoryRecordingSetUpFixture
+		{
+			[SetUp]
+			public void DoSetUp()
+			{
+				TestUtilities.SimpleEventRecorder.RegisterEvent("SetUp:" + Environment.CurrentDirectory);
+			}
+
+			[TearDown]
+			public void DoTearDown()
+			{
+				TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown:" + Environment.CurrentDirectory);
+			}
+		}
+
+		[TestFixture]
+		public class SomeFixture
+		{
+			[Test]
+			public void SomeMethod() { }				
+		}
+	}
+
+    namespace Namespace5
+    {
+        #region SomeTestFixture
+        [TestFixture]
+        public class SomeTestFixture
+        {
+            [TestFixtureSetUp]
+            public void FixtureSetup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureSetup");
+            }
+
+            [SetUp]
+            public void Setup()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Setup");
+            }
+
+            [Test]
+            public void Test()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+            }
+
+            [TearDown]
+            public void TearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("TearDown");
+            }
+
+            [TestFixtureTearDown]
+            public void FixtureTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("FixtureTearDown");
+            }
+        }
+        #endregion SomeTestFixture
+
+        [SetUpFixture]
+        public class NUnitNamespaceSetUpFixture
+        {
+            [SetUp]
+            public static void DoNamespaceSetUp()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceSetup");
+            }
+
+            [TearDown]
+            public static void DoNamespaceTearDown()
+            {
+                TestUtilities.SimpleEventRecorder.RegisterEvent("NamespaceTearDown");
+            }
+        }
+    }
+}
+#region NoNamespaceSetupFixture
+[SetUpFixture]
+public class NoNamespaceSetupFixture
+{
+    [SetUp]
+    public void DoNamespaceSetUp()
+    {
+        NUnit.TestUtilities.SimpleEventRecorder.RegisterEvent("RootNamespaceSetup");
+    }
+
+    [TearDown]
+    public void DoNamespaceTearDown()
+    {
+        NUnit.TestUtilities.SimpleEventRecorder.RegisterEvent("RootNamespaceTearDown");
+    }
+}
+
+[TestFixture]
+public class SomeTestFixture
+{
+    [Test]
+    public void Test()
+    {
+        NUnit.TestUtilities.SimpleEventRecorder.RegisterEvent("Test");
+    }
+}
+#endregion NoNamespaceSetupFixture
diff --git a/src/tests/test-assembly/TestCaseAttributeFixture.cs b/src/tests/test-assembly/TestCaseAttributeFixture.cs
index 67b678c..12fcf31 100644
--- a/src/tests/test-assembly/TestCaseAttributeFixture.cs
+++ b/src/tests/test-assembly/TestCaseAttributeFixture.cs
@@ -1,84 +1,84 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-    [TestFixture]
-    public class TestCaseAttributeFixture
-    {
-        [TestCase(2,3,4,Description="My Description")]
-        public void MethodHasDescriptionSpecified(int x, int y, int z)
-        {}
-
-		[TestCase(2,3,4,TestName="XYZ")]
-		public void MethodHasTestNameSpecified(int x, int y, int z)
-		{}
-
-        [TestCase(2, 3, 4, Category = "XYZ")]
-        public void MethodHasSingleCategory(int x, int y, int z)
-        { }
-
-        [TestCase(2, 3, 4, Category = "X,Y,Z")]
-        public void MethodHasMultipleCategories(int x, int y, int z)
-        { }
-
-        [TestCase(2, 2000000, Result = 4)]
-		public int MethodCausesConversionOverflow(short x, short y)
-		{
-			return x + y;
-		}
-
-		[TestCase("12-Octobar-1942")]
-		public void MethodHasInvalidDateFormat(DateTime dt)
-		{}
-
-        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
-        public void MethodThrowsExpectedException(int x, int y, int z)
-        {
-            throw new ArgumentNullException();
-        }
-
-        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
-        public void MethodThrowsWrongException(int x, int y, int z)
-        {
-            throw new ArgumentException();
-        }
-
-        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
-        public void MethodThrowsNoException(int x, int y, int z)
-        {
-        }
-
-        [TestCase(2, 3, 4, ExpectedException = typeof(ApplicationException),
-            ExpectedMessage="Test Exception")]
-        public void MethodThrowsExpectedExceptionWithWrongMessage(int x, int y, int z)
-        {
-            throw new ApplicationException("Wrong Test Exception");
-        }
-
-        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
-        public void MethodCallsIgnore(int x, int y, int z)
-        {
-            Assert.Ignore("Ignore this");
-        }
-
-        [TestCase(1)]
-        [TestCase(2, Ignore = true)]
-        [TestCase(3, IgnoreReason = "Don't Run Me!")]
-        public void MethodWithIgnoredTestCases(int num)
-        {
-        }
-
-        [TestCase(1)]
-        [TestCase(2, Explicit = true)]
-        [TestCase(3, Explicit = true, Reason = "Connection failing")]
-        public void MethodWithExplicitTestCases(int num)
-        {
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class TestCaseAttributeFixture
+    {
+        [TestCase(2,3,4,Description="My Description")]
+        public void MethodHasDescriptionSpecified(int x, int y, int z)
+        {}
+
+		[TestCase(2,3,4,TestName="XYZ")]
+		public void MethodHasTestNameSpecified(int x, int y, int z)
+		{}
+
+        [TestCase(2, 3, 4, Category = "XYZ")]
+        public void MethodHasSingleCategory(int x, int y, int z)
+        { }
+
+        [TestCase(2, 3, 4, Category = "X,Y,Z")]
+        public void MethodHasMultipleCategories(int x, int y, int z)
+        { }
+
+        [TestCase(2, 2000000, Result = 4)]
+		public int MethodCausesConversionOverflow(short x, short y)
+		{
+			return x + y;
+		}
+
+		[TestCase("12-Octobar-1942")]
+		public void MethodHasInvalidDateFormat(DateTime dt)
+		{}
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodThrowsExpectedException(int x, int y, int z)
+        {
+            throw new ArgumentNullException();
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodThrowsWrongException(int x, int y, int z)
+        {
+            throw new ArgumentException();
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodThrowsNoException(int x, int y, int z)
+        {
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ApplicationException),
+            ExpectedMessage="Test Exception")]
+        public void MethodThrowsExpectedExceptionWithWrongMessage(int x, int y, int z)
+        {
+            throw new ApplicationException("Wrong Test Exception");
+        }
+
+        [TestCase(2, 3, 4, ExpectedException = typeof(ArgumentNullException))]
+        public void MethodCallsIgnore(int x, int y, int z)
+        {
+            Assert.Ignore("Ignore this");
+        }
+
+        [TestCase(1)]
+        [TestCase(2, Ignore = true)]
+        [TestCase(3, IgnoreReason = "Don't Run Me!")]
+        public void MethodWithIgnoredTestCases(int num)
+        {
+        }
+
+        [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/TestCaseBuilderFixture.cs b/src/tests/test-assembly/TestCaseBuilderFixture.cs
new file mode 100644
index 0000000..d935de1
--- /dev/null
+++ b/src/tests/test-assembly/TestCaseBuilderFixture.cs
@@ -0,0 +1,18 @@
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	public class TestCaseBuilderFixture
+	{
+		[Test]
+		public int NonVoidTest()
+		{
+			return 0;
+		}
+
+		[TestCase(5, Result = 1)]
+		public void VoidTestCaseWithExpectedResult(int x)
+		{
+		}
+	}
+}
diff --git a/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs b/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
index 7a06aca..cc540c2 100644
--- a/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
+++ b/src/tests/test-assembly/TestCaseSourceAttributeFixture.cs
@@ -1,99 +1,99 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org.
-// ****************************************************************
-using System;
-using System.Collections;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-    [TestFixture]
-    public class TestCaseSourceAttributeFixture
-    {
-        [TestCaseSource("source")]
-        public void MethodThrowsExpectedException(int x, int y, int z)
-        {
-            throw new ArgumentNullException();
-        }
-
-        [TestCaseSource("source")]
-        public void MethodThrowsWrongException(int x, int y, int z)
-        {
-            throw new ArgumentException();
-        }
-
-        [TestCaseSource("source")]
-        public void MethodThrowsNoException(int x, int y, int z)
-        {
-        }
-
-        [TestCaseSource("source")]
-        public 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");
-        }
-
-        internal static object[] source = new object[] {
-            new TestCaseData( 2, 3, 4 ).Throws(typeof(ArgumentNullException)) };
-
-        [TestCaseSource("exception_source")]
-        public void MethodWithSourceThrowingException(string lhs, string rhs)
-        {
-        }
-
-        [TestCaseSource("ignored_source")]
-        public void MethodWithIgnoredTestCases(int num)
-        {
-        }
-
-        [TestCaseSource("explicit_source")]
-        public void MethodWithExplicitTestCases(int num)
-        {
-        }
-
-        private static IEnumerable ignored_source
-        {
-            get
-            {
-                return new object[] {
-                    new TestCaseData(1),
-                    new TestCaseData(2).Ignore(),
-                    new TestCaseData(3).Ignore("Don't Run Me!")
-                };
-            }
-        }
-
-        private static IEnumerable 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 CLR_2_0 || CLR_4_0
-                yield return new TestCaseData("a", "a");
-                yield return new TestCaseData("b", "b");
-#endif
-
-                throw new System.Exception("my message");
-            }
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org.
+// ****************************************************************
+using System;
+using System.Collections;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class TestCaseSourceAttributeFixture
+    {
+        [TestCaseSource("source")]
+        public void MethodThrowsExpectedException(int x, int y, int z)
+        {
+            throw new ArgumentNullException();
+        }
+
+        [TestCaseSource("source")]
+        public void MethodThrowsWrongException(int x, int y, int z)
+        {
+            throw new ArgumentException();
+        }
+
+        [TestCaseSource("source")]
+        public void MethodThrowsNoException(int x, int y, int z)
+        {
+        }
+
+        [TestCaseSource("source")]
+        public 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");
+        }
+
+        internal static object[] source = new object[] {
+            new TestCaseData( 2, 3, 4 ).Throws(typeof(ArgumentNullException)) };
+
+        [TestCaseSource("exception_source")]
+        public void MethodWithSourceThrowingException(string lhs, string rhs)
+        {
+        }
+
+        [TestCaseSource("ignored_source")]
+        public void MethodWithIgnoredTestCases(int num)
+        {
+        }
+
+        [TestCaseSource("explicit_source")]
+        public void MethodWithExplicitTestCases(int num)
+        {
+        }
+
+        private static IEnumerable ignored_source
+        {
+            get
+            {
+                return new object[] {
+                    new TestCaseData(1),
+                    new TestCaseData(2).Ignore(),
+                    new TestCaseData(3).Ignore("Don't Run Me!")
+                };
+            }
+        }
+
+        private static IEnumerable 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 CLR_2_0 || CLR_4_0
+                yield return new TestCaseData("a", "a");
+                yield return new TestCaseData("b", "b");
+#endif
+
+                throw new System.Exception("my message");
+            }
+        }
+    }
+}
diff --git a/src/tests/test-assembly/TestCaseTest.cs b/src/tests/test-assembly/TestCaseTest.cs
index ae72f36..7e21452 100644
--- a/src/tests/test-assembly/TestCaseTest.cs
+++ b/src/tests/test-assembly/TestCaseTest.cs
@@ -1,21 +1,21 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.TestCaseTest
-{
-	[TestFixture]
-	public class HasCategories 
-	{
-		[Test] 
-		[Category("A category")]
-		[Category("Another Category")]
-		public void ATest()
-		{}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.TestCaseTest
+{
+	[TestFixture]
+	public class HasCategories 
+	{
+		[Test] 
+		[Category("A category")]
+		[Category("Another Category")]
+		public void ATest()
+		{}
+	}
+}
diff --git a/src/tests/test-assembly/TestContextData.cs b/src/tests/test-assembly/TestContextData.cs
index 8b69a52..1374324 100644
--- a/src/tests/test-assembly/TestContextData.cs
+++ b/src/tests/test-assembly/TestContextData.cs
@@ -1,57 +1,57 @@
-// ****************************************************************
-// 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
-{
-    [TestFixture]
-    public class TestStateRecordingFixture
-    {
-        public string stateList;
-        public string statusList;
-
-        public bool testFailure;
-        public bool testInconclusive;
-        public bool setUpFailure;
-        public bool setUpIgnore;
-
-        [SetUp]
-        public void SetUp()
-        {
-            //stateList = TestContext.CurrentContext.Result.Outcome + "=>";
-            stateList = TestContext.CurrentContext.Result.State + "=>";
-            statusList = TestContext.CurrentContext.Result.Status + "=>";
-
-            if (setUpFailure)
-                Assert.Fail("Failure in SetUp");
-            if (setUpIgnore)
-                Assert.Ignore("Ignored in SetUp");
-        }
-
-        [Test]
-        public void TheTest()
-        {
-            //stateList += TestContext.CurrentContext.Result.Outcome;
-            stateList += TestContext.CurrentContext.Result.State;
-            statusList += TestContext.CurrentContext.Result.Status;
-
-            if (testFailure)
-                Assert.Fail("Deliberate failure");
-            if (testInconclusive)
-                Assert.Inconclusive("Inconclusive test");
-        }
-
-        [TearDown]
-        public void TearDown()
-        {
-            //stateList += "=>" + TestContext.CurrentContext.Result.Outcome;
-            stateList += "=>" + TestContext.CurrentContext.Result.State;
-            statusList += "=>" + TestContext.CurrentContext.Result.Status;
-        }
-    }
-}
+// ****************************************************************
+// 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
+{
+    [TestFixture]
+    public class TestStateRecordingFixture
+    {
+        public string stateList;
+        public string statusList;
+
+        public bool testFailure;
+        public bool testInconclusive;
+        public bool setUpFailure;
+        public bool setUpIgnore;
+
+        [SetUp]
+        public void SetUp()
+        {
+            //stateList = TestContext.CurrentContext.Result.Outcome + "=>";
+            stateList = TestContext.CurrentContext.Result.State + "=>";
+            statusList = TestContext.CurrentContext.Result.Status + "=>";
+
+            if (setUpFailure)
+                Assert.Fail("Failure in SetUp");
+            if (setUpIgnore)
+                Assert.Ignore("Ignored in SetUp");
+        }
+
+        [Test]
+        public void TheTest()
+        {
+            //stateList += TestContext.CurrentContext.Result.Outcome;
+            stateList += TestContext.CurrentContext.Result.State;
+            statusList += TestContext.CurrentContext.Result.Status;
+
+            if (testFailure)
+                Assert.Fail("Deliberate failure");
+            if (testInconclusive)
+                Assert.Inconclusive("Inconclusive test");
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            //stateList += "=>" + TestContext.CurrentContext.Result.Outcome;
+            stateList += "=>" + TestContext.CurrentContext.Result.State;
+            statusList += "=>" + TestContext.CurrentContext.Result.Status;
+        }
+    }
+}
diff --git a/src/tests/test-assembly/TestData.cs b/src/tests/test-assembly/TestData.cs
index bcf1032..bdc65a3 100644
--- a/src/tests/test-assembly/TestData.cs
+++ b/src/tests/test-assembly/TestData.cs
@@ -1,40 +1,40 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-	[TestFixture]
-	public class EmptyFixture 
-	{}
-
-	/// <summary>
-	/// Summary description for OneTestCase. This class serves the purpose of 
-	/// having a test fixture that has one and only one test case. It is used 
-	/// internally for the framework tests. 
-	/// </summary>
-	/// 
-	[TestFixture]
-	public class OneTestCase
-	{
-		/// <summary>
-		///  The one and only test case in this fixture. It always succeeds. 
-		/// </summary>
-		[Test]
-		public virtual void TestCase() {}
-	}
-
-	public class InheritedTestFixture : OneTestCase 
-	{
-		public static readonly int Tests = 2;
- 
-		[Test]
-		public void Test2() 
-		{}
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	[TestFixture]
+	public class EmptyFixture 
+	{}
+
+	/// <summary>
+	/// Summary description for OneTestCase. This class serves the purpose of 
+	/// having a test fixture that has one and only one test case. It is used 
+	/// internally for the framework tests. 
+	/// </summary>
+	/// 
+	[TestFixture]
+	public class OneTestCase
+	{
+		/// <summary>
+		///  The one and only test case in this fixture. It always succeeds. 
+		/// </summary>
+		[Test]
+		public virtual void TestCase() {}
+	}
+
+	public class InheritedTestFixture : OneTestCase 
+	{
+		public static readonly int Tests = 2;
+ 
+		[Test]
+		public void Test2() 
+		{}
+	}
+}
diff --git a/src/tests/test-assembly/TestFixtureBuilderTests.cs b/src/tests/test-assembly/TestFixtureBuilderTests.cs
index f4bd40f..7a32ae5 100644
--- a/src/tests/test-assembly/TestFixtureBuilderTests.cs
+++ b/src/tests/test-assembly/TestFixtureBuilderTests.cs
@@ -1,52 +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 NUnit.Framework;
-
-namespace NUnit.TestData.TestFixtureBuilderTests
-{
-	[TestFixture]
-	[Category("fixture category")]
-	[Category("second")]
-	public class HasCategories 
-	{
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	public class SignatureTestFixture
-	{
-		[Test]
-		public static void Static()
-		{
-		}
-
-		[Test]
-		public int NotVoid() 
-		{
-			return 1;
-		}
-
-		[Test]
-		public void Parameters(string test) 
-		{}
-		
-		[Test]
-		protected void Protected() 
-		{}
-
-		[Test]
-		private void Private() 
-		{}
-
-
-		[Test]
-		public void TestVoid() 
-		{}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.TestFixtureBuilderTests
+{
+	[TestFixture]
+	[Category("fixture category")]
+	[Category("second")]
+	public class HasCategories 
+	{
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	public class SignatureTestFixture
+	{
+		[Test]
+		public static void Static()
+		{
+		}
+
+		[Test]
+		public int NotVoid() 
+		{
+			return 1;
+		}
+
+		[Test]
+		public void Parameters(string test) 
+		{}
+		
+		[Test]
+		protected void Protected() 
+		{}
+
+		[Test]
+		private void Private() 
+		{}
+
+
+		[Test]
+		public void TestVoid() 
+		{}
+	}
+}
diff --git a/src/tests/test-assembly/TestFixtureData.cs b/src/tests/test-assembly/TestFixtureData.cs
index e5be561..ec9f415 100644
--- a/src/tests/test-assembly/TestFixtureData.cs
+++ b/src/tests/test-assembly/TestFixtureData.cs
@@ -1,397 +1,402 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.TestFixtureData
-{
-	/// <summary>
-	/// Classes used for testing NUnit
-	/// </summary>
-
-    [TestFixture]
-    public class NoDefaultCtorFixture
-    {
-        public NoDefaultCtorFixture(int index) { }
-
-        [Test]
-        public void OneTest() { }
-    }
-
-    [TestFixture(7,3)]
-    public class FixtureWithArgsSupplied
-    {
-        public FixtureWithArgsSupplied(int x, int y) { }
-
-        [Test]
-        public void OneTest() { }
-    }
-
-    [TestFixture]
-	public class BadCtorFixture
-	{
-		BadCtorFixture()
-		{
-			throw new Exception();
-		}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-    public class FixtureWithoutTestFixtureAttributeContainingTest
-    {
-        [Test]
-        public void SomeTest() { }
-    }
-
-    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]
-        public static void StaticTest() { }
-    }
-#endif
-
-    [TestFixture]
-	public class MultipleSetUpAttributes
-	{
-		[SetUp]
-		public void Init1()
-		{}
-
-		[SetUp]
-		public void Init2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	public class MultipleTearDownAttributes
-	{
-		[TearDown]
-		public void Destroy1()
-		{}
-
-		[TearDown]
-		public void Destroy2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	[Ignore("testing ignore a fixture")]
-	public class IgnoredFixture
-	{
-		[Test]
-		public void Success()
-		{}
-	}
-
-	[TestFixture]
-	public class OuterClass
-	{
-		[TestFixture]
-		public class NestedTestFixture
-		{
-			[TestFixture]
-				public class DoublyNestedTestFixture
-			{
-				[Test]
-				public void Test()
-				{
-				}
-			}
-		}
-	}
-
-	[TestFixture]
-	public abstract class AbstractTestFixture
-	{
-		[TearDown]
-		public void Destroy1()
-		{}
-
-        [Test]
-        public void SomeTest()
-        {}
-	}
-
-    public class DerivedFromAbstractTestFixture : AbstractTestFixture
-    {
-    }
-
-	[TestFixture]
-	public class BaseClassTestFixture
-	{
-		[Test]
-		public void Success() { }
-	}
-	
-	public abstract class AbstractDerivedTestFixture : BaseClassTestFixture
-	{
-	}
-
-    public class DerivedFromAbstractDerivedTestFixture : AbstractDerivedTestFixture
-    {
-    }
-
-    [TestFixture]
-    public abstract class AbstractBaseFixtureWithAttribute
-    {
-    }
-
-    [TestFixture]
-    public abstract class AbstractDerivedFixtureWithSecondAttribute
-        : AbstractBaseFixtureWithAttribute
-    {
-    }
-
-    public class DoubleDerivedClassWithTwoInheritedAttributes
-        : AbstractDerivedFixtureWithSecondAttribute
-    {
-    }
-
-	[TestFixture]
-	public class MultipleFixtureSetUpAttributes
-	{
-		[TestFixtureSetUp]
-		public void Init1()
-		{}
-
-		[TestFixtureSetUp]
-		public void Init2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	[TestFixture]
-	public class MultipleFixtureTearDownAttributes
-	{
-		[TestFixtureTearDown]
-		public void Destroy1()
-		{}
-
-		[TestFixtureTearDown]
-		public void Destroy2()
-		{}
-
-		[Test] public void OneTest()
-		{}
-	}
-
-	// Base class used to ensure following classes
-	// all have at least one test
-	public class OneTestBase
-	{
-		[Test] public void OneTest() { }
-	}
-
-	[TestFixture]
-	public class PrivateSetUp : OneTestBase
-	{
-		[SetUp]
-		private void Setup()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedSetUp : OneTestBase
-	{
-		[SetUp]
-		protected void Setup()	{}
-	}
-
-	[TestFixture]
-	public class StaticSetUp : OneTestBase
-	{
-		[SetUp]
-		public static void Setup() {}
-	}
-
-	[TestFixture]
-	public class SetUpWithReturnValue : OneTestBase
-	{
-		[SetUp]
-		public int Setup() { return 0; }
-	}
-
-	[TestFixture]
-	public class SetUpWithParameters : OneTestBase
-	{
-		[SetUp]
-		public void Setup(int j) { }
-	}
-
-	[TestFixture]
-	public class PrivateTearDown : OneTestBase
-	{
-		[TearDown]
-		private void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedTearDown : OneTestBase
-	{
-		[TearDown]
-		protected void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class StaticTearDown : OneTestBase
-	{
-		[SetUp]
-		public static void TearDown() {}
-	}
-
-	[TestFixture]
-	public class TearDownWithReturnValue : OneTestBase
-	{
-		[TearDown]
-		public int Teardown() { return 0; }
-	}
-
-	[TestFixture]
-	public class TearDownWithParameters : OneTestBase
-	{
-		[TearDown]
-		public void Teardown(int j) { }
-	}
-
-	[TestFixture]
-	public class PrivateFixtureSetUp : OneTestBase
-	{
-		[TestFixtureSetUp]
-		private void Setup()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedFixtureSetUp : OneTestBase
-	{
-		[TestFixtureSetUp]
-		protected void Setup()	{}
-	}
-
-	[TestFixture]
-	public class StaticFixtureSetUp : OneTestBase
-	{
-		[TestFixtureSetUp]
-		public static void Setup() {}
-	}
-
-	[TestFixture]
-	public class FixtureSetUpWithReturnValue : OneTestBase
-	{
-		[TestFixtureSetUp]
-		public int Setup() { return 0; }
-	}
-
-	[TestFixture]
-	public class FixtureSetUpWithParameters : OneTestBase
-	{
-		[SetUp]
-		public void Setup(int j) { }
-	}
-
-	[TestFixture]
-	public class PrivateFixtureTearDown : OneTestBase
-	{
-		[TestFixtureTearDown]
-		private void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class ProtectedFixtureTearDown : OneTestBase
-	{
-		[TestFixtureTearDown]
-		protected void Teardown()	{}
-	}
-
-	[TestFixture]
-	public class StaticFixtureTearDown : OneTestBase
-	{
-		[TestFixtureTearDown]
-		public static void Teardown() {}
-	}
-
-	[TestFixture]
-	public class FixtureTearDownWithReturnValue : OneTestBase
-	{
-		[TestFixtureTearDown]
-		public int Teardown() { return 0; }
-	}
-
-	[TestFixture]
-	public class FixtureTearDownWithParameters : OneTestBase
-	{
-		[TestFixtureTearDown]
-		public void Teardown(int j) { }
-    }
-
-#if CLR_2_0 || CLR_4_0
-    [TestFixture(typeof(int))]
-    [TestFixture(typeof(string))]
-    public class GenericFixtureWithProperArgsProvided<T>
-    {
-        [Test]
-        public void SomeTest() { }
-    }
-
-    public class GenericFixtureWithNoTestFixtureAttribute<T>
-    {
-        [Test]
-        public void SomeTest() { }
-    }
-
-    [TestFixture]
-    public class GenericFixtureWithNoArgsProvided<T>
-    {
-        [Test]
-        public void SomeTest() { }
-    }
-
-    [TestFixture]
-    public abstract class AbstractFixtureBase
-    {
-        [Test]
-        public void SomeTest() { }
-    }
-
-    public class GenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided<T> : AbstractFixtureBase
-    {
-    }
-
-    [TestFixture(typeof(int))]
-    [TestFixture(typeof(string))]
-    public class GenericFixtureDerivedFromAbstractFixtureWithArgsProvided<T> : AbstractFixtureBase
-    {
-    }
-#endif
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.TestFixtureData
+{
+	/// <summary>
+	/// Classes used for testing NUnit
+	/// </summary>
+
+    [TestFixture]
+    public class NoDefaultCtorFixture
+    {
+        public NoDefaultCtorFixture(int index) { }
+
+        [Test]
+        public void OneTest() { }
+    }
+
+    [TestFixture(7,3)]
+    public class FixtureWithArgsSupplied
+    {
+        public FixtureWithArgsSupplied(int x, int y) { }
+
+        [Test]
+        public void OneTest() { }
+    }
+
+    [TestFixture]
+	public class BadCtorFixture
+	{
+		BadCtorFixture()
+		{
+			throw new Exception();
+		}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+    public class FixtureWithoutTestFixtureAttributeContainingTest
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    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]
+        public static void StaticTest() { }
+    }
+#endif
+
+    [TestFixture]
+	public class MultipleSetUpAttributes
+	{
+		[SetUp]
+		public void Init1()
+		{}
+
+		[SetUp]
+		public void Init2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	public class MultipleTearDownAttributes
+	{
+		[TearDown]
+		public void Destroy1()
+		{}
+
+		[TearDown]
+		public void Destroy2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	[Ignore("testing ignore a fixture")]
+	public class IgnoredFixture
+	{
+		[Test]
+		public void Success()
+		{}
+	}
+
+	[TestFixture]
+	public class OuterClass
+	{
+		[TestFixture]
+		public class NestedTestFixture
+		{
+			[TestFixture]
+				public class DoublyNestedTestFixture
+			{
+				[Test]
+				public void Test()
+				{
+				}
+			}
+		}
+	}
+
+	[TestFixture]
+	public abstract class AbstractTestFixture
+	{
+		[TearDown]
+		public void Destroy1()
+		{}
+
+        [Test]
+        public void SomeTest()
+        {}
+	}
+
+    public class DerivedFromAbstractTestFixture : AbstractTestFixture
+    {
+    }
+
+	[TestFixture]
+	public class BaseClassTestFixture
+	{
+		[Test]
+		public void Success() { }
+	}
+	
+	public abstract class AbstractDerivedTestFixture : BaseClassTestFixture
+	{
+	}
+
+    public class DerivedFromAbstractDerivedTestFixture : AbstractDerivedTestFixture
+    {
+    }
+
+    [TestFixture]
+    public abstract class AbstractBaseFixtureWithAttribute
+    {
+    }
+
+    [TestFixture]
+    public abstract class AbstractDerivedFixtureWithSecondAttribute
+        : AbstractBaseFixtureWithAttribute
+    {
+    }
+
+    public class DoubleDerivedClassWithTwoInheritedAttributes
+        : AbstractDerivedFixtureWithSecondAttribute
+    {
+    }
+
+	[TestFixture]
+	public class MultipleFixtureSetUpAttributes
+	{
+		[TestFixtureSetUp]
+		public void Init1()
+		{}
+
+		[TestFixtureSetUp]
+		public void Init2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	[TestFixture]
+	public class MultipleFixtureTearDownAttributes
+	{
+		[TestFixtureTearDown]
+		public void Destroy1()
+		{}
+
+		[TestFixtureTearDown]
+		public void Destroy2()
+		{}
+
+		[Test] public void OneTest()
+		{}
+	}
+
+	// Base class used to ensure following classes
+	// all have at least one test
+	public class OneTestBase
+	{
+		[Test] public void OneTest() { }
+	}
+
+	[TestFixture]
+	public class PrivateSetUp : OneTestBase
+	{
+		[SetUp]
+		private void Setup()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedSetUp : OneTestBase
+	{
+		[SetUp]
+		protected void Setup()	{}
+	}
+
+	[TestFixture]
+	public class StaticSetUp : OneTestBase
+	{
+		[SetUp]
+		public static void Setup() {}
+	}
+
+	[TestFixture]
+	public class SetUpWithReturnValue : OneTestBase
+	{
+		[SetUp]
+		public int Setup() { return 0; }
+	}
+
+	[TestFixture]
+	public class SetUpWithParameters : OneTestBase
+	{
+		[SetUp]
+		public void Setup(int j) { }
+	}
+
+	[TestFixture]
+	public class PrivateTearDown : OneTestBase
+	{
+		[TearDown]
+		private void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedTearDown : OneTestBase
+	{
+		[TearDown]
+		protected void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class StaticTearDown : OneTestBase
+	{
+		[SetUp]
+		public static void TearDown() {}
+	}
+
+	[TestFixture]
+	public class TearDownWithReturnValue : OneTestBase
+	{
+		[TearDown]
+		public int Teardown() { return 0; }
+	}
+
+	[TestFixture]
+	public class TearDownWithParameters : OneTestBase
+	{
+		[TearDown]
+		public void Teardown(int j) { }
+	}
+
+	[TestFixture]
+	public class PrivateFixtureSetUp : OneTestBase
+	{
+		[TestFixtureSetUp]
+		private void Setup()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedFixtureSetUp : OneTestBase
+	{
+		[TestFixtureSetUp]
+		protected void Setup()	{}
+	}
+
+	[TestFixture]
+	public class StaticFixtureSetUp : OneTestBase
+	{
+		[TestFixtureSetUp]
+		public static void Setup() {}
+	}
+
+	[TestFixture]
+	public class FixtureSetUpWithReturnValue : OneTestBase
+	{
+		[TestFixtureSetUp]
+		public int Setup() { return 0; }
+	}
+
+	[TestFixture]
+	public class FixtureSetUpWithParameters : OneTestBase
+	{
+		[SetUp]
+		public void Setup(int j) { }
+	}
+
+	[TestFixture]
+	public class PrivateFixtureTearDown : OneTestBase
+	{
+		[TestFixtureTearDown]
+		private void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class ProtectedFixtureTearDown : OneTestBase
+	{
+		[TestFixtureTearDown]
+		protected void Teardown()	{}
+	}
+
+	[TestFixture]
+	public class StaticFixtureTearDown : OneTestBase
+	{
+		[TestFixtureTearDown]
+		public static void Teardown() {}
+	}
+
+	[TestFixture]
+	public class FixtureTearDownWithReturnValue : OneTestBase
+	{
+		[TestFixtureTearDown]
+		public int Teardown() { return 0; }
+	}
+
+	[TestFixture]
+	public class FixtureTearDownWithParameters : OneTestBase
+	{
+		[TestFixtureTearDown]
+		public void Teardown(int j) { }
+    }
+
+#if CLR_2_0 || CLR_4_0
+    [TestFixture(typeof(int))]
+    [TestFixture(typeof(string))]
+    public class GenericFixtureWithProperArgsProvided<T>
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    public class GenericFixtureWithNoTestFixtureAttribute<T>
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    [TestFixture]
+    public class GenericFixtureWithNoArgsProvided<T>
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    [TestFixture]
+    public abstract class AbstractFixtureBase
+    {
+        [Test]
+        public void SomeTest() { }
+    }
+
+    public class GenericFixtureDerivedFromAbstractFixtureWithNoArgsProvided<T> : AbstractFixtureBase
+    {
+    }
+
+    [TestFixture(typeof(int))]
+    [TestFixture(typeof(string))]
+    public class GenericFixtureDerivedFromAbstractFixtureWithArgsProvided<T> : AbstractFixtureBase
+    {
+    }
+
+    [TestFixture(typeof(System.Collections.Generic.List<>))]
+    public class GenericFixtureWithOpenTypeAsArgument<T>
+    {
+    }
+#endif
+}
diff --git a/src/tests/test-assembly/TestFixtureExtensionTests.cs b/src/tests/test-assembly/TestFixtureExtensionTests.cs
index 2eee0d7..90e4662 100644
--- a/src/tests/test-assembly/TestFixtureExtensionTests.cs
+++ b/src/tests/test-assembly/TestFixtureExtensionTests.cs
@@ -1,50 +1,50 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData.TestFixtureExtension
-{
-	[TestFixture]
-	public abstract class BaseTestFixture
-	{
-		public bool baseSetup = false;
-		public bool baseTeardown = false;
-
-        [SetUp]
-		public void SetUp()
-		{ baseSetup = true; }
-
-        [TearDown]
-		public void TearDown()
-		{ baseTeardown = true; }
-	}
-
-	public class DerivedTestFixture : BaseTestFixture
-	{
-		[Test]
-		public void Success()
-		{
-			Assert.IsTrue(true);
-		}
-	}
-
-	public class SetUpDerivedTestFixture : BaseTestFixture
-	{
-		[SetUp]
-		public void Init()
-		{
-			base.SetUp();
-		}
-
-		[Test]
-		public void Success()
-		{
-			Assert.IsTrue(true);
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData.TestFixtureExtension
+{
+	[TestFixture]
+	public abstract class BaseTestFixture
+	{
+		public bool baseSetup = false;
+		public bool baseTeardown = false;
+
+        [SetUp]
+		public void SetUp()
+		{ baseSetup = true; }
+
+        [TearDown]
+		public void TearDown()
+		{ baseTeardown = true; }
+	}
+
+	public class DerivedTestFixture : BaseTestFixture
+	{
+		[Test]
+		public void Success()
+		{
+			Assert.IsTrue(true);
+		}
+	}
+
+	public class SetUpDerivedTestFixture : BaseTestFixture
+	{
+		[SetUp]
+		public void Init()
+		{
+			base.SetUp();
+		}
+
+		[Test]
+		public void Success()
+		{
+			Assert.IsTrue(true);
+		}
+	}
+}
diff --git a/src/tests/test-assembly/TestMethodSignatureFixture.cs b/src/tests/test-assembly/TestMethodSignatureFixture.cs
index f4ee99e..3d819f0 100644
--- a/src/tests/test-assembly/TestMethodSignatureFixture.cs
+++ b/src/tests/test-assembly/TestMethodSignatureFixture.cs
@@ -1,111 +1,111 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-	[TestFixture]
-	public class TestMethodSignatureFixture
-	{
-		public static int Tests = 20;
-		public static int Runnable = 12;
-		public static int NotRunnable = 8;
-	    public static int Errors = 3;
-	    public static int Failures = 0;
-
-		[Test]
-		public void InstanceTestMethod() { }
-
-		[Test]
-		public static void StaticTestMethod() { }
-
-        [Test]
-        public void TestMethodWithArgumentsNotProvided(int x, int y, string label) { }
-
-        [Test]
-        public static void StaticTestMethodWithArgumentsNotProvided(int x, int y, string label) { }
-
-		[TestCase(5, 2, "ABC")]
-		public void TestMethodWithoutParametersWithArgumentsProvided() { }
-
-        [TestCase(5, 2, "ABC")]
-        public void TestMethodWithArgumentsProvided(int x, int y, string label)
-        {
-            Assert.AreEqual(5, x);
-            Assert.AreEqual(2, y);
-            Assert.AreEqual("ABC", label);
-        }
-
-        [TestCase(5, 2, "ABC")]
-        public static void StaticTestMethodWithArgumentsProvided(int x, int y, string label)
-        {
-            Assert.AreEqual(5, x);
-            Assert.AreEqual(2, y);
-            Assert.AreEqual("ABC", label);
-        }
-
-        [TestCase(2, 2)]
-        public void TestMethodWithWrongNumberOfArgumentsProvided(int x, int y, string label)
-        {
-        }
-
-        [TestCase(2, 2, 3.5)]
-        public void TestMethodWithWrongArgumentTypesProvided(int x, int y, string label)
-        {
-        }
-
-        [TestCase(2, 2)]
-        public static void StaticTestMethodWithWrongNumberOfArgumentsProvided(int x, int y, string label)
-        {
-        }
-
-        [TestCase(2, 2, 3.5)]
-        public static void StaticTestMethodWithWrongArgumentTypesProvided(int x, int y, string label)
-        {
-        }
-
-        [TestCase(3.7, 2, 5.7)]
-        public void TestMethodWithConvertibleArguments(double x, double y, double sum)
-        {
-            Assert.AreEqual(sum, x + y, 0.0001);
-        }
-
-        [TestCase(3.7, 2, 5.7)]
-        public void TestMethodWithNonConvertibleArguments(int x, int y, int sum)
-        {
-            Assert.AreEqual(sum, x + y, 0.0001);
-        }
-
-        [TestCase(12, 3, 4)]
-		[TestCase( 12, 2, 6 )]
-		[TestCase( 12, 4, 3 )]
-		public void TestMethodWithMultipleTestCases( int n, int d, int q )
-		{
-			Assert.AreEqual( q, n / d );
-		}
-
-        [TestCase(new int[] {1, 2, 3})]
-        public void TestMethodWithParamsArgument(params int[] n)
-        {
-        }
-
-//		[Test]
-//		public abstract void AbstractTestMethod() { }
-
-		[Test]
-		protected void ProtectedTestMethod() { }
-
-		[Test]
-		private void PrivateTestMethod() { }
-
-		[Test]
-		public bool TestMethodWithReturnType() 
-		{
-			return true;
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+	[TestFixture]
+	public class TestMethodSignatureFixture
+	{
+		public static int Tests = 20;
+		public static int Runnable = 12;
+		public static int NotRunnable = 8;
+	    public static int Errors = 3;
+	    public static int Failures = 0;
+
+		[Test]
+		public void InstanceTestMethod() { }
+
+		[Test]
+		public static void StaticTestMethod() { }
+
+        [Test]
+        public void TestMethodWithArgumentsNotProvided(int x, int y, string label) { }
+
+        [Test]
+        public static void StaticTestMethodWithArgumentsNotProvided(int x, int y, string label) { }
+
+		[TestCase(5, 2, "ABC")]
+		public void TestMethodWithoutParametersWithArgumentsProvided() { }
+
+        [TestCase(5, 2, "ABC")]
+        public void TestMethodWithArgumentsProvided(int x, int y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(5, 2, "ABC")]
+        public static void StaticTestMethodWithArgumentsProvided(int x, int y, string label)
+        {
+            Assert.AreEqual(5, x);
+            Assert.AreEqual(2, y);
+            Assert.AreEqual("ABC", label);
+        }
+
+        [TestCase(2, 2)]
+        public void TestMethodWithWrongNumberOfArgumentsProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(2, 2, 3.5)]
+        public void TestMethodWithWrongArgumentTypesProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(2, 2)]
+        public static void StaticTestMethodWithWrongNumberOfArgumentsProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(2, 2, 3.5)]
+        public static void StaticTestMethodWithWrongArgumentTypesProvided(int x, int y, string label)
+        {
+        }
+
+        [TestCase(3.7, 2, 5.7)]
+        public void TestMethodWithConvertibleArguments(double x, double y, double sum)
+        {
+            Assert.AreEqual(sum, x + y, 0.0001);
+        }
+
+        [TestCase(3.7, 2, 5.7)]
+        public void TestMethodWithNonConvertibleArguments(int x, int y, int sum)
+        {
+            Assert.AreEqual(sum, x + y, 0.0001);
+        }
+
+        [TestCase(12, 3, 4)]
+		[TestCase( 12, 2, 6 )]
+		[TestCase( 12, 4, 3 )]
+		public void TestMethodWithMultipleTestCases( int n, int d, int q )
+		{
+			Assert.AreEqual( q, n / d );
+		}
+
+        [TestCase(new int[] {1, 2, 3})]
+        public void TestMethodWithParamsArgument(params int[] n)
+        {
+        }
+
+//		[Test]
+//		public abstract void AbstractTestMethod() { }
+
+		[Test]
+		protected void ProtectedTestMethod() { }
+
+		[Test]
+		private void PrivateTestMethod() { }
+
+		[Test]
+		public bool TestMethodWithReturnType() 
+		{
+			return true;
+		}
+	}
+}
diff --git a/src/tests/test-assembly/TheoryFixture.cs b/src/tests/test-assembly/TheoryFixture.cs
index 77974b9..b7bf174 100644
--- a/src/tests/test-assembly/TheoryFixture.cs
+++ b/src/tests/test-assembly/TheoryFixture.cs
@@ -1,65 +1,65 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-    [TestFixture]
-    public class TheoryFixture
-    {
-        [Datapoint]
-        internal int i0 = 0;
-        [Datapoint]
-        internal static int i1 = 1;
-        [Datapoint]
-        public int i100 = 100;
-
-        private void Dummy()
-        {
-        }
-
-        [Theory]
-        public void TheoryWithNoArguments()
-        {
-        }
-
-        [Theory]
-        public void TheoryWithArgumentsButNoDatapoints(decimal x, decimal y)
-        {
-        }
-
-        [Theory]
-        public void TheoryWithArgumentsAndDatapoints(int x, int y)
-        {
-        }
-
-        [TestCase(5, 10)]
-        [TestCase(3, 12)]
-        public void TestWithArguments(int x, int y)
-        {
-        }
-
-        [Theory]
-        public void TestWithBooleanArguments(bool a, bool b)
-        {
-        }
-
-        [Theory]
-        public void TestWithEnumAsArgument(System.Threading.ApartmentState state)
-        {
-        }
-
-        [Theory]
-        public void TestWithAllBadValues(
-            [Values(-12.0, -4.0, -9.0)] double d)
-        {
-            Assume.That(d > 0);
-            Assert.Pass();
-        }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class TheoryFixture
+    {
+        [Datapoint]
+        internal int i0 = 0;
+        [Datapoint]
+        internal static int i1 = 1;
+        [Datapoint]
+        public int i100 = 100;
+
+        private void Dummy()
+        {
+        }
+
+        [Theory]
+        public void TheoryWithNoArguments()
+        {
+        }
+
+        [Theory]
+        public void TheoryWithArgumentsButNoDatapoints(decimal x, decimal y)
+        {
+        }
+
+        [Theory]
+        public void TheoryWithArgumentsAndDatapoints(int x, int y)
+        {
+        }
+
+        [TestCase(5, 10)]
+        [TestCase(3, 12)]
+        public void TestWithArguments(int x, int y)
+        {
+        }
+
+        [Theory]
+        public void TestWithBooleanArguments(bool a, bool b)
+        {
+        }
+
+        [Theory]
+        public void TestWithEnumAsArgument(System.Threading.ApartmentState state)
+        {
+        }
+
+        [Theory]
+        public void TestWithAllBadValues(
+            [Values(-12.0, -4.0, -9.0)] double d)
+        {
+            Assume.That(d > 0);
+            Assert.Pass();
+        }
+    }
+}
diff --git a/src/tests/test-assembly/ThreadingFixture.cs b/src/tests/test-assembly/ThreadingFixture.cs
index e1f4778..04807d9 100644
--- a/src/tests/test-assembly/ThreadingFixture.cs
+++ b/src/tests/test-assembly/ThreadingFixture.cs
@@ -1,53 +1,53 @@
-// ****************************************************************
-// Copyright 2008, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-using System;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-    [TestFixture]
-    public class ThreadingFixture
-    {
-        public bool TearDownWasRun;
-
-        [SetUp]
-        public void SetUp()
-        {
-            TearDownWasRun = false;
-        }
-
-        [TearDown]
-        public void TearDown()
-        {
-            TearDownWasRun = true;
-        }
-
-        [Test, Timeout(50)]
-        public void InfiniteLoopWith50msTimeout()
-        {
-            while (true) { }
-        }
-		
-		[Test, RequiresThread]
-		public void MethodWithThreeAsserts()
-		{
-			Assert.True(true);
-			Assert.True(true);
-			Assert.True(true);
-		}
-    }
-
-    [TestFixture, Timeout(50)]
-    public class ThreadingFixtureWithTimeout
-    {
-        [Test]
-        public void Test1() { }
-        [Test]
-        public void Test2WithInfiniteLoop() { while (true) { } }
-        [Test]
-        public void Test3() { }
-    }
-}
+// ****************************************************************
+// Copyright 2008, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+using System;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class ThreadingFixture
+    {
+        public bool TearDownWasRun;
+
+        [SetUp]
+        public void SetUp()
+        {
+            TearDownWasRun = false;
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            TearDownWasRun = true;
+        }
+
+        [Test, Timeout(50)]
+        public void InfiniteLoopWith50msTimeout()
+        {
+            while (true) { }
+        }
+		
+		[Test, RequiresThread]
+		public void MethodWithThreeAsserts()
+		{
+			Assert.True(true);
+			Assert.True(true);
+			Assert.True(true);
+		}
+    }
+
+    [TestFixture, Timeout(50)]
+    public class ThreadingFixtureWithTimeout
+    {
+        [Test]
+        public void Test1() { }
+        [Test]
+        public void Test2WithInfiniteLoop() { while (true) { } }
+        [Test]
+        public void Test3() { }
+    }
+}
diff --git a/src/tests/test-assembly/TypeHelperFixture.cs b/src/tests/test-assembly/TypeHelperFixture.cs
index f7f2ab5..c188889 100644
--- a/src/tests/test-assembly/TypeHelperFixture.cs
+++ b/src/tests/test-assembly/TypeHelperFixture.cs
@@ -1,92 +1,92 @@
-// ****************************************************************
-// 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 CLR_2_0 || CLR_4_0
-using System.Collections.Generic;
-#endif
-using NUnit.Framework;
-
-public class MyNoNamespaceClass { }
-
-namespace NUnit.TestData.TypeHelperFixture
-{
-    // NOTE: TestFixture attributes are not used by the unit tests but
-    // are provided so these class may be loaded in the NUnit gui
-    // for inspection.
-
-    [TestFixture]
-    public class SimpleClass
-    {
-    }
-
-    public class ContainerClass
-    {
-        public class NestedClass
-        {
-            [TestFixture]
-            public class DoublyNestedClass { }
-
-#if CLR_2_0 || CLR_4_0
-            [TestFixture(typeof(long))]
-            public class DoublyNestedGeneric<T> { }
-#endif
-        }
-
-#if CLR_2_0 || CLR_4_0
-        public class NestedGeneric<T>
-        {
-            [TestFixture(typeof(int))]
-            public class DoublyNestedClass { }
-
-            [TestFixture(typeof(int),typeof(string))]
-            public class DoublyNestedGeneric<U>
-            {
-            }
-        }
-#endif
-    }
-
-#if CLR_2_0 || CLR_4_0
-    [TestFixture(typeof(int[]))]
-    [TestFixture(typeof(List<int>))]
-    [TestFixture(typeof(List<string>))]
-    [TestFixture(typeof(List<List<int>>))]
-    public class ListTester<TList> where TList : System.Collections.IList
-    {
-    }
-
-    [TestFixture(typeof(int), typeof(decimal), typeof(string))]
-    public class GenericClass<T, U, V>
-    {
-    }
-
-    public class GenericContainerClass<T>
-    {
-        public class NestedClass
-        {
-            [TestFixture(typeof(int[]))]
-            public class DoublyNestedClass { }
-
-            [TestFixture(typeof(int), typeof(string))]
-            [TestFixture(typeof(long), typeof(string))]
-            public class DoublyNestedGeneric<U> { }
-        }
-
-        public class NestedGeneric<U>
-        {
-            [TestFixture(typeof(string), typeof(int))]
-            public class DoublyNestedClass { }
-
-            [TestFixture(typeof(string), typeof(int), typeof(bool))]
-            public class DoublyNestedGeneric<V>
-            {
-            }
-        }
-    }
-#endif
-}
+// ****************************************************************
+// 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 CLR_2_0 || CLR_4_0
+using System.Collections.Generic;
+#endif
+using NUnit.Framework;
+
+public class MyNoNamespaceClass { }
+
+namespace NUnit.TestData.TypeHelperFixture
+{
+    // NOTE: TestFixture attributes are not used by the unit tests but
+    // are provided so these class may be loaded in the NUnit gui
+    // for inspection.
+
+    [TestFixture]
+    public class SimpleClass
+    {
+    }
+
+    public class ContainerClass
+    {
+        public class NestedClass
+        {
+            [TestFixture]
+            public class DoublyNestedClass { }
+
+#if CLR_2_0 || CLR_4_0
+            [TestFixture(typeof(long))]
+            public class DoublyNestedGeneric<T> { }
+#endif
+        }
+
+#if CLR_2_0 || CLR_4_0
+        public class NestedGeneric<T>
+        {
+            [TestFixture(typeof(int))]
+            public class DoublyNestedClass { }
+
+            [TestFixture(typeof(int),typeof(string))]
+            public class DoublyNestedGeneric<U>
+            {
+            }
+        }
+#endif
+    }
+
+#if CLR_2_0 || CLR_4_0
+    [TestFixture(typeof(int[]))]
+    [TestFixture(typeof(List<int>))]
+    [TestFixture(typeof(List<string>))]
+    [TestFixture(typeof(List<List<int>>))]
+    public class ListTester<TList> where TList : System.Collections.IList
+    {
+    }
+
+    [TestFixture(typeof(int), typeof(decimal), typeof(string))]
+    public class GenericClass<T, U, V>
+    {
+    }
+
+    public class GenericContainerClass<T>
+    {
+        public class NestedClass
+        {
+            [TestFixture(typeof(int[]))]
+            public class DoublyNestedClass { }
+
+            [TestFixture(typeof(int), typeof(string))]
+            [TestFixture(typeof(long), typeof(string))]
+            public class DoublyNestedGeneric<U> { }
+        }
+
+        public class NestedGeneric<U>
+        {
+            [TestFixture(typeof(string), typeof(int))]
+            public class DoublyNestedClass { }
+
+            [TestFixture(typeof(string), typeof(int), typeof(bool))]
+            public class DoublyNestedGeneric<V>
+            {
+            }
+        }
+    }
+#endif
+}
diff --git a/src/tests/test-assembly/UnhandledExceptions.cs b/src/tests/test-assembly/UnhandledExceptions.cs
index f7ef5e1..a3b07e1 100644
--- a/src/tests/test-assembly/UnhandledExceptions.cs
+++ b/src/tests/test-assembly/UnhandledExceptions.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Text;
-using NUnit.Framework;
-
-namespace NUnit.TestData
-{
-    [TestFixture]
-    public class UnhandledExceptions
-    {
-        #region Normal
-        [NUnit.Framework.Test]
-        public void Normal()
-        {
-            throw new ApplicationException("Test exception");
-        }
-        #endregion Normal
-
-        #region Threaded
-        [NUnit.Framework.Test]
-        public void Threaded()
-        {
-            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Normal));
-            thread.Start();
-            System.Threading.Thread.Sleep(100);
-        }
-        #endregion Threaded
-
-        #region ThreadedAndForget
-        [NUnit.Framework.Test]
-        public void ThreadedAndForget()
-        {
-            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Normal));
-            thread.Start();
-        }
-        #endregion ThreadedAndForget
-
-        #region ThreadedAndWait
-        [NUnit.Framework.Test]
-        public void ThreadedAndWait()
-        {
-            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Normal));
-            thread.Start();
-            thread.Join();
-        }
-        #endregion ThreadedAndWait
-
-        #region ThreadedAssert
-        [Test]
-        public void ThreadedAssert()
-        {
-            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadedAssertProc));
-            thread.Start();
-            thread.Join();
-        }
-
-        private void ThreadedAssertProc()
-        {
-            Assert.AreEqual(5, 2 + 2);
-        }
-        #endregion
-    }
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Text;
+using NUnit.Framework;
+
+namespace NUnit.TestData
+{
+    [TestFixture]
+    public class UnhandledExceptions
+    {
+        #region Normal
+        [NUnit.Framework.Test]
+        public void Normal()
+        {
+            throw new ApplicationException("Test exception");
+        }
+        #endregion Normal
+
+        #region Threaded
+        [NUnit.Framework.Test]
+        public void Threaded()
+        {
+            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Normal));
+            thread.Start();
+            System.Threading.Thread.Sleep(100);
+        }
+        #endregion Threaded
+
+        #region ThreadedAndForget
+        [NUnit.Framework.Test]
+        public void ThreadedAndForget()
+        {
+            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Normal));
+            thread.Start();
+        }
+        #endregion ThreadedAndForget
+
+        #region ThreadedAndWait
+        [NUnit.Framework.Test]
+        public void ThreadedAndWait()
+        {
+            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Normal));
+            thread.Start();
+            thread.Join();
+        }
+        #endregion ThreadedAndWait
+
+        #region ThreadedAssert
+        [Test]
+        public void ThreadedAssert()
+        {
+            System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadedAssertProc));
+            thread.Start();
+            thread.Join();
+        }
+
+        private void ThreadedAssertProc()
+        {
+            Assert.AreEqual(5, 2 + 2);
+        }
+        #endregion
+    }
+}
diff --git a/src/tests/test-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/tests/test-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..5621356
Binary files /dev/null and b/src/tests/test-assembly/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/tests/test-assembly/obj/Debug/test-assembly.csproj.FileListAbsolute.txt b/src/tests/test-assembly/obj/Debug/test-assembly.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..9a98754
--- /dev/null
+++ b/src/tests/test-assembly/obj/Debug/test-assembly.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\test-assembly.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\test-assembly.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly\obj\Debug\test-assembly.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly\obj\Debug\test-assembly.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-assembly\obj\Debug\test-assembly.pdb
diff --git a/src/tests/test-assembly/obj/Debug/test-assembly.csprojResolveAssemblyReference.cache b/src/tests/test-assembly/obj/Debug/test-assembly.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..39d62f7
Binary files /dev/null and b/src/tests/test-assembly/obj/Debug/test-assembly.csprojResolveAssemblyReference.cache differ
diff --git a/src/tests/test-assembly/obj/Debug/test-assembly.pdb b/src/tests/test-assembly/obj/Debug/test-assembly.pdb
new file mode 100644
index 0000000..86075f1
Binary files /dev/null and b/src/tests/test-assembly/obj/Debug/test-assembly.pdb differ
diff --git a/src/tests/test-assembly/test-assembly.build b/src/tests/test-assembly/test-assembly.build
index 7e2a4fb..80f0813 100644
--- a/src/tests/test-assembly/test-assembly.build
+++ b/src/tests/test-assembly/test-assembly.build
@@ -1,71 +1,72 @@
-<?xml version="1.0"?>
-<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"/>
-    <include name="ConsoleRunnerTest.cs"/>
-    <include name="CultureAttributeTests.cs"/>
-    <include name="DatapointFixture.cs"/>
-    <include name="DirectoryChangeFixture.cs"/>
-    <include name="ExpectExceptionTest.cs"/>
-    <include name="FailFixtureTests.cs"/>
-    <include name="FixtureSetUpTearDownTests.cs"/>
-    <include name="IgnoreFixtureTests.cs"/>
-    <include name="LegacySuiteData.cs"/>
-    <include name="MaxTimeFixture.cs"/>
-    <include name="ParameterizedTestFixture.cs"/>
-    <include name="ParameterizedTestMethodFixture.cs"/>
-    <include name="PropertyAttributeTests.cs"/>
-    <include name="RepeatedTestFixtureTests.cs"/>
-    <include name="SetupFixtureTests.cs"/>
-    <include name="SetUpTest.cs"/>
-    <include name="TestCaseAttributeFixture.cs"/>
-    <include name="TestCaseSourceAttributeFixture.cs"/>
-    <include name="TestCaseTest.cs"/>
-    <include name="TestContextData.cs"/>
-    <include name="TestData.cs"/>
-    <include name="TestFixtureBuilderTests.cs"/>
-    <include name="TestFixtureData.cs"/>
-    <include name="TestFixtureExtensionTests.cs"/>
-    <include name="TestMethodSignatureFixture.cs"/>
-    <include name="TheoryFixture.cs"/>
-    <include name="ThreadingFixture.cs"/>
-    <include name="TypeHelperFixture.cs"/>
-    <include name="UnhandledExceptions.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/test-assembly.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <nowarn>
-        <warning number="618,672"/>
-      </nowarn>
-      <references>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.framework.dir}/nunit.framework.extensions.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/tests/test-assembly">
-      <fileset>
-        <patternset refid="source-files" />
-        <include name="test-assembly.csproj"/>
-        <include name="test-assembly.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<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"/>
+    <include name="ConsoleRunnerTest.cs"/>
+    <include name="CultureAttributeTests.cs"/>
+    <include name="DatapointFixture.cs"/>
+    <include name="DirectoryChangeFixture.cs"/>
+    <include name="ExpectExceptionTest.cs"/>
+    <include name="FailFixtureTests.cs"/>
+    <include name="FixtureSetUpTearDownTests.cs"/>
+    <include name="IgnoreFixtureTests.cs"/>
+    <include name="LegacySuiteData.cs"/>
+    <include name="MaxTimeFixture.cs"/>
+    <include name="ParameterizedTestFixture.cs"/>
+    <include name="ParameterizedTestMethodFixture.cs"/>
+    <include name="PropertyAttributeTests.cs"/>
+    <include name="RepeatedTestFixtureTests.cs"/>
+    <include name="SetupFixtureTests.cs"/>
+    <include name="SetUpTest.cs"/>
+    <include name="TestCaseAttributeFixture.cs"/>
+    <include name="TestCaseBuilderFixture.cs"/>
+    <include name="TestCaseSourceAttributeFixture.cs"/>
+    <include name="TestCaseTest.cs"/>
+    <include name="TestContextData.cs"/>
+    <include name="TestData.cs"/>
+    <include name="TestFixtureBuilderTests.cs"/>
+    <include name="TestFixtureData.cs"/>
+    <include name="TestFixtureExtensionTests.cs"/>
+    <include name="TestMethodSignatureFixture.cs"/>
+    <include name="TheoryFixture.cs"/>
+    <include name="ThreadingFixture.cs"/>
+    <include name="TypeHelperFixture.cs"/>
+    <include name="UnhandledExceptions.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/test-assembly.dll" 
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <nowarn>
+        <warning number="618,672"/>
+      </nowarn>
+      <references>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.extensions.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/tests/test-assembly">
+      <fileset>
+        <patternset refid="source-files" />
+        <include name="test-assembly.csproj"/>
+        <include name="test-assembly.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/tests/test-assembly/test-assembly.csproj b/src/tests/test-assembly/test-assembly.csproj
index a7562d1..cf870ae 100644
--- a/src/tests/test-assembly/test-assembly.csproj
+++ b/src/tests/test-assembly/test-assembly.csproj
@@ -1,175 +1,188 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>test-assembly</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.TestData</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <PublishUrl>http://localhost/test-assembly/</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Web</InstallFrom>
-    <UpdateEnabled>true</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
-    <IsWebBootstrapper>true</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618,672</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618,672</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\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>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="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" />
-    <Compile Include="DatapointFixture.cs" />
-    <Compile Include="ExpectExceptionTest.cs" />
-    <Compile Include="FailFixtureTests.cs" />
-    <Compile Include="FixtureSetUpTearDownTests.cs" />
-    <Compile Include="IgnoreFixtureTests.cs" />
-    <Compile Include="LegacySuiteData.cs" />
-    <Compile Include="MaxTimeFixture.cs" />
-    <Compile Include="ParameterizedTestFixture.cs" />
-    <Compile Include="PropertyAttributeTests.cs" />
-    <Compile Include="RepeatedTestFixtureTests.cs" />
-    <Compile Include="SetupFixtureTests.cs" />
-    <Compile Include="SetUpTest.cs" />
-    <Compile Include="TestCaseAttributeFixture.cs" />
-    <Compile Include="TestCaseSourceAttributeFixture.cs" />
-    <Compile Include="TestCaseTest.cs" />
-    <Compile Include="TestContextData.cs" />
-    <Compile Include="TestData.cs" />
-    <Compile Include="TestFixtureBuilderTests.cs" />
-    <Compile Include="TestFixtureData.cs" />
-    <Compile Include="TestFixtureExtensionTests.cs" />
-    <Compile Include="TestMethodSignatureFixture.cs" />
-    <Compile Include="TheoryFixture.cs" />
-    <Compile Include="ThreadingFixture.cs" />
-    <Compile Include="TypeHelperFixture.cs" />
-    <Compile Include="UnhandledExceptions.cs" />
-    <Compile Include="DirectoryChangeFixture.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="test-assembly.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{1960CAC4-9A82-47C5-A9B3-55BC37572C3C}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>test-assembly</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.TestData</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>http://localhost/test-assembly/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,672</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;CLR_2_0,NET_2_0,CS_3_0</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618,672</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\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>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <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>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <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" />
+    <Compile Include="DatapointFixture.cs" />
+    <Compile Include="ExpectExceptionTest.cs" />
+    <Compile Include="FailFixtureTests.cs" />
+    <Compile Include="FixtureSetUpTearDownTests.cs" />
+    <Compile Include="IgnoreFixtureTests.cs" />
+    <Compile Include="LegacySuiteData.cs" />
+    <Compile Include="MaxTimeFixture.cs" />
+    <Compile Include="ParameterizedTestFixture.cs" />
+    <Compile Include="PropertyAttributeTests.cs" />
+    <Compile Include="RepeatedTestFixtureTests.cs" />
+    <Compile Include="SetupFixtureTests.cs" />
+    <Compile Include="SetUpTest.cs" />
+    <Compile Include="TestCaseAttributeFixture.cs" />
+    <Compile Include="TestCaseBuilderFixture.cs" />
+    <Compile Include="TestCaseSourceAttributeFixture.cs" />
+    <Compile Include="TestCaseTest.cs" />
+    <Compile Include="TestContextData.cs" />
+    <Compile Include="TestData.cs" />
+    <Compile Include="TestFixtureBuilderTests.cs" />
+    <Compile Include="TestFixtureData.cs" />
+    <Compile Include="TestFixtureExtensionTests.cs" />
+    <Compile Include="TestMethodSignatureFixture.cs" />
+    <Compile Include="TheoryFixture.cs" />
+    <Compile Include="ThreadingFixture.cs" />
+    <Compile Include="TypeHelperFixture.cs" />
+    <Compile Include="UnhandledExceptions.cs" />
+    <Compile Include="DirectoryChangeFixture.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="test-assembly.build" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/tests/test-utilities/FormTester.cs b/src/tests/test-utilities/FormTester.cs
index 16d93aa..f18fd2f 100644
--- a/src/tests/test-utilities/FormTester.cs
+++ b/src/tests/test-utilities/FormTester.cs
@@ -1,334 +1,334 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Collections;
-using System.Windows.Forms;
-using NUnit.Framework;
-
-namespace NUnit.TestUtilities
-{
-	/// <summary>
-	/// TestFixtures that test Forms inherit from this class.
-	/// </summary>
-	public class FormTester : ControlTester
-	{
-		public FormTester() { }
-
-		public FormTester( Form form ) : base( form ) { }
-
-		public Form Form
-		{
-			get { return Control as Form; }
-			set { Control = value; }
-		}
-	}
-
-	/// <summary>
-	/// TestFixtures that test Controls inherit from this class.
-	/// </summary>
-	public class ControlTester
-	{
-		public ControlTester() { }
-
-		public ControlTester( Control control )
-		{
-			this.control = control;
-		}
-
-		// TODO: Rewrite using generics when we move to .NET 2.0
-
-		// The control we are testing
-		private Control control;
-
-		// Various ways of looking at this control's controls
-		private ControlCollection controls;
-		private ButtonCollection buttons;
-		private LabelCollection labels;
-		private TextBoxCollection textboxes;
-		private ComboBoxCollection combos;
-
-		#region Properties
-		/// <summary>
-		/// Get and set the control to be tested
-		/// </summary>
-		public Control Control
-		{
-			get { return control; }
-			set
-			{ 
-				control = value;
-				InitCollections();
-			}
-		}
-
-		private void InitCollections()
-		{
-			controls = new ControlCollection( control.Controls );
-			
-			// These will be initialized as needed
-			buttons = null;
-			labels = null;
-			textboxes = null;
-			combos = null;
-		}
-
-		/// <summary>
-		/// Get our collection of all the controls on this control.
-		/// </summary>
-		public ControlCollection Controls
-		{
-			get { return controls; }
-		}
-
-		/// <summary>
-		/// Get our collection of all the buttons on this control.
-		/// </summary>
-		public ButtonCollection Buttons
-		{
-			get 
-			{ 
-				if ( buttons == null )
-					buttons = new ButtonCollection( control.Controls );
-
-				return buttons;
-			}
-		}
-
-		/// <summary>
-		/// Get our collection of all the labels on this control.
-		/// </summary>
-		public LabelCollection Labels
-		{
-			get 
-			{
-				if (labels == null )
-					labels = new LabelCollection( control.Controls );
-
-				return labels;
-			}
-		}
-
-		/// <summary>
-		/// Get our collection of all the TextBoxes on this control.
-		/// </summary>
-		public TextBoxCollection TextBoxes
-		{
-			get 
-			{
-				if ( textboxes == null )
-					textboxes = new TextBoxCollection( control.Controls );
-
-				return textboxes;
-			}
-		}
-
-		/// <summary>
-		/// Get our collection of all ComboBoxes on the form
-		/// </summary>
-		public ComboBoxCollection Combos
-		{
-			get
-			{
-				if ( combos == null )
-					combos = new ComboBoxCollection( control.Controls );
-
-				return combos;
-			}
-		}
-		#endregion
-
-		#region Assertions
-		/// <summary>
-		/// Assert that a control with a given name exists on this control.
-		/// </summary>
-		/// <param name="name">The name of the control.</param>
-		public void AssertControlExists( string targetName )
-		{
-			AssertControlExists( targetName, null );
-		}
-			
-		public void AssertControlExists( string expectedName, Type expectedType )
-		{
-			bool gotName = false;
-			System.Type gotType = null;
-			foreach( Control ctl in control.Controls ) 
-			{
-				if ( ctl.Name == expectedName )
-				{
-					gotName = true;
-					if ( expectedType == null )
-						return;
-					gotType = ctl.GetType();
-					if ( expectedType.IsAssignableFrom( gotType ) )
-						return;
-				}
-			}
-
-			if ( gotName )
-				Assert.Fail( "Expected control {0} to be a {1} but was {2}", expectedName, expectedType.Name, gotType.Name );
-			else
-				Assert.Fail( "{0} does not contain {1} control", control.Name, expectedName );
-		}
-
-		public void AssertControlsAreStackedVertically( params string[] names )
-		{
-			string prior = null;
-			foreach( string current in names )
-			{
-				if ( prior != null )
-				{
-					if ( Controls[prior].Bottom > Controls[current].Top )
-						Assert.Fail( "The {0} control should be above the {1} control", prior, current );
-				}
-				prior = current;
-			}
-		}
-		#endregion
-
-		#region Other public methods
-		public string GetText( string name )
-		{
-			return Controls[ name ].Text;
-		}
-		#endregion
-
-		#region Nested Collection Classes
-
-		#region Enumerator used by all collections
-		public class ControlEnumerator : IEnumerator
-		{
-			IEnumerator sourceEnum;
-			System.Type typeFilter;
-
-			public ControlEnumerator( Control.ControlCollection source, System.Type typeFilter )
-			{
-				this.sourceEnum = source.GetEnumerator();
-				this.typeFilter = typeFilter;
-			}
-
-			#region IEnumerator Members
-
-			public void Reset()
-			{
-				sourceEnum.Reset();
-			}
-
-			public object Current
-			{
-				get { return sourceEnum.Current; }
-			}
-
-			public bool MoveNext()
-			{
-				while( sourceEnum.MoveNext() )
-				{
-					if ( typeFilter == null || typeFilter.IsAssignableFrom( Current.GetType() ) )
-						return true;
-				}
-
-				return false;
-			}
-
-			#endregion
-		}
-		#endregion
-
-		#region Control Collection
-		public class ControlCollection : IEnumerable
-		{
-			protected Control.ControlCollection source;
-			private System.Type typeFilter;
-
-			public ControlCollection( Control.ControlCollection source )
-				: this( source, null ) { }
-
-			public ControlCollection( Control.ControlCollection source, System.Type typeFilter )
-			{
-				this.source = source;
-				this.typeFilter = typeFilter;
-			}
-
-			public Control this[string name]
-			{
-				get 
-				{
-					foreach( Control control in this )
-					{				
-						if ( control.Name == name )
-							return control;
-					}
-
-					return null;
-				}
-			}
-
-			#region IEnumerable Members
-
-			public IEnumerator GetEnumerator()
-			{
-				return new ControlEnumerator( this.source, this.typeFilter );
-			}
-					
-			#endregion
-		}
-		#endregion
-
-		#region ButtonCollection
-		public class ButtonCollection : ControlCollection
-		{
-			public ButtonCollection( Control.ControlCollection controls )
-				: base( controls, typeof( Button ) ) { }
-
-			public new Button this[string name]
-			{
-				get { return base[name] as Button; }
-			}
-		}
-		#endregion
-
-		#region LabelCollection
-		public class LabelCollection : ControlCollection
-		{
-			public LabelCollection( Control.ControlCollection controls )
-				: base( controls, typeof( Label ) ) { }
-
-			public new Label this[string name]
-			{
-				get { return base[name] as Label; }
-			}
-		}
-		#endregion
-
-		#region TextBoxCollection
-		public class TextBoxCollection : ControlCollection
-		{
-			public TextBoxCollection( Control.ControlCollection controls )
-				: base( controls, typeof( TextBox ) ) { }
-
-			public new TextBox this[string name]
-			{
-				get { return base[name] as TextBox; }
-			}
-		}
-		#endregion
-
-		#region ComboBoxCollection
-		public class ComboBoxCollection : ControlCollection
-		{
-			public ComboBoxCollection( Control.ControlCollection controls )
-				: base( controls, typeof( ComboBox ) ) { }
-
-			public new ComboBox this[string name]
-			{
-				get { return base[name] as ComboBox; }
-			}
-		}
-		#endregion
-
-		#endregion
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Collections;
+using System.Windows.Forms;
+using NUnit.Framework;
+
+namespace NUnit.TestUtilities
+{
+	/// <summary>
+	/// TestFixtures that test Forms inherit from this class.
+	/// </summary>
+	public class FormTester : ControlTester
+	{
+		public FormTester() { }
+
+		public FormTester( Form form ) : base( form ) { }
+
+		public Form Form
+		{
+			get { return Control as Form; }
+			set { Control = value; }
+		}
+	}
+
+	/// <summary>
+	/// TestFixtures that test Controls inherit from this class.
+	/// </summary>
+	public class ControlTester
+	{
+		public ControlTester() { }
+
+		public ControlTester( Control control )
+		{
+			this.control = control;
+		}
+
+		// TODO: Rewrite using generics when we move to .NET 2.0
+
+		// The control we are testing
+		private Control control;
+
+		// Various ways of looking at this control's controls
+		private ControlCollection controls;
+		private ButtonCollection buttons;
+		private LabelCollection labels;
+		private TextBoxCollection textboxes;
+		private ComboBoxCollection combos;
+
+		#region Properties
+		/// <summary>
+		/// Get and set the control to be tested
+		/// </summary>
+		public Control Control
+		{
+			get { return control; }
+			set
+			{ 
+				control = value;
+				InitCollections();
+			}
+		}
+
+		private void InitCollections()
+		{
+			controls = new ControlCollection( control.Controls );
+			
+			// These will be initialized as needed
+			buttons = null;
+			labels = null;
+			textboxes = null;
+			combos = null;
+		}
+
+		/// <summary>
+		/// Get our collection of all the controls on this control.
+		/// </summary>
+		public ControlCollection Controls
+		{
+			get { return controls; }
+		}
+
+		/// <summary>
+		/// Get our collection of all the buttons on this control.
+		/// </summary>
+		public ButtonCollection Buttons
+		{
+			get 
+			{ 
+				if ( buttons == null )
+					buttons = new ButtonCollection( control.Controls );
+
+				return buttons;
+			}
+		}
+
+		/// <summary>
+		/// Get our collection of all the labels on this control.
+		/// </summary>
+		public LabelCollection Labels
+		{
+			get 
+			{
+				if (labels == null )
+					labels = new LabelCollection( control.Controls );
+
+				return labels;
+			}
+		}
+
+		/// <summary>
+		/// Get our collection of all the TextBoxes on this control.
+		/// </summary>
+		public TextBoxCollection TextBoxes
+		{
+			get 
+			{
+				if ( textboxes == null )
+					textboxes = new TextBoxCollection( control.Controls );
+
+				return textboxes;
+			}
+		}
+
+		/// <summary>
+		/// Get our collection of all ComboBoxes on the form
+		/// </summary>
+		public ComboBoxCollection Combos
+		{
+			get
+			{
+				if ( combos == null )
+					combos = new ComboBoxCollection( control.Controls );
+
+				return combos;
+			}
+		}
+		#endregion
+
+		#region Assertions
+		/// <summary>
+		/// Assert that a control with a given name exists on this control.
+		/// </summary>
+		/// <param name="name">The name of the control.</param>
+		public void AssertControlExists( string targetName )
+		{
+			AssertControlExists( targetName, null );
+		}
+			
+		public void AssertControlExists( string expectedName, Type expectedType )
+		{
+			bool gotName = false;
+			System.Type gotType = null;
+			foreach( Control ctl in control.Controls ) 
+			{
+				if ( ctl.Name == expectedName )
+				{
+					gotName = true;
+					if ( expectedType == null )
+						return;
+					gotType = ctl.GetType();
+					if ( expectedType.IsAssignableFrom( gotType ) )
+						return;
+				}
+			}
+
+			if ( gotName )
+				Assert.Fail( "Expected control {0} to be a {1} but was {2}", expectedName, expectedType.Name, gotType.Name );
+			else
+				Assert.Fail( "{0} does not contain {1} control", control.Name, expectedName );
+		}
+
+		public void AssertControlsAreStackedVertically( params string[] names )
+		{
+			string prior = null;
+			foreach( string current in names )
+			{
+				if ( prior != null )
+				{
+					if ( Controls[prior].Bottom > Controls[current].Top )
+						Assert.Fail( "The {0} control should be above the {1} control", prior, current );
+				}
+				prior = current;
+			}
+		}
+		#endregion
+
+		#region Other public methods
+		public string GetText( string name )
+		{
+			return Controls[ name ].Text;
+		}
+		#endregion
+
+		#region Nested Collection Classes
+
+		#region Enumerator used by all collections
+		public class ControlEnumerator : IEnumerator
+		{
+			IEnumerator sourceEnum;
+			System.Type typeFilter;
+
+			public ControlEnumerator( Control.ControlCollection source, System.Type typeFilter )
+			{
+				this.sourceEnum = source.GetEnumerator();
+				this.typeFilter = typeFilter;
+			}
+
+			#region IEnumerator Members
+
+			public void Reset()
+			{
+				sourceEnum.Reset();
+			}
+
+			public object Current
+			{
+				get { return sourceEnum.Current; }
+			}
+
+			public bool MoveNext()
+			{
+				while( sourceEnum.MoveNext() )
+				{
+					if ( typeFilter == null || typeFilter.IsAssignableFrom( Current.GetType() ) )
+						return true;
+				}
+
+				return false;
+			}
+
+			#endregion
+		}
+		#endregion
+
+		#region Control Collection
+		public class ControlCollection : IEnumerable
+		{
+			protected Control.ControlCollection source;
+			private System.Type typeFilter;
+
+			public ControlCollection( Control.ControlCollection source )
+				: this( source, null ) { }
+
+			public ControlCollection( Control.ControlCollection source, System.Type typeFilter )
+			{
+				this.source = source;
+				this.typeFilter = typeFilter;
+			}
+
+			public Control this[string name]
+			{
+				get 
+				{
+					foreach( Control control in this )
+					{				
+						if ( control.Name == name )
+							return control;
+					}
+
+					return null;
+				}
+			}
+
+			#region IEnumerable Members
+
+			public IEnumerator GetEnumerator()
+			{
+				return new ControlEnumerator( this.source, this.typeFilter );
+			}
+					
+			#endregion
+		}
+		#endregion
+
+		#region ButtonCollection
+		public class ButtonCollection : ControlCollection
+		{
+			public ButtonCollection( Control.ControlCollection controls )
+				: base( controls, typeof( Button ) ) { }
+
+			public new Button this[string name]
+			{
+				get { return base[name] as Button; }
+			}
+		}
+		#endregion
+
+		#region LabelCollection
+		public class LabelCollection : ControlCollection
+		{
+			public LabelCollection( Control.ControlCollection controls )
+				: base( controls, typeof( Label ) ) { }
+
+			public new Label this[string name]
+			{
+				get { return base[name] as Label; }
+			}
+		}
+		#endregion
+
+		#region TextBoxCollection
+		public class TextBoxCollection : ControlCollection
+		{
+			public TextBoxCollection( Control.ControlCollection controls )
+				: base( controls, typeof( TextBox ) ) { }
+
+			public new TextBox this[string name]
+			{
+				get { return base[name] as TextBox; }
+			}
+		}
+		#endregion
+
+		#region ComboBoxCollection
+		public class ComboBoxCollection : ControlCollection
+		{
+			public ComboBoxCollection( Control.ControlCollection controls )
+				: base( controls, typeof( ComboBox ) ) { }
+
+			public new ComboBox this[string name]
+			{
+				get { return base[name] as ComboBox; }
+			}
+		}
+		#endregion
+
+		#endregion
+	}
+}
diff --git a/src/tests/test-utilities/MockTestEventSource.cs b/src/tests/test-utilities/MockTestEventSource.cs
index 2d0c883..1f5e261 100644
--- a/src/tests/test-utilities/MockTestEventSource.cs
+++ b/src/tests/test-utilities/MockTestEventSource.cs
@@ -1,116 +1,116 @@
-// ****************************************************************
-// This is free software licensed under the NUnit license. You
-// may obtain a copy of the license as well as information regarding
-// copyright ownership at http://nunit.org.
-// ****************************************************************
-
-using System;
-using System.Collections;
-using NUnit.Core;
-using NUnit.Util;
-
-namespace NUnit.TestUtilities
-{
-	/// <summary>
-	/// Summary description for MockTestEventSource.
-	/// </summary>
-	public class MockTestEventSource : TestEventDispatcher, EventListener
-	{
-		//private string testFileName;
-		private TestSuite suite;
-
-		public MockTestEventSource( TestSuite suite )
-		{
-			this.suite = suite;
-			//this.testFileName = testFileName;
-		}
-
-		public void SimulateTestRun()
-		{
-			FireRunStarting( suite.TestName.FullName, suite.TestCount );
-
-			//TestResult result = SimulateTest( fixture, RunState.Runnable );
-            TestResult result = suite.Run(this, TestFilter.Empty);
-
-			FireRunFinished( result );
-		}
-
-//		private TestResult SimulateTest( Test test, RunState parentState )
-//		{
-//			if ( test.IsSuite && test.RunState != RunState.Explicit )
-//			{
-//				FireSuiteStarting( test.TestName );
-//
-//				TestResult result = new TestResult( test );
-//
-//				foreach( TestNode childTest in test.Tests )
-//					result.AddResult( SimulateTest( childTest, test.RunState ) );
-//
-//				FireSuiteFinished( result );
-//
-//				return result;
-//			}
-//			else
-//			{
-//				FireTestStarting( test.TestName );
-//				
-//				TestResult result = new TestResult( test );
-//
-//				result.RunState = parentState == RunState.Runnable ? RunState.Executed : parentState;
-//				
-//				FireTestFinished( result );
-//
-//				return result;
-//			}
-//		}
-
-		#region EventListener Members
-
-		void EventListener.TestStarted(TestName testName)
-		{
-			this.FireTestStarting( testName );
-		}
-
-		void EventListener.RunStarted(string name, int testCount)
-		{
-			this.FireRunStarting( name, testCount );
-		}
-
-		void EventListener.RunFinished(Exception exception)
-		{
-			this.FireRunFinished(exception);
-		}
-
-		void EventListener.RunFinished(TestResult result)
-		{
-			this.FireRunFinished(result);
-		}
-
-		void EventListener.SuiteFinished(TestResult result)
-		{
-			this.FireSuiteFinished(result);
-		}
-
-		void EventListener.TestFinished(TestResult result)
-		{
-			this.FireTestFinished(result);
-		}
-
-		void EventListener.UnhandledException(Exception exception)
-		{
-			this.FireRunFinished(exception);
-		}
-
-		void EventListener.TestOutput(TestOutput testOutput)
-		{
-			this.FireTestOutput(testOutput);
-		}
-
-		void EventListener.SuiteStarted(TestName testName)
-		{
-			this.FireSuiteStarting(testName);
-		}
-
-		#endregion
-	}
-}
+// ****************************************************************
+// This is free software licensed under the NUnit license. You
+// may obtain a copy of the license as well as information regarding
+// copyright ownership at http://nunit.org.
+// ****************************************************************
+
+using System;
+using System.Collections;
+using NUnit.Core;
+using NUnit.Util;
+
+namespace NUnit.TestUtilities
+{
+	/// <summary>
+	/// Summary description for MockTestEventSource.
+	/// </summary>
+	public class MockTestEventSource : TestEventDispatcher, EventListener
+	{
+		//private string testFileName;
+		private TestSuite suite;
+
+		public MockTestEventSource( TestSuite suite )
+		{
+			this.suite = suite;
+			//this.testFileName = testFileName;
+		}
+
+		public void SimulateTestRun()
+		{
+			FireRunStarting( suite.TestName.FullName, suite.TestCount );
+
+			//TestResult result = SimulateTest( fixture, RunState.Runnable );
+            TestResult result = suite.Run(this, TestFilter.Empty);
+
+			FireRunFinished( result );
+		}
+
+//		private TestResult SimulateTest( Test test, RunState parentState )
+//		{
+//			if ( test.IsSuite && test.RunState != RunState.Explicit )
+//			{
+//				FireSuiteStarting( test.TestName );
+//
+//				TestResult result = new TestResult( test );
+//
+//				foreach( TestNode childTest in test.Tests )
+//					result.AddResult( SimulateTest( childTest, test.RunState ) );
+//
+//				FireSuiteFinished( result );
+//
+//				return result;
+//			}
+//			else
+//			{
+//				FireTestStarting( test.TestName );
+//				
+//				TestResult result = new TestResult( test );
+//
+//				result.RunState = parentState == RunState.Runnable ? RunState.Executed : parentState;
+//				
+//				FireTestFinished( result );
+//
+//				return result;
+//			}
+//		}
+
+		#region EventListener Members
+
+		void EventListener.TestStarted(TestName testName)
+		{
+			this.FireTestStarting( testName );
+		}
+
+		void EventListener.RunStarted(string name, int testCount)
+		{
+			this.FireRunStarting( name, testCount );
+		}
+
+		void EventListener.RunFinished(Exception exception)
+		{
+			this.FireRunFinished(exception);
+		}
+
+		void EventListener.RunFinished(TestResult result)
+		{
+			this.FireRunFinished(result);
+		}
+
+		void EventListener.SuiteFinished(TestResult result)
+		{
+			this.FireSuiteFinished(result);
+		}
+
+		void EventListener.TestFinished(TestResult result)
+		{
+			this.FireTestFinished(result);
+		}
+
+		void EventListener.UnhandledException(Exception exception)
+		{
+			this.FireRunFinished(exception);
+		}
+
+		void EventListener.TestOutput(TestOutput testOutput)
+		{
+			this.FireTestOutput(testOutput);
+		}
+
+		void EventListener.SuiteStarted(TestName testName)
+		{
+			this.FireSuiteStarting(testName);
+		}
+
+		#endregion
+	}
+}
diff --git a/src/tests/test-utilities/TempResourceFile.cs b/src/tests/test-utilities/TempResourceFile.cs
index 1f60312..3cfd3b3 100644
--- a/src/tests/test-utilities/TempResourceFile.cs
+++ b/src/tests/test-utilities/TempResourceFile.cs
@@ -1,69 +1,69 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-namespace NUnit.TestUtilities
-{
-	using System;
-	using System.IO;
-
-	public class TempResourceFile : IDisposable
-	{
-		string path;
-
-		public TempResourceFile(Type type, string name) : this(type, name, null) {}
-
-		public TempResourceFile(Type type, string name, string filePath)
-		{
-            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(this.path);
-			if(dir != null && dir.Length != 0)
-			{
-				Directory.CreateDirectory(dir);
-			}
-
-			using(FileStream fileStream = new FileStream(this.path, FileMode.Create))
-			{
-				fileStream.Write(buffer, 0, buffer.Length);
-			}
-		}
-
-		public void Dispose()
-		{
-			File.Delete(this.path);
-			
-			string path = this.path;
-			while(true)
-			{
-				path = System.IO.Path.GetDirectoryName(path);
-				if(path == null || path.Length == 0 || Directory.GetFiles(path).Length > 0)
-				{
-					break;
-				}
-
-				Directory.Delete(path);
-			}
-		}
-
-		public string Path
-		{
-			get
-			{
-				return this.path;
-			}
-		}
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+namespace NUnit.TestUtilities
+{
+	using System;
+	using System.IO;
+
+	public class TempResourceFile : IDisposable
+	{
+		string path;
+
+		public TempResourceFile(Type type, string name) : this(type, name, null) {}
+
+		public TempResourceFile(Type type, string name, string filePath)
+		{
+            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(this.path);
+			if(dir != null && dir.Length != 0)
+			{
+				Directory.CreateDirectory(dir);
+			}
+
+			using(FileStream fileStream = new FileStream(this.path, FileMode.Create))
+			{
+				fileStream.Write(buffer, 0, buffer.Length);
+			}
+		}
+
+		public void Dispose()
+		{
+			File.Delete(this.path);
+			
+			string path = this.path;
+			while(true)
+			{
+				path = System.IO.Path.GetDirectoryName(path);
+				if(path == null || path.Length == 0 || Directory.GetFiles(path).Length > 0)
+				{
+					break;
+				}
+
+				Directory.Delete(path);
+			}
+		}
+
+		public string Path
+		{
+			get
+			{
+				return this.path;
+			}
+		}
+	}
+}
diff --git a/src/tests/test-utilities/TestAssert.cs b/src/tests/test-utilities/TestAssert.cs
index b6bbd65..0450db6 100644
--- a/src/tests/test-utilities/TestAssert.cs
+++ b/src/tests/test-utilities/TestAssert.cs
@@ -1,74 +1,74 @@
-// ****************************************************************
-// Copyright 2009, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using NUnit.Core;
-using NUnit.Framework;
-
-namespace NUnit.TestUtilities
-{
-    public class TestAssert
-    {
-        #region IsRunnable
-        public static void IsRunnable(Test test)
-        {
-            Assert.AreEqual(RunState.Runnable, test.RunState);
-        }
-
-        public static void IsRunnable(Type type)
-        {
-            TestSuite suite = TestBuilder.MakeFixture(type);
-            Assert.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);
-        }
-
-        public static void IsRunnable(Type type, string name)
-        {
-            IsRunnable(type, name, ResultState.Success);
-        }
-
-        public static void IsRunnable(Type type, string name, ResultState resultState)
-        {
-            Test test = TestBuilder.MakeTestCase(type, name);
-            Assert.That(test.RunState, Is.EqualTo(RunState.Runnable));
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            if (result.HasResults)
-                result = (TestResult)result.Results[0];
-            Assert.That(result.ResultState, Is.EqualTo(resultState));
-        }
-        #endregion
-
-        #region IsNotRunnable
-        public static void IsNotRunnable(Test test)
-        {
-            Assert.AreEqual(RunState.NotRunnable, test.RunState);
-            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
-            Assert.AreEqual(ResultState.NotRunnable, result.ResultState);
-        }
-
-        public static void IsNotRunnable(Type type)
-        {
-            TestSuite fixture = TestBuilder.MakeFixture(type);
-            Assert.NotNull(fixture, "Unable to construct fixture");
-            IsNotRunnable(fixture);
-        }
-
-        public static void IsNotRunnable(Type type, string name)
-        {
-            IsNotRunnable(TestBuilder.MakeTestCase(type, name));
-        }
-
-        public static void ChildNotRunnable(Type type, string name)
-        {
-            IsNotRunnable((Test)TestBuilder.MakeTestCase(type, name).Tests[0]);
-        }
-        #endregion
-        
-        private TestAssert() { }
-    }
-}
+// ****************************************************************
+// Copyright 2009, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using NUnit.Core;
+using NUnit.Framework;
+
+namespace NUnit.TestUtilities
+{
+    public class TestAssert
+    {
+        #region IsRunnable
+        public static void IsRunnable(Test test)
+        {
+            Assert.AreEqual(RunState.Runnable, test.RunState);
+        }
+
+        public static void IsRunnable(Type type)
+        {
+            TestSuite suite = TestBuilder.MakeFixture(type);
+            Assert.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);
+        }
+
+        public static void IsRunnable(Type type, string name)
+        {
+            IsRunnable(type, name, ResultState.Success);
+        }
+
+        public static void IsRunnable(Type type, string name, ResultState resultState)
+        {
+            Test test = TestBuilder.MakeTestCase(type, name);
+            Assert.That(test.RunState, Is.EqualTo(RunState.Runnable));
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            if (result.HasResults)
+                result = (TestResult)result.Results[0];
+            Assert.That(result.ResultState, Is.EqualTo(resultState));
+        }
+        #endregion
+
+        #region IsNotRunnable
+        public static void IsNotRunnable(Test test)
+        {
+            Assert.AreEqual(RunState.NotRunnable, test.RunState);
+            TestResult result = test.Run(NullListener.NULL, TestFilter.Empty);
+            Assert.AreEqual(ResultState.NotRunnable, result.ResultState);
+        }
+
+        public static void IsNotRunnable(Type type)
+        {
+            TestSuite fixture = TestBuilder.MakeFixture(type);
+            Assert.NotNull(fixture, "Unable to construct fixture");
+            IsNotRunnable(fixture);
+        }
+
+        public static void IsNotRunnable(Type type, string name)
+        {
+            IsNotRunnable(TestBuilder.MakeTestCase(type, name));
+        }
+
+        public static void ChildNotRunnable(Type type, string name)
+        {
+            IsNotRunnable((Test)TestBuilder.MakeTestCase(type, name).Tests[0]);
+        }
+        #endregion
+        
+        private TestAssert() { }
+    }
+}
diff --git a/src/tests/test-utilities/TestBuilder.cs b/src/tests/test-utilities/TestBuilder.cs
index c270190..088f2b9 100644
--- a/src/tests/test-utilities/TestBuilder.cs
+++ b/src/tests/test-utilities/TestBuilder.cs
@@ -1,68 +1,68 @@
-// ****************************************************************
-// Copyright 2007, Charlie Poole
-// This is free software licensed under the NUnit license. You may
-// obtain a copy of the license at http://nunit.org
-// ****************************************************************
-
-using System;
-using System.Reflection;
-using NUnit.Framework;
-using NUnit.Core;
-using NUnit.Core.Builders;
-using NUnit.Core.Extensibility;
-
-namespace NUnit.TestUtilities
-{
-	/// <summary>
-	/// Utility Class used to build NUnit tests for use as test data
-	/// </summary>
-	public class TestBuilder
-	{
-		private static ISuiteBuilder suiteBuilder = (ISuiteBuilder)CoreExtensions.Host.GetExtensionPoint("SuiteBuilders");
-        private static ITestCaseBuilder testBuilder = (ITestCaseBuilder)CoreExtensions.Host.GetExtensionPoint("TestCaseBuilders");
-
-		public static TestSuite MakeFixture( Type type )
-		{
-			return (TestSuite)suiteBuilder.BuildFrom( type );
-		}
-
-		public static TestSuite MakeFixture( object fixture )
-		{
-			TestSuite suite = (TestSuite)suiteBuilder.BuildFrom( fixture.GetType() );
-			suite.Fixture = fixture;
-			return suite;
-		}
-
-		public static Test MakeTestCase( Type type, string methodName )
-		{
-            MethodInfo method = Reflect.GetNamedMethod(type, methodName);
-            if (method == null)
-                Assert.Fail("Method not found: " + methodName);
-            return testBuilder.BuildFrom(method);
-        }
-
-		public static Test MakeTestCase( object fixture, string methodName )
-		{
-			Test test = MakeTestCase( fixture.GetType(), methodName );
-			test.Fixture = fixture;
-			return test;
-		}
-
-		public static TestResult RunTestFixture( Type type )
-		{
-            return MakeFixture(type).Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		public static TestResult RunTestFixture( object fixture )
-		{
-            return MakeFixture(fixture).Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		public static TestResult RunTestCase( Type type, string methodName )
-		{
-            return MakeTestCase(type, methodName).Run(NullListener.NULL, TestFilter.Empty);
-		}
-
-		private TestBuilder() { }
-	}
-}
+// ****************************************************************
+// Copyright 2007, Charlie Poole
+// This is free software licensed under the NUnit license. You may
+// obtain a copy of the license at http://nunit.org
+// ****************************************************************
+
+using System;
+using System.Reflection;
+using NUnit.Framework;
+using NUnit.Core;
+using NUnit.Core.Builders;
+using NUnit.Core.Extensibility;
+
+namespace NUnit.TestUtilities
+{
+	/// <summary>
+	/// Utility Class used to build NUnit tests for use as test data
+	/// </summary>
+	public class TestBuilder
+	{
+		private static ISuiteBuilder suiteBuilder = (ISuiteBuilder)CoreExtensions.Host.GetExtensionPoint("SuiteBuilders");
+        private static ITestCaseBuilder testBuilder = (ITestCaseBuilder)CoreExtensions.Host.GetExtensionPoint("TestCaseBuilders");
+
+		public static TestSuite MakeFixture( Type type )
+		{
+			return (TestSuite)suiteBuilder.BuildFrom( type );
+		}
+
+		public static TestSuite MakeFixture( object fixture )
+		{
+			TestSuite suite = (TestSuite)suiteBuilder.BuildFrom( fixture.GetType() );
+			suite.Fixture = fixture;
+			return suite;
+		}
+
+		public static Test MakeTestCase( Type type, string methodName )
+		{
+            MethodInfo method = Reflect.GetNamedMethod(type, methodName);
+            if (method == null)
+                Assert.Fail("Method not found: " + methodName);
+            return testBuilder.BuildFrom(method);
+        }
+
+		public static Test MakeTestCase( object fixture, string methodName )
+		{
+			Test test = MakeTestCase( fixture.GetType(), methodName );
+			test.Fixture = fixture;
+			return test;
+		}
+
+		public static TestResult RunTestFixture( Type type )
+		{
+            return MakeFixture(type).Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		public static TestResult RunTestFixture( object fixture )
+		{
+            return MakeFixture(fixture).Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		public static TestResult RunTestCase( Type type, string methodName )
+		{
+            return MakeTestCase(type, methodName).Run(NullListener.NULL, TestFilter.Empty);
+		}
+
+		private TestBuilder() { }
+	}
+}
diff --git a/src/tests/test-utilities/TestFinder.cs b/src/tests/test-utilities/TestFinder.cs
index c6be64b..ef992fa 100644
--- a/src/tests/test-utilities/TestFinder.cs
+++ b/src/tests/test-utilities/TestFinder.cs
@@ -1,61 +1,61 @@
-// ****************************************************************
-// Copyright 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.Core;
-using NUnit.Framework;
-
-namespace NUnit.TestUtilities
-{
-	/// <summary>
-	/// Utility class used to locate tests by name in a test tree
-	/// </summary>
-	public class TestFinder
-	{
-		public static Test Find(string name, Test test, bool recursive)
-		{
-			if (test.Tests != null)
-			{
-				foreach(Test child in test.Tests) 
-				{
-                    if (child.TestName.Name == name)
-                        return child;
-                    if (recursive)
-                    {
-                        Test grandchild = Find(name, child, true);
-                        if (grandchild != null)
-                            return grandchild;
-                    }
-				}
-			}
-
-			return null;
-		}
-		
-		public static TestResult Find(string name, TestResult result, bool recursive) 
-		{
-			if ( result.HasResults )
-			{
-                foreach (TestResult childResult in result.Results) 
-				{
-                    if (childResult.Test.TestName.Name == name)
-                        return childResult;
-
-                    if (recursive)
-                    {
-                        TestResult r = Find(name, childResult, true);
-                        if (r != null)
-                            return r;
-                    }
-				}
-			}
-
-			return null;
-		}
-
-        private TestFinder() { }
-	}
-}
+// ****************************************************************
+// Copyright 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.Core;
+using NUnit.Framework;
+
+namespace NUnit.TestUtilities
+{
+	/// <summary>
+	/// Utility class used to locate tests by name in a test tree
+	/// </summary>
+	public class TestFinder
+	{
+		public static Test Find(string name, Test test, bool recursive)
+		{
+			if (test.Tests != null)
+			{
+				foreach(Test child in test.Tests) 
+				{
+                    if (child.TestName.Name == name)
+                        return child;
+                    if (recursive)
+                    {
+                        Test grandchild = Find(name, child, true);
+                        if (grandchild != null)
+                            return grandchild;
+                    }
+				}
+			}
+
+			return null;
+		}
+		
+		public static TestResult Find(string name, TestResult result, bool recursive) 
+		{
+			if ( result.HasResults )
+			{
+                foreach (TestResult childResult in result.Results) 
+				{
+                    if (childResult.Test.TestName.Name == name)
+                        return childResult;
+
+                    if (recursive)
+                    {
+                        TestResult r = Find(name, childResult, true);
+                        if (r != null)
+                            return r;
+                    }
+				}
+			}
+
+			return null;
+		}
+
+        private TestFinder() { }
+	}
+}
diff --git a/src/tests/test-utilities/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/src/tests/test-utilities/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..4b5e412
Binary files /dev/null and b/src/tests/test-utilities/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/src/tests/test-utilities/obj/Debug/test-utilities.csproj.FileListAbsolute.txt b/src/tests/test-utilities/obj/Debug/test-utilities.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..4fdcf2f
--- /dev/null
+++ b/src/tests/test-utilities/obj/Debug/test-utilities.csproj.FileListAbsolute.txt
@@ -0,0 +1,5 @@
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\test-utilities.dll
+D:\Dev\NUnit\nunit-2.6\work\bin\Debug\tests\test-utilities.pdb
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-utilities\obj\Debug\test-utilities.csprojResolveAssemblyReference.cache
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-utilities\obj\Debug\test-utilities.dll
+D:\Dev\NUnit\nunit-2.6\work\src\tests\test-utilities\obj\Debug\test-utilities.pdb
diff --git a/src/tests/test-utilities/obj/Debug/test-utilities.csprojResolveAssemblyReference.cache b/src/tests/test-utilities/obj/Debug/test-utilities.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..a9a35e8
Binary files /dev/null and b/src/tests/test-utilities/obj/Debug/test-utilities.csprojResolveAssemblyReference.cache differ
diff --git a/src/tests/test-utilities/obj/Debug/test-utilities.pdb b/src/tests/test-utilities/obj/Debug/test-utilities.pdb
new file mode 100644
index 0000000..37d5263
Binary files /dev/null and b/src/tests/test-utilities/obj/Debug/test-utilities.pdb differ
diff --git a/src/tests/test-utilities/test-utilities.build b/src/tests/test-utilities/test-utilities.build
index e321252..3e506e4 100644
--- a/src/tests/test-utilities/test-utilities.build
+++ b/src/tests/test-utilities/test-utilities.build
@@ -1,41 +1,41 @@
-<?xml version="1.0"?>
-<project name="TestUtilities" default="build" basedir=".">
-
-  <patternset id="source-files">
-        <include name="FormTester.cs"/>
-        <include name="MockTestEventSource.cs" if="${runtime.version >= '2.0'}"/>
-        <include name="TempResourceFile.cs"/>
-        <include name="TestAssert.cs"/>
-        <include name="TestBuilder.cs"/>
-        <include name="TestFinder.cs"/>
-  </patternset>
-
-  <target name="build">
-    <csc target="library" 
-        output="${current.test.dir}/test-utilities.dll" 
-        debug="${build.debug}" define="${build.defines}">
-      <sources>
-        <patternset refid="source-files"/>
-        <include name="../../GeneratedAssemblyInfo.cs"/>
-      </sources>
-      <references>
-        <include name="System.Windows.Forms.dll"/>
-        <include name="${current.framework.dir}/nunit.framework.dll"/>
-        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
-        <include name="${current.lib.dir}/nunit.core.dll"/>
-        <include name="${current.lib.dir}/nunit.util.dll"/>
-      </references>
-    </csc>
-  </target>
-
-  <target name="package">
-    <copy todir="${package.src.dir}/tests/test-utilities">
-      <fileset>
-        <patternset refid="source-files"/>
-        <include name="test-utilities.csproj"/>
-        <include name="test-utilities.build"/>
-      </fileset>
-    </copy>
-  </target>
-
+<?xml version="1.0"?>
+<project name="TestUtilities" default="build" basedir=".">
+
+  <patternset id="source-files">
+        <include name="FormTester.cs"/>
+        <include name="MockTestEventSource.cs" if="${runtime.version >= '2.0'}"/>
+        <include name="TempResourceFile.cs"/>
+        <include name="TestAssert.cs"/>
+        <include name="TestBuilder.cs"/>
+        <include name="TestFinder.cs"/>
+  </patternset>
+
+  <target name="build">
+    <csc target="library" 
+        output="${current.test.dir}/test-utilities.dll" 
+        debug="${build.debug}" define="${build.defines}">
+      <sources>
+        <patternset refid="source-files"/>
+        <include name="../../GeneratedAssemblyInfo.cs"/>
+      </sources>
+      <references>
+        <include name="System.Windows.Forms.dll"/>
+        <include name="${current.framework.dir}/nunit.framework.dll"/>
+        <include name="${current.lib.dir}/nunit.core.interfaces.dll"/>
+        <include name="${current.lib.dir}/nunit.core.dll"/>
+        <include name="${current.lib.dir}/nunit.util.dll"/>
+      </references>
+    </csc>
+  </target>
+
+  <target name="package">
+    <copy todir="${package.src.dir}/tests/test-utilities">
+      <fileset>
+        <patternset refid="source-files"/>
+        <include name="test-utilities.csproj"/>
+        <include name="test-utilities.build"/>
+      </fileset>
+    </copy>
+  </target>
+
 </project>
\ No newline at end of file
diff --git a/src/tests/test-utilities/test-utilities.csproj b/src/tests/test-utilities/test-utilities.csproj
index c69aae9..d1716f2 100644
--- a/src/tests/test-utilities/test-utilities.csproj
+++ b/src/tests/test-utilities/test-utilities.csproj
@@ -1,116 +1,150 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>test-utilities</AssemblyName>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Library</OutputType>
-    <RootNamespace>NUnit.TestUtilities</RootNamespace>
-    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <OldToolsVersion>2.0</OldToolsVersion>
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618, 672</NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
-    <BaseAddress>285212672</BaseAddress>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <FileAlignment>4096</FileAlignment>
-    <NoWarn>618, 672</NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-    <Reference Include="System.Windows.Forms">
-      <Name>System.Windows.Forms</Name>
-    </Reference>
-    <Reference Include="System.Xml">
-      <Name>System.XML</Name>
-    </Reference>
-    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
-      <Name>nunit.util.dll</Name>
-      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
-      <Name>nunit.core.dll</Name>
-      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
-      <Name>nunit.core.interfaces.dll</Name>
-      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
-      <Private>False</Private>
-    </ProjectReference>
-    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
-      <Name>nunit.framework.dll</Name>
-      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\..\CommonAssemblyInfo.cs">
-      <Link>CommonAssemblyInfo.cs</Link>
-    </Compile>
-    <Compile Include="FormTester.cs" />
-    <Compile Include="MockTestEventSource.cs" />
-    <Compile Include="TempResourceFile.cs" />
-    <Compile Include="TestAssert.cs" />
-    <Compile Include="TestBuilder.cs" />
-    <Compile Include="TestFinder.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="test-utilities.build" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>test-utilities</AssemblyName>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>NUnit.TestUtilities</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</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>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Debug\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618, 672</NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\..\..\bin\Release\tests\</OutputPath>
+    <BaseAddress>285212672</BaseAddress>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <FileAlignment>4096</FileAlignment>
+    <NoWarn>618, 672</NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+    <ProjectReference Include="..\..\ClientUtilities\util\nunit.util.dll.csproj">
+      <Name>nunit.util.dll</Name>
+      <Project>{61CE9CE5-943E-44D4-A381-814DC1406767}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\core\nunit.core.dll.csproj">
+      <Name>nunit.core.dll</Name>
+      <Project>{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitCore\interfaces\nunit.core.interfaces.dll.csproj">
+      <Name>nunit.core.interfaces.dll</Name>
+      <Project>{435428F8-5995-4CE4-8022-93D595A8CC0F}</Project>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\NUnitFramework\framework\nunit.framework.dll.csproj">
+      <Name>nunit.framework.dll</Name>
+      <Project>{83DD7E12-A705-4DBA-9D71-09C8973D9382}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CommonAssemblyInfo.cs">
+      <Link>CommonAssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="FormTester.cs" />
+    <Compile Include="MockTestEventSource.cs" />
+    <Compile Include="TempResourceFile.cs" />
+    <Compile Include="TestAssert.cs" />
+    <Compile Include="TestBuilder.cs" />
+    <Compile Include="TestFinder.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="test-utilities.build" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-cli-libs/packages/nunit.git



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